Repository navigation
chore(objectui): bump the console pin to 0abd4f9f8769 (carries objectui#11636, #11637, #11635, #11624 and #11640) - #21827
Conversation
…the pin citations Moves .objectui-sha from 9dfaca654311 to objectui main 0abd4f9f8769 through scripts/bump-objectui.sh, and re-measures the 54 asserting pin citations in packages/spec/src at the new pin (every cited objectui file is byte-identical across the hop; the migration entries' corpus counts are re-taken with git grep -o -F). Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
…angesets at 0abd4f9f8769 sdui.manifest.json and its record regenerated by gen-sdui-manifest-node.mjs over the tree pnpm objectui:build built at the pin (object-master-detail-form `details` gains `of: object` and a description, objectui#11396); the sdui-parser lockstep record re-recorded with gen:sdui-lockstep (grammar, codes and predicate unchanged); the console changeset's objectui#11170 line made readable; a @objectstack/spec patch changeset for the citations. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
…citation Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 2 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 5 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 139 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 412fea64dea5850353ac3acc15a02bb0f0d70dee && git checkout 412fea64dea5850353ac3acc15a02bb0f0d70dee
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a3ffc4512df5d9ebc1c9e5dee70813d89bf549db e40526e564d9ed123f5d40d6a0d7b646fdbfadbf && git checkout -B drift-repro a3ffc4512df5d9ebc1c9e5dee70813d89bf549db && git merge --no-ff e40526e564d9ed123f5d40d6a0d7b646fdbfadbf
node scripts/docs-audit/affected-docs.mjs --json a3ffc4512df5d9ebc1c9e5dee70813d89bf549db
|
Contract reviewServed-tier: ① Changesets — TRUE
② Review faces — TRUE, citation / comment / describe text only
③ Scope — TRUE, no ride-along, no release act
Implemented-by: VERDICT: PASS Generated by Claude Code |
…objectstack-ai#21994) Fixes objectstack-ai#21989 Clause-②: no ## What this is This PR adds the curated release page for 17.7.0, `content/docs/releases/v17/17-7.mdx` (1,402 lines). It was written after the publish: npm `latest` moved on 2026-10-06, and `@objectstack/spec@17.7.0` went out at 12:22:14Z. It also wires the page in: - `content/docs/releases/v17/meta.json`: `17-7` comes ahead of `17-6`. - `content/docs/releases/v17/index.mdx`: the status blockquote, the minors warning, the per-release list and the checklist links now name 17.7.0 as current. This is the same shape objectstack-ai#21362 used for 17.6.0. - `scripts/docs-audit/handwritten-docs.json`: the page joins the docs-accuracy audit scope. - `content/docs/releases/v17/17-6.mdx`: one dated correction (2026-10-06) on the anonymous-endpoints known issue. objectstack-ai#21158 was closed as not planned on 2026-10-04. The page follows the 17.6 page's structure: 1. Highlights. 2. What's new: the counts, and the runtime changes that happen silently. 3. Breaking changes and migration, triaged by door and subject. It includes a coverage table that names the section carrying the migration for every ADR-0087 entry added since 17.6.0 (8 conversions, 41 D3 entries). 4. New capabilities. 5. Notable fixes. Security fixes are described only as classes and doors. 6. New in Console: each objectui declared-breaking change, with this repo's answer. 7. The code that shipped but is not listed. 8. The upgrade checklist. Every line is marked *Not exercised.* ## Sources and counts - The version commit `4e4e881427` (objectstack-ai#21352) consumed 323 changesets. 322 are new. One, `748b240` (objectstack-ai#21270), shipped in 17.6.0 and is listed again; the page explains this in its own section. - 69 CHANGELOGs carry a 17.7.0 section, and 48 of them have entries. Their 444 entries (194 minor, 250 patch) de-duplicate to the 323 changesets. - Two commits landed on `main` after the Version Packages PR's last refresh and before it merged: - `8a399b2b15` (objectstack-ai#21977, for objectstack-ai#21923) - `04e776b39a` (objectstack-ai#21976, for objectstack-ai#21968) Both are ancestors of the version commit (exit 0 for each), so the 17.7.0 packages carry their code. But the version commit did not consume their changesets, so no 17.7.0 CHANGELOG line names them. The release-integrity audit named both in a warning. - objectui: the pin moved five times and ends at `0abd4f9f8769`: - `89cad75d5570` (objectstack-ai#21380) - `ab1879721595` (objectstack-ai#21625) - `2e818d0b51ec` (objectstack-ai#21710) - `9dfaca654311` (objectstack-ai#21800) - `0abd4f9f8769` (objectstack-ai#21827) Across 173 commits, 254 changesets were added and 229 of them release something. 65 are declared breaking, plus one commit marked `!`. The Console table answers each. - `PROTOCOL_VERSION` is still 17.0.0. ## Premise corrections - The dispatch named two pin moves ending at `9dfaca654311`. The tree has five, ending at `0abd4f9f8769` (`8832655`, objectstack-ai#21827). The page covers all five. - One new D3 id contains a word that `check:role-word` refuses on docs pages, and release pages are not in its baseline. The coverage table therefore names that entry by its subject and points at `os migrate meta --from 17`. ## Fact-check A second pass checked every cited SHA, PR number, key name and behavioural claim against the commits, changesets and registry entries. It corrected **31 claims** (commit `e4a6280b46`). Two more corrections came earlier, while drafting: - objectstack-ai#21361 is closed; it is not tracking the issue. - There are seventeen `ui-object-*` members, not eighteen. Mechanical checks on the final page: - All 276 cited SHAs resolve, in objectstack or in an objectui clone carrying the final pin's history. - Each of the 216 distinct sha–PR pairs matches its commit subject. - Every printable new D3 id (40) and all 8 conversions appear on the page. - The MDX for 17-7, 17-6 and index compiles with @mdx-js/mdx 3.1.1 and remark-gfm 4.0.1. After the fact-check, `main` gained `1abfc58` (objectstack-ai#21985), which lands the read half of objectstack-ai#21922. It is not an ancestor of the version commit: the test returned exit 1, and the control commit `753e7a1` returned exit 0. So in 17.7.0, the metadata door's reads still serve a stored row under a code-defined datasource name. Commit `8347e0d172` says so in the datasource migration bullet. ## Independent fact-check and fix round An independent, read-only fact-check of head `8347e0d172` returned **FAIL** with 13 findings (record: objectstack-ai#21989 comment 6018402030): 2 wrong facts (a flow's `get_record` node still reads the stored-metadata tables, in projected form), 1 security line that named the filter shapes and depth threshold evading 17.6.0's refusal, 1 breaking change missing from the Breaking section (`0fc8087`, objectstack-ai#21626), 1 link whose label did not match its target, 4 overstatements, 1 missing security fix (`49524f6`, objectstack-ai#21420), 1 missing rollback caveat on `os secret rewrap --apply`, and 2 minor wording issues. All 13 were re-verified against their sources and applied in `a53c972fa7`; none was refuted. A scan for any other line naming a bypass shape of a fixed issue reduced two more lines to their class (`0728cbf`, `fb69825`). ## Measured on `a53c972fa7` - Derived gates: `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derives 57 commands; all 57 exited 0 (`--ran`: "57 run, 0 NOT-MEASURED (a DERIVED zero)"). The verdicts include: - check-doc-anchors: 458 links resolve. - check-issue-citations: 305 resolve as a PR, 9 resolve, 15 are cross-repo; every citation this change adds resolves. - `check:role-word`, `check:release-notes` and `check:release-page-status`: OK. - check-release-section-coverage: OK, both plain and with `--strict` (10 minors). - The docs-audit scope check and `check:nul-bytes`: OK. - Docs production build: `TURBO_FORCE=true pnpm turbo run build --filter=@objectstack/docs`, run under the verify lock, reports `Tasks: 2 successful, 2 total` and `Cached: 0 cached`. The built `releases/v17/17-7.html` carries the corrected text and none of the removed text. - Mechanical checks: 231 distinct sha–PR pairs, 0 unresolved, 0 subject mismatches; the MDX of 17-7, 17-6 and index compiles. - Not measured locally: the repo-wide lint and the CI-only families. CI owns them. ## Not in this PR - No changeset. The PR touches only docs and a docs-audit list, nothing a package ships (`skip-changeset`). - Nobody has walked the 17.6.0 → 17.7.0 upgrade. The checklist says so on each line. --- _Generated by [Claude Code](https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
…ui#11670 and objectstack-ai#11669) (objectstack-ai#22015) Fixes objectstack-ai#21996 Clause-②: no This moves the bundled Console's objectui pin from `0abd4f9f8769` (objectstack-ai#21807, PR objectstack-ai#21827) to `a58626c88dc85954bd0af24f16ebb69454c03eee`, which was objectui `main` when this run started. The new pin carries `5ba255538a` (objectui#11670): the Studio flow designer saves a screen field's `Min` / `Max` as numbers. That is the commit the timing clause of objectstack-ai#21898 (PR objectstack-ai#21974) waits on. The range also carries `c3623eb1` (objectui PR 11669, Studio's shared picklists). The bump follows the repo's own procedure (`scripts/bump-objectui.sh`, then `pnpm objectui:build` and `node scripts/gen-sdui-manifest-node.mjs`) and the gates it derives. It adds no step to that procedure. Every file below is one the procedure or a gate wrote, and nothing else rides here. ⛔ This is not a release act. Version Packages PR objectstack-ai#21988 is untouched. It edits `packages/console/CHANGELOG.md` and `packages/console/package.json`, and this diff edits neither. The console's release input is the new `.changeset/console-a58626c88dc8.md`. ## Range - objectui `git ls-remote origin refs/heads/main` read `a58626c88dc85954bd0af24f16ebb69454c03eee` at 2026-10-06T15:32:48Z, the same sha the dispatch read at 15:08Z. - **REST `compare` on objectstack-ai/objectui proves containment** (base...head, head = the new pin): - `5ba255538a...a58626c88d`: `status: ahead`, `ahead_by: 18`, `behind_by: 0`, merge base `5ba255538a1115e2dc2d52fa094ecf491621a5fe`. The pin contains objectui#11670. - `c3623eb1...a58626c88d`: `ahead`, 15 ahead, 0 behind. - `0abd4f9f87...a58626c88d`: `ahead`, 36 ahead, 0 behind. - `0abd4f9f8769..a58626c88dc8` has 36 commits, 0 merges and 252 changed paths. - objectui declared 36 changesets over the range, and all 36 release. There are 0 release-nothing changesets and 0 commits without a changeset. None declares `major`. Three carry the author's breaking annotation. **The highest declared level is `minor`, so the console changeset is `minor`.** The script takes the highest level objectui itself declared over OLD..NEW. These counts are the bump's own digest output. - No commit subject in the range carries `!`. `git log --format='%h %s' 0abd4f9f8..a58626c88 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` matches nothing (exit 1). - Re-read at 16:25:59Z, objectui `main` reads `834c5594b`, four commits past the pin (objectui#11685, objectui PR 11724, objectui#11682 and objectui#11687). This PR does not carry them. ## Declared-breaking entries and the ADR-0087 disposition The script wrote its `adr-0087: TODO` placeholder into the console changeset. It is answered `not-required (no-migration-prescription)`, in the wording the previous bumps used. `check-adr-0087-registration --base origin/main` reports "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` exits 0. Each entry is objectui's own package surface: 1. **objectui#4425 (`eb4552e71`)**: objectui's `@object-ui/types` faces refuse `label` on a `metric-card` in an objectui `dashboard` node's `widgets[]` slot. 2. **objectui#11709 (`89cc738da`)**: inside a widget's legacy `component` envelope, a `metric-card` is judged by the slot's component arm alone. - `metric-card` is not a member of `@objectstack/spec`'s `PageComponentType` and has no `ComponentPropsMap` row. - The ObjectStack dashboard widget's `type` vocabulary is the chart types (`metric`, `kpi` and the rest). - No example or package source here authors a `metric-card` node, and the regenerated `sdui.manifest.json` has no `metric-card` entry. 3. **objectui#11678 (`48c82c9d5`)**: `@object-ui/app-shell`'s `RecentItem` becomes a union, and `addRecentItem` stops taking a label for an object, dashboard, page or report entry. No code here imports `@object-ui/app-shell`. The only code here that names the `ui.recent` preference is the SQL driver's tests, which store the row as an opaque value. ## What changed here (22 files, +491 / -161) | file | written by | gate that required it | |---|---|---| | `.objectui-sha` | `scripts/bump-objectui.sh a58626c88dc85954bd0af24f16ebb69454c03eee --no-commit` | Console Pin Gate builds what it names | | `.changeset/console-a58626c88dc8.md` | the same run (the digest); the only later edit is the ADR-0087 answer above | `check-adr-0087-registration`, `check:objectui-changeset` | | `sdui.manifest.json`, `scripts/sdui-manifest.record.json` | `node scripts/gen-sdui-manifest-node.mjs` over `.cache/objectui-a58626c88dc8` | `check-sdui-manifest.mjs` | | `packages/sdui-parser/objectui-lockstep.json` | `pnpm gen:sdui-lockstep` against the same tree | `check:sdui-lockstep` | | 54 asserting citations in 12 files under `packages/spec/src`; `migrations/registry.ts` via `gen:migration-registry` | re-measured by hand (below) | `check:objectui-pin-citations` | | `.changeset/objectui-pin-citations-a58626c88dc8.md` | hand-written, `@objectstack/spec` patch | `check:published-files` / Check Changeset (the shipped describes name the pin) | | `content/docs/references/ui/view.mdx` | `check:generated --fix` | `check:docs` | - **The bump script.** It ran against the sibling objectui checkout after `git fetch origin main` there, with the target sha passed explicitly. The range walked completely without a deepen. The checkout was read and fetched only. - **The manifest.** It still has 107 components. The sha256 moves from `f95d406a584e…` to `e0654735a318…`. - One input moved: `record:details` `sections` gained a sentence in its description. A section that names a field group now takes the group's `visibleWhen` as well (objectui#11630). - No key, type or required flag moves. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0. - **The lockstep.** It records 214 grammar lines (blob `0131f27cf86d`), 25 diagnostic codes and containment predicate `76c18fb95d1f`. All are unchanged, so no port is owed. - **The 54 asserting pin citations were re-measured, not restamped.** - **Method.** Each record's cited objectui files were resolved against the tree at `0abd4f9f8` and intersected with the range's 252 changed paths. Every anchor in a changed file was mapped through `git diff -U0 0abd4f9f8 a58626c88` and its text compared at both pins. - **Fifteen cited files changed:** `ObjectKanban.tsx`, `KanbanImpl.tsx`, `ObjectTree.tsx`, `ObjectTimeline.tsx`, `record-details.tsx`, `action-group.tsx`, `action-menu.tsx`, `static-params.ts`, `MetricWidget.tsx`, `MetricCard.tsx`, `form.tsx`, `plugin-kanban.mdx` and the `en` / `zh` / `de` packs. - **Result.** Every cited line in them is byte-identical at the new pin. 97 anchor citations in the records' current text MOVED and were re-pointed, and each record's new hop sentence says by how much. No read point an asserting record cites changed content or died. Every other cited file is byte-identical across the hop (`git diff --quiet`). - **Records.** Each of the 41 comment records gains a dated 2026-10-06 hop sentence and keeps its earlier history. The `FormField.span` describe changes its sha only: `WIDE_FIELD_TYPES`, the field-type alias table and `spanLadderFor` are byte-identical. - **Counts.** Each was re-taken by the record's own method and reads as before: the `keyboardNavigation` hit lines (15, against 3 for `schema.editable`), `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd` (2 each, against 11 for `onCardClick`), and the `ElementDataSourceGate` occurrences in the five `src/index.tsx` shells (0, 3, 3, 3 and 4). - **Corpus counts.** The six migration entries' counts were re-taken with `git grep -o -F`. That method first reproduced every `0abd4f9f8` number: 7650 files, `objectstack` 17390, `@objectstack/spec` 7209, `timeout` 1360, `RuntimeConfig` 293, `resourceLimits` 2, `useState` 2478, `window` 4194, `period` 238, `interval` 195, `metrics` 401, `Span` 508, `SpanSchema` 57, `TTL` 182 and `tenant` 1318. - The new readings are 7754 files, `objectstack` 17468, `@objectstack/spec` 7246, `timeout` 1431, `RuntimeConfig` 299, `resourceLimits` 2 (the same two `packages/app-shell` hits), `useState` 2491, `window` 4255, `period` 247, `interval` 200, `metrics` 401, `TTL` 184 and `tenant` 1319. - All 99 checked tokens still read zero at both pins: the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key. The exceptions are `Span` / `SpanSchema`, which read 509 / 57. The one new `Span` hit is a `colSpan`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build (the local Console Pin Gate equivalent) Both steps ran under the verify lock. - **Dependency build.** `turbo run build --filter=@objectstack/client --filter=@objectstack/spec --filter=@objectstack/sdui-parser` ran 33 tasks and exited 0 in 2m05s. - **Console build.** `pnpm objectui:build` exited 0 in 7m03s on the shared box. - `OBJECTUI_ROOT` pointed at a scratch repository holding only the pin commit, so the build's `git worktree add` registered nothing in the sibling objectui checkout. - The log reports "Bundle canary 'import/jobs' present". - It reports "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - It reports **"Console bundle carries THIS tree's @objectstack/spec, and only it"**. - It reports "@objectstack/console dist ready (64400 KB) from objectui@a58626c88dc8". - `check:console-sha` and `check:console-injection` exit 0 against that dist. ## Gates and tests (head `b86e6f264`) - **Derived gates.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 127 commands from the 22-path diff. A throwaway merge onto current `main` (`1bc6ca1d3`) derives the same 127. - All 127 ran at `b86e6f264` after a full workspace build (`turbo run build --filter=!@objectstack/docs`), each exit code written to disk. All 127 exit 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - An earlier pass also ran all 127. There, `check:skill-examples` and `check:dual-build-cjs-loads` answered PREREQUISITE NOT MET (exit 3). `check:dts-closure` and `check:docs-transcript-drift` read a `packages/spec/dist` that a concurrent build of mine was rewriting. All four are green on the rerun above. - **Pin citations.** `check:objectui-pin-citations --verify-anchors` reads the sibling checkout at the pin. It reports "54 asserting objectui pin citation(s) match .objectui-sha (a58626c88)" and "7 anchor content assertion(s) verified against objectui at a58626c88". - **Other pin gates.** `check:sdui-lockstep` reports "this copy is byte-identical to objectui@a58626c88dc8". `check-sdui-manifest` reports "recorded at the live objectui pin a58626c88dc8… @object-ui 17.7.0 is the version objectui a58626c88dc8… declares". - **`@objectstack/spec`.** `vitest run --project local` passed 619 files: 18485 tests, 1 todo. `typecheck` exits 0. - **`@objectstack/sdui-parser`.** 14 files and 225 tests pass, and `typecheck` exits 0. - **Suites that read the regenerated manifest:** - `@objectstack/lint` `src/validate-jsx-pages.production-witness.test.ts`: 5 passed. - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts`: 70 passed. - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts`, `src/utils/console.sha-drift.test.ts` and `test/validate-build-gate-parity.test.ts`: 3 files, 87 passed. - The CLI integration tier (`test/jsx-gate-manifest-notice.e2e.test.ts` spawns the CLI) is declared to CI. - **Lint.** `eslint --no-inline-config --format json` over the 15 changed TS files reports 15 files, 0 errors and 0 warnings. - The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). - The config enables no type-aware linting (`:328`), so this diff cannot move a verdict on an untouched file. - Repo-wide `pnpm lint` is left to CI. - **Console Pin Gate.** It is CI's to run on this head, and its verdict is read on the PR. - **Browser smoke.** NOT MEASURED. The dispatch asked for none, and the range's own landings carry their objectui-side tests. ## Acceptance notes - **objectui#11638 retired a read that a dated record still lists.** The two action containers no longer read a member's `properties.params`. - `ui/component.zod.ts`'s action-container member docblock still lists that read under "Read, and refused anyway". The docblock is in the historical spelling, measured at `.objectui-sha` pin `2e818d0b51ec`. - The spec refuses the key either way, so the accept set and the save gate do not move, and the renderer and the save gate still agree. - The record is a dated measurement that the pin-citation gate does not hold to the current pin, so nothing here re-measures it. Noted, not filed. Carrier: none. - **The shipped console now reads `KanbanConfig.summarizeField`** (objectui#11629): each kanban column header totals it. The key is declared in `ui/view.zod.ts`, and the liveness ledger carries no row for it, so nothing here is owed. - **The console's sign-up gating now reads `features.audiencePosture`** from `/api/v1/auth/config` (objectui#11691, objectui#11705). This repo's auth plugin serves that key (`auth-manager.ts`, `getPublicConfig`) and serves `GET /auth/bootstrap-status`, so that seam holds. - `main` moved four commits past this branch's base (`f0022c46c..1bc6ca1`). None of them touches a file this diff touches, and `git merge-tree --write-tree HEAD origin/main` is clean. No merge was made; the merge queue rebuilds on the current `main`. - **Writes.** One draft PR through the relay, one label write on the PR (assignee `os-justin`), and the report comment on objectstack-ai#21996. --- _Generated by [Claude Code](https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #21807
Clause-②: no
This moves the bundled Console's objectui pin from
9dfaca654311(#21772, PR #21800) to0abd4f9f8769fc4c19ad2f96707684876f74c09f, which was objectuimainat write time and is past39a3e91fad. The Console now carries objectui#11636, the fix for objectui#11092: the screen-flow runner names the flow by its served label, translated. That merge is what #20318 waits on. The range also carries objectui#11637 (objectui#11170), objectui#11635 (objectui#11095), objectui#11624 (objectui#11396) and objectui#11640 (objectui#11628).⛔ This is not a release act. Version PR #21352 is untouched, and no tag, publish or Release was made.
Range
git ls-remote origin refs/heads/mainread0abd4f9f8769fc4c19ad2f96707684876f74c09fat 2026-10-05T04:53:29Z, just before the bump.59917c4b2(objectui#11639, a served view's toolbar change written insideconfig), one commit past the pin. This PR does not carry it.--is-shallow-repository: false).git merge-base --is-ancestorexits 0 against0abd4f9f8for39a3e91fa,c4c506b9e,22ddcd5c5and1c2e2c46c.9dfaca654311..0abd4f9f8769has 5 commits and 0 merges.major, and none carries the breaking annotation. The highest declared level isminor, so the console changeset isminor. These counts come from the bump's own digest and were re-read from the changeset blobs.!.git log --format='%h %s' 9dfaca654..0abd4f9f8 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'matches nothing (exit 1).1c2e2c46cMasterDetailDetailConfigis derived from the spec'sdetailsentry by reference, member for member the same22ddcd5c539a3e91faflows.FLOW.label, then the servedflowLabel, then the API nameClause-②: yes (widening))c4c506b9eobjectui check, corevalidateSchema, the SDUI parser'svalidateTreeand thekind:'html'compile walk themClause-②: yes (narrowing))0abd4f9f8{ success, data }envelopeDeclared-breaking entries and the ADR-0087 disposition
There are none to dispose of. No commit subject carries
!, no changeset declaresmajoror the breaking annotation, and the bump wrote noadr-0087: TODOplaceholder.check-adr-0087-registration --base origin/mainreports "this PR adds no declared-breaking changeset".check-changeset-no-major --base origin/mainreports "This diff introduces nomajorbump".One entry narrows by its own declaration, so here is how this repo answers it. objectui#11170 (
c4c506b9e,Clause-②: yes (narrowing)) widens the reach of four objectui validators: each now judges nodes held in a renderer's declared slots, not only inchildren. It adds, removes or renames no ObjectStack-authorable key, and no Zod schema or storedsys_metadatashape moves. Its sdui-parser half only takes effect when a manifest is built withslotsFor. This repo'sscripts/gen-sdui-manifest-node.mjscallsmanifestFromConfigs(configs)without that option, and the regeneratedsdui.manifest.jsoncarries 0slotskeys. So the save gate's walk does not move with this bump. The lockstep reading is in Acceptance notes.What changed here (22 files, +255 / -93)
.objectui-shaand.changeset/console-0abd4f9f8769.md.scripts/bump-objectui.sh 0abd4f9f8769fc4c19ad2f96707684876f74c09f --no-commitwrote both, withOBJECTUI_ROOTset to a read-only objectui clone in the scratchpad. The range walked completely and the level was auto-set tominor.**Clause-②: yes (narrowing)**. That bullet is rewritten to say what landed.sdui.manifest.jsonandscripts/sdui-manifest.record.json.node scripts/gen-sdui-manifest-node.mjsregenerated them over the tree thatpnpm objectui:buildbuilt at the pin. It still has 107 components, and the sha256 moves from6f921896ffac…tof95d406a584e….object-master-detail-form'sdetailsgainsof: "object"and a description of the spec's closed entry (objectui#11396)."of": "object"occurrences go from 12 to 13.modulesRoot. objectui's workspace version stays 17.7.0, confirmed against the pin bycheck-sdui-manifest --require-objectui.packages/sdui-parser/objectui-lockstep.json.gen:sdui-lockstepre-recorded it from the clone at the pin. It records 214 grammar lines (blob0131f27cf86d), 25 diagnostic codes and containment predicate76c18fb95d1f, all unchanged, so no port is owed by that gate.packages/spec/src, re-measured, not restamped.9dfaca654. Ambiguous bare names were disambiguated by the record's own directory. Eachindex.tsxandtypes.tscited is aplugin-kanban,plugin-dashboard,plugin-map,plugin-gantt,plugin-grid,plugin-treeorplugin-timelinefile. None isplugin-form/src/index.tsxorsdui-parser/src/types.ts, the two same-named files the range touches.2e818d0b5,9dfaca654and0abd4f9f8:keyboardNavigationhit lines: 15, against 3 for theschema.editablecontrol;ObjectKanban.tsx'squickAdd/onQuickAdd: 2 each, against 11 foronCardClick;ElementDataSourceGateoccurrences in the fivesrc/index.tsxshells: 0, 3, 3, 3 and 4.git grep -o -F. That method first reproduced every9dfaca654number: 7632 files,objectstack17313,@objectstack/spec7186,timeout1360,useState2477,TTL182,tenant1318,RuntimeConfig293,resourceLimits2,window4193,period238,interval195,metrics401 andSpan508.objectstack17390,@objectstack/spec7209 anduseState2478.windowreads 4194. Every other control is unchanged.plugin-lifecycle-advanced.zod.ts,tracing.zod.tsandmetrics.zod.ts, plus every named key) read the same at both pins: every zero is still zero, andSpan/SpanSchemaread 508 / 57.packages/spec/src/migrations/registry.tswas regenerated withgen:migration-registry..changeset/objectui-pin-citations-0abd4f9f8769.mdis a@objectstack/specpatch, because theFormField.spandescribe and six migration descriptions name the pin.content/docs/references/ui/view.mdxwas regenerated bycheck:generated --fix.No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets.
Console build (the local Console Pin Gate equivalent)
turbo run build --filter=@objectstack/client... --filter=@objectstack/spec...and thenpnpm objectui:buildran as one command under the verify lock. That is a clean build: mode 3 shallow-cloned objectui at the pin into.cache/objectui-0abd4f9f8769. Exit 0, 10m51s on the shared box. The build log reports:check:console-shaandcheck:console-injection(self-test 67 assertions, then the dist check) exit 0 against that dist.Browser smoke:
examples/app-showcasewith the Console built at0abd4f9f8769The server ran
pnpm dev -- --fresh --ui --no-watch -p 41907withOS_PORT=41907, on its own ephemeral DB with the seeded admin. Headless Chromium (/opt/pw-browsers/chromium) drove it, signing in through the console's login form. Page errors, console errors and every 4xx/5xx response were captured. Only the PIDs this run started were stopped.Flow label (objectui#11636 / objectui#11092). The launch was Tasks list, select a row, then the toolbar's "Reassign…" (
showcase_bulk_reassign, which targets the screen flowshowcase_reassign_wizard, label "Reassign Task").enstatus: paused,flowLabel: "Reassign Task"Reassign TaskNew Assignee(the screen's own title)Flow "Reassign Task" completedzh-CN, with a bundle entryflows.showcase_reassign_wizard.labelflowLabel: "Reassign Task"重新分配任务New Assignee流程「重新分配任务」已完成flowLabelon both legs.flowstranslations (git grepfinds none), so thezh-CNleg needed one to exist. It was made by a temporary local edit, as chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #21800's smoke did forimageField:node scripts/ablation-replace.mjs --holdaddedflows: { showcase_reassign_wizard: { label: '重新分配任务' } }to thezh-CNblock ofexamples/app-showcase/src/system/translations/index.ts.--compile.--restore. The tool reports the blob back to HEAD'sf0517049b565andgit diff HEADempty, andgit status --porcelainis empty.GET /api/v1/i18n/translations/zh-CNserved the entry, and the session'shtml[lang]readzh-CN.dist/was rebuilt afterwards (turbo run build --filter=@objectstack/example-showcase --force), and the held string has 0 hits indist/objectstack.json. Nothing of the edit is in this diff.flows.FLOW.label, then the served label, and never by the API name. The launcher button still reads the ACTION's label ("Reassign…"), which is the action's own string and not the flow's.The range's other landings.
metadata/datasource/showcase_externalcustomers(7 columns) andorders(7), each with Import. "Refresh catalog" (POST …/external/refresh-catalog200) showssnapshot 10/5/2026, 5:25:23 AM. "Run validation" (POST …/external/validate200) renders "All 2 objects match the remote schema." withshowcase_ext_customerandshowcase_ext_order, and no render error.page/showcase_project_workspace(object-master-detail-form,details: [{ title: 'Tasks', childObject: 'showcase_task', addLabel: 'Add task' }])kind:'html'pages:showcase_start_here,showcase_capability_map,showcase_command_center_jsxdashboard/showcase_ops_dashboard,showcase_revenue_pulse,showcase_chart_galleryPATCHof a task toin_reviewdid not re-read the open tile: it stayed 2 with 0 dataset queries in 6s, and read 3 after a reload. That mutation never travels the console's own invalidation bus, so this is no reading of objectui#11095's pin. NOT MEASURED there.Console messages across the run: 0 page errors. The failed loads are the pre-login
401 GET /api/v1/auth/get-session, one404per page load that the response listener did not attribute (/favicon.icoanswers 404 on this server, as #21800 recorded), and404 GET /api/v1/meta/datasource/showcase_external?state=draft, the panel's draft probe for a datasource that has no draft.Gates and tests (head
e40526e564)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 127 commands from the 22-path diff, and all 127 were run ate40526e564and exited 0.--ranreports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. The full workspace build (turbo run build --filter=!@objectstack/docs) ran first, so no dist-reading gate met a missing prerequisite.check:objectui-pin-citations --verify-anchorswithOBJECTUI_ROOTat the pin: "54 asserting objectui pin citation(s) match .objectui-sha (0abd4f9f8)", and "7 anchor content assertion(s) verified against objectui at 0abd4f9f8".check:objectui-bump(20 assertions across 5 cases),check:sdui-lockstep,check-sdui-manifest --require-objectui,check:console-sha,check:console-injection.check-adr-0087-registration --base origin/mainandcheck-changeset-no-major --base origin/main.@objectstack/spec check:generated: all 15 artifacts current after the--fix.pnpm --filter @objectstack/spec exec vitest run: 668 files, 19261 passed, 1 todo.pnpm --filter @objectstack/spec typecheck: exit 0.@objectstack/sdui-parsertest (14 files, 225 passed) and typecheck: exit 0.@objectstack/lint(119 files, 5627 passed);@objectstack/metadata-protocolsrc/protocol.runtime-authoring-gate.test.ts(70 passed);@objectstack/cliunit tiersrc/utils/sdui-manifest.test.tsandtest/validate-build-gate-parity.test.ts(2 files, 79 passed).eslint --no-inline-config --format jsonon the 15 changed TS files: 15 files, 0 errors and 0 warnings.**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}(eslint.config.mjs:971).:328), so this diff cannot move a verdict on an untouched file.pnpm lintis left to CI.Acceptance notes
validateTreea slot walk:slotElementsplus thecomp?.slotsloop inpackages/sdui-parser/src/validate.ts. This repo's port has none (git grep -n slots packages/sdui-parser/src: 0).slotsFor, and this repo's committed manifest carries noslots. So the save gate and objectui's runtime parser still agree on that manifest.kind:'html'compile (getJsxManifest) is now built withslotsFor. A slot-held node that fails validation could fail the renderer's compile while this repo's save gate accepts it.check:sdui-lockstepcompares the grammar region, the codes and the containment predicate, so it cannot see a walk-depth change. That class is outside its reach by its own header ("CANNOT see … WHEN a code fires" beyond the predicate).mainmoved three commits past this branch's base (test(spec): the first data/ file group's test titles state each cited decision in words instead of a tracker number (stage 15) #21810, test(spec): re-point object-metric icon citation to index.tsx:299 #21808, fix(service-settings): the settings audit trail records secret-valued settings with the keyed digest #21809).git merge-tree --write-tree HEAD origin/mainis clean. Two of them touch files this diff touches:api-methods-batch-conformance.test.ts(test titles) andcomponent.test.ts(test(spec): re-point object-metric icon citation to index.tsx:299 #21808 re-points a non-asserting anchor). The merged tree still carries 1 and 6 citations at the new pin and 0 at the old one. No merge was made; the merge queue rebuilds on the currentmain.mainreached59917c4b2(objectui#11639) after the pin was read. It is not in this range.39a3e91fad— it carries objectui#11636 (objectui#11092), which unlocks #20318 #21807. No label, PR assignee, ready flag or auto-merge was written; this dispatch's write budget names none of them.Generated by Claude Code