Repository navigation
ci(sdui): retire the per-package SDUI manifest records; CI's regeneration holds freshness (#26137 PR B) - #26367
Merged
Merged
Conversation
…tion holds freshness (#26137) Build & E2E UI regenerates sdui.manifest.json and compares it with the committed bytes (#26315), on pull_request and on the merge queue's combined tree. That makes the per-package source digests under scripts/sdui-manifest.sources/ (#26051) redundant, and they were the reason two ui PRs on one registry package conflicted even when neither moved the manifest. - check-sdui-manifest: check 3 in-tree (the per-package digests) is gone. The in-tree leg keeps shape, tamper and the inTree block, and a record that still carries `inTree.registryRecords` is RED as a retired layout. The watch hints drop ui/packages/** and the records directory. Self-test: the nine digest rows go with the code they tested; two rows pin the new boundary (the per-package record is RED; a run whose artefact did not move leaves the record as it was). Floor 29 -> 21. - gen-sdui-manifest-node: no digests, no index refusal, no per-package records; it no longer imports the gate. The record note is rewritten. - scripts/sdui-manifest.sources/ is deleted and the record regenerated (artefact byte-identical, sha256 1f6e1ccb925a). - check-changeset-no-major, lint.yml, ci.yml and releases-maintenance.md stop naming the per-package records. - AGENTS.md: the manifest paragraph still described the retired objectui pin (objectui:* scripts, "check-sdui-manifest reds until you do"). It now names the in-tree command and the CI step, line-neutral (5 lines). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
Main re-recorded six registry packages under scripts/sdui-manifest.sources/ (#26274, #26358) while the manifest's bytes stayed the same: six modify/delete conflicts against this PR's deletion of those records, resolved by deleting them. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
This was referenced Oct 27, 2026
os-zhuang
enabled auto-merge
October 27, 2026 00:58
#26277 re-recorded scripts/sdui-manifest.sources/plugin-detail.json while the manifest's bytes stayed the same: one modify/delete conflict against this PR's deletion of the records, resolved by deleting it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
This was referenced Oct 27, 2026
Merged
This was referenced Oct 27, 2026
This was referenced Oct 27, 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.
Requested by Tesla · project thread
Closes #26137 (PR B of two: PR A #26315 put the regeneration in CI; this retires the per-package records it replaces). Tier H (
.github/workflows/**).Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
scripts/sdui-manifest.sources/下 26 个按包记录的源码摘要,以及check-sdui-manifest里比对这些摘要的第 3 项检查。清单是否新鲜,现在只由 ci(ui): regenerate the SDUI manifest in Build & E2E UI and compare it with the committed bytes (#26137 PR A) #26315 加的 CI 步骤判定:Build & E2E UI重新生成sdui.manifest.json并逐字节比较,PR 上和合并队列的合并树上都跑。lint 里的检查保留存在性、形状和 sha256 防篡改。AGENTS.md里仍在讲已退役 objectui 钉的那段改为现状(行数不变)。i18n最热,12 个开着的 ui PR 里有 5 个碰它)。本 PR 自己 rebase 到main时就撞上 7 个这样的冲突,而清单一个字节都没变。CI 重新生成后,PR 只在清单真的变了时冲突。inTree.registryRecords的旧记录会被拒,提示重新生成。Build & E2E UI拒绝,而且它看得见解析器、registry 引用的@objectstack包和两个排队 PR 合起来的效果,摘要看不见这些。席位核对
(left for the dispatch seat)
Why
check-sdui-manifestheld freshness with a source digest per registry package, recorded one line per package underscripts/sdui-manifest.sources/(#26051). The digests existed because a PR author could not afford to regenerate the manifest on every push. They cost two things (#26137):src/conflicted on that package's record even when neither changedsdui.manifest.json.@objectstack/sdui-parser, the@objectstackpackages the registry imports, or two queued PRs whose effect on the manifest only shows together.#26315 made CI regenerate the manifest in
Build & E2E UIand compare it with the committed bytes, onpull_requestand on the merge queue's combined tree. It is green onmain: the push run on4ddf6df61passed 50 of 53 check runs with 3 skipped and none failed, andBuild & E2E UIran the new step. The digests now only produce the conflicts. Rebasing this PR ontomainhit seven of them:components,core,i18n,plugin-detail,plugin-grid,reactandtypeshad been re-recorded since, and the manifest's bytes had not moved.What changes
scripts/check-sdui-manifest.mjsregistrySourceDigests,readRegistryRecords,registryRecordPath,registryRecordLine,REGISTRY_RECORDSand the gate's copy ofREGISTRY_MODULESgo with it.inTreeblock (modulesRoot,objectuiWorkspaceVersion).inTree.registryRecordsis RED as a retired layout, the same way the single-digest fields from before devx(sdui): split scripts/sdui-manifest.record.json into one record per ui registry package, so ui PRs that touch different packages stop conflicting in the merge queue #26051 already are. That catches a branch cut before this PR that regenerated with the old generator.READ_PATHSandROOT_WATCH_HINTSdropui/packages/**and the records directory. The gate reads neither now, so a registry package edit no longer derives it.Self-test: 29 rows → 21
The nine digest rows go with the code they tested:
Two rows pin the new boundary, and each was ablated to show it bites:
registryRecordsfrom the retired fieldsgeneratedAt@object-ui/coreversion instead of carrying itThe carry row matters more now: the record is the one shared file left, so a producer that rewrote it on every run would make every pair of ui PRs conflict on it again.
SELF_TEST_BATTERY_FLOOR29 → 21 matches the roster. The unused must-not-name column and the producer-list parity check (it existed only for the digest) are removed.scripts/gen-sdui-manifest-node.mjsgit-env.mjs.//note now names the CI step.The records and the record
scripts/sdui-manifest.sources/(26 files) is deleted.scripts/sdui-manifest.record.jsonis regenerated. It losesinTree.registryRecordsand takes the new note.sdui.manifest.jsonis byte-identical (sha2561f6e1ccb925a…, 106 components), andgeneratedAtis carried.Readers
scripts/check-changeset-no-major.mjs: the comment, the real-build assertion and the record-only fixture name only the shared record.lint.ymlandci.yml: the step comments.docs/releases-maintenance.md: the manifest section, and the cut-rc step that said lint held freshness.AGENTS.md(the dispatch seat asked for it here): the manifest paragraph still described the retired objectui pin. It said to runpnpm objectui:build, thatscripts/check-sdui-manifest.mjsreds until you regenerate, and thatobjectui:bumpandobjectui:refreshprint the step, but noobjectui:*script exists since the cutover. It now names the in-tree command and the CI step. It is line-neutral: 5 lines stay 5, each ≤ 118 bytes, the file stays at 1112 lines, andcheck:pm-skill-ratchetandcheck:pm-governed-prosepass.cut-rc.ymlandrelease.ymlname only the tracked artefact, so they need no change.Widening or narrowing
For freshness, this is a narrowing of the lint gate, covered by a wider check that is already required. Every case the digests refused is a case where the committed manifest differs from what the tree generates, or a case where it does not:
Build & E2E UIrefuses it on the PR or in the queue.Build & E2E UIruns onui || ui_consumers, and the registry's runtime closure is inside those filters (#26315's table), so no stale manifest that the digests caught reachesmain.Merge order
components,core,plugin-dashboardandtypesand deletessdui-parser.jsonunderscripts/sdui-manifest.sources/. Whichever lands second rebases:git rmresolves them.scripts/gen-sdui-manifest-node.mjs(header lines 28–29) does not overlap this PR's hunks. It does not touchsdui.manifest.jsonor the record.scripts/sdui-manifest.sources/get a modify/delete conflict on rebase.git rmthe file, then re-runnode scripts/gen-sdui-manifest-node.mjsif the PR changes the manifest.Verification
Head
15f5e2777, onmain77a52cfe8. 34 files, +198 / −687, one commit. 26 of the files are the deleted records. Tier H:check-governed-merges --testexits 3 forci.yml,lint.ymlandAGENTS.md, and 0 for the other five.node scripts/gen-sdui-manifest-node.mjsrebuilt the registry aftermainmoved (467 s) and leftgit statusclean.sdui.manifest.jsonwas byte-identical, and the committed record is exactly what it writes ("left unchanged … its date and version are carried").check-sdui-manifest:--self-test21 cases behave, and the production run is green: "present and intact (sha256 1f6e1ccb925a…, 106 components) … Not judged here: whether it is the manifest this tree generates."75d1ea668, without the AGENTS.md paragraph) passed:--ranreconciling 82 derived, 82 run, 0 NOT-MEASURED, 0 UNRUN;🤖 Generated with Claude Code
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS