Missing user-journey tests — TODO

Spec backlog for user-journey behavior tests. The test name IS the product specification.

Implementation flow:

  1. Pick an entry from this list.
  2. Add a test() block to ui/e2e/journeys.spec.ts (or an adjacent file) using helpers from e2e/helpers/{api,cvl,demo}.ts.
  3. Run locally against wrangler dev/Miniflare (do NOT burn CF quota — CLAUDE.md §22).
  4. 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 afterEach that 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); assert getBoundingClientRect().top equality 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.ts Test 1. This stub tracks the UI-level variant (both tabs in browser, drag-edit via CVL editor, DOM convergence visible within 2s). Blocked by cvl-sync known bug (WS broadcast of cv_profile not 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.ts Test 2. Blocked by CRDT not yet implemented; current behaviour is LWW.
  • Two browser contexts editing a tailored_cv for the same job concurrently (the convene-on-one-job workflow): CRDT converges, neither edit is lost. API-level coverage at extra-journeys-3.spec.ts Test 3. Blocked by cvl-sync known 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/jobs should be GUI-equivalent.
  • Tailoring a job via the REST API produces a tailored_cv indistinguishable 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.
Source: wiki/content/working-memory/missing-journeys.md