Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/10039-publish-drafts-advisories.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ What moves with the route, at all three:
- A non-2xx raises `MetadataError` inside the client instead of being read off
`res.ok`. The message is still the server's own, and the ADR-0112
producer-marked `error.userMessage` now outranks the diagnostic `error.message`
where the refusal carries one — the rule objectui#7959 landed on `PackagesPage`,
where the refusal carries one — the rule `36fc74629` landed on `PackagesPage`,
reaching these surfaces by the same seam rather than by a fourth copy.
`StudioDesignSurface` keeps its field-anchored issue rendering: the client
already carries `error.details.issues` on `MetadataError.issues`, which is what
Expand Down
2 changes: 1 addition & 1 deletion .changeset/10150-author-shape-header-ruling.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
---

Comment-only in `@object-ui/app-shell`: the docblock above `clientValidation`'s `AUTHOR_SHAPE_ONLY_TYPES` ended on a plan, to switch the `sharing_rule` edit gate on once the `_diagnostics` ingress was closed. That condition was met (`extractDraftBody` strips the read decorations through the spec's `stripReadDecorations`), the switch was put to the maintainer on objectui#7612, and the ruling was option A: the edit door stays with the server. The docblock now records that ruling beside the condition, and keeps the measurement above it. A source-scan pin requires the docblock to name the ruling's card and the function that closed the ingress.
Comment-only in `@object-ui/app-shell`: the docblock above `clientValidation`'s `AUTHOR_SHAPE_ONLY_TYPES` ended on a plan, to switch the `sharing_rule` edit gate on once the `_diagnostics` ingress was closed. That condition was met (`extractDraftBody` strips the read decorations through the spec's `stripReadDecorations`), the switch was put to the maintainer, and the 2026-09-20 ruling was option A: the edit door stays with the server. The docblock now records that ruling beside the condition, and keeps the measurement above it. A source-scan pin requires the docblock to name the ruling and the function that closed the ingress.

Declared as releasing nothing because the emit was measured rather than assumed: `AUTHOR_SHAPE_ONLY_TYPES` is not exported, so neither it nor its docblock reaches the emitted `clientValidation.d.ts`; the emitted `.js` carries the comment, and its comment-stripped emit is identical to the base. No published behaviour changes (objectui#10150).
23 changes: 23 additions & 0 deletions .changeset/10803-dead-citation-sweep-fifth-batch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
---

Comment-only in `@object-ui/app-shell`, `@object-ui/components`, `@object-ui/core`,
`@object-ui/fields`, `@object-ui/plugin-charts`, `@object-ui/plugin-chatbot`,
`@object-ui/plugin-dashboard`, `@object-ui/plugin-designer`, `@object-ui/plugin-detail`,
`@object-ui/plugin-grid`, `@object-ui/plugin-list`, `@object-ui/plugin-markdown`,
`@object-ui/plugin-timeline`, `@object-ui/react` and `@object-ui/types` (whose runtime text is
declared separately below), plus the private
`@object-ui/test-support`: docblocks and code comments that cited objectui issues or pull
requests which answer 404 now cite the commit that landed each change, as a 9-character
sha, the ruling by its date where the sentence cites a ruling, or a live pointer the
sentence already named, and where nothing answers they name the card by role
(objectui#10803, the fifth batch). Bare numbers that were sister-repo cards are now written
`objectstack#3720`, `objectstack#5506` and `objectstack#6936`. Some of these docblocks
reach the emitted `.d.ts` and `.js`; none of them moves a claim, and none of these comment
edits changes a code or type token. No published behaviour changes through them, so this
declares no release. The runtime text the sweep touches, six tombstone guidance strings,
one refusal message and one zod `.describe()` string in `@object-ui/types`, is declared on
its own as a patch in `10803-fifth-batch-runtime-strings.md`.

The same repair in the pending changesets that carried these citations is prose-only, and
their frontmatter is byte-identical.
28 changes: 28 additions & 0 deletions .changeset/10803-fifth-batch-runtime-strings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
'@object-ui/types': patch
---

fix(types): eight more runtime strings no longer point at objectui issues that answer 404

Six ADR-0049 retirement tombstones in the published zod mirrors, one refusal message and
one runtime description carried a pointer to an objectui issue that answers 404. A reader
of a parse error or a zod `description` has no repository to resolve a commit against, so
no dead pointer becomes a commit: the six tombstones keep `ADR-0049` and lose the dead
card beside it, the `actions` tombstone cites `ADR-0049` in its place, and the one
description simply drops its pointer (objectui#10803).

- **The tombstone guidance.** `ChatbotSchema`'s `loading`, `showAvatars`, `userAvatar`,
`assistantAvatar`, `markdown` and `height` tombstones feed both the parse error an
author reads and the `.describe()` text, and each now opens `RETIRED (ADR-0049) —` where
it opened with the dead card and `ADR-0049` together. The `showAvatars` message also
ends its sentence about the fenced props spread at "was fenced." Everything else after
the dash is unchanged, so the remedy each message gives is word for word what it was.
- **The `page` node's `actions` refusal**, an ADR-0049 tombstone too, now reads "`actions`
is not a key of the `page` node and never was (ADR-0049): no renderer reads it", and the
remedy after it is unchanged.
- **One description.** `ChartDataSeriesSchema.variant` now ends "the renderer-internal
`current` spelling is not a member".

Nothing else in any string moves, and no key, path, issue code, accept set, refusal or
severity changes: every document that parsed before parses the same way and is refused at
the same path with the same code.
2 changes: 1 addition & 1 deletion .changeset/4919-retire-mobile-overrides.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ deletion — a config that type-checks, builds and silently does nothing is the
declare-without-enforce shape the platform doctrine forbids.

Removal rather than a `?: never` tombstone follows this package's own retire-vs-remove
discriminator, in the form objectui#7678 amended it to. That rule is cited here and not
discriminator, in its amended form (`5f8190c8c`). That rule is cited here and not
restated: it is stated once, and a second copy carried in a release note could only drift
out of agreement with it. Measured against it the route is removal: there is no replacement
key to steer to, no documentation ever described the surface, and there is no successor
Expand Down
2 changes: 1 addition & 1 deletion .changeset/5942-retire-mobile-component-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ could reach a renderer. objectui#4919 removed its last member
(`mobileOverrides`), which is what left the container itself inert.

Removed outright rather than kept as a `?: never` tombstone, on this package's
own retire-vs-remove discriminator, in the form objectui#7678 amended it to.
own retire-vs-remove discriminator, in its amended form (`5f8190c8c`).
That rule is cited here and not restated: it is stated once, and a second copy
carried in a release note could only drift out of agreement with it. Measured
against it the route is removal — the whole interface goes, so there is no
Expand Down
2 changes: 1 addition & 1 deletion .changeset/6002-dashboard-widget-strict.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ verdict ACCEPT — the same "dropped without a word" failure the schema's own
docstring records from the pre-derivation hand copy, still live for every key
no contract declares (objectui#6002). Maintainer ruling 2026-08-25, Route 1
two-step: objectui#6150 declared the 13 genuinely-consumed keys first (landed
as PR #6945), then this flip makes a stale or mistyped key loud everywhere the
as `2c45966ff`), then this flip makes a stale or mistyped key loud everywhere the
contract is consulted (`objectui validate`, `safeValidateSchema`, the catalog
gate) instead of only inside one catalog test.

Expand Down
4 changes: 2 additions & 2 deletions .changeset/6150-undeclared-but-consumed-keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ on its own, and each says so in its own doc comment:
a value, so it cannot appear in an authored JSON document, and objectui#6152
ruled that the class never gets one.

⭐ **AMENDED, and the amendment ships in this same release.** objectui#7804's
`TreeViewSchema` slice gave the key a zod arm after all — a NAMED REFUSAL
⭐ **AMENDED, and the amendment ships in this same release.** The
`TreeViewSchema` slice (`604476d97`) gave the key a zod arm after all — a NAMED REFUSAL
(`handlerKeyRefusal(key, 'runtime-slot', label)`), never a shape — because "no
mirror entry" is not neutral under `BaseSchema.passthrough()`: it meant an
authored `{ "type": "tree-view", "onNodeClick": { "action": "toast" } }` parsed
Expand Down
2 changes: 1 addition & 1 deletion .changeset/6467-unused-import-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
---

No published behaviour changes. Promotes the unused-import subclass of
`@typescript-eslint/no-unused-vars` to `error` (objectui#4806 R2, #6467) and
`@typescript-eslint/no-unused-vars` to `error` (objectui#4806 R2) and
removes the 108 unused imports across 21 packages that the promotion finds.
Every edit is the deletion of an import binding that nothing referenced —
no runtime code, no exported API and no type surface moves, and the removals
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7092-launcher-exclusion-reason.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

Corrects the `PALETTE_EXCLUSIONS` reason string for `app:launcher` in the Studio
page-palette ledger. It read "shell singleton — the app shell renders it, not a page",
and objectui#7091 registered a real `app:launcher` renderer, so a page can now render it
and `969ba84f4` registered a real `app:launcher` renderer, so a page can now render it
and the "not a page" clause became false. The reason now reads "shell singleton — lives
in the app shell chrome", mirroring the neutral form its sibling `global:notifications`
has carried since `f99932a42` shipped that type a renderer without its wording rotting:
Expand Down
3 changes: 1 addition & 2 deletions .changeset/7097-grid-2xl-breakpoint.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
'@object-ui/components': patch
---

`ui:grid` renders the `2xl` breakpoint its `columns` map has always accepted
(objectui#7097).
`ui:grid` renders the `2xl` breakpoint its `columns` map has always accepted.

`columns: { xs: 1, '2xl': 6 }` type-checked, passed `GridSchema`'s zod mirror, emitted
**no class**, and rendered at the `xs` count on every screen — no error, no warning.
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7108-approvals-inbox-dead-record-tombstone.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
---

Approvals inbox: a record that was deleted now renders a "record deleted"
tombstone instead of degrading to the bare record id (objectui#7108).
tombstone instead of degrading to the bare record id.

When an approval's underlying record is deleted, the platform voids the
still-pending requests and stamps the cause on the row (`status: 'cancelled'`
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7177-studio-switcher-server-writable-verdict.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
---

Studio's package switcher reads the server's `writable` verdict instead of guessing
from `manifest.scope` (objectui#7177, ADR-0130 Consequences row 6, server half in
from `manifest.scope` (ADR-0130 Consequences row 6, server half in
objectstack#14375).

`GET /api/v1/packages` now stamps every row with `writable: boolean`, computed by
Expand Down
4 changes: 2 additions & 2 deletions .changeset/7519-retire-mobile-residue-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ declared-surface-with-no-consumption-path shape as `MobileComponentConfig`
itself and `MobileOverrides` (objectui#4919) before it, one level down.

Removed outright rather than kept as `?: never` tombstones, measured against
this package's retire-vs-remove discriminator, in the form objectui#7678
amended it to. That rule is cited here and not restated: it is stated once, and
this package's retire-vs-remove discriminator, in its amended form
(`5f8190c8c`). That rule is cited here and not restated: it is stated once, and
a second copy carried in a release note could only drift out of agreement with
it. The per-prong measurement it asks for is kept as the record. Prong 1:
neither has a replacement key — the behaviour they named lives in hooks, and
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7546-chart-series-keys-declared.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ is the renderer's internal default — written only by the compare-to producers
`DatasetWidget`) onto internal-shape arrays that never pass this mirror, and by nothing an author
writes (docs, fixtures, designer inputs: 0, controls lit) — so it is not a member here: declaring it
would have fossilised a renderer-side tolerance into a second contract. The normalizer's tolerance
is unchanged; objectui#7682 owns that decision.
is unchanged; a separate card owns that decision.

## Unchanged, deliberately

Expand Down
2 changes: 1 addition & 1 deletion .changeset/7620-data-table-date-convention.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
'@object-ui/components': minor
---

One home for the `date` display convention in `data-table` (objectui#7620).
One home for the `date` display convention in `data-table`.

`data-table`'s fallback cell (`formatCellValue`) sniffs ISO strings and
formats them. Its date-only branch built its own `Intl.DateTimeFormat` bag —
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7623-retire-dashboard-root-title-declaration.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
---

**Published TS surface narrowed:** `DashboardComponentSchema` no longer declares the
dashboard-root `title` member (objectui#7623).
dashboard-root `title` member.

Its doc comment said "Dashboard title displayed in the header", and that stopped being
true one release earlier: objectui#7509 retired all five dashboard-root `title` read
Expand Down
4 changes: 2 additions & 2 deletions .changeset/7654-chatbot-display-mode-tombstone.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ That is deliberate, and it is why this tombstone has **no `retirementTombstone()
half**: minting a mirror arm to refuse the key would be the declared-but-unmirrored axis
(objectui#6152), a different defect, and a parse outcome the ruling did not ask for.
`packages/types/src/__tests__/chatbot-display-mode-retired.test.ts` pins both twins'
shapes as a **tripwire** — the same shape objectui#7669 gave `triggerIcon` — so that if
shapes as a **tripwire** — the same shape `a3eb5d07a` gave `triggerIcon` — so that if
objectui#6152 ever mints an arm for `displayMode`, the pin goes red and whoever lands the
mirror adds the `retirementTombstone()` half at that time, flipping the control rather
than deleting it.
Expand All @@ -87,7 +87,7 @@ control carrier (`FloatingChatbotConfig`) lit in the same run:
Deleted, the member reads as `any` and even a wrong-typed value goes quiet. Tombstoned,
**presence with any value** is a compile error — a channel deletion cannot produce on
this carrier at all. On a `BaseSchema` carrier the two routes are loud-vs-silent, not
louder-vs-quieter (the discriminator's carrier branch as corrected on objectui#7678).
louder-vs-quieter (the discriminator's carrier branch in its amended form, `5f8190c8c`).
Prong 2 of that discriminator licenses the tombstone: the key was advertised in the
3.3.0 release record (`CHANGELOG.md:578`) and its published comment taught it as the
presentation switch. The deleted row is pinned in the test file as a live control — an
Expand Down
6 changes: 3 additions & 3 deletions .changeset/7655-chatbot-registration-authoring-faces.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ per key on the PR's base (one `schema.KEY` read per registration body in
trailing raw props spread still carried authored keys into the panel —
`processVisibility`, `surface` and `showAvatars` were live there, measured
through the real host — and this face neither declared nor promised that
accidental channel, which was tracked as objectui#7708. That card has since
fenced the spread the way the two sibling registrations do, so those three keys
accidental channel, which was tracked on a card of its own. That card has since
fenced the spread (`d3499b315`) the way the two sibling registrations do, so those three keys
are dark on `chatbot-floating` now; no member this face declares depended on
the channel.)
- Neither face declares `ChatbotSchema`'s six legacy members (`loading`,
Expand All @@ -54,7 +54,7 @@ per key on the PR's base (one `schema.KEY` read per registration body in
**`ChatbotSchema` is unchanged.** It keeps `displayMode` and `floatingConfig`
(declarations verbatim), and the floating face declares the same two, so
`ChatbotSchema['displayMode']` and `ChatbotSchema['floatingConfig']` stay the
typed members they were — the objectui#7669 `triggerIcon` tombstone keeps its
typed members they were — the `a3eb5d07a` `triggerIcon` tombstone keeps its
reach on `chatbot` nodes, now pinned on the node. `floatingConfig`'s doc comment
is rewritten on both faces: the old text said it was "only used when
`displayMode` is `'floating'`", which was false — it is read by `chatbot-floating`
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7658-toc-code-span-anchor-parity.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
---

Fix `extractToc` deleting tag-shaped text that lives INSIDE an inline code span,
so its `#id` links resolve to the heading they name again (objectui#7658).
so its `#id` links resolve to the heading they name again.

`stripInline()` applied its rules in sequence: the inline-code rule unwrapped
`` `objectui add <component>` `` to `objectui add <component>`, and the raw-HTML
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7664-kanban-arm-plugin-dialect.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ render **empty**. The ruling: the plugin dialect is authoritative.
`DeclarativeKanbanSchema`, `DeclarativeKanbanColumnSchema`,
`DeclarativeKanbanCardSchema` from `@object-ui/types/zod` are gone.
Importing any of them is a compile error (TS2305).
- **`SchemaRegistry['kanban']` is `KanbanSchema`.** objectui#7645 (PR #7662)
- **`SchemaRegistry['kanban']` is `KanbanSchema`.** objectui#7645 (`bc640ec56`)
weakened the entry to `BaseSchema & { type: 'kanban' }` because this layer
could not name the plugin's type; it now names the declaration the plugin
itself imports. `keyof SchemaRegistry` — the published `ComponentType` union —
Expand Down
4 changes: 2 additions & 2 deletions .changeset/7667-toc-emphasis-flanking.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
---

Fix `extractToc` eating the underscores out of a `SCREAMING_SNAKE` heading, so
its `#id` links resolve to the heading they name again (objectui#7667).
its `#id` links resolve to the heading they name again.

`stripInline()` ended with two hand-rolled emphasis rules that gave `*` and `_`
one shared regex — `(\*\*|__)(.*?)\1` and `(\*|_)(.*?)\1`. Neither knew
Expand Down Expand Up @@ -32,7 +32,7 @@ One live heading in this repository's own docs was affected
(`packages/react/README.md:224`). Measured, not derived: the corpus sweep over
`content/docs/**` plus every `packages/*/README.md` — 223 files, 2941 rendered
headings — goes from 5 divergent files to 4, and the 4 that remain are a
different, already-filed defect (objectui#7666, a heading `extractToc` lists
different, already-filed defect (a heading `extractToc` lists
that the renderer never emits under a JSX block). Pinned against the real
render pipeline rather than a second derivation of the flanking rule: each
heading is rendered through `MarkdownImpl` and `extractToc`'s id compared to
Expand Down
4 changes: 2 additions & 2 deletions .changeset/7678-tombstone-discriminator-agreement.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ Comment-only agreement fix in `@object-ui/types`. The retire-vs-remove discrimin
stated at three sites in `complex.ts` at two different levels of amendment: the
`KanbanColumn.color` block and the `ChatbotSchema` dark-keys block gave the two prongs
without their precondition, while the `displayMode` tombstone already carried it. Both of
the first two now state the amended rule (objectui#7678) in the wording the third already
the first two now state the amended rule in the wording the third already
uses — a `?: never` tombstone is available only on a surviving carrier, and on one it is
used when either prong holds; a whole exported type name has no carrier and is removed
outright — so a reader landing on any of the three gets the same rule. The
`KanbanColumn.color` site's own parenthetical had named this card as its open correction;
that parenthetical is now discharged rather than repeated.

The `triggerIcon` tombstone's own rationale was the site objectui#7678 was filed about, and
The `triggerIcon` tombstone's own rationale was the site this card was filed about, and
it still argued from `tsc` behaviour alone — a contrast that applied equally to the two
precedent retirements that were removed outright, so it cannot be what separates the routes.
It now carries the amended discriminator and names prong 2 (the 3.3.0 release record
Expand Down
2 changes: 1 addition & 1 deletion .changeset/7681-chart-series-type-override-dataKey.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Fix: a chart series' `type` override (`ChartDataSeries.type`, objectui#6121) is now
honoured when the series array is written in the internal `dataKey` binding, not only
the `name` binding (objectui#7681) — the same sentence #2945 shipped for the other
the `name` binding — the same sentence #2945 shipped for the other
dialect.

`ChartRenderer`'s `isInternalShaped` fast path (introduced by #2945 to fix a different
Expand Down
Loading
Loading