diff --git a/.changeset/10803-dead-citation-sweep-second-batch.md b/.changeset/10803-dead-citation-sweep-second-batch.md
new file mode 100644
index 0000000000..68e47865b5
--- /dev/null
+++ b/.changeset/10803-dead-citation-sweep-second-batch.md
@@ -0,0 +1,20 @@
+---
+---
+
+Comment-only in `@object-ui/app-shell`, `@object-ui/components`, `@object-ui/core`,
+`@object-ui/fields`, `@object-ui/plugin-calendar`, `@object-ui/plugin-chatbot`,
+`@object-ui/plugin-dashboard`, `@object-ui/plugin-gantt`, `@object-ui/plugin-grid`,
+`@object-ui/plugin-list`, `@object-ui/plugin-map`, `@object-ui/plugin-timeline`,
+`@object-ui/plugin-tree`, `@object-ui/plugin-view`, `@object-ui/react`,
+`@object-ui/sdui-parser` and `@object-ui/types`: docblocks and code comments that cited
+objectui issues which answer 404 now cite the commit that landed each change, as a
+9-character sha, or the ruling by its date where no single commit answers (objectui#10803,
+the second batch after objectui#10771). 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 one runtime text the sweep touches, eleven zod `.describe()` strings in
+`@object-ui/types`, is declared on its own as a patch in
+`10803-describe-string-citations.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-describe-string-citations.md b/.changeset/10803-describe-string-citations.md
new file mode 100644
index 0000000000..d064ececc0
--- /dev/null
+++ b/.changeset/10803-describe-string-citations.md
@@ -0,0 +1,19 @@
+---
+'@object-ui/types': patch
+---
+
+fix(types): eleven zod `.describe()` strings no longer point at an objectui issue that answers 404
+
+The runtime descriptions of eleven members of the published zod mirrors ended with, or
+carried, a pointer to an objectui issue that answers 404: `CheckboxSchema.wrapperClass`,
+`TreeViewSchema.nodes`, `ObjectMapSchema.objectName`, `ObjectGanttSchema.objectName`,
+`ObjectGanttSchema.data`, `TooltipSchema.trigger` / `content` / `children`, and
+`ContextMenuSchema.triggerClassName` / `contentClassName` / `modal`. A reader of a zod
+`description` has no repository to resolve a commit against, so each dead pointer is dropped
+rather than replaced (objectui#10803). On `ObjectGanttSchema.data` the clause that carried it,
+"undeclared on either face until" that issue, goes with it, leaving
+"Data source configuration — read FIRST by resolveRecordSourceConfig": the same shape as its
+`ObjectMapSchema.data` twin, which names `getDataConfig`.
+
+Nothing else in any string moves, and no key, path, accept set or refusal changes: every
+document that parsed before parses the same way.
diff --git a/.changeset/5853-tablecolumn-type-canonical-union.md b/.changeset/5853-tablecolumn-type-canonical-union.md
index 47431dd506..688a26ebe3 100644
--- a/.changeset/5853-tablecolumn-type-canonical-union.md
+++ b/.changeset/5853-tablecolumn-type-canonical-union.md
@@ -6,7 +6,7 @@
---
`TableColumn.type` now has ONE canonical value set across all three ends that disagreed
-(objectui#5853, maintainer ruling 2026-08-25, Option B: the 8-literal interface union is
+(maintainer ruling 2026-08-25, Option B: the 8-literal interface union is
canonical). The interface declared `'text' | 'number' | 'date' | 'datetime' | 'currency' |
'percent' | 'boolean' | 'action'`; the zod mirror declared `z.string()` and accepted
anything; the renderer branched on a third set and could only read the key through an
diff --git a/.changeset/6004-grid-column-emit-boundary.md b/.changeset/6004-grid-column-emit-boundary.md
index c714459cc1..c999f0d469 100644
--- a/.changeset/6004-grid-column-emit-boundary.md
+++ b/.changeset/6004-grid-column-emit-boundary.md
@@ -26,6 +26,6 @@ Key verdicts: `headerIcon`, `pinned` and `wrap` are HELD and now declared at the
seam; `options` is RETIRED — nothing on either side of the seam read it, and
every value it carried still reaches its consumer through the field metadata the
cell closure captures and the object schema the inline editor reads. `type` stays
-objectui#5853's and `name` is not emitted here at all.
+under `fc62bb490`'s fold and `name` is not emitted here at all.
No rendering change.
diff --git a/.changeset/6150-undeclared-but-consumed-keys.md b/.changeset/6150-undeclared-but-consumed-keys.md
index 8c958e003e..659da5b5c8 100644
--- a/.changeset/6150-undeclared-but-consumed-keys.md
+++ b/.changeset/6150-undeclared-but-consumed-keys.md
@@ -86,7 +86,7 @@ decisions publish in this same release.** This paragraph used to end "Declaring
`data` stays required on both faces." Neither half of that is true any more, on
either face:
-- **A `nodes`-only `tree-view` document IS legal.** objectui#6939 made `data`
+- **A `nodes`-only `tree-view` document IS legal.** `777e5c6f4` made `data`
optional, so the `nodes` spelling the renderer reads FIRST stands on its own
(`6939-tree-view-nodes-mirror.md`, published beside this note). `bind` is read
before either and is unchanged.
@@ -95,7 +95,7 @@ either face:
and the zod arm is a `retirementTombstone(...)` whose guidance points the author
at `nodes` (`6951-tree-view-data-retired.md`, also published beside this note).
`nodes` is `z.array(TreeNodeSchema).optional()`, and its own describe text
- records that a `nodes`-only document became legal at objectui#6939.
+ records that a `nodes`-only document became legal (at `777e5c6f4`).
⛔ Nothing on the branch carrying this amendment falsified that sentence: it was
already untrue at that branch's base, and both cards that made it untrue are
diff --git a/.changeset/6373-datatable-emit-boundary.md b/.changeset/6373-datatable-emit-boundary.md
index 5da8a51593..c8e6621fee 100644
--- a/.changeset/6373-datatable-emit-boundary.md
+++ b/.changeset/6373-datatable-emit-boundary.md
@@ -17,7 +17,7 @@ closure captures is what this widget's type-aware rendering has always read, and
untouched. Authored spellings still pass through, so a column the author wrote as
`{ format: '$0,0' }` keeps its `format` exactly as before.
-`type` is unchanged — objectui#5853's fold at this seam still applies. `name` is unchanged
+`type` is unchanged — the fold `fc62bb490` put at this seam still applies. `name` is unchanged
and still written: `data-table` reads `col.accessorKey || col.name` and objectui#5120 holds
that alias while two published skill guides still teach a `{ name, label }` column. The hold
is now declared at the seam instead of arriving anonymously inside a spread.
diff --git a/.changeset/6594-headercolor-mirror-enum.md b/.changeset/6594-headercolor-mirror-enum.md
index fd7c3106a2..9b27ab1330 100644
--- a/.changeset/6594-headercolor-mirror-enum.md
+++ b/.changeset/6594-headercolor-mirror-enum.md
@@ -48,13 +48,13 @@ against synthetic inputs so the guard has been shown to fail rather than only to
## Shape, and where it departs from the nearest precedent
-The nearest precedent is objectui#5853 (`.changeset/5853-tablecolumn-type-canonical-union.md`),
+The nearest precedent is `fc62bb490` (`.changeset/5853-tablecolumn-type-canonical-union.md`),
which narrowed `TableColumn.type` on the same three-ends pattern and **exported** a
`TABLE_COLUMN_TYPES` tuple for the zod mirror to build its enum from. That shape is not
available here and the difference is structural, not a preference: `packages/types/src/views.ts`
is a **type-only** module, so a tuple there would add a runtime export to the package barrel
(a value export cannot ride the barrel's `export type` block) and a runtime import edge from
-the zod entry into `views.js`. #5853 had a second reason to export — producers needed its
+the zod entry into `views.js`. `fc62bb490` had a second reason to export — producers needed its
`normalizeTableColumnType()` at their emit seam — and `headerColor` has no producer that needs
a runtime value. The literals are therefore written on each half and the anti-drift guarantee
is carried by the pin above, which also covers the third end a shared tuple could not reach:
diff --git a/.changeset/6938-checkbox-wrapper-class.md b/.changeset/6938-checkbox-wrapper-class.md
index edd69c7d0b..ffe93f3473 100644
--- a/.changeset/6938-checkbox-wrapper-class.md
+++ b/.changeset/6938-checkbox-wrapper-class.md
@@ -2,8 +2,8 @@
'@object-ui/types': patch
---
-Declare `wrapperClass` on `CheckboxSchema`, on both faces (objectui#6938 — the
-residue of that card; its `context-menu` half landed with objectui#6939 group 1).
+Declare `wrapperClass` on `CheckboxSchema`, on both faces (the residue of its
+card; that card's `context-menu` half landed with `bfaa1589c`).
`packages/components/src/renderers/form/checkbox.tsx:36` reads
`cn("flex items-center space-x-2", schema.wrapperClass)` — classes on the wrapper
diff --git a/.changeset/6939-filter-builder-catalog-operator-spellings.md b/.changeset/6939-filter-builder-catalog-operator-spellings.md
index 529b6f9554..93545deca7 100644
--- a/.changeset/6939-filter-builder-catalog-operator-spellings.md
+++ b/.changeset/6939-filter-builder-catalog-operator-spellings.md
@@ -1,7 +1,7 @@
---
---
-Corpus + test-only (objectui#6939): the three `components-complex-filter-builder`
+Corpus + test-only: the three `components-complex-filter-builder`
schema-catalog entries now spell `conditions[].operator` with the members
`FilterOperatorSchema` declares (`equals` / `less_than` / `greater_than`) instead
of the spec's alias table (`eq` / `lt` / `gt`), so they pass
diff --git a/.changeset/6939-filter-builder-mirror.md b/.changeset/6939-filter-builder-mirror.md
index 34bba0d79b..a9429f8a68 100644
--- a/.changeset/6939-filter-builder-mirror.md
+++ b/.changeset/6939-filter-builder-mirror.md
@@ -4,8 +4,8 @@
Repair the `filter-builder` mirror: the field key is `value`, the type
vocabulary is the value families the component actually folds a column into,
-and a filter group is `{ id, logic, conditions }` (objectui#6939, maintainer
-ruling recorded 2026-09-02 — one of the eight groups on that card, dispatched
+and a filter group is `{ id, logic, conditions }` (maintainer ruling
+recorded 2026-09-02 — one of the eight groups under that ruling, dispatched
as its own PR per the ruling).
Three independent mis-declarations sat in one member, and each is a key-name or
@@ -77,7 +77,7 @@ and both flagged for contract review rather than made quietly:**
column draws the option-driven Select and no `` at all, against a text
box for an unrecognised spelling. Dropping it would refuse a spelling this
mirror accepts *today* and the renderer draws distinctly, which is a fresh
- instance of the class objectui#6939 exists to close.
+ instance of the class that ruling's eight groups exist to close.
- **The group's `id` is declared OPTIONAL.** `isValidGroup` never consults it
and nothing reads `filterGroup.id`; deleting it from an authored group renders
byte-identically. Requiring it would invent a refusal the renderer does not
@@ -100,11 +100,11 @@ inside this same release by objectui#9559: `FilterOperatorSchema` became the
spec rule's own operator member, so the alias and dropdown spellings are now
accepted and normalised to canonical on parse), while the
canonical spellings it accepts render a **blank** operator trigger — and it is
-reported on objectui#6939 rather than decided here. Seven further live field
+reported on its own card, objectui#7561, rather than decided here. Seven further live field
types (`status`, `currency`, `percent`, `rating`, `lookup`, `master_detail`,
`user`) each have their own bucket and control and are still refused; they were
refused before this change as well, so that gap is pre-existing rather than a
-regression introduced here, and it is reported on the same card. The published
+regression introduced here, and it is reported on its own card, objectui#7562. The published
doc for this component already offers all fourteen spellings and already marks
`type` OPTIONAL, which the mirror still does not — a third declaration that
agrees with the renderer, pinned here so the gap is measured rather than
diff --git a/.changeset/6939-kanban-column-cards.md b/.changeset/6939-kanban-column-cards.md
index 88808ffb89..1c31e70604 100644
--- a/.changeset/6939-kanban-column-cards.md
+++ b/.changeset/6939-kanban-column-cards.md
@@ -3,7 +3,7 @@
---
Rename `KanbanColumn.items` to `cards`, in both halves of the published surface
-(objectui#6939, maintainer ruling 2026-09-02).
+(maintainer ruling 2026-09-02).
**Breaking, deliberately.** `KanbanColumn` declared its card list as `items` in
`complex.ts` and in the zod mirror `complex.zod.ts`. Every board reads `cards`.
diff --git a/.changeset/6939-objectql-record-source-refinement.md b/.changeset/6939-objectql-record-source-refinement.md
index d1e5f5fe6a..e9d4a51cdf 100644
--- a/.changeset/6939-objectql-record-source-refinement.md
+++ b/.changeset/6939-objectql-record-source-refinement.md
@@ -4,8 +4,8 @@
Repair the `object-map` and `object-gantt` mirrors: `objectName` is optional,
and a refinement requires that at least one of `data`, `staticData`,
-`objectName` is present (objectui#6939, maintainer ruling recorded 2026-09-02 —
-this is one of the eight groups on that card, dispatched as its own PR per the
+`objectName` is present (maintainer ruling recorded 2026-09-02 — this is one
+of the eight groups under that ruling, dispatched as its own PR per the
ruling).
Both renderers resolve their records from one of three keys, in this order —
diff --git a/.changeset/6939-overlay-trigger-mirror.md b/.changeset/6939-overlay-trigger-mirror.md
index 75fa58fcd3..71860ccf7a 100644
--- a/.changeset/6939-overlay-trigger-mirror.md
+++ b/.changeset/6939-overlay-trigger-mirror.md
@@ -4,8 +4,8 @@
Repair the `tooltip` and `context-menu` mirrors: declare the keys their renderers
actually read, and stop requiring the `children` neither of them reads
-(objectui#6939, maintainer ruling recorded 2026-09-02 — this is one of the eight
-groups on that card, dispatched as its own PR per the ruling).
+(maintainer ruling recorded 2026-09-02 — this is one of the eight groups under
+that ruling, dispatched as its own PR per the ruling).
Both members demanded `children` and omitted keys the renderer reads first, so
`safeValidateSchema` refused two catalog entries that draw correctly:
diff --git a/.changeset/6939-tree-view-nodes-mirror.md b/.changeset/6939-tree-view-nodes-mirror.md
index 239c1e5d54..ccd6916582 100644
--- a/.changeset/6939-tree-view-nodes-mirror.md
+++ b/.changeset/6939-tree-view-nodes-mirror.md
@@ -3,8 +3,8 @@
---
Repair the `tree-view` mirror: `data` is optional, so the `nodes` spelling the
-renderer reads FIRST is a legal document on its own (objectui#6939, maintainer
-ruling recorded 2026-09-02 — this is one of the eight groups on that card,
+renderer reads FIRST is a legal document on its own (maintainer ruling
+recorded 2026-09-02 — this is one of the eight groups under that ruling,
dispatched as its own PR per the ruling).
`TreeViewSchema` REQUIRED `data`, the limb the renderer reads THIRD:
diff --git a/.changeset/6950-binding-framework-injected-input.md b/.changeset/6950-binding-framework-injected-input.md
index 8f225fd009..2cbabb64da 100644
--- a/.changeset/6950-binding-framework-injected-input.md
+++ b/.changeset/6950-binding-framework-injected-input.md
@@ -4,7 +4,7 @@
'@object-ui/core': patch
---
-`binding` on a component input is framework-set, not author-declared: `@object-ui/types` gains `InjectedComponentInput`, the `'field'` binding arm is retired from `@object-ui/sdui-parser`'s `RegistryConfigLike`, and the `as ComponentMeta` cast at the injection seam in `@object-ui/core` is gone (objectui#6950; maintainer ruling of 2026-09-07, director decision batch #69; ADR-0049 enforce-or-remove).
+`binding` on a component input is framework-set, not author-declared: `@object-ui/types` gains `InjectedComponentInput`, the `'field'` binding arm is retired from `@object-ui/sdui-parser`'s `RegistryConfigLike`, and the `as ComponentMeta` cast at the injection seam in `@object-ui/core` is gone (maintainer ruling of 2026-09-07, director decision batch #69; ADR-0049 enforce-or-remove).
**What was measured.** `binding` was published — the manifest serializer forwards it — and read — `validateTree` records a binding site for it — while `ComponentInput`, the authoring type every registration writes against, did not declare it. The one writer in the tree, `ELEMENT_DATA_SOURCE_INPUT`, therefore carried a hand-written inline type and reached a registration's `inputs` through `as ComponentMeta` in `Registry.register`. Declared narrower than enforced, on a published type — and `ComponentInput`'s own docblock listed `binding` among the forwarded per-input keys.
diff --git a/.changeset/6951-tree-view-data-retired.md b/.changeset/6951-tree-view-data-retired.md
index 6bdeff42c8..d1d4c40f81 100644
--- a/.changeset/6951-tree-view-data-retired.md
+++ b/.changeset/6951-tree-view-data-retired.md
@@ -15,7 +15,7 @@ unchanged and still read first.
spellings for its one inline-nodes slot — `nodes` (read second) and `data` (read
third: `boundData || schema.nodes || schema.data || []` at
`renderers/data-display/tree-view.tsx:105`), both declared by objectui#6150.
-`data` had been REQUIRED until objectui#6939 / PR #7533 made it optional, so
+`data` had been REQUIRED until `777e5c6f4` (PR #7533) made it optional, so
this retirement starts from a declared-and-optional member on both faces. The
in-repo corpus at the retirement: seven `tree-view` nodes under
`examples/schema-catalog` and `packages/types/examples` plus one `content/docs`
diff --git a/.changeset/7014-select-option-spec-claim-correction.md b/.changeset/7014-select-option-spec-claim-correction.md
index 945098fc39..cd9d884183 100644
--- a/.changeset/7014-select-option-spec-claim-correction.md
+++ b/.changeset/7014-select-option-spec-claim-correction.md
@@ -15,7 +15,7 @@ Option-A ruling on objectui#6140 / objectui#6153 — and this repo's pin has mov
Everything below was measured correctly against 17.2.0 and is kept as the dated record of
why the comments were rewritten; ⛔ do not read it as the contract you are authoring
against today. `rows` and `options[].description` are **authorable now**, and the doc
-comments were corrected again in objectui#7635, which releases alongside this entry.
+comments were corrected again in `544ecba84`, which releases alongside this entry.
Three doc comments claimed the installed `@objectstack/spec` DECLARES a key that it in
fact **refused by name**. Measured on `@objectstack/spec@17.2.0`, each paired with a
diff --git a/.changeset/7070-no-invented-gantt-date-fields.md b/.changeset/7070-no-invented-gantt-date-fields.md
index aa768c6020..a51f0e1095 100644
--- a/.changeset/7070-no-invented-gantt-date-fields.md
+++ b/.changeset/7070-no-invented-gantt-date-fields.md
@@ -4,7 +4,7 @@
'@object-ui/plugin-view': minor
---
-Gantt views no longer render on invented date field names (objectui#7070).
+Gantt views no longer render on invented date field names.
The half PR #7062 fenced out and reported separately. A view that carried no
`gantt:` block used to have a complete-looking date axis synthesized for it:
@@ -45,7 +45,7 @@ Also corrected: the objectui#3129 note at the top of `app-shell/ObjectView.tsx`
certified the gantt branch below it as already using the safe two-rung shape.
It did not. The note now states each sibling branch as measured, and says
explicitly which fabrication REMAINS — the timeline `'created_at'` floor at the
-two plugin faces, which objectui#7070 routes to a ruling rather than settling
+two plugin faces, which is routed to a ruling rather than settled
per-face.
Deliberately out of scope, and left in place: `progressField` / `dependenciesField`
diff --git a/.changeset/7070-timeline-date-axis-floors-retired.md b/.changeset/7070-timeline-date-axis-floors-retired.md
index c38bd4a691..d11b18c505 100644
--- a/.changeset/7070-timeline-date-axis-floors-retired.md
+++ b/.changeset/7070-timeline-date-axis-floors-retired.md
@@ -4,7 +4,7 @@
---
Retire the `'created_at'` timeline date-axis floors at both plugin faces
-(objectui#7070 step ③, maintainer ruling 2026-09-01, 总监批 #28).
+(step ③ of the maintainer ruling 2026-09-01, 总监批 #28).
**Breaking, deliberately.** A timeline view that declares **no** date axis anywhere no
longer renders. `ListView`'s and `ObjectView`'s timeline branches used to hand
diff --git a/.changeset/7083-richtext-field-metadata.md b/.changeset/7083-richtext-field-metadata.md
index 85242174ed..288c8f36d7 100644
--- a/.changeset/7083-richtext-field-metadata.md
+++ b/.changeset/7083-richtext-field-metadata.md
@@ -5,7 +5,7 @@
`RichtextFieldMetadata` — the third registry key of `RichTextField` becomes declarable
(objectui#7083, maintainer ruling 2026-09-07, director decision batch #71).
-`markdown`, `html` and `richtext` are one widget (objectui#5498). Two of the three
+`markdown`, `html` and `richtext` are one widget (`4bb940b6e`). Two of the three
already had an exported metadata type; `richtext` had none, so the runtime served it by
structure while an author could not write its metadata under an annotation at all. The
only way to write one was `as unknown as MarkdownFieldMetadata`, and that deliberate
diff --git a/.changeset/7113-chart-data-model.md b/.changeset/7113-chart-data-model.md
index f39125ffaf..2d314e79b6 100644
--- a/.changeset/7113-chart-data-model.md
+++ b/.changeset/7113-chart-data-model.md
@@ -5,11 +5,11 @@
`ChartSchema` declares the data model it renders — chart-level `data` and `xAxisKey`, with
the bare-string `xAxis` folded onto the latter — and `ChartDataSeries` accepts both binding
dialects (objectui#7113 option B, 项目总监席 总监批 #28 2026-09-01 「同意」; and
-objectui#6939's `chart` row, maintainer ruling 2026-09-02 「同意」 — both rulings
+the `chart` row of the eight-group maintainer ruling of 2026-09-02 「同意」 — both rulings
independently instructed declaring these two keys, so they land as one change).
⚠️ Shipped as `minor`, not `patch`, because two document classes that validated before now
-REFUSE. objectui#6939 grades this class "patch where the accept set only widens toward what
+REFUSE. The 2026-09-02 ruling grades this class "patch where the accept set only widens toward what
already renders"; this change is not a pure widening, so it takes the level objectui#6896
set for the same transition in this same file — the mirror starting to refuse — and for the
same reason: this repository's `major` is a cross-repo pin to `@objectstack`'s major rather
@@ -40,7 +40,7 @@ documents whose chart was already broken. Class 3 is not: at base it parsed to
`normalizeChartSchema` renders it — `str(123)` is `undefined`, so the read falls back to
`name` and yields `series: [{ dataKey: 'a' }]` (`normalizeChartSchema.ts:239`). So this is a
narrowing away from a document that **renders today**, which is precisely the distinction
-objectui#6939's grading language turns on. `dataKey: null` behaves identically. Measured on
+the 2026-09-02 ruling's grading language turns on. `dataKey: null` behaves identically. Measured on
both states; the declaration itself is right, and this note is the disclosure it was owed.
## Corrected: what class 2 actually did
@@ -95,7 +95,7 @@ would discard them.
## Not done, deliberately
-objectui#6939's `chart` row also says "`series[].data` stops being required". On this base
+The 2026-09-02 ruling's `chart` row also says "`series[].data` stops being required". On this base
it already is not: objectui#6896 replaced it with `retirementTombstone(...)` —
`z.never({ error }).optional()` — which is optional AND refuses any authored value by name.
Implementing the clause literally would re-widen a retired key and reverse a landed ruling,
diff --git a/.changeset/7122-spec-17-3-0-parity-reconciliation.md b/.changeset/7122-spec-17-3-0-parity-reconciliation.md
index 539fc952e3..bf83f8a855 100644
--- a/.changeset/7122-spec-17-3-0-parity-reconciliation.md
+++ b/.changeset/7122-spec-17-3-0-parity-reconciliation.md
@@ -80,10 +80,10 @@ and `@object-ui/plugin-detail` `^17.1.0`, so a floor above the family minimum is
this repo's normal state, not an exception.
⚠️ **Measured on both sides, because it is bump-caused rather than pre-existing
-and objectui#7688 records the opposite.** The gate is a scheduled / push-to-main
+and the card that filed the `[floor-too-low]` finding recorded the opposite.** The gate is a scheduled / push-to-main
workflow that cannot red a pull request, and `main` is green on it — the last
eight runs, most recently at `c2e3cee2c`. On this branch's built tree it exits 1
with CI's own `--cross-check` invocation, and exits 0 with this raise, judging
278 (subpath, symbol) pairs across 19 published packages either way. Its blocking
copy runs on the publish path, so leaving it would have surfaced as a cancelled
-release rather than as a red check. The correction is recorded on objectui#7688.
+release rather than as a red check. The correction is recorded in `639114c4d`, the commit that landed this entry.
diff --git a/.changeset/7295-chat-message-avatar-keys.md b/.changeset/7295-chat-message-avatar-keys.md
index 96c162b710..70df6c355d 100644
--- a/.changeset/7295-chat-message-avatar-keys.md
+++ b/.changeset/7295-chat-message-avatar-keys.md
@@ -35,7 +35,7 @@ behaviour:
admitted-and-stripped before) — enforcement of the declared type, not a new
capability.
-Same precedent as `CheckboxSchema.wrapperClass` (objectui#6938) and the
+Same precedent as `CheckboxSchema.wrapperClass` (`b74a8598d`) and the
objectui#6150 batch. `RuntimeOnlyMessageKeys` in `plugin-chatbot` is untouched;
`SeamChatMessage` inherits the two keys through its `ChatMessage` half. The
three example blocks on `content/docs/plugins/plugin-chatbot.mdx` that PR #7294
diff --git a/.changeset/7313-object-calendar-record-source.md b/.changeset/7313-object-calendar-record-source.md
index 50d5f4eae2..66dc2e5de3 100644
--- a/.changeset/7313-object-calendar-record-source.md
+++ b/.changeset/7313-object-calendar-record-source.md
@@ -4,7 +4,7 @@
`ObjectCalendarSchema` declares the record-source ladder its renderer already
reads — `data`, `staticData`, `objectName` — on both faces, in the shape
-objectui#6939 landed on `object-map` and `object-gantt` (objectui#7313).
+`77cb489b4` landed on `object-map` and `object-gantt` (objectui#7313).
`ObjectCalendar` resolves its records through the shared ladder
(`resolveRecordSourceConfig` in `@object-ui/core`, called from
diff --git a/.changeset/7459-timeline-absent-date-axis-refusal.md b/.changeset/7459-timeline-absent-date-axis-refusal.md
index 6488b748ee..1125b5cc87 100644
--- a/.changeset/7459-timeline-absent-date-axis-refusal.md
+++ b/.changeset/7459-timeline-absent-date-axis-refusal.md
@@ -6,8 +6,8 @@
`ObjectTimeline` refuses an undeclared date axis instead of inventing one
(objectui#7459).
-Steps ① and ② of the three-step sequence the maintainer ruled on objectui#7070
-(2026-09-01, 总监批 #28). House posture, on record with that ruling:
+Steps ① and ② of the three-step sequence the maintainer ruled on 2026-09-01
+(总监批 #28). House posture, on record with that ruling:
日期轴永不虚构 — a date axis is never fabricated.
`ObjectTimeline` resolved its date axis through five declared bindings and then
@@ -23,7 +23,7 @@ Two changes, shipped together because neither is observable alone:
axis renders a diagnostic naming every binding it accepts —
`timeline.startDateField`, `timeline.dateField`, `mapping.date`, and the two
deprecated flat spellings — instead of a chart. The twin of `ObjectGantt`'s
- "Gantt configuration required" screen, in the shape objectui#7070 settled.
+ "Gantt configuration required" screen, in the shape `5f4514f7b` settled.
- **The invented sixth rung is gone**, which is the only thing that makes the
refusal reachable. Added while the floor stood, it would have been dead code;
retired without the refusal, it would have produced exactly the silent
@@ -49,4 +49,4 @@ named (`data-testid="timeline-canvas"`) so that distinction can be measured;
every other terminal state of the component already named itself.
Step ③ of the ruling — the `'created_at'` floors on the two plugin faces —
-stays on objectui#7070 and is deliberately NOT in this change.
+stays for a later change (it landed as `04a67b9dc`) and is deliberately NOT in this change.
diff --git a/.changeset/7470-designer-objectname-not-required.md b/.changeset/7470-designer-objectname-not-required.md
index 1b23a1f266..531f795803 100644
--- a/.changeset/7470-designer-objectname-not-required.md
+++ b/.changeset/7470-designer-objectname-not-required.md
@@ -7,7 +7,7 @@ fix(plugin-map, plugin-gantt): the registrations no longer declare `objectName`
Both renderers read their records from one of three keys (`data`, then
`staticData`, then `objectName`), and the `object-map` / `object-gantt` zod schemas
-enforce "one of the three" through `requireRecordSource` (objectui#6939). The
+enforce "one of the three" through `requireRecordSource` (`77cb489b4`). The
registrations' designer-facing `inputs` still said `objectName` was required, on
`object-map`, `map` and `object-gantt`, so the html tier's validator reported a
`missing-required-prop` error on a block authored on `staticData` or `data` that
diff --git a/.changeset/7499-gantt-non-axis-floors-omitted.md b/.changeset/7499-gantt-non-axis-floors-omitted.md
index c6e627d922..475d97697c 100644
--- a/.changeset/7499-gantt-non-axis-floors-omitted.md
+++ b/.changeset/7499-gantt-non-axis-floors-omitted.md
@@ -6,7 +6,7 @@
Gantt views no longer hand the renderer invented `progress` / `dependencies`
field names (objectui#7499).
-Flavour 3 of objectui#7070 — the half its 2026-09-01 ruling ordered carded
+Flavour 3 of the card whose date-axis half landed as `5f4514f7b` — the half its 2026-09-01 ruling ordered carded
separately and judged on its own terms, ⛔ explicitly forbidding the date-axis
conclusion from being imported. Two faces floored the pair, and app-shell
carries neither key (measured: `|| 'progress'` counts 0 there; the control that
diff --git a/.changeset/7546-chart-series-keys-declared.md b/.changeset/7546-chart-series-keys-declared.md
index 123b480a0f..a184bfe906 100644
--- a/.changeset/7546-chart-series-keys-declared.md
+++ b/.changeset/7546-chart-series-keys-declared.md
@@ -16,7 +16,7 @@ renderer does NOT drop: the normalizer keeps that renderer-internal spelling and
`primary`, but it is not a member of the published pair, so it now refuses at `variant` (below).
Such a document draws a chart today — the normalizer ignores the bad value, or honours `current`
— so this is a narrowing away from something that renders, which is the
-distinction objectui#6939's grading language turns on, and it takes the level objectui#6896 and
+distinction the 2026-09-02 ruling's grading language turns on, and it takes the level objectui#6896 and
objectui#7113 set for the same transition in this same file. This repository's `major` is a
cross-repo pin to `@objectstack`'s major, not a severity dial; the change is announced here.
@@ -79,7 +79,7 @@ is unchanged; objectui#7682 owns that decision.
The object stays non-strict — a truly undeclared key is still stripped, exactly as
`chart-inline-data-retired.test.ts` pins; this change declares what is read, it does not close
the object. The `data` tombstone (objectui#6896) and the at-least-one-binding refinement
-(objectui#6939 / #7113) are untouched. No reader changed.
+(`5f789538d`, objectui#7113) are untouched. No reader changed.
Pinned in `packages/types/src/__tests__/chart-series-keys-7546.test.ts` — the card's fixture
surviving byte-for-byte, each key on the mirror's own `.shape`, each value domain refusing at its
diff --git a/.changeset/7547-forced-path-invented-bindings.md b/.changeset/7547-forced-path-invented-bindings.md
index 81375e7479..449b742a3f 100644
--- a/.changeset/7547-forced-path-invented-bindings.md
+++ b/.changeset/7547-forced-path-invented-bindings.md
@@ -15,7 +15,7 @@ whitelisted it**, with nothing behind the toggle. `galleryViewOptions` now
forwards the view's own declared block (both legacy cover spellings still
cross-fill each other, and `titleField` keeps its `'name'` display floor) and
emits no cover key when the view declared none. Same class and same route as
-objectui#7029 (calendar) and objectui#7070 (gantt dates).
+objectui#7029 (calendar) and `5f4514f7b` (gantt dates).
⚠️ A view that whitelisted `gallery` without a `gallery:` block loses the Gallery
toggle. That is the ADR-0047 rule working: it was only ever offered because this
diff --git a/.changeset/7562-filter-field-type-fourteen-members.md b/.changeset/7562-filter-field-type-fourteen-members.md
index f4825fdd25..1d0c4d55e8 100644
--- a/.changeset/7562-filter-field-type-fourteen-members.md
+++ b/.changeset/7562-filter-field-type-fourteen-members.md
@@ -23,7 +23,7 @@ now validates, as does `{ value, label, type: 'currency' }`.
**Still refused, deliberately.** `string` stays out. It is named nowhere in the renderer
and reaches the text control only by the unrecognised-word fallthrough, so it is
-indistinguishable from a nonsense spelling — the phantom objectui#6939 removed. `text`
+indistinguishable from a nonsense spelling — the phantom `d4493fdbc` removed. `text`
shares that fallthrough but IS named (`valueFamilyForFieldType`'s `fieldType || "text"`),
which is the whole difference between the two. The vocabulary also stays CLOSED: an
unrecognised spelling is still refused, so this is not "`type` stopped being checked".
diff --git a/.changeset/7627-shared-record-source-reader.md b/.changeset/7627-shared-record-source-reader.md
index c3866041c4..901aec2615 100644
--- a/.changeset/7627-shared-record-source-reader.md
+++ b/.changeset/7627-shared-record-source-reader.md
@@ -15,7 +15,7 @@ Six view plugins each spelled that resolution locally — `ObjectCalendar` twice
`ObjectGantt`, `ObjectTree` twice, `ObjectMap`, `ObjectGrid` — and had drifted: three
wrote `?? schema.objectName`, one `|| ''`, one `: undefined`, one an `'object' in
dataConfig` test. They now delegate to one function that states the published
-objectui#6939 record-source ladder (`data`, then `staticData`, then `objectName`) once.
+record-source ladder `77cb489b4` declared (`data`, then `staticData`, then `objectName`) once.
**No behaviour changes.** Each site's pre-collapse expression is transcribed verbatim
into `record-source.behaviourNeutrality-7627.test.ts` and asserted equal to its
@@ -24,7 +24,7 @@ present, data only, `objectName` only, empty `objectName`, empty `data.object`,
`api` / `value` / `staticData` / array-shorthand providers, and nothing bound.
**Two questions stay two questions.** `normalizeListViewSchema`'s gap-fill (#7477,
-ruling B of PR #7628) is untouched and is NOT re-pointed at the new reader: it answers
+ruling B, landed as `00d2fa682`) is untouched and is NOT re-pointed at the new reader: it answers
how `objectName` gets POPULATED when absent, where an already-present `objectName` wins.
The new reader answers which object a block RESOLVES, where the `data` block wins — the
order declared on both published faces in `@object-ui/types` and pinned by
diff --git a/.changeset/7632-shared-record-source-config.md b/.changeset/7632-shared-record-source-config.md
index 7a99cba8f3..668af30d89 100644
--- a/.changeset/7632-shared-record-source-config.md
+++ b/.changeset/7632-shared-record-source-config.md
@@ -7,7 +7,7 @@
'@object-ui/plugin-tree': patch
---
-One shared record-source ladder, five plugins delegate (objectui#7632).
+One shared record-source ladder, five plugins delegate.
`@object-ui/core` publishes `resolveRecordSourceConfig(schema)` — the ONE implementation
of the ruled three-rung record source ladder: `data` first, then `staticData` wrapped as
@@ -16,7 +16,7 @@ of the ruled three-rung record source ladder: `data` first, then `staticData` wr
`resolveRecordSourceObjectName` (`b041b9c0c`) consumes, and it now sits beside it in the same module.
That ladder is published contract on both faces — `packages/types/src/objectql.ts` and its
-zod mirror both ship `.describe()` strings naming `getDataConfig`'s order (objectui#6939,
+zod mirror both ship `.describe()` strings naming `getDataConfig`'s order (`77cb489b4`,
maintainer ruling 2026-09-02), pinned by `objectql-record-source-refinement-6939.test.ts` —
and it was hand-copied into five plugin components with no gate holding them together. A
change to the ruled order had five edit sites and nothing that noticed a missed one; that
diff --git a/.changeset/7638-navigation-url-follows-record-source.md b/.changeset/7638-navigation-url-follows-record-source.md
index 80b8b7de7f..a9f8aca6c4 100644
--- a/.changeset/7638-navigation-url-follows-record-source.md
+++ b/.changeset/7638-navigation-url-follows-record-source.md
@@ -9,8 +9,8 @@ A record-page URL now names the object the clicked rows actually came from, in
`useNavigationOverlay` builds `/{objectName}/record/{id}` out of whatever it is handed,
and both components handed it the bare top-level `schema.objectName` while resolving
-their own rows through the objectui#6939 record-source ladder (`data`, then
-`staticData`, then `objectName`). objectui#6939 published `objectName` as that ladder's
+their own rows through the ruled record-source ladder (`data`, then
+`staticData`, then `objectName`). `77cb489b4` published `objectName` as that ladder's
THIRD RUNG and not as a parallel "page object" concept, so a block has exactly one
record source — and a row fetched through `data.object` whose click built
`/{schema.objectName}/record/{id}` named a record that the URL's own object does not
diff --git a/.changeset/7654-chatbot-display-mode-tombstone.md b/.changeset/7654-chatbot-display-mode-tombstone.md
index 5c8f73d54d..73e9376510 100644
--- a/.changeset/7654-chatbot-display-mode-tombstone.md
+++ b/.changeset/7654-chatbot-display-mode-tombstone.md
@@ -45,7 +45,7 @@ FROM → TO:
- `chatbot-floating` `defaultProps`: `displayMode: 'floating'` is no longer written into
designer-created nodes.
-A control is restated, never deleted into a vacuum (objectui#7070): the restatement of
+A control is restated, never deleted into a vacuum (`5f4514f7b`): the restatement of
the removed control is the tombstone's guidance plus this note.
**Migration.** Delete `displayMode` from any TypeScript literal typed as `ChatbotSchema`
diff --git a/.changeset/7694-chart-series-chart-type-alias-refusal.md b/.changeset/7694-chart-series-chart-type-alias-refusal.md
index 926657bee1..6b31e0bfd9 100644
--- a/.changeset/7694-chart-series-chart-type-alias-refusal.md
+++ b/.changeset/7694-chart-series-chart-type-alias-refusal.md
@@ -83,7 +83,7 @@ mode gains is the NAMED refusal and its guidance, not a narrower accept set.
The object stays non-strict — a truly undeclared key is still stripped, exactly as
`chart-inline-data-retired.test.ts` pins. The six keys objectui#7546 declared, the `data` tombstone
-(objectui#6896) and the at-least-one-binding refinement (objectui#6939 / #7113) are untouched.
+(objectui#6896) and the at-least-one-binding refinement (`5f789538d`, objectui#7113) are untouched.
**No reader changed:** `normalizeSeries` still reads `chartType` first on the internal-shape arrays
its producers hand it; that limb is a reader decision, not this declaration's.
diff --git a/.changeset/7703-chatbot-dark-keys-retired.md b/.changeset/7703-chatbot-dark-keys-retired.md
index e22160adde..b20f0e81c3 100644
--- a/.changeset/7703-chatbot-dark-keys-retired.md
+++ b/.changeset/7703-chatbot-dark-keys-retired.md
@@ -112,6 +112,6 @@ cannot rot into prose.
## Docs
`content/docs/plugins/plugin-chatbot.mdx` gains the restatement of the six removed keys
-with their replacements (objectui#7070: a control is restated, never deleted into a
+with their replacements (`5f4514f7b`: a control is restated, never deleted into a
vacuum), and its three present-tense claims that the `chatbot-floating` props spread is
still unfiltered are corrected to what PR #8077 actually left behind.
diff --git a/.changeset/7722-wrapper-class-five-more.md b/.changeset/7722-wrapper-class-five-more.md
index 49204c01f4..19ac257db6 100644
--- a/.changeset/7722-wrapper-class-five-more.md
+++ b/.changeset/7722-wrapper-class-five-more.md
@@ -4,7 +4,7 @@
Declare `wrapperClass` on `SwitchSchema`, `TextareaSchema`, `DatePickerSchema`,
`SelectSchema` and `ListSchema`, on both faces (objectui#7722 — the read-driven
-residue outside objectui#6938's batch, one key over five more types).
+residue outside the batch `b74a8598d` landed, one key over five more types).
Each of `renderers/form/switch.tsx`, `textarea.tsx`, `date-picker.tsx`,
`select.tsx` and `renderers/data-display/list.tsx` reads `schema.wrapperClass`
@@ -13,11 +13,11 @@ onto its wrapper element, and neither the TypeScript interface (`form.ts`,
`zod/data-display.zod.ts`) declared the key. The reads compiled through
`BaseSchema`'s index signature (objectui#5155) and the values parsed through
`.passthrough()`, admitted unexamined. The same key, on the same class of read,
-is declared on `CheckboxSchema` (objectui#6938), `FileUploadSchema` and
+is declared on `CheckboxSchema` (`b74a8598d`), `FileUploadSchema` and
`FilterBuilderSchema` (objectui#6150); these five were left out only because
their doc pages never listed it.
-**minor, not patch — the published face gains five members.** objectui#6938 and
+**minor, not patch — the published face gains five members.** `b74a8598d` and
objectui#7295 graded a one- or two-key residue `patch` because "the accept set
only widens toward what already renders"; that reasoning still describes the
VALUE dimension here, but this change is the batch shape of objectui#6150
diff --git a/.changeset/7780-object-kanban-record-source.md b/.changeset/7780-object-kanban-record-source.md
index 661707c8a0..004b3e3e0e 100644
--- a/.changeset/7780-object-kanban-record-source.md
+++ b/.changeset/7780-object-kanban-record-source.md
@@ -32,7 +32,7 @@ predicate's wording rather than the renderer's truthiness, so an empty `objectNa
keeps validating.
**⚠️ Not the map / gantt / calendar ladder, and deliberately not built on it.** Those
-three (objectui#6939, objectui#7313) resolve `data` as a `ViewData` PROVIDER BLOCK →
+three (`77cb489b4`, objectui#7313) resolve `data` as a `ViewData` PROVIDER BLOCK →
`staticData` → `objectName` through the shared `resolveRecordSourceConfig`, refined by
`requireRecordSource`. This board has **no** `staticData` rung, reads `data` as a **raw row
array** directly, **has** a `bind` rung the other three never walk, and calls
diff --git a/.changeset/8072-input-wrapper-class-mirrored.md b/.changeset/8072-input-wrapper-class-mirrored.md
index 52aaf6aa86..e731f38582 100644
--- a/.changeset/8072-input-wrapper-class-mirrored.md
+++ b/.changeset/8072-input-wrapper-class-mirrored.md
@@ -12,10 +12,10 @@ all along (`form.ts`, docblock "Input wrapper CSS class"); the zod mirror never
did, so the value rode through `.passthrough()` and
`{ type: 'input', wrapperClass: 42 }` validated GREEN — while the identical
document on any of the other eight `schema.wrapperClass` readers (`checkbox`,
-`file-upload`, `filter-builder` — objectui#6150 / #6938; `switch`, `textarea`,
+`file-upload`, `filter-builder` — objectui#6150 / `b74a8598d`; `switch`, `textarea`,
`date-picker`, `select`, `list` — objectui#7722) was refused at the key.
-**patch, and one step below objectui#6938's patch on the surface dimension.**
+**patch, and one step below `b74a8598d`'s patch on the surface dimension.**
objectui#7722 graded its batch `minor` because five schemas each gained a member
of the shipped `.d.ts`. Nothing of the sort happens here: the published
TypeScript face does not move by one byte — the key was already on it — and only
diff --git a/.changeset/8169-map-refuses-unbound.md b/.changeset/8169-map-refuses-unbound.md
index bd04e859bf..09c3a90a1c 100644
--- a/.changeset/8169-map-refuses-unbound.md
+++ b/.changeset/8169-map-refuses-unbound.md
@@ -13,7 +13,7 @@ binding renders
> Map configuration required — declare `map.locationField` or `map.latitudeField` + `map.longitudeField`
in place of the map, instead of painting an empty one. The principle behind
-objectui#7070 (date axes are never invented) and objectui#5953 (a marker title is never
+the 2026-09-01 date-axis ruling (date axes are never invented) and objectui#5953 (a marker title is never
forged) now covers coordinates as well: bindings are never fabricated, and an unbound
surface refuses.
diff --git a/.changeset/8284-content-channel-per-component.md b/.changeset/8284-content-channel-per-component.md
index 148fc9ccec..95b655bc81 100644
--- a/.changeset/8284-content-channel-per-component.md
+++ b/.changeset/8284-content-channel-per-component.md
@@ -15,8 +15,8 @@ fixed version group never ships `major` (see AGENTS.md 版本号策略).
`.passthrough()` and both keys are optional, so a node carrying the wrong channel
type-checked, parsed green, was preserved by the parse — and then rendered an EMPTY
element. No error at authoring time, none at validation time, none at render time. Seven
-earlier cards repaired one page of that each (objectui#5027, #3900, #6773, #6806, #8197,
-#8234, #6939) before the declaration itself was named.
+earlier changes repaired one page of that each (objectui#5027, #3900, #6773, #6806, #8197,
+#8234, `bfaa1589c`) before the declaration itself was named.
**What changes.** For each component below, the channel its renderer does not read is now
`?: never` on the TypeScript face and refused BY NAME on the zod mirror, with a message
diff --git a/.changeset/8315-sdui-parser-manifest-binding-field-retired.md b/.changeset/8315-sdui-parser-manifest-binding-field-retired.md
index c5e311f59a..0e742e3d7f 100644
--- a/.changeset/8315-sdui-parser-manifest-binding-field-retired.md
+++ b/.changeset/8315-sdui-parser-manifest-binding-field-retired.md
@@ -5,7 +5,7 @@
Retire the `binding: 'field'` arm on the manifest READER and PRODUCER faces, so
`@object-ui/sdui-parser` states one vocabulary instead of two (objectui#8315).
-The 2026-09-07 maintainer ruling on objectui#6950 (director decision batch #69)
+The 2026-09-07 maintainer ruling that `9e37d9b39` landed (director decision batch #69)
retired the zero-writer `'field'` arm under ADR-0049 enforce-or-remove, naming
**one** coordinate: `RegistryConfigLike.inputs[].binding`, the serializer's input
boundary, which PR #8297 narrowed. Two declarations in `types.ts` kept the arm, so
diff --git a/.changeset/8802-8257-8008-kanban-gantt-family-retirement.md b/.changeset/8802-8257-8008-kanban-gantt-family-retirement.md
index 94b29e3a69..5db07cb269 100644
--- a/.changeset/8802-8257-8008-kanban-gantt-family-retirement.md
+++ b/.changeset/8802-8257-8008-kanban-gantt-family-retirement.md
@@ -64,7 +64,7 @@ change.** That arm was the only schema face that ever declared `columns`,
refused `allowCollapse` / `cardTemplates` / `columnWidths` / `titleField` /
`draggable` / `onColumnAdd` / `onCardAdd` by name, and — through
`columns: KanbanColumn[]` — the only one that judged a lane's `cards`
-(objectui#6939).
+(`240b80f31`).
⭐ **The sentence that stood here — «The surviving `ObjectKanbanSchema` face
declares none of them» — is retired, and the two reasons it failed are DIFFERENT
diff --git a/.changeset/8913-object-kanban-columns-declared.md b/.changeset/8913-object-kanban-columns-declared.md
index 1bc7ddff96..d5d91f768f 100644
--- a/.changeset/8913-object-kanban-columns-declared.md
+++ b/.changeset/8913-object-kanban-columns-declared.md
@@ -44,7 +44,7 @@ picklist, and this repository's own typed board fixtures.
carrying `cards`, `limit`, `className` and `collapsed` — exactly the members the
two board implementations read at this change. When a lane carries `cards`, each
card is judged by the one card authority (`KanbanCardSchema`), which is what
-restores objectui#6939's finding: **a card with no `title` is refused again**.
+restores what the kanban repair `240b80f31` established: **a card with no `title` is refused again**.
⚠️ **Dated note, 2026-09-25 — one board implementation remains —
objectui#8932.** Later in this same release `KanbanEnhanced`, the second of the
diff --git a/.changeset/9318-field-rule-verdict-from-lint.md b/.changeset/9318-field-rule-verdict-from-lint.md
index d648ccf474..599b60fe45 100644
--- a/.changeset/9318-field-rule-verdict-from-lint.md
+++ b/.changeset/9318-field-rule-verdict-from-lint.md
@@ -3,7 +3,7 @@
---
The wrong-layer root advisory asks the platform for its verdict instead of keeping
-a second copy of it (objectui#9318).
+a second copy of it.
`rowCanonAdvisory` answered "is this root bound on this surface?" from objectui's
own knowledge — `@object-ui/core`'s detector hard-codes the single root `data`, and
diff --git a/.changeset/9618-record-source-ladder-attribution.md b/.changeset/9618-record-source-ladder-attribution.md
index 32e44a88a1..1a09458424 100644
--- a/.changeset/9618-record-source-ladder-attribution.md
+++ b/.changeset/9618-record-source-ladder-attribution.md
@@ -9,7 +9,7 @@ the function their renderers actually call (objectui#9618).
Their zod `.describe` strings and TS docs said the `data` → `staticData` →
`objectName` ladder is resolved by `getDataConfig`. Neither renderer has had a
function by that name since the ladder moved into `@object-ui/core`'s shared
-`resolveRecordSourceConfig` (objectui#7632), so the text now names that
+`resolveRecordSourceConfig` (`ce2aaefe1`), so the text now names that
function. The ladder order is unchanged, and so is every accepted document.
The `ObjectMapSchema` text still says `getDataConfig`, which is true:
`ObjectMap.tsx` keeps a local wrapper by that name that delegates to the shared
diff --git a/.changeset/readonly-richtext-raw-markup-5498.md b/.changeset/readonly-richtext-raw-markup-5498.md
index c14d4ec2e2..c26d589a52 100644
--- a/.changeset/readonly-richtext-raw-markup-5498.md
+++ b/.changeset/readonly-richtext-raw-markup-5498.md
@@ -3,7 +3,7 @@
---
A readonly `markdown` / `html` / `richtext` form field now renders its content
-FORMATTED instead of showing the user its markup source (objectui#5498).
+FORMATTED instead of showing the user its markup source.
`RichTextField`'s readonly early return rendered `{value}` as a React text child,
so a readonly field of any of those three types displayed the stored markup as
diff --git a/.changeset/retire-theme-component-schema-5489.md b/.changeset/retire-theme-component-schema-5489.md
index 121ce3a106..d5c60bf302 100644
--- a/.changeset/retire-theme-component-schema-5489.md
+++ b/.changeset/retire-theme-component-schema-5489.md
@@ -3,7 +3,7 @@
---
Retire `ThemeComponentSchema` (`type: 'theme'`) — a component kind no renderer
-implemented (objectui#5489).
+implemented.
`packages/types/src/theme.ts` declared a theme-manager **component** carrying
`themes[]`, `activeTheme`, `allowSwitching`, `persistPreference` and
diff --git a/.changeset/retire-theme-switcher-preview-5647.md b/.changeset/retire-theme-switcher-preview-5647.md
index 29633b09ba..cd24159343 100644
--- a/.changeset/retire-theme-switcher-preview-5647.md
+++ b/.changeset/retire-theme-switcher-preview-5647.md
@@ -5,7 +5,7 @@
Retire `ThemeSwitcherSchema` (`type: 'theme-switcher'`) and
`ThemePreviewSchema` (`type: 'theme-preview'`) — the two remaining theme
component kinds, which no renderer implemented — together with
-`ThemeUnionSchema`, the union that after objectui#5489 held only these two
+`ThemeUnionSchema`, the union that after `78cbdb530` held only these two
members (objectui#5647).
`packages/types/src/theme.ts` declared a theme-switcher control (`variant`,
diff --git a/packages/app-shell/src/views/ObjectView.tsx b/packages/app-shell/src/views/ObjectView.tsx
index ff273eb501..24f0be17a6 100644
--- a/packages/app-shell/src/views/ObjectView.tsx
+++ b/packages/app-shell/src/views/ObjectView.tsx
@@ -169,7 +169,7 @@ function substituteFilterTokens(filter: any, scope: FilterTokenScope): any {
* no legal object metadata could ever reach it (objectui#6531 established the
* measurement, and dropped the twin read inside `getRecordDisplayName`).
*
- * ⚠️ WHAT THE SIBLING BRANCHES BELOW ACTUALLY DO (objectui#7070). The sentence
+ * ⚠️ WHAT THE SIBLING BRANCHES BELOW ACTUALLY DO (`5f4514f7b`). The sentence
* above used to end "— the same two-rung shape the calendar and gantt branches
* below already use", and for gantt that was FALSE the whole time it stood: the
* gantt branch floored `startDateField` / `endDateField` at `'start_date'` /
@@ -182,7 +182,7 @@ function substituteFilterTokens(filter: any, scope: FilterTokenScope): any {
* `calendar` key at all; it never floors a date axis (objectui#7029).
* - `ganttViewOptions` below — forwards the declared block, title floored at
* `'name'`, and invents neither date field. Its `'start_date'` / `'end_date'`
- * floors were deleted by objectui#7070; that is what makes `ObjectGantt`'s
+ * floors were deleted by `5f4514f7b`; that is what makes `ObjectGantt`'s
* own "Gantt configuration required" screen reachable from this route.
* - the TIMELINE axis at the two SIBLING FACES — `plugin-list/ListView.tsx`
* and `plugin-view/ObjectView.tsx`. Both floored `startDateField` at
@@ -190,7 +190,7 @@ function substituteFilterTokens(filter: any, scope: FilterTokenScope): any {
* `ListView` carried it as a stated DECISION ("`created_at` stays the last
* resort for a view that declares no date axis anywhere") — two faces
* holding documented and OPPOSITE postures on one field name. That is what
- * objectui#7070 routed to a single ruling instead of settling per-face, and
+ * `5f4514f7b` routed to a single ruling instead of settling per-face, and
* the ruling (2026-09-01, 总监批 #28) answered it as house posture:
* 日期轴永不虚构 — a date axis is never fabricated. Its step ③ deleted both
* floors, so all three faces now forward a declared axis or none, and
@@ -257,7 +257,7 @@ export function calendarViewOptions(viewDef: any): Record | und
/**
* The `options.gantt` config this page hands to `ListView`.
*
- * objectui#7070 — the same class objectui#7029 removed from the calendar branch,
+ * `5f4514f7b` — the same class objectui#7029 removed from the calendar branch,
* reported separately by PR #7062 rather than fixed alongside it. This face used
* to floor `startDateField` at `'start_date'` and `endDateField` at `'end_date'`
* for EVERY object view, declared or not — field names no view had written and
@@ -296,7 +296,7 @@ export function ganttViewOptions(viewDef: any): Record {
/**
* The `options.gallery` config this page hands to `ListView`.
*
- * objectui#7547 — the last surviving member of the objectui#7029 / #7070 /
+ * objectui#7547 — the last surviving member of the objectui#7029 / `5f4514f7b` /
* #7500 class on this face. It floored `imageField` at `'image'` for EVERY
* object view, declared or not: a cover binding no view had written, on a field
* name most objects do not carry.
@@ -313,10 +313,10 @@ export function ganttViewOptions(viewDef: any): Record {
* name this file wrote rather than one the author did. Gallery was offered
* without a block, and stayed watchable only because the renderer happens to
* degrade politely. That is a coincidence, not a design, and it is the same
- * second-order effect objectui#7029 measured for `calendar` and objectui#7070
+ * second-order effect objectui#7029 measured for `calendar` and `5f4514f7b`
* for `gantt`.
*
- * ⚠️ MEASURED BEFORE THE DELETION, the discipline objectui#7070 wrote down:
+ * ⚠️ MEASURED BEFORE THE DELETION, the discipline `5f4514f7b` wrote down:
* #7029's mechanic — delete the literal, let the read site answer — is only
* correct where the read site's answer is honest. `ObjectGallery` floors its
* own `coverField` at `'image'` too, and that rung STAYS: it is the component's
@@ -2965,7 +2965,7 @@ function ObjectViewInner({ dataSource, objects, onEdit, externalRefreshKey }: an
// See `galleryViewOptions`.
gallery: galleryViewOptions(viewDef),
// The gantt config the view DECLARED, title floored at 'name' —
- // never an invented date field (objectui#7070). With no date
+ // never an invented date field (`5f4514f7b`). With no date
// binding to forward, ListView's capability gate stops offering
// the Gantt toggle to a view that configured none, and a view
// forced onto the gantt renderer reaches its refusal screen.
diff --git a/packages/app-shell/src/views/metadata-admin/CelPredicateField.tsx b/packages/app-shell/src/views/metadata-admin/CelPredicateField.tsx
index 0e6247b57f..29c88f3acc 100644
--- a/packages/app-shell/src/views/metadata-admin/CelPredicateField.tsx
+++ b/packages/app-shell/src/views/metadata-admin/CelPredicateField.tsx
@@ -90,7 +90,7 @@ export interface CelPredicateFieldProps {
/**
* The authored key this editor writes (`visibleWhen`, `readonlyWhen`,
* `requiredWhen`) — see `CelSchemaHint.slot`. Naming it lets the wrong-layer
- * advisory take the platform's published per-slot verdict (objectui#9318);
+ * advisory take the platform's published per-slot verdict (`e3cb47624`);
* leaving it unset keeps the local one, which is the right answer for the
* surfaces whose bound roots are not the field-rule set.
*/
diff --git a/packages/app-shell/src/views/metadata-admin/celAuthoring.ts b/packages/app-shell/src/views/metadata-admin/celAuthoring.ts
index 0417616072..b1d0b79f50 100644
--- a/packages/app-shell/src/views/metadata-admin/celAuthoring.ts
+++ b/packages/app-shell/src/views/metadata-admin/celAuthoring.ts
@@ -70,7 +70,7 @@ export interface CelSchemaHint {
roots?: string[];
/**
* The authored KEY this source is the value of — `visibleWhen`,
- * `readonlyWhen`, `requiredWhen` (objectui#9318). Naming it lets the
+ * `readonlyWhen`, `requiredWhen` (`e3cb47624`). Naming it lets the
* wrong-layer advisory take its verdict from `@objectstack/lint`'s published
* `fieldRuleRootIssue`, which judges per SLOT, instead of from a second copy
* of that judgement maintained here.
@@ -207,7 +207,7 @@ interface RowCanonModule {
let rowCanonCached: Promise | null = null;
-/** `@objectstack/lint`'s published per-slot verdict (objectui#9318). */
+/** `@objectstack/lint`'s published per-slot verdict (`e3cb47624`). */
type FieldRuleRootIssue = (slot: string, source: string) => { root: string; message: string } | null;
let fieldRuleVerdictCached: Promise | null = null;
@@ -237,7 +237,7 @@ function loadFieldRuleVerdict(): Promise {
/**
* The authored slots whose bound-root set IS the platform's field-rule set, so
- * `fieldRuleRootIssue`'s verdict answers THIS surface's question (objectui#9318).
+ * `fieldRuleRootIssue`'s verdict answers THIS surface's question (`e3cb47624`).
*
* ⚠️ This is a list of objectui's own surfaces, not a copy of the platform's
* judgement — the judgement itself is read from `@objectstack/lint` at call
@@ -279,8 +279,8 @@ function loadFieldRuleVerdict(): Promise {
*
* So those keep the local instrument. ⛔ Do not extend this list to "tidy up"
* the branch below without re-measuring the surface's bound roots first —
- * narrowing a consumer to fit the API it adopted is the drift objectui#9318
- * exists to stop, and `celAuthoring.fieldRuleVerdict-9318.test.ts` pins both
+ * narrowing a consumer to fit the API it adopted is the drift `e3cb47624`
+ * set out to stop, and `celAuthoring.fieldRuleVerdict-9318.test.ts` pins both
* uncovered surfaces as live controls against exactly that edit.
*/
const FIELD_RULE_VERDICT_SLOTS: readonly string[] = ['visibleWhen', 'readonlyWhen', 'requiredWhen'];
@@ -374,7 +374,7 @@ function loadRowCanon(): Promise {
* `views/metadata-admin/predicate.ts` and never reaches this function — which is
* why the gate below is `scope === 'record'` and not a source pattern.
*
- * ## Where the VERDICT comes from since objectui#9318
+ * ## Where the VERDICT comes from since `e3cb47624`
*
* "Is this root bound on this surface?" is a judgement the platform publishes:
* `@objectstack/lint` exports `fieldRuleRootIssue` / `FIELD_RULE_BOUND_ROOTS`,
@@ -535,7 +535,7 @@ export async function lintCelPredicate(
/* advisory only — never let it break the lint */
}
}
- // Wrong-layer root advisory (objectui#8972, verdict re-homed by objectui#9318)
+ // Wrong-layer root advisory (objectui#8972, verdict re-homed by `e3cb47624`)
// — see `rowCanonAdvisory`. Only in `record` scope, only once the predicate
// parses, only a WARNING.
if (issues.every((i) => i.severity !== 'error') && hint.scope === 'record') {
diff --git a/packages/app-shell/src/views/metadata-admin/clientValidation.ts b/packages/app-shell/src/views/metadata-admin/clientValidation.ts
index 0e16235d20..a426c0b118 100644
--- a/packages/app-shell/src/views/metadata-admin/clientValidation.ts
+++ b/packages/app-shell/src/views/metadata-admin/clientValidation.ts
@@ -833,7 +833,7 @@ async function validateObjectFieldRules(draft: unknown): Promise`.
//
-// `int` / `integer` / `float` / `double` USED to be members (objectui#5853).
+// `int` / `integer` / `float` / `double` USED to be members (`fc62bb490`).
// They were never declared by `TableColumn.type` — they arrived because
// column-inference producers forwarded an object schema's field type verbatim,
// which is also why this key had to be read through an `as any` below. Those
@@ -2553,7 +2553,7 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => {
// Type-aware inline editor. `col.type` is forwarded
// from a producer's column inference, folded onto the
// DECLARED vocabulary at that producer's emit seam
- // (objectui#5853). This used to be
+ // (`fc62bb490`). This used to be
// `(col as any).type as string | undefined` — a cast that
// existed only because the values arriving were not the
// values `TableColumn` declares. They are now, so the read
diff --git a/packages/core/src/data-scope/element-data-source.ts b/packages/core/src/data-scope/element-data-source.ts
index cc2aa37639..46d37ef443 100644
--- a/packages/core/src/data-scope/element-data-source.ts
+++ b/packages/core/src/data-scope/element-data-source.ts
@@ -576,7 +576,7 @@ export const ELEMENT_DATA_SOURCE_KEY = 'dataSource';
* `'object'` kind because the value is a record; the two words are unrelated and
* both are correct here.
*
- * ## Typed as the framework's injected input (objectui#6950)
+ * ## Typed as the framework's injected input (`9e37d9b39`)
*
* `binding` is not a `ComponentInput` member. The maintainer ruling of
* 2026-09-07 answered the card's product question — may an ordinary
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index e1ec4eb898..a1aba3a58f 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -153,7 +153,7 @@ export * from './utils/predicate-fields.js';
export * from './utils/grouping-fields.js';
export * from './utils/normalize-list-view.js';
// The ONE record-source ladder, both halves. `resolveRecordSourceConfig`
-// (objectui#7632) is the PRODUCER — the ruled `data` / `staticData` /
+// (`ce2aaefe1`) is the PRODUCER — the ruled `data` / `staticData` /
// `objectName` ladder, hand-copied into five view plugins with no gate holding
// them together. `resolveRecordSourceObjectName` (`b041b9c0c`) is the READER
// over its output: six view plugins each spelled "the object this block is
@@ -161,7 +161,7 @@ export * from './utils/normalize-list-view.js';
// `objectName`" locally, and had drifted. Both are deliberately SEPARATE from
// the `normalizeListViewSchema` gap-fill above: that one answers how
// `objectName` gets POPULATED when absent (#7477 ruling B), these answer which
-// object a block RESOLVES (the objectui#6939 three-rung ladder). Merging them
+// object a block RESOLVES (the three-rung ladder `77cb489b4` declared). Merging them
// would override one standing ruling or the other.
// A THIRD reading ships beside them since objectui#9571:
// `recordSourceDataArmForType` answers which `data` arm a registered block TYPE
diff --git a/packages/core/src/registry/Registry.ts b/packages/core/src/registry/Registry.ts
index 38300eeadd..69457e1f5b 100644
--- a/packages/core/src/registry/Registry.ts
+++ b/packages/core/src/registry/Registry.ts
@@ -16,7 +16,7 @@ import type { ComponentMeta as CanonicalComponentMeta } from '@object-ui/types';
import type { ComponentConfig } from '@object-ui/types';
// A THIRD `import type` from the same module, for the same reason as the
// second: the line above is the shape objectui#6298's pin reads, so the name
-// the splice below is typed with (objectui#6950) gets its own line.
+// the splice below is typed with (`9e37d9b39`) gets its own line.
import type { InjectedComponentInput } from '@object-ui/types';
import {
ELEMENT_DATA_SOURCE_INPUT,
@@ -424,7 +424,7 @@ function lazyStubFullType(type: string, entry: LazyEntry): string {
* the same component, which the registry allows and tests do constantly, is
* likewise a no-op rather than a growing `inputs` array.
*
- * ## Typed end to end — the cast is gone (objectui#6950)
+ * ## Typed end to end — the cast is gone (`9e37d9b39`)
*
* The spliced element is an `InjectedComponentInput` (`@object-ui/types`): a
* `ComponentInput` plus the framework-set `binding` marker, so it is a plain
diff --git a/packages/core/src/utils/record-source.ts b/packages/core/src/utils/record-source.ts
index 7da95be335..9329347817 100644
--- a/packages/core/src/utils/record-source.ts
+++ b/packages/core/src/utils/record-source.ts
@@ -28,12 +28,12 @@ import type { ViewData } from '@object-ui/types';
* twin's reads *"objectName — the THIRD record source `getDataConfig`
* resolves, after `data` and `staticData`"*, naming `ObjectMap.tsx`'s local
* wrapper; the gantt twin names `resolveRecordSourceConfig` itself), ruled
- * objectui#6939 (2026-09-02) and pinned by
+ * 2026-09-02 (landed as `77cb489b4`) and pinned by
* `objectql-record-source-refinement-6939.test.ts`. **That is this
* function.**
* 2. **How does `objectName` get POPULATED when it is absent?** — the
* authoring-time gap-fill in `normalizeListViewSchema` (objectui#7477,
- * ruling B of PR #7628), where an `objectName` already on the schema WINS
+ * ruling B, landed as `00d2fa682`), where an `objectName` already on the schema WINS
* and the `data` block only fills a gap: *"it can never re-point a binding
* that already resolves."*
*
@@ -116,7 +116,7 @@ export type RecordSourceDataArm = 'view-data' | 'array' | 'undeclared';
/**
* The authored `data` shape a block ON THAT ARM may declare — the DECLARATION
* half of the same per-block ruling {@link authoredDataIsOnTheDeclaredArm}
- * decides at RUNTIME (objectui#9473).
+ * decides at RUNTIME (`ab856ed30`).
*
* ## The contradiction this closes
*
@@ -182,7 +182,7 @@ function authoredDataIsOnTheDeclaredArm(authored: unknown, arm: RecordSourceData
/**
* The block's record source, resolved from the ruled three-rung ladder
- * (objectui#7632), with rung 1 judged against the block's own published `data`
+ * (`ce2aaefe1`), with rung 1 judged against the block's own published `data`
* row (objectui#8348).
*
* ## The ruled contract this is the ONE implementation of
@@ -244,7 +244,7 @@ function authoredDataIsOnTheDeclaredArm(authored: unknown, arm: RecordSourceData
* the ruling reaches it, so it passes `'undeclared'` and nothing about it
* changes here.
*
- * ## The DECLARATION follows the arm too (objectui#9473)
+ * ## The DECLARATION follows the arm too (`ab856ed30`)
*
* The `data` member below is {@link AuthoredRecordSourceData}``, not a flat
* `ViewData`: the arm decides what a site may DECLARE exactly as it decides
diff --git a/packages/fields/src/coerceToSafeValue.ts b/packages/fields/src/coerceToSafeValue.ts
index b2c85ad83c..0280007926 100644
--- a/packages/fields/src/coerceToSafeValue.ts
+++ b/packages/fields/src/coerceToSafeValue.ts
@@ -20,7 +20,7 @@
* before objectui#8580 they had a private one: `String(value)`, which drew a
* childless container for `[]` and the literal `[object Object]` for `{}`
* where `text` draws the No-value affordance and `[Object]`. That module is
- * imported BY the barrel (objectui#5498 extracted it so `RichTextField` could
+ * imported BY the barrel (`4bb940b6e` extracted it so `RichTextField` could
* reach the display pipelines without importing the barrel back), so it
* cannot import the barrel to borrow this helper without re-creating exactly
* the cycle that extraction removed. The helper therefore lives below both
diff --git a/packages/fields/src/index.tsx b/packages/fields/src/index.tsx
index 1377b1eb8e..b0aecedaf4 100644
--- a/packages/fields/src/index.tsx
+++ b/packages/fields/src/index.tsx
@@ -380,7 +380,7 @@ export interface CellRendererProps {
// `coerceToSafeValue` lives in `./coerceToSafeValue.ts` (objectui#8580) so
// that `./widgets/richTextDisplay.js` — a module this barrel imports — can
-// reach it without importing the barrel back (the objectui#5498 cycle). It is
+// reach it without importing the barrel back (the cycle `4bb940b6e` avoided). It is
// re-exported here unchanged: it is part of this package's published surface.
import { coerceToSafeValue } from './coerceToSafeValue.js';
export { coerceToSafeValue };
@@ -3160,7 +3160,7 @@ export function ColorSwatchCellRenderer({ value }: CellRendererProps): React.Rea
* The rich-content display pipelines — `markdown` through the GFM renderer,
* `html`/`richtext` through the sanitizing HTML renderer — live in
* `./widgets/richTextDisplay.js` rather than here, so `RichTextField` can
- * import them without importing this barrel back (objectui#5498). Re-exported
+ * import them without importing this barrel back (`4bb940b6e`). Re-exported
* unchanged: they are part of this package's published surface, and
* `RICH_TEXT_CELL_RENDERERS` below is the one table both the cell resolver and
* the widget's readonly branch read.
@@ -3476,7 +3476,7 @@ function buildStandardCellRendererMap(): Record = ({
*/
const [rowCeiling, setRowCeiling] = useState(null);
const [currentDate, setCurrentDate] = useState(new Date());
- // Disclosure state of the "unscheduled" area (objectui#7071). Collapsed by
+ // Disclosure state of the "unscheduled" area (`bc5870c9f`). Collapsed by
// default, as ruled: the count is always on screen, the list is opt-in.
// Component state is the right home per AGENTS.md §5 #8 — nobody would share
// or bookmark it — and it survives a data refresh because a refetch re-renders
@@ -438,7 +438,7 @@ export const ObjectCalendar: React.FC = ({
// itself as reading, so the call site cannot come to depend on a key the
// ladder does not read.
//
- // ⭐ THE CAST HERE IS GONE (objectui#9473), and its absence is the assertion.
+ // ⭐ THE CAST HERE IS GONE (`ab856ed30`), and its absence is the assertion.
// `data` used to be spelled `schema.data as ViewData | undefined` because the
// shared resolver's PARAMETER declared a flat `data?: ViewData` while its own
// `dataArm` contract — and its `authoredDataIsOnTheDeclaredArm` predicate,
@@ -816,7 +816,7 @@ export const ObjectCalendar: React.FC = ({
queryFilter, schema.sort, refreshKey, objectSchemaReady, objectSchema, perms, invalidationNonce]);
// Transform data to calendar events, and separate out the records that have
- // no date to be placed on at all (objectui#7071 — see the early return in the
+ // no date to be placed on at all (`bc5870c9f` — see the early return in the
// loop below). ONE pass, so the two lists are always answers about the same
// dataset and the count under the calendar can never disagree with the grid.
const { events, unscheduledRecords } = useMemo(() => {
@@ -866,7 +866,7 @@ export const ObjectCalendar: React.FC = ({
const id = record.id || record._id || `event-${index}`;
// NO VALUE in the declared start field means the record has no date —
- // full stop (objectui#7071, ruled 2026-09-01, re-confirmed 2026-09-02).
+ // full stop (`bc5870c9f`, ruled 2026-09-01, re-confirmed 2026-09-02).
// This line used to read `startDate ? new Date(startDate) : new Date()`,
// so a record missing its date was handed THE CURRENT MOMENT and drawn on
// today's cell as an ordinary event. The `isNaN` guard below could not
@@ -925,7 +925,7 @@ export const ObjectCalendar: React.FC = ({
// this card's own defect inverted. UNDECLARED means nothing changes —
// every calendar that never authored the key renders as it did before.
//
- // The `!endDate` arm keeps its objectui#7071 reading unchanged: only a
+ // The `!endDate` arm keeps its `bc5870c9f` reading unchanged: only a
// record that HAS a start reaches this line, so one absent field can no
// longer set two rendered properties. A record without a start is
// unscheduled, not all-day.
@@ -994,7 +994,7 @@ export const ObjectCalendar: React.FC = ({
// `schemaObjectName` resolved above, which already keys this calendar's
// record query and which the detail drawer at the bottom of this file
// resolves the same way. Before this it read the bare `schema.objectName`,
- // so ONE click resolved the drawer through the objectui#6939 ladder and the
+ // so ONE click resolved the drawer through the record-source ladder (`77cb489b4`) and the
// navigation URL through the top-level key — two receivers, one gesture,
// two different objects.
//
@@ -1409,7 +1409,7 @@ export const ObjectCalendar: React.FC = ({
otherwise. Placement follows objectui#7148's chart footnote. */}
{rowCeiling && }
- {/* The "unscheduled" containment area (objectui#7071, ruled 2026-09-01 and
+ {/* The "unscheduled" containment area (`bc5870c9f`, ruled 2026-09-01 and
re-confirmed 2026-09-02). Records with no value in the declared start
field are no longer given a fabricated date, so they are not on the
grid above — they are counted here and listed on demand, which is what
diff --git a/packages/plugin-chatbot/src/renderer.tsx b/packages/plugin-chatbot/src/renderer.tsx
index 066d837c1e..dfcde8353a 100644
--- a/packages/plugin-chatbot/src/renderer.tsx
+++ b/packages/plugin-chatbot/src/renderer.tsx
@@ -481,7 +481,7 @@ ComponentRegistry.register('chatbot-floating',
// selector of presentation, and `` below renders
// unconditionally — while `defaultProps` wrote `'floating'` into every
// designer-created node. The control is restated, not deleted into a
- // vacuum (objectui#7070): the restatement is the `?: never` tombstone on
+ // vacuum (`5f4514f7b`): the restatement is the `?: never` tombstone on
// `ChatbotSchema` / `ChatbotFloatingSchema` in `@object-ui/types` and the
// release note. Stored documents carrying the key are unaffected — it has
// no Zod arm and `BaseSchema` is `.passthrough()`, so they parse exactly
diff --git a/packages/plugin-dashboard/src/ObjectDataTable.tsx b/packages/plugin-dashboard/src/ObjectDataTable.tsx
index bd0a5f6b25..fd082a1558 100644
--- a/packages/plugin-dashboard/src/ObjectDataTable.tsx
+++ b/packages/plugin-dashboard/src/ObjectDataTable.tsx
@@ -118,7 +118,7 @@ interface NormalizedColumn {
* another road? — is part of the rule, not an aside: a key with no second road
* is not inert, and retiring it would change behaviour.
*
- * `type` is not adjudicated here. objectui#5853 already settled it at this
+ * `type` is not adjudicated here. `fc62bb490` already settled it at this
* seam, and its fold (`normalizeTableColumnType`) stands unchanged.
*
* `name` is HELD, not retired, and not adjudicated here either: it is
@@ -336,7 +336,7 @@ export interface ObjectDataTableColumnHolds {}
* The candidate keys this seam refuses — DERIVED from the override vocabulary,
* never hand-listed, so a future `FieldMeta` member has to be adjudicated onto
* {@link ObjectDataTableColumnHolds} to escape. Keys `TableColumn` declares
- * leave the pool by declaration: `type` (objectui#5853 owns its VALUE set,
+ * leave the pool by declaration: `type` (its VALUE set is `fc62bb490`'s,
* folded below by `normalizeTableColumnType`) and, since objectui#6425's
* ruling, `format` / `options` / `currency`.
*
@@ -932,7 +932,7 @@ export const ObjectDataTable: React.FC = ({ schema, dataSo
const inferredAlign = (col as any).align
?? (isNumericFieldMeta(fieldMeta) ? 'right' : undefined);
- // ⭐ THE SECOND EMIT SEAM (objectui#5853). `buildFieldMeta` returns
+ // ⭐ THE SECOND EMIT SEAM (`fc62bb490`). `buildFieldMeta` returns
// `type: overrides.type ?? meta?.type` — the OBJECT SCHEMA's field type —
// which the `...fieldMeta` spread that used to stand here wrote straight
// into the column's `type`, the same verbatim forwarding `ObjectGrid` does
diff --git a/packages/plugin-gantt/src/ObjectGantt.tsx b/packages/plugin-gantt/src/ObjectGantt.tsx
index 3c909c4ec0..5819f54b59 100644
--- a/packages/plugin-gantt/src/ObjectGantt.tsx
+++ b/packages/plugin-gantt/src/ObjectGantt.tsx
@@ -1852,7 +1852,7 @@ export const ObjectGantt: React.FC = ({
? deriveRecordPageHref(resource, recordId)
: null;
// No derivable destination ⇒ do nothing, exactly as before. An invented
- // URL would be the fabrication objectui#7070 spent this file's other
+ // URL would be the fabrication the invented-binding work (`5f4514f7b`) spent this file's other
// branches removing.
if (!href) return;
if (action === 'new_window') {
diff --git a/packages/plugin-gantt/src/index.tsx b/packages/plugin-gantt/src/index.tsx
index 4182bf31c0..f58aaed97c 100644
--- a/packages/plugin-gantt/src/index.tsx
+++ b/packages/plugin-gantt/src/index.tsx
@@ -114,7 +114,7 @@ export const ObjectGanttRenderer: React.FC<{ schema: any }> = elementDataSourceB
// `objectName` is NOT a required input (objectui#7470): `getDataConfig` reads
// `data`, then `staticData`, then `objectName`, and the `object-gantt` zod
-// schema (`requireRecordSource`, objectui#6939) is where "one of the three" is
+// schema (`requireRecordSource`, `77cb489b4`) is where "one of the three" is
// enforced. The input list is a flat declaration with a boolean `required`, so
// it states the rule in the description rather than growing a one-of form.
//
diff --git a/packages/plugin-grid/src/ObjectGrid.tsx b/packages/plugin-grid/src/ObjectGrid.tsx
index 64aa5b9781..597881f3a7 100644
--- a/packages/plugin-grid/src/ObjectGrid.tsx
+++ b/packages/plugin-grid/src/ObjectGrid.tsx
@@ -701,8 +701,8 @@ export interface ObjectGridComponentProps extends ObjectGridExternalPaginationPr
*
* The ruled three-rung ladder itself (`data`, then `staticData`, then
* `objectName`) is `resolveRecordSourceConfig` in `@object-ui/core` — ONE
- * implementation of a contract published on both faces (objectui#6939), which
- * this file used to hand-copy (objectui#7632).
+ * implementation of a contract published on both faces (`77cb489b4`), which
+ * this file used to hand-copy (`ce2aaefe1`).
*
* What used to stay here was the head above it: the bare-array `data`
* shorthand, which lifted `data: [...]` to `{ provider: 'value', items }`.
@@ -912,8 +912,8 @@ function normalizeColumns(
* consumer reads it, which is the same test that retired it when the
* consumer did not exist.
* - `options` — RETIRED (see the enrichment pass below).
- * - `type` — not adjudicated here; objectui#5853 owns its VALUE set and its
- * fold still stands. It is the one member whose vocabulary differs between
+ * - `type` — not adjudicated here; its VALUE set was settled by `fc62bb490`,
+ * whose fold still stands. It is the one member whose vocabulary differs between
* the two types below.
* - `name` — not emitted by this producer at all, so objectui#5120's alias
* never needed a hold here. Tombstoned only in the sense that nothing writes
@@ -987,7 +987,7 @@ export interface ObjectGridColumnHolds {
* still the producer's raw inference vocabulary (`@objectstack/spec`'s
* `FieldType`, 49 values) rather than the EIGHT-literal union `TableColumn`
* declares (`TABLE_COLUMN_TYPES`: `text`, `number`, `date`, `datetime`,
- * `currency`, `percent`, `boolean`, `action`). objectui#5853 folds it
+ * `currency`, `percent`, `boolean`, `action`). `fc62bb490` folds it
* downstream, in a pass that is deliberately separate from the enrichment map —
* so the pre-fold shape needs a name, and this is it.
*
@@ -3940,7 +3940,7 @@ export const ObjectGrid: React.FC = ({
}
return next;
})
- // ⭐ THE EMIT SEAM (objectui#5853, maintainer ruling 2026-08-25, Option B).
+ // ⭐ THE EMIT SEAM (`fc62bb490`, maintainer ruling 2026-08-25, Option B).
//
// Every column this component hands to `data-table` passes through here, so
// it is the one place that can guarantee `TableColumn.type` only ever holds
diff --git a/packages/plugin-list/src/ListView.tsx b/packages/plugin-list/src/ListView.tsx
index bba20752bd..2fc23db134 100644
--- a/packages/plugin-list/src/ListView.tsx
+++ b/packages/plugin-list/src/ListView.tsx
@@ -182,7 +182,7 @@ function resolveListMapConfig(schema: { map?: unknown; options?: { map?: unknown
* legacy leg reads BEFORE its `'name'` / `'value'` floors. A block that
* declares neither reaches the renderer only through the schema-viewType
* leg, where those floors invent a binding; retiring THAT is objectui#7547
- * (the #7029 / #7070 family) and is out of scope here. The gate simply
+ * (the #7029 / `5f4514f7b` family) and is out of scope here. The gate simply
* never offers a switch into it.
*/
interface ListChartBinding {
@@ -3383,7 +3383,7 @@ export const ListView = React.forwardRef(({
timeline: Object.keys(resolvedTimeline).length > 0 ? resolvedTimeline : undefined,
// Deprecated top-level props for backward compat.
//
- // objectui#7070 step ③ — house posture, entered on the maintainer's
+ // `04a67b9dc` (step ③) — house posture, entered on the maintainer's
// ruling of 2026-09-01 (总监批 #28): 日期轴永不虚构 — a date axis is
// never fabricated. The two lines of prose that used to sit here
// ("`created_at` stays the last resort for a view that declares no
@@ -3416,7 +3416,7 @@ export const ListView = React.forwardRef(({
};
}
case 'gantt': {
- // objectui#7070: only ever restate a binding the view actually DECLARED
+ // `5f4514f7b`: only ever restate a binding the view actually DECLARED
// — the same correction objectui#7029 made to the calendar branch above,
// which fenced this one out and reported it separately. These two keys
// used to be floored at 'start_date' / 'end_date', field names no view
@@ -3430,7 +3430,7 @@ export const ListView = React.forwardRef(({
// `plugin-gantt/src/ObjectGantt.unconfiguredRefusal-7070.test.tsx`.
//
// `progressField` / `dependenciesField` are NOT floored either, as of
- // objectui#7499 — the flavour-3 card #7070 scoped out and left pinned
+ // objectui#7499 — the flavour-3 card `5f4514f7b` scoped out and left pinned
// here so that whoever retired them had a place to declare it. This is
// that declaration. The remedy is OMIT, not refuse, and the two differ:
//
@@ -3438,7 +3438,7 @@ export const ListView = React.forwardRef(({
// "no dependencies" are legitimate and common states — most gantt
// rows have neither — so an absent key must keep rendering exactly
// as it does today. That is why the date-axis conclusion (refuse)
- // must NOT be imported here, and #7070's ruling forbids importing it.
+ // must NOT be imported here, and the 2026-09-01 ruling forbids importing it.
// - FABRICATING was also wrong. `|| 'progress'` / `|| 'dependencies'`
// manufactured a binding the author never wrote. Its failure is a
// per-row `undefined`, indistinguishable from the legitimate case
@@ -3556,7 +3556,7 @@ export const ListView = React.forwardRef(({
// (objectui#5000, objectui#4941).
//
// ⛔ NO `locationField: … || 'location'` FLOOR (objectui#8169 — ruled
- // 2026-09-07 「同意」, option B; the same correction objectui#7070 made
+ // 2026-09-07 「同意」, option B; the same correction `5f4514f7b` made
// to the gantt date axes and objectui#7029 to the calendar). It stood
// here as a duplicate of `getMapConfig`'s own default branch, and its
// real effect was to SHADOW half of it: the floor forced the flat
@@ -3636,7 +3636,7 @@ export const ListView = React.forwardRef(({
// The two floors below are reached only when NOTHING was declared —
// i.e. through the schema-viewType leg, never through the capability
// gate, which refuses to offer a switch into an invented binding. The
- // floors themselves are objectui#7547 (#7029 / #7070 family) and are
+ // floors themselves are objectui#7547 (#7029 / `5f4514f7b` family) and are
// deliberately untouched here.
const valueField = chartBinding.valueField || 'value';
const categoryField = chartBinding.categoryField || 'name';
diff --git a/packages/plugin-map/src/ObjectMap.tsx b/packages/plugin-map/src/ObjectMap.tsx
index 93ab3b397d..b1993c9ae2 100644
--- a/packages/plugin-map/src/ObjectMap.tsx
+++ b/packages/plugin-map/src/ObjectMap.tsx
@@ -149,8 +149,8 @@ const FLAT_MAP_CONFIG_KEYS = (Object.keys(ObjectMapConfigSchema.shape) as (keyof
*
* The ruled three-rung ladder itself (`data`, then `staticData`, then
* `objectName`) is `resolveRecordSourceConfig` in `@object-ui/core` — ONE
- * implementation of a contract published on both faces (objectui#6939), which
- * this file used to hand-copy (objectui#7632).
+ * implementation of a contract published on both faces (`77cb489b4`), which
+ * this file used to hand-copy (`ce2aaefe1`).
*
* What used to stay here was the head above it: the array shorthand, which
* lifted `data: [...]` to `{ provider: 'value', items }`.
@@ -445,7 +445,7 @@ function getMapConfig(schema: MapConfigSource): ObjectMapConfig {
// record". The premise held; the ruling reverses its conclusion — that is
// exactly why the answer is a REFUSAL rather than a guess. Bindings are
// never fabricated; an unbound surface refuses. The same principle as
- // 「日期轴永不虚构」 behind objectui#7070 (date axes) and
+ // 「日期轴永不虚构」 behind the 2026-09-01 ruling (date axes, 总监批 #28) and
// objectui#8168 (the chart category axis), generalised one field over.
//
// What the guesses actually shipped was the silent-credible-wrong shape
@@ -764,7 +764,7 @@ export const ObjectMap: React.FC = ({
/**
* The object this map is BOUND to — the resolved record source's object when
* it names one, else the schema's own `objectName` (`b041b9c0c`, the
- * objectui#6939 ladder). Hoisted to render scope so the definition read below
+ * ladder `77cb489b4` declared). Hoisted to render scope so the definition read below
* keys on one named value instead of re-deriving the ladder inline.
*/
const recordSourceObjectName = resolveRecordSourceObjectName(schema, dataConfig);
diff --git a/packages/plugin-map/src/index.tsx b/packages/plugin-map/src/index.tsx
index 58dd616441..73778ebc80 100644
--- a/packages/plugin-map/src/index.tsx
+++ b/packages/plugin-map/src/index.tsx
@@ -61,7 +61,7 @@ export const ObjectMapRenderer: React.FC = elementDataSourceBlock(({ schema
// `objectName` is NOT a required input (objectui#7470): `getDataConfig` reads
// `data`, then `staticData`, then `objectName`, and the `object-map` zod schema
-// (`requireRecordSource`, objectui#6939) is where "one of the three" is
+// (`requireRecordSource`, `77cb489b4`) is where "one of the three" is
// enforced. The input list is a flat declaration with a boolean `required`, so
// it states the rule in the description rather than growing a one-of form.
//
diff --git a/packages/plugin-timeline/src/ObjectTimeline.tsx b/packages/plugin-timeline/src/ObjectTimeline.tsx
index 6506ec912e..c7aae01e6d 100644
--- a/packages/plugin-timeline/src/ObjectTimeline.tsx
+++ b/packages/plugin-timeline/src/ObjectTimeline.tsx
@@ -525,7 +525,7 @@ export const ObjectTimeline: React.FC = ({
// resolved, so every record read a key no object carries, found nothing, and
// bucketed into "No date" — a timeline that looks built
// and is not. It also made a refusal screen unreachable by construction,
- // which is why the maintainer ruling (2026-09-01, objectui#7070, 总监批 #28)
+ // which is why the maintainer ruling (2026-09-01, 总监批 #28)
// ordered the floor retired and the refusal added as ONE change. House
// posture, on record with that ruling: 日期轴永不虚构 — a date axis is never
// fabricated. `undefined` from here is therefore a real answer, and the
@@ -810,7 +810,7 @@ export const ObjectTimeline: React.FC = ({
* Until objectui#7459 the resolver above ended in a fabricated literal, so a
* name ALWAYS resolved and this branch could never have been taken — a
* refusal screen that is present and unreachable. The maintainer ruling
- * (2026-09-01, objectui#7070, 总监批 #28) ordered the two as one sequence for
+ * (2026-09-01, 总监批 #28) ordered the two as one sequence for
* exactly that reason, and the other order is no better: retiring the floor
* with no refusal leaves every record reading a key that is not there and
* bucketing into "No date". Neither half is observable alone; the pin
diff --git a/packages/plugin-timeline/src/useTimelineTranslation.ts b/packages/plugin-timeline/src/useTimelineTranslation.ts
index c02661e28d..77b485bf4b 100644
--- a/packages/plugin-timeline/src/useTimelineTranslation.ts
+++ b/packages/plugin-timeline/src/useTimelineTranslation.ts
@@ -82,7 +82,7 @@ export const TIMELINE_DEFAULT_TRANSLATIONS: Record = {
// It became REACHABLE in the same change that retired the renderer's own
// invented field name from the end of the resolver chain; before that a name
// always resolved and this string could never have rendered. House posture
- // (maintainer, 2026-09-01, objectui#7070): 日期轴永不虚构 — a date axis is
+ // (maintainer, 2026-09-01, 总监批 #28): 日期轴永不虚构 — a date axis is
// never fabricated.
//
// `{{fields}}` is a hole rather than prose for the reason
diff --git a/packages/plugin-tree/src/ObjectTree.tsx b/packages/plugin-tree/src/ObjectTree.tsx
index 19a322e074..efc3263e4f 100644
--- a/packages/plugin-tree/src/ObjectTree.tsx
+++ b/packages/plugin-tree/src/ObjectTree.tsx
@@ -1059,7 +1059,7 @@ export const ObjectTree: React.FC = ({
// read untouched.
navigation: (schema as any).navigation,
// The record-page URL names the object the ROWS came from, not the block's
- // bare top-level key (`2ce2612df`). objectui#6939 published `objectName`
+ // bare top-level key (`2ce2612df`). `77cb489b4` published `objectName`
// as the THIRD RUNG of ONE record-source ladder (`data`, then `staticData`,
// then `objectName`) rather than as a parallel "page object" concept, so a
// block has exactly one record source. A row fetched through
diff --git a/packages/plugin-view/src/ObjectView.tsx b/packages/plugin-view/src/ObjectView.tsx
index e8149a74f9..1738952c36 100644
--- a/packages/plugin-view/src/ObjectView.tsx
+++ b/packages/plugin-view/src/ObjectView.tsx
@@ -1909,7 +1909,7 @@ export const ObjectView: React.FC = ({
...(viewOptions.gallery || {}),
};
case 'timeline': {
- // objectui#7070 step ③: the SECOND route to `ObjectTimeline`, fixed the
+ // `04a67b9dc` (step ③): the SECOND route to `ObjectTimeline`, fixed the
// same way objectui#7029 fixed the calendar branch above.
// `generateViewSchema` runs precisely when no host supplied
// `renderListView` — the authored `object-view` element — so it never
@@ -1938,7 +1938,7 @@ export const ObjectView: React.FC = ({
};
}
case 'gantt':
- // objectui#7070: only ever restate a binding the view actually DECLARED
+ // `5f4514f7b`: only ever restate a binding the view actually DECLARED
// — the same correction objectui#7029 made to the calendar branch above.
// `startDateField` / `endDateField` used to be floored at 'start_date' /
// 'end_date', field names no view had written and most objects do not
@@ -1949,7 +1949,7 @@ export const ObjectView: React.FC = ({
// `plugin-gantt/src/ObjectGantt.unconfiguredRefusal-7070.test.tsx`.
//
// `progressField` / `dependenciesField` are NOT floored either, as of
- // objectui#7499 — the flavour-3 card #7070 scoped out and left pinned
+ // objectui#7499 — the flavour-3 card `5f4514f7b` scoped out and left pinned
// here so that whoever retired them had a place to declare it. OMIT,
// not refuse: "no progress" and "no dependencies" are legitimate and
// common states (unlike an absent date axis), so refusing would break
diff --git a/packages/react/src/hooks/useNavigationOverlay.ts b/packages/react/src/hooks/useNavigationOverlay.ts
index c418d72766..e99693675f 100644
--- a/packages/react/src/hooks/useNavigationOverlay.ts
+++ b/packages/react/src/hooks/useNavigationOverlay.ts
@@ -250,7 +250,7 @@ export interface NavigationOverlayState {
* ## What to hand `objectName`
*
* The block's RECORD SOURCE — the object the clicked rows actually came from —
- * and never a bare top-level `schema.objectName` read in its place. objectui#6939
+ * and never a bare top-level `schema.objectName` read in its place. `77cb489b4`
* published `objectName` as the THIRD RUNG of one record-source ladder (`data`,
* then `staticData`, then `objectName`), not as a parallel "page object"
* concept, so a block has exactly ONE record source. `handleClick` below builds
diff --git a/packages/sdui-parser/src/index.ts b/packages/sdui-parser/src/index.ts
index becb81e74a..353e246d7c 100644
--- a/packages/sdui-parser/src/index.ts
+++ b/packages/sdui-parser/src/index.ts
@@ -108,7 +108,7 @@ export interface RegistryConfigLike {
required?: boolean;
enum?: Array;
/**
- * The binding marker — exactly `'object'` (objectui#6950).
+ * The binding marker — exactly `'object'` (`9e37d9b39`).
*
* `'field'` was declared beside it from the first draft of ADR-0080 §6.3
* and never written: every `binding:` literal in `packages/`, `apps/`
diff --git a/packages/sdui-parser/src/types.ts b/packages/sdui-parser/src/types.ts
index 0d815d6f9b..46ec8cfb90 100644
--- a/packages/sdui-parser/src/types.ts
+++ b/packages/sdui-parser/src/types.ts
@@ -213,7 +213,7 @@ export interface ManifestValidationResult {
* array. So the subset relation that licenses a permissive READER runs the
* other way here — a wider union accepts nothing extra, it obliges every
* consumer to handle an arm this package cannot emit. That is why the
- * retired `'field'` arm (objectui#6950 on the input boundary, objectui#8315
+ * retired `'field'` arm (`9e37d9b39` on the input boundary, objectui#8315
* here) is gone from this end as well; the measurements are on
* {@link ManifestInput.binding}.
*/
diff --git a/packages/types/src/base.ts b/packages/types/src/base.ts
index b4a725a109..33b3b21241 100644
--- a/packages/types/src/base.ts
+++ b/packages/types/src/base.ts
@@ -653,7 +653,7 @@ export type ComponentInputControlType =
* `binding` is deliberately NOT a member. The manifest serializer forwards it
* and `validateTree` reads it, but no registration authors it: the key is set
* by the framework's injected input, {@link InjectedComponentInput}, at the
- * one seam that splices it in (objectui#6950, maintainer ruling of
+ * one seam that splices it in (`9e37d9b39`, maintainer ruling of
* 2026-09-07). Writing it here is therefore an excess-property `tsc` error,
* on purpose — see that declaration for the ruling and the measurement.
*/
@@ -819,7 +819,7 @@ export interface ComponentInput {
* list per input, `of` included since objectui#8067 (`name`, `type`, `of`,
* `required`, `enum`, `binding`, `description` — `binding` among them is
* not an authored key but the framework's, forwarded from
- * {@link InjectedComponentInput}, objectui#6950), its boundary type has no slot for these, the registry's
+ * {@link InjectedComponentInput}, `9e37d9b39`), its boundary type has no slot for these, the registry's
* data-source seam reads `name` only, and neither the designer nor the
* app-shell inspectors consult registry `inputs` at all. The one
* non-test touch was a WRITE (`WidgetRegistry` copying the widget-manifest
@@ -931,7 +931,7 @@ export interface ComponentInput {
* per input — `name`, `type`, `of`, `required`, `enum`, `binding`,
* `description`, the last of them added by objectui#8067; `binding` is the
* framework's key, forwarded from {@link InjectedComponentInput} rather
- * than authored (objectui#6950) —
+ * than authored (`9e37d9b39`) —
* so a value authored here could not reach the published
* `sdui.manifest.json` even in principle. A structural census over every
* `inputs:` array in the repository found ZERO authoring sites for the four
@@ -985,7 +985,7 @@ export interface ComponentInput {
/**
* The input the FRAMEWORK injects into a registration: a {@link ComponentInput}
* plus the `binding` marker — which is why `binding` is not a member of
- * `ComponentInput` itself (objectui#6950; maintainer ruling of 2026-09-07,
+ * `ComponentInput` itself (`9e37d9b39`; maintainer ruling of 2026-09-07,
* director decision batch #69: `binding` is framework-set, not
* author-declared).
*
@@ -1010,7 +1010,7 @@ export interface ComponentInput {
* question the card asked — may an ordinary registration declare a binding
* input? — with **no**, so `ComponentInput` refuses the key the ordinary way
* (an excess-property `tsc` error at the registration site) and the ONE place
- * that may write it is typed by this declaration. Until objectui#6950 it was
+ * that may write it is typed by this declaration. Until `9e37d9b39` it was
* typed by a hand-written inline literal and reached the `inputs` array
* through an `as ComponentMeta` cast — a cast at the only write site is
* exactly what would have hidden any later drift between the constant and
@@ -1031,7 +1031,7 @@ export interface ComponentInput {
*
* The vocabulary is exactly `'object'`. The serializer's boundary type once
* also admitted `'field'`; that arm had zero writers and was retired with
- * this declaration (ADR-0049 enforce-or-remove, objectui#6950) — see
+ * this declaration (ADR-0049 enforce-or-remove, `9e37d9b39`) — see
* `RegistryConfigLike` in `packages/sdui-parser/src/index.ts`.
*/
export interface InjectedComponentInput extends ComponentInput {
diff --git a/packages/types/src/complex.ts b/packages/types/src/complex.ts
index 4df3e69426..d7063a9c00 100644
--- a/packages/types/src/complex.ts
+++ b/packages/types/src/complex.ts
@@ -131,11 +131,11 @@ export interface KanbanColumn {
*
* Named `cards` because that is what the board reads and every authored
* document writes: `KanbanImpl` and `bucketCardsIntoColumns` read
- * `column.cards` (measured at objectui#6939: 12 lines in `KanbanImpl`, and 8
+ * `column.cards` (measured at `240b80f31`: 12 lines in `KanbanImpl`, and 8
* in `KanbanEnhanced` until objectui#8932 deleted it), and the two catalog
* entries, the plugin docs and `content/docs/api/schema-reference.md` all
* author it. The retired declarative face spelled this `items` until
- * objectui#6939 — a spelling with zero read sites, which made every authored
+ * `240b80f31` — a spelling with zero read sites, which made every authored
* board fail `safeValidateSchema` while rendering correctly (objectui#6318's
* bucket).
*/
@@ -539,7 +539,7 @@ export interface FilterBuilderCondition {
}
/**
- * Filter group — the shape `FilterBuilder` reads (objectui#6939, the
+ * Filter group — the shape `FilterBuilder` reads (`d4493fdbc`, the
* `filter-builder` group; maintainer ruling 2026-09-02, director seat summon
* #8, verbatim 「同意」).
*
@@ -704,7 +704,7 @@ export interface FilterBuilderSchema extends BaseSchema {
/**
* Filter field definition — one entry of `FilterBuilderSchema.fields`
- * (objectui#6939, same ruling).
+ * (`d4493fdbc`, same ruling).
*
* Renamed from `name` to `value`: every read site matches on `value`
* (`fields.find((f) => f.value === …)` in `getOperatorsForField`,
@@ -740,7 +740,7 @@ export interface FilterField {
*
* `string` is still absent and is the contrast that makes the rest read: it
* is named nowhere in the renderer and reaches the text control only by the
- * unrecognised-word fallthrough, so it is a phantom (objectui#6939). `text`
+ * unrecognised-word fallthrough, so it is a phantom (`d4493fdbc`). `text`
* shares that fallthrough but IS named — line 408 is where an absent `type`
* acquires it — which is why one is declared and the other is not.
*/
@@ -1507,7 +1507,7 @@ export interface ChatbotSchema extends BaseSchema {
* (`GridField`, `MasterDetailForm`); the same pass over `floatingConfig`, a
* key that IS read, returned 79 lines, so the instrument was not blind. The
* control and the seed are removed in the same change; the restatement of
- * that control is this tombstone plus the release note (objectui#7070: a
+ * that control is this tombstone plus the release note (`5f4514f7b`: a
* control is restated, never deleted into a vacuum).
*
* ## Why a tombstone — discriminator prong 2 — and why it is loud-vs-silent here
diff --git a/packages/types/src/data-display.ts b/packages/types/src/data-display.ts
index 8e9f247b51..9b20c93e11 100644
--- a/packages/types/src/data-display.ts
+++ b/packages/types/src/data-display.ts
@@ -306,7 +306,7 @@ export interface ListSchema extends BaseSchema {
* READ SITE: `packages/components/src/renderers/data-display/list.tsx:27` —
* `cn("space-y-2", schema.wrapperClass)`. Undeclared until
* objectui#7722, surviving only on `BaseSchema`'s index signature: the same
- * key, on the same class of read, that `CheckboxSchema` (objectui#6938),
+ * key, on the same class of read, that `CheckboxSchema` (`b74a8598d`),
* `FileUploadSchema` and `FilterBuilderSchema` (objectui#6150) declare.
* Distinct from `className`, which the renderer hands to the `ul` / `ol`.
*/
@@ -461,7 +461,7 @@ export interface TableSortItem {
/**
* Every `type` spelling a `TableColumn` may carry — the canonical value set for
- * this key (objectui#5853, maintainer ruling 2026-08-25, Option B: the 8-literal
+ * this key (`fc62bb490`, maintainer ruling 2026-08-25, Option B: the 8-literal
* interface union is canonical).
*
* This tuple is the SINGLE declaration of that vocabulary. `TableColumnSchema`
@@ -479,7 +479,7 @@ export type TableColumnType = (typeof TABLE_COLUMN_TYPES)[number];
/**
* Undeclared `type` spellings the data-table renderer used to read, folded onto
- * the canonical spelling they mean (objectui#5853).
+ * the canonical spelling they mean (`fc62bb490`).
*
* These are NOT part of the published vocabulary and deliberately do not appear
* in {@link TABLE_COLUMN_TYPES}: the ruling rejected alias proliferation, so the
@@ -503,7 +503,7 @@ const TABLE_COLUMN_TYPE_ALIASES: Readonly> = {
/**
* Fold an inferred column type onto the canonical {@link TableColumnType}
- * vocabulary, for use at a producer's emit seam (objectui#5853).
+ * vocabulary, for use at a producer's emit seam (`fc62bb490`).
*
* Column inference reads an OBJECT SCHEMA's field type, whose vocabulary is
* `@objectstack/spec`'s `FieldType` — 49 values, only 7 of which are members of
@@ -1785,7 +1785,7 @@ export interface TreeViewSchema extends BaseSchema {
* tree-view (`{ type: 'tree-view', bind: 'treeNodes' }`) is a legal,
* rendering document because `bind` is the FIRST source the renderer reads.
*
- * History: REQUIRED until objectui#6939 / PR #7533 made it optional (it had
+ * History: REQUIRED until `777e5c6f4` (PR #7533) made it optional (it had
* refused four catalog entries the renderer draws correctly). That PR kept
* it DECLARED because {@link BaseSchema} declares `data?: any` (zod twin
* `z.any().optional()`), so deleting the member would ADMIT the key
@@ -1808,7 +1808,7 @@ export interface TreeViewSchema extends BaseSchema {
*
* Declared by objectui#6150, which deliberately stopped at the declaration:
* `{ type: 'tree-view', nodes }` only became a LEGAL document at
- * objectui#6939 (PR #7533), the accept-set change that relaxed the then
+ * `777e5c6f4` (PR #7533), the accept-set change that relaxed the then
* required `data`; objectui#6951 retired that `data` spelling outright (the
* tombstone above). The registration's own `inputs` and `defaultProps`
* spell it `nodes`, and the four catalog entries ARE those `defaultProps`.
@@ -1984,7 +1984,7 @@ export interface ChartDataSeries {
* Series name — also selects this series' column within each chart-level
* `data` row when {@link dataKey} is absent.
*
- * ⚠️ OPTIONAL since objectui#6939 (maintainer ruling 2026-09-02, the `chart`
+ * ⚠️ OPTIONAL since `5f789538d` (maintainer ruling 2026-09-02, the `chart`
* row): `normalizeSeries` reads `str(raw.dataKey) ?? str(raw.name)`, so
* `dataKey` alone is a complete binding and the required flag refused a
* document the renderer draws. At least one of the two must still be present
diff --git a/packages/types/src/field-types.ts b/packages/types/src/field-types.ts
index 039d7c6dcc..27b35c1639 100644
--- a/packages/types/src/field-types.ts
+++ b/packages/types/src/field-types.ts
@@ -270,7 +270,7 @@ export interface MarkdownFieldMetadata extends BaseFieldMetadata {
* metadata may carry it on these four types and nowhere else.
*
* ⛔ This reverses what this docblock asserted between `0e3b3be09` and
- * objectui#7635: at 17.2.0 the key WAS refused by name, and the sentence
+ * `544ecba84`: at 17.2.0 the key WAS refused by name, and the sentence
* saying so outlived the contract it described. Both directions, each behind
* an accepting control, are re-derived by
* `__tests__/select-option-spec-extension-7014.test.ts` — read that file's
@@ -294,7 +294,7 @@ export interface HtmlFieldMetadata extends BaseFieldMetadata {
* docblock there): `RichTextField` reads it for all three registry keys it
* serves. It is a DECLARED spec key on this type too, type-gated to the four
* multiline editor types; see the measured reading in the docblock there
- * (`0e3b3be09`, corrected for the 17.3.0 boundary by objectui#7635).
+ * (`0e3b3be09`, corrected for the 17.3.0 boundary by `544ecba84`).
*/
rows?: number;
}
@@ -303,7 +303,7 @@ export interface HtmlFieldMetadata extends BaseFieldMetadata {
* Rich-text (WYSIWYG) field metadata — the THIRD registry key `RichTextField`
* serves, and the last of the three to get a declarable face.
*
- * `markdown`, `html` and `richtext` are ONE widget (objectui#5498). The first
+ * `markdown`, `html` and `richtext` are ONE widget (`4bb940b6e`). The first
* two carried an exported metadata type; `richtext` carried none, so the only
* way to write a richtext field's metadata was
* `as unknown as MarkdownFieldMetadata` — a deliberate cast whose presence in
@@ -379,7 +379,7 @@ export interface HtmlFieldMetadata extends BaseFieldMetadata {
*
* The `rows` docblocks on the two siblings described the `@objectstack/spec`
* 17.2.0 boundary, where `rows` was refused by name, and outlived it;
- * objectui#7635 corrected them in the same change that corrected this
+ * `544ecba84` corrected them in the same change that corrected this
* paragraph, so all three now read the same boundary and none of them is the
* odd one out.
*/
@@ -523,7 +523,7 @@ import type { SelectOptionBase } from './select-option.js';
* WIDER than what may be authored, but by TWO keys rather than three:
* `disabled` and `icon` are refused BY NAME by the spec's strict
* `SelectOptionSchema`, which a field's `options` are routed through, while
- * `description` became authorable at `@objectstack/spec` 17.3.0 (objectui#7635
+ * `description` became authorable at `@objectstack/spec` 17.3.0 (`544ecba84`
* corrected this paragraph; the member docblock below carries the measurement).
*/
export interface SelectOptionMetadata extends SelectOptionBase {
@@ -546,7 +546,7 @@ export interface SelectOptionMetadata extends SelectOptionBase {
* authoring door admitted it.
*
* ⛔ This reverses what this docblock asserted between `0e3b3be09` and
- * objectui#7635, when the key was refused by name and this comment said so.
+ * `544ecba84`, when the key was refused by name and this comment said so.
* The option keys that are STILL outside the vocabulary are `icon` and
* `disabled` — declared on {@link SelectOptionBase} as objectui-only
* extensions and refused by name — and they are what keeps "the schema still
diff --git a/packages/types/src/form.ts b/packages/types/src/form.ts
index 08d8c481cc..11f602f136 100644
--- a/packages/types/src/form.ts
+++ b/packages/types/src/form.ts
@@ -204,7 +204,7 @@ export interface TextareaSchema extends BaseSchema {
* READ SITE: `packages/components/src/renderers/form/textarea.tsx:37` —
* `cn("grid w-full gap-1.5", schema.wrapperClass)`. Undeclared until
* objectui#7722, surviving only on `BaseSchema`'s index signature: the same
- * key, on the same class of read, that `CheckboxSchema` (objectui#6938),
+ * key, on the same class of read, that `CheckboxSchema` (`b74a8598d`),
* `FileUploadSchema` and `FilterBuilderSchema` (objectui#6150) declare.
* Distinct from `className`, which the renderer hands to the inner control.
*/
@@ -326,7 +326,7 @@ export interface SelectSchema extends BaseSchema {
* READ SITE: `packages/components/src/renderers/form/select.tsx:45` —
* `cn("grid w-full items-center gap-1.5", schema.wrapperClass)`. Undeclared until
* objectui#7722, surviving only on `BaseSchema`'s index signature: the same
- * key, on the same class of read, that `CheckboxSchema` (objectui#6938),
+ * key, on the same class of read, that `CheckboxSchema` (`b74a8598d`),
* `FileUploadSchema` and `FilterBuilderSchema` (objectui#6150) declare.
* Distinct from `className`, which the renderer hands to the inner control.
*/
@@ -477,7 +477,7 @@ export interface CheckboxSchema extends BaseSchema {
*
* READ SITE: `packages/components/src/renderers/form/checkbox.tsx:36` —
* `cn("flex items-center space-x-2", schema.wrapperClass)`. Undeclared until
- * objectui#6938, surviving only on `BaseSchema`'s index signature: the same
+ * `b74a8598d`, surviving only on `BaseSchema`'s index signature: the same
* key, on the same class of read, that `FileUploadSchema` and
* `FilterBuilderSchema` declare (objectui#6150) — left out here only because
* the checkbox doc page's schema block is a six-line summary.
@@ -701,7 +701,7 @@ export interface SwitchSchema extends BaseSchema {
* READ SITE: `packages/components/src/renderers/form/switch.tsx:26` —
* `` `flex items-center space-x-2 ${schema.wrapperClass || ''}` ``. Undeclared until
* objectui#7722, surviving only on `BaseSchema`'s index signature: the same
- * key, on the same class of read, that `CheckboxSchema` (objectui#6938),
+ * key, on the same class of read, that `CheckboxSchema` (`b74a8598d`),
* `FileUploadSchema` and `FilterBuilderSchema` (objectui#6150) declare.
* Distinct from `className`, which the renderer hands to the inner control.
*/
@@ -1112,7 +1112,7 @@ export interface DatePickerSchema extends BaseSchema {
* READ SITE: `packages/components/src/renderers/form/date-picker.tsx:35` —
* `` `grid w-full max-w-sm items-center gap-1.5 ${schema.wrapperClass || ''}` ``. Undeclared until
* objectui#7722, surviving only on `BaseSchema`'s index signature: the same
- * key, on the same class of read, that `CheckboxSchema` (objectui#6938),
+ * key, on the same class of read, that `CheckboxSchema` (`b74a8598d`),
* `FileUploadSchema` and `FilterBuilderSchema` (objectui#6150) declare.
* Distinct from `className`, which the renderer hands to the inner control.
*/
diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts
index 9f35626487..b5aad8ff13 100644
--- a/packages/types/src/index.ts
+++ b/packages/types/src/index.ts
@@ -101,7 +101,7 @@ export type {
SchemaNode,
ComponentRendererProps,
ComponentInput,
- // The input the FRAMEWORK injects (`binding: 'object'`, objectui#6950) —
+ // The input the FRAMEWORK injects (`binding: 'object'`, `9e37d9b39`) —
// `ComponentInput` plus the marker no registration may author.
InjectedComponentInput,
// The arm vocabulary of `ComponentInput.type`, exported because that field
@@ -269,7 +269,7 @@ export type {
} from './data-display.js';
// The canonical `TableColumn.type` vocabulary and the producer-seam fold that
-// keeps undeclared inference values out of that slot (objectui#5853).
+// keeps undeclared inference values out of that slot (`fc62bb490`).
export { TABLE_COLUMN_TYPES, normalizeTableColumnType } from './data-display.js';
// ============================================================================
@@ -806,7 +806,7 @@ export type {
// `ThemeDefinition` were DELETED under the same ruling's zero-reader rider
// (the first three live on as inline members of `Theme`).
Theme,
- // `ThemeComponentSchema` RETIRED in objectui#5489 — the `type: 'theme'`
+ // `ThemeComponentSchema` RETIRED in `78cbdb530` — the `type: 'theme'`
// component kind no renderer implemented. See `./theme` for the tombstone.
ThemeMode,
ColorPalette,
diff --git a/packages/types/src/objectql.ts b/packages/types/src/objectql.ts
index b511ab98fc..8b8ca4d6be 100644
--- a/packages/types/src/objectql.ts
+++ b/packages/types/src/objectql.ts
@@ -2837,7 +2837,7 @@ export interface ObjectMapSchema extends BaseSchema {
* after {@link ObjectMapSchema.data} and {@link ObjectMapSchema.staticData}
* (`plugin-map/src/ObjectMap.tsx`).
*
- * Optional since objectui#6939: a map authored on inline rows never reads
+ * Optional since `77cb489b4`: a map authored on inline rows never reads
* this key, and requiring it refused three catalog entries that draw
* correctly. The requirement the renderer really has — at least one of
* `data`, `staticData`, `objectName` present — lives on the mirror as a
@@ -2960,7 +2960,7 @@ export interface ObjectGanttSchema extends BaseSchema {
* (`@object-ui/core`) resolves, after {@link ObjectGanttSchema.data} and
* {@link ObjectGanttSchema.staticData} (called by `plugin-gantt/src/ObjectGantt.tsx`).
*
- * Optional since objectui#6939: a gantt authored on inline rows never reads
+ * Optional since `77cb489b4`: a gantt authored on inline rows never reads
* this key, and requiring it refused three catalog entries that draw
* correctly. The requirement the renderer really has — at least one of
* `data`, `staticData`, `objectName` present — lives on the mirror as a
@@ -2973,7 +2973,7 @@ export interface ObjectGanttSchema extends BaseSchema {
* (`@object-ui/core`), which returns it verbatim when it is on the block's
* declared arm — ahead of `staticData` / `objectName`.
*
- * Declared by objectui#6939, in the same stroke as the mirror's `data`: until
+ * Declared by `77cb489b4`, in the same stroke as the mirror's `data`: until
* then the read landed on `BaseSchema`'s index signature on this side and
* on `.passthrough()` on the mirror's, so the record source the resolver
* prefers was the one neither face named. Same type as
@@ -3296,7 +3296,7 @@ export interface ObjectCalendarSchema extends BaseSchema {
* (`@object-ui/core`) resolves, after {@link ObjectCalendarSchema.data} and
* {@link ObjectCalendarSchema.staticData} (called by `plugin-calendar/src/ObjectCalendar.tsx`).
*
- * Optional since objectui#7313 (the objectui#6939 shape): a calendar authored
+ * Optional since objectui#7313 (the `77cb489b4` shape): a calendar authored
* on inline rows never reads this key, and requiring it refused the two
* documented static-data examples that draw correctly. The requirement the
* renderer really has — at least one of
diff --git a/packages/types/src/overlay.ts b/packages/types/src/overlay.ts
index c8a52474ef..8cb31e03e4 100644
--- a/packages/types/src/overlay.ts
+++ b/packages/types/src/overlay.ts
@@ -708,11 +708,11 @@ export interface PopoverSchema extends BaseSchema {
* Tooltip component
*
* ⚠️ This declaration used to REQUIRE `children` and declare neither `trigger`
- * nor a rich-content slot (objectui#6939). The renderer reads `schema.trigger`
+ * nor a rich-content slot (`bfaa1589c`). The renderer reads `schema.trigger`
* and `schema.content || renderChildren(…)`
* (`packages/components/src/renderers/overlay/tooltip.tsx`), and the
* registration's own `inputs` list `trigger` / `content` / that slot. ⚠️ The
- * slot was spelled `body` from objectui#6939 until objectui#6771 retired the
+ * slot was spelled `body` from `bfaa1589c` until objectui#6771 retired the
* spelling; it is `children` on both the read and the published `inputs` now,
* which is why the tombstones below face the other way round from the ones
* objectui#8284 first wrote. `children` was legal through {@link BaseSchema}
@@ -1116,7 +1116,7 @@ export interface DropdownMenuSchema extends BaseSchema {
* Context menu component
*
* ⚠️ This declaration used to REQUIRE `children`, which no read site consumes
- * (objectui#6939): the renderer reads `schema.trigger` and `schema.items`
+ * (`bfaa1589c`): the renderer reads `schema.trigger` and `schema.items`
* (`packages/components/src/renderers/overlay/context-menu.tsx:95,99`), so a
* document authoring its right-clickable area under `children` loses it to the
* hardcoded placeholder. `children` stays legal through {@link BaseSchema},
@@ -1135,7 +1135,7 @@ export interface ContextMenuSchema extends BaseSchema {
* — `renderChildren(schema.trigger || { type: 'text', content: 'Right click here' })`
* inside `ContextMenuTrigger`. ⚠️ Note the renderer renders `trigger`, NOT
* `children` — which this member used to sit beside as a REQUIRED key and
- * which no read site consumes (objectui#6939 dropped that requirement;
+ * which no read site consumes (`bfaa1589c` dropped that requirement;
* `children` is now only {@link BaseSchema}'s optional one).
*
* Declared OPTIONAL: the renderer substitutes a placeholder when it is
@@ -1148,7 +1148,7 @@ export interface ContextMenuSchema extends BaseSchema {
*
* READ SITE: `packages/components/src/renderers/overlay/context-menu.tsx:87`
* — first in `schema.triggerClassName || className || schema.className ||
- * `. Undeclared until objectui#6939, surviving only
+ * `. Undeclared until `bfaa1589c`, surviving only
* on `BaseSchema`'s index signature.
*/
triggerClassName?: string;
@@ -1156,13 +1156,13 @@ export interface ContextMenuSchema extends BaseSchema {
* Classes for the menu panel.
*
* READ SITE: `packages/components/src/renderers/overlay/context-menu.tsx:88`,
- * applied to `ContextMenuContent` at :98. Undeclared until objectui#6939.
+ * applied to `ContextMenuContent` at :98. Undeclared until `bfaa1589c`.
*/
contentClassName?: string;
/**
* Forwarded to the Radix `ContextMenu` root — `modal={schema.modal}` at
* `packages/components/src/renderers/overlay/context-menu.tsx:91`.
- * Undeclared until objectui#6939.
+ * Undeclared until `bfaa1589c`.
*/
modal?: boolean;
/**
diff --git a/packages/types/src/select-option.ts b/packages/types/src/select-option.ts
index 669c793f29..f4cd05cb35 100644
--- a/packages/types/src/select-option.ts
+++ b/packages/types/src/select-option.ts
@@ -62,7 +62,7 @@ import type { SelectOption as SpecSelectOption } from '@objectstack/spec/data';
* ⚠️ That list USED to be spelled out here as "exactly `label`, `value`,
* `color`, `default` and `visibleWhen`", and `@objectstack/spec` 17.3.0 falsified
* it by declaring a sixth key, `description` (objectui#6153; corrected by
- * objectui#7635). The enumeration is deliberately not replaced with a longer
+ * `544ecba84`). The enumeration is deliberately not replaced with a longer
* one: the keys arrive through the `Omit` BY REFERENCE, so a list written here
* can only ever disagree with the derivation it sits above.
*/
diff --git a/packages/types/src/theme.ts b/packages/types/src/theme.ts
index 2306fe98ec..748abb7a42 100644
--- a/packages/types/src/theme.ts
+++ b/packages/types/src/theme.ts
@@ -11,7 +11,7 @@
*
* The theme document vocabulary (`Theme`, `ThemeMode`, `ColorPalette`) —
* owned by this package since objectui#5716. The objectui theme COMPONENT
- * kinds that used to accompany it are all retired (objectui#5489,
+ * kinds that used to accompany it are all retired (`78cbdb530`,
* objectui#5647); this module is the theme DOCUMENT only.
*
* @module theme
@@ -205,7 +205,7 @@ export interface Theme {
// ObjectUI Component Schemas (UI rendering)
// ============================================================================
-// `ThemeComponentSchema` (`type: 'theme'`) RETIRED in objectui#5489, under the
+// `ThemeComponentSchema` (`type: 'theme'`) RETIRED in `78cbdb530`, under the
// maintainer ruling of 2026-08-21 on objectstack#10485 (option B, quoted
// verbatim and untranslated):
//
@@ -239,7 +239,7 @@ export interface Theme {
// `registerLazy(...)` site in `packages/*/src`, in `PROTOCOL_COMPONENTS` /
// `PALETTE_PLACEHOLDER_BLOCKS`, or in any fixture — declared-but-unenforced,
// the same ADR-0078 class as `'theme'` above. Their Zod objects,
-// `ThemeUnionSchema` (which after objectui#5489 held only these two members),
+// `ThemeUnionSchema` (which after `78cbdb530` held only these two members),
// and the `…SchemaType` inference aliases left `zod/theme.zod.ts` in the same
// change; `AnyComponentSchema` no longer carries a theme member, and the
// refusals are pinned in `__tests__/phase2-schemas.test.ts`.
diff --git a/packages/types/src/zod/blocks.zod.ts b/packages/types/src/zod/blocks.zod.ts
index 11a2ac73ad..c991275430 100644
--- a/packages/types/src/zod/blocks.zod.ts
+++ b/packages/types/src/zod/blocks.zod.ts
@@ -31,7 +31,7 @@
* 'block-library' })` returned success for a node no page can render.
* `./index.zod.ts` no longer carries a block arm and now refuses all five
* kinds; `__tests__/phase2-schemas.test.ts` pins those refusals next to the
- * theme refusals retired the same way (objectui#5489, objectui#5647).
+ * theme refusals retired the same way (`78cbdb530`, objectui#5647).
*
* Do NOT hand-write local mirrors of any retired schema here: re-declaring one
* is a published-contract decision no ruling has taken, and the retirement pin
diff --git a/packages/types/src/zod/complex.zod.ts b/packages/types/src/zod/complex.zod.ts
index 0a3c60ff1a..647ebaeab1 100644
--- a/packages/types/src/zod/complex.zod.ts
+++ b/packages/types/src/zod/complex.zod.ts
@@ -426,7 +426,7 @@ export const FilterBuilderConditionSchema: z.ZodType = z.lazy(() => FilterB
/**
* Filter Group Schema — the shape `FilterBuilder` actually reads
- * (objectui#6939, the `filter-builder` group; maintainer ruling 2026-09-02,
+ * (`d4493fdbc`, the `filter-builder` group; maintainer ruling 2026-09-02,
* director seat summon #8, verbatim 「同意」).
*
* The gate is `isValidGroup` in `packages/components/src/custom/filter-builder.tsx`:
@@ -445,8 +445,8 @@ export const FilterBuilderConditionSchema: z.ZodType = z.lazy(() => FilterB
* never consults it and nothing else reads `filterGroup.id`; measured, deleting
* `id` from an authored group renders BYTE-IDENTICALLY (76 elements, same text,
* same SHA-256). Requiring it would refuse a document the renderer draws
- * perfectly — a fresh instance of the exact class objectui#6939 exists to
- * close. Declared rather than dropped because the component's exported
+ * perfectly — a fresh instance of the exact class that ruling's eight groups
+ * exist to close. Declared rather than dropped because the component's exported
* `FilterGroup` carries it, `EMPTY_GROUP` emits it, every catalog entry authors
* it, and it round-trips out through `onChange`; declaring it buys the type
* check (`id: 42` now refuses) that an undeclared key would not get, since a
@@ -508,7 +508,7 @@ export const FilterGroupSchema: z.ZodType = z.lazy(() => FilterGroupObject)
/**
* Filter Field Schema — one entry of `FilterBuilderSchema.fields`
- * (objectui#6939, same ruling).
+ * (`d4493fdbc`, same ruling).
*
* ## `value`, not `name`
*
@@ -572,7 +572,7 @@ export const FilterGroupSchema: z.ZodType = z.lazy(() => FilterGroupObject)
*
* `string` stays OUT, and that is the contrast the paragraph above turns on:
* it is named NOWHERE in the renderer, so it reaches the text control only by
- * the fallthrough. A phantom, removed by objectui#6939 and not restored here;
+ * the fallthrough. A phantom, removed by `d4493fdbc` and not restored here;
* the published doc does not offer it either, so the two faces agree.
*/
export const FilterFieldSchema = z.object({
diff --git a/packages/types/src/zod/data-display.zod.ts b/packages/types/src/zod/data-display.zod.ts
index 3e52a35011..638c54348e 100644
--- a/packages/types/src/zod/data-display.zod.ts
+++ b/packages/types/src/zod/data-display.zod.ts
@@ -219,7 +219,7 @@ export const TableColumnSchema = z.object({
align: z.enum(['left', 'center', 'right']).optional().describe('Column alignment'),
fixed: z.enum(['left', 'right']).optional().describe('Fixed column position'),
// The canonical value set, built from the ONE declaration in
- // `../data-display.ts` rather than restated here (objectui#5853, maintainer
+ // `../data-display.ts` rather than restated here (`fc62bb490`, maintainer
// ruling 2026-08-25, Option B). This key was `z.string()`: every typo passed
// — `type: 'money'` validated green, matched no renderer branch, and the
// column silently fell through to plain text rendering. That is the lenient
@@ -572,7 +572,7 @@ export const TreeViewSchema = BaseSchema.extend({
+ 'authored `data` would render an empty tree. Rename the key; the array is unchanged.',
),
nodes: z.array(TreeNodeSchema).optional()
- .describe('Inline tree nodes — the one inline spelling, read as the second limb of `boundData || schema.nodes || []` (a `bind`-resolved value wins, so this stays optional and no presence rule exists — objectui#6951 B1). Declared by objectui#6150; a `nodes`-only document became LEGAL at objectui#6939; the `data` fallback spelling was retired by objectui#6951 (the registration\'s own `inputs` and `defaultProps` spell it `nodes`, and the four catalog entries ARE those `defaultProps`)'),
+ .describe('Inline tree nodes — the one inline spelling, read as the second limb of `boundData || schema.nodes || []` (a `bind`-resolved value wins, so this stays optional and no presence rule exists — objectui#6951 B1). Declared by objectui#6150; a `nodes`-only document became LEGAL; the `data` fallback spelling was retired by objectui#6951 (the registration\'s own `inputs` and `defaultProps` spell it `nodes`, and the four catalog entries ARE those `defaultProps`)'),
title: z.string().optional()
.describe('Heading above the tree — renders only when set (objectui#6150)'),
defaultExpandedIds: z.array(z.string()).optional().describe('Default expanded node IDs'),
@@ -658,7 +658,7 @@ export const ChartTypeSchema = stripImportedDefaults(SpecChartTypeSchema);
* dataset-bound one, and neither carries values.
*/
export const ChartDataSeriesSchema = z.object({
- // BOTH BINDING DIALECTS (objectui#6939, maintainer ruling 2026-09-02 — the
+ // BOTH BINDING DIALECTS (`5f789538d`, maintainer ruling 2026-09-02 — the
// `chart` row, verbatim 「同意」). `normalizeSeries` reads
// `str(raw.dataKey) ?? str(raw.name)` (`plugin-charts/src/normalizeChartSchema.ts:239`),
// so the two spellings are interchangeable at the renderer. This mirror
diff --git a/packages/types/src/zod/form.zod.ts b/packages/types/src/zod/form.zod.ts
index c8c7fb5bf4..37ad00032f 100644
--- a/packages/types/src/zod/form.zod.ts
+++ b/packages/types/src/zod/form.zod.ts
@@ -337,7 +337,7 @@ export const CheckboxSchema = BaseSchema.extend({
required: z.boolean().optional()
.describe("Required affordance — sets `required` on the Radix Checkbox and gates the label's `*` marker (objectui#6150)"),
wrapperClass: z.string().optional()
- .describe('Classes on the wrapper div around the box and its label (objectui#6938)'),
+ .describe('Classes on the wrapper div around the box and its label'),
description: z.string().optional().describe('Help text'),
error: z.string().optional().describe('Error message'),
onChange: handlerKeyRefusal('onChange', 'runtime-slot', 'Change handler'),
diff --git a/packages/types/src/zod/index.zod.ts b/packages/types/src/zod/index.zod.ts
index 06d8d34323..0ec969c991 100644
--- a/packages/types/src/zod/index.zod.ts
+++ b/packages/types/src/zod/index.zod.ts
@@ -348,7 +348,7 @@ export {
// the spec's whole `ui/theme.zod.ts` module (objectstack#10485, PR
// objectstack#10695; removal ruled on objectstack#10856, executed as
// objectui#5710).
-// - `ThemeComponentSchema` RETIRED in objectui#5489.
+// - `ThemeComponentSchema` RETIRED in `78cbdb530`.
// - `ThemeSwitcherSchema` / `ThemePreviewSchema` / `ThemeUnionSchema` RETIRED
// in objectui#5647, by inheritance of the same 2026-08-21 ruling (option B)
// on identical evidence — `AnyComponentSchema` below no longer carries a
diff --git a/packages/types/src/zod/objectql.zod.ts b/packages/types/src/zod/objectql.zod.ts
index 24dccfbaf1..126a29a130 100644
--- a/packages/types/src/zod/objectql.zod.ts
+++ b/packages/types/src/zod/objectql.zod.ts
@@ -1783,7 +1783,7 @@ export const ObjectMapConfigSchema = z.object({
});
/**
- * objectui#6939 — the record-source refinement `ObjectMapSchema`,
+ * `77cb489b4` — the record-source refinement `ObjectMapSchema`,
* `ObjectGanttSchema` and `ObjectCalendarSchema` below share.
*
* Those renderers resolve their records from ONE of three keys, in this order:
@@ -1794,7 +1794,7 @@ export const ObjectMapConfigSchema = z.object({
* wrapper and `plugin-gantt/src/ObjectGantt.tsx` calls directly: `data`, then
* `staticData`, then `objectName`, else `null`. Both mirrors
* used to REQUIRE `objectName` alone, so a document authored on `staticData`
- * (6 of the 20 catalog entries objectui#6939 measured) drew correctly and was
+ * (6 of the 20 catalog entries measured for the 2026-09-02 ruling) drew correctly and was
* refused by `safeValidateSchema` — `declared !== enforced`, with the corpus
* on the right side. `objectName` is optional on both members now, and this
* refinement carries the requirement the renderers actually have: with none of
@@ -1864,14 +1864,14 @@ function requireRecordSource(type: 'object-map' | 'object-gantt' | 'object-calen
* ruling and stay for compatibility.
*
* `objectName` is OPTIONAL and the member ends in `requireRecordSource`
- * (objectui#6939): `getDataConfig` reads `data`, then `staticData`, then
+ * (`77cb489b4`): `getDataConfig` reads `data`, then `staticData`, then
* `objectName`, so a map authored on inline rows never reads the object name —
* three catalog entries drew correctly and were refused here. Requiredness
* moved to the refinement above, which is where the renderer actually has it.
*/
export const ObjectMapSchema = BaseSchema.extend({
type: z.literal('object-map'),
- objectName: z.string().optional().describe('ObjectQL object name — the THIRD record source getDataConfig resolves, after data and staticData; one of the three must be present (objectui#6939)'),
+ objectName: z.string().optional().describe('ObjectQL object name — the THIRD record source getDataConfig resolves, after data and staticData; one of the three must be present'),
data: ViewDataSchema.optional().describe('Data source configuration — read FIRST by getDataConfig'),
staticData: z.array(z.any()).optional().describe('Inline records — read SECOND by getDataConfig, wrapped into a { provider: value } config'),
filter: z.array(z.any()).optional().describe('Query filter, forwarded as $filter'),
@@ -1909,7 +1909,7 @@ export const ObjectTreeSchema = BaseSchema.extend({
* ObjectGantt Schema
*
* `objectName` is OPTIONAL and the member ends in `requireRecordSource`
- * (objectui#6939): the shared record-source ladder `resolveRecordSourceConfig`
+ * (`77cb489b4`): the shared record-source ladder `resolveRecordSourceConfig`
* (`@object-ui/core`, called by `plugin-gantt/src/ObjectGantt.tsx`) reads
* `data`, then `staticData`, then `objectName`, so a gantt authored on inline
* rows never reads the object name — three catalog entries drew correctly and
@@ -1922,8 +1922,8 @@ export const ObjectTreeSchema = BaseSchema.extend({
*/
export const ObjectGanttSchema = BaseSchema.extend({
type: z.literal('object-gantt'),
- objectName: z.string().optional().describe('ObjectQL object name — the THIRD record source resolveRecordSourceConfig resolves, after data and staticData; one of the three must be present (objectui#6939)'),
- data: ViewDataSchema.optional().describe('Data source configuration — read FIRST by resolveRecordSourceConfig; undeclared on either face until objectui#6939'),
+ objectName: z.string().optional().describe('ObjectQL object name — the THIRD record source resolveRecordSourceConfig resolves, after data and staticData; one of the three must be present'),
+ data: ViewDataSchema.optional().describe('Data source configuration — read FIRST by resolveRecordSourceConfig'),
startDateField: z.string().optional().describe('Start date field'),
endDateField: z.string().optional().describe('End date field'),
titleField: z.string().optional().describe('Title field'),
@@ -2056,7 +2056,7 @@ export const ObjectGanttSchema = BaseSchema.extend({
* ObjectCalendar Schema
*
* `objectName` is OPTIONAL and the member ends in `requireRecordSource`
- * (objectui#7313, the objectui#6939 shape): the renderer resolves its records
+ * (objectui#7313, the `77cb489b4` shape): the renderer resolves its records
* through the shared ladder (`resolveRecordSourceConfig` in
* `@object-ui/core`, `plugin-calendar/src/ObjectCalendar.tsx`) — `data`, then
* `staticData`, then `objectName` — so a calendar authored on inline rows never
@@ -2300,7 +2300,7 @@ export const KanbanConditionalFormattingRuleSchema = z.union([
*
* `cards` reuses `KanbanCardSchema` (`./complex.zod.ts`) rather than restating
* it: the card vocabulary has one authority, and reaching it is what restores
- * objectui#6939's judging — a lane card with no `title` is refused again.
+ * the judging `240b80f31` established — a lane card with no `title` is refused again.
*/
const ObjectKanbanLaneSchema = z.object({
id: z.string().describe('Lane id — matched against the groupBy value. STRING only, and the narrowing stands on its own: until objectui#8993 the bucketer built knownIds from the raw col.id and compared it with Object.keys(groups), which are strings, so a numeric id bucketed every card TWICE; the sweep now keys membership the way the injection always did'),
diff --git a/packages/types/src/zod/overlay.zod.ts b/packages/types/src/zod/overlay.zod.ts
index 60df6c6594..f0cc803742 100644
--- a/packages/types/src/zod/overlay.zod.ts
+++ b/packages/types/src/zod/overlay.zod.ts
@@ -319,14 +319,14 @@ const TOOLTIP_CONTENT_IS_TEXT_GUIDANCE =
* Tooltip Schema - Tooltip component
*
* ⚠️ This member used to REQUIRE `children` and declare neither `trigger` nor a
- * rich-content slot (objectui#6939). The renderer reads `schema.trigger` and
+ * rich-content slot (`bfaa1589c`). The renderer reads `schema.trigger` and
* `schema.content || renderChildren(…)` (`renderers/overlay/tooltip.tsx`), and
* the registration's own `inputs` list `trigger` / `content` / that slot. So the
* validator refused documents the renderer draws and blessed a spelling that
* paints an empty trigger — `declared !== enforced`, with the corpus on the
* right side of it.
*
- * ⚠️ The slot was spelled `body` from objectui#6939 until objectui#6771 retired
+ * ⚠️ The slot was spelled `body` from `bfaa1589c` until objectui#6771 retired
* the spelling. It is `children` now, so the refusal below faces the other way
* round from the one objectui#8284 first wrote — the RULE (tombstone the channel
* this renderer does not read) is what is preserved, not the key it named.
@@ -347,7 +347,7 @@ const TOOLTIP_CONTENT_IS_TEXT_GUIDANCE =
export const TooltipSchema = BaseSchema.extend({
type: z.literal('tooltip'),
trigger: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional()
- .describe('Element the tooltip attaches to (objectui#6939)'),
+ .describe('Element the tooltip attaches to'),
// TEXT ONLY (objectui#10295, the objectui#7759 group B residue). The renderer
// places `schema.content` RAW in a React child position — unlike `trigger`
// and `children`, it does not go through `renderChildren`. objectui#10280
@@ -361,9 +361,9 @@ export const TooltipSchema = BaseSchema.extend({
content: z
.string({ error: (issue) => (issue.code === 'invalid_type' ? TOOLTIP_CONTENT_IS_TEXT_GUIDANCE : undefined) })
.optional()
- .describe('Tooltip text, checked before `children` — optional because `children` is the fallback for the same slot (objectui#6939). Text only: author a node or a list of nodes under `children` (objectui#10295)'),
+ .describe('Tooltip text, checked before `children` — optional because `children` is the fallback for the same slot. Text only: author a node or a list of nodes under `children` (objectui#10295)'),
children: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional()
- .describe('Rich tooltip content — the fallback for `content`, published by the registration as the "Rich Content" slot (objectui#6939, objectui#6771)'),
+ .describe('Rich tooltip content — the fallback for `content`, published by the registration as the "Rich Content" slot (objectui#6771)'),
side: z.enum(['top', 'right', 'bottom', 'left']).optional().describe('Tooltip side'),
align: z.enum(['start', 'center', 'end']).optional().describe('Tooltip alignment'),
delayDuration: z.number().optional().describe('Delay before showing (ms)'),
@@ -492,7 +492,7 @@ export const DropdownMenuSchema = BaseSchema.extend({
* Context Menu Schema - Context menu component
*
* ⚠️ This member used to REQUIRE `children`, which no read site consumes
- * (objectui#6939). The renderer reads `schema.trigger` and `schema.items`
+ * (`bfaa1589c`). The renderer reads `schema.trigger` and `schema.items`
* (`renderers/overlay/context-menu.tsx:95,99`), so a document authoring its
* right-clickable area under `children` loses it to the hardcoded placeholder
* — `Right-click here` renders as `Right click here`. `children` stays legal
@@ -508,11 +508,11 @@ export const ContextMenuSchema = BaseSchema.extend({
trigger: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional()
.describe("Right-clickable area. Optional: the renderer substitutes a placeholder (`Right click here`) when omitted, so trigger-less documents are legal today (objectui#6150)"),
triggerClassName: z.string().optional()
- .describe('Classes for the right-clickable area — falls back to `className` / `schema.className`, or a dashed-border default when none are set (objectui#6939)'),
+ .describe('Classes for the right-clickable area — falls back to `className` / `schema.className`, or a dashed-border default when none are set'),
contentClassName: z.string().optional()
- .describe('Classes for the menu panel, applied to the underlying `ContextMenuContent` (objectui#6939)'),
+ .describe('Classes for the menu panel, applied to the underlying `ContextMenuContent`'),
modal: z.boolean().optional()
- .describe('Forwarded to the Radix `ContextMenu` root as `modal` (objectui#6939)'),
+ .describe('Forwarded to the Radix `ContextMenu` root as `modal`'),
body: retirementTombstone(
'REFUSED (objectui#9256, ADR-0049) — `context-menu` reads NEITHER content channel: measured with the '
+ 'TypeScript type checker across all 24 registering packages, no renderer read consumes `body` or '
diff --git a/packages/types/src/zod/theme.zod.ts b/packages/types/src/zod/theme.zod.ts
index 2025d6ea46..2fc25ec04b 100644
--- a/packages/types/src/zod/theme.zod.ts
+++ b/packages/types/src/zod/theme.zod.ts
@@ -27,10 +27,10 @@
* (Option B) was explicitly not taken.
*
* - The theme COMPONENT kinds: `ThemeComponentSchema` (`type: 'theme'`)
- * RETIRED in objectui#5489 under the 2026-08-21 maintainer ruling on
+ * RETIRED in `78cbdb530` under the 2026-08-21 maintainer ruling on
* objectstack#10485 (option B); then `ThemeSwitcherSchema`
* (`type: 'theme-switcher'`), `ThemePreviewSchema` (`type: 'theme-preview'`)
- * and `ThemeUnionSchema` — which after objectui#5489 held only those two
+ * and `ThemeUnionSchema` — which after `78cbdb530` held only those two
* members — RETIRED in objectui#5647, by inheritance of the same ruling on
* identical evidence. No renderer ever registered any of the three literals:
* absent from every `ComponentRegistry.register(...)` / `registerLazy(...)`