diff --git a/.changeset/10039-publish-drafts-advisories.md b/.changeset/10039-publish-drafts-advisories.md index a5e02996f2..5b41fdbcf2 100644 --- a/.changeset/10039-publish-drafts-advisories.md +++ b/.changeset/10039-publish-drafts-advisories.md @@ -21,7 +21,7 @@ What moves with the route, at all three: - A non-2xx raises `MetadataError` inside the client instead of being read off `res.ok`. The message is still the server's own, and the ADR-0112 producer-marked `error.userMessage` now outranks the diagnostic `error.message` - where the refusal carries one — the rule objectui#7959 landed on `PackagesPage`, + where the refusal carries one — the rule `36fc74629` landed on `PackagesPage`, reaching these surfaces by the same seam rather than by a fourth copy. `StudioDesignSurface` keeps its field-anchored issue rendering: the client already carries `error.details.issues` on `MetadataError.issues`, which is what diff --git a/.changeset/10150-author-shape-header-ruling.md b/.changeset/10150-author-shape-header-ruling.md index 599e585381..ef9f4b38b5 100644 --- a/.changeset/10150-author-shape-header-ruling.md +++ b/.changeset/10150-author-shape-header-ruling.md @@ -1,6 +1,6 @@ --- --- -Comment-only in `@object-ui/app-shell`: the docblock above `clientValidation`'s `AUTHOR_SHAPE_ONLY_TYPES` ended on a plan, to switch the `sharing_rule` edit gate on once the `_diagnostics` ingress was closed. That condition was met (`extractDraftBody` strips the read decorations through the spec's `stripReadDecorations`), the switch was put to the maintainer on objectui#7612, and the ruling was option A: the edit door stays with the server. The docblock now records that ruling beside the condition, and keeps the measurement above it. A source-scan pin requires the docblock to name the ruling's card and the function that closed the ingress. +Comment-only in `@object-ui/app-shell`: the docblock above `clientValidation`'s `AUTHOR_SHAPE_ONLY_TYPES` ended on a plan, to switch the `sharing_rule` edit gate on once the `_diagnostics` ingress was closed. That condition was met (`extractDraftBody` strips the read decorations through the spec's `stripReadDecorations`), the switch was put to the maintainer, and the 2026-09-20 ruling was option A: the edit door stays with the server. The docblock now records that ruling beside the condition, and keeps the measurement above it. A source-scan pin requires the docblock to name the ruling and the function that closed the ingress. Declared as releasing nothing because the emit was measured rather than assumed: `AUTHOR_SHAPE_ONLY_TYPES` is not exported, so neither it nor its docblock reaches the emitted `clientValidation.d.ts`; the emitted `.js` carries the comment, and its comment-stripped emit is identical to the base. No published behaviour changes (objectui#10150). diff --git a/.changeset/10803-dead-citation-sweep-fifth-batch.md b/.changeset/10803-dead-citation-sweep-fifth-batch.md new file mode 100644 index 0000000000..066ec8b3da --- /dev/null +++ b/.changeset/10803-dead-citation-sweep-fifth-batch.md @@ -0,0 +1,23 @@ +--- +--- + +Comment-only in `@object-ui/app-shell`, `@object-ui/components`, `@object-ui/core`, +`@object-ui/fields`, `@object-ui/plugin-charts`, `@object-ui/plugin-chatbot`, +`@object-ui/plugin-dashboard`, `@object-ui/plugin-designer`, `@object-ui/plugin-detail`, +`@object-ui/plugin-grid`, `@object-ui/plugin-list`, `@object-ui/plugin-markdown`, +`@object-ui/plugin-timeline`, `@object-ui/react` and `@object-ui/types` (whose runtime text is +declared separately below), plus the private +`@object-ui/test-support`: docblocks and code comments that cited objectui issues or pull +requests which answer 404 now cite the commit that landed each change, as a 9-character +sha, the ruling by its date where the sentence cites a ruling, or a live pointer the +sentence already named, and where nothing answers they name the card by role +(objectui#10803, the fifth batch). Bare numbers that were sister-repo cards are now written +`objectstack#3720`, `objectstack#5506` and `objectstack#6936`. Some of these docblocks +reach the emitted `.d.ts` and `.js`; none of them moves a claim, and none of these comment +edits changes a code or type token. No published behaviour changes through them, so this +declares no release. The runtime text the sweep touches, six tombstone guidance strings, +one refusal message and one zod `.describe()` string in `@object-ui/types`, is declared on +its own as a patch in `10803-fifth-batch-runtime-strings.md`. + +The same repair in the pending changesets that carried these citations is prose-only, and +their frontmatter is byte-identical. diff --git a/.changeset/10803-fifth-batch-runtime-strings.md b/.changeset/10803-fifth-batch-runtime-strings.md new file mode 100644 index 0000000000..44c56b1c12 --- /dev/null +++ b/.changeset/10803-fifth-batch-runtime-strings.md @@ -0,0 +1,28 @@ +--- +'@object-ui/types': patch +--- + +fix(types): eight more runtime strings no longer point at objectui issues that answer 404 + +Six ADR-0049 retirement tombstones in the published zod mirrors, one refusal message and +one runtime description carried a pointer to an objectui issue that answers 404. A reader +of a parse error or a zod `description` has no repository to resolve a commit against, so +no dead pointer becomes a commit: the six tombstones keep `ADR-0049` and lose the dead +card beside it, the `actions` tombstone cites `ADR-0049` in its place, and the one +description simply drops its pointer (objectui#10803). + +- **The tombstone guidance.** `ChatbotSchema`'s `loading`, `showAvatars`, `userAvatar`, + `assistantAvatar`, `markdown` and `height` tombstones feed both the parse error an + author reads and the `.describe()` text, and each now opens `RETIRED (ADR-0049) —` where + it opened with the dead card and `ADR-0049` together. The `showAvatars` message also + ends its sentence about the fenced props spread at "was fenced." Everything else after + the dash is unchanged, so the remedy each message gives is word for word what it was. +- **The `page` node's `actions` refusal**, an ADR-0049 tombstone too, now reads "`actions` + is not a key of the `page` node and never was (ADR-0049): no renderer reads it", and the + remedy after it is unchanged. +- **One description.** `ChartDataSeriesSchema.variant` now ends "the renderer-internal + `current` spelling is not a member". + +Nothing else in any string moves, and no key, path, issue code, accept set, refusal or +severity changes: every document that parsed before parses the same way and is refused at +the same path with the same code. diff --git a/.changeset/4919-retire-mobile-overrides.md b/.changeset/4919-retire-mobile-overrides.md index 3c3489498f..e21606ab0a 100644 --- a/.changeset/4919-retire-mobile-overrides.md +++ b/.changeset/4919-retire-mobile-overrides.md @@ -23,7 +23,7 @@ deletion — a config that type-checks, builds and silently does nothing is the declare-without-enforce shape the platform doctrine forbids. Removal rather than a `?: never` tombstone follows this package's own retire-vs-remove -discriminator, in the form objectui#7678 amended it to. That rule is cited here and not +discriminator, in its amended form (`5f8190c8c`). That rule is cited here and not restated: it is stated once, and a second copy carried in a release note could only drift out of agreement with it. Measured against it the route is removal: there is no replacement key to steer to, no documentation ever described the surface, and there is no successor diff --git a/.changeset/5942-retire-mobile-component-config.md b/.changeset/5942-retire-mobile-component-config.md index f994aee041..f9ecbe7e24 100644 --- a/.changeset/5942-retire-mobile-component-config.md +++ b/.changeset/5942-retire-mobile-component-config.md @@ -25,7 +25,7 @@ could reach a renderer. objectui#4919 removed its last member (`mobileOverrides`), which is what left the container itself inert. Removed outright rather than kept as a `?: never` tombstone, on this package's -own retire-vs-remove discriminator, in the form objectui#7678 amended it to. +own retire-vs-remove discriminator, in its amended form (`5f8190c8c`). That rule is cited here and not restated: it is stated once, and a second copy carried in a release note could only drift out of agreement with it. Measured against it the route is removal — the whole interface goes, so there is no diff --git a/.changeset/6002-dashboard-widget-strict.md b/.changeset/6002-dashboard-widget-strict.md index 22737b1e9d..66ce3e4688 100644 --- a/.changeset/6002-dashboard-widget-strict.md +++ b/.changeset/6002-dashboard-widget-strict.md @@ -13,7 +13,7 @@ verdict ACCEPT — the same "dropped without a word" failure the schema's own docstring records from the pre-derivation hand copy, still live for every key no contract declares (objectui#6002). Maintainer ruling 2026-08-25, Route 1 two-step: objectui#6150 declared the 13 genuinely-consumed keys first (landed -as PR #6945), then this flip makes a stale or mistyped key loud everywhere the +as `2c45966ff`), then this flip makes a stale or mistyped key loud everywhere the contract is consulted (`objectui validate`, `safeValidateSchema`, the catalog gate) instead of only inside one catalog test. diff --git a/.changeset/6150-undeclared-but-consumed-keys.md b/.changeset/6150-undeclared-but-consumed-keys.md index c7f0f1f24d..e8b9e9d621 100644 --- a/.changeset/6150-undeclared-but-consumed-keys.md +++ b/.changeset/6150-undeclared-but-consumed-keys.md @@ -58,8 +58,8 @@ on its own, and each says so in its own doc comment: a value, so it cannot appear in an authored JSON document, and objectui#6152 ruled that the class never gets one. - ⭐ **AMENDED, and the amendment ships in this same release.** objectui#7804's - `TreeViewSchema` slice gave the key a zod arm after all — a NAMED REFUSAL + ⭐ **AMENDED, and the amendment ships in this same release.** The + `TreeViewSchema` slice (`604476d97`) gave the key a zod arm after all — a NAMED REFUSAL (`handlerKeyRefusal(key, 'runtime-slot', label)`), never a shape — because "no mirror entry" is not neutral under `BaseSchema.passthrough()`: it meant an authored `{ "type": "tree-view", "onNodeClick": { "action": "toast" } }` parsed diff --git a/.changeset/6467-unused-import-gate.md b/.changeset/6467-unused-import-gate.md index 091ea17dd2..1bc5fe5265 100644 --- a/.changeset/6467-unused-import-gate.md +++ b/.changeset/6467-unused-import-gate.md @@ -2,7 +2,7 @@ --- No published behaviour changes. Promotes the unused-import subclass of -`@typescript-eslint/no-unused-vars` to `error` (objectui#4806 R2, #6467) and +`@typescript-eslint/no-unused-vars` to `error` (objectui#4806 R2) and removes the 108 unused imports across 21 packages that the promotion finds. Every edit is the deletion of an import binding that nothing referenced — no runtime code, no exported API and no type surface moves, and the removals diff --git a/.changeset/7092-launcher-exclusion-reason.md b/.changeset/7092-launcher-exclusion-reason.md index 61dc7b07b1..044cd7b3d9 100644 --- a/.changeset/7092-launcher-exclusion-reason.md +++ b/.changeset/7092-launcher-exclusion-reason.md @@ -3,7 +3,7 @@ Corrects the `PALETTE_EXCLUSIONS` reason string for `app:launcher` in the Studio page-palette ledger. It read "shell singleton — the app shell renders it, not a page", -and objectui#7091 registered a real `app:launcher` renderer, so a page can now render it +and `969ba84f4` registered a real `app:launcher` renderer, so a page can now render it and the "not a page" clause became false. The reason now reads "shell singleton — lives in the app shell chrome", mirroring the neutral form its sibling `global:notifications` has carried since `f99932a42` shipped that type a renderer without its wording rotting: diff --git a/.changeset/7097-grid-2xl-breakpoint.md b/.changeset/7097-grid-2xl-breakpoint.md index b40b677098..58d4e5e5c6 100644 --- a/.changeset/7097-grid-2xl-breakpoint.md +++ b/.changeset/7097-grid-2xl-breakpoint.md @@ -2,8 +2,7 @@ '@object-ui/components': patch --- -`ui:grid` renders the `2xl` breakpoint its `columns` map has always accepted -(objectui#7097). +`ui:grid` renders the `2xl` breakpoint its `columns` map has always accepted. `columns: { xs: 1, '2xl': 6 }` type-checked, passed `GridSchema`'s zod mirror, emitted **no class**, and rendered at the `xs` count on every screen — no error, no warning. diff --git a/.changeset/7108-approvals-inbox-dead-record-tombstone.md b/.changeset/7108-approvals-inbox-dead-record-tombstone.md index 804db335f7..60b40cd90a 100644 --- a/.changeset/7108-approvals-inbox-dead-record-tombstone.md +++ b/.changeset/7108-approvals-inbox-dead-record-tombstone.md @@ -3,7 +3,7 @@ --- Approvals inbox: a record that was deleted now renders a "record deleted" -tombstone instead of degrading to the bare record id (objectui#7108). +tombstone instead of degrading to the bare record id. When an approval's underlying record is deleted, the platform voids the still-pending requests and stamps the cause on the row (`status: 'cancelled'` diff --git a/.changeset/7177-studio-switcher-server-writable-verdict.md b/.changeset/7177-studio-switcher-server-writable-verdict.md index 61bc87a692..49dab87499 100644 --- a/.changeset/7177-studio-switcher-server-writable-verdict.md +++ b/.changeset/7177-studio-switcher-server-writable-verdict.md @@ -3,7 +3,7 @@ --- Studio's package switcher reads the server's `writable` verdict instead of guessing -from `manifest.scope` (objectui#7177, ADR-0130 Consequences row 6, server half in +from `manifest.scope` (ADR-0130 Consequences row 6, server half in objectstack#14375). `GET /api/v1/packages` now stamps every row with `writable: boolean`, computed by diff --git a/.changeset/7519-retire-mobile-residue-types.md b/.changeset/7519-retire-mobile-residue-types.md index 1e06b0d5f7..5951292f07 100644 --- a/.changeset/7519-retire-mobile-residue-types.md +++ b/.changeset/7519-retire-mobile-residue-types.md @@ -21,8 +21,8 @@ declared-surface-with-no-consumption-path shape as `MobileComponentConfig` itself and `MobileOverrides` (objectui#4919) before it, one level down. Removed outright rather than kept as `?: never` tombstones, measured against -this package's retire-vs-remove discriminator, in the form objectui#7678 -amended it to. That rule is cited here and not restated: it is stated once, and +this package's retire-vs-remove discriminator, in its amended form +(`5f8190c8c`). That rule is cited here and not restated: it is stated once, and a second copy carried in a release note could only drift out of agreement with it. The per-prong measurement it asks for is kept as the record. Prong 1: neither has a replacement key — the behaviour they named lives in hooks, and diff --git a/.changeset/7546-chart-series-keys-declared.md b/.changeset/7546-chart-series-keys-declared.md index a35c2471c5..342bb86773 100644 --- a/.changeset/7546-chart-series-keys-declared.md +++ b/.changeset/7546-chart-series-keys-declared.md @@ -72,7 +72,7 @@ is the renderer's internal default — written only by the compare-to producers `DatasetWidget`) onto internal-shape arrays that never pass this mirror, and by nothing an author writes (docs, fixtures, designer inputs: 0, controls lit) — so it is not a member here: declaring it would have fossilised a renderer-side tolerance into a second contract. The normalizer's tolerance -is unchanged; objectui#7682 owns that decision. +is unchanged; a separate card owns that decision. ## Unchanged, deliberately diff --git a/.changeset/7620-data-table-date-convention.md b/.changeset/7620-data-table-date-convention.md index d8815092b6..e508606542 100644 --- a/.changeset/7620-data-table-date-convention.md +++ b/.changeset/7620-data-table-date-convention.md @@ -2,7 +2,7 @@ '@object-ui/components': minor --- -One home for the `date` display convention in `data-table` (objectui#7620). +One home for the `date` display convention in `data-table`. `data-table`'s fallback cell (`formatCellValue`) sniffs ISO strings and formats them. Its date-only branch built its own `Intl.DateTimeFormat` bag — diff --git a/.changeset/7623-retire-dashboard-root-title-declaration.md b/.changeset/7623-retire-dashboard-root-title-declaration.md index 8cf4f79fa3..3f2d617c2e 100644 --- a/.changeset/7623-retire-dashboard-root-title-declaration.md +++ b/.changeset/7623-retire-dashboard-root-title-declaration.md @@ -3,7 +3,7 @@ --- **Published TS surface narrowed:** `DashboardComponentSchema` no longer declares the -dashboard-root `title` member (objectui#7623). +dashboard-root `title` member. Its doc comment said "Dashboard title displayed in the header", and that stopped being true one release earlier: objectui#7509 retired all five dashboard-root `title` read diff --git a/.changeset/7654-chatbot-display-mode-tombstone.md b/.changeset/7654-chatbot-display-mode-tombstone.md index 73e9376510..1274ed824f 100644 --- a/.changeset/7654-chatbot-display-mode-tombstone.md +++ b/.changeset/7654-chatbot-display-mode-tombstone.md @@ -65,7 +65,7 @@ That is deliberate, and it is why this tombstone has **no `retirementTombstone() half**: minting a mirror arm to refuse the key would be the declared-but-unmirrored axis (objectui#6152), a different defect, and a parse outcome the ruling did not ask for. `packages/types/src/__tests__/chatbot-display-mode-retired.test.ts` pins both twins' -shapes as a **tripwire** — the same shape objectui#7669 gave `triggerIcon` — so that if +shapes as a **tripwire** — the same shape `a3eb5d07a` gave `triggerIcon` — so that if objectui#6152 ever mints an arm for `displayMode`, the pin goes red and whoever lands the mirror adds the `retirementTombstone()` half at that time, flipping the control rather than deleting it. @@ -87,7 +87,7 @@ control carrier (`FloatingChatbotConfig`) lit in the same run: Deleted, the member reads as `any` and even a wrong-typed value goes quiet. Tombstoned, **presence with any value** is a compile error — a channel deletion cannot produce on this carrier at all. On a `BaseSchema` carrier the two routes are loud-vs-silent, not -louder-vs-quieter (the discriminator's carrier branch as corrected on objectui#7678). +louder-vs-quieter (the discriminator's carrier branch in its amended form, `5f8190c8c`). Prong 2 of that discriminator licenses the tombstone: the key was advertised in the 3.3.0 release record (`CHANGELOG.md:578`) and its published comment taught it as the presentation switch. The deleted row is pinned in the test file as a live control — an diff --git a/.changeset/7655-chatbot-registration-authoring-faces.md b/.changeset/7655-chatbot-registration-authoring-faces.md index 222688e9a0..f62592c637 100644 --- a/.changeset/7655-chatbot-registration-authoring-faces.md +++ b/.changeset/7655-chatbot-registration-authoring-faces.md @@ -42,8 +42,8 @@ per key on the PR's base (one `schema.KEY` read per registration body in trailing raw props spread still carried authored keys into the panel — `processVisibility`, `surface` and `showAvatars` were live there, measured through the real host — and this face neither declared nor promised that - accidental channel, which was tracked as objectui#7708. That card has since - fenced the spread the way the two sibling registrations do, so those three keys + accidental channel, which was tracked on a card of its own. That card has since + fenced the spread (`d3499b315`) the way the two sibling registrations do, so those three keys are dark on `chatbot-floating` now; no member this face declares depended on the channel.) - Neither face declares `ChatbotSchema`'s six legacy members (`loading`, @@ -54,7 +54,7 @@ per key on the PR's base (one `schema.KEY` read per registration body in **`ChatbotSchema` is unchanged.** It keeps `displayMode` and `floatingConfig` (declarations verbatim), and the floating face declares the same two, so `ChatbotSchema['displayMode']` and `ChatbotSchema['floatingConfig']` stay the -typed members they were — the objectui#7669 `triggerIcon` tombstone keeps its +typed members they were — the `a3eb5d07a` `triggerIcon` tombstone keeps its reach on `chatbot` nodes, now pinned on the node. `floatingConfig`'s doc comment is rewritten on both faces: the old text said it was "only used when `displayMode` is `'floating'`", which was false — it is read by `chatbot-floating` diff --git a/.changeset/7658-toc-code-span-anchor-parity.md b/.changeset/7658-toc-code-span-anchor-parity.md index ebc03d3009..9440289cbd 100644 --- a/.changeset/7658-toc-code-span-anchor-parity.md +++ b/.changeset/7658-toc-code-span-anchor-parity.md @@ -3,7 +3,7 @@ --- Fix `extractToc` deleting tag-shaped text that lives INSIDE an inline code span, -so its `#id` links resolve to the heading they name again (objectui#7658). +so its `#id` links resolve to the heading they name again. `stripInline()` applied its rules in sequence: the inline-code rule unwrapped `` `objectui add ` `` to `objectui add `, and the raw-HTML diff --git a/.changeset/7664-kanban-arm-plugin-dialect.md b/.changeset/7664-kanban-arm-plugin-dialect.md index f699bdff08..ade73ca36e 100644 --- a/.changeset/7664-kanban-arm-plugin-dialect.md +++ b/.changeset/7664-kanban-arm-plugin-dialect.md @@ -61,7 +61,7 @@ render **empty**. The ruling: the plugin dialect is authoritative. `DeclarativeKanbanSchema`, `DeclarativeKanbanColumnSchema`, `DeclarativeKanbanCardSchema` from `@object-ui/types/zod` are gone. Importing any of them is a compile error (TS2305). -- **`SchemaRegistry['kanban']` is `KanbanSchema`.** objectui#7645 (PR #7662) +- **`SchemaRegistry['kanban']` is `KanbanSchema`.** objectui#7645 (`bc640ec56`) weakened the entry to `BaseSchema & { type: 'kanban' }` because this layer could not name the plugin's type; it now names the declaration the plugin itself imports. `keyof SchemaRegistry` — the published `ComponentType` union — diff --git a/.changeset/7667-toc-emphasis-flanking.md b/.changeset/7667-toc-emphasis-flanking.md index c48aec0a36..5933e9c4f5 100644 --- a/.changeset/7667-toc-emphasis-flanking.md +++ b/.changeset/7667-toc-emphasis-flanking.md @@ -3,7 +3,7 @@ --- Fix `extractToc` eating the underscores out of a `SCREAMING_SNAKE` heading, so -its `#id` links resolve to the heading they name again (objectui#7667). +its `#id` links resolve to the heading they name again. `stripInline()` ended with two hand-rolled emphasis rules that gave `*` and `_` one shared regex — `(\*\*|__)(.*?)\1` and `(\*|_)(.*?)\1`. Neither knew @@ -32,7 +32,7 @@ One live heading in this repository's own docs was affected (`packages/react/README.md:224`). Measured, not derived: the corpus sweep over `content/docs/**` plus every `packages/*/README.md` — 223 files, 2941 rendered headings — goes from 5 divergent files to 4, and the 4 that remain are a -different, already-filed defect (objectui#7666, a heading `extractToc` lists +different, already-filed defect (a heading `extractToc` lists that the renderer never emits under a JSX block). Pinned against the real render pipeline rather than a second derivation of the flanking rule: each heading is rendered through `MarkdownImpl` and `extractToc`'s id compared to diff --git a/.changeset/7678-tombstone-discriminator-agreement.md b/.changeset/7678-tombstone-discriminator-agreement.md index 0a2278101d..dd2fa2bb00 100644 --- a/.changeset/7678-tombstone-discriminator-agreement.md +++ b/.changeset/7678-tombstone-discriminator-agreement.md @@ -5,14 +5,14 @@ Comment-only agreement fix in `@object-ui/types`. The retire-vs-remove discrimin stated at three sites in `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. Both of -the first two now state the amended rule (objectui#7678) in the wording the third already +the first two now state the amended rule in the wording the third already uses — a `?: never` tombstone is available only on a surviving carrier, and on one it is used when either prong holds; a whole exported type name has no carrier and is removed outright — so a reader landing on any of the three gets the same rule. The `KanbanColumn.color` site's own parenthetical had named this card as its open correction; that parenthetical is now discharged rather than repeated. -The `triggerIcon` tombstone's own rationale was the site objectui#7678 was filed about, and +The `triggerIcon` tombstone's own rationale was the site this card was filed about, and it still argued from `tsc` behaviour alone — a contrast that applied equally to the two precedent retirements that were removed outright, so it cannot be what separates the routes. It now carries the amended discriminator and names prong 2 (the 3.3.0 release record diff --git a/.changeset/7681-chart-series-type-override-dataKey.md b/.changeset/7681-chart-series-type-override-dataKey.md index 334468bddd..32a3bdcc6e 100644 --- a/.changeset/7681-chart-series-type-override-dataKey.md +++ b/.changeset/7681-chart-series-type-override-dataKey.md @@ -4,7 +4,7 @@ Fix: a chart series' `type` override (`ChartDataSeries.type`, objectui#6121) is now honoured when the series array is written in the internal `dataKey` binding, not only -the `name` binding (objectui#7681) — the same sentence #2945 shipped for the other +the `name` binding — the same sentence #2945 shipped for the other dialect. `ChartRenderer`'s `isInternalShaped` fast path (introduced by #2945 to fix a different diff --git a/.changeset/7703-chatbot-dark-keys-retired.md b/.changeset/7703-chatbot-dark-keys-retired.md index b20f0e81c3..aeee8562ae 100644 --- a/.changeset/7703-chatbot-dark-keys-retired.md +++ b/.changeset/7703-chatbot-dark-keys-retired.md @@ -4,7 +4,7 @@ Retire the six `ChatbotSchema` members no `plugin-chatbot` registration reads — `loading`, `showAvatars`, `userAvatar`, `assistantAvatar`, `markdown` and `height` — as -ADR-0049 retirement tombstones on **both** published faces (objectui#7703). +ADR-0049 retirement tombstones on **both** published faces. ⚠️ **BREAKING for anyone authoring one of these six against `ChatbotSchema`, on either face.** Ships as `minor` per the launch-window convention: objectui's `major` is a @@ -20,7 +20,7 @@ the `.d.ts` — wrote `showAvatars: true` or `height: 400` on a `chatbot` node, on either face, and saw no change. Two of them advertised a `@default true` for a switch that did not exist. -Re-measured on this branch's base (`21d7989fb`, i.e. **after** objectui#7708's fence +Re-measured on this branch's base (`21d7989fb`, i.e. **after** the fence landed as PR #8077) rather than inherited from the card: one `schema.KEY` count per `ComponentRegistry.register(...)` body of `packages/plugin-chatbot/src/renderer.tsx`, the file split at the three register calls. @@ -45,9 +45,9 @@ objectui#7655 left the `ChatbotSchema` member as it was. It is pinned live as a The distinction is recorded rather than smoothed over, because the two provenances are different facts. `ChatbotEnhanced` really does have a `showAvatars` prop, and until -objectui#7708 the `chatbot-floating` registration ended its panel element with a raw +PR #8077 the `chatbot-floating` registration ended its panel element with a raw `{...props}` spread that handed an authored value straight to it — measured live through -the real host. That card was ruled **fence**, not declare, and landed as PR #8077: the +the real host. Its card was ruled **fence**, not declare, and landed as that PR: the spread is filtered through `toDomProps` and moved ahead of every named prop. So the key is dark on all three registrations **by ruling**, and this retirement records that, not an absence. The other five were live on no channel at any time — they are not @@ -65,7 +65,7 @@ declares `messages`, `placeholder`, `onSendMessage`, `disabled`, `showTimestamp` | key | why not enforce | migration | | :-- | :-- | :-- | | `loading` | Chat progress is runtime state the chat runtime owns — the registration derives it from `useObjectChat` as `isLoading`. A static authored boolean would fight the runtime, not configure it | delete the key | -| `showAvatars` | No target on ``. Declaring it on the two faces that DO reach `` would re-open by declaration the channel objectui#7708 closed by fence, one card earlier | delete the key — a `chatbot` node already renders an avatar beside every message | +| `showAvatars` | No target on ``. Declaring it on the two faces that DO reach `` would re-open by declaration the channel `d3499b315` closed by fence, one card earlier | delete the key — a `chatbot` node already renders an avatar beside every message | | `userAvatar` | A second authorable spelling of an image `userAvatarUrl` already carries (AGENTS.md #0.1: one strict contract, not N dialects) | `userAvatarUrl` (+ `userAvatarFallback`) | | `assistantAvatar` | Same | `assistantAvatarUrl` (+ `assistantAvatarFallback`) | | `markdown` | `` prints message content as text and has no markdown path; on the two nodes that render markdown, `enableMarkdown` is the live key | `type: 'chatbot-enhanced'` with `enableMarkdown` | @@ -101,8 +101,8 @@ All six **have** a Zod arm, and that is what decides the route here. `BaseSchema `.passthrough()` on the Zod side and carries a `[key: string]: any` index signature on the TS side, so an UNDECLARED key is not refused — it is KEPT. Deleting the members would hand the authored spelling exactly the silent no-op this card exists to close, on both faces at -once. This package's retire-vs-remove discriminator (objectui#5941 / #7526, amended by -objectui#7678) leaves that structural hazard to the carrier: where there is no mirror there +once. This package's retire-vs-remove discriminator (objectui#5941 / #7526, in its +amended form, `5f8190c8c`) leaves that structural hazard to the carrier: where there is no mirror there is "no silent-strip hazard for prong 2 to guard" (`mobile.ts`). Here there is a mirror to host the refusal, and prong 1 holds by the letter for four of the six. The "deleted" row is pinned live as a control in diff --git a/.changeset/7704-schema-registry-chatbot-keys.md b/.changeset/7704-schema-registry-chatbot-keys.md index aaf1ecec86..bc3c46efd7 100644 --- a/.changeset/7704-schema-registry-chatbot-keys.md +++ b/.changeset/7704-schema-registry-chatbot-keys.md @@ -3,7 +3,7 @@ --- `SchemaRegistry` names all three `plugin-chatbot` registrations, so the published -`ComponentType` union does too (objectui#7704). +`ComponentType` union does too. `packages/plugin-chatbot/src/renderer.tsx` registers three components — `chatbot`, `chatbot-enhanced` and `chatbot-floating` — and `SchemaRegistry` mapped one of them. diff --git a/.changeset/7708-chatbot-floating-spread-fence.md b/.changeset/7708-chatbot-floating-spread-fence.md index 3ad24f5747..2b20afafb5 100644 --- a/.changeset/7708-chatbot-floating-spread-fence.md +++ b/.changeset/7708-chatbot-floating-spread-fence.md @@ -6,7 +6,7 @@ `chatbot-floating` now fences its `` spread the same way its two sibling registrations (`chatbot`, `chatbot-enhanced`) already do — `{...toDomProps(props)}`, at the head of the element, instead of a raw -`{...props}` spread at the end (objectui#7708). This is a deliberate, +`{...props}` spread at the end. This is a deliberate, user-visible behavior change, not a refactor: - **A message sent through a floating chatbot now actually renders.** diff --git a/.changeset/7804-data-table-handler-key-arms.md b/.changeset/7804-data-table-handler-key-arms.md index 5871f41ab1..bd837a4816 100644 --- a/.changeset/7804-data-table-handler-key-arms.md +++ b/.changeset/7804-data-table-handler-key-arms.md @@ -4,7 +4,7 @@ `DataTableSchema` declares the seven handler keys its registered renderer reads: `onAddRecord`, `onBatchSave`, `onCellChange`, `onColumnResize`, `onRowActionDef`, -`onRowClick` and `onRowSave` (objectui#7804, the `DataTableSchema` slice). +`onRowClick` and `onRowSave` (the `DataTableSchema` slice). `BaseSchema` is `.passthrough()`, so a key no arm declares is not refused — it stops being judged and the value is KEPT. All seven were in that state while diff --git a/.changeset/7804-detail-handler-slots-declared.md b/.changeset/7804-detail-handler-slots-declared.md index 0ec5346411..890ead46c5 100644 --- a/.changeset/7804-detail-handler-slots-declared.md +++ b/.changeset/7804-detail-handler-slots-declared.md @@ -2,7 +2,7 @@ '@object-ui/types': minor --- -Declare the two handler keys the `'detail'` renderer reads (objectui#7804, the +Declare the two handler keys the `'detail'` renderer reads (the `plugin-detail` slice; director seat, decision batch #69, 2026-09-07). `DetailSchema` — the zod arm `type: 'detail'` selects — now declares diff --git a/.changeset/7804-list-view-handler-slots-declared.md b/.changeset/7804-list-view-handler-slots-declared.md index 7fdb14c540..28779cfbbd 100644 --- a/.changeset/7804-list-view-handler-slots-declared.md +++ b/.changeset/7804-list-view-handler-slots-declared.md @@ -2,8 +2,8 @@ '@object-ui/types': minor --- -Declare the five handler keys the `'list-view'` renderer reads (objectui#7804, -the `ListViewSchema` slice). +Declare the five handler keys the `'list-view'` renderer reads +(the `ListViewSchema` slice). The zod arm `type: 'list-view'` selects now declares `onAddRecord`, `onBulkAction`, `onDensityChange`, `onNavigate` and `onPageSizeChange` as diff --git a/.changeset/7804-object-kanban-handler-keys-judged.md b/.changeset/7804-object-kanban-handler-keys-judged.md index 14f1b2e869..cf5c7b4a15 100644 --- a/.changeset/7804-object-kanban-handler-keys-judged.md +++ b/.changeset/7804-object-kanban-handler-keys-judged.md @@ -3,7 +3,7 @@ --- `ObjectKanbanSchema` now judges two of the three handler keys the kanban board reads off the -authored document (objectui#7804, the `plugin-kanban` slice; director seat ruling of +authored document (the `plugin-kanban` slice; director seat ruling of 2026-09-07, decision batch #69): `onCardClick` and `onQuickAdd` are declared as objectui#6124 RUNTIME SLOTS — callable on the TypeScript face, refused BY NAME in the zod mirror because JSON has no function value — and the message points at the node-type spelling an author can @@ -40,4 +40,4 @@ that spelling while `KanbanRenderer` still reads the key, printing `declares it a renderer still reads it`. The two spellings that would make the gate green are both worse: `'runtime-slot'` would publish a callable key the object-bound board drops, and deleting the read would narrow `KanbanRenderer`'s published props — a ruling, not a repair. The key keeps -its `KNOWN_UNDECLARED_READS` row naming objectui#7804, which stays open and stays the parent. +its `KNOWN_UNDECLARED_READS` row, which names the parent card. diff --git a/.changeset/7804-objectql-handler-key-arms.md b/.changeset/7804-objectql-handler-key-arms.md index 21f699444c..12438e1cfb 100644 --- a/.changeset/7804-objectql-handler-key-arms.md +++ b/.changeset/7804-objectql-handler-key-arms.md @@ -3,7 +3,7 @@ --- The four plain `objectql.ts` node faces declare the nine handler keys their -registered renderers read (objectui#7804, the `objectql.ts` slice): +registered renderers read (the `objectql.ts` slice): `ObjectFormSchema.onCancel` / `.onError` / `.onOpenChange` / `.onStepChange` / `.onSuccess`, `ObjectGallerySchema.onCardClick` / `.onRowClick`, `ObjectGridSchema.onNavigate` and `ObjectViewSchema.onNavigate`. diff --git a/.changeset/7804-tree-view-handler-slot.md b/.changeset/7804-tree-view-handler-slot.md index 9913f39b00..7de76e26c6 100644 --- a/.changeset/7804-tree-view-handler-slot.md +++ b/.changeset/7804-tree-view-handler-slot.md @@ -2,7 +2,7 @@ '@object-ui/types': minor --- -Declare the one handler key the `'tree-view'` renderer reads (objectui#7804, the +Declare the one handler key the `'tree-view'` renderer reads (the `TreeViewSchema` slice). The zod arm `type: 'tree-view'` selects now declares `onNodeClick` as an diff --git a/.changeset/7874-timeline-relative-defaults-retired.md b/.changeset/7874-timeline-relative-defaults-retired.md index c817d5fbe8..eb7666118f 100644 --- a/.changeset/7874-timeline-relative-defaults-retired.md +++ b/.changeset/7874-timeline-relative-defaults-retired.md @@ -25,5 +25,5 @@ either; and neither `TIMELINE_DEFAULT_TRANSLATIONS` nor `translateTimelineDefaul is re-exported from the package entry, so no consumer of the tarball can name them. Day-granularity relative phrases are produced by `formatRelativeDate` in `@object-ui/core` through `Intl.RelativeTimeFormat`, which needs no copy row — -that is what left these five behind (objectui#7874, found by objectui#7567's +that is what left these five behind (found by objectui#7567's factory-default census printing its abstention count). diff --git a/.changeset/7926-page-node-refuses-actions.md b/.changeset/7926-page-node-refuses-actions.md index b2730dc29b..6ee3d40fcb 100644 --- a/.changeset/7926-page-node-refuses-actions.md +++ b/.changeset/7926-page-node-refuses-actions.md @@ -2,7 +2,7 @@ '@object-ui/types': patch --- -Refuse `actions` by name on the `page` node (objectui#7926, maintainer ruling +Refuse `actions` by name on the `page` node (maintainer ruling 2026-09-09, decision batch #107 item 2 — option A). **Accept-set change, deliberately.** A `page` document carrying `actions` used to diff --git a/.changeset/7967-twin-count-pin-marker-strip.md b/.changeset/7967-twin-count-pin-marker-strip.md index 43b86a483a..e4eca8a324 100644 --- a/.changeset/7967-twin-count-pin-marker-strip.md +++ b/.changeset/7967-twin-count-pin-marker-strip.md @@ -4,7 +4,7 @@ Both objectui#7448 document-count pins now read their workflow header through the same extraction the third copy uses: the leading `#` marker is stripped before the pattern runs, so a count that wraps across two comment lines is no -longer invisible to them (objectui#7967). The pattern itself is unchanged, +longer invisible to them. The pattern itself is unchanged, byte-identical across all three copies. A positive control demonstrating the wrapped-count catch is committed in each pin. Test only; no package is released by this change. diff --git a/.changeset/7979-package-form-dialog-envelope-reader.md b/.changeset/7979-package-form-dialog-envelope-reader.md index 87c38686d3..38baecd818 100644 --- a/.changeset/7979-package-form-dialog-envelope-reader.md +++ b/.changeset/7979-package-form-dialog-envelope-reader.md @@ -2,11 +2,11 @@ '@object-ui/app-shell': patch --- -`PackageFormDialog` reads the producer-marked `error.userMessage` (objectui#7979). +`PackageFormDialog` reads the producer-marked `error.userMessage`. The create / edit / view package dialog POSTs and PATCHes `/api/v1/packages` through its own `apiJson`, which held a fourth copy of the ADR-0112 failure-envelope ladder — -character for character the one `PackagesPage` had before objectui#7959. It read the +character for character the one `PackagesPage` had before `36fc74629`. It read the diagnostic `error.message` and stopped, so two things a refusal carries never reached the author: the producer's marked `error.userMessage` (present since objectstack#9934, emitted by both doors that serve these routes) and `error.code`. diff --git a/.changeset/7980-agent-key-envelope-read.md b/.changeset/7980-agent-key-envelope-read.md index d1b744ae56..376dd1c014 100644 --- a/.changeset/7980-agent-key-envelope-read.md +++ b/.changeset/7980-agent-key-envelope-read.md @@ -4,18 +4,18 @@ --- Publish `readEnvelopeFailureText` from `@object-ui/app-shell`, and read the agent-key -generator's failures through it (objectui#7980, maintainer ruling relayed by the director +generator's failures through it (maintainer ruling relayed by the director seat, decision batch #91 — option B). **New export, no new behaviour.** `readEnvelopeFailureText(payload)` is the single read of the ADR-0112 failure envelope: a producer-marked `error.userMessage` outranks the diagnostic `error.message` at any status, `error.code` is appended to whichever prose won, and a body carrying no prose answers `null` so each caller keeps its own fallback. The -function is unchanged — it has been in this package since objectui#7959 and is pinned by +function is unchanged — it has been in this package since `36fc74629` and is pinned by `utils/apiErrorEnvelope.test.ts`; this only publishes it. It returns `string | null`, so no type accompanies it, and its module imports nothing, so it adds no module side effect. -objectui#7959 kept it off the public entry as **scope restraint** — that card's file +The card behind `36fc74629` kept it off the public entry as **scope restraint** — that card's file surface was `packages/app-shell/**` — not as a ruling that it should stay private. **The console fix this unblocks.** The Integrations page's "Connect an AI agent" section diff --git a/.changeset/8086-chart-series-type-arm.md b/.changeset/8086-chart-series-type-arm.md index 33d4f8d491..2a73361318 100644 --- a/.changeset/8086-chart-series-type-arm.md +++ b/.changeset/8086-chart-series-type-arm.md @@ -6,7 +6,7 @@ per-series family override the `name` arm already declares, with the same member type (objectui#8086). The TypeScript face now states what `ChartDataSeriesSchema` (where `dataKey` and `name` are each independently optional beside `type`) and the renderer -(every entry goes through `normalizeSeries`, objectui#7681) accept. No other arm changes: +(every entry goes through `normalizeSeries`, `01c27c431`) accept. No other arm changes: `chartType` stays on the `dataKey` arm alone, and wins when an entry writes both. The accept set only widens. A value typed as the `dataKey` arm may now carry `type`, and diff --git a/.changeset/8178-ai-schemas-retire-zero-read-members.md b/.changeset/8178-ai-schemas-retire-zero-read-members.md index 1d0a9007b2..94b1d9f2a1 100644 --- a/.changeset/8178-ai-schemas-retire-zero-read-members.md +++ b/.changeset/8178-ai-schemas-retire-zero-read-members.md @@ -56,7 +56,7 @@ check. Deletion would have left precisely the silent no-op this retirement ends, and the ruling's first pin — refused by the schema types, at compile time — would have been unsatisfiable. `packages/plugin-ai/README.md` taught all seven as working, which is prong 2 of the tombstone discriminator (objectui#5941, #7526, -#7678) on its own. +`5f8190c8c`) on its own. `AIInsightsSchema.objectName` was deliberately left out of this retirement, and the reason for that exclusion has since been spent. The half that survives is the diff --git a/.changeset/8194-fields-date-widget-convention.md b/.changeset/8194-fields-date-widget-convention.md index 8fe0942574..196a40957b 100644 --- a/.changeset/8194-fields-date-widget-convention.md +++ b/.changeset/8194-fields-date-widget-convention.md @@ -26,7 +26,7 @@ year and `Jul 4, 2024` for a past year, where it used to render `7/4/2026` and `zh` and `ja` `7月4日` / `2024年7月4日` for `2026/7/4` / `2024/7/4`; in `ar` `4 يوليو` / `4 يوليو 2024`. Each now matches the `date` cell beside it. This is a larger move than the sibling change in `@object-ui/components` -(objectui#7620), whose former face already asked for a short month and so only +(`c15d7eca6`), whose former face already asked for a short month and so only lost its year token — these four passed no bag whatsoever. A value the formatter cannot parse now reads `—` at three of the four sites @@ -39,5 +39,5 @@ home is `formatDateTime`, whose named faces are a separate display-convention question; they are recorded on their own card rather than picked here. A surface that genuinely wants the year on every row is an explicit `format` -style honoured by both paths, not a second option bag — the objectui#7620 / +style honoured by both paths, not a second option bag — the `c15d7eca6` / objectui#7443 / objectui#4576 lesson, one surface over. diff --git a/.changeset/8209-datetime-widget-faces.md b/.changeset/8209-datetime-widget-faces.md index 6466a74684..be8324ed87 100644 --- a/.changeset/8209-datetime-widget-faces.md +++ b/.changeset/8209-datetime-widget-faces.md @@ -33,7 +33,7 @@ local): here so the table stays readable.) **The year is not dropped.** The year-drop is `formatDate`'s date-only cell -rule (objectui#7620); the verbose default face carries the year in every year, +rule (`c15d7eca6`); the verbose default face carries the year in every year, and nothing here extends the drop to `datetime`. **No new authorable key.** The sub-grid selects `'compact'` as a literal rather diff --git a/.changeset/8344-node-recursion-point-redirect.md b/.changeset/8344-node-recursion-point-redirect.md index decd16bd80..4b8e65bd65 100644 --- a/.changeset/8344-node-recursion-point-redirect.md +++ b/.changeset/8344-node-recursion-point-redirect.md @@ -10,7 +10,7 @@ Redirect the node recursion point from `BaseSchemaCore` to `AnyComponentSchema` since retired `body`, leaving `children` and its redeclarations) is `z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)])`, and `SchemaNodeSchema`'s component arm was `BaseSchemaCore` — the ~21 base keys and nothing type-specific. So -per-type enforcement was ROOT-ONLY, for every component type: objectui#7869 measured +per-type enforcement was ROOT-ONLY, for every component type: the finding this card discharges measured an off-spec `size` on a nested `icon` node being ACCEPTED while the same node standing alone was refused. The arm is now the union of the registered component mirrors, so the same node gets the same verdict at every depth. diff --git a/.changeset/8505-grid-columns-breakpoint-narrowing.md b/.changeset/8505-grid-columns-breakpoint-narrowing.md index c418152e6a..f67595fc69 100644 --- a/.changeset/8505-grid-columns-breakpoint-narrowing.md +++ b/.changeset/8505-grid-columns-breakpoint-narrowing.md @@ -19,7 +19,7 @@ said "any string": on this branch's base, `const node: GridSchema = { type: 'grid', columns: { xxl: 6 } }` compiled, passed the zod mirror, emitted no class, and rendered the grid at its `xs` count on every screen with no error and no warning. That is the declared-but-not-read shape -objectui#7097 fixed at the value level, reached through the type surface instead +`3cab5703b` fixed at the value level, reached through the type surface instead of the renderer, and this was its last copy. **No producer was touched, and that is a measurement rather than an absence.** diff --git a/.changeset/8631-approvals-unresolvable-record-reference.md b/.changeset/8631-approvals-unresolvable-record-reference.md index e12b9fe826..32e6ac91b5 100644 --- a/.changeset/8631-approvals-unresolvable-record-reference.md +++ b/.changeset/8631-approvals-unresolvable-record-reference.md @@ -7,7 +7,7 @@ Approvals inbox: a reference that cannot be resolved now renders a neutral "cannot be opened" affordance instead of degrading to the opaque record id (objectui#8631). -objectui#7108 tombstoned the class the platform FLAGS — `status: 'cancelled'` +`1267508ea` tombstoned the class the platform FLAGS — `status: 'cancelled'` plus `cancel_reason: 'record_deleted'`. A terminal (`approved` / `rejected`) approval carries no such flag and never will: the upstream cancel path names `status: 'pending'` in its `where`, deliberately, so history is preserved. Those @@ -20,7 +20,7 @@ resolve AND that carries no snapshot title — the two conditions under which th opaque id was the only thing left on screen. A row whose snapshot kept a business identifier is unchanged: it still shows that identifier with its link suppressed, which is what objectui#5211 ruled. A row the server marked `record_deleted` still -gets objectui#7108's tombstone, which says something stronger because the server +gets the tombstone `1267508ea` added, which says something stronger because the server asserted it. **The copy names no cause, and that is the point.** The platform's read path diff --git a/.changeset/8754-i18n-dead-keys-one-hop-indirect-template-leg.md b/.changeset/8754-i18n-dead-keys-one-hop-indirect-template-leg.md index 78aa4989aa..77aa18065d 100644 --- a/.changeset/8754-i18n-dead-keys-one-hop-indirect-template-leg.md +++ b/.changeset/8754-i18n-dead-keys-one-hop-indirect-template-leg.md @@ -30,7 +30,7 @@ hit that pushes the keys it protects back into NEEDS-REVIEW. **Bounded on purpose.** The leg feeds reachability only; it does not enrol its heads in the call-site gate's dynamic-family registry, so `check:i18n-keys` gains no `undeclared-dynamic-family` finding and its behaviour is unchanged. The two -further sub-shapes objectui#7844 records — a template in a same-module resolver's +further sub-shapes recorded on their own card — a template in a same-module resolver's ARGUMENT, and a template as an ELEMENT of a returned array — stay dark, and are now written into the script's own "What CONFIRMED does NOT guarantee" class 2 rather than left silent. diff --git a/.changeset/8871-page-node-refuses-breadcrumbs.md b/.changeset/8871-page-node-refuses-breadcrumbs.md index d95a02d619..3e901d4943 100644 --- a/.changeset/8871-page-node-refuses-breadcrumbs.md +++ b/.changeset/8871-page-node-refuses-breadcrumbs.md @@ -21,13 +21,13 @@ elsewhere in the file can move. It now fails at parse with the remedy in the mes TypeScript twin is `breadcrumbs?: never`, so `tsc` refuses it at the authoring site before anything runs — both faces narrow together. -**Why ADR-0049 and not a fresh ruling.** objectui#7926 refused `actions` on this same node +**Why ADR-0049 and not a fresh ruling.** `12b599219` refused `actions` on this same node and, by its own comments, ruled on that key ONLY — its ruling is not borrowed here. What reaches this key is the standing enforce-or-remove gate, which this repository applies to this exact face: `packages/types/src/zod/tombstone.zod.ts`'s `retirementTombstone` is documented as the "ADR-0049 RETIREMENT TOMBSTONE" helper and is internal to these zod modules, 63 changesets cite the ADR, and `PageNodeSchema` already carried one of its refusal -arms one member up. objectui#7926 left this key parsing on purpose so that retiring it would +arms one member up. `12b599219` left this key parsing on purpose so that retiring it would be a decision rather than an accident, and wrote a pin saying so; that pin is **flipped**, not deleted. @@ -43,7 +43,7 @@ comments listing UI surfaces (`core/src/utils/record-title.ts`, `layout/src/NavigationRenderer.tsx`), so a bare probe reports five readers that do not exist. Three author sites, all teaching passages in `content/docs/guide/layout.md`, and that count -**corrects objectui#7926's "1 site"**: its census reads every git-tracked JSON file, every +**corrects the `actions` refusal's "1 site"**: its census reads every git-tracked JSON file, every `json` fence in `.md`/`.mdx`, and every TS/TSX object literal via the TypeScript AST (PR #8870), and it undercounted for **two different reasons**. The Schema API block declared `breadcrumbs?: Array<{ label, href }>` outright and its literal does carry `type: 'page'`, but @@ -95,7 +95,7 @@ card's side. Marked `minor`. This card carries `Clause-②: yes`, declared on the dispatch claim, and this changeset's own lead sentence is *"Accept-set change, deliberately"* — the reading AGENTS.md's -版本号策略 gives `minor` for objectui's own breaking changes. objectui#7926's `patch` does not +版本号策略 gives `minor` for objectui's own breaking changes. The `actions` refusal's `patch` does not transfer here: its ruling was **specified** with `Clause-②: no`, a different premise, so citing it for the level would import that ruling's conclusion without its premise. The precedent that literally shares this card's `Clause-②: yes` reading is **objectui#5905**, where diff --git a/.changeset/8875-cross-file-line-citation-census.md b/.changeset/8875-cross-file-line-citation-census.md index c359a0e208..044baf245f 100644 --- a/.changeset/8875-cross-file-line-citation-census.md +++ b/.changeset/8875-cross-file-line-citation-census.md @@ -5,7 +5,7 @@ Internal tooling only — no package changes, so this changeset declares no rele Adds `pnpm census:cross-file-line-citations` (`scripts/cross-file-line-citation-census.mjs`), the tree-wide measurement -objectui#8875 asked for and nothing else. objectui#7853 ruled that an assertion +objectui#8875 asked for and nothing else. The card behind `fa7d66c45` ruled that an assertion is cited by CONTENT, not by line address; objectui#8047 mechanized that ruling for test names only, carving out comments and failure messages because "a human reads them beside the code they annotate". objectui#8875 observes that the diff --git a/.changeset/9342-kanban-oncardmove-prop.md b/.changeset/9342-kanban-oncardmove-prop.md index 34201350e5..efb32f3774 100644 --- a/.changeset/9342-kanban-oncardmove-prop.md +++ b/.changeset/9342-kanban-oncardmove-prop.md @@ -41,11 +41,11 @@ slot keeps the TypeScript twin callable, which would publish a key the object-bound board DROPS — the resolution this package's `quickAdd` carve-out forbids in as many words. The sibling `onCardClick` is a slot because its function reaches the board through a React prop `ObjectKanban` declares; -`onCardMove` has no such prop, and objectui#7804 measured that by driving the +`onCardMove` has no such prop, and `5a41ce733` measured that by driving the handler the board was actually handed, with `onCardClick` as the lit control on the same document and the same render. -⭐ **Why it took a second card.** The disposition did not move — objectui#7804 +⭐ **Why it took a second card.** The disposition did not move — `5a41ce733` already measured `'retired'`. What blocked it was `check:handler-key-reads`, which refuses a tombstone while a renderer still reads the key off the document ("a tombstone exists precisely because nothing reads the key — it has no read diff --git a/.changeset/9447-detail-view-handler-key-refusal.md b/.changeset/9447-detail-view-handler-key-refusal.md index 0d61357341..46e5136cc8 100644 --- a/.changeset/9447-detail-view-handler-key-refusal.md +++ b/.changeset/9447-detail-view-handler-key-refusal.md @@ -6,7 +6,7 @@ Refuse `onNavigate` and `onAddComment` by name on the `detail-view` JSON authori face (objectui#9447). **Breaking, deliberately — and it closes an asymmetry rather than opening one.** -objectui#7804 made the `detail` arm refuse these two keys by name as objectui#6124 +`7ca6ddd4b` made the `detail` arm refuse these two keys by name as objectui#6124 runtime slots. The `detail-view` arm, which reaches the *same* `DetailView` component, declared neither — and `BaseSchemaCore` ends `.passthrough()`, so an authored value was not refused, it stopped being judged and was KEPT. The same two @@ -46,4 +46,4 @@ behaviour as a node type (`{ "type": "toast", ... }`, an `action:button` node). **Not affected:** the nested `recordNavigation.onNavigate`, a different key at a different path with a different signature (`(recordId) => void`), which stays authorable on both faces; and `onTabChange`, whose disposition is still open on -objectui#7804 and which this change deliberately does not touch. +the handler-key parent card and which this change deliberately does not touch. diff --git a/.changeset/9684-discriminator-cited-once.md b/.changeset/9684-discriminator-cited-once.md index 238adb7afc..7addf97cc2 100644 --- a/.changeset/9684-discriminator-cited-once.md +++ b/.changeset/9684-discriminator-cited-once.md @@ -5,7 +5,7 @@ Comment-only change in `@object-ui/types`, plus one new pin test. **Nothing publishes.** The retire-vs-remove discriminator — a `?: never` tombstone is available only on a surviving carrier, and on such a carrier it is used when either prong holds — was written out in full at eight sites across `complex.ts` -and `mobile.ts`, so objectui#7678's amendment had to be applied by hand at every +and `mobile.ts`, so the amendment (`5f8190c8c`) had to be applied by hand at every one of them and a missed site went red nowhere. Two sites still carried the un-amended rule on this branch's base: the diff --git a/.changeset/chart-height-chain-5451.md b/.changeset/chart-height-chain-5451.md index 3ab5836770..70b7bb21a0 100644 --- a/.changeset/chart-height-chain-5451.md +++ b/.changeset/chart-height-chain-5451.md @@ -2,4 +2,4 @@ '@object-ui/plugin-charts': patch --- -`ObjectChart`'s wrapper div now carries `h-full`, keeping the height chain intact from a dashboard grid cell's declared height down to the element Recharts measures. Previously the chain died at the plain auto-height wrapper: `height: 100%` on the chart container computed to `auto`, Recharts measured a permanent zero, and only the `CHART_MIN_HEIGHT` floor (#5503) kept dashboard charts visible — at a fixed floor height instead of filling the cell (#5451). Under auto-height parents `h-full` resolves to `auto`, so non-dashboard hosts are unchanged. +`ObjectChart`'s wrapper div now carries `h-full`, keeping the height chain intact from a dashboard grid cell's declared height down to the element Recharts measures. Previously the chain died at the plain auto-height wrapper: `height: 100%` on the chart container computed to `auto`, Recharts measured a permanent zero, and only the `CHART_MIN_HEIGHT` floor (`6f017e99c`) kept dashboard charts visible — at a fixed floor height instead of filling the cell (#5451). Under auto-height parents `h-full` resolves to `auto`, so non-dashboard hosts are unchanged. diff --git a/.changeset/designer-publish-package-binding.md b/.changeset/designer-publish-package-binding.md index 4bba3134eb..ed31e4c009 100644 --- a/.changeset/designer-publish-package-binding.md +++ b/.changeset/designer-publish-package-binding.md @@ -3,7 +3,7 @@ '@object-ui/app-shell': minor --- -The metadata designer states its package on the publish step, not only on the save (#5420) +The metadata designer states its package on the publish step, not only on the save Studio's designer save→publish loop bound the draft to a software package on the save (`PUT ?mode=draft&package=`) and then sealed it with a publish that named diff --git a/.changeset/handler-key-reads-follow-cast-receivers.md b/.changeset/handler-key-reads-follow-cast-receivers.md index 892e28ba17..0ed7041882 100644 --- a/.changeset/handler-key-reads-follow-cast-receivers.md +++ b/.changeset/handler-key-reads-follow-cast-receivers.md @@ -3,4 +3,4 @@ Internal tooling only — no package source changed, so this changeset declares "no release" rather than requesting one. -`scripts/check-handler-key-read-sites.mjs` now reads a property access through the type-only wrappers that erase at runtime (`as`, `satisfies`, `!`, parentheses), so `(schema as any).onX` is judged exactly as `schema.onX` already was. A cast was never one of the five boundaries that gate declares it does not answer; it was an undeclared hole, and two live `onTabChange` reads sat in it (objectui#9344). Their per-key disposition is not decided here — both are ledgered to objectui#7804, which owns it. +`scripts/check-handler-key-read-sites.mjs` now reads a property access through the type-only wrappers that erase at runtime (`as`, `satisfies`, `!`, parentheses), so `(schema as any).onX` is judged exactly as `schema.onX` already was. A cast was never one of the five boundaries that gate declares it does not answer; it was an undeclared hole, and two live `onTabChange` reads sat in it (objectui#9344). Their per-key disposition is not decided here — both are ledgered to the handler-key parent card, which owns it. diff --git a/.changeset/issue-8875-cite-by-content-convention.md b/.changeset/issue-8875-cite-by-content-convention.md index 2a1265edba..cd40482157 100644 --- a/.changeset/issue-8875-cite-by-content-convention.md +++ b/.changeset/issue-8875-cite-by-content-convention.md @@ -6,7 +6,7 @@ an empty frontmatter rather than a bump. A `patch` here would version-bump the w fixed group for a change no consumer can observe. objectui#8875 clause 1: adds Coding Standard **#11 — cite by CONTENT, not by line address**, the -human-facing convention behind the differential gate that landed in objectui#8974. objectui#7853 +human-facing convention behind the differential gate that landed in objectui#8974. The card behind `fa7d66c45` ruled the class; objectui#8047 mechanized it for test names only, exempting comments and failure messages because "a human reads them beside the code they annotate". #11 records the point that justification is positional: it holds for a same-file citation and does not survive the citation diff --git a/.changeset/referenceto-carryover-8896.md b/.changeset/referenceto-carryover-8896.md index 9d38a7b931..48afdcbe8b 100644 --- a/.changeset/referenceto-carryover-8896.md +++ b/.changeset/referenceto-carryover-8896.md @@ -11,7 +11,7 @@ value, so an object whose lookup or master-detail target survived only under the pre-objectui#6041 spelling lost the target on the way through: - The Field Designer's carried-through half (fields whose stored type the - designer cannot author, objectui#8060) re-emits the stored document verbatim + designer cannot author, `7dc31bb8d`) re-emits the stored document verbatim with no read door in front of it. The strip took the target and the relationship guard then refused the whole object's save — including a save the author triggered by editing an entirely different field, on a page that renders the diff --git a/.changeset/row-predicate-phase2-record-only-5741.md b/.changeset/row-predicate-phase2-record-only-5741.md index c06d8816fd..732008602d 100644 --- a/.changeset/row-predicate-phase2-record-only-5741.md +++ b/.changeset/row-predicate-phase2-record-only-5741.md @@ -53,7 +53,7 @@ No stored-metadata survey, export or migration rewrite was run (the maintainer ruled the stored population out of scope, 「不考虑存量」); the Phase-1 warning period was the notice. -Release note: Phase 1 (PR #5737 — the canon statement plus the warning) shipped +Release note: Phase 1 (`d1ab06f0f` — the canon statement plus the warning) shipped in `@object-ui/core@17.6.0` (npm, 2026-08-24) although its changeset `.changeset/row-predicate-record-canon-5330.md` is still pending on `main`, so the next CHANGELOG section lists Phase 1 and this Phase 2 together: the warning diff --git a/packages/app-shell/src/console/ai/PendingDraftsBar.tsx b/packages/app-shell/src/console/ai/PendingDraftsBar.tsx index cc86bf3902..d0b9d450ba 100644 --- a/packages/app-shell/src/console/ai/PendingDraftsBar.tsx +++ b/packages/app-shell/src/console/ai/PendingDraftsBar.tsx @@ -99,7 +99,7 @@ export function PendingDraftsBar({ packageId, idle }: PendingDraftsBarProps) { // message and the parsed body. Same sentence the bare `fetch` showed // (`parseError` reads it off `error.message`), with the ADR-0112 // producer-marked `userMessage` preferred when the refusal carries - // one — the rule objectui#7959 landed on the sibling call site. + // one — the rule `36fc74629` landed on the sibling call site. const marked = readEnvelopeFailureText((e as { body?: unknown } | null)?.body); const message = marked || diff --git a/packages/app-shell/src/index.ts b/packages/app-shell/src/index.ts index 95c8fe0578..083225e376 100644 --- a/packages/app-shell/src/index.ts +++ b/packages/app-shell/src/index.ts @@ -109,16 +109,16 @@ export { export { HOME_LAUNCHER_PATH, resolveDeclaredHomePath } from './utils/index.js'; export type { DeclaredHomeApp } from './utils/index.js'; -// objectui#7980 — ONE read of the ADR-0112 failure envelope, published so a +// `a810bb2ae` — ONE read of the ADR-0112 failure envelope, published so a // consumer OUTSIDE this package inherits the pinned rule instead of writing a // fourth reading of the same body. `apps/console`'s agent-key generator read // `error.message` and stopped, so a producer-marked `error.userMessage` (the // #9934 channel, which rides through the 5xx prose withhold untouched) and the // declared `error.code` never reached the developer. // -// objectui#7959 left this off the public entry as SCOPE RESTRAINT — that card's -// file surface was `packages/app-shell/**` — not as a ruling that the function -// should stay private; see objectui#7980 comment 5583988475. Exported from its +// The card behind `36fc74629` left this off the public entry as SCOPE RESTRAINT — +// that card's file surface was `packages/app-shell/**` — not as a ruling that the +// function should stay private, as the card behind `a810bb2ae` records. Exported from its // own module rather than through `./utils/index.js`: the rule and its docblock // are the contract, and `apiErrorEnvelope.ts` imports nothing, so this adds no // module side effect and no transitive surface. The return type is `string | diff --git a/packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx b/packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx index 704d433520..37ab907952 100644 --- a/packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx +++ b/packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx @@ -80,8 +80,8 @@ export interface PackageSaveResult { * ⛔ Not a second copy of the shared rule. The rule about what to SHOW stays in * `readEnvelopeFailureText` and is not restated here; this answers a different * question about the same body, at the one call site that asks it. Widening the - * shared reader's signature to return the provenance is objectui#7980's - * surface, not this card's. + * shared reader's signature to return the provenance is the surface of the + * card behind `a810bb2ae`, not this card's. * * The predicate is byte-identical to the shared reader's `marked` const on * purpose: a typed `string` check, not a truthiness one, so a non-string mark diff --git a/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx b/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx index e9720ba0a6..6148cc75c9 100644 --- a/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx +++ b/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx @@ -382,7 +382,7 @@ export function PackageDetailSheet({ 'publish-drafts', async () => { const r = await client.publishPackageDrafts(id).catch((e: unknown) => { - // The ADR-0112 rule objectui#7959 landed on this page: a + // The ADR-0112 rule `36fc74629` landed on this page: a // producer-marked `error.userMessage` outranks the diagnostic // `error.message`. `MetadataClient` raises with the diagnostic and // keeps the body, so the marked sentence is re-read here rather @@ -958,7 +958,7 @@ export function PackagesPage() { ) : error ? (
- {/* A stable handle for the load-failure pins (objectui#7959): the + {/* A stable handle for the load-failure pins (`36fc74629`): the words in here are the server's, so a test that located this banner BY those words could not assert what is absent from it. */} {error} diff --git a/packages/app-shell/src/views/metadata-admin/clientValidation.authorShapeRuling-10150.test.ts b/packages/app-shell/src/views/metadata-admin/clientValidation.authorShapeRuling-10150.test.ts index b872da54a7..43b4209656 100644 --- a/packages/app-shell/src/views/metadata-admin/clientValidation.authorShapeRuling-10150.test.ts +++ b/packages/app-shell/src/views/metadata-admin/clientValidation.authorShapeRuling-10150.test.ts @@ -87,7 +87,7 @@ describe('objectui#10150 — the AUTHOR_SHAPE_ONLY_TYPES header records the obje }); it('cites the ruling and the closed ingress by name, in the header itself', () => { - for (const subject of ['objectui#7612', 'extractDraftBody']) { + for (const subject of ['the 2026-09-20 ruling', 'extractDraftBody']) { expect( HEADER, `the header above AUTHOR_SHAPE_ONLY_TYPES must name ${subject}: the ` + diff --git a/packages/app-shell/src/views/metadata-admin/clientValidation.ts b/packages/app-shell/src/views/metadata-admin/clientValidation.ts index a426c0b118..21c65c03aa 100644 --- a/packages/app-shell/src/views/metadata-admin/clientValidation.ts +++ b/packages/app-shell/src/views/metadata-admin/clientValidation.ts @@ -564,7 +564,7 @@ function expandViewIssues( * draft is waved through; one door has a client gate and the other keeps the * server's. * - * ── The ingress condition was MET, and the answer was still no (objectui#7612) ── + * ── The ingress condition was MET, and the answer was still no (the 2026-09-20 ruling) ── * * This block used to end on a plan: switch the edit gate on once the * `_diagnostics` ingress is closed where the draft is assembled (not here — @@ -578,7 +578,7 @@ function expandViewIssues( * measured it, not as it stands; for the live answer read * `ResourceEditPage.readDecorationStrip.test.tsx`, not this paragraph. * - * The switch was then put to the maintainer on objectui#7612, with the met + * The switch was then put to the maintainer on its own card, with the met * condition measured on that card and a finished implementation beside it * (PR objectui#10054). The maintainer ruled option A on 2026-09-20 (restated on * objectui#10150), verbatim 「7612 只需要服务端校验」 ("7612 needs server-side diff --git a/packages/app-shell/src/views/metadata-admin/predicate.ts b/packages/app-shell/src/views/metadata-admin/predicate.ts index 3a25139d18..a5970c81b4 100644 --- a/packages/app-shell/src/views/metadata-admin/predicate.ts +++ b/packages/app-shell/src/views/metadata-admin/predicate.ts @@ -132,7 +132,7 @@ * A louder option — making the whole predicate throw so the top-level * fail-open in {@link evaluatePredicate} turns it `true`, mirroring * objectstack#6936's unresolved-path ruling — was considered and rejected: - * #6936's `true` verdict corrects a fail-CLOSED bug (a hidden field is worse + * objectstack#6936's `true` verdict corrects a fail-CLOSED bug (a hidden field is worse * than a shown one), but here the existing verdict (`false`, i.e. hidden) is * not a bug — it is the documented behaviour for a set this evaluator cannot * parse, same as `#4049`'s tail returning the right-hand text verbatim diff --git a/packages/components/src/renderers/complex/data-table.tsx b/packages/components/src/renderers/complex/data-table.tsx index c778df5d79..36e315fb28 100644 --- a/packages/components/src/renderers/complex/data-table.tsx +++ b/packages/components/src/renderers/complex/data-table.tsx @@ -813,7 +813,7 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => { // de-DE, so no table cell changes. if (hasTime) return formatDateTime(value, { locale: displayLocale }); // The DATE-only half is `formatDate`'s DEFAULT style — the same one home, - // one type over (objectui#7620, maintainer ruling A). It used to build its + // one type over (`c15d7eca6`, maintainer ruling A). It used to build its // own `Intl.DateTimeFormat` bag here, which asked for `year: 'numeric'` // unconditionally while `formatDate` drops the year INSIDE the current // year on purpose; so one table showed two faces for one value, picked by diff --git a/packages/components/src/renderers/layout/grid.tsx b/packages/components/src/renderers/layout/grid.tsx index 43cefbdfa2..144d9c1c86 100644 --- a/packages/components/src/renderers/layout/grid.tsx +++ b/packages/components/src/renderers/layout/grid.tsx @@ -47,7 +47,7 @@ const GRID_COLS_XL: Record = { // and `BreakpointColumnMap` in `@object-ui/layout`, whose `ResponsiveGrid` already // emits `2xl:grid-cols-*`. This map stopped at `xl`, and so did the read arm below, // so an authored `columns: { '2xl': 6 }` validated, emitted nothing, and rendered at -// the `xs` count on every screen (objectui#7097). +// the `xs` count on every screen (`3cab5703b`). // // The map is not decoration: it is what makes these class names EXIST. Tailwind v4 // finds utilities by scanning source text (`@source '../src/**/*.{ts,tsx}'` in diff --git a/packages/core/src/evaluator/listConditional.ts b/packages/core/src/evaluator/listConditional.ts index 837424151e..cc42dd9d0c 100644 --- a/packages/core/src/evaluator/listConditional.ts +++ b/packages/core/src/evaluator/listConditional.ts @@ -211,7 +211,7 @@ export interface RowPredicateOptions { * objectui#5330, option B; Phase 2 executed by `83fe6e741`). * * Until Phase 2 the row was also bound as bare fields (`status`, the row-action - * shorthand) and as `data.*`, and Phase 1 (PR #5737) warned once per + * shorthand) and as `data.*`, and Phase 1 (`d1ab06f0f`) warned once per * non-canonical spelling. Both bindings and that warning are gone. A bare-field * or `data.*` predicate on a record surface now FAULTS here exactly as it always * did on the server — measured on `@objectstack/formula@17.1.0`, diff --git a/packages/core/src/evaluator/rowPredicateCanon.ts b/packages/core/src/evaluator/rowPredicateCanon.ts index 706d4bd8e5..44c6d43d44 100644 --- a/packages/core/src/evaluator/rowPredicateCanon.ts +++ b/packages/core/src/evaluator/rowPredicateCanon.ts @@ -20,7 +20,7 @@ * renderers all three ways to restore consistency, deliberately without * deciding which of them was CONTRACT). The ruling decided it, in two phases: * - * > **The canon is `record.*`.** Phase 1 (PR #5737) declared it and warned + * > **The canon is `record.*`.** Phase 1 (`d1ab06f0f`) declared it and warned * > once, in dev, on the two other spellings. Phase 2 (`83fe6e741`, ruled * > 2026-09-02 and amended 2026-09-05) retired them: the bare shorthand and * > `data.*` are no longer bound on runtime record surfaces, and the Phase-1 diff --git a/packages/core/src/utils/chart-presentation.ts b/packages/core/src/utils/chart-presentation.ts index 91596a06f6..5db7c302af 100644 --- a/packages/core/src/utils/chart-presentation.ts +++ b/packages/core/src/utils/chart-presentation.ts @@ -180,7 +180,7 @@ function forwardedI18nLabel(v: unknown): I18nLabel | undefined { * chart into a combo, and then draw that series as a bar anyway. * * `ChartRenderer` now narrows the same way for every series it receives, - * `dataKey`-shaped or not (objectui#7681 fixed the fast path that used to + * `dataKey`-shaped or not (`01c27c431` fixed the fast path that used to * forward a `dataKey`-shaped array straight through, so `normalizeChartSchema`'s * own identical narrowing never saw it) — so this module is no longer that * narrowing's only line of defense. It stays anyway: diff --git a/packages/fields/src/widgets/DateField.tsx b/packages/fields/src/widgets/DateField.tsx index 9b35247b88..ea19d110c9 100644 --- a/packages/fields/src/widgets/DateField.tsx +++ b/packages/fields/src/widgets/DateField.tsx @@ -22,13 +22,13 @@ export function DateField({ value, onChange, field, readonly, error, ...props }: if (readonly) { // The readonly face is `formatDate`'s DEFAULT style — the one home for the // `date` display convention (objectui#8194, following the maintainer's - // ruling A on objectui#7620). It used to call `toLocaleDateString(locale)` + // ruling A behind `c15d7eca6`). It used to call `toLocaleDateString(locale)` // with NO options bag, i.e. `Intl`'s numeric default (`7/4/2026`), so it // never implemented the deliberate year-dropping decision `formatDate` // documents — and this widget's readonly face is what `FieldEditWidget` // renders in the grid / detail inline editors, right beside // `DateCellRenderer`'s `Jul 4`. Two faces for one value, picked by which - // path the surface happened to take: #7620's fact pattern verbatim. + // path the surface happened to take: `c15d7eca6`'s fact pattern verbatim. // A field that genuinely wants the year on every row is an explicit // `format` style honoured by both paths, never a second option bag. // diff --git a/packages/fields/src/widgets/DateTimeField.tsx b/packages/fields/src/widgets/DateTimeField.tsx index fd8ae4fec7..d2c430d40e 100644 --- a/packages/fields/src/widgets/DateTimeField.tsx +++ b/packages/fields/src/widgets/DateTimeField.tsx @@ -34,7 +34,7 @@ export function DateTimeField({ value, onChange, field, readonly, error, ...prop // default (`Jul 4, 2026, 07:00 AM` in `en`), which every non-cell caller // already gets; the sub-grid CELL takes `'compact'` (see `GridField`'s // `temporalText`). ⛔ The year is NOT dropped here: that rule is - // `formatDate`'s date-only cell rule (objectui#7620) and the ruling on + // `formatDate`'s date-only cell rule (`c15d7eca6`) and the ruling on // #8209 declines to extend it to `datetime`. // // An unparseable value now reaches `formatDateTime`'s shared empty face diff --git a/packages/fields/src/widgets/FormulaField.tsx b/packages/fields/src/widgets/FormulaField.tsx index 49cdacf930..5a760fb20c 100644 --- a/packages/fields/src/widgets/FormulaField.tsx +++ b/packages/fields/src/widgets/FormulaField.tsx @@ -27,8 +27,8 @@ export function FormulaField({ value, field, ...props }: FieldWidgetComponentPro displayValue = value ? 'Yes' : 'No'; } else if (returnType === 'date') { // `formatDate`'s DEFAULT style — the one home for the `date` display - // convention (objectui#8194, following the maintainer's ruling A on - // objectui#7620). This branch used to call `toLocaleDateString(locale)` + // convention (objectui#8194, following the maintainer's ruling A behind + // `c15d7eca6`). This branch used to call `toLocaleDateString(locale)` // with NO options bag, i.e. `Intl`'s numeric default (`7/4/2026`), so a // formula returning a date rendered a face the shared function never // produces — while the `date` field beside it showed `Jul 4`. Two faces diff --git a/packages/fields/src/widgets/GridField.tsx b/packages/fields/src/widgets/GridField.tsx index feeaaa3ad9..64906ff7ee 100644 --- a/packages/fields/src/widgets/GridField.tsx +++ b/packages/fields/src/widgets/GridField.tsx @@ -459,11 +459,11 @@ function temporalText(type: string | undefined, value: any, locale: string): str const day = toDisplayDate(ymd); if (Number.isNaN(day.getTime())) return raw; // `formatDate`'s DEFAULT style — the one home for the `date` display - // convention (objectui#8194, following the maintainer's ruling A on - // objectui#7620). This branch used to call `toLocaleDateString(locale)` + // convention (objectui#8194, following the maintainer's ruling A behind + // `c15d7eca6`). This branch used to call `toLocaleDateString(locale)` // with NO options bag, i.e. `Intl`'s numeric default (`7/4/2026`), so a // sub-grid cell and a `date` field cell on the same screen rendered the - // same value two ways — the split #7620 ruled on, one surface over. + // same value two ways — the split ruling A settled, one surface over. // Current-year values lose the year here now (`Jul 4`); past- and // future-year values are byte-identical. // diff --git a/packages/fields/src/widgets/lookupColumnDisplay.tsx b/packages/fields/src/widgets/lookupColumnDisplay.tsx index 78718f9efa..a9845d7e4a 100644 --- a/packages/fields/src/widgets/lookupColumnDisplay.tsx +++ b/packages/fields/src/widgets/lookupColumnDisplay.tsx @@ -225,8 +225,8 @@ export function renderLookupColumnValue( if (val.$numberDecimal) return String(Number(val.$numberDecimal)); if (val.$oid) return String(val.$oid); // `formatDate`'s DEFAULT style — the one home for the `date` display - // convention (objectui#8194, following the maintainer's ruling A on - // objectui#7620). This fallback used to call `toLocaleDateString` with NO + // convention (objectui#8194, following the maintainer's ruling A behind + // `c15d7eca6`). This fallback used to call `toLocaleDateString` with NO // options bag, i.e. `Intl`'s numeric default (`7/4/2026`), which made the // split visible INSIDE this one function: a column that HAS a descriptor // goes through `cellRenderer` above -> `DateCellRenderer` -> `formatDate` diff --git a/packages/plugin-charts/src/ChartRenderer.tsx b/packages/plugin-charts/src/ChartRenderer.tsx index 7170c77c48..29bf4a0d88 100644 --- a/packages/plugin-charts/src/ChartRenderer.tsx +++ b/packages/plugin-charts/src/ChartRenderer.tsx @@ -64,7 +64,7 @@ export interface ChartRendererProps { * * Both arms carry the per-series family override `type`, with the same * member type (objectui#8086): the renderer honours it on either shape, - * because every entry goes through `normalizeSeries` (objectui#7681), and + * because every entry goes through `normalizeSeries` (`01c27c431`), and * `ChartDataSeriesSchema` declares `dataKey` and `name` independently * optional beside it — so a `dataKey` entry carrying `type` is what the * contract and the renderer both accept, and this union says so. @@ -152,7 +152,7 @@ export const ChartRenderer: React.FC = ({ schema, onChartCli // to the renderer-internal `chartType`. So an author who writes the // documented `dataKey` binding *and* the documented `type` override // together — both valid on `ChartDataSeriesSchema` independently — got - // NEITHER honoured (objectui#7681). + // NEITHER honoured (`01c27c431`). // // `normalizeSeries` is a no-op on a well-formed internal-shaped entry apart // from `type`: it round-trips every other key the internal arm of @@ -186,7 +186,7 @@ export const ChartRenderer: React.FC = ({ schema, onChartCli // (objectui#2880 S1) -- already consumes it, so `spec.series` above is // populated before the old branch could be reached. That branch was a // SECOND, un-normalized read of a key the normalizer owns: the shape - // objectui#7681 removed for `series`. It was unreachable for every + // `01c27c431` removed for `series`. It was unreachable for every // well-formed chart, and on malformed input it was WORSE than nothing // (`categories: 'revenue'` reached `.map` on a string and threw; a // `categories` whose entries the normalizer rejects produced diff --git a/packages/plugin-chatbot/src/renderer.tsx b/packages/plugin-chatbot/src/renderer.tsx index 1e20b6a3a9..5707a5d860 100644 --- a/packages/plugin-chatbot/src/renderer.tsx +++ b/packages/plugin-chatbot/src/renderer.tsx @@ -437,7 +437,7 @@ ComponentRegistry.register('chatbot-floating', return ( = new Set(DESIGNER_FIELD * * This predicate is what is left of `toDesignerType`, which answered * `DesignerFieldType` for every input by falling back to `'text'` - * (objectui#8060). That fallback was not a display default: `toDesignerField` + * (`7dc31bb8d`). That fallback was not a display default: `toDesignerField` * called it on the READ path, so the collapse happened before the author saw * anything, and `fromDesignerField` emits `type: designed.type`, so the * collapsed value was written back. Relabelling ONE field rewrote every other @@ -144,7 +144,7 @@ const KNOWN_FIELD_TYPES: ReadonlySet = new Set(DESIGNER_FIELD * field as text, and nothing reported it. Restoring the relationship required * knowing what the type used to be, which the stored document no longer said. * - * ## The census — measured, not estimated (objectui#8060 step 1) + * ## The census — measured, not estimated (step 1 of the card behind `7dc31bb8d`) * * `DESIGNER_FIELD_TYPES` has 27 members and every one of them is a declared * `FieldType`, so the designer's vocabulary is a strict SUBSET of the spec's. @@ -172,7 +172,7 @@ function isDesignerAuthorableType(raw: unknown): raw is DesignerFieldType { /** * The relationship target a stored field definition holds, under EITHER - * spelling — objectui#8058. + * spelling — `3f4b45886`. * * `reference` is the spec's key and is read first; the pre-objectui#6041 * `referenceTo` is consulted only when the spec key holds nothing, so a @@ -277,7 +277,7 @@ function toDesignerField(name: string, raw: ServerFieldSchema): DesignerFieldDef * * Two of the four cost nothing on the path through the DESIGNER, and the * `referenceTo` half is true only because the read door was taught to find the - * target under BOTH spellings (objectui#8058). `toDesignerField` reads + * target under BOTH spellings (`3f4b45886`). `toDesignerField` reads * `reference` and falls back to the retired key — see * {@link storedRelationshipTarget} — so whichever spelling the stored document * used, the target reaches the designer model and `fromDesignerField` re-emits @@ -289,7 +289,7 @@ function toDesignerField(name: string, raw: ServerFieldSchema): DesignerFieldDef * stored value is being relied on. * * ⛔ The `referenceTo` claim is conditional on that READ, not on the re-emit - * line alone. Before objectui#8058 this sentence asserted the same conclusion + * line alone. Before `3f4b45886` this sentence asserted the same conclusion * with no fallback behind it, and it was FALSE for exactly one shape: a field * whose target survived ONLY as `referenceTo` read as target-less, so the strip * took the stored value with it and the field reached the wire as a `lookup` @@ -337,11 +337,11 @@ function carryOver(prev?: ServerFieldSchema): ServerFieldSchema { * * ## Why the preserved half needs its own function * - * objectui#8058 made the `referenceTo` strip cost nothing ON THE DESIGNABLE + * `3f4b45886` made the `referenceTo` strip cost nothing ON THE DESIGNABLE * HALF, by teaching the read door to find the target under either spelling: the * value reaches the designer model through {@link storedRelationshipTarget} and * `fromDesignerField` re-emits it as `reference`, so the strip removes a KEY and - * not the relationship. {@link toFieldsMap} re-emits objectui#8060's preserved + * not the relationship. {@link toFieldsMap} re-emits `7dc31bb8d`'s preserved * fields from the stored document directly, with no `toDesignerField` in the * path — so there the strip WAS the last thing to touch the field, the target * left with the key, and {@link assertRelationshipTargetPresent} refused the @@ -388,7 +388,7 @@ interface PreservedField { /** * Split the stored `fields` map into the half this designer authors and the - * half it only carries (objectui#8060). + * half it only carries (`7dc31bb8d`). * * ## The rule, in three cases — it turns on the STORED type, nothing else * @@ -483,7 +483,7 @@ function fromDesignerField( * — the entry existed for parity with the sibling writer while nothing here * could ever hand the guard one, because `toDesignerType` mapped every type * outside `DESIGNER_FIELD_TYPES` to `'text'` on the READ path, so a stored - * master-detail arrived already flattened. objectui#8060 removed that + * master-detail arrived already flattened. `7dc31bb8d` removed that * flattening: a stored type this designer cannot author is now carried through * verbatim (see {@link partitionStoredFields}) and `toFieldsMap` runs this * guard over the carried-through entries as well, so the branch fires on the diff --git a/packages/plugin-detail/src/RelatedList.tsx b/packages/plugin-detail/src/RelatedList.tsx index bdcfff805d..c66e8af70d 100644 --- a/packages/plugin-detail/src/RelatedList.tsx +++ b/packages/plugin-detail/src/RelatedList.tsx @@ -1473,7 +1473,7 @@ export const RelatedList: React.FC = ({ // CRASH. The data-table's no-cell branch is not a pass-through: with no // `cell` it applies TWO transforms — `String(value)` for a non-null // object, and `formatCellValue(value)`, the locale ISO date/datetime face - // objectui#7443 and objectui#7620 spent two cards folding into ONE home — + // objectui#7443 and the card behind `c15d7eca6` spent two cards folding into ONE home — // whereas a `cell`'s return value is handed STRAIGHT to React, with no // way to defer any single value back to that default. Measured on one // untyped column, same row, `tbody` innerHTML byte for byte, no-cell diff --git a/packages/plugin-detail/src/useDetailTranslation.ts b/packages/plugin-detail/src/useDetailTranslation.ts index 61f1678685..6125ef3c4f 100644 --- a/packages/plugin-detail/src/useDetailTranslation.ts +++ b/packages/plugin-detail/src/useDetailTranslation.ts @@ -35,7 +35,7 @@ export const createSafeTranslationHook = createSafeTranslation; */ export const DETAIL_DEFAULT_TRANSLATIONS: Record = { // objectstack#5733 — RecordDetailDrawer's drag-resize handle. The only - // `common.*` key in this map, deliberately: it is the SAME key #5506 gave + // `common.*` key in this map, deliberately: it is the SAME key objectstack#5506 gave // NavigationOverlay's identical handle (`common.resizeDrawer`, already in // all ten packs), and one control should not get two spellings just because // it is rendered from two packages. Adding a `detail.resizeDrawer` twin diff --git a/packages/plugin-grid/src/ObjectGrid.tsx b/packages/plugin-grid/src/ObjectGrid.tsx index f868c204b1..4b244d96b2 100644 --- a/packages/plugin-grid/src/ObjectGrid.tsx +++ b/packages/plugin-grid/src/ObjectGrid.tsx @@ -1820,7 +1820,7 @@ export const ObjectGrid: React.FC = ({ // (`managedBy`), the `userActions.edit`/`delete` override — explicit `false` // opts out of the generic row Edit/Delete (e.g. sys_environment ships a // dedicated Rename + cascade-Delete instead, and the generic entries would - // duplicate them) — and [#3720] the server's effective API operation set, so + // duplicate them) — and [objectstack#3720] the server's effective API operation set, so // the row kebab never offers an update/delete the server would reject. // `operations` above only says whether the CONSUMER wired the affordance; it // is not a permission grant, which is why the object verdict is ANDed here @@ -4484,7 +4484,7 @@ export const ObjectGrid: React.FC = ({ // a bulk-delete affordance is implicitly available (canDelete + onBulkDelete // wired by the consumer). This gives every list a multi-select + delete UX // out of the box without forcing each view JSON to declare bulkActions. - // [#3720] Bulk delete is the most destructive affordance on the list, so it + // [objectstack#3720] Bulk delete is the most destructive affordance on the list, so it // rides the same object-level `delete` verdict as the row kebab (bucket lock // ∧ userActions ∧ the server's effective operation set). An author-declared // `bulkActions: ['delete']` / `bulkActionDefs[].operation === 'delete'` is a diff --git a/packages/plugin-grid/src/rowCrudAffordances.ts b/packages/plugin-grid/src/rowCrudAffordances.ts index 6392448bbd..0162b5f494 100644 --- a/packages/plugin-grid/src/rowCrudAffordances.ts +++ b/packages/plugin-grid/src/rowCrudAffordances.ts @@ -32,7 +32,7 @@ * a `Rename` action and generic delete with a cascade-teardown * `Delete` action, and the generic entries would otherwise render a * confusing duplicate); - * c. [#3720] the SERVER's effective API operation set for the object + * c. [objectstack#3720] the SERVER's effective API operation set for the object * (`/me/permissions` `apiOperations`, #3391) — `edit` is ANDed with * `update` and `delete` with `delete`, so a row never offers a * mutation the server would reject. @@ -180,7 +180,7 @@ export function resolveRowCrudAffordances(opts: { /** The object's `userActions` block ({ create, edit, delete, import }). */ userActions?: { edit?: RowCrudUserAction; delete?: RowCrudUserAction } | null; /** - * [#3720] The server-resolved effective API operation set for this object + * [objectstack#3720] The server-resolved effective API operation set for this object * (`/me/permissions` `apiOperations`, #3391). `undefined` / `null` (old * backend, unrestricted object, no provider) leaves the object verdict * untouched; an empty array means "expose nothing" → both entries hidden. diff --git a/packages/plugin-list/src/ListView.tsx b/packages/plugin-list/src/ListView.tsx index 76833a87ff..dc33b1036f 100644 --- a/packages/plugin-list/src/ListView.tsx +++ b/packages/plugin-list/src/ListView.tsx @@ -1631,7 +1631,7 @@ export const ListView = React.forwardRef(({ schema.operations?.export !== false && (effectiveApiOps ? effectiveApiOps.includes('export') : true); - // [#3720] Bulk-action gate for the NON-grid views (kanban / calendar / + // [objectstack#3720] Bulk-action gate for the NON-grid views (kanban / calendar / // gallery / …), whose bulk bar this component renders itself — the grid path // delegates to ObjectGrid, which gates its own. A declared `bulkActions` // entry is a WIRING declaration, not a permission grant, so the built-in @@ -4017,7 +4017,7 @@ export const ListView = React.forwardRef(({ * ⛔ NO legacy `title` arm. This read used to be * `schema.label || (schema as any).title`, and objectui#8653 item 1 * retired the second operand — the objectui#7129 route, as taken for - * `DashboardComponentSchema.title` at objectui#7623 — on two + * `DashboardComponentSchema.title` at `5d0876c5c` — on two * measurements: * * - `@objectstack/spec/ui`'s `ListViewSchema` REFUSES `title` BY NAME diff --git a/packages/plugin-markdown/src/toc.ts b/packages/plugin-markdown/src/toc.ts index eaf57fb8f4..ebb3b46c29 100644 --- a/packages/plugin-markdown/src/toc.ts +++ b/packages/plugin-markdown/src/toc.ts @@ -41,7 +41,7 @@ const SENTINEL_RE = /[\uE000\uE001]/g * and keeps the underscores, so `### NON_GRID_ROW_CEILING` is slugged * `non_grid_row_ceiling`; the shared rule paired the first two underscores and * ate `GRID`, then resumed and ate `ROW`, yielding `nongridrow_ceiling` — a - * `#id` naming an anchor the page does not carry (objectui#7667). + * `#id` naming an anchor the page does not carry (`a472b0716`). * * Specialised to `_`, CommonMark's can-open / can-close conditions each reduce * to one boundary test on either side of the whole RUN: @@ -76,7 +76,7 @@ const UNDERSCORE_EMPHASIS_RE = * code-span text therefore delete characters the anchor is built from — the * raw-HTML rule ate `` out of `` `objectui generate ` `` and * the emphasis rules ate the underscores out of `` `a_b_c` `` — so the TOC's - * `#id` named a heading anchor that does not exist (objectui#7658). + * `#id` named a heading anchor that does not exist (`90c6d090d`). * * The raw-HTML rule itself stays: `remark-rehype` runs without * `allowDangerousHtml`, so it drops raw html nodes and keeps the text they diff --git a/packages/plugin-timeline/src/useTimelineTranslation.ts b/packages/plugin-timeline/src/useTimelineTranslation.ts index 77b485bf4b..4d25310c6c 100644 --- a/packages/plugin-timeline/src/useTimelineTranslation.ts +++ b/packages/plugin-timeline/src/useTimelineTranslation.ts @@ -23,7 +23,7 @@ export const TIMELINE_DEFAULT_TRANSLATIONS: Record = { 'timeline.bucket.later': 'Later', 'timeline.bucket.noDate': 'No date', 'timeline.bucket.unassigned': 'Unassigned', - // objectui#7874 — the five `timeline.relative.*` rows are retired as residue. + // `d9580f464` — the five `timeline.relative.*` rows are retired as residue. // They had no `en` leaf and no call site anywhere in the tree, so `fallbackT` // could never be asked for one: they rendered for nobody. Day-granularity // relative phrases are produced by `formatRelativeDate` (`@object-ui/core`) diff --git a/packages/react/src/hooks/useExpression.ts b/packages/react/src/hooks/useExpression.ts index 1b6778feb5..2ad634e106 100644 --- a/packages/react/src/hooks/useExpression.ts +++ b/packages/react/src/hooks/useExpression.ts @@ -100,7 +100,7 @@ export { toPredicateInput } from '@object-ui/core'; * * Until Phase 2 this bag also carried the row spread flat (bare `status`, the * row-action shorthand) and as `data` (legacy), and `useCondition` below warned - * once per non-canonical spelling (Phase 1, PR #5737). Both bindings and the + * once per non-canonical spelling (Phase 1, `d1ab06f0f`). Both bindings and the * warning are gone. A bare-field or `data.*` predicate against this bag now * faults exactly as it always did on the server (`buildScope({ record })` * mounts exactly `['record']`: `Unknown variable: status` / `Unknown variable: diff --git a/packages/test-support/src/defaults-table-scan.ts b/packages/test-support/src/defaults-table-scan.ts index b582058b2f..8983bca37a 100644 --- a/packages/test-support/src/defaults-table-scan.ts +++ b/packages/test-support/src/defaults-table-scan.ts @@ -23,11 +23,11 @@ * * The second one used to read a HAND-WRITTEN list of three imported maps, so it * judged 400 of 1056 rows (37.9%) and could not see the five dead - * `timeline.relative.*` rows of objectui#7874 at all (retired in #7887). The fix is not a second + * `timeline.relative.*` rows at all (retired in #7887). The fix is not a second * traversal — two traversals are two definitions of the population that drift - * apart, which is the disease objectui#7448 / #7528 / #7548 / #7825 / #7853 all - * record. So the walk objectui#3512 already had moved HERE, unchanged, and both - * gates now discover the same tables from the same code. + * apart, which is the disease objectui#7448 / #7528 / #7548 / #7825 and the card + * behind `fa7d66c45` all record. So the walk objectui#3512 already had moved HERE, + * unchanged, and both gates now discover the same tables from the same code. * * ## Why an import-based list can never be completed by hand * @@ -120,7 +120,7 @@ export interface HandRolledTable { * pins. That deliberate double-listing is why a caller must de-duplicate on * `where` + `key` before reporting counts: its 21 rows are discovered twice. * - * ## Why the DATA lives in `hand-rolled-tables.json` (objectui#7877) + * ## Why the DATA lives in `hand-rolled-tables.json` (`7dcda9cd4`) * * A second reader arrived that is not TypeScript: * `scripts/check-i18n-call-site-keys.mjs` widened its `createSafeTranslation` diff --git a/packages/types/src/__tests__/chatbot-dark-keys-retired-7703.test.ts b/packages/types/src/__tests__/chatbot-dark-keys-retired-7703.test.ts index f79178b447..672f1d0c68 100644 --- a/packages/types/src/__tests__/chatbot-dark-keys-retired-7703.test.ts +++ b/packages/types/src/__tests__/chatbot-dark-keys-retired-7703.test.ts @@ -102,7 +102,7 @@ const RETIRED = { loading: { values: [true, false] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — never read: chat progress is runtime state the chat runtime owns ' + 'RETIRED (ADR-0049) — never read: chat progress is runtime state the chat runtime owns ' + '(the registration derives it from `useObjectChat` as `isLoading`), and `` declares no `loading` ' + 'prop for an authored value to land on. There is no authored spelling that sets it; delete the key.', prescriptive: 'There is no authored spelling that sets it; delete the key.', @@ -110,17 +110,17 @@ const RETIRED = { showAvatars: { values: [true, false] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — no registration reads or forwards this key by name, and a `chatbot` ' + 'RETIRED (ADR-0049) — no registration reads or forwards this key by name, and a `chatbot` ' + 'node renders ``, which has no `showAvatars` prop; the one channel that did deliver it — the ' - + "`chatbot-floating` registration's unfiltered props spread — was fenced by objectui#7708. Delete the key: " + + "`chatbot-floating` registration's unfiltered props spread — was fenced. Delete the key: " + 'a `chatbot` node already renders an avatar beside every message, and the images are `userAvatarUrl` / ' + '`assistantAvatarUrl` with their `userAvatarFallback` / `assistantAvatarFallback` siblings.', - prescriptive: 'was fenced by objectui#7708', + prescriptive: 'was fenced.', }, userAvatar: { values: ['https://example.com/me.png', ''] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — never read: this spelling has zero hits anywhere in ' + 'RETIRED (ADR-0049) — never read: this spelling has zero hits anywhere in ' + '`packages/plugin-chatbot`. Write `userAvatarUrl` instead (with `userAvatarFallback` for the text shown ' + 'while the image loads or fails), the key all three chatbot registrations read.', prescriptive: 'Write `userAvatarUrl` instead', @@ -128,7 +128,7 @@ const RETIRED = { assistantAvatar: { values: ['https://example.com/bot.png', ''] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — never read: this spelling has zero hits anywhere in ' + 'RETIRED (ADR-0049) — never read: this spelling has zero hits anywhere in ' + '`packages/plugin-chatbot`. Write `assistantAvatarUrl` instead (with `assistantAvatarFallback` for the ' + 'text shown while the image loads or fails), the key all three chatbot registrations read.', prescriptive: 'Write `assistantAvatarUrl` instead', @@ -136,7 +136,7 @@ const RETIRED = { markdown: { values: [true, false] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — never read: a `chatbot` node renders ``, which prints message ' + 'RETIRED (ADR-0049) — never read: a `chatbot` node renders ``, which prints message ' + 'content as text and has no markdown path for this switch to reach. Author `type: "chatbot-enhanced"` ' + '(or `"chatbot-floating"`) with `enableMarkdown` instead — markdown is those nodes\' capability, and ' + '`enableMarkdown` is the key their registrations read.', @@ -147,7 +147,7 @@ const RETIRED = { // left the numeric one riding `.passthrough()` exactly like the string one. values: ['400px', 400] as const, guidance: - 'RETIRED (objectui#7703, ADR-0049) — never read: `` has no `height` prop. Write `maxHeight` ' + 'RETIRED (ADR-0049) — never read: `` has no `height` prop. Write `maxHeight` ' + 'instead (a CSS length string, default "500px"), the key the `chatbot` and `chatbot-enhanced` ' + 'registrations forward; size a `chatbot-floating` panel with `floatingConfig.panelHeight`, a number of ' + 'pixels, which is what that panel reads.', @@ -232,7 +232,7 @@ describe.each(RETIRED_KEYS)( Object.keys(shapeOf(ChatbotZod)), `${key} left the mirror — under .passthrough() the retired key becomes a SILENT no-op again`, ).toContain(key); - expect(describeOf(ChatbotZod, key)).toContain('RETIRED (objectui#7703'); + expect(describeOf(ChatbotZod, key)).toContain('RETIRED (ADR-0049) —'); }); it('does NOT appear on the two sibling twins — the retirement declares nothing new', () => { diff --git a/packages/types/src/ai.ts b/packages/types/src/ai.ts index 2f814d3076..6228904dec 100644 --- a/packages/types/src/ai.ts +++ b/packages/types/src/ai.ts @@ -105,7 +105,7 @@ export interface AIFormAssistSchema extends BaseSchema { * instrument's control. * * A tombstone rather than a plain removal on PRONG 2 of the discriminator - * (objectui#5941, #7526, #7678): this package's README taught the key as + * (objectui#5941, #7526, `5f8190c8c`): this package's README taught the key as * working, in the Quick Start, in the `AIFormAssist` API example and in the * schema-driven JSON example. {@link BaseSchema} carries `[key: string]: any`, * so a DELETED member is absorbed silently at ANY value — deletion here is not diff --git a/packages/types/src/complex.ts b/packages/types/src/complex.ts index b459d27008..3095612821 100644 --- a/packages/types/src/complex.ts +++ b/packages/types/src/complex.ts @@ -174,7 +174,7 @@ export interface KanbanColumn { * * A tombstone rather than a plain removal on BOTH prongs of the * discriminator the precedent changesets state (objectui#5941, #7526), in - * the form objectui#7678 amended it to: a `?: never` tombstone is available + * its amended form (`5f8190c8c`): a `?: never` tombstone is available * only on a SURVIVING CARRIER — `KanbanColumn` survives this retirement, * while a whole exported type name has no carrier and is removed outright — * and on such a carrier it is used when either prong holds: (1) it steers @@ -1146,7 +1146,7 @@ type ChatMessageHandedBack = Omit & { * `ComponentRegistry.register('chatbot', ...)` registration in * `packages/plugin-chatbot/src/renderer.tsx` (objectui#7655). * - * ## Six ADR-0049 retirement tombstones (objectui#7703) + * ## Six ADR-0049 retirement tombstones (`a4611b3e2`) * * `loading`, `showAvatars`, `userAvatar`, `assistantAvatar`, `markdown` and * `height` are `?: never` below, each paired with a `retirementTombstone()` @@ -1167,7 +1167,7 @@ type ChatMessageHandedBack = Omit & { * `chatbot-floating` registration used to end its `` element * with a raw `{...props}` spread, which handed the panel's `` * every authored key unfiltered — and that component HAS a `showAvatars` prop, - * so the key was live there by accident. objectui#7708 ruled FENCE: the spread + * so the key was live there by accident. The card behind `d3499b315` ruled FENCE: the spread * is filtered through `toDomProps` and moved to the head of the element, the * shape the two sibling registrations already used. ⇒ `showAvatars` is a key * the FENCE turned dark, not a key nothing ever read; the other five were live @@ -1188,7 +1188,7 @@ type ChatMessageHandedBack = Omit & { * UNDECLARED key is not refused, it is KEPT. That is the hazard the two-prong * discriminator leaves to the carrier — where there is no mirror there is "no * silent-strip hazard for prong 2 to guard" (`mobile.ts`, objectui#5941 / - * #7526 / #7678: a `?: never` tombstone is available only on a SURVIVING + * #7526 / `5f8190c8c`: a `?: never` tombstone is available only on a SURVIVING * CARRIER — `ChatbotSchema` survives, while a whole exported type name has no * carrier and is removed outright — and on such a carrier it is used when * either prong holds: it steers authors to a named live replacement KEY, or it @@ -1225,7 +1225,7 @@ export interface ChatbotSchema extends BaseSchema { */ placeholder?: string; /** - * ADR-0049 RETIREMENT TOMBSTONE — `loading` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `loading` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * Chat progress is RUNTIME state, not authorable metadata. The `chatbot` @@ -1255,14 +1255,14 @@ export interface ChatbotSchema extends BaseSchema { */ onSendMessage?: never; /** - * ADR-0049 RETIREMENT TOMBSTONE — `showAvatars` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `showAvatars` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * ⭐ The one key of the six whose provenance is a FENCE, not an absence. * `` really does have a `showAvatars` prop, and until - * objectui#7708 the `chatbot-floating` registration's raw trailing + * `d3499b315` the `chatbot-floating` registration's raw trailing * `{...props}` spread delivered an authored value straight to it — measured - * live through the real host. That ruling was FENCE: the spread now goes + * live through the real host. The ruling behind it was FENCE: the spread now goes * through `toDomProps` at the head of the element, so the key is dark on all * three registrations by ruling. It was never live on a `chatbot` node: no * registration forwards it by name, and this one renders ``, which @@ -1270,7 +1270,7 @@ export interface ChatbotSchema extends BaseSchema { * * ENFORCE was refused: on a `chatbot` node it has no target to forward to, * and re-declaring it on the two faces that CAN reach `` - * would re-open by declaration exactly the channel objectui#7708 closed by + * would re-open by declaration exactly the channel `d3499b315` closed by * fence, one card earlier. `@default true` was published prose only — the * plain `` renders an avatar beside every message unconditionally, * with no gate, and ``'s own prop defaults to `false`. @@ -1280,11 +1280,11 @@ export interface ChatbotSchema extends BaseSchema { * registrations read; delete this one. * * @deprecated Not part of this contract — the value was inert on a `chatbot` - * node and is dark everywhere since objectui#7708. + * node and is dark everywhere since `d3499b315`. */ showAvatars?: never; /** - * ADR-0049 RETIREMENT TOMBSTONE — `userAvatar` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `userAvatar` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * Write **`userAvatarUrl`** (with `userAvatarFallback` for the text shown @@ -1301,7 +1301,7 @@ export interface ChatbotSchema extends BaseSchema { */ userAvatar?: never; /** - * ADR-0049 RETIREMENT TOMBSTONE — `assistantAvatar` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `assistantAvatar` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * Write **`assistantAvatarUrl`** (with `assistantAvatarFallback`) — the live @@ -1317,7 +1317,7 @@ export interface ChatbotSchema extends BaseSchema { */ assistantAvatar?: never; /** - * ADR-0049 RETIREMENT TOMBSTONE — `markdown` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `markdown` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * The `chatbot` node renders ``, which has no markdown path at all: @@ -1342,7 +1342,7 @@ export interface ChatbotSchema extends BaseSchema { */ processVisibility?: 'hidden' | 'summary' | 'debug'; /** - * ADR-0049 RETIREMENT TOMBSTONE — `height` (objectui#7703). See + * ADR-0049 RETIREMENT TOMBSTONE — `height` (`a4611b3e2`). See * {@link ChatbotSchema} for the census, the instrument and the route. * * Write **`maxHeight`** (a CSS length string, default `'500px'`) — the live @@ -1674,7 +1674,7 @@ export interface ChatbotSchema extends BaseSchema { * bodies of `packages/plugin-chatbot/src/renderer.tsx`, forwarded into * `useObjectChat` or onto the rendered component. (Named reads are the * instrument; the `chatbot-floating` registration also HAD an unfiltered - * props spread on this census's base — fenced since, objectui#7708; see + * props spread on this census's base — fenced since, `d3499b315`; see * {@link ChatbotFloatingSchema}.) The instrument was lit by * keys that are NOT shared — `processVisibility` read 0 / 1 / 0 across * `chatbot` / `chatbot-enhanced` / `chatbot-floating` and `floatingConfig` @@ -1845,7 +1845,7 @@ export interface ChatbotEnhancedSchema * ended its `` element with a raw `{...props}` spread — * every authored key `SchemaRenderer` forwards, unfiltered — and the panel * is a ``, so an authored `processVisibility`, `surface` or - * `showAvatars` reached it (measured through the real host, objectui#7708). + * `showAvatars` reached it (measured through the real host, `d3499b315`). * That channel was accidental, not contract, and is now CLOSED: the spread * is fenced through `toDomProps` and moved to the head of the element, the * same shape the two sibling registrations already use, so this face's @@ -2021,7 +2021,7 @@ export interface FloatingChatbotConfig { * equally to objectui#4919 and #5942, which were removed outright, so it * cannot be what separates the routes. What decides the route is this * package's retire-vs-remove discriminator in its amended form - * (objectui#7678, the same wording the `chatbot` tombstones above carry): a + * (`5f8190c8c`, the same wording the `chatbot` tombstones above carry): a * `?: never` tombstone is available only on a SURVIVING CARRIER — * `FloatingChatbotConfig` survives this retirement, while a whole exported * type name has no carrier and is removed outright — and on such a carrier @@ -2302,10 +2302,10 @@ export interface DashboardWidgetSlotComponentSchema extends BaseSchema { */ export interface DashboardComponentSchema extends BaseSchema, Omit { type: 'dashboard'; - // `title` was DECLARED here until objectui#7623, under the comment "Dashboard + // `title` was DECLARED here until `5d0876c5c`, under the comment "Dashboard // title displayed in the header" — by then a description of behaviour that had // stopped existing: objectui#7509 retired all five dashboard-root `title` read - // arms under ADR-0049 (PR #7622), so the key was declared, documented as + // arms under ADR-0049 (`1cca678ba`), so the key was declared, documented as // rendering, and inert. The header text is the spec-canonical `label` // (`BaseSchema`), resolved through `pickLocalized`; `plugin-dashboard` has no // dashboard-root `title` read site left (pinned by that package's diff --git a/packages/types/src/crud.ts b/packages/types/src/crud.ts index 9fafc277ea..e8c11d9c76 100644 --- a/packages/types/src/crud.ts +++ b/packages/types/src/crud.ts @@ -323,7 +323,7 @@ export interface DetailSchema extends BaseSchema { */ onBack?: () => void; /** - * SPA navigation callback — RUNTIME SLOT (objectui#7804, the objectui#6124 + * SPA navigation callback — RUNTIME SLOT (`7ca6ddd4b`, the objectui#6124 * shape): a host-supplied function, NOT authorable metadata. `'detail'` is * registered to `DetailView` RAW, so an authored value reaches * `schema.onNavigate` by identity and `handleBack` / `handleEdit` / the @@ -340,7 +340,7 @@ export interface DetailSchema extends BaseSchema { */ onNavigate?: (url: string, options?: { replace?: boolean; newTab?: boolean }) => void; /** - * New comment callback — RUNTIME SLOT (objectui#7804), reaching the renderer + * New comment callback — RUNTIME SLOT (`7ca6ddd4b`), reaching the renderer * on a DIFFERENT channel from {@link DetailSchema.onNavigate}: `DetailView` * does not call it, it forwards it as a prop into ``, whose * submit handler awaits it. Measured per key rather than per prefix, as the diff --git a/packages/types/src/data-display.ts b/packages/types/src/data-display.ts index 49b29d28d2..9ec067d8b0 100644 --- a/packages/types/src/data-display.ts +++ b/packages/types/src/data-display.ts @@ -1325,7 +1325,7 @@ export interface DataTableSchema extends BaseSchema { * Handler invoked when one of {@link rowActionDefs} is chosen from the row * overflow menu. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1428,7 +1428,7 @@ export interface DataTableSchema extends BaseSchema { * Cell value change handler * Called when a cell value is edited * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1441,7 +1441,7 @@ export interface DataTableSchema extends BaseSchema { * Row save handler * Called when saving changes for a single row * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1455,7 +1455,7 @@ export interface DataTableSchema extends BaseSchema { * Batch save handler * Called when saving changes for multiple rows * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1468,7 +1468,7 @@ export interface DataTableSchema extends BaseSchema { * Row click handler * Called when a row is clicked * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1561,7 +1561,7 @@ export interface DataTableSchema extends BaseSchema { /** * Callback when the "+ Add record" row is clicked * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1575,7 +1575,7 @@ export interface DataTableSchema extends BaseSchema { * Column resize handler * Called when a column is resized * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `75fca9669`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is called by `renderers/complex/data-table.tsx` @@ -1875,7 +1875,7 @@ export interface TreeViewSchema extends BaseSchema { * {@link TreeNode}. The handler's return value is discarded. * * ⚠️ THE MIRROR NOW DECLARES IT — as a NAMED REFUSAL, not as a shape - * (objectui#7804, the `TreeViewSchema` slice; `handlerKeyRefusal(…, + * (`604476d97`, the `TreeViewSchema` slice; `handlerKeyRefusal(…, * 'runtime-slot', …)` in `../zod/data-display.zod.ts`). ⛔ This paragraph * used to say the key was "NOT mirrored, deliberately", citing * objectui#6152's ruling that a runtime slot never gets a mirror. That @@ -2069,7 +2069,7 @@ export interface ChartDataSeries { * fixtures and designer inputs: 0, controls lit). It is NOT a member here, * so the published face does not fossilise a renderer-side tolerance into a * second contract (AGENTS.md #0.1); the normalizer's own tolerance is - * objectui#7682's decision and is unchanged by this. Any other value is + * a separate card's decision and is unchanged by this. Any other value is * dropped in silence by the normalizer, so the mirror refuses it by name * instead (objectui#7546). */ @@ -2133,7 +2133,7 @@ export interface ChartDataSeries { /** * NOT A KEY OF THIS SERIES — a named ALIAS REFUSAL pointing at {@link type} * (objectui#7694; `domain:ui` PM ruling on objectui#7546 and the contract - * review of PR #7684: option A, the posture `@objectstack/spec` takes). + * review of `8fe8e5c16`'s pull request: option A, the posture `@objectstack/spec` takes). * * `chartType` is the renderer's INTERNAL spelling of the declared `type`: the * first limb of `normalizeSeries`' `str(raw.chartType) ?? str(raw.type)` diff --git a/packages/types/src/internal/retired-field-keys.ts b/packages/types/src/internal/retired-field-keys.ts index 98ed9c8b51..16870a2354 100644 --- a/packages/types/src/internal/retired-field-keys.ts +++ b/packages/types/src/internal/retired-field-keys.ts @@ -146,7 +146,7 @@ export const RETIRED_FIELD_KEY_TOMBSTONES = [ * ever true where a READ DOOR had already lifted the target out of the * stored document — `fromDesignerField` re-emitting the designer's target * under `reference`. The two sites with no read door in front of them - * (`metadataFieldsPageCarryOver`'s objectui#8060 preserved branch, which + * (`metadataFieldsPageCarryOver`'s `7dc31bb8d` preserved branch, which * re-emits a stored document verbatim, and `metadataAdminFieldsReadDoor`, * which IS the read) deleted the only copy of the target, and * objectui#7714's guard then refused the whole object's save from a page @@ -161,7 +161,7 @@ export const RETIRED_FIELD_KEY_TOMBSTONES = [ * how this entry went wrong the first time: * * - `metadataFieldsPageCarryOver` — nothing is lost. Its designable branch - * reads through `storedRelationshipTarget` (objectui#8058) and its + * reads through `storedRelationshipTarget` (`3f4b45886`) and its * preserved branch through `carryPreservedField` (objectui#8896); both * re-emit under `reference`. * - `metadataAdminFieldsReadDoor` — nothing is lost. The door keeps the diff --git a/packages/types/src/layout.ts b/packages/types/src/layout.ts index 502da1ea87..e8af996ad1 100644 --- a/packages/types/src/layout.ts +++ b/packages/types/src/layout.ts @@ -1368,7 +1368,7 @@ export interface PageNodeSchema extends BaseSchema, Omit = T | Partial>; // Removed outright rather than tombstoned, measured against this package's // retire-vs-remove discriminator — cited, not restated (see this file's // `RETIRE-VS-REMOVE DISCRIMINATOR` preamble; the rule is stated on -// `ChatbotSchema` in `complex.ts`, in the form objectui#7678 amended it to, +// `ChatbotSchema` in `complex.ts`, in its amended form (`5f8190c8c`), // from the precedent changesets objectui#5941 / #7526). // `MobileResponsiveConfig` is a whole exported type name, so it has no // carrier to host a `?: never` member at all and the surviving-carrier @@ -222,8 +222,8 @@ export type ResponsiveValue = T | Partial>; // three values were three spellings of the same no-op. Removal rather than a // `?: never` tombstone follows this package's retire-vs-remove discriminator // — cited, not restated (see this file's `RETIRE-VS-REMOVE DISCRIMINATOR` -// preamble; the rule is stated on `ChatbotSchema` in `complex.ts`, in the -// form objectui#7678 amended it to). +// preamble; the rule is stated on `ChatbotSchema` in `complex.ts`, in its +// amended form, `5f8190c8c`). // // Neither branch reaches this retirement. The surviving-carrier precondition // settles it first: an exported type name that goes whole has no carrier to @@ -396,8 +396,8 @@ export type GestureType ='tap' | 'double-tap' | 'long-press' | 'swipe-left' | 's // `action` was a string nothing dispatched. // // Removed outright rather than tombstoned, measured against the discriminator -// the precedent changesets state (objectui#5941, #7526), in the form -// objectui#7678 amended it to — cited, not restated (see this file's +// the precedent changesets state (objectui#5941, #7526), in its amended +// form (`5f8190c8c`) — cited, not restated (see this file's // `RETIRE-VS-REMOVE DISCRIMINATOR` preamble; the rule is stated on // `ChatbotSchema` in `complex.ts`). `GestureConfig` is a whole exported type // name, so it has no carrier to host a `?: never` member at all and the diff --git a/packages/types/src/objectql.ts b/packages/types/src/objectql.ts index 1112f8f645..62a542ad89 100644 --- a/packages/types/src/objectql.ts +++ b/packages/types/src/objectql.ts @@ -1111,7 +1111,7 @@ export interface ObjectGridSchema extends BaseSchema { * (`plugin-grid/src/ObjectGrid.tsx`) carries the same statement, and both are * pinned by `plugin-grid/src/__tests__/gridNonAuthorKeys.test.tsx`. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — the zod twin now + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — the zod twin now * refuses this key BY NAME instead of letting `BaseSchema.passthrough()` * accept and KEEP an authored value that reaches `useNavigationOverlay` and * is CALLED. That closes the gap the ruling above left open on this face: @@ -1522,7 +1522,7 @@ export interface ObjectFormSchema extends BaseSchema { /** * Called when wizard step changes. Only used when formType is 'wizard'. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -1637,7 +1637,7 @@ export interface ObjectFormSchema extends BaseSchema { /** * Callback on successful submission * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -1695,7 +1695,7 @@ export interface ObjectFormSchema extends BaseSchema { /** * Callback on error * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -1708,7 +1708,7 @@ export interface ObjectFormSchema extends BaseSchema { /** * Callback on cancel * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -1761,7 +1761,7 @@ export interface ObjectFormSchema extends BaseSchema { /** * Callback when open state changes. Only used when formType is 'drawer'. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -2144,7 +2144,7 @@ export interface ObjectViewSchema extends BaseSchema { /** * Callback when navigating to detail page (page layout mode) * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -2702,7 +2702,7 @@ export type ListViewSchema = ListViewAuthored & ListViewRuntimeProps; /** * The zod-derived AUTHORING half of {@link ListViewSchema}, with every key * {@link ListViewRuntimeProps} declares removed so the intersection cannot - * annihilate those declarations (objectui#7804). + * annihilate those declarations (`f1cd29032`). * * ## Why this is not `ListViewInferred` directly * @@ -2771,7 +2771,7 @@ export interface ListViewRuntimeProps { refreshTrigger?: number; /** - * ⭐ The three slots below are declared here by objectui#7804, and the reason is + * ⭐ The three slots below are declared here by `f1cd29032`, and the reason is * the one objectui#9344's slice already measured on `ObjectGallerySchema`: a key * that reaches the renderer through `SchemaRenderer`'s props spread is on the * TypeScript face whether or not anyone declared it — `BaseSchema`'s index @@ -4078,7 +4078,7 @@ export interface ObjectKanbanSchema extends BaseSchema { /** * Card click handler. * - * RUNTIME SLOT (objectui#6124 shape; declared by objectui#7804) — a + * RUNTIME SLOT (objectui#6124 shape; declared by `5a41ce733`) — a * host-supplied function, NOT authorable metadata: JSON has no function * value, so the zod twin refuses this key by name and points at the node-type * spelling. Kept callable here because the function REACHES the board and @@ -4155,7 +4155,7 @@ export interface ObjectKanbanSchema extends BaseSchema { /** * Quick Add handler. * - * RUNTIME SLOT (objectui#6124 shape; declared by objectui#7804) — a + * RUNTIME SLOT (objectui#6124 shape; declared by `5a41ce733`) — a * host-supplied function, NOT authorable metadata: JSON has no function * value, so the zod twin refuses this key by name. Kept callable here because * it rides `ObjectKanban`'s schema spread untouched and arrives at the board @@ -4776,7 +4776,7 @@ export interface ObjectGallerySchema extends BaseSchema { /** * Card click handler. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer. @@ -4800,7 +4800,7 @@ export interface ObjectGallerySchema extends BaseSchema { /** * Row/item click handler — overrides {@link navigation}. * - * RUNTIME SLOT (objectui#6124, declared by objectui#7804) — a host-supplied + * RUNTIME SLOT (objectui#6124, declared by `8d50bc2bf`) — a host-supplied * function, NOT authorable metadata: JSON has no function value, so the zod * twin refuses this key by name and points at the node-type spelling. Kept * callable here because it is READ and RUN by the registered renderer, on the @@ -4908,8 +4908,8 @@ export interface ObjectDataTableSchema extends BaseSchema { * retirement and extends {@link BaseSchema} (`[key: string]: any` here, * `.passthrough()` on the zod mirror), so a deleted member would be absorbed * silently at any value — the silent no-op the retirement exists to end. - * Licensed by prong 1 of the discriminator (objectui#5941, #7526, as amended - * by objectui#7678): it steers authors to the named live replacement, + * Licensed by prong 1 of the discriminator (objectui#5941, #7526, in its + * amended form, `5f8190c8c`): it steers authors to the named live replacement, * `objectName`. The zod mirror refuses the key by name with that guidance. * * @deprecated Not read by `object-data-table` — write `objectName`. diff --git a/packages/types/src/permissions.ts b/packages/types/src/permissions.ts index 6096bfb69c..ce0989c91b 100644 --- a/packages/types/src/permissions.ts +++ b/packages/types/src/permissions.ts @@ -205,8 +205,8 @@ export interface PermissionContext { // // Removed outright rather than kept as a `?: never` carcass, on this // package's retire-vs-remove discriminator — cited, not restated: the rule is -// stated on `ChatbotSchema` in `complex.ts`, in the form objectui#7678 amended -// it to (precedent changesets objectui#5941 / #7526). `PermissionGuardConfig` +// stated on `ChatbotSchema` in `complex.ts`, in its amended form, `5f8190c8c` +// (precedent changesets objectui#5941 / #7526). `PermissionGuardConfig` // is a whole exported type name, so there is no surviving carrier to hang a // `never` key on and that precondition settles the route by itself. Nor is // there a silent-strip hazard to guard: this module has never had a `zod/` diff --git a/packages/types/src/registry.ts b/packages/types/src/registry.ts index 84ed58f492..513fafdac0 100644 --- a/packages/types/src/registry.ts +++ b/packages/types/src/registry.ts @@ -279,7 +279,7 @@ export interface SchemaRegistry { 'chatbot': ChatbotSchema; // `'chatbot-enhanced'` and `'chatbot-floating'` are the other two keys // `packages/plugin-chatbot/src/renderer.tsx` registers (`:241`, `:379`). - // They were absent from this map until objectui#7704, so `ComponentType` + // They were absent from this map until `20316bac3`, so `ComponentType` // — the published `keyof SchemaRegistry` union — told a consumer // discriminating on it that two registered keys do not exist, and // `packages/cli/src/utils/known-schema-types.ts` had to keep its own @@ -307,7 +307,7 @@ export interface SchemaRegistry { // // Pinned in `src/__tests__/schema-registry-chatbot-keys-7704.test.ts`: the // keys survive in `keyof`, each value IS the face its renderer honours, and - // each value's `type` literal IS its own key. Scope note — objectui#7704 is + // each value's `type` literal IS its own key. Scope note — the card behind `20316bac3` is // these two keys, whose faces now exist; it is NOT a sweep of the map's // other entries, which objectui#7665 holds. 'chatbot-enhanced': ChatbotEnhancedSchema; diff --git a/packages/types/src/zod/base.zod.ts b/packages/types/src/zod/base.zod.ts index afd052943a..fc05888c0c 100644 --- a/packages/types/src/zod/base.zod.ts +++ b/packages/types/src/zod/base.zod.ts @@ -201,7 +201,7 @@ export function defineNodeComponentUnion(union: T): T { * is where the whole node tree recurses. Until #8344 the component arm was * `BaseSchemaCore` — the ~21 base keys and NOTHING type-specific — which made * per-type enforcement ROOT-ONLY, at every depth, for every component type. That - * is objectui#7869, measured there: an off-spec `size` on a NESTED `icon` node was + * is the finding objectui#8344 discharged: an off-spec `size` on a NESTED `icon` node was * accepted, and the same node alone was refused. Pointing the arm at the union of * the registered component mirrors is the whole of this change; ⛔ nothing here is * `.strict()`, and `BaseSchemaCore` keeps its passthrough. diff --git a/packages/types/src/zod/complex.zod.ts b/packages/types/src/zod/complex.zod.ts index 7a648f54c0..1e2a23be83 100644 --- a/packages/types/src/zod/complex.zod.ts +++ b/packages/types/src/zod/complex.zod.ts @@ -832,7 +832,7 @@ export const ChatbotSchema = BaseSchema.extend({ type: z.literal('chatbot'), messages: z.array(ChatMessageSchema).describe('Chat messages'), placeholder: z.string().optional().describe('Input placeholder'), - // --- ADR-0049 retirement tombstones (objectui#7703) --------------------- + // --- ADR-0049 retirement tombstones (`a4611b3e2`) ----------------------- // // Six keys this twin mirrored and no `plugin-chatbot` registration read — // `loading`, `showAvatars`, `userAvatar`, `assistantAvatar`, `markdown` and @@ -846,37 +846,37 @@ export const ChatbotSchema = BaseSchema.extend({ // `BaseSchema` is `.passthrough()`, so an undeclared key is not refused, it // is KEPT — the same silent acceptance the retirement exists to close. loading: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — never read: chat progress is runtime state the chat runtime owns ' + 'RETIRED (ADR-0049) — never read: chat progress is runtime state the chat runtime owns ' + '(the registration derives it from `useObjectChat` as `isLoading`), and `` declares no `loading` ' + 'prop for an authored value to land on. There is no authored spelling that sets it; delete the key.', ), onSendMessage: handlerKeyRefusal('onSendMessage', 'retired', 'Send message handler'), showAvatars: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — no registration reads or forwards this key by name, and a `chatbot` ' + 'RETIRED (ADR-0049) — no registration reads or forwards this key by name, and a `chatbot` ' + 'node renders ``, which has no `showAvatars` prop; the one channel that did deliver it — the ' - + "`chatbot-floating` registration's unfiltered props spread — was fenced by objectui#7708. Delete the key: " + + "`chatbot-floating` registration's unfiltered props spread — was fenced. Delete the key: " + 'a `chatbot` node already renders an avatar beside every message, and the images are `userAvatarUrl` / ' + '`assistantAvatarUrl` with their `userAvatarFallback` / `assistantAvatarFallback` siblings.', ), userAvatar: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — never read: this spelling has zero hits anywhere in ' + 'RETIRED (ADR-0049) — never read: this spelling has zero hits anywhere in ' + '`packages/plugin-chatbot`. Write `userAvatarUrl` instead (with `userAvatarFallback` for the text shown ' + 'while the image loads or fails), the key all three chatbot registrations read.', ), assistantAvatar: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — never read: this spelling has zero hits anywhere in ' + 'RETIRED (ADR-0049) — never read: this spelling has zero hits anywhere in ' + '`packages/plugin-chatbot`. Write `assistantAvatarUrl` instead (with `assistantAvatarFallback` for the ' + 'text shown while the image loads or fails), the key all three chatbot registrations read.', ), markdown: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — never read: a `chatbot` node renders ``, which prints message ' + 'RETIRED (ADR-0049) — never read: a `chatbot` node renders ``, which prints message ' + 'content as text and has no markdown path for this switch to reach. Author `type: "chatbot-enhanced"` ' + '(or `"chatbot-floating"`) with `enableMarkdown` instead — markdown is those nodes\' capability, and ' + '`enableMarkdown` is the key their registrations read.', ), processVisibility: z.enum(['hidden', 'summary', 'debug']).optional().describe('How much agent reasoning/tool detail to show'), height: retirementTombstone( - 'RETIRED (objectui#7703, ADR-0049) — never read: `` has no `height` prop. Write `maxHeight` ' + 'RETIRED (ADR-0049) — never read: `` has no `height` prop. Write `maxHeight` ' + 'instead (a CSS length string, default "500px"), the key the `chatbot` and `chatbot-enhanced` ' + 'registrations forward; size a `chatbot-floating` panel with `floatingConfig.panelHeight`, a number of ' + 'pixels, which is what that panel reads.', diff --git a/packages/types/src/zod/crud.zod.ts b/packages/types/src/zod/crud.zod.ts index c59f03d73d..cf4327b681 100644 --- a/packages/types/src/zod/crud.zod.ts +++ b/packages/types/src/zod/crud.zod.ts @@ -193,7 +193,7 @@ export const DetailSchema = BaseSchema.extend({ // `handleBack` that calls `onBack()` for `detail-view`. Was `z.any()`. onBack: handlerKeyRefusal('onBack', 'runtime-slot', 'Custom back action'), /** - * RUNTIME SLOT (objectui#7804, the objectui#6124 shape, batch #69 ruling) — + * RUNTIME SLOT (`7ca6ddd4b`, the objectui#6124 shape, batch #69 ruling) — * DECLARED here for the first time; it was never on this arm at all, so * `BaseSchemaCore`'s `.passthrough()` KEPT an authored value instead of * refusing it and handed it to a call site expecting a function. @@ -221,7 +221,7 @@ export const DetailSchema = BaseSchema.extend({ */ onNavigate: handlerKeyRefusal('onNavigate', 'runtime-slot', 'SPA navigation callback'), /** - * RUNTIME SLOT (objectui#7804), and a DIFFERENT channel from `onNavigate` + * RUNTIME SLOT (`7ca6ddd4b`), and a DIFFERENT channel from `onNavigate` * above — which is why the ruling demands a measurement per key rather than * per prefix. * @@ -233,8 +233,8 @@ export const DetailSchema = BaseSchema.extend({ * the text. * * ⚠️ `comments` is deliberately NOT declared here. It is not a handler key, - * declaring it is an accept-set decision of its own, and objectui#7804's rows - * are the handler keys — noted on that card instead of ridden in on this one. + * declaring it is an accept-set decision of its own, and the handler-key parent + * card's rows are the handler keys — noted on that card instead of ridden in on this one. */ onAddComment: handlerKeyRefusal('onAddComment', 'runtime-slot', 'New comment callback'), loading: z.boolean().optional().describe('Whether to show loading state'), diff --git a/packages/types/src/zod/data-display.zod.ts b/packages/types/src/zod/data-display.zod.ts index 9d84effbd0..6a4fb3d60a 100644 --- a/packages/types/src/zod/data-display.zod.ts +++ b/packages/types/src/zod/data-display.zod.ts @@ -418,7 +418,7 @@ export const DataTableSchema = BaseSchema.extend({ }).optional().describe('Per-record CEL predicates for the built-in row Delete item (objectui#2614)'), onSelectionChange: handlerKeyRefusal('onSelectionChange', 'runtime-slot', 'Selection change handler'), onColumnsReorder: handlerKeyRefusal('onColumnsReorder', 'runtime-slot', 'Column reorder handler'), - // ⭐ objectui#7804 — seven keys the REGISTERED `data-table` renderer reads off + // ⭐ `75fca9669` — seven keys the REGISTERED `data-table` renderer reads off // the authored document while this arm declared none of them. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being judged // and the value is KEPT. `{ "type": "data-table", "onRowClick": { "action": @@ -582,7 +582,7 @@ export const TreeViewSchema = BaseSchema.extend({ selectedIds: z.array(z.string()).optional().describe('Controlled selected node IDs'), multiSelect: z.boolean().optional().describe('Allow multiple selection'), showLines: z.boolean().optional().describe('Show connecting lines'), - // objectui#7804 — RUNTIME SLOT (objectui#6124), the ledger row this slice + // `604476d97` — RUNTIME SLOT (objectui#6124), the ledger row this slice // drains. `BaseSchema` is `.passthrough()`, so a key no arm declares is not // refused: it stops being judged and the value is KEPT. `onNodeClick` sat in // exactly that state while the registered renderer INVOKED it, so an authored @@ -689,7 +689,7 @@ export const ChartDataSeriesSchema = z.object({ // the TS declaration for the read this narrowness is taken from. type: z.enum(['bar', 'line', 'area']).optional().describe('Per-series chart family override (combo charts)'), // ALIAS REFUSAL (objectui#7694 — option A of the `domain:ui` PM ruling on - // objectui#7546 / the contract review of PR #7684). `chartType` is the + // objectui#7546 / the contract review of `8fe8e5c16`'s pull request). `chartType` is the // renderer's INTERNAL spelling of `type` above — the first limb of // `normalizeSeries`' `str(raw.chartType) ?? str(raw.type)` // (`normalizeChartSchema.ts:244`) — written by the internal-shape producers @@ -737,7 +737,7 @@ export const ChartDataSeriesSchema = z.object({ 'Legend / tooltip name for this series — a plain string or an inline locale map; defaults to the column key', ), variant: z.enum(['primary', 'comparison']).optional().describe( - 'Visual role — `comparison` draws the muted period-over-period overlay; `primary` (the default) is the normal treatment. The spec pair: the renderer-internal `current` spelling is not a member (objectui#7682)', + 'Visual role — `comparison` draws the muted period-over-period overlay; `primary` (the default) is the normal treatment. The spec pair: the renderer-internal `current` spelling is not a member', ), opacity: z.number().optional().describe('Stroke and fill opacity override — any finite number, the read\'s own domain; the spec bounds it to 0–1'), dashArray: z.string().optional().describe('SVG stroke-dasharray override, e.g. "4 4" for a dashed line'), diff --git a/packages/types/src/zod/layout.zod.ts b/packages/types/src/zod/layout.zod.ts index 9fa621f10d..2cef15c989 100644 --- a/packages/types/src/zod/layout.zod.ts +++ b/packages/types/src/zod/layout.zod.ts @@ -653,7 +653,7 @@ export const PAGE_SPEC_EXCLUDED = [ const SpecPageFields = specFieldsExcept(stripImportedDefaults(SpecPageSchema).shape, PAGE_SPEC_EXCLUDED); /** - * The `actions` REFUSAL on the `page` node (objectui#7926, maintainer ruling + * The `actions` REFUSAL on the `page` node (`12b599219`, maintainer ruling * 2026-09-09, decision batch #107 item 2 — option A). * * ## What was measured @@ -688,7 +688,7 @@ const SpecPageFields = specFieldsExcept(stripImportedDefaults(SpecPageSchema).sh * plus one literal carrying a spread), and the undeclared keys that survive * passthrough on a real `page` NODE are exactly `actions` (3 sites, all of them * the `content/docs/guide/layout.md` passages this card rewrites) and - * `breadcrumbs` (its own question — objectui#7926 does not rule on it; RULED + * `breadcrumbs` (its own question — the 2026-09-09 ruling does not cover it; RULED * and refused separately by objectui#8871, see {@link PAGE_BREADCRUMBS_REFUSAL} * below, which also corrects the "1 site" reading recorded here to THREE — two * were missed for two DIFFERENT reasons: one passage's literal does carry @@ -709,7 +709,7 @@ const SpecPageFields = specFieldsExcept(stripImportedDefaults(SpecPageSchema).sh * turned into a named refusal that carries the remedy. */ const PAGE_ACTIONS_REFUSAL = - '`actions` is not a key of the `page` node and never was (objectui#7926): no renderer ' + + '`actions` is not a key of the `page` node and never was (ADR-0049): no renderer ' + 'reads it, so an authored array drew nothing and rode `.passthrough()` onto the wrapper ' + 'element. Author the buttons as NODES in `children` (a `button` node, or an `action:button` ' + 'node with a declared `actionType`); on a record page declare them on a `page:header` ' + @@ -718,13 +718,13 @@ const PAGE_ACTIONS_REFUSAL = /** * The `breadcrumbs` REFUSAL on the `page` node (objectui#8871) — the key - * objectui#7926 measured on this same node and deliberately left parsing, so + * `12b599219` measured on this same node and deliberately left parsing, so * that retiring it would be a DECISION rather than an accident. This is that * decision, taken under ADR-0049 enforce-or-remove. * * ## Why ADR-0049 governs this, and not a fresh ruling * - * objectui#7926's maintainer ruling covers `actions` and, by its own comments, + * The 2026-09-09 maintainer ruling covers `actions` and, by its own comments, * nothing else — so it is NOT borrowed here. What reaches this key instead is * the standing enforce-or-remove discipline, which this repository applies to * this exact face: {@link retirementTombstone} is documented as the "ADR-0049 @@ -755,7 +755,7 @@ const PAGE_ACTIONS_REFUSAL = * readers" and every one of them is false. * * THREE author sites, all of them teaching passages in one file — and the - * count corrects objectui#7926's "1 site", which came from a census that + * count corrects the `actions` refusal's "1 site", which came from a census that * reads every git-tracked JSON file, every `json` fence in `.md`/`.mdx`, and * every TS/TSX object literal via the TypeScript AST (PR #8870). It * undercounted for TWO DIFFERENT reasons: the Schema API block declared the diff --git a/packages/types/src/zod/objectql.zod.ts b/packages/types/src/zod/objectql.zod.ts index 0023c6f884..09c770f0fa 100644 --- a/packages/types/src/zod/objectql.zod.ts +++ b/packages/types/src/zod/objectql.zod.ts @@ -345,7 +345,7 @@ export const ObjectGridSchema = BaseSchema.extend({ editable: z.boolean().optional(), keyboardNavigation: z.boolean().optional(), frozenColumns: z.number().optional(), - // ⭐ objectui#7804 — one key the REGISTERED `object-grid` renderer reads off + // ⭐ `8d50bc2bf` — one key the REGISTERED `object-grid` renderer reads off // the authored document while this arm declared none. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being // judged and the value is KEPT. `{ "type": "object-grid", "objectName": "a", @@ -432,7 +432,7 @@ export const ObjectFormSchema = BaseSchema.extend({ showReset: z.boolean().optional().describe('Show reset button'), initialValues: z.record(z.string(), z.any()).optional().describe('Initial values'), readOnly: z.boolean().optional().describe('Read-only mode'), - // ⭐ objectui#7804 — five keys the REGISTERED `object-form` renderer reads off + // ⭐ `8d50bc2bf` — five keys the REGISTERED `object-form` renderer reads off // the authored document while this arm declared none of them. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being // judged and the value is KEPT. `{ "type": "object-form", "objectName": "a", @@ -580,7 +580,7 @@ export const ObjectViewSchema = BaseSchema.extend({ // verbatim into the `view-switcher` node it composes. allowCreateView: ViewSwitcherSchema.shape.allowCreateView, viewActions: ViewSwitcherSchema.shape.viewActions, - // ⭐ objectui#7804 — one key the REGISTERED `object-view` renderer reads off + // ⭐ `8d50bc2bf` — one key the REGISTERED `object-view` renderer reads off // the authored document while this arm declared none. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being // judged and the value is KEPT, then reaches four call sites in @@ -1686,7 +1686,7 @@ export const ListViewSchema = BaseSchema calendar: CalendarConfig.optional().describe('Calendar-specific configuration'), gallery: GalleryConfig.optional().describe('Gallery-specific configuration'), timeline: TimelineConfig.optional().describe('Timeline-specific configuration'), - // ⭐ objectui#7804 — the five keys the REGISTERED `list-view` renderer reads + // ⭐ `f1cd29032` — the five keys the REGISTERED `list-view` renderer reads // off the authored document while this arm declared none. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being // judged and the value is KEPT. `SchemaRenderer` then spreads every @@ -2452,7 +2452,7 @@ export const ObjectKanbanSchema = BaseSchema.extend({ 'Delete the key; there is no board-level replacement to rename it to.', ), conditionalFormatting: z.array(KanbanConditionalFormattingRuleSchema).optional().describe('Card conditional formatting rules'), - // ── objectui#7804 — the three handler keys `KanbanRenderer` reads off the + // ── `5a41ce733` — the three handler keys `KanbanRenderer` reads off the // document this arm judges, MEASURED one at a time (director seat ruling of // 2026-09-07, decision batch #69: the arm a `type` selects is the contract // for what renders under it, and a registered renderer may not read a key the @@ -2825,7 +2825,7 @@ export const ObjectGallerySchema = BaseSchema.extend({ grouping: stripImportedDefaults(SpecGroupingConfigSchema).optional().describe('Grouping configuration for sectioned display'), imageField: z.string().optional().describe('DEPRECATED — use gallery.coverField'), titleField: z.string().optional().describe('DEPRECATED — use gallery.titleField'), - // ⭐ objectui#7804 — two keys the REGISTERED `object-gallery` renderer reads + // ⭐ `8d50bc2bf` — two keys the REGISTERED `object-gallery` renderer reads // off the authored document while this arm declared neither. `BaseSchema` is // `.passthrough()`, so an undeclared key is NOT refused: it stops being // judged and the value is KEPT, and `SchemaRenderer` then spreads it into the diff --git a/packages/types/src/zod/overlay.zod.ts b/packages/types/src/zod/overlay.zod.ts index a6bd98edd9..1035688fac 100644 --- a/packages/types/src/zod/overlay.zod.ts +++ b/packages/types/src/zod/overlay.zod.ts @@ -67,7 +67,7 @@ export const DialogSchema = BaseSchema.extend({ * and thrown away the diagnostic with it. {@link retirementTombstone} keeps the * key DECLARED and unwritable, which is what makes the refusal loud. Same * mechanism, same reasoning as the `actions` and `breadcrumbs` refusal arms on - * `PageNodeSchema` (`./layout.zod.ts`, objectui#7926 / objectui#8871). + * `PageNodeSchema` (`./layout.zod.ts`, `12b599219` / objectui#8871). * ⚠️ Both spelled WITHOUT a leading dot on purpose: objectui#8871 keeps a * TREE-SCOPED point-access probe standing over every tracked file, and a prose * mention here is a hit that probe cannot tell from a reader. diff --git a/packages/types/src/zod/views.zod.ts b/packages/types/src/zod/views.zod.ts index 9b06cc60f1..ea32797ca3 100644 --- a/packages/types/src/zod/views.zod.ts +++ b/packages/types/src/zod/views.zod.ts @@ -190,7 +190,7 @@ export const DetailViewSchema = BaseSchema.extend({ /** * RUNTIME SLOT (objectui#9447, the objectui#6124 shape) — DECLARED on this * arm for the first time. The `detail` twin refused this key by name with - * objectui#7804; this arm did not, so `BaseSchemaCore`'s `.passthrough()` + * `7ca6ddd4b`; this arm did not, so `BaseSchemaCore`'s `.passthrough()` * KEPT an authored value instead of refusing it and handed it to a call site * expecting a function — the same two keys with two different fates decided * only by which `type` literal an author wrote. @@ -231,7 +231,7 @@ export const DetailViewSchema = BaseSchema.extend({ /** * RUNTIME SLOT (objectui#9447), and a DIFFERENT channel from `onNavigate` * above — which is why the disposition is read per key rather than per - * prefix, the same reading objectui#7804 demanded on the twin. + * prefix, the same reading the ruling behind `7ca6ddd4b` demanded on the twin. * * `DetailView` never calls this one. It FORWARDS it as a React prop into the * `` it renders, whose submit handler awaits it; the forward @@ -266,7 +266,7 @@ export const DetailViewSchema = BaseSchema.extend({ * `retirementTombstone` keeps the key DECLARED and unwritable, which is what * makes the refusal loud. Same mechanism and same reasoning as the * alert-dialog footer refusals (`./overlay.zod.ts`, objectui#7963) and the - * `PageNodeSchema` arms (`./layout.zod.ts`, objectui#7926 / objectui#8871). + * `PageNodeSchema` arms (`./layout.zod.ts`, `12b599219` / objectui#8871). * * ## What was measured — the frame is BASE `efead6c60`, stated out loud *