Ruled: 5770147353 · letter A · 2026-09-22T01:58Z — 一类自裁 (director seat, summon #26); state pm:dispatched, executor domain:spec seat 2
Path: P2 | none | none
This card reports a failure by the seat filing it. domain:spec execution seat 2, session session_01UDXER3sdqfeVYpEWZs5mZx. Filed into the decision box because the part that is still open — two PRs already in main — is above a seat's floor.
维护者速读
今天上午你裁了一件事:fable 这个档位没有了,契约复审改用 opus。这条裁决 10:22:54Z 落进主干。
我没有在每场复审前重读那个常量,于是从 10:22:54Z 到 15:27Z 这四小时四十七分钟里,我又派了 5 场契约复审,全部跑在已经退役的 fable 档上。按规矩(「降档保险丝」),跑错档的裁决整体作废 —— 不是打个折,是不算数。
后果分三档:
已经合并的这两张,我不能自己决定怎么补。三个选项在下面,我荐 A:现在按 opus 档把这两份已合并的 diff 重跑一遍复审,通过就补记录、不通过就照常立缺陷卡。它是只读的,改不动已经发生的合并,但能把「有没有真出事」从猜变成读数。
请回一个字母:A / B / C
What happened, measured
CONTRACT_REVIEW_TIER (scripts/pm/dispatch-gates.mjs) is the single value site for the clause-② review tier. Commit 77df0f61a6 (PR #19573) moved it the RETIRED tier → the current CONTRACT_REVIEW_TIER, landing on main at 2026-09-21T10:22:54Z, on the maintainer's ruling recorded in that constant's own docblock — verbatim 「fable 没有了」, answered with 「改成 opus」.
references/contract-review.md 「降档保险丝」 says, verbatim:
保险丝只管 spec 与 skills 席的条款②复核:每场前必读服役档
and
产出裁决的每轮都须读到契约复审档位,见回退证据 ⇒ 裁决整体作废
This seat read the constant once, at ~10:10Z, and never again. Every review dispatched after 10:22:54Z went to the retired tier.
The ledger — served tier measured from each reviewer's own transcript (per-assistant-row message.model), ⛔ never from a self-report or the argument passed
| record |
posted |
rows |
run window |
served |
tier required THEN |
verdict |
#19228 5757510615 |
08:21Z |
156 |
08:00–08:18 |
the RETIRED tier |
the RETIRED tier |
✅ at tier |
#18669 5757920935 |
08:59Z |
114 |
08:36–08:56 |
the RETIRED tier |
the RETIRED tier |
✅ at tier |
#19228 5758197441 |
09:21Z |
151 |
08:54–09:18 |
the RETIRED tier |
the RETIRED tier |
✅ at tier |
#19228 5758796875 |
10:10Z |
101 |
09:56–10:08 |
the current CONTRACT_REVIEW_TIER |
the RETIRED tier |
⛔ voided at the time — correctly |
#18669 5758954786 + PR #19549 5758966480 |
10:23Z / 10:24Z |
65 |
10:09–10:21 |
the RETIRED tier |
the RETIRED tier (flip at 10:22:54) |
✅ at tier when it RAN |
#19228 5759348642 |
10:54Z |
105 |
10:35–10:53 |
the RETIRED tier |
the current CONTRACT_REVIEW_TIER |
⛔ VOID |
#19228 5759714087 |
11:26Z |
80 |
11:12–11:25 |
the RETIRED tier |
the current CONTRACT_REVIEW_TIER |
⛔ VOID — PR #19533 merged on it |
#14640 5761229184 |
13:25Z |
94 |
13:05–13:24 |
the RETIRED tier |
the current CONTRACT_REVIEW_TIER |
⛔ VOID — PR #19594 merged on it |
#15178 5762743365 |
15:08Z |
111 |
14:46–15:02 |
the RETIRED tier |
the current CONTRACT_REVIEW_TIER |
⛔ VOID — a FAIL; rework in flight |
| #15292 (never posted) |
— |
111 |
15:10–15:27 |
the RETIRED tier |
the current CONTRACT_REVIEW_TIER |
⛔ VOID — a FAIL, withheld |
Instrument: every subagent transcript this session wrote, counted by message.model. all 37 subagent transcripts this session wrote carry assistant rows, and 0 of the 37 mix models (21 single-model the RETIRED tier, 16 single-model the current CONTRACT_REVIEW_TIER), so the per-run reading is not an average over a fallback. LIT CONTROL: the same sweep finds the current CONTRACT_REVIEW_TIER runs in the same window (e.g. the 09:56–10:08 run above, and the dev agents), so a the RETIRED tier reading is a real reading of a distinct value and not the only string the instrument can print.
What is already repaired, ⛔ not waiting on this card
The open question
Two PRs are in main, landed against verdicts the fuse says do not count. The fuse assumes the voiding happens before landing and says nothing about after. A seat may not decide what a published contract change owes.
os-decision-facets
- ① 项目长远合理性:A 缩小特例 —— 把「裁决作废」这条规则补上它唯一缺的那半边(合并之后怎么办),不新增例外;C 则等于给作废规则开一个「已经合并就算了」的口子,那个口子以后每次都会被引用。
- ② 实际业务拉动:今天没有客户撞上 —— 两张 PR 的门禁全绿、主干未红。拉动来自下一次:如果复审可以事后不算数,契约面的「已复审」三个字就不再是读数。
- ③ 防 AI 犯错:A 的失败是响亮的(重跑出 FAIL 就立缺陷卡);C 的失败是静默的 —— 没有任何人会再看这两份 diff 一眼,而它们进的是
packages/spec,正是 AI 照抄的那份说明书。
- ④ 创业阶段不扩散:A 是一次性只读动作,不新增长期义务;B 要回滚两张已合并 PR 并重走全程,代价远超已知风险;C 零成本但留下一条永久的软化先例。
Prior rulings read: contract-review-tier,retired-tier,downgrade-fuse,void-verdict → thread: none; ADR: none found; search terms 降档保险丝 / CONTRACT_REVIEW_TIER / 裁决整体作废 over .claude/skills/pm-dispatch/** and scripts/pm/**.
Options × real cost
| option |
what is done |
what anyone can perceive |
A — post-hoc re-review at the current CONTRACT_REVIEW_TIER |
Run the clause-② review of #19533's and #19594's merged diffs at the current tier. PASS ⇒ record it and the breach is procedural only. FAIL ⇒ each defect becomes an ordinary card. |
Read-only; changes nothing in main today. Costs two review runs. Turns "did this hurt anything" from a guess into a reading. |
| B — revert both, re-land through a correct review |
git revert both merges, re-open, re-review at tier, re-land. |
Maximum rigour. #19594 enrolled a new governed liveness type (rest_api) that other work may already read; reverting it churns a published surface over a process defect with no measured harm. |
| C — accept as landed, record the breach only |
Write the ledger and stop. |
Cheapest. Leaves two packages/spec changes with no at-tier review on record, and sets the precedent that a voided verdict survives if the merge beat the discovery. |
业务含义直译 —— A = 「出事没出事,先量一遍再说」;B = 「流程错了就整件退货重来」;C = 「已经发出去的就算了,下不为例」。
推荐:A。 回退项:若 A 的重跑对任一张判 FAIL 且缺陷是用户可达的,再按 B 处置那一张 —— 而不是现在就对两张都用 B。置信缺口:我没有量过 rest_api 这个新活性类型今天有没有被别的在飞工作读到,所以 B 的真实代价我只能说「至少这么多」,不能说「就这么多」。
自检行:只看①选 A;②③④ 是否翻转:否。
Duplicate-search terms
CONTRACT_REVIEW_TIER · 降档保险丝 · 裁决整体作废 · the RETIRED tier · off-tier contract review
Generated by Claude Code
Ruled: 5770147353 · letter A · 2026-09-22T01:58Z — 一类自裁 (director seat, summon #26); state pm:dispatched, executor domain:spec seat 2
Path: P2 | none | none
This card reports a failure by the seat filing it.
domain:specexecution seat 2, sessionsession_01UDXER3sdqfeVYpEWZs5mZx. Filed into the decision box because the part that is still open — two PRs already inmain— is above a seat's floor.维护者速读
今天上午你裁了一件事:fable 这个档位没有了,契约复审改用 opus。这条裁决 10:22:54Z 落进主干。
我没有在每场复审前重读那个常量,于是从 10:22:54Z 到 15:27Z 这四小时四十七分钟里,我又派了 5 场契约复审,全部跑在已经退役的 fable 档上。按规矩(「降档保险丝」),跑错档的裁决整体作废 —— 不是打个折,是不算数。
后果分三档:
limitactually lands (#19228) #19533(11:49Z 合)与 feat(spec): enrolRestApiConfigSchemain the liveness ledger asrest_api#19594(13:59Z 合)。代码已在主干。settingsis a platform group, not a per-app one (#15178) #19600 的 FAIL 与 docs(plugin-dev): document the malformed-stack boot posture and pin its division #19602 的 FAIL。这两场我作废掉重跑就行,不用你裁。已经合并的这两张,我不能自己决定怎么补。三个选项在下面,我荐 A:现在按 opus 档把这两份已合并的 diff 重跑一遍复审,通过就补记录、不通过就照常立缺陷卡。它是只读的,改不动已经发生的合并,但能把「有没有真出事」从猜变成读数。
请回一个字母:A / B / C
What happened, measured
CONTRACT_REVIEW_TIER(scripts/pm/dispatch-gates.mjs) is the single value site for the clause-② review tier. Commit77df0f61a6(PR #19573) moved it the RETIRED tier → the currentCONTRACT_REVIEW_TIER, landing onmainat 2026-09-21T10:22:54Z, on the maintainer's ruling recorded in that constant's own docblock — verbatim 「fable 没有了」, answered with 「改成 opus」.references/contract-review.md「降档保险丝」 says, verbatim:and
This seat read the constant once, at ~10:10Z, and never again. Every review dispatched after 10:22:54Z went to the retired tier.
The ledger — served tier measured from each reviewer's own transcript (per-assistant-row
message.model), ⛔ never from a self-report or the argument passed5757510615575792093557581974415758796875CONTRACT_REVIEW_TIER5758954786+ PR #1954957589664805759348642CONTRACT_REVIEW_TIER5759714087CONTRACT_REVIEW_TIER5761229184CONTRACT_REVIEW_TIER5762743365CONTRACT_REVIEW_TIERCONTRACT_REVIEW_TIERInstrument: every subagent transcript this session wrote, counted by
message.model. all 37 subagent transcripts this session wrote carry assistant rows, and 0 of the 37 mix models (21 single-model the RETIRED tier, 16 single-model the currentCONTRACT_REVIEW_TIER), so the per-run reading is not an average over a fallback. LIT CONTROL: the same sweep finds the currentCONTRACT_REVIEW_TIERruns in the same window (e.g. the 09:56–10:08 run above, and the dev agents), so a the RETIRED tier reading is a real reading of a distinct value and not the only string the instrument can print.What is already repaired, ⛔ not waiting on this card
settingsis a platform group, not a per-app one (#15178) #19600, finding(plugin-dev):DevPlugindegrades a malformed stack at the metadata door but the option-B readers want to refuse it — which posture is it? #15292/docs(plugin-dev): document the malformed-stack boot posture and pin its division #19602) are recorded as VOID on their cards and will be re-run at the currentCONTRACT_REVIEW_TIER. Per the fuse, the re-run on the same head cites the voiding and ⛔ is not a re-run seeking a PASS — both were FAILs.The open question
Two PRs are in
main, landed against verdicts the fuse says do not count. The fuse assumes the voiding happens before landing and says nothing about after. A seat may not decide what a published contract change owes.os-decision-facets
packages/spec,正是 AI 照抄的那份说明书。Prior rulings read: contract-review-tier,retired-tier,downgrade-fuse,void-verdict → thread: none; ADR: none found; search terms
降档保险丝/CONTRACT_REVIEW_TIER/裁决整体作废over.claude/skills/pm-dispatch/**andscripts/pm/**.Options × real cost
CONTRACT_REVIEW_TIERmaintoday. Costs two review runs. Turns "did this hurt anything" from a guess into a reading.git revertboth merges, re-open, re-review at tier, re-land.rest_api) that other work may already read; reverting it churns a published surface over a process defect with no measured harm.packages/specchanges with no at-tier review on record, and sets the precedent that a voided verdict survives if the merge beat the discovery.业务含义直译 —— A = 「出事没出事,先量一遍再说」;B = 「流程错了就整件退货重来」;C = 「已经发出去的就算了,下不为例」。
推荐:A。 回退项:若 A 的重跑对任一张判 FAIL 且缺陷是用户可达的,再按 B 处置那一张 —— 而不是现在就对两张都用 B。置信缺口:我没有量过
rest_api这个新活性类型今天有没有被别的在飞工作读到,所以 B 的真实代价我只能说「至少这么多」,不能说「就这么多」。自检行:只看①选 A;②③④ 是否翻转:否。
Duplicate-search terms
CONTRACT_REVIEW_TIER·降档保险丝·裁决整体作废· the RETIRED tier · off-tier contract reviewGenerated by Claude Code