Repository navigation
chore(objectui): move the console pin to 1f23d5b070fa, carrying objectstack-ai/objectui#12475 and objectstack-ai/objectui#12493 - #23709
Merged
Conversation
fix(app-shell): the bell's and Home's activity feed reads the app objects only (#12530) (#12542) objectui@1f23d5b070fa4d0cee0274902944d247bc4588b7 Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…parser lockstep at 1f23d5b070fa node scripts/gen-sdui-manifest-node.mjs over .cache/objectui-1f23d5b070fa/apps/console (107 components, sha256 370153544e9b); pnpm gen:sdui-lockstep with OBJECTUI_ROOT at the pin's build worktree (grammar blob 0131f27cf86d and predicate blob 76c18fb95d1f unchanged). Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 3 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 15, 2026
Contributor
Author
席位核对 · ACCEPT · PR #23709 (draft, head
|
This was referenced Oct 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #23691
Clause-②: no
This PR moves the console pin from
b9814b334d8ato1f23d5b070fa, objectuimainat1f23d5b070fa4d0cee0274902944d247bc4588b7. That commit carries both objectui changes the card owes:720f6d4(app-shell (Setup catalog editors): show History and Audit only to a caller the trail doors admit — objectstack#23546 narrows /meta history, audit and diff away from setup.access objectui#12475, objectui PR fix(app-shell): show History and Audit only to callers the trail doors admit (objectui#12475) objectui#12495): Setup's catalog item editors show History and Audit only to a caller the narrowed trail doors admit. This is ruling6190477105item 3, the maintainer's A1 on rest/runtime: under a wall, the /meta history, audit and package-commits doors admit setup.access, which organization admins hold, so an organization admin reads the environment-wide authoring trail of any item #23546.b512428(security(app-shell): AiChatPage auto-sends ?handoffPrompt= from the URL as the build agent's first message, so a crafted link makes a signed-in user author (and, with autoPublishAiBuilds, publish) metadata in one click objectui#12493, objectui PR fix(app-shell): a URL parameter never sends a message on the AI build page (objectui#12493) objectui#12536): the AI build page no longer reads?handoffPrompt=from the URL, so a link can no longer send a message to the build agent on the signed-in user's behalf. The triage comment6196301086widened the card to carry it.It is one bump, through
scripts/bump-objectui.sh, and not a rider on another PR.Tier: no governed surface.
node scripts/pm/check-governed-merges.mjs --branch claude/issue-23691-console-pin-hopreads 0 of 5 paths on the register. Size: 5 files, +141 / −10 (151 changed lines, under the 3000 human-merge line).The hop: 83 objectui commits, 300 paths, all on objectui
maincompareb9814b334d8a...1f23d5b070fa:ahead_by83,behind_by0, 300 files.git fetch --unshallowfirst),git merge-base --is-ancestorexits 0 for720f6d4, forb512428and for the old pin, each against1f23d5b070fa. It also exits 0 for1f23d5b070faagainst objectuiorigin/main.720f6d4is 12 commits behind the new pin andb512428is 2 behind. Control: the objectui tipb5416943ce45against the old pin exits 1.1f23d5b070faand not the tip. When the work started, objectuimainhad moved two commits past the commit the dispatch read, tob5416943ce45, and that tip's push-run CI was still in progress. At1f23d5b070faevery check-run of objectui's required set (Lint,Type Check,Test (shard N/16),Build & E2E,Build Docs,Changeset Declaration) readscompleted: success, 41 of 41 across its merge-queue and push runs, re-read at 2026-10-15T17:43Z. At that reading the tip had one cancelled required run (Lint), andmainhad moved again, to518a8e308466.1f23d5b070fais the newestmaincommit read fully green that carries both fixes.Acceptance readings, at the new pin
(a) The built console's AI build page never sends
?handoffPrompt=on loadSource, at objectui
1f23d5b070fa.packages/app-shell/src/console/ai/AiChatPage.tsxreads the Builder handoff only from navigation state:readBuilderHandoffState(location.state). The prompt is seeded once per history entry, and the entry's state is replaced withouthandoffPrompt, so a reload does not send it again.git grepfor asearchParamsread ofhandoffPrompt(get('handoffPrompt')) finds nothing underpackagesorappsat the new pin. The same search at the old pin finds the read, atAiChatPage.tsx:882.The pin test,
packages/app-shell/src/console/ai/__tests__/AiChatPage.handoffNeverFromUrl-12493.test.tsx(objectui PR objectstack-ai/objectui#12536), asserts four things:?handoffPrompt=sends nothing (sentstays[]);Built bundle.
scripts/build-console.shbuilt objectui at the pin into.cache/objectui-1f23d5b070fa/. The AI build page lands inapps/console/dist/assets/ObjectView-CPn8lYVn.js(198569 bytes), the only asset that nameshandoffPrompt. The minifier writes string literals as template literals, so the pattern accepts all three quote characters. The results:.get(…handoffPrompt…)call: 0 hits in that asset and 0 in all 3434 assets;.get(…package…): 1 hit in the same asset. It is the same component's?package=read, the line just before the oldhandoffPromptread. Here it is followed by the navigation-state reader:h=d.get(`package`)?.trim()||void 0,g=o(),_=(0,$.useMemo)(()=>Uc(g.state),[g.state]).The copy in
packages/console/dist/assets/is byte-identical (cmpexit 0). On a smoke boot (below), the served/_console/assets/ObjectView-CPn8lYVn.jsis byte-identical to it and gives the same 0 and 1.(b) History and Audit are hidden for a
setup.access-only callerSource, at objectui
1f23d5b070fa.packages/app-shell/src/hooks/useCanAuthorMetadata.tsdeclaresAUTHORING_TRAIL_CAPABILITIES = ['studio.access', 'manage_metadata'].useCanReadAuthoringTrail()answers whether the caller holds any of them, and fails open when no capability set was reported.ResourceEditPage.tsxcalls it once (const canReadTrail = useCanReadAuthoringTrail(), line 1210). It gates the History and Audit entries (!createMode && canReadTrail, lines 2322, 2334, 3251 and 3286), and a?tab=history/?tab=auditdeep link (line 1228).PermissionMatrixEditor.tsxcalls it at line 476. It gates the History button and the embedded History sheet (lines 1560, 1624 and 1787). That editor offers no Audit entry.The pin test,
packages/app-shell/src/views/metadata-admin/trailDoorsGate-12475.test.tsx, asserts:setup.access-only caller sees neitherhistory-buttonnoraudit-buttononResourceEditPage, and no History onPermissionMatrixEditor, routed or embedded;studio.accessor amanage_metadataholder sees them;Built bundle.
useCanAuthorMetadata-B_1yXw8l.jscarries the gate:var r=[`studio.access`,t];function i(){let{hasCapabilities:t}=e();return r.some(e=>t([e]))}, exported asn.metadata-admin-GnoOznL8.jsimports thatnashtand callsSn=ht(). Both"data-testid":`audit-button`and"data-testid":`history-button`sit behind!n&&Sn&&.No live browser run. This is a source and bundle reading only. A
setup.access-only organization admin is not a seeded identity, so a browser pass would first have to provision one.Artefacts that travel with the pin
.changeset/console-1f23d5b070fa.md, fromscripts/bump-objectui.sh 1f23d5b070fa… --no-commit.@objectstack/consolemajor, the level the script derived. It is objectui's own declaredmajor(release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands objectui#12334, the sync major that tracks@objectstack/*18)..changeset/pre.jsonis pre mode onnext, andcheck-changeset-no-majorstands aside there. The18.0.0-next.1cut (0c52e4307) also consumed twomajorchangesets and still moved18.0.0-next.0→18.0.0-next.1.not-required (no-migration-prescription). Each of the five declared-breaking entries is answered against this tree: release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands objectui#12334, types, components, console: spec 18 refuses the page kindjsx(objectstack#23543 F5-jsx) — move the console sample tohtml, then drop the'jsx'member ofPageNodeSchema.kindand the page renderer's'jsx'branch objectui#12464 (page kindjsx), console app bar: the object breadcrumb after the app switcher goes, the Preview badge stays beside the app name, and Edit app is an icon button at every width — the page header is the one place a page is named objectui#12461 (topbar.switchObject), providers: createObjectStackUploadAdapter documentsscopeas a free key prefix and forwards a genericpathas the scope, but the server takes only its storage-scope vocabulary objectui#12055 (uploadscope) and the view-levelapidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSourceobjectui#12325 (viewprovider: 'api').Clause-②: nois in the changeset.node scripts/gen-sdui-manifest-node.mjsover.cache/objectui-1f23d5b070fa/apps/consolewrote 107 components (sha256370153544e9b…) and re-recordedscripts/sdui-manifest.record.jsonat the pin.record:related_listgains theparentDataSourceinput (record blocks honour the per-element dataSource the spec already declares — record:details / record:highlights / record:quick_actions / record:related_list on an app page bind their record from the component's dataSource, so a product page composes without the record shell (maintainer ruling cloud#2839 Q1 D, 2026-10-13) objectui#12294).object-gridandobject-mapdatadescriptions drop the retiredprovider: 'api'arm (the view-levelapidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSourceobjectui#12325).pnpm gen:sdui-lockstepre-recordspackages/sdui-parser/objectui-lockstep.jsonat1f23d5b070fa. It ran withOBJECTUI_ROOTset to the pin's build worktree, so the shared objectui checkout's HEAD was never moved. Across the hop, objectui'spackages/sdui-parserchanged only inpackage.json. The grammar blob0131f27cf86dand the predicate blob76c18fb95d1fare unchanged, andcheck:sdui-locksteppasses (214 grammar lines, 25 codes, the predicate). No parser port is owed.check:objectui-pin-citationsretired onmainin1418de4c7, under ruling C on [Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src? #23434: read points are dated ledger readings, and "a pin hop then moves nothing". So nopackages/spec/src/**hunk is in this PR.Console Pin Gate steps, run locally (each exited 0)
Client closure:
turbo run build --filter=@objectstack/client --filter=@objectstack/sdui-parser(34 tasks).scripts/build-console.shat the new pin. It reported:import/jobspresent;{major:4,minor:6,patch:5});That run came before the manifest regeneration, so its dist ships the previous tracked manifest. The dist is gitignored, and CI and the release build their own.
pnpm check:console-shaandpnpm check:console-injection: both exit 0, inside the gate run below.Smoke boot.
pnpm dev -- --fresh -p 43198from this worktree:GET /api/v1/healthanswered 200 (status: ok, version18.0.0-next.1).GET /_console/answered 200 (18552 bytes), and its entryassets/index-zcLuSSpu.jsanswered 200./_console/.objectui-shareads1f23d5b070fa4d0cee0274902944d247bc4588b7.I stopped the server by its listening PID and the recorded
pnpmPID, and the port was free afterwards.Verification, at
7ab227d26pnpm --filter @objectstack/sdui-parser exec vitest run: 14 files, 225 passed.pnpm --filter @objectstack/lint exec vitest run src/validate-jsx-pages.production-witness.test.ts: 5 passed. It feeds the real repo-rootsdui.manifest.jsonto the validator.packages/clitests that read a console dist manifest are left to CI. This diff changes no package source.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths, from the merge base) derived 69 commands. Each was run with its exit code recorded.--ranreports "69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN".check-plugin-teardown-shape --self-testneeded its fixture commit621a48760788, fetched at depth 1 (48 cases).check:dual-build-cjs-loadsneeded a fullturbo run build --filter=!@objectstack/docs(75 tasks); it then read 110 entry points across 68 packages.check-sdui-manifest(sha256370153544e9b…, 107 components, recorded at the live pin), its self-test (13 cases),check:sdui-lockstep,check:objectui-changeset,check-adr-0087-registration --base origin/main,check-changeset-no-major --base origin/main(pre mode) andcheck-empty-changeset --base origin/main.pnpm lintand theType Checklanes. Reason: both are CI-owned runs, and this diff adds no TypeScript.Acceptance notes
1f23d5b070fathe shipped console reads three things the spec and its ledger still call unread:page.print.packages/spec/liveness/page.jsoncarriesprintand its 12 children asplanned, andprinthasauthorWarnwith anauthorHint.PagePrintSchema's docblock and eight describes say "until it ships, nothing applies it". objectuipackages/components/src/renderers/layout/page-print.ts#buildPagePrintStylesheetnow applies all eight keys (print page ② of objectstack#8346: render a page that declaresprint— the print CSS mapping, the 13 printable blocks on paper, and the record page's "print" action (browser print preview) objectui#11958).lintLivenessPropertiesfrom@objectstack/lint, on a page declaringprint, emitsliveness-planned-propertywith the hint "…no renderer applies the paper, margins, running header and footer or page numbers yet — printing the page today prints the screen layout".packages/lint/src/lint-liveness-properties.test.tsusespage.printas its planned-with-authorWarncontrol, so that control has to move with the flip.record:related_list.parentDataSource. Its describe opens with[PLANNED — not yet rendered], and its docblock says the marker leaves "when that leg lands".liveness/page.json's_notecarries the same reading, and case E ofcomponent-record-related-list-parent-23134.test.tspins the marker. objectuipackages/plugin-detail/src/renderers/record-related-list.tsxnow reads the key (record blocks honour the per-element dataSource the spec already declares — record:details / record:highlights / record:quick_actions / record:related_list on an app page bind their record from the component's dataSource, so a product page composes without the record shell (maintainer ruling cloud#2839 Q1 D, 2026-10-13) objectui#12294), and the regenerated manifest lists it as a renderer input.translation.jsonflows.successMessageandflows.errorMessageareplanned. objectuipackages/app-shell/src/utils/flowResponse.tsnow reads both through the spec'stranslateFlow(FlowRunner: read the three newflowstranslation keys (a screen field's option labels, the flow's success and failure toasts) from objectstack#22507 objectui#12075).packages/spec/src/**, the ledger and a lint test, and needs a contract review. The dispatch scoped this hop to the pin artefacts, and the work is reported to the seat for one follow-up card.Generated by Claude Code