Missing user-journey tests — TODO
Spec backlog for user-journey behavior tests. The test name IS the product specification.
Implementation flow:
- Pick an entry from this list.
- Add a
test()block toui/e2e/journeys.spec.ts(or an adjacent file) using helpers frome2e/helpers/{api,cvl,demo}.ts. - Run locally against
wrangler dev/Miniflare (do NOT burn CF quota — CLAUDE.md §22). - When the test is green, delete the corresponding line from this file.
Architecture references cited below map to sections in CLAUDE.md.
Multi-tab sync is intentionally NOT on this list — it is already specified and documented as a known bug in ui/e2e/known-bugs/cvl-sync.spec.ts. Do not duplicate it; if fixing it, remove the test.fail() annotation there instead.
Demo pipeline
- Throughout the demo journey, no error toast, no blank cell where a value is expected, no raw stack trace, no Typst compile error is ever visible to the user. Implementation note: strict absence-of-error-UI assertion. Parameterize via an
afterEachthat scans for error selectors.
Dashboard layout — alignment
The viewport matrix is 1920×1080, 1440×900, 1366×768 (common laptop, historically broken), 1280×720, 375×667 (mobile). One test per viewport.
- At each viewport, text fields in the same row share a bounding-rect top within ±1px. Implementation note:
page.setViewportSize(vp); assertgetBoundingClientRect().topequality across row cells.
CVL editor — preview overflow
Same viewport matrix as above. One test per viewport.
- At each viewport, the CV preview container has
scrollWidth <= clientWidth(no horizontal overflow). Implementation note: open CVL; assert no horizontal scroll on the preview pane. Known-broken on a collaborator's 1366×768-ish laptop; pin with this test.
Collaborative editing — humans + agents on any state
Per CLAUDE.md §3 (real-time WebSocket sync). The workflow: humans and AI agents co-edit every part of a workspace. Per-job is usually single-operator, but a meaningful minority of jobs get multi-participant convening (multiple humans + AI on one tailored CV). CRDT semantics must hold for quarry, jobs, and tailored outputs alike.
- Two browser contexts editing different sections of the same base CV simultaneously: both edits land, neither overwrites the other, both tabs converge on the same final state within 2 seconds. API-level coverage exists at
ui/e2e/extra-journeys-3.spec.tsTest 1. This stub tracks the UI-level variant (both tabs in browser, drag-edit via CVL editor, DOM convergence visible within 2s). Blocked bycvl-syncknown bug (WS broadcast ofcv_profilenot wired). - Two browser contexts editing the SAME section of the base CV concurrently: both edits land in the shared state in a deterministic merged form (CRDT convergence); no tab reverts to its pre-edit value. API-level coverage at
extra-journeys-3.spec.tsTest 2. Blocked by CRDT not yet implemented; current behaviour is LWW. - Two browser contexts editing a
tailored_cvfor the same job concurrently (the convene-on-one-job workflow): CRDT converges, neither edit is lost. API-level coverage atextra-journeys-3.spec.tsTest 3. Blocked bycvl-syncknown bug. - A human edits a job field in Tab A while an agent edits a different field of the same job via API; both changes converge without conflict. Implementation note: CRDT acceptance across participant types (human GUI + agent API).
- Tab A reorders quarry sections; Tab B sees the new order within 2 seconds without manual reload. Tracked as known bug at
ui/e2e/known-bugs/cvl-sync.spec.ts. Root cause: CVL drag-reorder uses REST PUT (not Y.Doc mutation). Fix owner: CVL editor component.
Agent API parity
Anything a human can do, an agent must be able to do.
- Creating a job via the REST API produces the same dashboard state as creating via the GUI — job appears on the dashboard, pipeline auto-advances identically. Implementation note:
POST /api/jobsshould be GUI-equivalent. - Tailoring a job via the REST API produces a
tailored_cvindistinguishable from one produced by clicking "Tailor CV" in the GUI. - Updating a CV quarry section via the REST API reflects in any open human GUI tab within 2 seconds (realtime + CRDT). Implementation note: same realtime path, no agent-specific UI.
Job CRUD
- User creates a new job, fills in title and organisation, job appears on the dashboard.
- User edits a job title inline; change persists after page reload.
- User deletes a job; job is removed from the dashboard and does not reappear after reload.
- User manually reorders two jobs within a view group; order persists after reload.
Cover letter generation (CLAUDE.md §7)
- User generates a cover letter for a job; FIXED sections (recipient, signature) are verbatim from the CL quarry; OPEN intro section is LLM-written.
BYOK — Bring Your Own Key (CLAUDE.md §8)
- User enters a provider API key in workspace settings; the key is displayed masked (first 4 + last 4 chars) in the UI immediately after saving.
- A subsequent PUT to workspace settings with a masked key value preserves the original unmasked key in the database.
Views (CLAUDE.md §10)
- User creates a custom view with a rule matching jobs by status; jobs bucket into the correct group immediately.
- A job that changes status moves to the matching view group without a page reload. Note: multi-tab sync variant overlaps
known-bugs/cvl-sync.spec.ts.
Format — locale conventions (CLAUDE.md §21)
- User switches CV language to
de-CH; the cover letter opening salutation updates to Swiss German convention.
Cell origin tracking (CLAUDE.md §13)
- After AI evaluation fills a cell, the cell shows a provider origin tint; after the user manually edits the cell, the tint clears.