docs(types): bring every statement of the tombstone discriminator to the amended form - #9682
Conversation
…r to the amended form The retire-vs-remove discriminator is stated at three sites in `packages/types/src/complex.ts` at two different levels of amendment: the `KanbanColumn.color` block and the `ChatbotSchema` dark-keys block gave the two prongs without their precondition, while the `displayMode` tombstone already carried it. The first two now state the amended rule in the wording the third already uses, so a reader landing on any of the three gets the same rule. The `KanbanColumn.color` site's own parenthetical had named objectui#7678 as its open correction; that parenthetical is discharged rather than repeated. `mobile.ts`'s `MobileOverrides` retirement note keeps its prong-1 argument, which is settled, and gains a pointer to the amended rule and to the reason prong 2 has nothing to guard there: the module has never had a `zod/` twin. The objectui#6152 tripwire comment in `floating-chatbot-trigger-icon-retired.test.ts` claimed the parse-green assertion it sits on would go red once a `FloatingChatbotConfigSchema` is minted. Measured by injecting the arm on both twins and restoring under a trap: a non-strict `z.object` mirror reds the shape pin only (2 failures, one per twin) and leaves that parse-green line green; a `z.strictObject` mirror reds both (4 failures). The comment now names the shape pin and records both readings. Comment-only. No member added, removed, renamed or retyped, no accept set moved, no export added. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
…a bare keyword The clause-2 mechanical floor for this card is `^\+export` scoring 0 in the diff. The previous wrapping put "export added." at the head of a line inside the changeset prose, which scored 1 against a floor meant to catch an added declaration. Reflowed; the sentence is unchanged in meaning. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
…erIcon tombstone⚠️ This commit is separable on purpose. The dispatch for objectui#7678 recorded the card's item-1 ask — "make the `complex.ts` JSDoc cite prong 2 as the reason this key earns a tombstone" — as already discharged, measured at the `KanbanColumn.color` block. That block does state both prongs, but for a DIFFERENT retirement. The `triggerIcon` block, which is the site the card was filed about, mentions neither prong, the discriminator, nor the carrier precondition: it argues from the `tsc` deleted-vs-tombstoned contrast alone, which is exactly the rationale the card names as the cause of the contradiction, since that contrast applied equally to objectui#4919 and #5942 and both were removed outright. The block now carries the amended discriminator in the same wording as the other sites and names prong 2 — the 3.3.0 release record advertised the key and its published JSDoc promised a default — as the reason it earns a tombstone, with prong 1 recorded as not holding. The route is untouched: no member, no `?: never`, no accept set, nothing newly exported. The tombstone is not re-litigated; only its recorded reason is completed. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…irement note The sixth and last site in this package that states the retire-vs-remove discriminator. It gave the two prongs in full and without the precondition — in `mobile.ts`, which is the file whose disagreement with `complex.ts` is why objectui#7678 exists. It now carries the amended form in the same wording as the other five: a `?: never` tombstone is available only on a SURVIVING CARRIER, and on such a carrier it is used when either prong holds. `GestureConfig` is a whole exported type name, so it has no carrier at all and the precondition settles the route on its own; the per-prong measurement that follows it is kept as the record rather than dropped. Every existing clause survives verbatim: the prong-1 zero-hit reading, the prong-2 CHANGELOG reading, the referral of "does a reclaim note count as taught as working" to objectui#7519, the structural no-silent-strip note, the missing `zod/` twin, the TS2724 reading and the residue pin. The removal is not re-argued and the objectui#7519 referral is untouched. Census after this commit: six statements of the prong-1 phrase across `complex.ts` and `mobile.ts`, every one of them now reached by the precondition, plus the `triggerIcon` block that states the rule without restating the prongs. The duplication itself is filed as objectui#9684 and is deliberately NOT restructured here. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Part of #7678
Prose only. No member added, removed, renamed or retyped in any file; no
?: nevertombstone touched; no accept set moved; nothing newly exported.Clause-②: no, re-measured at delivery ondce4a74a1:git diff 72f55c9ec..HEAD -U0 | grep -c '^+export'scores 0, and the same diff filtered to non-comment source lines scores 0 lines — every added and removed line inpackages/types/**is a comment line.Two premises of the dispatch falsified
1. The item-1 ask was NOT already discharged
The dispatch recorded the card's item-1 ask — "make the
complex.tsJSDoc cite prong 2 as the reason this key earns a tombstone" — as already done, measured at theKanbanColumn.colorblock. That block does state both prongs with a worked example for each. It states them for a different retirement.The
triggerIconblock — the site this card was filed about — mentions neither prong, nor the discriminator, nor the carrier precondition. Measured on72f55c9ecover that whole docblock:grep -c "prong|discriminator|carrier|5941|7526"returns 0. It argues from thetscdeleted-vs-tombstoned contrast alone, which is exactly the rationale the card names as the cause of the contradiction, since that contrast applied equally to objectui#4919 and #5942 and both were removed outright.Commit
dce4a74a1takes that site too. It is separable on purpose — drop it and the other three sites still agree.2. The
floatingConfigtripwire is alive, and it is not thedisplayModeoneAddress:
packages/types/src/__tests__/floating-chatbot-trigger-icon-retired.test.ts, theTRIPWIREcomment on the parse-green assertion inside thethere is NO zod refusal on a %s nodeblock. ThedisplayModetripwire inchatbot-display-mode-retired.test.tsis a separate, already-corrected one and was not touched —displayModestays out of scope.Measurement behind the tripwire rewrite
Injected a minted
floatingConfigarm onto both twins inpackages/types/src/zod/complex.zod.ts, ran the tripwire file, restored under atrap ... EXIT INT TERM. Both legs verified on disk: marker count 0 to 3, blob656fc015to the mutated blob and back to656fc015,git diff HEADempty afterwards.72f55c9ecz.objectmirrorz.strictObjectmirrorThis reproduces triage's table (triage counted per-key; the file's
describe.eachdoubles each reading). The comment now names the shape pin as the assertion that fires and records both readings; the shape pin gained a back-pointer.Before / after at each site
complex.ts—KanbanColumn.colorbefore:
after:
The site's own parenthetical named this card as its open correction; that parenthetical is now discharged rather than repeated.
complex.ts— theChatbotSchemadark-keys blockbefore:
after:
complex.ts— thetriggerIcontombstone (the separable commit)before: the
Why a tombstone and not a deletionsection ended at the deleted-vs-tombstoned table and went straight toPinned in .... No prong, no discriminator, no carrier.after, added between them:
complex.ts— thedisplayModetombstone⛔ Unchanged. It is the site that already carried the precondition and it was the model every other site was matched to.
mobile.ts— theMobileOverridesretirement noteThe prong-1 argument is kept verbatim — the removal is settled and is not re-argued. Added after it:
the tripwire comment
before:
after:
Stale addresses, reported and NOT repaired
This card is scope-pinned, so AGENTS.md #11's opportunistic citation repair does not apply.
5548730153both address thetriggerIconrationale aspackages/types/src/complex.ts:967. On72f55c9ecthat line isChatToolInvocation.stateprose, unrelated. The block is roughly 850 lines further down. ⛔ Not repaired here.72f55c9ec, includingbase.ts:499inside aBaseSchemabody running:70to:500— verified by reading the interface's true extent (^export interfaceat:70, closing}at:500), not a context window.Verification
Run through the shared verify lock where it is a package suite.
pnpm --filter @object-ui/types run type-check(tsc --noEmit+ examples +tsconfig.test.json)pnpm --filter @object-ui/types run testnode scripts/check-changeset-presence.mjscheck-changeset-claims/-no-major/-fixed/-overwrite/check-pending-changeset-literalsnode scripts/check-new-cross-file-line-citations.mjsnode scripts/check-control-bytes.mjsnode scripts/check-governed-queue-guard.mjs --test ...eslint . --no-inline-config --format json(whole repo, 5038 files)The 95 repo-wide eslint errors are pre-existing on
origin/main(react-hooks/static-components,no-consoleand friends inapps/consoleande2e/), untouched by a comment-only diff.Changeset
Empty frontmatter, following the repo's own precedent for comment-only changes in published source. Comments do reach the emitted
.d.tshere — the base tsconfig setsremoveComments: false, verified — and the changeset says so explicitly, but nothing a consumer can execute or type-check against moves.Generated by Claude Code