Skip to content

ci(ui-merge): retire the two-repo pin gates — Spec Shape Gate, Console Pin Gate, prerelease-pin-watch - #25827

Merged
os-zhuang merged 6 commits into
mainfrom
claude/project-thread-90y5m2
Oct 26, 2026
Merged

os-zhuang merged 6 commits into
mainfrom
claude/project-thread-90y5m2

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #25697 (item 6, PR B). PR A (#25710) carried items 1 to 5 and is merged; the card stays open for the epic PM, who hands this PR to the cutover.
Blocked-by: #25752 (cutover PR first)
Part of objectstack#25677

Clause-②: no
Metadata-protocol: none

What this retires

Once ui/ lives in this repository, the gates that proved the objectui pin from the outside have nothing left to prove. This PR deletes them:

  • .github/workflows/spec-shape-gate.yml (Spec Shape Gate), with scripts/ci/spec-shape-gate.mjs and scripts/ci/spec-shape-retirements.json.
  • The console-pin job (Console Pin Gate) in ci.yml, and the console list and output of its filter job.
  • .github/workflows/prerelease-pin-watch.yml (Stable release watch).
  • The Spec Shape Gate row of RELEASE_GATE_WORKFLOWS in scripts/ci/scheduled-full-run.mjs. The release gate now reads CI and Lint & Type Check. release.yml and cut-rc.yml have no read of their own (measured); both reach the roster only through scheduled-full-run.mjs --release-gate.

What replaces them is already on main from PR A: Type Check UI and Build & E2E UI compile and build the Console from ui/ in the PR that changes one of the seven packages objectui installs (ui_consumers filter).

The console scripts (build-console.sh, check-console-sha.mjs, check-console-injection.mjs, console-spec-probes.mjs, assert-console-spec-injection.mjs) stay, as the order says. 4a #25745 deletes them with the pin.

Hit-class table

Census: git grep -n -E 'spec-shape-gate|Spec Shape Gate|spec-shape-retirements|prerelease-pin-watch|Console Pin Gate|console-pin' at the base 52f3f518e1 gives 169 hits in 33 files. Also posted on the card: #25697 (comment)

Class Files (hits) Treatment
The retired gates themselves spec-shape-gate.yml (15), scripts/ci/spec-shape-gate.mjs (21), scripts/ci/spec-shape-retirements.json (1), prerelease-pin-watch.yml (6) deleted
ci.yml job and filter ci.yml (7) console-pin job, console filter list and output deleted; the comments that pointed at them re-worded
Release-gate roster scripts/ci/scheduled-full-run.mjs (19) roster row dropped; the self-tests that encoded a three-row roster are rewritten to the two-row roster with the same assertion shape (none deleted or skipped); two dated diagnosis fixtures kept verbatim
Gates that encode the deleted job or script check-ci-filter-parity.mjs (5), check-expected-skips.mjs (5), dispatch-gates.self-test.mjs (20), dispatch-gates.mjs (7) filter-parity console subject retired with its battery (floor 10 to 9); the Console Pin Gate expected-skip row removed and its recorded runs re-spelled to the live roster; the live-tree job-filter cases re-pointed at Build Core; synthetic specimens kept; tense fixes
Orphan the deletion forces scripts/check-prerelease-pin-watch.mjs (15), package.json (2) deleted, with the check:spec-shape-gate and check:prerelease-pins aliases (deviation 1)
Instruction prose naming a deleted gate as live AGENTS.md (2), docs/releases-maintenance.md (2) prose fixes, listed below
Comments naming a retired gate as live cut-rc.yml:358, docs-deploy.yml, lint.yml (2), release-coverage-patrol.yml, release.yml:1510, check-release-section-coverage.mjs (2), check-self-test-workflow-commands.mjs, check-vendor-version-stamps.mjs (2), check-required-contexts.mjs past tense, or a one-paragraph addendum to the existing tombstone
Left for 4a #25745, which deletes or rewrites them release.yml:1874 and :1917, cut-rc.yml:383, packages/console/README.md:54, check-console-injection.mjs (6) untouched here, so the two PRs do not conflict on them
Dated history and fixtures docs/audits/* (5), scripts/docs-audit/README.md, scripts/fixtures/merge-queue-triage/*.json (2), the fleet-write/validate.mjs fixture, packages/spec/liveness/dashboard.json:146, pnpm-workspace.yaml:184, the #9533 tombstone in check-required-contexts.mjs kept as written

Tier H prose touched

  • AGENTS.md line 533: drops Console Pin Gate from the list of full-battery jobs.
  • AGENTS.md lines 1103 to 1104: the sibling-removal rule named the full battery's Console Pin Gate as what reds a breaking removal on main. It now names Type Check UI, which compiles the Console under ui/ in the PR that makes the removal. Line count unchanged (1117, the ratchet ceiling).
  • docs/releases-maintenance.md: the "What still checks the pin" paragraph is now "What used to check the pin", and the release-gate roster reads CI, Lint & Type Check.

No ADR is touched.

Required contexts that vanish

None. Read at the time of this PR: the main ruleset requires TypeScript Type Check, Test Core, Build Core, Lint & Repo Gates, Governed Surface Queue Guard, and classic branch protection requires TypeScript Type Check, Build Core, Test Core, Dogfood Regression Gate. Neither Spec Shape Gate nor Console Pin Gate is in either list, so the sitting needs no ruleset change for this PR. node scripts/check-required-contexts.mjs --verify-required-set exits 0: the registry and the live set agree in both directions.

Landing with 4a #25745

This PR and 4a are two halves of one change and land as a batch, 4a first:

  • On main alone this PR is red in one place. The order keeps check-console-injection.mjs and console-spec-probes.mjs until 4a and deletes Console Pin Gate, their only PR-time runner. Two live-tree cases of the dispatch-gates fast tier then red: the silent load-break pair check:console-injection from console-spec-probes.mjs, and the pull_request-only narrowing of the scheduled-only zero. That step belongs to Lint & Repo Gates. With 4a merged first, the same tier passes 1917 of 1917 (verification record below). Neither case was weakened.
  • Two files overlap. package.json (both PRs delete the check:prerelease-pins alias) and one comment in scripts/pm/dispatch-gates.self-test.mjs near line 1006. Take the main side (4a) in both; checked on the local merge below.

Deviations from the order

  1. scripts/check-prerelease-pin-watch.mjs and its check:prerelease-pins alias are deleted here as well. Once the workflow is gone the script has no CI caller and check-self-test-wired reds the orphan. 4a deletes the same file, so the two deletions agree.
  2. prerelease-pin-watch.yml does not watch the objectui pin. It watched better-auth prerelease overrides in pnpm-workspace.yaml, and its watch list was already empty. It is deleted as ordered.
  3. Beyond the order's file list, these gates had to follow the deletion so they stay true: check-ci-filter-parity.mjs, check-expected-skips.mjs, dispatch-gates.self-test.mjs. Each keeps its assertion shape; nothing is skipped or loosened.

Verification record

Head 1776dbd798a4ebde5abc974e5b8d01c6db3fd3ef, base 52f3f518e1.

  • Derived gate sweep (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack): 86 derived, 82 run. 81 exit 0. pnpm check:pm-dispatch-gates exits 1 (the two cases above, 2 of 1917). 4 exit 3, prerequisite not met, because they need every workspace dist built: check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. Build Core runs them on this PR. dispatch-gates.mjs --ran: 86 accounted, 0 unrun.
  • Named by the order: node scripts/ci/scheduled-full-run.mjs --self-test 0, pnpm check:shard-attestation 0, pnpm --filter @objectstack/spec check:liveness 0, check-required-contexts.mjs --verify-required-set 0.
  • Merged tree (main abebc4e14d + 4a 4ac569dc00 + this PR, local, conflicts resolved to the main side): pnpm check:pm-dispatch-gates exit 0 (fast tier 1917 of 1917). The same 86-command sweep on the merged tree: 80 exit 0, 6 exit 3 (prerequisite not met: the throwaway worktree has no package dists or package-level installs, so check:doc-formula-expressions and check:type-check-debt join the four above; both exit 0 on this branch), no finding.
exit  command (this branch, head 1776dbd798)
0  node scripts/check-aggregator-roster.mjs
0  node scripts/check-aggregator-roster.mjs --self-test
0  node scripts/check-ci-filter-parity.mjs
0  node scripts/check-ci-filter-parity.mjs --self-test
0  node scripts/check-closing-keyword-parity.mjs
0  node scripts/check-closing-keyword-parity.mjs --self-test
0  node scripts/check-comment-mask-corpus.mjs
0  node scripts/check-declaration-mirrors.mjs
0  node scripts/check-declaration-mirrors.mjs --self-test
0  node scripts/check-dts-emitted.mjs --self-test
0  node scripts/check-merged-branch-reaper-outcome.mjs
0  node scripts/check-merged-branch-reaper-outcome.mjs --self-test
0  node scripts/check-position-name-fold-loaders.mjs
0  node scripts/check-position-name-fold-loaders.mjs --self-test
0  node scripts/check-release-section-coverage.mjs
0  node scripts/check-release-section-coverage.mjs --self-test
0  node scripts/check-release-section-coverage.mjs --strict
0  node scripts/check-scripts-symbol-anchors.mjs
0  node scripts/check-scripts-symbol-anchors.mjs --self-test
0  node scripts/check-self-test-wired.mjs
0  node scripts/check-self-test-wired.mjs --self-test
0  node scripts/check-self-test-workflow-commands.mjs
0  node scripts/check-self-test-workflow-commands.mjs --self-test
0  node scripts/check-step-collectors.mjs
0  node scripts/check-step-collectors.mjs --self-test
0  node scripts/check-whole-set-label-write.mjs
0  node scripts/check-whole-set-label-write.mjs --self-test
0  node scripts/ci/assert-turbo-remote-cache.mjs --self-test
0  node scripts/ci/prune-turbo-cache.mjs --self-test
0  node scripts/ci/scheduled-full-run.mjs --self-test
0  node scripts/docs-audit/check-drift-comment.mjs
0  node scripts/pm/bare-root-worklist.mjs --self-test
0  node scripts/pm/ci-failure.mjs --self-test
0  node scripts/release-dist-tags.mjs --self-test
0  node scripts/release-verify-npm.mjs --self-test
0  node scripts/render-release-coverage-anchor.mjs --self-test
0  pnpm --filter @objectstack/lint run check:doc-formula-expressions
0  pnpm check:agent-test-spelling
0  pnpm check:bash32-floor
0  pnpm check:cli-command-ids
0  pnpm check:cross-package-test-inputs
0  pnpm check:declared-population-live
0  pnpm check:doc-authoring
0  pnpm check:docs-audit-scope
0  pnpm check:driver-memory-census
0  pnpm check:entry-guard
0  pnpm check:gitlink-declared
0  pnpm check:manifest-repository-directory
0  pnpm check:merge-driver
0  pnpm check:node-version
0  pnpm check:nul-bytes
0  pnpm check:parse-guard
0  pnpm check:pm-close-cards
0  pnpm check:pm-expected-skips
0  pnpm check:pm-fleet-write-dispatch
0  pnpm check:pm-fleet-write-execute
0  pnpm check:pm-fleet-write-validate
0  pnpm check:pm-governed-merges
0  pnpm check:pm-governed-prose
0  pnpm check:pm-issue-transfer
0  pnpm check:pm-post-stamped
0  pnpm check:pm-record-recognisers
0  pnpm check:pm-skill-id-lint
0  pnpm check:pm-skill-ratchet
0  pnpm check:pnpm-acquisition
0  pnpm check:pnpm-filter-targets
0  pnpm check:pnpm-flag-spellings
0  pnpm check:ratchet-remedy-authority
0  pnpm check:refd-timer-probe
0  pnpm check:required-contexts
0  pnpm check:select-gate-families
0  pnpm check:shard-attestation
0  pnpm check:stall-guard-budget
0  pnpm check:stall-guard-headroom
0  pnpm check:turbo-task-graph
0  pnpm check:type-check-coverage
0  pnpm check:type-check-debt
0  pnpm check:vendor-version-stamps
0  pnpm check:watch-hint-literal
0  pnpm check:workflow-status-functions
0  pnpm check:workflow-step-name-quoting
1  pnpm check:pm-dispatch-gates
3  pnpm check:dts-closure
3  pnpm check:dual-build-cjs-loads
3  pnpm check:lean-entry-closure
3  pnpm check:sourcemap-no-sources-content

维护者速读(草稿)

改了什么:删掉三个只为「跨仓库钉版本」存在的门禁:Spec Shape Gate(每小时拉 objectui main 编译一遍)、Console Pin Gate(按 .objectui-sha 克隆 objectui 构建控制台)、prerelease-pin-watch(盯 better-auth 预发布版本,清单早已为空)。发布前的全量电池名单从三个工作流减为 CI 与 Lint & Type Check。AGENTS.md 两处、发布维护文档一处把它们改为过去时。

为什么改:objectui 合入 ui/ 之后,控制台在同一个 PR 里由 Type Check UI、Build & E2E UI 编译构建,规格一改就当场验证,不再需要隔一小时去克隆另一个仓库。留着旧门禁只会对着已不存在的钉版本报错。

风险与代价(含回滚):不影响必需检查(这三个都不在必需集合里)。必须在 4a #25745 之后合入:单独合入时 Lint & Repo Gates 会因控制台脚本失去 PR 期运行者而红两条,4a 删除这些脚本后即消失。回滚就是还原此 PR,三个工作流与脚本原样恢复。

席位意见:

你要做的:切换当天在 4a 之后合入本 PR(Tier H,需你批准)。规则集无需改动。


Generated by Claude Code

… Console Pin Gate expected-skip row

Claude-Session: https://claude.ai/code/session_01H835wAyqCCeF7jiYq7XSxi
Co-Authored-By: Claude <noreply@anthropic.com>
… prose tense for retired jobs

Claude-Session: https://claude.ai/code/session_01H835wAyqCCeF7jiYq7XSxi
Co-Authored-By: Claude <noreply@anthropic.com>
… docs and comments

AGENTS.md drops Console Pin Gate from the full-battery list and re-points the
sibling-removal rule at Type Check UI; docs/releases-maintenance.md moves the
pin-check paragraph to the past tense and reads the release gate roster as
CI + Lint; workflow and script comments that named the retired gates as live
now say they retired (#25697).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H835wAyqCCeF7jiYq7XSxi
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 25, 2026
@github-actions github-actions Bot added size/xl ci/cd dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation labels Oct 25, 2026
This was referenced Oct 25, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 25, 2026 23:48
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

PR B sitting verification · 2026-10-25T23:57Z · head f973a4f3fd6c47c58458591c39a87ae67c32dc30

origin/main at 2a61f08093 (cutover #25825, then 4a #25745) is merged into this branch. Only the two expected conflicts came up, package.json and one comment near scripts/pm/dispatch-gates.self-test.mjs:1006, and both resolve to the main side. The diff against main is now 22 files, +143 / −2878. scripts/check-prerelease-pin-watch.mjs left the diff because 4a deleted it on main.

Local verdict: clean.

  • Derived gate sweep (dispatch-gates.mjs --commands): 86 derived, 86 run, 86 exit 0. That includes pnpm check:pm-dispatch-gates (fast tier 1917/1917) and the four Build Core dist gates the first head could not measure. dispatch-gates.mjs --ran accounts for all 86: 0 not measured, 0 unrun.
  • Other gates: check-self-test-wired.mjs --self-test and the run, pnpm check:required-contexts, check-ci-filter-parity.mjs with and without --self-test, pnpm check:pm-expected-skips and scheduled-full-run.mjs --self-test all exit 0.
  • The first head's two dispatch-gates reds are gone. They came from console scripts left without a PR-time runner, and 4a deleted those scripts.

CI at this head, read once: Validate Package Dependencies, Lint & Repo Gates, TypeScript Type Check and Build Core are all green. Test UI (3/16), (8/16) and (9/16) are red on main itself at 2a61f08093; (3/16) reads ui/.changeset/config.json missing. Type Check UI is red because the @object-ui/* packages it imports are not built in this run. It is green on main. The epic PM files this under bill item 49.


Generated by Claude Code

@os-zhuang
os-zhuang merged commit 90a34e2 into main Oct 26, 2026
60 of 64 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-90y5m2 branch October 26, 2026 00:07
os-tesla pushed a commit that referenced this pull request Oct 26, 2026
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants