__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