You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The two-prong rule stated below is incomplete — it is missing its precondition.
Read the amendment first: #7678 (comment 5548730153). A tombstone is available only where the
retired thing has a surviving carrier; a whole exported type name has none and is removed outright.
Two text-only follow-ups carved out of the claude-fable-5-1 contract review of PR #7669 (card #7654). Both were graded non-blocking, so #7669 landed rather than being parked — ⛔ a non-blocking nit is not a reason to hold a PASS. They are filed rather than dropped because both are prose a later reader would copy.
1. complex.ts and mobile.ts state contradictory retire-vs-remove rules, in the same package
As written today:
file
what it says
packages/types/src/complex.ts:967 (new, from #7669)
unmirrored ⇒ tombstone
packages/types/src/mobile.ts:129
unmirrored + zero pull ⇒ remove outright
A reader landing on either one gets a rule that the other contradicts. The reviewer measured that #7669's route is still correct — but for a reason #7669 does not write down.
The actual discriminator, from the two precedent retirements (#4919→#5941 and #5942→#7526, both 2026-09-03) and quoted in both their changesets, has two prongs:
a tombstone exists to steer authors to a named live replacement KEY, or to keep loud a key the docs taught as working
triggerIcon fails prong 1 — there is no replacement key.
triggerIcon satisfies prong 2 — it was advertised in the 3.3.0 release record (CHANGELOG.md:578, 2026-04-17) and its published JSDoc promised @default 'MessageCircle'.
MobileOverrides / AccordionItem.icon had 0 CHANGELOG lines — which is why they were removed outright.
⚠️#7669's recorded rationale (the complex.ts JSDoc, the changeset, the test header) argues from tsc behaviour alone — that a tombstone dominates deletion because excess-property checking only reaches a fresh literal. That argument is true, but it applied equally to #4919 and #5942, which were removed anyway. So it cannot be what distinguishes them, and stating it as if it were is what produces the contradiction.
Fix: make the complex.ts JSDoc cite prong 2 (release-note advertisement + published default) as the reason this key earns a tombstone, so the two statements stop contradicting each other. Consider whether mobile.ts:129 should also gain the two-prong form rather than the one-line rule it carries.
2. The tripwire comment claims a red it does not always produce
The new test file's comment on the parse-green assertion says, in effect: if #6152 ever mints a FloatingChatbotConfigSchema, this goes RED.
Measured against both mirror shapes:
minted mirror
what actually goes red
house-style non-strictz.object
1 test — the shape.floatingConfigshape pin. The parse-green test the comment is attached to stays GREEN.
.strict()
2 tests
So the file does trip either way — the tripwire works, which is why this is non-blocking — but it trips via the shape pin, not via the test the comment sits on. As written the comment would send whoever lands #6152 to the wrong assertion.
Fix: move the comment to the shape pin, or have it name the shape pin as the assertion that actually fires.
Scope
⛔ Prose only. No behaviour, no accept set, no export. The tombstone itself is correct and landed; ⛔ do not re-litigate it. displayMode is a separate open maintainer decision on #7654 and is out of scope.
Filed by the domain:ui PM seat, session session_01KbJQ1y1J12nZxYzFWhP8Q3.
Important
The two-prong rule stated below is incomplete — it is missing its precondition.
Read the amendment first: #7678 (comment 5548730153). A tombstone is available only where the
retired thing has a surviving carrier; a whole exported type name has none and is removed outright.
Two text-only follow-ups carved out of the
claude-fable-5-1contract review of PR #7669 (card #7654). Both were graded non-blocking, so #7669 landed rather than being parked — ⛔ a non-blocking nit is not a reason to hold a PASS. They are filed rather than dropped because both are prose a later reader would copy.Review: #7669 (comment)
1.
complex.tsandmobile.tsstate contradictory retire-vs-remove rules, in the same packageAs written today:
packages/types/src/complex.ts:967(new, from #7669)packages/types/src/mobile.ts:129A reader landing on either one gets a rule that the other contradicts. The reviewer measured that #7669's route is still correct — but for a reason #7669 does not write down.
The actual discriminator, from the two precedent retirements (#4919→#5941 and #5942→#7526, both 2026-09-03) and quoted in both their changesets, has two prongs:
triggerIconfails prong 1 — there is no replacement key.triggerIconsatisfies prong 2 — it was advertised in the 3.3.0 release record (CHANGELOG.md:578, 2026-04-17) and its published JSDoc promised@default 'MessageCircle'.MobileOverrides/AccordionItem.iconhad 0 CHANGELOG lines — which is why they were removed outright.complex.tsJSDoc, the changeset, the test header) argues fromtscbehaviour alone — that a tombstone dominates deletion because excess-property checking only reaches a fresh literal. That argument is true, but it applied equally to #4919 and #5942, which were removed anyway. So it cannot be what distinguishes them, and stating it as if it were is what produces the contradiction.Fix: make the
complex.tsJSDoc cite prong 2 (release-note advertisement + published default) as the reason this key earns a tombstone, so the two statements stop contradicting each other. Consider whethermobile.ts:129should also gain the two-prong form rather than the one-line rule it carries.2. The tripwire comment claims a red it does not always produce
The new test file's comment on the parse-green assertion says, in effect: if #6152 ever mints a
FloatingChatbotConfigSchema, this goes RED.Measured against both mirror shapes:
z.objectshape.floatingConfigshape pin. The parse-green test the comment is attached to stays GREEN..strict()So the file does trip either way — the tripwire works, which is why this is non-blocking — but it trips via the shape pin, not via the test the comment sits on. As written the comment would send whoever lands #6152 to the wrong assertion.
Fix: move the comment to the shape pin, or have it name the shape pin as the assertion that actually fires.
Scope
⛔ Prose only. No behaviour, no accept set, no export. The tombstone itself is correct and landed; ⛔ do not re-litigate it.
displayModeis a separate open maintainer decision on #7654 and is out of scope.Filed by the
domain:uiPM seat, sessionsession_01KbJQ1y1J12nZxYzFWhP8Q3.Generated by Claude Code