chore(deps): resolve @objectstack/* 17.6.0 in pnpm-lock.yaml and follow its mechanical contract moves; five owner-held reds reported by row (objectui#11438) - #11531
Conversation
…i#11438) Regenerated with pnpm 10.31.0 only, by the raise-and-restore route the 17.5.0 bump used: every @objectstack/* specifier raised to ^17.6.0 for one `pnpm install`, every manifest restored byte-for-byte to HEAD, then a second `pnpm install` reconciles the importers to their declared ranges. Resolution census against the base lock: the seven @objectstack/* packages (spec, types, core, client, formula, lint, sdui-parser) move 17.5.0 -> 17.6.0 and nothing else moves. No importer specifier changes. The registry's new `deprecated` field on twelve @yuku-analyzer/binding-* 0.8.7 entries is written into the lock by the same tooling. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…, a component under a name @objectstack/spec 17.6.0 now exports (objectui#11438) @objectstack/spec 17.6.0 exports `EmptyState` from `@objectstack/spec/ui`: the authoring type of a list view's empty-state config (title, message, icon). @object-ui/components publishes `EmptyState` as an alias of the `DataEmptyState` React component. A component is not a config shape, so neither import nor derivation fits; the alias is a published name, so its retirement or rename belongs to its own card. Same disposition objectui#11073 gave the four `Object*Props` collisions 17.5.0 surfaced. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…ing now that @objectstack/spec 17.6.0 carries the arm (objectui#11438) objectui#11206 widened `STRIPPED_LINE`'s key type by `| 'computed'` so it compiled against both a three-arm pin and objectstack `main`, and left a tripwire in `writeWarningToast.test.ts` for the bump that carries the arm. 17.6.0's `DroppedFieldsEventSchema.reason` lists `computed`, so this does what the tripwire says: the key type is the spec union again, the `computed` case is spelled as the literal, the spent tripwire is deleted, and spec-symbol-batch6's `_ReasonIsTheEnum` pins the exact four-member union. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…spec/migrations, where 17.6.0 moved it (objectui#11438) 17.6.0 carries the spec's migrations-entry-split: `MIGRATIONS_BY_MAJOR` is exported from `@objectstack/spec/migrations` and no longer from the root. The test read the root dynamically so it compiled against both the old pin and objectstack `main`, with no fallback, and its docblock asked the bump that moves the pin past the split to replace that with a static import from the subpath. This does that. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…jectstack/spec 17.6.0 refuses by name (objectui#11438) 17.6.0 carries objectstack#20758: `PageHeaderProps.breadcrumb` is a tombstone refused by name. objectui's renderer has not read it since objectui#11166, and its `inputs` entry said it stayed only while the spec accepted the key and would leave with the retirement. It leaves now, so the registry no longer publishes an input the contract refuses (`registry-inputs-spec-parity.test.ts`, "page:header declares no top-level input the spec does not accept"). The slotted-pages guide example drops `breadcrumb: true`, which the contract now refuses (its pin parses the example against the spec row), and the page-header doc and the renderer comment say the key is refused rather than "accepted until retired". Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…7.6.0 made stale (objectui#11438) objectui#11111 decision 3 = B booked `action:button.endpoint` and `action:icon.endpoint` as spec keys held unpublished, owed to objectui#11168. 17.6.0 refuses `endpoint` on both blocks (objectstack b3917d90, the rename to `target`), so neither entry names a key the spec declares, and the dangling-exemption check reds on them. Both are struck and the ledger cap falls from 3 to 1 (`undoable` stays, still owed to objectui#11168). Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
… group, which @objectstack/spec 17.6.0 adds (objectui#11438) 17.6.0's `GetTranslationsResponseSchema.translations` carries a `picklists` group (objectstack addbbf02, the `picklist` metadata kind). The recogniser's group list is written out, and the console's `loadLanguage.test.tsx` walks the spec's list so a group the spec adds turns it red instead of a bundle carrying only that group being returned untransformed and read by nothing. Added; the transform already copies an unlisted group through onto `app`. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…t its key, as @objectstack/spec 17.6.0 raises it (objectui#11438) Through 17.5.0 the spec raised the reserved-name refusal on the `fields` map (`custom @ fields`). objectstack#20997 names the key, and 17.6.0 carries it (`custom @ fields.constructor`). The pin said only this reading moves when that lands; it moves, in the instrument row and in the banner row, which now names `fields.constructor`. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…@objectstack/spec 17.6.0 leaves true, and ledger the four that name a past release (objectui#11438) `check:installed-pin-claims` reads every present-tense claim about the installed `@objectstack/*` version against the resolved artifact. 38 sites named 17.5.0. Each was decided, never find-and-replaced: - RESTAMPED after re-measuring the fact the sentence states against the installed 17.6.0 (each probe was also run against a 17.5.0 tarball as the control, and answered the same on both): `FieldSchema`'s `dependsOn`, `rows` and option `description` readings; `object-calendar.data` and `.calendar`; `record:details.columns`; `record:highlights` `fields[]` and `layout`; `SelectOptionSchema` labels; the `@objectstack/lint` field-rule verdict text; `referenceTo` and its four alias spellings; `CalendarConfigSchema`'s required key, options and refusal hints; `record:alert.visible`; `object-kanban`'s fifteen keys; the screen node's `waitForInput`; `object-calendar`'s ten flat members; `ObjectListViewSchema`'s members; the `view.list.navigation.view` tombstone in the gantt README pin; and the sites whose own tests measure the fact and pass on 17.6.0. - REWORDED where the fact moved: the retired-key type is the branded `[REMOVED]` mark at the pinned 17.6.0 (bare `undefined` through 17.5.0), on `retired-key-type.ts` and the five pins that cite its spellings. - LEDGERED as `historical` (four files, seven sites): lines whose version says WHEN something changed or names a release's record set, where `pinned` is an unrelated verb or the sentence sits under a dated update heading. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…438) Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…ack/spec 17.6.0 moves, and pair the live-e2e backend with it (objectui#11438) Each pin names what moved, measured against a 17.5.0 control: - `ObjectSchema`'s accepted keys are 44, not 43: 17.6.0 adopts `imageField` (gained set exactly that one, lost set empty). Both corpus-guard counts are re-pointed as the 17.3.0 adoption was. - The spec's exports map has 21 entries, not 20: `./migrations` is added (no `browser` arm), nothing removed. Every count and its prose follow. - `check-lockfile-integrity`'s two lockfile samples are rebuilt on the 17.6.0 snapshot keys their own tripwire named. - The objectui#11111 owner total for objectui#11168 follows the cap to 1 (the two `endpoint` entries struck earlier on this branch). - `e2e/live/ci/backend.env` pins `OBJECTSTACK_VERSION=17.6.0`, the version the lockfile resolves, as the pin requires (`@objectstack/cli@17.6.0` resolves to the 17.6.0 tag commit). - The page-header doc drops the version literal it gained on this branch; `doc-version-claims` holds docs to pointers, not version numbers. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…k/spec 17.6.0, so it joins the covered arms (objectui#11438) 17.6.0 types `ComponentPropsMap['object-grid'].grouping` as the grouping config instead of `z.unknown()`. The authored arm's `properties` is that row by reference, so a padded grouping field name is now refused at its entry on all four faces. The census's recorded reason for leaving the bag member uncovered stopped holding; it moves to the declaring table and is pinned like every other arm. The node-level `grouping` stays uncovered: it is the flat spelling's by-name refusal. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
…stack/spec 17.6.0's walk descends it (objectui#11438) objectui#11223's block (e) held `page:card`'s `properties.footer` as the one slot the spec's exported walk did not descend, and said to retire itself when that changed. 17.6.0's walk descends `properties.footer[]`, objectui's faces now judge a footer child, and block (d) asked for the position to be added to (a). It is: the footer is a row of (a) on both faces, (e) is deleted, and the CLI doc no longer names the footer as an unjudged slot. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
… @objectstack/spec 17.6.0's root entry shed (objectui#11438) The second payback of objectui#11073's ruled raise, objectstack#20646, reaches objectui with the 17.6.0 bump: the spec root no longer exports its migration chain. Measured with two console builds in one lock hold (`CI=true pnpm exec vite build` after the packages build): `main` at `2d576e46` (17.5.0) weighs 3,636,289 gzipped eager bytes, this branch at `2ba091c` weighs 3,386,193; `vendor-objectstack` alone is -250,108, the other 329 chunks +12. Left alone, the ceiling would sit 3.01x the regression above the payload and the gate's own sensitivity check exits 2 (a blind gauge). So, as objectui#11101 did for the first payback: `MAX_EAGER_CLOSURE_GZIP_BYTES` 3,660,380 -> 3,410,284 and `vendor-objectstack` 1,689,265 -> 1,439,157, each lowered by exactly what it recovered; BASELINE and PER_CHUNK_BASELINE move to the `2ba091c` reading; headroom 0.26x and 0.20x, the bands `main` already had. The test's rendered literal is re-taken (3306.8). The changeset says what the console gains. Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
One conflict, resolved mechanically: packages/plugin-grid/src/index.tsx, GRID_QUERY_INPUTS. main's rewritten `conditionalFormatting` input (objectui#11533) is kept exactly as main has it, and objectui#11227's `emptyState` comment and entry follow it. No other edit. Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37 Co-authored-by: Claude <noreply@anthropic.com>
|
Cross-seat note for the trunk owner, from Under ruling A′ (
Next, in order: objectui#11094's slice (row 4, contract PASS For this PR's body, when you next touch it: "Still red" row 1 is down to one key owed to objectui#11068, and the slices so far each declare Generated by Claude Code |
…ctui#11094's slice
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…ensus to objectui#11334 under objectui#11438 ruling A″ The spec that objectui#11531 resolves adds `checkDashboardWidgetDimensionlessMeasureArity` to `DashboardWidgetSchema` (objectstack `11d28c17`, #21053). objectui's mirror cannot re-attach it by static import: objectstack `main` renamed the export (`32d57690`), and the Spec Main Shape Gate refuses the 17.6 name. objectui#11438 ruling A″ (record 5968177777) books row 3 to objectui#11334 with an expiry, in objectui#11111 decision 3 = B's shape. - The `DashboardWidgetSchema (complex.zod.ts)` row's `notAttachable` list books the check, written OWED TO objectui#11334. Expires when objectui resolves an `@objectstack/spec` carrying `32d57690`, or 2026-11-02, whichever is first. - The census bounds the booking: the row's count equality and the exact export-name match admit nothing beyond the listed entry, and the expiry condition turns the name census red by name. - An empty-frontmatter changeset declares no release; the test is excluded from `dist`. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
…ws of both 8894 measure-door tests to objectui#11334 under objectui#11438 ruling A″ Both files derive FAMILY by effect, so the spec's dimensionless measure-arity check (objectstack `11d28c17`, #21053) put pie, donut, funnel, scatter, treemap, sankey and radar into it, and objectui's door does not refuse them: the mirror waits for objectui#11334, because objectstack `main` renamed the export (`32d57690`). The seat ruled Q1 = A on objectui#11334 (record 5968413148): a bounded in-file ledger with inverted pins, under ruling A″ (record 5968177777) and objectui#11111 decision 3 = B (record 5902351047). - `OWED_TO_OBJECTUI_11334` names exactly the seven types in each file, with the owner, the rulings and the expiry: objectui resolves an `@objectstack/spec` carrying `32d57690`, or 2026-11-02, whichever is first. - The listed types' rows assert today's difference: the spec refuses, and objectui's door accepts (types); the add control is offered and no stored refusal is shown (panel). - Cap rows require the FAMILY types objectui fails to refuse to equal the ledger exactly, so a new difference is red, and so is a listed type objectui starts refusing once the mirror attaches. - The metric family's rows keep their assertions byte for byte; they iterate FAMILY minus the ledger, and a row keeps that set non-empty. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…igation, to objectui#11068 under objectui#11438 ruling A″ @objectstack/spec 17.6.0's object-grid row declares `keyboardNavigation`, and the grid's `inputs` do not publish it: objectui#11068 is building the key's reader and publishes the key with it. objectui#11438 ruling A″ (record 5968177777) books a row whose slice is not accepted when the row-3 booking is pushed "the same way, to their own cards", in objectui#11111 decision 3 = B's shape (record 5902351047). On the trunk tip c4775ed the parity file had exactly two red rows, both reading ['keyboardNavigation']; with this booking it reads 255 / 255. - UNPUBLISHED_EXEMPTIONS books `object-grid.keyboardNavigation` OWED TO objectui#11068, with an expiry: 2026-11-02 (ruling A″ is of the same day as ruling A′), or when objectui#11068 lands, whichever is first. - objectui#11068 joins the ledger's owners as the fifth, routed by exact id; the `unpublishedKeys` cap goes 11 -> 12 and the per-owner totals gain objectui#11068: 1. No other cap moves (the key is boolean-armed, so no member pin is owed). - `the four GA blocks resolve their ruled split` refused any exemption on the four GA blocks except the ruled carve-out, so the ledger entry alone left it red. It now admits this one OWED id BY NAME: the OWED entries on the four blocks must equal ['object-grid.keyboardNavigation'] exactly, the undeclared set must equal the booked set (so the build's landing turns it red until the booking is struck), and every other exemption on the four blocks is still refused. objectui#4648's docblock states the exception. - Changeset: empty frontmatter; the file is unreachable from the console bundle and `plugin.*`. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
…, in English (objectui#11068) The owner paragraph quoted the maintainer's order in Chinese; this repo's codebase rule keeps code comments English, so it now cites record 5968177777 and says what the order was. No assertion moves. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…es, to objectui#11344 under objectui#11438 ruling A″ @objectstack/spec 17.6.0's ActionSchema declares `outcomeMessages`, and objectui does not read it yet: objectui#11344 is building the reader and lists the key with it. objectui#11438 ruling A″ (record 5968177777) books a row whose slice is not accepted when the row-3 booking is pushed "the same way, to their own cards", in objectui#11111 decision 3 = B's shape (record 5902351047). On the trunk tip bebd7ec the pin file had exactly one red row, "lists every key the spec ActionSchema declares", reading missing ['outcomeMessages'] and stale []; with this booking it reads 20 / 20. - `OWED_TO_OBJECTUI_11344` books `outcomeMessages`, with the owner, the rulings and the expiry: 2026-11-02, or when objectui#11344's slice lands, whichever is first. - "lists every key the spec ActionSchema declares" now requires `missing` to EQUAL the ledger exactly, and `stale` stays []. A new spec key is red, and so is the booked key once objectui lists it, so the booking cannot outlive the reader. - A new OWED row asserts today's difference: the spec declares the key, and neither `SPEC_ACTION_KEYS` nor `KNOWN_ACTION_KEYS` knows it. - Changeset: empty frontmatter; the file is under `src/**/__tests__/**`, which the package's build program excludes. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
…jectui#11227) `@object-ui/types` publishes types that read `EmptyState` and a zod mirror that reads `EmptyStateSchema`, both from `@objectstack/spec/ui`. Neither export exists in `@objectstack/spec` 17.5.0, which the old `^17.5.0` range admitted; both ship from 17.6.0. `pnpm check:spec-floors`, over a full workspace build of the trunk tip, named exactly this floor (two floor-too-low findings, this package only). The lockfile moves only this importer's `specifier:` line; the resolved `@objectstack/spec` stays 17.6.0. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
…de/issue-11227-types-spec-floor-17-6 The trunk moved by the row-5 booking only, which is disjoint from this slice's three files. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
… that moves (objectui#11227) The objectui#11438 changeset said no declared range moves and that check:spec-floors finds no floor that has to rise. That was true when it was written and went false once @object-ui/types began reading EmptyState / EmptyStateSchema, which @objectstack/spec 17.5.0 does not export. The sentence now names that floor and where it is declared; front matter untouched, prose only. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: objectui#11531 for card objectui#11438. The net diff runs from Inputs read: the card body and all 13 of its comments; the PR body, its file list and the net diff; and the check-runs on this head. I read one thing outside those inputs, and nothing was built or run. To answer the spec-floor question I read the upstream source at the Gate verdicts: all 45 check-runs on this head have concluded. 42 are ① Derived judgmentsEach accept-set and public-surface change the diff implies, judged RIGHT or WRONG. I found nothing WRONG in the diff at this head. Lockfile and declared ranges
Widenings
Narrowings
Bookings under ruling A″ (5968177777, maintainer-confirmed in 5969094657)
The net diff adds no
Gates and tooling
② Semver levelThe PR carries ten changesets and none declares
The fixed group releases at Clause-②: yes (narrowing). The diff widens and narrows at once, and
③ Boundary flagsFrom the two os-dev-reports (5964463223 and 5965464417), the cross-seat comments on the card, and this review. Answered
Escalated
Implemented-by: VERDICT: PASS Generated by Claude Code |
✅ ACCEPT — objectui#11531 as a whole, head
|
Fixes #11438
Fixes #11227
Fixes #11094
What this PR is
pnpm-lock.yamlnow resolves@objectstack/*17.6.0, regenerated with pnpm only and never edited by hand. Every gate that the bump turned red is listed below by row. The mechanical ones are done on this branch. The five that were not mechanical are each resolved on this branch under objectui#11438 ruling A″ (record 5968177777, confirmed by the maintainer: 「确认 A″,17.6 先落地」): row 4 is fixed, and rows 1, 2, 3 and 5 are booked to their owner cards with an expiry. See "Not mechanical" below. The branch head0507d6716is green.mainlock)@objectstack/spec·types·core·client·formula·lint·sdui-parserNothing else moved. The resolution census compares package and snapshot keys between
origin/main's lock and this branch's lock in both directions: seven keys removed at 17.5.0 and seven added at 17.6.0, with no importerspecifierline changed. The 17.6.0 packages ask forzod ^4.6.5, which the lock already resolves.How the lock was regenerated. I used the 17.5.0 bump's route (objectui#11073). Every
@objectstack/*specifier was raised to^17.6.0for onepnpm install. Every manifest was then restored byte for byte to HEAD, and a secondpnpm installreconciled the importers back to their declared ranges. objectui#11509 (the jsdom 29.1 pin) landed onmainwhile this was in flight. I mergedmainas a merge commit, not a rebase. git merged the lockfile without a conflict. Thenpnpm install --frozen-lockfileexited 0 with engine-strict on, a plainpnpm installleft the lockfile byte-identical, and the census against the newmainlock shows only the seven@objectstack/*moves.B3: lockfile-only, or must every floor move?
Lockfile-only, plus the floors the floor gates demand. On the bump alone they demanded none. objectui#11227's slice then made one floor rise:
@object-ui/typesraises its@objectstack/specfloor from^17.5.0to^17.6.0(6b8a0ed96,.changeset/11227-types-spec-floor-17-6.md), because its published types and zod mirror now readEmptyState/EmptyStateSchemafrom@objectstack/spec/ui, which 17.5.0 does not export. No otherpackage.jsonrange moves.check:spec-floors(scripts/check-spec-range-floors.mjs): its header says "A package's declared@objectstack/specFLOOR must carry every symbol that package's own published artifact references". It judges symbol presence only. Over a full build it printed: "✅ Every consumer-facing @objectstack/spec floor carries the symbols its package's artifact references". With--cross-checkit also printed "Dual-package cross-check: 54 entry point(s) — theimportandrequirehalves export the same names". Both exited 0.check:installed-pin-claimsjudges prose about the installed version, never a declared range. Its findings were 38 prose sites, handled below.@objectstack/spec/migrations) is in a test file.@object-ui/typesis now the exception above, and its floor rises with it.Disposition by row
Done here (mechanical)
check:spec-symbols@objectstack/spec/uinow exportsEmptyState, the authoring type of a list view's empty-state config@object-ui/components:EmptyState, which is a React component alias. That is the same disposition objectui#11073 gave the fourObject*Propscollisions.check:installed-pin-claimshistorical. Gate:OK.retired-key-type.tsand five pins)[REMOVED]mark, as onmainmain, bareundefinedthrough 17.5.0"writeWarningToast.test.tstripwireDroppedFieldsEventSchema.reasonlistscomputed| 'computed'widening is gone, the spent tripwire is deleted, and_ReasonIsTheEnumpins the exact four-member unionDatasetWidget.unrenderedMeasures-8894MIGRATIONS_BY_MAJOR(migrations-entry-split)@objectstack/spec/migrations, as its docblock askedPageHeaderProps.breadcrumbis a tombstone (objectstack#20758)page:headerregistration drops itsbreadcrumbinput, which the renderer has not read since objectui#11166; the entry's own comment said it would leave with the retirement. The slotted-pages guide example dropsbreadcrumb: true, and the page-header doc now says the key is refused.action:buttonandaction:iconno longer declareendpoint(objectstackb3917d90)undoableis still owed to objectui#11168.loadLanguage.test.tsxpicklistsgroup (objectstackaddbbf02)@object-ui/i18nrecognises the groupMetadataFieldsPage.refusalIssues-11302constructorfield-name refusal is raised at its key (objectstack#20997)custom @ fields.constructor, which the pin said is the only change neededMetadataService.retiredObjectEnabled/.specKeyObjectPayloadObjectSchemagainsimageField(43 to 44 keys; lost set empty)vite-objectstack-spec-dist.test.ts./migrations(20 to 21; nobrowserarm; nothing removed)check-lockfile-integrity.test.tsci-cd-pipeline-doc.test.tsOBJECTSTACK_VERSION=17.6.0(@objectstack/cli@17.6.0resolves to the 17.6.0 tag commit)grouping-field-padded-refused-7347object-grid.groupingis typed (it wasunknown)nested-page-children-11223page:card'sproperties.footer[]check:eager-closure(Bundle Analysis)vendor-objectstack1,689,265 to 1,439,157. The baselines move to2ba091c. Two console builds were taken in one lock hold, withmain2d576e46as the control; the table is in the file. Left unchanged, the gauge was blind (exit 2, headroom 3.01x).Not mechanical: resolved by row under ruling A″
Each of these rows was owned by a card that waited on this bump while the bump could not land green without it. Ruling A′ (record 5965062249) made this branch the trunk: each owner's slice lands here as commits, reviewed at tier by its lane seat, with merge commits only. Ruling A″ (record 5968177777) lands the trunk on 17.6.0 as soon as it is green. A row that would ship a user-visible regression is fixed here. Any other row is booked to its owner card in objectui#11111 decision 3 = B's shape: a bounded ledger with the owner and an expiry, ⛔ never a skip, a deletion or a weakened assertion. Booked owner cards stay open.
object-griddeclaresdescription,emptyState,keyboardNavigation(objectstackf5c7b2c7, #20882). Fixed for two keys, booked for one.6a86dd13a; contract record 5967010652 on objectui#11227):GRID_QUERY_INPUTSpublishesdescriptionandemptyState, both renderers resolveemptyState's I18nLabel members, and the fourobject-grid-properties-bag-11276.test.tsrows read 17.6.0. This PR completes objectui#11227.keyboardNavigationis booked to objectui#11068 (6c5011ded,bebd7ecdf) inregistry-inputs-spec-parity.test.ts. ItsunpublishedKeyscap rises by exactly that entry, and the GA-block split row admits that one id by name. Expires 2026-11-02, or when objectui#11068's build lands.record:line_itemsgets itsComponentPropsMaprow (objectstack24c554da, #21142 / #21244). Booked to objectui#11536 (00c13e7,c9121f9): ten unpublished keys and two unpinned members, with the caps moved by exactly those entries. Expires 2026-11-02, or when objectui#11536 lands.checkDashboardWidgetDimensionlessMeasureArity; objectstack11d28c17, #21053; objectui#8894 ruling D). Booked to objectui#11334 (0a518da48,c4775ed3a) on the 7715 census row and as a bounded seven-type ledger in both objectui#8894 measure-door tests, each with a cap row.Restart-when: objectstackmainrenamed the export (32d57690), and the Spec Main Shape Gate refuses a static import of the 17.6.0 name. Expires when objectui resolves an@objectstack/specthat carries32d57690.$emptyjoinsFILTER_OPERATORS, andis_empty/is_not_emptylower to it (objectstackf1e921ab, #20446 / #20570). Fixed by objectui#11094's slice (acd62a3a1to8a9cf1b5e, merged as9187c5c40; contract record 5967059614 on objectui#11094).ValueDataSourceexecutesis_empty/is_not_emptyand$empty, andconvertFiltersToASTlowers$empty. This was the one row that would have shipped a user-visible regression. This PR completes objectui#11094. objectui#10813 (the builders) lands onmainafterwards as its own PR.ActionSchemagainsoutcomeMessages(objectstackd6d6e872, #21214). Booked to objectui#11344 (13f07dd0f) inactionKeys.pin.test.ts: the spec-inventory row requiresmissingto equal the one-entry ledger exactly, withstalestill empty, and a new row asserts today's difference. Expires 2026-11-02, or when objectui#11344's slice lands.⛔ None of these assertions was weakened, and no hold was touched.
Tests
CI on the branch head
0507d6716(CI run 37123597204 on0507d67167a1eaf29ca0635fdecc6afe708fc209): 45 check runs, 42successand 3skipped;Lint,Type Check, all eightTestshards,Test (dist pins),Spec Main Shape Gate,Build & E2EandBundle Analysisamong them. The Vercel status issuccess.mergeable_stateisclean, and the branch is 0 commits behindmain.The readings that led here, all in families under "Not mechanical": 51 failures at
da4c629f1, 40 at9187c5c40(row 4 fixed), and 1 atbebd7ecdf(row 5, before its booking).Earlier, on the merged head
40d9b5a, the whole suite ran with the repository-root formpnpm exec vitest rununder the verify lock:All 60 failures are the five families under "Still red": 7 + 21 + 14 + 2 rows from families 1 to 3, 6 + 1 + 1 + 1 + 1 + 1 rows from family 4, and 1 row from family 5. No other test failed.
turbo run type-checkran 81/81 tasks on the same head. On the lockfile-only commit3796d59, the bump-caused reds also included every mechanical row in the table above. Each of those rows is green here.The
mainthat this branch merged had moved by one more commit before this PR opened (6903eaf, objectui#11523, docs only). The merge queue rebuilds on it.Changeset
Ten changesets, no
major:.changeset/11438-objectstack-17-6-bump.md:@object-ui/components,@object-ui/i18nand@object-ui/console, allpatch..changeset/11227-object-grid-17-6-keys.md:@object-ui/plugin-gridminor,@object-ui/typesminor,@object-ui/plugin-listpatch..changeset/11227-types-spec-floor-17-6.md:@object-ui/typespatch, the@objectstack/specfloor to^17.6.0. The bump's own changeset names this as the one declared range that moves..changeset/11094-value-source-empty-operator.md:@object-ui/coreminor..changeset/11068-row1-booking-17-6.md,11334-row3-booking-17-6.mdand11344-row5-booking-17-6.md: empty frontmatter; test-only bookings..changeset/11068-grid-declared-keys.md,11276-object-grid-properties-bag.mdand11276-plugin-grid-properties-bag-docs.md: pending changesets corrected by objectui#11227's slice, which made a sentence in each false.The readings below were taken on
40d9b5a, before the owner slices.node scripts/check-changeset-presence.mjs: "✅ 33 source file(s) of 14 released package(s) changed, and this change declares 1 changeset(s): .changeset/11438-objectstack-17-6-bump.md." (exit 0)check-changeset-no-major: exit 0.check:changeset-claimsexits 0. It is report-only, and it asks for a read of 59 pending changesets that name a file this branch edits. This branch's edits to those files are restamped comments, a test re-pin, or thebreadcrumbinput. None of them changes a fact those changesets state.Gates
Every gate below ran locally on the merged head
40d9b5a. The packages and the console were rebuilt there before any gate that readsdistran. Exit codes were captured before any pipe.pnpm install --frozen-lockfile(engine-strict on, after the merge)check:lockfile-integrityVERDICT cleancheck:lockfile-dedupeVERDICT dedupedcheck:spec-floors(+--cross-checkon the pre-merge build)check:installed-pin-claimsOKcheck:spec-symbolscheck:component-surface-paritymaincontrol build.check:action-forward-parity·check:designer-field-key-paritycheck:phantom-deps·check:unused-depscheck:doc-snippets·check:doc-examples·check:doc-types·check:prompt-keys·check:skill-examplescheck:pre-install-import-graph·check:control-bytes·check:new-line-citationscheck:eager-closure·check:eager-locale-cataloguesturbo run type-check --concurrency=2turbo run build --filter=!@object-ui/siteSize and route
2,595 changed lines (+2,090 / −505) across 83 files, lockfile included, which is under the 5,000-line human-merge line.
node scripts/check-governed-merges.mjs --pr objectstack-ai/objectui#11531(objectstack) on the final file list: 0 of 83 paths hit the governed register, NOT GOVERNED. Clause ②: yes. objectui#11227's and objectui#11094's slices declare it in their claims, and each carries an at-tier contract record on its own card (5967010652, 5967059614). This PR lands on a contract record at its final head.(The bump alone, before the owner slices, was 726 changed lines across 46 files against the merge base
8366acc, Clause ②: no.)Acceptance notes (observations, not filed)
packages/types/src/objectql.ts, theObjectCalendarSchema.datadocblock: the sentence "object-mapandobject-gantthave noComponentPropsMaprow at all" was already false at 17.5.0. Both rows exist at 17.5.0 and at 17.6.0. I restamped only the measured line beside it.retired-key-type.ts: the bare-undefinedarm now describes no installed spec, so it can be dropped. That tightens a helper every retirement pin reads, so I kept it here.@object-ui/i18nnow namespaces apicklistsgroup underapp. Nothing in objectui readsapp.picklistsyet; that is the picklist feature's work (objectui#10202, held), not this bump's.BASELINE.squashMergeinscripts/check-eager-closure-budget.mjsstaysnulland is owed a back-fill once this lands, the same as after objectui#11101.Deviation
The container runs Node 22.22.0. Before objectui#11509 reached this branch, the root
jsdom ^30.0.1required^22.22.2, and.npmrc'sengine-strict=truerefused every install. Until the merge, local installs ran with--config.engine-strict=false. That flag turns an engine refusal into a warning and does not change resolution: pnpm passesengineStrictonly to the installability check, not to the resolver. After the merge, every install and gate above runs with engine-strict on.The session that ran this is
session_01HRYqpqGcWpJuJkDmbRF75w, dispatched by objectstack'sdomain:devxseat 2.Generated by Claude Code