f0f178d77e
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>
56 lines
3.5 KiB
Markdown
56 lines
3.5 KiB
Markdown
# UX / Product Review — Job Tracker
|
|
|
|
**Companion to:** [SYSTEM_AUDIT_REPORT.md](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-text
|
|
`notes` block (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](REMASTER_PROPOSAL.md) §1).
|