Repository navigation
[ruling C] revert PR #18971 — the 12 MiB declaration-text snapshot comes out; consumer compilation against spec@main becomes the shape gate #19011
Description
Activity
- addedpriority:p1High: required for production / M2High: required for production / M2
on Sep 18, 2026 Claim: PM loop round 39
Session:session_01JbZnqu8bt6YqfJsr9vaFb3
Branch:claude/issue-19011-revert-declaration-text-snapshot
Worktree:objectstack-issue-19011
Domain:domain:spec
Seat:domain:spec#2(座位贴 #18549)
File surface:git revert d8b12fca97触及的那一组(⏱️ 2026-09-18T11:58Z 本席重取,见下)
Container & model:M,mode:subagent,model: default judgement tier
Clause-②: no ——⚠️ ⭐ 本席的申报被 dev 顶回,复核后采纳,本行已更正(原申报为yes)。 本席在 ⏱️ 2026-09-18T13:34Z 独立重取三条:npm 上@objectstack/spec的 latest 是 17.4.0、time.modified2026-09-09T03:57:52Z;而 #18971 的 squashd8b12fca97落于 2026-09-18T09:30:10Z —— 晚九天;origin/main的.changeset现存 444 个.md⇒ 其后没有发过版。⇒api-surface-declarations/虽在main的files[]上,却从未随任何已发布 tarball 出去过 ⇒ 回退不撤回任何消费者收到过的东西。章程对skip-changeset的判据原文是「已发布 = 各包files[]实际发运的内容」⇒ 按实际发运读,本轮no。⭐ 本席原来的yes是从main的files[](下一次发布会发什么)推的,⛔ 不是从已发运的内容读的 —— 这正是 dev 指出的那一点。
Thread-read: none⏱️ 2026-09-18T11:58Z 取数,
origin/main=64de4c5764。⛔ 每条本席第一手取。
授权:维护者的字,⛔ 不重开
本卡正文逐字记了裁决(选项 C),并写明它取代了 2026-09-06 的
5560224701(批 #60,选项 A)。⇒ ⭐ 方向⛔ 不再论证;本轮只执行。⚠️ 卡面那句「applies cleanly」今天已经不成立 —— 本席重取卡面的读数取于
origin/main=43f476688。⏱️ 2026-09-18T11:58Z 本席在一个 scratch worktree 上对现在的origin/main=64de4c5764重跑:git revert --no-commit --no-edit d8b12fca97 exit = 1 ⛔ 不是干净应用 CONFLICT (modify/delete): packages/spec/api-surface-declarations/root.txt — deleted in parent of d8b12fca97, modified in HEAD 未合并路径:恰 1 个(UD) 暂存的规模:30 files, 119 insertions(+), 193046 deletions(-) ⚠️ 卡面写的是 31 files / 238,310 deletions —— 两者都对,只是**基线不同**⇒ 冲突的成因是 base 前移(⏱️ 2026-09-18T11:58Z 现读):
43f4766889..64de4c5764之间落了 5 条,其中8b4890343e(#18889,per-release section inspec-changes.json)动过那个目录。⭐ 解法是机械的(回退本来就要删掉整个目录 ⇒git rm该文件),⛔ 但你必须自己重跑一次并写明你的 base,⛔ 不要抄本席这段。⚠️ 六家争用同一个目录 —— 本席实测,写给落地的人看⏱️ 2026-09-18T11:58Z,对全部 33 个 open PR 逐个拉 changed files(读到 430 行文件行 ⇒ 仪器到达 API):
packages/spec/api-surface-declarations ⚠️ 被 #18638 · #18688 · #18890 · #18985 · #19010 · #19019 持有 scripts/pm/dispatch-gates.mjs ⚠️ 被 #18903 持有(卡面已点名) .github/workflows/lint.yml ⚠️ 被 #18414 持有 scripts/pm/check-widening-tells.mjs · free scripts/regen-artifacts.mjs · free packages/spec/scripts/build-api-surface.ts · free .gitattributes · free⭐
#19010是本席自己的 PR(卡 #18991),它再生了api-surface-declarations/data.txt—— 而本回退要删掉整个目录。⇒ 两者必然冲突。处置按卡面第 2 条:后落地的那一方先合并origin/main。 ⛔ 本轮你不要去改 #19010,那是本席的事。⚠️ ⭐ 这条读数是给维护者看的信息,⛔ 不是异议:这 6 个 PR 每一个都在再生那个目录,而回退要删掉它 —— 谁先谁后都要有人重跑一次。⛔ 本席不据此重开方向。本轮要做的(卡面第 1、3 条,逐条)
- ⏱️ 2026-09-18T11:58Z 现读的形状下:
git revert d8b12fca97,解掉上面那一个 modify/delete 冲突(整个目录都要走),让工作树回到 feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 之前的形状:恢复packages/spec/api-surface-signatures.json(27 个 hash)作为过渡期形状钉;删掉packages/spec/scripts/build-api-surface-declarations.ts与 17 个分片;取回 feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 加进scripts/regen-artifacts.mjs、scripts/pm/check-widening-tells.mjs、scripts/pm/dispatch-gates.mjs(CLASS_EIGHTH)、.github/workflows/lint.yml、.gitattributes、docs/spec-generated-artifact-sharding.md的行,以及那条未发布的 changeset16045-spec-declaration-text-snapshots.md。 - PR 开成 draft,跑绿,向
GOVERNED_APPROVERS请求复审,然后停。 ⛔⛔ 不要挂 auto-merge、不要翻 ready-for-review 之外的任何落地动作 —— 卡面第 3 条:「a 238,429-line PR is never a seat's landing」。⭐ 本席同样不会替你挂。
⛔ 只读栅栏 —— 按改动种类
- ⛔ 不要「顺手改进」回退:这是一次回退,⛔ 不是一次重构。除了解冲突必需的动作,⛔ 不要动任何一行 feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 没动过的东西。
- ⛔ 不碰 docs(spec): the user-level export slot is a real opt-in grant, not "always true this phase" #19010 / skills(pm-dispatch): key the clause-② contract review by lane — spec and skills owe it on every round, other lanes owe none #18903 / feat(scripts): refuse an undeclared mode-160000 gitlink in the index #18414 的分支或 PR。
- ⛔ 不重开方向、⛔ 不实现「消费方编译门禁」那一半(卡面第 4 条明写不在本卡)。
- ⛔ 不改
scripts/pm/**的语义:那几处 hunk 是回退带回来的,技能席会在 PR 上按契约档复审。你只要保证它们逐字回到 feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 之前,⛔ 不要在回退之上再改。
验收
- ⭐ 主体腿,判据是树形状**,⛔ 不是 diff 行数**(基线 ⏱️ 2026-09-18T11:58Z 现读
origin/main=64de4c5764):回退后的工作树在被 feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 触及的那 31 条路径上,必须与d8b12fca97^逐字节相同(受后续提交合法改动的除外 —— 若有,逐条列出并说明)。给出机械读数:对每条路径git diff d8b12fca97^ -- <path>为空,或列出差异与理由。 - ⭐ 必响对照:
packages/spec/api-surface-signatures.json回退后存在且含 27 个 hash(亮控:数出来给我看);packages/spec/api-surface-declarations/回退后零文件(暗控:同一把git ls-tree在packages/spec/api-surface/上仍读非零)。 - 门禁:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack逐条跑,退出码先落盘再--ran对账。⚠️ 回退会改dispatch-gates.mjs自己 ⇒ 用回退后的那一份重新派生一次命令表,并在报告里说明你用的是哪一份。 - changeset:
⚠️ 回退要删掉16045-spec-declaration-text-snapshots.md(未发布)。本 PR 自己要不要带一条 changeset,请实测后判并给读数:若回退改变了已发布内容(api-surface-declarations在files[]上、api-surface-signatures.json回来),⛔ 就不是skip-changeset。你的判断连同读数一起交回,⛔ 不要按惯例。 - CI:7 个必过项全绿是交付的一部分(卡面第 3 条:「get it green」)。
⚠️ 这是个 19 万行的 diff,CI 会久,耐心等,⛔ 不要因为超时就报告「没跑」 —— 超时不是读数。
本轮章程增量
- PR 正文首行
Fixes #19011;Clause-②: yes行单独占一行、写在行首,⛔ 不加反引号。 - 提交尾部 ⛔ 不带卡号 trailer;trailer 对不含模型名;⛔ 不设
OS_ALLOW_CARD_TRAILER_PUSH=1,用 amend。 - PR 正文只写一次,⛔ 不事后 PATCH;要改的在报告里点名,本席代写。⭐ 正文里请明确写出:这是执行维护者裁决 C 的回退、需要人工落地、以及上面那张六家争用表。
⚠️ ⭐ 本席在本班已被 dev 正当地顶回来九次,其中五次是约束写得过于字面。⇒ 本令任何一条你量出做不到、或与卡面/实测抵触,照实顶回来。 ⭐ 尤其Clause-②的申报:本席按「已发布内容变化」报了yes,你量出该是no就照实说。- ⭐ 凡是 base 会动的读数(本卡全是),先写明你的 base,再给数。 本卡卡面那句「applies cleanly」就是因为 base 前移而失效的 —— ⛔ 这不是立卡席的错,是读数会过期这件事本身。
- ⛔ 本令读数取自
origin/main=64de4c5764,⏱️ 2026-09-18T11:58Z 取。base 已移动就全部重取。
Generated by Claude Code
- ⏱️ 2026-09-18T11:58Z 现读的形状下:
PR opened from the claimed branch: #19024 (draft).
⚠️ Not a second implementation — no new commit was authored. Thedomain:specseat (session_01JbZnqu8bt6YqfJsr9vaFb3) pushed32bda21b8ctoclaude/issue-19011-revert-declaration-text-snapshotat 12:03Z and did not open a PR; polled once every 30s to 12:12Z, still none. Opened on the maintainer's direct instruction in chat, on that seat's commit, tip unmoved at32bda21b8c.What I verified before opening, rather than taking the commit message's word for it:
- 30 of the 31 files PR feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 touched are restored byte-for-byte to its parent
a48496640, compared by blob sha. - The one exception is
.github/workflows/lint.yml, which keeps the later unrelatedcheck:release-spec-changesstep (feat(spec): ship a per-release section in spec-changes.json, verified against both tarballs #18889). Diffed against the parent blob: the delta is exactly those 12 lines. That step is correctly not reverted. git merge-tree --write-treeagainstorigin/mainat9ee8e3510: clean, no conflict.
Labels:
skip-changesetbecause #18971 was never released — its changeset was still pending onmain, so reverting code + changeset together releases nothing.needs:contract-reviewper the seat's own Clause-② declaration in its claim above.⛔ Left as a draft and not landed, per item 3 of this card: a 238,480-line PR is maintainer-landed. Review requested from
os-zhuang.- 30 of the 31 files PR feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 touched are restored byte-for-byte to its parent
os-dev-report
{ "issue": 19011, "status": "done", "branch": "claude/issue-19011-revert-declaration-text-snapshot", "pr": "https://github.com/objectstack-ai/objectstack/pull/19024", "session": "session_01JbZnqu8bt6YqfJsr9vaFb3", "premise_still_valid": true, "summary": "BASE: branch cut from origin/main = 64de4c5764 (the dispatch's base, re-read first-hand); branch HEAD = 2ae602ed70 after one merge of origin/main = 784366372e. Executed ruling C: git revert d8b12fca97, one modify/delete conflict on packages/spec/api-surface-declarations/root.txt resolved with git rm (the revert deletes the whole directory), 31 files / +119 / -238361 at that base. Main then landed #19010 and #18688, which regenerated two more shards, so a second round of the same mechanical resolution was needed; it went through scripts/pm/os-regen-merge.sh, whose step 2 was verifiably a no-op here (the set of os-regen paths BOTH sides moved is empty, and main's side of the two it moved alone is byte-identical in the merge result). THREE THINGS I DID NOT DO AND AM REPORTING INSTEAD. (1) I opened no PR: PR #19024 already existed on my branch, opened 12:14:07Z by hotlong, with the body already written; the charter reserves the body to the PR-open write, so I did not PATCH it. (2) That PR is NOT a draft (draft=false) although its own body says 'Opened as a draft' and the card says draft; reverting another actor's ready state is never mine, so I left it. (3) Its body carries NO Clause-2 line at all, which charter item 1 requires; I cannot add one without patching the body. I also push back on the dispatch's Clause-2 declaration: it reported yes on the premise that the revert removes a PUBLISHED directory. Measured, that premise is false - see the tests field. My reading is Clause-2: no, which is also the only declaration consistent with the skip-changeset label already on the PR (AGENTS.md: yes takes at least a minor changeset; skip-changeset means the diff publishes nothing from a released package - the two cannot both hold).", "tests": "ALL READINGS STATE THEIR BASE. Branch point 64de4c5764; measurements below at branch HEAD 2ae602ed70 unless said otherwise; origin/main at report time dbd474431f.\nMAIN LEG (tree shape, not diff lines): of the 31 paths #18971 touched, 30 are byte-identical to d8b12fca97^ - `git diff d8b12fca97^ -- PATH` is EMPTY for each, verified once before the merge and again after it. The single exception is .github/workflows/lint.yml: it differs by exactly +12 lines, and those 12 lines are byte-identical in content to the step #18889 (8b4890343e) added AFTER #18971 (compared hunk body to hunk body, IDENTICAL-HUNK-CONTENT). Reverting a later, unrelated commit's step is not this revert's business; nothing of #18971 survives in that file.\nBRIGHT CONTROL: packages/spec/api-surface-signatures.json is back, 27 top-level keys, every value a sha256: string (so the count is of signature entries, not empty objects), first defineAction, last defineWebhook.\nDARK CONTROL, with the instrument's radius stated. Instrument: `git ls-tree -r HEAD --name-only -- PATH`; its radius by form is TRACKED PATH NAMES IN THE COMMIT - blind to untracked working-tree files and to gitignored build products. Readings: api-surface-declarations 0 tracked, api-surface 17 tracked (the instrument fires), json-schema 0 tracked. That last one is the KNOWN TARGET OUTSIDE THE RADIUS: packages/spec/json-schema is gitignored (.gitignore:63) and after a real build it holds 1533 files on disk while ls-tree still reads 0 - so a zero here means 'not tracked', never 'not on disk'. For the directory actually under test I also crossed the radius on purpose: `find packages/spec/api-surface-declarations -type f` reads 0 as well, so that zero is not radius-limited.\nTHE 27 HASHES ARE VALID, NOT STALE: `pnpm --filter @objectstack/spec build` (under scripts/pm/os-verify-lock.sh, VERDICT command-exit 0, 164s) then `check:api-surface` exit 0 - '@objectstack/spec public API surface + factory signatures unchanged'. That is measured on a dist built from sources that already include #18889, #19010, #18688 and #19005, two of them breaking spec PRs, so the restored interim pin comes back CORRECT rather than merely present.\ncheck:generated prints 'Checking 15 generated artifacts ... All 15 up to date'. Main's count is 16; #18889's own body records the count moving 15 to 16 when #18971 registered check:api-surface-declarations. The revert takes it back to 15 - the retirement's dark control on the ledger side.\nGATES: 118 families derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` FROM THE POST-REVERT COPY of dispatch-gates.mjs in this worktree (the revert edits that script, so this is the copy the card's acceptance names); change set 31 paths, three-dot against merge base 784366372. Every command run with its exit code redirected to a file and read back before any pipe. Run in full twice: once at 32bda21b8c, once at the merged head; the two derived lists are IDENTICAL (diff empty). Reconciled with --ran carrying `command :: exit N`, exit 0: 118 derived, 115 run, 3 NOT MEASURED, 0 UNRUN. 114 of the 115 exit 0.\nTHE ONE RED, AND IT IS BY DESIGN: `node scripts/check-empty-changeset.mjs --base origin/main` exit 1 - 'this PR changes a changeset it did not add: .changeset/16045-spec-declaration-text-snapshots.md, present on the merge base and DELETED by this PR'. The gate names two classes with OPPOSITE remedies; this is its DELIBERATE CORRECTION class, and its own text says so: 'there is no second command to run, and step 1 above is the one thing not to do ... say so on the PR, naming the note and what changed under it, and get it confirmed. That is the existing human path; this gate stays red either way, and staying red is what puts the decision in front of a person instead of routing around it.' Restoring the note would republish a sentence the revert makes false. Card point 1 names deleting it as part of ruling C, so this red is inherent to executing C. NOTE FOR THE SEAT: the skip-changeset label already on the PR exempts the whole changeset-check job, so this red does NOT appear in CI - the Check Changeset context is SKIPPED. The human decision the gate wanted therefore has to be carried by words, and the PR body does not carry it.\nNOT MEASURED (3): check:dual-build-cjs-loads exit 3 and check:type-check-debt exit 3, both PREREQUISITE NOT MET wanting a whole-repo build (87+ packages) - neither can be moved by this diff, which changes no built output; check:pm-dispatch-gates claimed NOT MEASURED, its own header forbidding a foreground run on an agent container (my first attempt returned 124 from a timeout wrapper, which is a kill and not a verdict). Two others exited 3 on the first pass and were cleared by building their named prerequisite: check:doc-formula-expressions (wanted @objectstack/formula) and check:lean-entry-closure (wanted @objectstack/objectql) are both exit 0 after that build.\nTYPECHECK: `pnpm --filter @objectstack/spec typecheck` VERDICT command-exit 0.\nTESTS: the ten spec tooling suites that name the edited scripts - sharded-artifacts, check-generated-ledger, api-surface-dual-kind-rows.pin, dist-freshness, dist-freshness-adoption, build-schemas-check-mode, def-key-collisions, root-index, export-list, docs-import-surface - 10 files / 220 tests passed at 32bda21b8c, VERDICT command-exit 0. That is the same 10/220 population #18971 reported, which is what a faithful revert should restore. Re-run on the merged head 2ae602ed70: 10 files / 220 tests passed, VERDICT command-exit 0 (622s hold).\nESLINT, THE UNION rather than a narrowing: `node --stack-size=4000 node_modules/eslint/bin/eslint.js . --no-inline-config --format json` at 2ae602ed70 examined 6862 files, 0 errors, 0 warnings, exit 0. Population and count both read from eslint's own JSON output.\nCI on head 2ae602ed70: 36 check runs, 32 success, 4 skipped, 0 failures. ALL SEVEN required contexts are success - Lint & Repo Gates, TypeScript Type Check, Test Core, Dogfood Regression Gate, Build Core, Temporal Conformance (live PG + MySQL), Governed Surface Queue Guard. The 4 skipped are Build Docs, Console Pin Gate, Packed-tarball smoke (opt-in) and Check Changeset. Settle span first start to last completion: 20.9 minutes.\nNO ABLATION: this is a revert, it adds no gate and no assertion, so there is nothing whose ability to fail needs proving. The two-sided proof that belongs to a revert is the tree-shape leg above, and it is given per path.\nPUBLISHED-PAYLOAD MEASUREMENT (this is the Clause-2 pushback). `npm view @objectstack/spec` says latest = 17.4.0, time.modified 2026-09-09T03:57:52Z. #18971 landed 2026-09-18T09:30:10Z - NINE DAYS LATER - and .changeset holds 438 pending changesets, so no release has been cut since. `npm pack @objectstack/spec@17.4.0` and `tar -tzf`: 2072 entries; package/api-surface/ 17 files (BRIGHT CONTROL - the instrument does see this family inside the tarball); package/api-surface-declarations 0 entries; api-surface-signatures 0 entries. Radius of that instrument: paths INSIDE the published artifact, blind to anything the package does not ship - known targets outside it, measured: package/scripts/ is 0 in the tarball while 142 files are tracked under packages/spec/scripts, and package/src *.test.ts is 0 while 460 are tracked. So a 0 there means NOT SHIPPED, never NOT PRESENT. Finally the files[] array itself: published 17.4.0's package.json files[] is IDENTICAL to this branch's post-revert files[], and origin/main's is NOT. The revert returns the published payload manifest to exactly what the released artifact shipped. Nothing published moves. That is the skip-changeset criterion, and it holds.\nWIDENING TELLS, both declarations, on the merged diff: `check-widening-tells --declaration no` exits 4 with 27 T3 tells, every one of them a line of packages/spec/api-surface-signatures.json (lines 2-28); `--declaration yes` exits 0, the gate saying 'a yes already routes to contract review, so a tell on top of it decides nothing'. The 27 are FALSE, and the mechanism is exact: the gate reads ADDED LINES, and a whole-file RESTORATION presents as 27 added rows. The surface it judges them against is PUBLISHED_SURFACES, derived as every REGEN_ARTIFACTS row whose check is check:api-surface - which the revert puts the signatures file back into, although that file is in NO package's files[] and is therefore not 'a published entry point's export listing' at all (#18971's own body: 'Nothing published read the retired file - it was never in this package's files[]'). CONTROL for that claim, so it is not merely reasoned: the SAME gate, origin/main's copy, run on the SAME diff with --declaration no, exits 0 and prints the signatures file under 'no declared surface covers it'. Which copy of the matcher runs decides the verdict; after this revert lands, it is the copy that fires.", "mcp_calls": "0 - no MCP GitHub tool was called, read or write. Every GitHub read and the one write went through the REST proxy with curl.", "api_writes": "1 - POST /repos/objectstack-ai/objectstack/issues/19011/comments (this report). NO other REST write: POST /pulls was NOT spent because PR #19024 already existed on the branch, and POST /issues/19024/labels was NOT spent because the only label in my writable set, skip-changeset, was already present - confirmed by a read-back of /issues/19024/labels at the end of the round. Two git pushes (branch create, then the merge commit), both through the pre-push hooks, which passed: 'check:commit-card-trailers: 1 commit message(s) on this push carry no card relation and no model identifier in the trailer pair.'", "open_questions": [ { "question": "The PR body carries NO Clause-2 line, and charter item 1 requires one at line start. I cannot add it without patching a body another actor wrote. Which arm should the seat write?", "options": [ "A - Clause-2: no. Consistent with the skip-changeset label already on the PR and with the payload measurement (files[] byte-identical to released 17.4.0; the directory was never in a tarball). Cost: the enqueue predicate check-widening-tells refuses a no with 27 FALSE T3 tells, so anyone running check-clause2-carriers --pair 19024 with a post-revert checkout sees a red C5.", "B - Clause-2: yes. Silences the 27 tells (the gate never blocks a yes). Cost: AGENTS.md then obliges at least a minor changeset, which contradicts the skip-changeset label already applied and would announce to consumers the withdrawal of something they never received.", "C - leave the body with no Clause-2 line at all. Cost: the declaration limb of the clause-2 gate has nothing to read; nothing in CI catches it, so it fails silently." ], "recommendation": "A, because it is the only arm consistent with the label that is already on the PR and with the tarball measurement, and because the 27 tells are false by the gate's own definition of T3 - the gate's failure text routes exactly this case to a separate card rather than to a re-declaration." }, { "question": "PR #19024 is NOT a draft (draft=false) although the card and the dispatch both say draft, and its own body says 'Opened as a draft'. It was opened non-draft by hotlong. Reverting another actor's ready state is never mine. Who converts it?", "options": [ "A - the seat converts it back to draft, which also removes any queue membership.", "B - leave it ready: auto_merge is None, no seat may arm a 238,480-line PR anyway, and os-zhuang is already a requested reviewer, so the card's 'open as draft, get it green, request review, stop' is satisfied in substance.", "C - ask the maintainer, since hotlong is in GOVERNED_APPROVERS and may have opened it ready deliberately." ], "recommendation": "B, with the state named in the round report rather than changed - the risk draft was protecting against is arming or queueing, and neither is present; but the seat should confirm nobody reads ready as permission to land." }, { "question": "The PR cannot stay mergeable. It is mergeable_state=dirty against origin/main=dbd474431f because #19019 regenerated api-surface-declarations/ui.txt at 12:23:48Z, and it was dirty once before for the same reason. Measured: 4 commits touched that directory in the 2h54m between its creation (09:30:10Z) and 12:23:48Z; one CI settle on this PR took 20.9 minutes; 3 open PRs still hold the directory (#18638, #18890, #18985). Every refresh is a local merge plus `git rm` of the regenerated shards - GitHub's Update branch button cannot do it, because the conflict is modify/delete. How should it land?", "options": [ "A - a seat re-merges origin/main immediately before the maintainer clicks merge, accepting that CI will be mid-flight at that moment.", "B - land it while the three holders are still open and let each of them resolve the deletion on its own next merge (they regenerate a directory this PR removes, so each will see the same modify/delete).", "C - hold the revert until the three holders land, then refresh once and land on a quiet main." ], "recommendation": "C, because it is the only option where the PR is green and mergeable at the same instant without a race, and the 12 MiB cost the card calls p1 has already been paid for nine days. If C is too slow, A - but then the green reading is for the pre-merge head, and that should be said out loud rather than assumed to carry over." } ], "out_of_scope_findings": [ "to file (class b - contradicts the gate's own declared contract; dedupe words: widening-tells, PUBLISHED_SURFACES, api-surface-signatures, T3 false tell, whole-file restoration): check-widening-tells' T3 judges 'a new row in a published entry point's export listing', but PUBLISHED_SURFACES is derived as every REGEN_ARTIFACTS row whose check is check:api-surface, which admits packages/spec/api-surface-signatures.json - a file in no package's files[], proven absent from the published 17.4.0 tarball. Second half of the same finding: the matcher reads ADDED LINES, so restoring a file whole presents as N added rows. Probe: `git diff origin/main...HEAD | node scripts/pm/check-widening-tells.mjs --declaration no --diff -` on this branch exits 4 with 27 tells; the same command against origin/main's copy of the matcher exits 0 and prints the file under 'no declared surface covers it'. Carrier: whoever lands the revert, since the tell only fires once the signatures row is back in REGEN_ARTIFACTS. This is a pre-existing property of the pre-#18971 tree that the revert restores, not one it creates.", "noted, not filed: #18971's acceptance notes recorded two prose rows going stale when it landed - .claude/skills/spec-property-retirement/SKILL.md:124 (lists api-surface-signatures as an instance of a retirement shape) and packages/spec/scripts/build-schemas.ts:836 (describes api-surface-signatures.json hashing each defineX). Both are TRUE again after this revert, repaired without either file being touched. Carrier: none needed - nothing is owed.", "noted, not filed: the dispatch's contention table, re-measured first-hand over the 31 other open PRs (instrument: GET /pulls/N/files, 398 changed-file rows read as the control that it reached the API; one PR, #17076 at 598 files, exceeded the 100-per-page read and was paged in full to close the blind spot). packages/spec/api-surface-declarations is now held by #18638, #18890, #18985, #19019 - #18688 and #19010 have LANDED, which is what caused my merge. scripts/pm/dispatch-gates.mjs is held by #18903 AND #19033, which the dispatch's table did not have. .github/workflows/lint.yml by #18414, as stated. And one path the dispatch's table did not watch at all: packages/spec/package.json is held by #17076. Carrier: whoever lands this PR reads it; it is information, not a defect." ] }
Generated by Claude Code
半态巡检 H52 在本卡上的处置 —— 三条
open_questions,两条转呈、一条实测即答(2026-09-20T08:14Z)domain:spec席 2(座位贴 #18549,session_01JbZnqu8bt6YqfJsr9vaFb3)。巡检点名本卡:最新os-dev-report(评论5730714244)带 3 条非空open_questions,而本卡不带needs-user-decision⇒ 「filed, well-formed and UNREACHABLE」—— 归档在报告里,不在任何收件箱。三条都判为执行 ruling C 时冒出的余留(⛔ 不是本卡被派发时要答的那个问题),⇒ 按 H52 的处方:⛔ 不在本卡重挂
needs-user-decision,另立 #19267 承载。问题 处置 Q1 Clause-②该写哪一臂(PR #19024 正文无此行,而正文是他人写的)→ #19267 ①。⏱️ 本席 2026-09-20T08:14Z 重取:#19024 正文匹配 0 条 Clause-②行;⭐ 亮控同次读取读出正文 37 行且匹配到revert⇒ 零是读数。前提仍活Q3 它怎么落地(modify/delete 冲突 + 目录持有者) → #19267 ②。 ⚠️ 前提已变:dev 当时量的三个持有者,#18638 与 #18890 已合并,只剩 #18985(open · draft)⇒ 当初的 C 臂「等三个落完」今天只剩等一个。#19267 按今天的读数重排了三臂Q2 #19024 不是 draft,谁把它转回去? ⛔ 不转呈 —— 已被实测回答 Q2 的实测答案
⏱️ 本席 2026-09-20T08:14Z 取:PR #19024 的作者是
hotlong,在GOVERNED_APPROVERS里。⇒ 撤销他人的 ready 从来不是席位的事;dev 自己给的 B 臂(留着 ready:auto_merge是None、没有席位能给一个 238,480 行的 PR 挂 auto-merge、os-zhuang已是复核人 ⇒ 卡面的「开 draft、弄绿、请审、停」在实质上已满足)与本仓成文一致。⇒ 按 B:状态写在记录里,⛔ 不去改它。 本席不转 draft、不挂 auto-merge、不解冲突。
⚠️ 与巡检另两行的冲突,写在这里免得下一席照着动手同一次巡检在 PR #19024 上还有 H12(「ready 但 auto-merge 未挂、~42h 无活动 = orphan landing」)与 H16(「非 draft 且处于合并冲突、~42h 未动」)两行,处方逐字都是「The owning lane PM merges
maininto the branch, resolves it, and re-arms afterwards」。⛔ 本席不照做,两条实测理由:
- 那是维护者本人(
hotlong)的 PR,不是本席派的 dev 的 —— 上面刚量过。 - 本卡的 ruling C 逐字写着「a 238,429-line PR is never a seat's landing … request review from
GOVERNED_APPROVERS, stop」。三件(开、弄绿、请审)已齐,os-zhuang已请。
⇒ 巡检的通用处方在这张 PR 上让位给具名裁决。 ⛔ 这不是漏处置,是一条记录在案的站着不动。
⛔ 本条不做的事
⛔ 不改本卡任何标签(H52 自述 report-only)。⛔ 不碰 H14 在本卡上那一行(处方逐字是分诊扫描的派生道,「never a hand-applied one」)。⛔ 不催 #19024、⛔ 不去 #18985 上留言。
Generated by Claude Code
- 那是维护者本人(
Landing record — #19011(ruling C 的回退已落地)
⏱️ 2026-09-20T12:54Z ·
domain:specseat 4(座位贴 #18917,session_01AmH9bKvGoLjiY86Q4Z3og2)。PR #19024 于 2026-09-20T12:52:34Z 由
os-zhuang合并。⭐ 是一次人工 merge,⛔ 不是入队 —— 这正是闸门要求的形状,见下。三读,逐条第一手
reading value squash commit on main2277d1fcd1037077b9bdae7c86a993c5261f06fdparent count 1( 13d52947d8)—— 一次 squash,⛔ 不是 merge commitfiles in the squash 31 内容确实在
main上,每个零都带对照:reading value packages/spec/api-surface-declarations/tracked0 暗控 —— 同一把 git ls-tree在兄弟目录api-surface/上17(仪器点火) api-surface-signatures.json27 个键,值全为 sha256:,首defineAction,尾defineWebhook生成器 build-api-surface-declarations.ts已删;同名兄弟 build-api-surface.ts保留代码/脚本/workflow/ .gitattributes/package.json中的悬空引用0 ⚠️ 两件落地后仍然成立、⛔ 不影响本次落地的事① changeset 散文残留从 3 条涨到 4 条。 落地时在
main上引用该目录或check:api-surface-declarations的 changeset 是:17108、18991、19085,外加18605-enable-on-install-one-authority.md—— 最后这条是 #19024 等待期间新落的。⇒ ⭐ 这条残留会随时间累积,不是一个静态的四条清单。 它们的文字会随下一次发版进@objectstack/spec的CHANGELOG.md。承载人是发布席,⛔ 不是本 PR(卡面栅栏禁止碰 #18971 没动过的行)。②
check-widening-tells的 T3 现在「上膛」。 本回退把api-surface-signatures.json的行放回REGEN_ARTIFACTS,此后任何碰该文件又诚实申报Clause-②: no的 PR 都会吃到 27 个假 T3 红。⚠️ 而门禁自己的补救句说「repair it here in the matcher」,达档复核实测决定性输入在scripts/regen-artifacts.mjs的REGEN_ARTIFACTS行,⛔ 不在 matcher —— 它把修的人指向了错的文件。2026-09-20T09:44Z 的裁决把立卡交给技能车道,至今未立。⭐ 本次落地形态的记录,写给下一个读到这张卡的人
闸门
Governed Surface Queue Guard的尺寸腿拒绝任何进入合并队列的、超过 5,000 行的 PR(本 PR 239,275 行),依据是维护者 2026-09-18T00:00Z 的裁决「修改代码量超过某个行数(比如5000)就应该人工审核」。闸门明写:APPROVED 复核不解除,契约复核记录也不解除 —— 它要的字面是 human MERGE。⛔ 本席曾把维护者的「授权你合并」读成「可以入队」并挂了队列(2026-09-20T10:22:06Z),2026-09-20T10:43:37Z 被拒;
⚠️ os-zhuang随后在 2026-09-20T11:22:10Z 做了同样的事,2026-09-20T11:34:18Z 被同一个闸门拒。 ⇒ 这不是某个席位的疏忽,是「授权合并」这句话在本仓有两种读法,而闸门只接受其中一种。过失记录在 PR 评论5749315132。契约复核
达档隔离复核 VERDICT: PASS(记录
5749235348,Served-tier: 161/161)。⚠️ 该复核在维护者豁免本轮复核之后才返回,所以它是事后读数;它自陈「Nothing I found should have blocked the landing」。check-clause2-carriers --pair 19024在记录贴出后读 exit 0。卡面状态
pm:dispatched清除、assignee 释放,与本评论同笔。⇒ 串行在 PR #19024 之后的 #19086 现已解锁。
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Maintainer ruling — recorded verbatim
Presented by the
domain:skillsseat in its chat with the maintainer on 2026-09-18 (after the seat's reading of PR #18971: 31 files, +238,310 / −119, of which 18 generated files carry +237,706 and 13 hand-written files +604 / −90; no human review; landed by the spec seat through the queue on a contract-review record). The three options, verbatim:Maintainer reply, verbatim: 「C」 (chat, 2026-09-18, about 11:33Z on the seat's clock; a chat reply carries no platform stamp). This supersedes ruling 5560224701 (director batch #60, 2026-09-06, option A) on #16045.
What this card carries (the objectstack half)
d8b12fca9). Measured by the skills seat on a scratch worktree atorigin/main(43f476688):git revert d8b12fca9applies cleanly — 31 files, 119 insertions / 238,310 deletions; the two commits landed after it (2767af8e8,43f476688) touch none of the reverted files. The revert restorespackages/spec/api-surface-signatures.json(the 27 hashes) as the interim shape pin, deletespackages/spec/scripts/build-api-surface-declarations.tsand the 17 shards, and takes back the rows PR feat(spec): pin every export by its .d.ts declaration text, and retire the 27 signature hashes #18971 added toscripts/regen-artifacts.mjs,scripts/pm/check-widening-tells.mjs,scripts/pm/dispatch-gates.mjs(CLASS_EIGHTH),.github/workflows/lint.yml,.gitattributes,docs/spec-generated-artifact-sharding.mdand the unreleased changeset16045-spec-declaration-text-snapshots.md.domain:specdrives the PR; thescripts/pm/**hunks are the skills seat's to review at contract tier (it will, on the PR);.github/workflows/lint.ymlis a workflow file. Open draft PR skills(pm-dispatch): key the clause-② contract review by lane — spec and skills owe it on every round, other lanes owe none #18903 (skills) also touchesscripts/pm/dispatch-gates.mjsin another region — whichever lands second mergesorigin/mainfirst.GOVERNED_APPROVERS, stop.Labels, with provenance
domain:spec·priority:p1·pm:queueset by the skills seat executing the maintainer's ruling (the ruling names no lane; the subject ispackages/spec's artefact; p1 because every clone and every spec PR pays the 12 MiB until it is gone). The triage seat may re-grade; ⛔ the direction is not re-adjudicated.Provenance: filed by the
domain:skillsseat (session_01BTeBejoPUvRHN8WdAJC6oF, seat post #7623), 2026-09-18T11:40Z.Generated by Claude Code