Repository navigation
chore(objectui): bump the console pin to 0df67f237c5a (carries objectui#12089) - #22812
Conversation
…ui#12089) WIP: pin, console changeset digest, regenerated SDUI manifest and record, and the re-measured objectui pin citations in packages/spec/src. Claude-Session: https://claude.ai/code/session_01Rerax7QTjKMPCUZxQUtPFR Co-authored-by: Claude <noreply@anthropic.com>
…ecord the sdui lockstep, add the citations changeset Claude-Session: https://claude.ai/code/session_01Rerax7QTjKMPCUZxQUtPFR Co-authored-by: Claude <noreply@anthropic.com>
….span describe Claude-Session: https://claude.ai/code/session_01Rerax7QTjKMPCUZxQUtPFR Co-authored-by: Claude <noreply@anthropic.com>
…ine's package correctly Claude-Session: https://claude.ai/code/session_01Rerax7QTjKMPCUZxQUtPFR 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:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 140 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 f79ba8c43b05590ea929349da73e2b0bf14e574e && git checkout f79ba8c43b05590ea929349da73e2b0bf14e574e
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin b7cd1af9df7ade29e165e838503cbbef05e4299e 33307259d21dfcbe221e11dd4fd814e90a9df741 && git checkout -B drift-repro b7cd1af9df7ade29e165e838503cbbef05e4299e && git merge --no-ff 33307259d21dfcbe221e11dd4fd814e90a9df741
node scripts/docs-audit/affected-docs.mjs --json b7cd1af9df7ade29e165e838503cbbef05e4299e
|
…ged, a console patch refused, Clause-② no unaffected Claude-Session: https://claude.ai/code/session_01Cw7JSJKE4EqGJ1uKPJZnSu Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Read: card #15204 (body and all 94 comments, the stage plan 6094501866, stage 0 6095755866, the stage-5 amendment 6106816979, the dev report 6107413519, the 5-pre measurement 6107458914, the 5-pre amendment 6107473261 and ACCEPT 6107654069); objectui#7611's ACCEPT 6106655511 and Landed record 6106811169; the PR body, its 21 files (+519 / −157) and the diff; the 35 check-runs on the head; the gate workflow, ① Derived judgmentsThe regenerated
The 55 re-measured citations in 14
The The console changeset's content — right, as it publishes. The out-of-scope note on objectui#12086 — right and sufficient. Range and net diff. objectui ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Part of #15204
Clause-②: yes (widening: the html-page save gate and
os validateaccept anelement:repeaterbound throughdataSourcealone)This moves the bundled Console's objectui pin from
20c6d351ad74(PR #22592) to0df67f237c5ab46cbc65252c5f6bd05f2be44c48. That commit is objectuimainat dispatch and the merge of objectstack-ai/objectui#12089, C9 part 1 (objectstack-ai/objectui#7611): Setup's positions and permission sets read the registry, and the catalog's active switch writes the activation ledger through stage 2c's door. This is stage 5 of #15204 (stage plan 6094501866, stage-0 order correction 3 in 6095755866, claim amendment 6106816979). Stage 6a (#22793) waits on it. #15204 remains open for its remaining stages.The bump follows the repo's own procedure, as PR #22592 did:
scripts/bump-objectui.sh, thenpnpm objectui:buildandnode scripts/gen-sdui-manifest-node.mjs, then the gates they derive. It adds no step to that procedure.This is not a release act. The Version Packages PR is untouched, and this diff edits neither
packages/console/CHANGELOG.mdnorpackages/console/package.json. The console's release input is the new.changeset/console-0df67f237c5a.md.Range
compareon objectstack-ai/objectui,20c6d351ad74...0df67f237c5a(read 2026-10-11T07:48:57Z):status: ahead,ahead_by: 21,behind_by: 0, 293 files, merge base20c6d351ad74. The pin moves forward frommain's, and it contains objectui#12089's merge.git merge-base --is-ancestor 0df67f237c5a origin/mainexits 0.20c6d351ad74..0df67f237c5ahas 21 commits and 0 merges. Its 293 paths are 73 added, 219 modified, 1 renamed and 0 deleted.0df67f237c5a, as the dispatch ruled. objectuimainhas moved since, to802f0bc41f39(git ls-remote, 2026-10-11T08:22:44Z). This bump does not chase it..objectui-shamust not pass0df67f237c5auntil cloud is on objectstack v18. That decision is with the maintainer. Nothing in this PR touches cloud.The range's notable commits (breaking first)
12ff25631(objectui#6349 batch 10), annotated breaking. The row type of@object-ui/plugin-designer'sVersionHistorytimeline is declared asVersionHistoryEntryinstead ofVersionEntry. In the same batch,ConnectionStategets one declaration, in@object-ui/types, and@object-ui/providers'ThemeProviderprops becomeThemePreferenceProviderProps. These are objectui TypeScript types. No ObjectStack key moves.ce991bd70(objectui#12085, objectui#12093): the one commit that moves an objectstack accept set.element:repeaterandelement:numberpublish the node-leveldataSourcebinding as their only query input. The regeneratedsdui.manifest.jsonloses the repeater'sobject(required),filter,sortandlimitinputs, and the number'sobjectandfilter. It is the html tier's half of the retirement@objectstack/specalready carries ([Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509,.changeset/11509-element-flat-binding-retired.md). The renderer still reads the flat keys as the binding's fallback. The section below has the measurement.0df67f237(objectui#12089, C9 part 1): Setup's positions and permission sets read the registry, through the metadata-admin pages' environment scope. This is the card's acceptance, measured below.5330afd1f(objectui#12086): list views read an absentuserActions.editInlineas on, the v18 default. This is the consumer half of spec:ListView.userActions.editInlinedefaults to true in v18 andeditInline: falseis the opt-out; objectui reads an absent key as on (maintainer ruling 2026-10-10, after objectui#5144) #22605, whose spec half (f53f14bb3, feat(spec)!: ListView.userActions.editInline defaults to true on the v18 line; editInline: false is the opt-out (#22605, spec half) #22629) is already onmain. A list view that declares neither key now offers in-place editing to a caller who may update the object.023f00d46/5af42dbbd(objectui#12082): a create form asks the create grant, and eighteen write affordances, then five more that read no grant at all, read one affordance-to-grant map (the grid's row Edit/Delete, bulk Delete and inline edit, and the kanban card move among them);5f75cfad1(objectui#12103): in-place and in-cell edit honour the field write grant, and the owner field the transfer grant.29b994902(objectui#12105): a promoted bulk action's field-backed param resolves through the shared action-param resolver.b7cd5c891(objectui#12108): a create form says "Set automatically when saved." under a server-filled field.16c8810ac(objectui#12081 item 2): a list's calendar view fetches the days it shows, in fetch batches.029bdaf45(objectui#12081 item 8): the activity feed asks only a caller who may readsys_activity.5a65f7d57(objectui#12109): an object entry is not drawn for a caller who cannot read the object.206505c34(objectui#12104): a timeline groups an explicitgroupByFieldby its display value.de302c731(objectui#12078): the chatter reads and writes reactions assys_comment_reactionrecords. That object is onmainsince Comment reactions (ruling A amended on #22505): a reaction is the reactor's ownsys_comment_reactionrecord, andsys_comment.reactionsretires with no aggregate and no data migration #22566, and the column path stays for a framework without it.417e24567(objectui#12079): an app that serves no navigation opens on an app-level empty state.4d0ff2331(objectui#12080): a long flow screen keeps Submit / Confirm on screen.3c0f8069e/a21ff9a95(objectui#12087, objectui#12097): marketplace installs wait until the app is served.d758f2f20and1b2d0160f(objectui#6349 batches 8 and 9). No changeset:a194b4e37(objectui#12114, objectui's own scripts).The digest reads 28 releasing changesets of 29 across 21 non-merge commits, 1 release-nothing, and 1 commit with no changeset. None declares
major, and one carries the author's breaking annotation. The highest declared level isminor, so the console changeset isminor. Itsadr-0087: TODOplaceholder is answerednot-required (no-migration-prescription), which names the annotated entry and the manifest move.Clause-②: what moves, measured
The html-page save gate (
metadata-protocolruntime-authoring-gate.ts) and the CLI's JSX gate (os validate/compile/lint) compile a page source against the SDUI manifest the console ships. The gate fails a save only on an error-severity diagnostic (CompileResult.ok).compile()from@objectstack/sdui-parser(this branch's build) was run against the previous manifest (the tracked file at680a86b4c) and the regenerated one:element:repeaterwithdataSource={{ object: "account" }}and no flatobjectok=false,error: missing-required-propok=true, no diagnosticelement:repeaterwith a flatobjectok=true, no diagnosticok=true,warning: unknown-propelement:repeaterwith flatobject,filter,sort,limitok=trueok=true, fourunknown-propwarningselement:numberwith a flatobjectok=trueok=true,warning: unknown-propelement:numberwithdataSource={{ object: "account" }}ok=trueok=trueSo the html tier now accepts a repeater bound through
dataSourcealone, which it refused before. Nothing it accepted before is refused now: the retired flat keys draw a non-gating warning. That makes it a widening, and it is declaredClause-②: yes (widening)on line 2 and in the console changeset. A contract-tier review is owed for this PR. The JSON tier does not move here:@objectstack/specalready retired those flat keys (#11509).Acceptance, measured in the browser
The showcase was booted from this branch (
pnpm dev -- --fresh -p 38138,OS_PORTexported), serving the console dist built at the new pin. At boot,check:console-shaprinted "Console dist matches the objectui pin (objectui@0df67f237c5a)". The run used Chromium (/opt/pw-browsers/chromium, headless, 1440x900) and signed in through the form as the seeded platform admin. The boot and the run were held under the verify lock, and the server was torn down at the end.system/permissionslands on the registry catalog./_console/apps/setup/system/permissionsredirects to/_console/apps/setup/metadata/permission?scope=environment. The page readsGET /api/v1/meta/permission(200) andGET /api/v1/data/sys_metadata_activation?top=1000(200), and nothing fromsys_permission_set. It lists 17 permission sets, each from an Artifact source, each with a live switch.showcase_auditor):POST /api/v1/security/_activation/permission/showcase_auditorwith body{"enabled":false};200 {"success":true,"data":{"type":"permission","name":"showcase_auditor","enabled":false}};aria-checked="false".aria-checked="false"). The ledger read answers one row:metadata_type: "permission",name: "showcase_auditor",package_id: "com.example.showcase",active: false.auditor.demo@example.comholds theauditorposition, which bindsshowcase_auditor. That persona signed in and read its own permissions withGET /api/v1/auth/me/permissionsat each step:["showcase_auditor","showcase_member_default","member_default"];["showcase_member_default","member_default"];["showcase_auditor","showcase_member_default","member_default"].{"enabled":true}. Response:200 {"success":true,"data":{"type":"permission","name":"showcase_auditor","enabled":true}}. After a reload the switch readsaria-checked="true".What changed here (21 files, +519 / -157 = 676 changed lines, generated files included)
.objectui-shascripts/bump-objectui.sh 0df67f237c5a… --no-commit.changeset/console-0df67f237c5a.mdClause-②linecheck-adr-0087-registration,check:objectui-changesetsdui.manifest.json,scripts/sdui-manifest.record.jsonnode scripts/gen-sdui-manifest-node.mjsover.cache/objectui-0df67f237c5acheck-sdui-manifest.mjspackages/sdui-parser/objectui-lockstep.jsonnode scripts/check-sdui-lockstep.mjs --update,OBJECTUI_ROOTat the built treecheck:sdui-locksteppackages/spec/src, and three quoted anchors of the datedview.zod.tsmap recordcheck:objectui-pin-citations(and--verify-anchors).changeset/objectui-pin-citations-0df67f237c5a.md@objectstack/specpatchcontent/docs/references/ui/view.mdxcheck:generated --fix(gen:docs)check:docs9d87162a3ef6…, and only the two element rows above change (32 lines removed). objectui's workspace version stays 17.7.0.0131f27cf86d), 25 diagnostic codes and containment predicate76c18fb95d1f. All are unchanged; objectui'spackages/sdui-parseris untouched by the range, so no port is owed.packages/spec/src/migrations/registry.tsis gitignored onmainnow and is regenerated, not committed.OBJECTUI_ROOTat a scratch repository with no refs of the sibling's own, using objectui's object store as its alternate. So the build'sgit worktree addandworktree pruneregistered nothing in the shared checkout.How the citations were re-measured
20c6d351ad74and intersected with the range's changed paths. Every anchor in a changed file was mapped throughgit diff -U0 20c6d351ad74 0df67f237c5aand its text compared at both pins. A record whose cited files are all byte-identical (git diff --quiet) gains that sentence and no re-pointing.ObjectGrid.tsx,ListView.tsx,ObjectCalendar.tsx,plugin-calendar/src/index.tsx,ObjectTimeline.tsx, plugin-timeline'srenderer.tsx,ObjectKanban.tsx,KanbanBoardCore.tsx,KanbanImpl.tsx,plugin-kanban.mdx,MePermissionsProvider.tsx,PermissionProvider.tsx,record-details.tsx,basic/data-list.tsx,data-objectstack/src/index.ts,form.tsxand plugin-view'sObjectView.tsx. Theen/zh/depacks changed too, but not theircalendar.configRequiredstrings. Every cited line moved or held byte-identical.basic/data-list.tsx(objectui#12085): theelement:repeaterrow's two sentences that named the published flat inputs became false. Those were the requiredobjectinput at:320-326and the binding published "beside these keys". Both are rewritten where they stand. The renderer still reads the four as the fallback.ObjectGrid.tsx(objectui#12082): thedeleteverdict the implicit bulk-delete rides on now comes from the affordance map'srowDeleterow. That row still asks the managed-object policy and the effective API operations, and now the delete grant too, so thesys_api_keyrecord inapi-methods-batch-conformance.test.tsstill holds. Its selection block still hashesc88443302d40…, moved4868-4895->4897-4924.inlineEditablereads the map'slistInlineEditrow, still the authorededitableAND the viewer's write verdict.ListView.tsx(objectui#12081): thecase 'calendar'arm gained a fetch-window callback. Its date-field reads are byte-identical and still declared-only, with no floor, and the fetch window's own copies (:2495-2498) read the declared bindings only.object-treeflat-config record. Its opening still named thecase 'tree'arm at its47b1f0bb7span (3913-3932), and its hop cited thelabelFieldline as:3986, which is thefieldsline under it at20c6d351a. At this pin the arm is4120-4144andlabelFieldis:4140.keyboardNavigation: 15 hit lines against 3 forschema.editable.ObjectKanban.tsx'squickAdd/onQuickAdd/onCardClick: 2 / 2 / 11. Nokanban-uiregistration outside tests.ElementDataSourceGateoccurrences in the fivesrc/index.tsxshells: 0, 3, 3, 3 and 4.plugin-calendar's shell changed in itsHOST_CALLBACKSlist only.schema.*read sets: 19 names inObjectTimeline.tsxand 5 inrenderer.tsx, at both pins.git grep -o -F. That method first reproduced every20c6d351ad74number: 8351 files,objectstack18047,@objectstack/spec7545,useState2630,timeout1694,RuntimeConfig337,resourceLimits2,window4470,period249,interval213,metrics456,Span517,SpanSchema57,TTL184 andtenant1340.objectstack18248,@objectstack/spec7582,useState2645,timeout1705,RuntimeConfig347,resourceLimits2 (the same twopackages/app-shellhits),window4596,period251,interval233,metrics456,Span517,SpanSchema57,TTL184 andtenant1357.plugin-lifecycle-advanced.zod.ts,tracing.zod.tsandmetrics.zod.ts, plus every named key). 98 read 0 at both pins;Span/SpanSchemaread 517 / 57 at both.For the contract review: changed lines in
packages/spec/src/**that are neither a comment nor a string fragmentThere are none. This was measured mechanically. Each of the 14 changed
.tsfiles was scanned with the TypeScript scanner at680a86b4cand at the head, comments skipped and every string, template and regular-expression literal replaced by one placeholder token. The token sequences are identical in 12 of the 14 files. The other two are18.system-metrics-jsdoc-durations-unit-in-key.tsand18.system-tracing-otel-exporter-durations-unit-in-key.ts. Each gains one+joining one new string fragment (the older count) into itsreasonstring. No identifier, key, value or export moves. The one shippeddescribethat changes isFormField.span's, and only its sha moves.Gates and tests
The derived gate union ran at the final head
ecd4ed7458, on merge base680a86b4c. The tests and the builds ran at7c7c5c8ab, after a full workspace build at that tree (turbo run build --concurrency=2 --filter=!@objectstack/docs, 73 tasks, exit 0). The one commit between the two re-words a sentence inside the console changeset's ADR-0087 comment and touches nothing a build or a test reads. Exit codes were captured before any pipe.turbo run build --concurrency=2 --filter=@objectstack/client --filter=@objectstack/spec --filter=@objectstack/sdui-parser, 34 tasks, exit 0. Thenpnpm objectui:buildexited 0 (lock held 5m58s). Its log reads "Bundle canary 'import/jobs' present", "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}", "Console bundle carries THIS tree's @objectstack/spec, and only it" and "@objectstack/console dist ready (64368 KB) from objectui@0df67f237c5a".check:console-shareads "Console dist matches the objectui pin (objectui@0df67f237c5a)" (exit 0), andcheck:console-injectionreads "the dist carries this tree's copy, and not the published one" (exit 0). The CI job itself is NOT MEASURED here; it is CI's run.check:objectui-bump: "bump-objectui self-test PASSED — 20 assertions across 5 cases" (exit 0).check-sdui-manifest.mjs: "present, intact (sha256 9d87162a3ef6…, 107 components) and recorded at the live objectui pin 0df67f237c5a…" (exit 0).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 125 commands from 21 changed paths against merge base680a86b4c. All 125 ran and exited 0. The--ranreconciliation reads "125 derived famil(ies) accounted for — 125 run, 0 NOT-MEASURED (a DERIVED zero — all 125 recorded an exit code and none of them is 3)". Verdict lines:check:objectui-pin-citations: "55 asserting objectui pin citation(s) match .objectui-sha (0df67f237), 145 historical citation(s) recorded and not checked, across 1976 spec source(s)." With--verify-anchors(OBJECTUI_ROOTat the objectui checkout): "13 anchor content assertion(s) verified against objectui at 0df67f237".check:sdui-lockstep: "OK — this copy is byte-identical to objectui@0df67f237c5a (2026-10-11T07:26:10+00:00) over 214 grammar line(s) [blob 0131f27cf86d], agrees on all 25 diagnostic code(s) and on thenot-a-containerpredicate [blob 76c18fb95d1f]".check-adr-0087-registration --base origin/main: "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition".check-changeset-no-major --base origin/main: "This diff introduces nomajorbump".check:generated: "All 14 generated artifacts are up to date".check:api-surface: "public API surface + factory signatures unchanged".check:docs: "225 generated files in sync".check:nul-bytes: OK, no raw control bytes.@objectstack/spec(pnpm --filter @objectstack/spec test,--project local): 645 files, 19311 passed, 1 todo.@objectstack/spectypecheck (the scripts and test-layer checks included): exit 0.@objectstack/sdui-parsertest and typecheck: 14 files, 225 passed; exit 0.@objectstack/lintvalidate-jsx-pages.production-witness.test.ts: 5 passed.@objectstack/metadata-protocolprotocol.runtime-authoring-gate.test.ts: 133 passed.@objectstack/cli, unit tier (sdui-manifest,console.sha-drift,validate-build-gate-parity,console-resolve): 4 files, 108 passed. The integration tier (jsx-gate-manifest-notice.e2e.test.tsamong it) is declared to CI: this diff touches no integration-tier file and no spawn entry.--no-inline-config) over the 14 changed TS files underpackages/spec/srcgives 0 errors and 0 warnings, 14 files by the--format jsoncount. The population is theeslint.config.mjsblock that lints everytsfile (line 971). The config never enables type-aware linting (line 328), so this diff cannot move the verdict on any file it does not touch. The repo-widepnpm lintis CI's run.mainafter the cut.origin/maingained five commits after680a86b4c(feat(plugin-webhooks): the webhooks service serves the redeliver door from a Request, and the veto no longer waits for realtime (webhooks segment 3 of #22564) #22797, feat(spec): declare ITriggerApiService.handleInboundHook, the optional transport-neutral inbound-hook member #22779, docs(skills): field-types rule states a formula's fivereturnTypemembers and thecurrencyConfiga currency formula carries (#22743) #22798, docs(governed): ADR-0087, AGENTS.md and the retirement playbook describe the D4 projections and the migration registry as main builds them #22796, docs(spec): RuntimeAuthoringIssueSchema.path states the name-keying rule for every collection-resident write type #22784, up to098481744f). None touches a file of this diff, so there is no merge here; CI and the merge queue judge the merge.Acceptance notes
main. The showcase's list views that declare neithereditInlinenorinlineEditnow offer in-place editing to a caller who may update the object. Noted, not measured in this run. Carrier: none.scripts/pm/fleet-write/dispatch.mjs(pr_create, draft), and its assignee set throughscripts/pm/label-write.mjs. No label was written,skip-changesetincluded. No MCP write was used.Seat note, 2026-10-11: this PR's earlier
Check Changesetred was the gate's blind spot for the repo-rootsdui.manifest.json. #22816 (stage 5-pre) fixed it onmainat5fdc1a890db5, and this body edit re-runs the gate. Nothing above changed.Generated by Claude Code