diff --git a/.changeset/console-d8ec8d6d4f01.md b/.changeset/console-d8ec8d6d4f01.md new file mode 100644 index 0000000000..074836689e --- /dev/null +++ b/.changeset/console-d8ec8d6d4f01.md @@ -0,0 +1,143 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `d8ec8d6d4f01`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 218 releasing of 315 changesets added across 339 non-merge commits; omitted: 97 release-nothing changesets, 25 commits carrying no changeset (they ship no package code). + +- **minor** — A sankey with no positive flow says so, instead of rendering an empty div (objectui#7140). (objectui `0349555c7`) +- **minor** — `DataEmptyState` now declares `role="status"` by default, so an empty result is distinguishable from a failed one on every surface that renders it (objectui#7132). (objectui `d1842abcf`) +- **minor** — `FieldEditWidget` now delivers the NON-DOM half of the contract it declares (objectui#7008). (objectui `f08bcd9af`) +- **minor** — Dashboard/analytics widgets get a self-explaining DEFAULT empty state, stated once for the surface (objectui#7063). (objectui `220c18d05`) +- **minor** — **Behaviour change.** `record:details` no longer forces `hideEmpty` on the sections it synthesizes, so a sparse record keeps its section skeleton instead of collapsing. Applicatio… (objectui `eeb6c2f2b`) +- **minor** — Inline edit: a rejected save now says WHICH field the server refused, and why. (objectui `03380aa14`) +- **minor** — Gantt views no longer render on invented date field names (objectui#7070). (objectui `5f4514f7b`) +- **minor** — **BREAKING** — BREAKING (`@object-ui/core`): `ActionRunner`'s legacy `ActionDef.onSuccess` chained-callback channel is retired — `onSuccess` now has exactly the meaning the contract declares (ob… (objectui `2c3cd1b75`) +- **minor** — Renderers for the `app:launcher` and `nav:menu` page blocks (objectui#6661). Phase 1 of the 2026-08-26 maintainer ruling on objectstack#12183 — the two `PageComponentType` members… (objectui `969ba84f4`) +- **minor** — Declare the two consumed-but-undeclared field-metadata keys ruled on objectui#6140 / objectui#6153 (maintainer 2026-08-25, Option A), and de-cast the widget reads they legalize: (objectui `88e91092a`) +- **minor** — Calendar views no longer render on invented field names (objectui#7029; ruled on objectstack#13748, director batch #19, option A). (objectui `2a7ac324e`) +- **minor** — **Breaking for authored metadata:** `DashboardWidgetSchema` (the zod validator in `@object-ui/types/zod`) is now `.strict()` — an undeclared widget key REFUSES the parse with zod'… (objectui `7e19d0363`) +- **minor** — Auto-derived related lists consume the field-level `relatedListFilter` declaration — the list query AND-composed, the tab badge counting the same set (objectui#4664). (objectui `d796c8dde`) +- **minor** — One authority for `MarkdownSchema`, and for `KanbanCard` / `KanbanColumn` inside `@object-ui/plugin-kanban` (objectui#6172, folding in objectui#6155). (objectui `b3d562c02`) +- **minor** — Expression-bindable text keys: `statistic.value`, `card.title`, `button.label` and their siblings now evaluate `${...}` on the node (objectui#4795 Direction 1, maintainer ruling 2… (objectui `1b1d772a5`) +- **minor** — **Breaking for authored metadata:** a `data-table` column spelled `name` no longer resolves its cells. Use the declared `accessorKey`. (objectui `41725898c`) +- **minor** — **BREAKING** — Studio surfaces the runtime authoring gate's advisory findings after a **publish**, not only after a save (objectui `fd8dacecc`) +- **minor** — `DetailViewSection.headerColor` is now the closed six-token vocabulary on both halves of the contract — the TypeScript declaration and the `@object-ui/types/zod` mirror — instead… (objectui `7a5da1414`) +- **minor** — **BREAKING** — `ComponentConfig` now has one authority: `@object-ui/types` declares it, `@object-ui/core` re-exports it (objectui `8f1d995ef`) +- **minor** — Declare the 13 renderer-read keys that no shipped type declared (objectui#6150) (objectui `2c45966ff`) +- **minor** — Model `code-editor` and `bar-chart` in `AnyComponentSchema`, and repair three catalog fixtures (objectui `29754cf19`) +- **minor** — Retire `ComponentInput`'s four inert constraint keys — `min`, `max`, `step` and `placeholder` (objectui#5905, ADR-0049 enforce-or-remove). (objectui `453dbaad4`) +- **minor** — Three exported type names inside `@object-ui/types` had two authorities each; each now has one (objectui#6349, first batch — the three intra-package collisions from the 46-name ce… (objectui `b84dc1854`) +- **minor** — `ObjectGantt` and `ObjectTree` resolve a relationship target only from the two spellings a contract carries, dropping the third one no contract declares (objectui#6837, second sli… (objectui `e3d117ae1`) +- **minor** — feat(types): declare `renderCellEditor` and schema-level `cellClassName` on `DataTableSchema` (objectui `bf97b98c8`) +- **minor** — `RecordDetailDrawer` resolves a relationship target only from the two spellings a contract carries, dropping the two no contract declares (objectui#6837, first slice). (objectui `9409eb94d`) +- **minor** — Read `find()` answers as `QueryResult` declares them on two more seams: the related-count badge store no longer reads `count`, and `ObjectView`'s non-grid unwrap no longer reads `… (objectui `c18d0990c`) +- **minor** — **BREAKING** — `aggregate()`'s spec-shape branch now REFUSES an unlowered `where` instead of posting it (objectui#6825, maintainer ruling 2026-08-30 — option A). (objectui `f07b976ef`) +- **minor** — The shell's `sys_activity.type` reading stops calling every unrecognised type an update (objectui#6730). (objectui `dbd519450`) +- **minor** — The report authoring face declares what its own examples author (objectui#6121, maintainer ruling 2026-08-25, Option A — fix the type producer, not the docs). (objectui `ee851c32a`) +- **minor** — Parse a write-strip's `reason` against the spec enum at the boundary (objectui#4934). (objectui `993f312ce`) +- **minor** — Mint the `box` component type — the class-transparent neutral block container (objectui#3965, maintainer ruling 2026-08-29 方案 A). (objectui `a04d7c65c`) +- **minor** — `ObjectGridSchema`'s zod mirror declares `title`, the deprecated legacy caption/export-file-title fallback the interface has declared all along and `ObjectGrid` reads at both of i… (objectui `2c1c96735`) +- **minor** — `useOffline` auto-syncs mutations queued while already online (objectui#6818). (objectui `b87f15bbe`) +- **minor** — Seven more `find()` readers now read exactly what `QueryResult` declares — the `records` arm is removed from each (objectui#6726, following objectui#5945). (objectui `b97790aa0`) +- **minor** — Renderers for the `global:search` and `global:notifications` page blocks (objectui#6757). A page that declared either member drew the literal "Component Placeholder" scaffold: bot… (objectui `f99932a42`) +- **minor** — `surface` becomes authorable on the `chatbot-enhanced` node, so the capability the docs have been documenting is one an author can actually reach (objectui#6687, maintainer ruling… (objectui `7d8e5468f`) +- **minor** — Component deprecation is now DECLARED, not just warned about (objectui#6674). (objectui `7977ff9e2`) +- **minor** — `formType: 'tabbed'` now honours an authored section `visibleWhen` (objectui#6237). (objectui `2da6441b6`) +- **minor** — `provisionProductionEnvironment` now REFUSES a success payload whose `data` carries no `environment` row, instead of resolving best-effort (objectui#6707). (objectui `12295b664`) +- **minor** — fields: validate a STORED `location` value on an edit form (objectui#6744) (objectui `e552c3177`) +- **minor** — metadata-admin inspectors: name the "inactive values retained" state instead of rendering it as live configuration (objectui#6499). (objectui `6d6849129`) +- **minor** — A `type="number"` field no longer displays one value and stores another in silence (objectui#6780). (objectui `7b90231a0`) +- **minor** — `element:*` renderers stop re-reading a degenerate config bag as its own character indices — the third and last channel of the objectui#6752 / objectui#6760 hazard (objectui#6783). (objectui `26896c689`) +- **minor** — `BaseSchema` declares `bind`, the data-scope binding path, on both halves — the TypeScript interface and its Zod mirror (objectui#6357). (objectui `99a3c2db6`) +- **minor** — **BREAKING** — refactor(spec-bridge): retire the spec-bridge — `SpecBridge`, `bridgeListView`, `bridgeFormView` (#6366) (objectui `bf283414f`) +- **minor** — The spec's `dataSource` element binding is now DECLARED by the blocks that read it, so the html tier stops reporting the one working saved-view spelling as `unknown-prop` (objectu… (objectui `3beef6df0`) +- **minor** — `useSchemaPersistence` refuses to save a schema carrying function-valued keys (objectui#6658). (objectui `e321d5234`) +- **minor** — Retire the discovery-wire preview mode — the console no longer turns authentication off because a server said `mode: 'preview'` (objectui#6654). (objectui `dc4365c4b`) +- **minor** — Publish the create-payload rule from `@object-ui/plugin-form`'s entry, so a second form renderer can call it instead of composing it by hand (objectui#6059). (objectui `7a724222f`) +- **minor** — `@object-ui/app-shell` now publishes a precise `sideEffects` ARRAY. (objectui `faac0d935`) +- **minor** — One `sys_activity` row → `FeedItem` constructor, and the console record page stops dropping author-extended activity types in silence (objectui#5896). (objectui `4da510933`) +- **minor** — `asArray` in the two app-shell `find()` readers now reads exactly what `QueryResult` declares — the `records` and `items` arms are removed (objectui#5945). (objectui `d3d0ad3e9`) +- **minor** — `ui:breadcrumb` now reads the two declared keys it never referenced — `separator` and `maxItems` (objectui#6646). (objectui `9486ac672`) +- **minor** — One tombstone registry for the designer seam's retired field keys (objectui#6527). Three independently maintained `RETIRED_FIELD_KEYS` literals — the metadata-admin read door (`ob… (objectui `3e028c8d8`) +- **minor** — **`ObjectGanttSchema` now declares the `gantt` BLOCK face — and the spec's required trio enforces at validate/check time.** (objectui `713db46bf`) +- **minor** — Retire `FieldMeta.referenceTo` and withdraw the README line documenting it as an author-facing column override (objectui#6597, enforce-or-remove — withdraw branch). (objectui `8a6ecac01`) +- **minor** — `MenuItem` is now a discriminated union, and all three menu renderers read the keys it declares (objectui#6523, objectui#6346, maintainer ruling 2026-08-27 — "one answer for the w… (objectui `29cb85bcb`) +- **minor** — New export: `useSettledSchema` — the settled-schema RESOLUTION half shared by `ObjectKanban` / `ObjectView` / `ObjectCalendar`'s fetch-gate hand copies (objectui#6482, maintainer… (objectui `dba7d8443`) +- **minor** — `ChatbotSchema` names the `chatbot` node's local-display and legacy auto-response keys — a new, additive published surface (objectui#6169, the #6172 family ruling: every component… (objectui `52a43ded8`) +- **minor** — **Breaking (compile-time only):** `buildExpressionUser`'s PARAMETER is now the session contract — `ExpressionUserSession | null | undefined` instead of `unknown` — so every call s… (objectui `a4d39a814`) +- **minor** — `TableColumn` declares `fitContent`, the content-hugging flag `data-table` has honoured all along (objectui#6424, maintainer ruling 2026-08-28, Option A — the card's second key, i… (objectui `3190414d4`) +- **minor** — **BREAKING** — Retire the `timeScale` alias on the timeline node — `scale` is the only axis spelling (objectui#6355, maintainer ruling 2026-08-27). (objectui `9d86e1d79`) +- **minor** — Retire four undeclared authored column reads in `ObjectGrid.generateColumns()` (objectui#6458). (objectui `f55d6661b`) +- **minor** — html tier: braced attribute values now materialize the JS literal subset — single-quoted strings and unquoted identifier keys work (objectui#6614) (objectui `470365140`) +- **minor** — flow designer: the Start node's **Entry condition** now opens in the row-based condition builder, with raw CEL one click away as the escape hatch (objectui#6226). (objectui `f352a693a`) +- **minor** — **BREAKING (stored data): `LocationField` reads and writes the spec's `{ lat, lng }`** (objectui `8631c32ad`) +- **minor** — Retire 25 confirmed-dead locale keys from all ten packs — 250 translated strings with no reader anywhere in the repo (objectui#4730's key-level trim round; `calendar.agenda` close… (objectui `d3995fe23`) +- **minor** — `ConditionBuilder` now takes a caller-supplied **subject vocabulary** instead of hardcoding a record-scoped one (objectui#6296). (objectui `88b15fddc`) +- **minor** — Object-field visibility on the record form page and the console's global record-form modal now reads the keys `@objectstack/spec` DECLARES — the static `hidden` and the `visibleWh… (objectui `5af67c227`) +- **minor** — **BREAKING** — Retire the dead per-column `wrap` forward from `ObjectGrid`'s data-table emit (objectui#5453, ADR-0049 enforce-or-remove). (objectui `67a87d9d1`) +- **minor** — **BREAKING (in name only):** `MetadataService.saveObject(obj, existingFields)` now requires its second argument (objectui#6490). Calls that omitted it no longer compile. (objectui `2c26335a4`) +- **minor** — feat(plugin-grid): type the data-table schema slot ObjectGrid fills (objectui `f241a4df4`) +- **minor** — Retire `FieldMeta.decimals` and the now-unfed `BuildFieldMetaParams.overrides.decimals` from `plugin-dashboard`'s shared field-rendering helpers (objectui#6625, enforce-or-remove). (objectui `891a18864`) +- **minor** — Land objectui#6425's per-key ruling for `ObjectDataTable`'s authored column override keys (maintainer, 2026-08-27): (objectui `38a123cac`) +- **minor** — One composer for makers — the built-in `ask` folds into `build` for authoring principals (cloud#1674 maker convergence, Phase B). (objectui `2a23000f0`) +- **minor** — The tabbed arm of the grouping contract (objectui#6237, same maintainer ruling as objectui#6236): `FormFieldTab` gains the predicate slot the ruling named — `visibleWhen?: string… (objectui `46f0bb4f5`) +- **minor** — `TableColumn` declares `headerIcon`, the icon node `data-table` has rendered into the header cell all along (objectui#6424, maintainer ruling 2026-08-27, Option C per-key). (objectui `4e480f5c0`) +- **minor** — html tier: a braced attribute value that is not strict JSON now draws a `inert-expression` warning instead of vanishing silently (objectui#6598) (objectui `0db4fb36c`) +- **minor** — The section grouping contract (objectui#6236, maintainer ruling 2026-08-27): a `section-divider` row may now CLAIM its member fields — `FormField.fields: string[]`, the same membe… (objectui `5ef9c4f5f`) +- **minor** — **BREAKING** — Console error reporting is now configured entirely by the **server**: the DSN and every knob that travels with it arrive on `GET /api/v1/runtime/config`, and the build-time `VITE_… (objectui `14ef9f5f2`) +- **minor** — **Accept-set NARROWING on a published surface.** `SonnerSchema.buttonVariant` in the zod mirror (`@object-ui/types/zod`) was `z.string()`; it is now `z.enum(['default', 'secondary… (objectui `ce503e519`) +- **minor** — `ToastSchema` now declares the two trigger-button keys the `toast` renderer actually reads (objectui#6496, triage scope cut 2026-08-26 — the same declare-what-runs family as objec… (objectui `bf3a03c1d`) +- **minor** — ⚠️ **Behaviour change: `current_user` and `features` gates on an object field's `visible` that have been doing nothing on the record form page and in the console's record modal no… (objectui `08c3da900`) +- **minor** — The unresolvable-predicate diagnostic tells `hidden` / `hiddenOn` authors what actually happened to their node (objectui#6503). Those two legs are the only ones in `SchemaRenderer… (objectui `748494be6`) +- **minor** — **plugin-gantt: the `gantt` block now outranks the flat top-level spelling, and the losing face's keys are named instead of dropped.** (objectui `d7acad69d`) +- **minor** — A `disabled` / `disabledOn` predicate that cannot be evaluated is now reported on the console, in development **and** in production — and the message says what this gate's fail-so… (objectui `30c73cd25`) +- **minor** — **The unresolvable-visibility-predicate report now names the roots of the tier the predicate was actually evaluated against** (objectui#6487). An app-shell author whose nav, area… (objectui `c71e14d1c`) +- **minor** — The record page's approval band offers its **Recall** button to the approval's submitter only (objectui#6464). (objectui `830ed5803`) +- **minor** — `MetadataService`'s two delete methods no longer PUT a hand-written tombstone. They call the metadata API's own delete door instead, and the latent `enabled?: boolean` on `ObjectM… (objectui `622f33cb4`) +- **minor** — `ObjectGanttSchema` declares the flattened `GanttConfig` face `ObjectGantt` actually reads (objectui#6051). `getGanttConfig` has two branches: when `startDateField` and `endDateFi… (objectui `75bd83d6d`) +- **minor** — **BREAKING** — `isConcurrentUpdateError` no longer promises a `code` its runtime check knowingly accepts values without. (objectui `3777538d5`) +- **minor** — fix(plugin-grid): type ObjectGrid's column emit against the `TableColumn[]` slot it fills (objectui `beccf1c6b`) +- **minor** — **BREAKING** — The field metadata payload no longer emits `sortOrder`, the key `FieldSchema` refuses by name (objectui#6045). Field-level sibling of objectui#6223, same objectui#5761 family. (objectui `b0236259e`) +- **patch** — `ActivityTimeline` speaks the session locale — the other 18 literals (objectui#7149). (objectui `d8ec8d6d4`) +- **patch** — Parse a `droppedFields` wire entry's `fields` elements and its `object` at the write-warning boundary instead of asserting them. (objectui `f75810e7c`) +- **patch** — A sankey that drew only SOME of its rows now says how many (objectui#7148). (objectui `40c4711d6`) +- **patch** — A lookup cell in `ObjectGrid` now honours the author's `displayField` (objectui#6875). (objectui `9700dd94e`) +- **patch** — `ActivityTimeline`'s empty state speaks the session locale (objectui#7142). (objectui `854cba346`) +- **patch** — Studio Interfaces pillar: a canvas block selection no longer outlives the leaf it was made on (objectui#7137). (objectui `0101fabab`) +- …and 118 more releasing changesets in this range (list capped at 100; see the objectui range below). + +⚠️ 15 of these carry a breaking change: 15 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 25 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ docs(skills): correct 25 false facts in the published objectui skill package (#7098) (objectui `fd11e1644`) +- _(no changeset)_ chore(ci): slow both dependabot channels from weekly to monthly (#7040) (objectui `50afa361d`) +- _(no changeset)_ docs(agents): sync the governed-surface section to the shipped guard (#6984) (objectui `836e97971`) +- _(no changeset)_ feat(scripts): guard a package's published contract fields, not only its source (#6999) (objectui `8e9461b84`) +- _(no changeset)_ fix(devx): add a property-chain leg to check-i18n-dead-keys (#6995) (objectui `2878cede4`) +- _(no changeset)_ docs(skills): sever the X-Tenant-ID cause-and-effect in the auth guide (#6974) (objectui `4357ec754`) +- _(no changeset)_ feat(hooks): mirror the origin/main ENUMERATION guard, and record the incident here (#6908) (objectui `b28a2c5d0`) +- _(no changeset)_ docs(guide): correct layout guide's PageHeaderProps key list and registration inputs (#6082) (objectui `689ae3d13`) +- _(no changeset)_ docs(skills): mark the two non-canonical row-predicate spellings as deprecated (#6865) (objectui `335523906`) +- _(no changeset)_ chore(repo): enforce the declared node/pnpm floors at install time (#6351) (objectui `d06059f24`) +- _(no changeset)_ ci(governance): require pinned human approval for governed-surface merges (#6739) (objectui `ff8a25759`) +- _(no changeset)_ docs(skills): align data-integration guide with the real QueryParams/SortConfig/QueryResult contracts (#6737) (objectui `cf0c755a2`) +- _(no changeset)_ docs(skills): put the GanttConfig keys back under the gantt block (#6742) (objectui `4a4c6a61d`) +- _(no changeset)_ docs(skills): stop teaching the table renderer's retired column aliases (#6738) (objectui `3cef56290`) +- _(no changeset)_ chore(scripts): re-sync the ported sweeper to upstream's H32 board-independent specimens (#6691) (objectui `e0d83da62`) +- _(no changeset)_ perf(console): free the route views the app-shell barrel held in the eager closure (#6682) (objectui `3fa73bf49`) +- _(no changeset)_ fix(pm): re-sync the ported half-state sweeper and pin it against upstream (#6672) (objectui `5afc5faf4`) +- _(no changeset)_ docs(fields): teach the spec's `{ lat, lng }` as the stored location value (#6671) (objectui `ece688827`) +- _(no changeset)_ feat(pm): re-enable H22 behind a dated closure floor (#6641) (objectui `88726dd44`) +- _(no changeset)_ docs(plugin-form): document FormFieldTab.visibleWhen and its support boundary (#6628) (objectui `efdc6c626`) +- _(no changeset)_ docs(console): rewrite error-tracking guide for the two-key telemetry gate (#6601) (objectui `9363ad0e8`) +- _(no changeset)_ fix(examples): put `role` / `status` back in the two `plugin-form` entries (#6556) (objectui `9ae08eafc`) +- _(no changeset)_ test(examples): the catalog mirror declares the `select` options the host declares (#6539) (objectui `10725fbde`) +- _(no changeset)_ fix(examples): follow the declared `MenuItem` spellings in the menubar demo (#6525) (objectui `ecc2fadb3`) +- _(no changeset)_ fix(examples,docs): drop the `provider` key the toaster surface never declared (#6512) (objectui `50f987f9a`) + + + +objectui range: `9602dc820450...d8ec8d6d4f01` diff --git a/.objectui-sha b/.objectui-sha index bd952a69cd..a261c4262a 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -9602dc820450dda956843c6cfe5b329bcf88c757 +d8ec8d6d4f011b11c8eb1e6dbd364ef206711391 diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index 6d661f4f2f..91346738d0 100644 --- a/packages/sdui-parser/objectui-lockstep.json +++ b/packages/sdui-parser/objectui-lockstep.json @@ -5,9 +5,9 @@ "ONE SIDE ONLY: this file holds no diff and blesses no divergence — see scripts/check-sdui-lockstep.mjs." ], "objectui": { - "repo": "objectstack-ai/objectui", - "rev": "45a9aeb57c1374171a5c95ec8aa02adfd731e915", - "revDate": "2026-08-30T06:17:22+00:00", + "repo": "https://github.com/objectstack-ai/objectui.git", + "rev": "d8ec8d6d4f011b11c8eb1e6dbd364ef206711391", + "revDate": "2026-09-01T08:23:58+00:00", "source": "packages/sdui-parser/src", "files": [ "packages/sdui-parser/src/codegen.ts", @@ -20,7 +20,7 @@ "packages/sdui-parser/src/validate.ts" ] }, - "recordedAgainstPin": "9602dc820450dda956843c6cfe5b329bcf88c757", + "recordedAgainstPin": "d8ec8d6d4f011b11c8eb1e6dbd364ef206711391", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", diff --git a/packages/spec/src/data/api-methods-batch-conformance.test.ts b/packages/spec/src/data/api-methods-batch-conformance.test.ts index b36e268441..a51a7f0419 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,18 +61,20 @@ const SINGLE_RECORD_WRITE_ONLY: Record = { // `revoked` on ONE key. The multi-select surface this rule protects does not // exist for API keys, and the shape a future one would take does not need // `bulk` either — both read off the console build this release pins - // (`.objectui-sha` = `9602dc820`, `packages/plugin-grid`; re-measured at - // that pin, 2026-08-28 — previously measured at `190fbd01d`, before that at - // `9a3daf8d3`, originally at `6314e87f2`. `ObjectGrid.tsx` DID change across - // the move off `190fbd01d`, so both claims below were re-derived rather than - // carried over: `ObjectGrid.tsx:2586-2601`, whose block is byte-identical to - // the one cited at `190fbd01d:2492-2507` and shifted only by insertions above - // it, and `hooks/useBulkExecutor.ts:284-289`, in a file byte-identical at both - // pins. That second span is WIDENED BY ONE LINE from the `284-288` cited - // before: it stopped short of `label = 'bulk delete'`, truncating the second - // of the two branches it names — the #10274 class of anchor error, found here - // by re-reading rather than by the file changing, which is why byte-identity - // is never taken as proof an anchor is right): + // (`.objectui-sha` = `d8ec8d6d4`, `packages/plugin-grid`; re-measured at + // that pin, 2026-09-01 — previously measured at `9602dc820`, before that at + // `190fbd01d`, `9a3daf8d3`, originally at `6314e87f2`. `ObjectGrid.tsx` DID + // change across the move off `9602dc820`, so both claims below were + // re-derived rather than carried over: `ObjectGrid.tsx:3187-3202`, whose + // block is byte-identical to the one cited at `9602dc820:2586-2601` and + // shifted only by insertions above it, and + // `hooks/useBulkExecutor.ts:284-289`, in a file byte-identical at both pins + // and re-READ there rather than carried on that identity — it still ends on + // `label = 'bulk delete'`, the line the `284-288` span cited two pins ago + // stopped short of, truncating the second of the two branches it names (the + // #10274 class of anchor error, found by re-reading rather than by the file + // changing, which is why byte-identity is never taken as proof an anchor is + // right): // // · No checkbox column is rendered. None of the object's four list views // declares `bulkActions` / `bulkActionDefs` / `selection`, and `ObjectGrid` diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 4b9631345c..e54b73bdb7 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -274,15 +274,17 @@ describe('PageAccordionProps variant (#6776)', () => { // sweep once read as declared-but-unenforced. It has a live cross-repo consumer: // objectui's `PageAccordionRenderer` renders `{item.icon && }` inside the `AccordionTrigger` -// (`packages/components/src/renderers/layout/containers.tsx:851-857`), and the +// (`packages/components/src/renderers/layout/containers.tsx:918-924`), and the // same file's `ComponentRegistry.register('accordion', …)` publishes the key to -// the Studio block designer at `:898` (the `items` input, documented as +// the Studio block designer at `:965` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `9602dc820`. Re-derived at that pin -// 2026-08-28: `containers.tsx` is byte-identical to the one at `190fbd01d`, so -// both anchors above are unmoved — and both were re-READ at the new pin rather -// than inferred from that identity, because identity preserves a wrong anchor -// as faithfully as a right one (#10274). +// builds against — `.objectui-sha` = `d8ec8d6d4`. Re-derived at that pin +// 2026-09-01: `containers.tsx` DID change across the move off `9602dc820`, so +// both anchors above were re-derived rather than carried over — the icon block +// moved `851-857` → `918-924` and the registration input `898` → `965`, both +// shifted by insertions above them, with the cited text itself unchanged. Every +// anchor was re-READ at the new pin, never inferred, because identity preserves +// a wrong anchor as faithfully as a right one (#10274). // // #9397 spent a full dispatch cycle re-deriving that read point from scratch // after the sweep proposed retiring the key. This block plus the `.describe()` @@ -361,14 +363,16 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same bare declaration a liveness sweep reads as declared-but-unenforced. // objectui's `PageTabsRenderer` renders `{item.icon && }` inside the `TabsTrigger` -// (`packages/components/src/renderers/layout/containers.tsx:662-668`), and the +// (`packages/components/src/renderers/layout/containers.tsx:729-735`), and the // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the -// Studio block designer at `:721` (the `items` input, documented as +// Studio block designer at `:788` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `9602dc820`. Re-derived -// at that pin 2026-08-28: `containers.tsx` is byte-identical to the one at -// `190fbd01d`, so both anchors above are unmoved — and both were re-READ at the -// new pin rather than inferred from that identity (#10274). +// the pin this repo builds against — `.objectui-sha` = `d8ec8d6d4`. Re-derived +// at that pin 2026-09-01: `containers.tsx` DID change across the move off +// `9602dc820`, so both anchors above were re-derived rather than carried over — +// the icon block moved `662-668` → `729-735` and the registration input +// `721` → `788`, both shifted by insertions above them, with the cited text +// itself unchanged. Both were re-READ at the new pin, never inferred (#10274). // // #9397 spent a full dispatch cycle re-deriving the accordion's read point // after the sweep proposed retiring it. This block plus the `.describe()` it @@ -2437,18 +2441,22 @@ describe('#7751 — object-* block props schemas', () => { // #9881 and #9972 recorded the accordion and tab items; these two close the set. // // The button record re-measured at the pin this repo builds against — -// `.objectui-sha` = `9602dc820`, re-derived there 2026-08-28. This is the first -// move that changed the button READ POINT and not merely its line numbers: -// objectui#5993 deleted `button.tsx`'s file-local `toPascalCase` + -// `iconNameMap` + `icons` index and routed the button through the SHARED -// `resolveIcon` that every `action:*` site already used, so the resolution -// anchor now hops into `renderers/action/resolve-icon.ts`. What an author sees -// did not move with it: an unknown name still resolves to `null` and draws -// nothing, which is still the `LazyIcon` contrast the third test below pins. -// The earlier moves were line-number drift only — #10137 moved the pin while -// #9881/#9972 still cited `82a94170c`, #10274 re-measured those four onto -// `9a3daf8d3`, and `button.tsx` was byte-identical at `9a3daf8d3` and -// `190fbd01d`. +// `.objectui-sha` = `d8ec8d6d4`, re-derived there 2026-09-01: `button.tsx` and +// `resolve-icon.ts` are both byte-identical to the ones at `9602dc820`, and +// every anchor below was still re-READ at the new pin rather than carried on +// that identity (#10274). The move off `9602dc820` changed neither the read +// point nor a single line number here. +// The one move that changed the button READ POINT and not merely its line +// numbers was the one onto `9602dc820`: objectui#5993 deleted `button.tsx`'s +// file-local `toPascalCase` + `iconNameMap` + `icons` index and routed the +// button through the SHARED `resolveIcon` that every `action:*` site already +// used, so the resolution anchor hops into `renderers/action/resolve-icon.ts`. +// What an author sees did not move with it: an unknown name still resolves to +// `null` and draws nothing, which is still the `LazyIcon` contrast the third +// test below pins. The moves before that were line-number drift only — #10137 +// moved the pin while #9881/#9972 still cited `82a94170c`, #10274 re-measured +// those four onto `9a3daf8d3`, and `button.tsx` was byte-identical at +// `9a3daf8d3` and `190fbd01d`. describe('ElementButtonPropsSchema icon liveness (#10053)', () => { const button = ComponentPropsMap['element:button']; diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index c09d708b0a..82e973e081 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -642,14 +642,17 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9602dc820`; re-derived at that pin 2026-08-28 — - * `containers.tsx` is byte-identical to the one at `190fbd01d`, so both - * anchors below are unmoved, and both were re-READ there rather than - * inferred from that identity): `containers.tsx:662-668` renders + * (`.objectui-sha` = `d8ec8d6d4`; re-derived at that pin 2026-09-01 — + * `containers.tsx` DID change across the move off `9602dc820`, so both + * anchors below were re-derived rather than carried over, the icon block + * moving `662-668` → `729-735` and the registration input `721` → `788`, + * both shifted by insertions above them with the cited text unchanged; + * both were re-READ there, never inferred): `containers.tsx:729-735` + * renders * `{item.icon && }` inside the * `TabsTrigger`, left of the label span (`mr-1.5 h-3.5 w-3.5 shrink-0 * opacity-70`, `aria-hidden`), and the renderer's registration publishes - * the key to the Studio block designer at `:721` (the `items` input, + * the key to the Studio block designer at `:788` (the `items` input, * documented as `[{ label, value?, icon?, count?, visibleWhen?, children * }]`). * @@ -1698,14 +1701,17 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9602dc820`; re-derived at that pin 2026-08-28 — - * `containers.tsx` is byte-identical to the one at `190fbd01d`, so both - * anchors below are unmoved, and both were re-READ there rather than - * inferred from that identity): `containers.tsx:851-857` renders + * (`.objectui-sha` = `d8ec8d6d4`; re-derived at that pin 2026-09-01 — + * `containers.tsx` DID change across the move off `9602dc820`, so both + * anchors below were re-derived rather than carried over, the icon block + * moving `851-857` → `918-924` and the registration input `898` → `965`, + * both shifted by insertions above them with the cited text unchanged; + * both were re-READ there, never inferred): `containers.tsx:918-924` + * renders * `{item.icon && }` inside the * `AccordionTrigger`, grouped with the label in the trigger's one wrapping * span, and the renderer's registration publishes the key to the Studio - * block designer at `:898` (the `items` input, documented as + * block designer at `:965` (the `items` input, documented as * `[{ label, icon?, collapsed?, children }]`). * * Vocabulary is Lucide, resolved through objectui's `LazyIcon` @@ -1875,9 +1881,12 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9602dc820`; re-derived at that pin 2026-08-28 — the - * read point MOVED rather than died, and the anchors below now hop into a - * second file): `components/src/renderers/form/ + * (`.objectui-sha` = `d8ec8d6d4`; re-derived at that pin 2026-09-01 — + * `button.tsx` and `resolve-icon.ts` are both byte-identical to the ones at + * `9602dc820` and every anchor below is unmoved, each one re-READ at the new + * pin rather than carried on that identity (#10274). The read point MOVED + * rather than died on the earlier hop onto `9602dc820`, which is why the + * anchors below span a second file): `components/src/renderers/form/ * button.tsx:36` resolves `schema.icon` through the shared `resolveIcon`, * and `:57` / `:59` render it on either side of the label per * `iconPosition` (`mr-2 h-4 w-4` left, `ml-2 h-4 w-4` right), both @@ -2456,12 +2465,15 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9602dc820`; re-derived at that pin 2026-08-28 — of the + * (`.objectui-sha` = `d8ec8d6d4`; re-derived at that pin 2026-09-01 — of the * files in the chain below, `index.tsx` DID change across the move off - * `190fbd01d` and its anchor moved `161` → `204`, while `ObjectMetricWidget - * .tsx`, `MetricWidget.tsx`, `MetricCard.tsx` and `lazy-icon.tsx` are - * byte-identical to the ones at `190fbd01d`; every anchor below was re-READ - * at the new pin rather than inferred from that identity), and the chain runs + * `9602dc820` while `ObjectMetricWidget.tsx`, `MetricWidget.tsx`, + * `MetricCard.tsx` and `lazy-icon.tsx` are byte-identical to the ones at + * `9602dc820`; this time NO anchor moved, `index.tsx`'s included — its + * `object-metric` registration begins at `:194` and the icon input still + * lands on `:204`, the change to that file sitting elsewhere in it. Every + * anchor below was re-READ at the new pin rather than inferred from either + * that identity or that unchanged number), and the chain runs * three files: * `plugin-dashboard/src/index.tsx:204` publishes it as a designer input * (`Icon (Lucide name)`) on the registered `object-metric` block; diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index 7694e8d66d..5cd4dad238 100644 --- a/scripts/sdui-manifest.record.json +++ b/scripts/sdui-manifest.record.json @@ -9,10 +9,10 @@ "a pin bump without regeneration goes RED there — that is the anti-rot half of the freshness gate.", "Regenerate + re-record: node scripts/gen-sdui-manifest-node.mjs (see its header for the offline mode)." ], - "objectuiSha": "9602dc820450dda956843c6cfe5b329bcf88c757", + "objectuiSha": "d8ec8d6d4f011b11c8eb1e6dbd364ef206711391", "objectuiPackagesVersion": "17.6.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-08-30", + "generatedAt": "2026-09-01", "sha256": "49211fee7792cf51174930dc2c1be2169d5175f77a83491f68f90b3f0c19e69d", "components": 57 }