Deep, code-grounded audit of Job Tracker producing the mission deliverables under docs/remaster/: system audit, bug report, architecture/data-model/AI/UX reviews, remaster proposal, migration plan, competitor research, and the gated REBUILD_DECISION. Verdict: Incremental Refactor (no full rebuild). Evidence: no Critical defects; hardened cookie/CSRF auth (token never in JS storage), real SSRF defence, enforced multi-tenancy via global query filters, decoupled provider-swappable AI service, 135 backend tests. Debt is localised (god controllers/entity, missing hot-path indexes, prompt-injection hardening, CRA build debt) and reachable by in-place, test-guarded refactors. Also harden .gitignore: exclude agent tooling (.claude/, .bg-shell/, .agent.md) and restore/broaden the runtime-secrets block (**/keys/, **/backups/, exports, CV artifacts) so nested DataProtection keys can't be committed accidentally. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.5 KiB
UX / Product Review — Job Tracker
Companion to: SYSTEM_AUDIT_REPORT.md
Note: grounded in code/components and .gsd intent; not a live usability test. Items needing real-user
validation are labelled [Speculative issue].
1. Daily-loop navigation — good bones
.gsd D004 defines: job table → follow-up/dashboard → individual job workspace. The build honours this
(/jobs, /dashboard, /reminders share one workflow-signal contract, D011). This is a coherent mental
model for a job seeker's daily rhythm. Keep it.
2. Job creation flow
- URL import (preferred) + manual fallback both exist. ✅
- Import-failure UX
[Design flaw — Medium]: when scraping fails or returns junk (the common case for LinkedIn/Indeed), the recovery path is a silent drop to manual entry. Users won't know why it failed or that the manual fields are now their job. Needs an explicit "we couldn't read that page — here's what we got, fill the rest" state that pre-fills whatever parsed. - Quick-capture (bookmarklet + PWA share-target, M1/M2) is a genuinely nice friction-reducer. ✅
3. CV regeneration UX
- Tailored-CV workspace persists reusable package material (D006). Good.
- Historical smell
[Design flaw]: the saved application-answer draft was shoehorned into the free-textnotesblock (D006) because no dedicated field existed; repeated saves duplicated content until a "replaceable notes block" workaround landed. This is UX built around a schema gap — fix the schema (dedicated field), retire the workaround. - No "why this score"
[Speculative issue — Medium]: the match score is a number with a card, but the deterministic keyword basis isn't surfaced as "matched: React, Azure / missing: Kubernetes". Showing the gap turns a vanity number into an actionable to-do (add these keywords / this is a stretch role).
4. Cover-letter workflow
Manual / upload / AI-generated, returned as draft (assistive-only, D002). Consistent and safe. Ensure the three entry points converge on one editable draft surface (avoid three divergent UIs).
5. Dashboard clarity
Time-in-stage card + funnel via canonical JobPipeline (H3). Solid analytics for a personal tool. Risk:
funnel/analytics load-all-then-count server-side today (perf, not UX) — invisible to users until data grows.
6. Timeline usability
JobEvent history drives status/stage transitions; correspondence continuity shows linked-thread refresh
state in the workspace (D012). Good trust surface. [Speculative issue]: verify the timeline reads as a
single chronological story (events + emails interleaved), not two separate lists.
7. Cross-cutting UX risks
| Item | Sev | Note |
|---|---|---|
| Import failure feels like a dead end | Medium | pre-fill + explain, don't silently drop to manual |
| Match score without gap breakdown | Medium | show matched/missing keywords |
| Notes-block overloading | Low (mitigated) | fix schema, retire workaround |
| Attachment checklist can lie | High (data) | booleans drift from real attachments (see data review) |
| No visible AI-fabrication guardrail | Medium | show "AI added X — confirm" in CV review |
8. Product-identity question (drives UX direction)
Is this a personal tool (D003) or a multi-tenant SaaS? The UX for onboarding, empty states, sharing, and billing diverge sharply. This is the single biggest unanswered product question and should be decided before the next UX investment (see REMASTER_PROPOSAL.md §1).