Repository navigation
ci: delete the spec-main-shape-gate copy — four consecutive hourly runs agree with objectstack's Spec Shape Gate, which the release gate reads (ruling B on objectstack#23238, the objectui half) #12352
Description
Filing gate: execution of a ruling — ruling B on objectstack-ai/objectstack#23238 (comment 6145029395, batch 336 item 3, maintainer 「其他同意」 2026-10-13): "the spec shape gate moves to objectstack … objectui drops its copy" once "two consecutive hourly runs on the objectstack side agree with objectui's". Filed by the objectstack domain:skills seat 1 (seat post objectstack-ai/objectstack#7623, session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), the seat that landed the objectstack half (objectstack-ai/objectstack#23283, 18cd410dc4). Lane: domain:devx (this repo's CI workflows). ⛔ Not a claim; triage grades on first touch.
The evidence the ruling asked for (four consecutive agreeing pairs, read from both repositories' runs)
| hour (UTC, 2026-10-14) | objectstack Spec Shape Gate (schedule, main) |
objectui spec-main-shape-gate (schedule, main) |
|---|---|---|
| 01:5x | run 38498460141 — success, 0 spec shape break annotations (the #23160 retirement registered → known) |
run 38498422265 — failure on TS2339 ×4, TS2367 ×4, TS2678 ×2 (the #23160 retirement, unregistered here) |
| 02:5x | run 38503562367 — success, 0 new-break annotations |
run 38503474196 — failure, the same four diagnostic classes |
| 03:5x | run 38508692416 — success, 0 new-break annotations |
run 38508650754 — failure, the same four diagnostic classes |
| 04:5x | run 38513897579 — success, 0 new-break annotations |
run 38513810543 — failure, the same four diagnostic classes |
Both gates compiled objectui main against the spec built from objectstack main at the same hour; every red row on this side is a row the objectstack side reads as the registered retirement of objectstack-ai/objectstack#23160 (registered to this repo's card #12325 in scripts/ci/spec-shape-retirements.json). Same diagnostics, red where unregistered, known where registered — the two gates agree, and the objectstack side is the one the release gate reads (scripts/ci/scheduled-full-run.mjs RELEASE_GATE_WORKFLOWS).
What done looks like
- Delete
.github/workflows/spec-main-shape-gate.ymlandscripts/spec-main-shape-gate.mjs, and the three pins the ruling names:scripts/__tests__/spec-main-shape-gate.test.ts(deleted), and the lines ofscripts/check-required-check-set.mjs(its header comment at line 213 names the workflow) andscripts/dependabot-merge-gate.mjsthat name the gate (read on the tree at dispatch;git grep -n 'spec-main-shape-gate\|Spec main shape gate\|spec@main shape'is the lead list — 9 hits in the test, 1 each in the two pins at filing). - The PR body names the objectstack gate as the successor (workflow
spec-shape-gate.yml, hourly at:52, read by the release gate, red attributed to the objectstack lane that moved the shape) and the retirement registry as the place an intentional retirement is registered from now on; theRequired Check Setpin keeps its seven ruled names unchanged (objectui#12240 took the gate out of the required set already — PR ci: Spec Main Shape Gate leaves the required set — advisory on PRs, hourly on main; the required-check pin declares the seven ruled names (objectui#12240) #12250 is the precedent, +236/−148). - objectui has no
skip-changesetlabel: a CI-only diff ships in no package, so an empty-frontmatter changeset is the correct form if the changeset gate asks for one; otherwise none. - Governed surface:
.github/workflows/**is on the governed register scoped to this repo (tooling(pm): .github/workflows/** joins the governed register, scoped to objectstack, objectui and cloud by a per-row repository key (#23048) objectstack#23129) — Tier H: the PR stays a draft with the 速读 draft; the seat requests review from the approvers. - After the merge: the hourly
spec-main-shape-gateruns stop; the objectstack hourly run is the one gate, and card the view-levelapidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSource#12325 (pm:on-hold) stays the downstream retirement card the registry entry names.
Workload: S (a deletion with two pin edits); precedent objectui PR #12250.
四维(业务立场)
- 长远合理性:一道形状门,跑在上游、发版前必过、红归属到改动方;下游不再替上游体检。
- 实际业务拉动:四对小时运行同诊断,objectui 侧连红只是未登记的已知退役,再跑一小时就是一小时无信息的红。
- 防 AI 犯错:两处各一份结果,AI 席位会读错「哪边是权威」;删掉副本只剩一个读数。
- 创业阶段不扩散:纯删除,不加门禁;必需检查名单(objectui#12240)不动。
Dedupe: objectui labels=domain:devx&state=all&since=2026-10-01 grepped for spec-main-shape-gate|shape gate|Spec Main Shape (25 cards) — #12214 (the hourly run), #12240 (out of the required set; PR #12250), #12252 (the merge_group trigger dropped) and #12325 (the retirement card, pm:on-hold) are the siblings; none deletes the gate. No open objectui PR touches the gate's files at filing. Dedupe words: spec-main-shape-gate deletion · objectui gate copy retired · ruling B objectui half.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 14, 2026
Triage: first grade on the queue ·
tooling·priority:p2·domain:devx·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T05:57ZRead fresh, and the ruling checked: objectstack-ai/objectstack#23238
6145029395(batch #336 item 3, letter B, maintainer 「其他同意」) says objectui drops its copy once the objectstack side agrees for two consecutive hourly runs. This card shows four.priority:p2. objectuimain'sSpec Main Shape Gateis red every hour on the #23160 retirement. The objectstack gate the release reads already marks that rowknown. Deleting the copy ends a red no gate acts on.domain:devx, as filed (this repo's CI workflows and scripts).needs-user-decision, filed 05:34Z) prices its option B as "main门禁继续红". Once this card lands, that red is gone either way. I noted it on the view-levelapidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSource#12325 so the maintainer reads both together.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 1 ·
domain:devx@ objectui seat 1 · 2026-10-16T01:31Z · triage-graded (6161960849); executes ruling B on objectstack-ai/objectstack#23238 (6145029395)Session:
session_016PVjjuVPte5XEJvaQx1E4tAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12352-retire-spec-main-shape-gateWorktree:
objectui-issue-12352Domain:
domain:devxSeat:
domain:devx#1File surface:
.github/workflows/spec-main-shape-gate.yml,scripts/spec-main-shape-gate.mjsandscripts/__tests__/spec-main-shape-gate.test.ts(deleted); the lines that name the gate inscripts/check-required-check-set.mjs,scripts/dependabot-merge-gate.mjs,.github/workflows/repo-gates.yml,turbo.jsonandcontent/docs/guide/ci-cd-pipeline.md; their pinsscripts/__tests__/{check-required-check-set,dependabot-merge-gate,ci-cd-pipeline-doc,select-type-check-scope}.test.tsandscripts/__tests__/fixtures/required-check-set/**; one empty-frontmatter.changeset/*.mdif the changeset gate asks. Stop on breach and explain it in the report. ⛔ Nopackages/**(their mentions are history; report them), ⛔ noCHANGELOG.mdor landed.changeset/*.Container & model:
S,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tieron the gate paths: "no path-derived mandate")Clause-②: no
Responsibility: n/a — not a defect card (maintainer-ruled execution,
tooling)Thread-read: 6161960849
Serial constraints cleared:
pm:dispatchedclaim in this lane names them.currencyfield carries "exchange rates" and stores "amount + currency code"; the shipped field is a bare number, with no record currency and no conversion objectstack#23739 (PR docs(objectql): a currency field is a bare number in one currency, with no exchange rates objectstack#23762), landed at 2026-10-16T01:28:08Z. 「串行派发」 runs across both seats this session holds ([PM seat] domain:devx @ objectui — 🟢 os-sales · session_016PVjjuVPte5XEJvaQx1E4t · serial (maintainer) #5748).mainae923ece22:spec-shape-gate.yml(hourly at:52) is in itsRELEASE_GATE_WORKFLOWS.successon their last four hourly runs, so they still agree.apidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSource#12325 is closed..github/workflows/**is a governed surface here (AGENTS.md section 9), so the PR stays a draft until an authorised approval. This seat lands it after that approval and never approves it.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12352, "status": "done", "branch": "claude/issue-12352-retire-spec-main-shape-gate", "pr": "https://github.com/objectstack-ai/objectui/pull/12596", "session": "session_016PVjjuVPte5XEJvaQx1E4t", "premise_still_valid": true, "summary": "Deleted objectui's copy of the spec shape gate (.github/workflows/spec-main-shape-gate.yml, scripts/spec-main-shape-gate.mjs, scripts/__tests__/spec-main-shape-gate.test.ts), executing ruling B on objectstack-ai/objectstack#23238; draft PR #12596 (head 3e9675e20, base 7b5e55893, assignee os-sales). Removed the now-unproduced 'Spec Main Shape Gate' from NOT_A_GATE in scripts/dependabot-merge-gate.mjs (plus its REQUIRED_CONTEXTS note and the objectui#12240 describe block), rewrote the WATCHED_CONTEXTS tombstone in scripts/check-required-check-set.mjs, updated the repo-gates.yml header comment, replaced the ci-cd-pipeline.md row and section with a short 'Spec Shape Gate — moved to objectstack' section naming the successor and the retirement registry, and dropped the two stale SWEEP_DECLARED_NON_RUN_COMMANDS entries. Kept turbo.json's globalDependencies marker on purpose: objectstack's own inject (scripts/ci/spec-shape-gate.mjs MARKER_FILE) still writes '.spec-main-shape-gate.json' into objectui's installed spec and turbo is its only reader; it still guards the objectui#12114 local-reproduction cache case. Premise re-verified on the new base: the three files existed, objectstack spec-shape-gate.yml (cron '52 * * * *') is in RELEASE_GATE_WORKFLOWS, both gates' last four schedule runs on main concluded success, #12325 is closed, and the live ruleset no longer lists 'Spec Main Shape Gate' (so deletion cannot stall the queue).", "tests": "At HEAD 3e9675e20 (git rev-parse --short HEAD after the final commit; no later push). (1) bash os-verify-lock.sh -c 'pnpm exec vitest run --maxWorkers=2' over 89 hand-derived files (every scripts/__tests__ test naming repo-gates.yml, the deleted workflow, dependabot-merge-gate, check-required-check-set, ci-cd-pipeline.md or workflow-checks, plus every test reading .github/workflows/): 'Test Files 89 passed (89)', 'Tests 3340 passed (3340)', 'os-verify-lock: VERDICT command-exit 0 · held the lock 214s'. (2) pnpm type-check:scripts (tsc -p tsconfig.scripts.json) under the lock: VERDICT command-exit 0. (3) pnpm exec eslint on the four changed .mjs/.ts files: exit 0, no output. No ablation: the diff changes config lists, comments, docs and deletes files; it changes no tested behaviour (os-dev rule: config/script/workflow/docs are not ablated). The removal of the NOT_A_GATE entry is forced by the existing partition assertion 'the gate names checks that no pull-request workflow produces'.", "gates": "Route B: node /home/user/objectstack/scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectui exit 2 'REFUSING — asked for objectstack-ai/objectui, but this checkout is objectstack-ai/objectstack' (by design), so --ran reconciliation does not apply; local set hand-derived from objectui's repo-gates.yml install-free steps. Each exit captured before any pipe: check-control-bytes 0; check-action-ref-convention 0; check-pre-install-import-graph --self-test 0 and run 0; check-shell-escape-residue 0; check-doc-links 0 ('Links are valid across 17 scan roots', incl. the new #spec-shape-gate--moved-to-objectstack anchor); check-doc-fence-languages --self-test 0 and run 0; check-doc-example-ids 0; check-doc-component-types 0; check-new-cross-file-line-citations 0 ('0 new citation(s)'); check-required-check-set --self-test 0 ('32 cases pass'); check-changeset-presence 0 ('no changeset is owed'); check-governed-queue-guard --test on all 9 changed paths exit 3 = GOVERNED (2 of 9 on .github/workflows/**), PR stays draft; control-byte self-scan grep exit 1 (no hits). Live ruleset: gh api repos/objectstack-ai/objectui/rules/branches/main then node scripts/check-required-check-set.mjs --fixture on it: exit 0 INTACT, 7 required contexts, Spec Main Shape Gate absent (the script's own live read exit 2, HTTP 401, no token in container = reading not taken). PR check-runs on 3e9675e20 at report time: Changeset Declaration=success, Changeset Fixed Group Check=success, Changeset Claim Re-read=success, Line Citation Gate=success, Governed Surface Queue Guard=success, label=success; Type Check, Lint, Repo Gates, Build Docs, Build & E2E, Test (shard 1-16/16), Test (dist pins), Live E2E (informational)=in_progress; dependabot/Test (coverage)/coverage shards=skipped. No 'Spec Main Shape Gate' check run on the PR (workflow gone on the branch). NOT MEASURED locally, CI's: full pnpm test, pnpm lint farm, turbo type-check, Build Docs, Build & E2E, Repo Gates build-dependent steps (doc snippet / skill example compiles; the new section adds no fence).", "mcp_calls": "0", "api_writes": "2 relay strokes via scripts/pm/fleet-write/dispatch.mjs and post-stamped (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12596/assignees [os-sales], run 38837082474 success, read-back 9957 bytes sent = 9957 stored; (2) this os-dev-report comment = POST /repos/objectstack-ai/objectui/issues/12352/comments. git push x2 (empty-branch probe, then 3e9675e20) are not REST. No label writes, no PR body PATCH.", "open_questions": [], "out_of_scope_findings": [ "observation, not filed (dormant; carrier: none, the objectstack registry's accepting seat would own it): objectstack scripts/ci/spec-shape-retirements.json on origin/main 6362c66ca still carries the entry with downstream_card objectstack-ai/objectui#12325, though that card was closed completed 2026-10-14 and the file's $comment says an entry is 'deleted when that card closes'; objectui's hourly runs have been green since, so it matches nothing today, but its packages/** TS2367/TS2678 '\"api\"' patterns would read a later same-pattern break as known. Dedupe words: spec-shape-retirements stale entry · 12325 registry entry · retirement registry cleanup", "observation, not filed (carrier: none): turbo.json globalDependencies marker entry is now unpinned in objectui (its pin lived in the deleted spec-main-shape-gate.test.ts); the reason now lives in content/docs/guide/ci-cd-pipeline.md 'What stays here'.", "history, other lanes, left alone (stays true, past tense): packages/data-objectstack/src/spec-symbol-batch6.test.ts ('IT FIRED AGAIN ... in the Spec Main Shape Gate'); packages/react/src/hooks/__tests__/useNavigationOverlay.modeDefault.test.tsx ('the one diagnostic the Spec Main Shape Gate reported'); packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts first mention ('went red'); packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts (both: 'printed' / 'never printed'); packages/types/src/__tests__/retired-key-type.ts ('were written to compile against both ... while the two disagreed'); packages/types/src/zod/index.zod.ts and public-blocks.zod.ts ('caught it'); packages/types/src/zod/reports.zod.ts ('measured by').", "present tense, name now stale but substance true (the same objectui type-check against spec main still runs, as objectstack's Spec Shape Gate), other lanes, left alone: packages/data-objectstack/src/metadata-client.overlayScope.test.ts (two comments: 'compiled against TWO specs ... the Spec Main Shape Gate'; 'the Spec Main Shape Gate type-checks and runs no test'); packages/plugin-designer/src/__tests__/NavigationDesigner.specNavTypes.test.tsx ('the Spec Main Shape Gate's injected install'); packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts second mention ('compiles against objectstack main'); packages/types/src/__tests__/authoring-nodes-11364.test.ts, element-repeater-data-source-11880.test.ts, grid-default-filters-gantt-map-filter-round10-6152.test.ts ('compiled against both ... by the Spec Main Shape Gate against main'); packages/types/src/__tests__/report-chart-query-spec-parity.test.ts (three: 'compiled ... by the Spec Main Shape Gate', 'type-checks and runs no test', 'the half the Spec Main Shape Gate never runs'); packages/types/src/__tests__/spec-object-refinements-7715.test.ts ('the Spec Main Shape Gate compiles this repository'). CHANGELOG.md (app-shell, i18n, runner) and .changeset (11573, 12093, 12170) mentions are history, untouched." ], "su_du": "- 删了什么:objectui 自带的 spec 形状门副本 —— `spec-main-shape-gate.yml`、它的脚本与 pin 测试;另把依赖收紧台账、必需检查巡检、Repo Gates 注释和 CI 文档里提到它的几处改成「门已搬到 objectstack」。\n- 为什么安全:维护者裁决 B(objectstack-ai/objectstack#23238)要求两边一致后删副本,两边最近四个小时运行结论一致;线上必需检查名单(开 PR 前实读,7 项)早已不含这个检查名,删掉不会卡住合并队列;objectstack 的后继门用它自己的脚本,不引用被删文件。\n- 谁接替:objectstack 的 `spec-shape-gate.yml` 每小时 :52 用 objectstack main 构建的 spec 编译 objectui main,发版门读它,红灯归改动 spec 的那条 lane;有意的退役登记在 objectstack `scripts/ci/spec-shape-retirements.json`。\n- 保留:`turbo.json` 里那条注入标记(objectstack 注入时仍写它,防本地复现时 turbo 缓存串味);回滚 = revert 本 PR。", "files_changed": [ ".github/workflows/spec-main-shape-gate.yml (deleted)", "scripts/spec-main-shape-gate.mjs (deleted)", "scripts/__tests__/spec-main-shape-gate.test.ts (deleted)", "scripts/dependabot-merge-gate.mjs", "scripts/__tests__/dependabot-merge-gate.test.ts", "scripts/check-required-check-set.mjs", ".github/workflows/repo-gates.yml", "content/docs/guide/ci-cd-pipeline.md", "scripts/__tests__/ci-cd-pipeline-doc.test.ts" ], "changed_lines": "9 files changed, 50 insertions(+), 2807 deletions(-) (git diff --shortstat 7b5e55893..3e9675e20)", "deviations": [ "Base moved: the dispatch read origin/main ae923ece22; the worktree was cut from 7b5e55893 (origin/main at start). Every premise was re-read on 7b5e55893; the lead-list grep hit the same 35 files.", "Within the claimed surface, four items stay unchanged on purpose: turbo.json (marker still written by objectstack's inject, read by turbo; see summary), scripts/__tests__/select-type-check-scope.test.ts (the paths are input strings to a stubbed selector reproducing PR #12262, not read from disk), scripts/__tests__/check-required-check-set.test.ts and fixtures/required-check-set/live-2026-10-12.json (a dated reading that stays true; the seven ruled names unchanged), and the objectui#12240 window paragraph in the check-required-check-set.mjs header (history). No .changeset added: check-changeset-presence says none is owed.", "The REQUIRED_CONTEXTS note in dependabot-merge-gate.mjs was deleted rather than rewritten: it pointed at the NOT_A_GATE entry this PR removes, and the partition test already refuses a classified name that nothing produces.", "check-required-check-set.mjs live read answered HTTP 401 in this container (no GITHUB_TOKEN), exit 2; the ruleset was read through gh api and judged with the same script's --fixture.", "Attribution: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer; commits carry the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md section 9, and the PR body ends with the os-dev session-URL footer. No model identifier is in the PR, the commit, the docs or this report." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → objectui#12596 comment
6206273492·domain:devx@ objectui seat 1 · 2026-10-16T01:56Z. Tier H (.github/workflows/**): the PR stays a draft withneeds-user-decisionand review requested fromos-zhuangandhotlong; after an authorised approval and green CI the seat lands it. The objectstack-side follow-up is objectstack-ai/objectstack#23782.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed: objectui#12596 →
c6a42be392(Fixes #12352) ·domain:devx@ objectui seat 1 ·session_016PVjjuVPte5XEJvaQx1E4t· 2026-10-16T02:21Zos-zhuang(review5542095139); readied, auto-merge armed and enqueued byos-zhuang; merged through the queue at 2026-10-16T02:20:45Zmainc6a42be392is the head (one parent,7d0c174ba).github/workflows/spec-main-shape-gate.yml,scripts/spec-main-shape-gate.mjsandscripts/__tests__/spec-main-shape-gate.test.tsare absent.turbo.jsonstill names.spec-main-shape-gate.json(kept on purpose)d6c39af00:repo-gates.ymlf4c959cc77,ci-cd-pipeline.md8093708281,ci-cd-pipeline-doc.test.tscbbd8cdeae,dependabot-merge-gate.test.ts8dd6f36903,check-required-check-set.mjsbbedf5fd39,dependabot-merge-gate.mjs68610ab4adcompleted.pm:dispatchedis removed in this act.main) — on every objectui PR, or on an objectstack schedule and before each release? objectstack#23238 is fully executed. The spec shape gate runs only in objectstack (spec-shape-gate.yml, hourly at:52), and objectui no longer runs a second copy.apidata source is retired in @objectstack/spec (objectstack#23082): delete theViewData.provider === 'api'readers, keep the approvals inbox's code-builtApiDataSource#12325 registry entry). ItsBlocked-by:line names this card. Triage routes it.Generated by Claude Code