Repository navigation
fix(sdui-manifest): one producer from objectui's built tree; retire the declaration-parity ratchet and the browser dump - #19921
Merged
Conversation
… unwired Generator reads objectui's built tree at the pin; the npm-install default is gone. check-sdui-manifest re-keyed to source/modulesRoot/objectuiWorkspaceVersion. The react declaration-parity script entry and lint step are removed; the check:generated EXTERNAL_INPUT_REQUIRED bucket is emptied. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr
…onsole ships the tracked manifest The node generator's output over objectui's built tree at the pin and the browser dump over the same tree are cmp-identical, so the dump retires: build-console.sh copies the tracked sdui.manifest.json into the console dist. The declaration-parity gate, its test, baseline and helper are deleted, with the lint and cut-rc steps. The manifest is regenerated at the pin and the JSX witness ledger drops its three rows that went stale with it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr
…ifest Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr
…line budget Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 136 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Sep 23, 2026
This was referenced Sep 23, 2026
os-zhuang
approved these changes
Sep 24, 2026
os-zhuang
marked this pull request as ready for review
September 24, 2026 15:08
os-zhuang
enabled auto-merge
September 24, 2026 15:08
This was referenced Sep 25, 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 #17735
Clause-②: no
Executes maintainer ruling 丙 on #17735 (ruling record
5724940904, batch #151 item 2; verification record5717306177; maintainer re-affirmation5791879338over ruling #197 A's PR #19270 path). The fence notes5756239563and5786373289are cleared: PR #19270 was closed unmerged by the re-affirmation, and the census in claim5800589054found every path clear. PR #18608 (squash681ebe4246) already discharged the earlier ruling's item 4 (thecheck-generated.tswhystring). This PR does steps 1–3 of 丙 and leaves step 4's list in place. The witness ledger is the one exception, shrunk by three rows (see Deviations).AGENTS.mdanddocs/adr/**(Tier H), plus.claude/hooks/**(Tier S, comments only). This PR stays draft and lands by the maintainer's hand.Step 3 first: the byte comparison decided the shape of this PR
Both producers were run once over one built tree,
.cache/objectui-62597c588072(objectui at pin62597c588072636e9c30ea35b3d89b1e46fd765d, built bypnpm objectui:build,VERDICT command-exit 0):The outputs are identical, so the ruling's copy branch applies.
build-console.shnow copies the trackedsdui.manifest.jsonintopackages/console/dist/.scripts/gen-sdui-manifest.sh,pnpm sdui:manifestand cut-rc's Playwright install step are retired. The dump ran against the container's chromium 1194, exposed under the revision name that playwright 1.62.1 asks for through a scratchPLAYWRIGHT_BROWSERS_PATH. Nothing was installed. The dump script's trailing ratchet did not run: it is guarded on the baseline file, which this branch had already deleted, and that guard sits after the dump wrote its file.Step 1: M1 is the standing producer
scripts/gen-sdui-manifest-node.mjstakes no arguments..cache/objectui-SHA12/apps/consolefrom.objectui-sha.pnpm objectui:buildas the remedy, when the tree is missing, when the tree's HEAD is not the pin, or when the tree is not built (apps/console/node_modules/@object-ui/core/dist/index.jsabsent). It also refuses any argument, so the retired--objectui-versionand--modules-rootfail loudly instead of being ignored.mkdtempdir and removed afterwards. A resolve hook re-anchors bare specifiers to the modules root, so module resolution is unchanged and nothing lands in the build tree. Measured: 0 runner files inapps/console, 0 leftover temp dirs.cmpidentical.scripts/sdui-manifest.record.jsonnow recordssource: built-tree,modulesRootandobjectuiWorkspaceVersion(read from the built@object-ui/core/package.json), and its//block is rewritten.scripts/check-sdui-manifest.mjsis re-keyed.source(it must equalbuilt-tree),modulesRootandobjectuiWorkspaceVersion.objectuiWorkspaceVersion, and the header prose and every remedy line namepnpm objectui:build && node scripts/gen-sdui-manifest-node.mjs.a record from the retired npm-install route is RED, raises the floor to 12.scripts/gen-sdui-manifest-node.mjs:28still carries the deadobjectui#6741citation that PR #18608 removed from two sibling files — and it is the header both corrected sites point readers to #18627 is restated without a number), the record's//block,build-console.sh's trailing reminder, theAGENTS.mdpin-move paragraph (located by content),docs/releases-maintenance.md(the "After the pin moves" section, the pin-policy step 4 and the rc-cut step 2),scripts/bump-objectui.sh(header, NEXT STEP text and the not-on-main warning) and thelint.ymlcomment on thecheck-sdui-manifeststep.boxandobject-treeadded), 66,910 → 85,726 bytes, sha25649211fee7792…→22c83c9ec701….dataSourceis now on 15 components (it was on 0).actionTypereplacestypeonaction:buttonandaction:icon.flex.isContaineris nowtrue.dashboard.refreshIntervalbecamerefreshIntervalSeconds.object-kanban/object-calendarinputs, plustext.alignandtext.variant.Step 2: the parity ratchet retires
Removed:
packages/spec/scripts/check-react-blocks-declaration-parity.ts, its test,packages/spec/react-declaration-parity.baseline.json, the gate's only helperpackages/spec/scripts/manifest-prescription.ts(the two deleted files were its only importers), thecheck:react-declaration-parityscript, thelint.ymlstep, and the cut-rc stepsInstall a Playwright browser for the manifest dumpandDeclaration-parity ratchet at the committed pin (ADR-0082 D4).ADR-0082 decision 4 gains exactly one status line: 「retired 2026-09-18 by maintainer ruling on #17735; the artefact stays for the CLI witness and the freshness gate」. That is an amendment, not a rewrite.
Knock-on edits:
check:generated'sEXTERNAL_INPUT_REQUIREDbucket is now empty. The bucket and its reconciliation are kept, and the ledger test asserts0 needing an external input.published-projection-choke-point.test.tsloses the deleted file's allowance row.gen-sdui-manifest.shgoes with its three tests (gen-sdui-manifest-cleanup,-collisionand-write-target), which are also removed fromvitest.repo-tests.json.pnpm check:cross-package-test-inputsreported two dispositions after the deletion, and both are applied. It reportedscripts/gen-sdui-manifest.shas an unheld glob forcreate-objectstack, so it comes out of the declaration andturbo.json. It reported thatcheck-generated-ledger.test.tsno longer reads outside its package, so it comes out of the spec repo-tests list.Folded cards (ruling step 5)
#18627 (dead citation in the generator header), #18633 (
releases-maintenance.mdclause and the instruction that caused the version skew) and #18632 (the parity header's 「dumped from」 sentence) are folded here. All three are already closed as not planned, each with a pointer to this card, so there is nothing further to close. #18407 stays open, and it is not addressed here. #14490 re-measure reading: the regenerated artefact hasactionTypeonaction:buttonandaction:icon, and neither block has an input namedtype. The artefact also containsobject-treenow.Changesets
skip-changesetis the ruling's route for the scripts and the ADR line..changeset/sdui-manifest-one-producer.md(@objectstack/console: patch).@objectstack/console17.0.0, 17.3.0 and 17.4.0 tarballs contain 0sdui.manifest.json(control:package/dist/index.html1 each).pnpm run releasere-runsbuild-console.sh, which recreatesdist/from scratch, so the RC cut's copy never reached a tarball. The changeset states that. It also states that the console'sexportsmap (./package.jsononly) keeps the file unreachable throughexportsfor now.Deviations, and why
packages/lint/src/sdui-jsx-baseline.jsonis shrunk by 3 rows, although the dispatch listed it as untouched. With the regenerated manifest,flexdeclaresisContainer, so the 32jsx-not-a-containerwarnings no longer fire. The witness test (unedited) fails with 「STALE ledger rows … delete these rows … in this same PR」. The rows were deleted, none was added, and no count was raised, which is the ledger's own shrink-only rule. The ruling's step 1 regeneration forces this..claude/hooks/guard-process-kill.shand its selftest saidpgrep -steardown is "live in two tracked scripts", one of which this PR deletes.scripts/pm/os-verify-lock.sh,scripts/publish-smoke.sh,scripts/check-sdui-lockstep.mjs,scripts/check-pnpm-filter-targets.mjsandscripts/pnpm-filter-targets.mjs(theFOREIGN_SCOPESreason string).packages/spec/src/ui/react-blocks.ts(a line comment naming the deleted baseline).docs/audits/2026-06-react-blocks-conformance.md(a retirement note above its run instructions).scripts/objectui-changeset-digest.mjs's self-test asserted that the bump printspnpm sdui:manifest. It now asserts the bump printsnode scripts/gen-sdui-manifest-node.mjs,pnpm objectui:buildandNEXT STEP.References kept on purpose (history, not pointers)
packages/spec/CHANGELOG.md(release-owned).docs/protocol-upgrade-guide.md, and thepackages/spec/srcnarratives incomponent.zod.ts(×3),conversions/registry.ts,migrations/registry.tsandretired-keys/17.ui__RecordDetailsProps__layout.ts. These explain why a past gate stayed green.docs/audits/...(dated record).publish-smoke.sh,publish-smoke-port-collision.test.ts,scaffold-e2e-boot-probe.test.tsandlib/docs-import-surface.ts.scripts/check-agent-test-spelling.mjsandscripts/pm/ci-failure.mjs.Acceptance notes
component.zod.tsstill has one forward-looking sentence: thecheck:react-declaration-paritygate 「carries the spec↔objectui parity burden going forward」. It is TSDoc on published spec source, so it was left for the spec seat.length > 0.Local verification
All results below were taken on head
b7d0b3693a, the final commit, aftergit rev-parse --short HEAD.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 155 families.check:pm-dispatch-gates(1905 cases, run detached because it exceeds the foreground cap), pluscheck:dual-build-cjs-loads,check:lean-entry-closureandcheck:type-check-debtafter a fullturbo run build --filter='./packages/*' --filter='./packages/*/*'(72/72 tasks).--ranexited 0: 「155 derived, 155 run, 0 NOT-MEASURED, 0 UNRUN」.--no-inline-config --format json.eslint.config.mjsenables no type-aware linting (noparserOptions.project), and nothing imports a deleted file. So no untouched file's verdict can move. The repo-widepnpm lintbelongs to CI.@objectstack/lintfullvitest run: 108 files, 4121 tests passed.check-generated-ledger,published-projection-choke-point,publish-smoke-port-collision,publish-smoke-boot-failure): 4 files, 38 tests passed.@objectstack/vitest-filter-preflightconfig-wiring-sweep.test.ts: 65 passed.@objectstack/spec typecheck(src, scripts and test layer): exit 0.bump-objectui.selftest.sh20/20,guard-process-kill.selftest.sh69/69,os-verify-lock.sh --self-testpass,check-sdui-manifest.mjs --self-test12 cases.node scripts/check-sdui-manifest.mjs --require-objectuiexit 0, reporting 「@object-ui 17.6.0 is the version objectui 62597c588072… declares」.scripts/ablation-replace.mjs): with the re-key reverted to['objectuiSha', 'sha256', 'components'], the self-test reds on exactly the new row (「a record from the retired npm-install route is RED — expected RED, got GREEN」, exit 1). The restore leaves the blob equal to HEADb6484613ce99andgit diff HEADempty.build-console.sh's new block was exercised on fixtures: fresh (copied, ✓ line), stale record pin (copied, ⚠ with the regeneration step) and missing artefact (exit 1). A fullpnpm objectui:buildon this branch's first commit also passed; that run's ending came before the copy block existed.维护者速读(草稿)
改了什么 ——
sdui.manifest.json只剩一个生产者:gen-sdui-manifest-node.mjs直接读 pin 上已构建好的 objectui 树,不再从 npm 装旧包。声明对齐门禁(ADR-0082 D4)和浏览器 dump 一起退役。console 构建把这份受跟踪的 manifest 原样拷进 dist。为什么改 —— 裁决 丙。实测两个生产者在同一棵已构建树上逐字节相同(
cmp退出码 0),所以浏览器那一路没有存在的必要。manifest 重新生成后,缺的dataSource、actionType等 38 个输入全部回来了。风险与代价(含回滚) —— 以后升 pin 要先
pnpm objectui:build(约 10 分钟),再跑生成器。每个 PR 的门禁照旧离线,不变。console 包会第一次真的带上这个文件:此前发布的 17.0.0、17.3.0、17.4.0 都没有。但包的exports只导出./package.json,CLI 现在还读不到它,所以对用户没有行为变化。回滚就是 revert 这个 PR。席位意见 ——
你要做的 —— 审阅后亲手合并(治理面:AGENTS.md、ADR)。
Generated by Claude Code