5.6.2 The combined collaboration journey E2E — one issue through every Epic-5 feature, the cross-story seams asserted end-to-end
Estimate: 35m · Depends on: 5.6.1, 5.1.7, 5.2.8, 5.3.8, 5.4.11, 5.5.5
The chain-proof: tests/e2e/collab-journey.spec.ts, one continuous flow on a fresh issue (not the loaded fixture — this spec is about correctness of the seams, not scale), against the standing dev-server harness with the Inngest dev stub.
The build-up: create an issue (auto-watch asserted) → second user watches → set custom-field values + labels + components on the rail → post a comment that BOTH embeds an upload AND @mentions the watching user → assert the seams in one pass: the attachment panel shows the file editor-sourced (5.2.3 ran inside 5.1.2's tx chain), the mentioned watcher received exactly ONE email (the mention; the watcher job deduped — grep the dev console for both jobs' output), the author received none, a third watching user received the watcher email, and the All feed interleaves the field changes, the label/component entries, and the comment in true order with the History tab showing the non-comment entries.
The unwind: delete the comment (thread + reply cascade) → the embedded attachment unlinks from the panel, History records the deletion (who/when, no content), and no further notification fires; delete a valued custom field → the rail card vanishes and the old History entries render the deleted-referent fallback; archive the select option in use → the rail value and its History entries keep rendering with the archived mark. Transition the issue → the watcher transition email fires (actor excluded).
Vitest companion (tests/integration/collab-journey.test.ts): the same chain at the service layer where E2E assertion is weak — the comment-delete transaction leaves NO orphan mention rows / attachment links / revision gaps (DB-state asserts), and the notification events carry the exact recipient sets the dedupe contract promises.
Acceptance criteria
- The E2E passes the full build-up + unwind with every cross-story assert named above, green in CI's Playwright lane (selector + harness memories respected).
- The notification asserts are exact (one mention email, one watcher email to the non-mentioned watcher, zero to the actor; zero after the unwind) — not substring-loose.
- The Vitest companion proves the no-orphan transaction properties + the recipient-set contracts at the service layer.
- No duplication of per-story coverage (review note in the spec header mapping each assert to the seam it owns); flake-isolation respected.
Context refs
- The five story test subtasks (5.1.7 / 5.2.8 / 5.3.8 / 5.4.11 / 5.5.5) — what NOT to re-test; their specs as harness/selector exemplars
- 5.6.1 helpers; the dev email console
[EMAIL]grep contract;@inngest/testwhere the E2E can't reach - The cross-story seam contracts: 5.2.3 (link-on-write in comment txs), 5.4.5 (mention dedupe), 5.5.1 (fallback rendering)
- The E2E harness memories (standing dev server + Inngest stub, OOM-safe)