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 |
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