Background / incident
While curating the v16 release page (#3322), the Console section was written from the @objectstack/console bundle-bump summaries. Those summaries only cover up to the pinned objectui SHA (.objectui-sha). At that moment objectui main was 4 commits / 21 pending changesets ahead of the pin, so 4 frontend changes — two of them minor features — were absent from the page (fixed in #3331 by re-sourcing from objectui's own changesets):
This is a structural gap, not a one-off oversight.
Root cause — three blind spots in the pipeline
objectui main ──(bump-objectui.sh pins SHA)──▶ .objectui-sha ──▶ @objectstack/console changeset ──▶ vN.mdx Console section
① can lag ② summarizes only up to the pin ③ written from the bump summary
.objectui-sha can lag — a release can be cut while objectui main has newer commits / pending changesets.
- The console bump changeset only covers up to the pin — anything merged in objectui after the last bump never enters the changesets pipeline for that release.
scripts/check-release-notes.mjs only checks "a page exists per major" — it does not verify the pin is current, nor that frontend changesets are covered. So a lagging pin is invisible to both the changelog pipeline and the drift guard.
Proposed fixes (prioritized)
P0 — pin-freshness gate (the only thing that hard-blocks this)
Add scripts/check-objectui-pin-fresh.mjs, wired as a required check on the Version-Packages / release PR. Fail when:
- objectui's latest release tag (or
main HEAD) is ahead of .objectui-sha, or
- objectui has pending
.changeset/*.md not yet bundled (list them).
CI can read objectui state via git ls-remote + a lightweight API call.
P1 — auto-bump to structurally shrink the lag
A scheduled (or on-objectui-merge) job that runs scripts/bump-objectui.sh whenever objectui main advances and opens a PR. If the pin is (near-)always current, the bump summary is always complete and manual reconciliation disappears. This is the root-cause fix.
P1 — change the source of truth
Make the canonical "write the Console section" procedure read objectui's own .changeset/ rather than the bump summary. Extend scripts/objectui-range.mjs to additionally:
- emit the objectui changeset entries for the range, and
- flag entries that are merged but past the current pin (i.e. "landed, not yet bundled").
P2 — coverage reconciliation (upgrade the guard from "exists" to "complete")
Add scripts/check-release-coverage.mjs (run at release time; advisory checklist first, not a hard gate, since prose coverage is fuzzy): enumerate every changeset PR number in the release range (backend spec/package + objectui range) and flag which are not referenced anywhere in vN.mdx.
P2 — release-cut checklist in the PR template
Document the ritual: ① freeze objectui, push the pin to objectui's release commit → ② objectui-range.mjs <last-release>..<now> into the Console section → ③ run the coverage check → ④ the pin-freshness gate is green.
Suggested sequencing
P0 gate first (small: one script + one workflow, immediate value) → P1 auto-bump / source change (root cause) → P2 coverage + template.
References
Background / incident
While curating the v16 release page (#3322), the Console section was written from the
@objectstack/consolebundle-bump summaries. Those summaries only cover up to the pinned objectui SHA (.objectui-sha). At that moment objectuimainwas 4 commits / 21 pending changesets ahead of the pin, so 4 frontend changes — two of themminorfeatures — were absent from the page (fixed in #3331 by re-sourcing from objectui's own changesets):import-wizard-auto-policy(minor) — Console side of framework#3236schema-fields-keyvalue(minor) — Console side of framework#3304action-param-upload-guard(patch) — ADR-0059 follow-upsystem-field-classifier-consolidation(patch) — [plugin-approvals] 审批 {type:'role'} 审批人只查 sys_member.role,解析不到权限集业务角色且静默回退字面量 #2702 follow-upThis is a structural gap, not a one-off oversight.
Root cause — three blind spots in the pipeline
.objectui-shacan lag — a release can be cut while objectuimainhas newer commits / pending changesets.scripts/check-release-notes.mjsonly checks "a page exists per major" — it does not verify the pin is current, nor that frontend changesets are covered. So a lagging pin is invisible to both the changelog pipeline and the drift guard.Proposed fixes (prioritized)
P0 — pin-freshness gate (the only thing that hard-blocks this)
Add
scripts/check-objectui-pin-fresh.mjs, wired as a required check on the Version-Packages / release PR. Fail when:mainHEAD) is ahead of.objectui-sha, or.changeset/*.mdnot yet bundled (list them).CI can read objectui state via
git ls-remote+ a lightweight API call.P1 — auto-bump to structurally shrink the lag
A scheduled (or on-objectui-merge) job that runs
scripts/bump-objectui.shwhenever objectuimainadvances and opens a PR. If the pin is (near-)always current, the bump summary is always complete and manual reconciliation disappears. This is the root-cause fix.P1 — change the source of truth
Make the canonical "write the Console section" procedure read objectui's own
.changeset/rather than the bump summary. Extendscripts/objectui-range.mjsto additionally:P2 — coverage reconciliation (upgrade the guard from "exists" to "complete")
Add
scripts/check-release-coverage.mjs(run at release time; advisory checklist first, not a hard gate, since prose coverage is fuzzy): enumerate every changeset PR number in the release range (backend spec/package + objectui range) and flag which are not referenced anywhere invN.mdx.P2 — release-cut checklist in the PR template
Document the ritual: ① freeze objectui, push the pin to objectui's release commit → ②
objectui-range.mjs <last-release>..<now>into the Console section → ③ run the coverage check → ④ the pin-freshness gate is green.Suggested sequencing
P0 gate first (small: one script + one workflow, immediate value) → P1 auto-bump / source change (root cause) → P2 coverage + template.
References
docs/releases-maintenance.md(the three-layer model)scripts/bump-objectui.sh,scripts/objectui-range.mjs,scripts/check-release-notes.mjs