| ADV-S1 | User pastes 1 MB of plain text into a single bullet wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S10 | Two agents enqueue same `request_id` concurrently — exactly one row created wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 13 |
| ADV-S11 | URL hits free-tier CF quota mid-day — service degrades gracefully, not 1027 wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| ADV-S12 | Hostile collaborator deletes the entire CV quarry from the link wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S13 | User attaches a malicious / corrupt PDF as a reference upload wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S14 | Agent floods workspace with 10k job.create ops wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S2 | User pastes HTML/script tags into description wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S3 | User submits a URL containing weird unicode wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| ADV-S4 | LLM returns prompt-injection that tries to rewrite FIXED-tier name wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| ADV-S5 | Agent submits op with `kind` not in op catalog wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| ADV-S6 | Agent submits op with stale `OP_CATALOG_VERSION` — rejected with version mismatch wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| ADV-S7 | Agent retries a write 100× with same opId — only first commit lands; others dedupe wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| ADV-S8 | User opens a workspace ID that doesn't exist — clean error, no crash wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| ADV-S9 | User opens a workspace with corrupted sub-doc bytes — graceful surface, doesn't poison healthy sub-docs wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| E1 | Default quality run spends no budget wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E2 | Fast checks stay fast enough for local loops wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E3 | Slow free checks stay repeatable wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E4 | Browser smoke proves the app without provider spend wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E5 | Release gate starts from zero-budget evidence wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E6 | Quality service rejects ambiguous spend wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 1 |
| E7 | Synthetic test data has a cleanup cost budget wiki/content/stories/EFFICIENCY-STORIES.md | efficiency-story | High | green | 3 |
| P1-G1-S1 | Acquire job (manual paste URL) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 2 |
| P1-G1-S2 | Acquire job (manual fields only, no URL) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G1-S3 | Acquire job (malformed URL) wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| P1-G1-S4 | Acquire job (URL points at non-job page) wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| P1-G1-S5 | Acquire job (duplicate URL already in workspace) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G1-S6 | Acquire job (URL with tracking parameters) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G10-S1 | Switch to read-only view link (sharing progress without edit risk) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G2-S1 | Extract job facts (happy path) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G2-S2 | Extract job facts (LLM returns malformed JSON) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G2-S3 | Extract job facts (provider rate-limited) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G2-S4 | Extract job facts (no description scraped) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G2-S5 | Extract job facts (industry not in user's enum) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G2-S6 | Extract job facts (salary not stated, enrichment falls back to LLM estimate) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G3-S1 | Score job (default scoring config) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G3-S2 | Score job (user customizes weights mid-flight) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G3-S3 | Score job (knockout boolean triggers) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G3-S4 | Score job (no description, scoring degrades gracefully) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G3-S5 | Score job (user adds custom column post-hoc, score recalculates) wiki/content/stories/USER-STORIES.md | user-story | High | green | 2 |
| P1-G4-S1 | Evaluate fit (commute calculated from home address) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G4-S2 | Evaluate fit (home address missing — commute blocked) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G4-S3 | Evaluate fit (boolean criterion changes after eval — single-flight prevents re-eval) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G5-S1 | Decide via kanban (drag job between columns) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G5-S2 | Decide via custom view (group by score band) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G5-S3 | Decide via sort (descending score) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G5-S4 | Decide via reorder within group (manual position) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G6-S1 | Tailor CV (first time on a job) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 22 |
| P1-G6-S10 | Tailor (user promotes edit back to quarry as variant) wiki/content/stories/USER-STORIES.md | user-story | High | green | 22 |
| P1-G6-S11 | Tailor (re-tailor wipes previous snapshot but variants in quarry preserved) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G6-S12 | Tailor (CV in language A, CL in language B — peer trees independent) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G6-S2 | Tailor CV (re-tailor on edits to quarry) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G6-S3 | Tailor CV (FIXED identity preserved verbatim) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 22 |
| P1-G6-S4 | Tailor CV (HYBRID selects best-fit experience entries) wiki/content/stories/USER-STORIES.md | user-story | High | green | 22 |
| P1-G6-S5 | Tailor CV (OPEN summary generated, factually grounded) wiki/content/stories/USER-STORIES.md | user-story | High | green | 22 |
| P1-G6-S6 | Tailor CL (cover letter recipient, opening, closing per locale) wiki/content/stories/USER-STORIES.md | user-story | High | green | 22 |
| P1-G6-S7 | Tailor (provider 429 — cascade falls over) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 22 |
| P1-G6-S8 | Tailor (every provider in chain exhausted — clean failure surface) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G6-S9 | Tailor (user edits the tailored copy, quarry untouched) wiki/content/stories/USER-STORIES.md | user-story | High | green | 22 |
| P1-G7-S1 | Render PDF (preview matches printed output, fits format.maxPages) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G7-S2 | Render PDF (long header overflows — overflow indicator surfaces) wiki/content/stories/USER-STORIES.md | user-story | Medium | debt | 1 |
| P1-G7-S3 | Render PDF (Typst WASM bundle fails to load) wiki/content/stories/USER-STORIES.md | user-story | Adversarial | green | 1 |
| P1-G7-S4 | Render PDF (font missing — falls back deterministically) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G7-S5 | Render PDF (locale resolved from job location, not workspace) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G7-S6 | Render PDF (orthography ortho=ß→ss applied for de-CH) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G8-S1 | Apply (move job to "Applied" status, follow-up note saved) wiki/content/stories/USER-STORIES.md | user-story | High | green | 2 |
| P1-G8-S2 | Apply (rejected/offered terminal status — view auto-groups) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P1-G9-S1 | Iterate profile (add personal-info field) wiki/content/stories/USER-STORIES.md | user-story | High | green | 2 |
| P1-G9-S2 | Iterate profile (add new experience as quarry node — does not auto-render) wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P1-G9-S3 | Iterate profile (activate the new quarry node via selection.update) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G9-S4 | Iterate profile (delete a variant — pool memory preserved unless explicit) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P1-G9-S5 | Iterate profile (add new language — full clone with translation) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P2-G1-S1 | Friend pastes a job URL — primary user sees it within 2 s wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G1-S2 | Friend pastes URL while primary is editing — both surfaces update wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P2-G10-S1 | Friend joins via the link cold — sees current state on first paint wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G10-S2 | Friend leaves — presence count decrements within a couple seconds wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P2-G10-S3 | Solo + friend both go offline mid-edit — both reconnect, both see merged state wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G3-S1 | Friend toggles a knockout boolean — primary's score updates within 2 s wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G3-S2 | Friend changes scoring config — score recalculates everywhere wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P2-G5-S1 | Friend reorders kanban — primary sees new order live wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G6-S1 | Friend edits one bullet, primary edits another — both keystrokes survive wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G6-S2 | Friend and primary type into the same bullet — character-level merge wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P2-G6-S3 | Friend deletes a bullet primary just edited — last-writer-wins for whole-node delete wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P2-G6-S4 | Friend marks bullet as locked — primary's edits still merge, agents are blocked (future) wiki/content/stories/USER-STORIES.md | user-story | Low | future | 1 |
| P2-G6-S5 | Friend promotes a tailored edit to quarry while primary still tailoring same job wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P2-G9-S1 | Friend adds a candidate variant for the quarry while primary edits wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P3-G10-S1 | Five participants connected — presence indicator caps display but counts are accurate wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P3-G10-S2 | Mentor opens read-only view — cannot accidentally toggle selection wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P3-G3-S1 | Mentor disagrees with primary's knockout — both writes preserved on independent fields wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P3-G4-S1 | Three actors evaluate same boolean criterion concurrently — first-write-wins is wrong; LWW per criterion key OK wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P3-G6-S1 | Three actors edit three different bullets in the same section — all preserved wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P3-G6-S2 | Two actors edit the same bullet, third deletes the section — section delete wins, bullet edits lost (but auditable) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P3-G6-S3 | Mentor edits CV, primary tailors a job concurrently — tailored snapshot reflects state at snapshot time wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P3-G9-S1 | Three actors add variants in parallel — all candidates land in pool, none lost wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G1-S1 | Agent imports a batch of jobs via MCP — user sees rows appear live wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 2 |
| P4-G1-S2 | Agent imports same job twice — deduplicated by URL wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G1-S3 | Agent races with another agent on same URL — only one row, one process request wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G10-S1 | Agent presence visible alongside human presence (counts independent) wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G2-S1 | Agent extracts a job, user observes filled cells with agent origin tint wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 2 |
| P4-G3-S1 | Agent evaluates a job, cell origin = agent:provider:model wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G3-S2 | Agent tries to overwrite a structured fact human just set — write rejected by protection gate wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G3-S3 | Agent uses `force: true` — overwrite proceeds, telemetry records preservation override wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G6-S1 | Agent creates a quarry candidate (inactive) — user toggles it active wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G6-S2 | Agent runs full tailor while user idle — completed snapshot visible on user's next paint wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G6-S3 | Agent violates selection cardinality (maxCount=1 with 2 actives) — rejected without `force: true` wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G6-S4 | Agent uses `force: true` to violate cardinality — allowed; UI displays current/bounds honestly wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P4-G6-S5 | Agent tries to delete a FIXED-tier personal-info node — write proceeds (FIXED is about LLM rewriting, not deletion) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P4-G6-S6 | Agent tries to invent text on a FIXED node via the tailor path — blocked structurally; identity unchanged wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P4-G9-S1 | Agent seeds a new language tree from agent-supplied content — translate op produces peer tree wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P4-G9-S2 | Agent calls `cv_profile.replace` with a malformed tree — broker rejects, no partial state wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P5-G1-S1 | Agent adds a job to a workspace with no browser tab open wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P5-G2-S1 | Agent triggers extract via process_request — server fallback picks it up within ~60 s when no browser leader wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P5-G2-S2 | Browser leader present — process_request claimed and run within ~2 s wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P5-G6-S1 | Agent enqueues tailor by deterministic request_id — second concurrent call collapses on PK constraint wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P5-G6-S2 | Agent tailors with no human ever opening the tab — final snapshot persists wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P5-G8-S1 | Agent updates job status when user later opens dashboard, status matches wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P6-G1-S1 | User adds a job on laptop, opens phone — job present immediately wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 2 |
| P6-G10-S1 | Same person "looks like one user" or "two users" — presence rules consistent with awareness model wiki/content/stories/USER-STORIES.md | user-story | Medium | debt | 1 |
| P6-G5-S1 | User drags kanban on laptop, phone reflects within 2 s wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P6-G6-S1 | User edits CV bullet on laptop, switches to tablet — pending optimistic edits survive tab close and replay wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P6-G6-S2 | User has the same workspace open in two tabs on same browser — leader election prevents double-claim wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P6-G6-S3 | User goes offline on laptop, makes edits, reconnects — pending op queue drains in order wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P6-G6-S4 | User has both tabs open, kills primary tab — successor becomes leader within seconds wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| P6-G7-S1 | User renders PDF on laptop, opens phone — same Typst source produces matching layout wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P6-G9-S1 | User types into bullet on laptop, types into same bullet on phone — Y.Text merges character-by-character wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P7-G1-S1 | New collaborator opens shared link cold — first paint includes current job list wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P7-G10-S1 | New collaborator's first edit appears on creator's screen within 2 s wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| P7-G10-S2 | New collaborator joins, then leaves, then rejoins — state convergent, no duplicate identity wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P7-G10-S3 | Creator shares read-only link instead — new collaborator's UI is fully disabled for writes wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| P7-G6-S1 | New collaborator inherits the quarry on first paint, sees variants and selections rendered correctly wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| REC-S1 | User kills tab mid-edit — pending ops in IDB replay on reopen wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| REC-S2 | Browser dies during tailor — re-opening shows tailor in-flight or completed wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| REC-S3 | Realtime DO hibernates — first interaction wakes it, state intact wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |
| REC-S4 | Edge cache stale after writes — clients refetch fresh sub-doc wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| REC-S5 | SSE stream disconnects mid-session — auto-reconnects within ~1.5 s, missed events caught up via since-cursor wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| REC-S6 | y-indexeddb DB corrupted — clean reset, no double-replay wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| REC-S7 | User had unfinished tailor when laptop slept — on wake, optimistic pending op resumes wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| S1 | Provider-neutral test execution wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 1 |
| S2 | Provider failures are normalized wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 55 |
| S3 | Synthetic workspace origin is explicit wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 1 |
| S4 | Synthetic workspace cleanup is deterministic wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 1 |
| S5 | Quality service is a product surface wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 1 |
| S6 | Quality results are auditable wiki/content/stories/SYSTEM-STORIES.md | system-story | High | green | 1 |
| X-G10-S1 | Workspace settings save and job order save happen in same gesture — one atomic batch, peers see consistent state wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| X-G10-S2 | Workspace deletion is not user-facing — there is no destroy gesture; verify no UI exposes it wiki/content/stories/USER-STORIES.md | user-story | Low | green | 1 |
| X-G2-S1 | User pastes URL, agent extracts in background, friend opens detail — all three see the final extracted fields wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| X-G3-S1 | Custom column added while two jobs are mid-score — both jobs re-score against new column once persisted wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| X-G5-S1 | User changes active view while friend is dragging a job — friend's drag completes; group ID resolves under both views correctly wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| X-G6-S1 | Tailor triggered while a friend is editing the source bullet — snapshot reflects tailor-time state wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| X-G6-S2 | Agent tailors while user offline; on reconnect, user sees agent's snapshot without losing in-flight local edits wiki/content/stories/USER-STORIES.md | user-story | High | green | 1 |
| X-G6-S3 | User adds new section while LLM tailor in flight — tailor uses pre-add tree (its snapshot was taken first) wiki/content/stories/USER-STORIES.md | user-story | Medium | green | 1 |
| X-G6-S4 | Two browsers tailor the same job with same deterministic request_id — only one LLM call runs wiki/content/stories/USER-STORIES.md | user-story | Critical | green | 1 |