__tests__test(mail): repair nine stale suites, and give the tRPC mock a fallback Every one of these failed for the same underlying reason: the test froze a snapshot of a contract that has since moved, and nothing forced the two back into agreement. The tRPC mock is the big one. It hand-listed the procedure tree, so a component reaching for anything nobody had added died on `Cannot read properties of undefined (reading 'mutationOptions')` — in a component unrelated to whatever change surfaced it. It's a recursive proxy now: option builders resolve at any depth, unknown paths just work. That alone fixed InboxTab and is why the roadmap and StageInspector mocks only needed the procedures they actually assert on. The rest were assertions outliving their mechanism. `viewStack` is gone — url-driven layout derives isThreadOpen/isConversationOpen from the active thread's selectedArtifact — so openDraftReview and draftMessageRenderer now assert that instead, and seed an active thread, since setSelectedArtifact no-ops without one. DraftReviewPanel asserted an error toast for a missing threadId, which is no longer an error: a draft with no thread opens a prefilled compose. messagesSlice.basic asserted an assistant message whose setup had been deleted. handleNavigateToTask.test.ts is deleted rather than fixed. It replicated an EmbeddedCedarChat handler that no longer exists, and the bug it documented (reading the email-thread cache to choose compose-vs-thread, and guessing wrong whenever the cache was cold) can't occur in the openTask that replaced it — that routes on taskActionData alone and opens by URL. open-task.test.ts covers the live path instead; it had none. email-composer-send.test.tsx is NOT fixed and still fails. It had never run, so it rotted freely: mock paths off by a directory, jest.mock factories closing over out-of-scope consts, a v2 setContent signature, useForm not a jest.fn despite four tests calling mockReturnValue on it. Those are all repaired and the suite now renders the composer — but clicking Send hangs, because the send flow awaits an autosave the fake timers never advance. That needs the current send/save interaction modelled deliberately, not more mock patching, so it's left red rather than papered over. 165/166 suites, 1605 tests passing. `pnpm types` still clean. Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 2, 2026, 9:40 PMcomponentsrefactor(mail): stop announcing success, and fix the qualified-date parser Toasts now only fire when something went wrong. 416 success confirmations across 151 files told the user that the thing they had just watched happen had happened — the row was already gone, the draft already sent, the text already in the clipboard. Removing them took the variables and callbacks that existed only to build those messages with them. Thirteen survive, minus the success styling: the ones carrying an Undo button, where the toast is the affordance rather than a notification. Those now use the neutral toast() so they read as "here is your undo", not congratulation. toast.info / toast.warning are untouched — those report neutral or unwanted outcomes, which is not the same thing as celebrating one. Also fixes "mid august" resolving to August 1st in every date picker. chrono has no notion of early/mid/late, so it finds the month, discards the qualifier and answers the 1st — and near a month boundary forwardDate then pushed that past date into NEXT YEAR, so scheduling a send three days out landed eleven months away. resolveQualifiedPeriod runs ahead of chrono and takes the words it cannot express: named months, relative months, weeks and years, each with early / mid / late, rolling forward only when the resolved date has actually passed. And the scheduled email in a thread now renders as an ordinary message rather than a bespoke card: same MailDisplay, a Scheduled badge in the tracking-badge slot, and Edit / Delete replacing reply / reply-all / forward — there is nothing to reply to on mail that has not gone out yet. Edit unschedules before reopening, because the send payload is a frozen snapshot and would otherwise fire the old text alongside the edited one. Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 12, 2026, 10:13 PMhooksfeat: public roadmap board UI + sign-in modal (design: roadmap phase 5) /roadmap public route + RoadmapBoard/ItemCard/Comments/RequestForm/TeamControls/ SignInModal wired to roadmap.* tRPC. Work-email gate modal parses roadmap-domain-blocked reason. Fixed generated byRank to numeric compare. 5 tests. Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jun 21, 2026, 10:02 PMutilsrefactor(roadmap): twitter-style feed + cards (per feedback) Single ranked feed (no group headers); status badge top-right (editable for team), upvote moved to a bottom action bar (Heart + comment + team delete), threaded sub-items. Removed date display + team rank/date/re-parent controls (RoadmapTeamControls deleted). RoadmapDateBadge built but unrendered. Tests green. Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jun 21, 2026, 10:26 PMconstants.tsrefactor(roadmap): twitter-style feed + cards (per feedback) Single ranked feed (no group headers); status badge top-right (editable for team), upvote moved to a bottom action bar (Heart + comment + team delete), threaded sub-items. Removed date display + team rank/date/re-parent controls (RoadmapTeamControls deleted). RoadmapDateBadge built but unrendered. Tests green. Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jun 21, 2026, 10:26 PMindex.tsrefactor(roadmap): twitter-style feed + cards (per feedback) Single ranked feed (no group headers); status badge top-right (editable for team), upvote moved to a bottom action bar (Heart + comment + team delete), threaded sub-items. Removed date display + team rank/date/re-parent controls (RoadmapTeamControls deleted). RoadmapDateBadge built but unrendered. Tests green. Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jun 21, 2026, 10:26 PMtypes.tsfeat: public roadmap board UI + sign-in modal (design: roadmap phase 5) /roadmap public route + RoadmapBoard/ItemCard/Comments/RequestForm/TeamControls/ SignInModal wired to roadmap.* tRPC. Work-email gate modal parses roadmap-domain-blocked reason. Fixed generated byRank to numeric compare. 5 tests. Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jun 21, 2026, 10:02 PM