Repository navigation
[finding] Declarations that read correctly to a human but not to the gate — two near-miss spellings measured this session, each silently costing the reading they were written to provide #16303
Description
⛔ Recorded for triage; no severity asserted, no domain:*, no type — routing and grading are triage's. Filed by the domain:cli execution PM seat (#6024) after hitting the same shape twice in one session on two different gates.
The shape
A seat writes a declaration the machine is supposed to read. It reads correctly to a human. The predicate that consumes it does not match, so the declaration is not there as far as the tooling is concerned — and nothing says so at the time it is written. The failure surfaces later, at landing, or not at all.
Both instances were found by an at-tier contract reviewer running the predicate, not by the seat writing the declaration and not by any gate output the author saw.
Instance 1 — Clause ②: vs Clause-②: (a space where a hyphen is required)
Measured on PR #16298 at head 83edbc55f3e. CLAUSE2_KEY_LINE requires the machine spelling Clause-②:; that PR's body writes Clause ②:. The gate says so in as many words:
· declaration line: a near miss, not a declaration —
Clause ②: **yes**…
⇒ the body carries no readable declaration, and the level axis reads yes off the needs:contract-review carrier alone. Measured both ways by the implementer: with the carrier the axis reads yes; with today's four real labels and no carrier, the same event reports NOT MEASURED.
Instance 2 — a Branch: named in prose instead of on its own line
Measured on PR #15675 (the lane's only priority:p1) by its contract review. The card's claim comment named its branch in prose, so governingClaim never matched it and cardDeclaration read {state: missing} — meaning the --pair predicate saw no clause-② declaration on the card at all, on a card whose clause-② grade had been yes and public for two days.
The claiming seat fixed it by posting a claim with Claim: / Branch: / Clause-②: as lines, and verified mechanically rather than by eye: {state: missing} → {state: declared, value: yes}.
⭐ Why the two together are a class rather than two typos
- Both are near misses, not omissions. Nobody forgot to declare. Both authors wrote the declaration, believed it was written, and were right in every sense except the one that counts.
- Neither author got any signal. The gate that would have told them was, in both cases, one that this seat cannot run —
check-clause2-carriersreturnsPREREQUISITE NOT MET / HTTP 403here, every time. ⇒ the seat that writes the declaration is systematically the one that cannot check it. - Both were caught by a reviewer executing the predicate, which is luck rather than process: a reviewer is briefed on the diff, not on the declaration plumbing.
- The failure is silent and asymmetric. A missing declaration is loud at landing. A near-miss reads as present to every human who looks and absent to every machine that matters.
What a fix might look like — ⛔ costs only, not a recommendation
- Have the gate name near misses as errors where it currently reports them as context. The
Clause ②:case IS already detected and printed — it is called "a near miss" in the output. ⛔ Cost: it would red PRs that are substantively fine, including on the card-side-satisfied path, unless the check knows about both carriers. - Accept both spellings. ⛔ Cost: widening a machine format to match prose is how the format stops being machine-readable.
- Emit the declaration from a template rather than by hand, so the spelling cannot drift. ⛔ Cost: templates for claim comments and PR bodies are a tooling surface nobody owns today.
- Leave it and rely on review. ⛔ Cost: this is the status quo, and the status quo produced two instances in one session, one of them on a p1.
Provenance
Instance 1: PR #16298, head 83edbc55f3e, driven with check-changeset-no-major.mjs --base origin/main --event <live label set> and two controls. Instance 2: PR #15675, verified by importing the real cardDeclaration / governingClaim and probing before and after.
Refs: #15675 · #16298 · scripts/pm/check-clause2-carriers.mjs · CLAUSE2_KEY_LINE.
⬇ Appended by the domain:devx execution seat (#6023) when this card was filed into the decision inbox, 2026-09-18T18:08Z. ⛔ Nothing above this rule was edited — the filing seat's text stands as written. The full analysis, and the measurement that reframes the card, are in the comment that accompanies this edit.
维护者速读
一个 PR 要声明「这次改动有没有放宽接受集」。声明是给机器读的一行字。作者写对了意思、写错了排版,机器就当这行不存在 —— 没人当场被告知,问题要么在 CI 里晚一步爆出来,要么根本不爆(卡面那一侧就是这样,有一张 p1 的声明凭空消失了两天)。十天里至少八次,横跨六个 PR、三个不同的席位。
本轮实测把病因从「拼写太挑剔」改写成了另一回事:这条规则其实很干净,只有一句话 —— 装饰随便加,理由随便写,但不能又用反引号把整句包起来、又在包外继续说话。 别的写法(裸写加理由、只给键名加反引号或加粗、项目符号、引用块、缩进)全都读得出来。问题是这句话今天只存在于检查器的源码和一份已合并的 PR 正文里;作者能看到的文档只说「单独一行、行首、就这两种拼法」—— 这句是对的,但它没说清楚「我想多写一句理由」时哪些写法还活着。
⇒ 所以这不是机器太严,是契约没有发表。选项:
- A 把所有近似写法判红,两个载体都判(会红掉一批实质没问题的 PR)
- B 把接受集再放宽,把「整句包起来还继续说话」也收进来(每放宽一次,这个格式就离机器可读远一步)
- C 声明改由工具产出,作者不再手写这一行(彻底消灭这个问题,但多一个今天没人负责的工具面)
- D 只把那一句规则写进作者会看的地方,机械面一个字不改(零成本;本席推荐)
- E 维持现状
请裁一个字母:A / B / C / D / E。
os-decision-facets
① 项目长远合理性:D 既不扩大也不缩小特例 —— 接受集一个字不动,只是把它发表出来;契约先行,把已经存在且自洽的规则写下来,比再造一台绕开它的机器更符合 no-workarounds。B 会让被容忍的拼法集合永久增生,是唯一明确扩大特例的选项。
② 实际业务拉动:非零且已实测 —— 十天内八次,六个 PR、三个席位,其中一次让本车道唯一的 priority:p1 卡在两天里对机器「没有声明」。⛔ 这是实例数不是速率,一轮读不出速率。
③ 防 AI 犯错:今天的失败是静默的(卡面那一侧)与迟到的响亮(PR 正文那一侧要等 CI 红)。D 把作者写之前就该知道的那句话交到他手上,是唯一在「出错之前」起作用的选项;C 更强(闭合枚举,作者根本不组装这行),A 只是把已有的迟到响亮加大音量。
④ 创业阶段不扩散:D 零新增面 —— 不新增门禁、不新增 hook、不新增工具。C 要新增一个今天没有归属的模板面,那是一份永久义务;卡面自己就把这条列为 C 的代价。
Prior rulings read: declarations,read,correctly,human,gate,near-miss,spellings,measured,session,silently,costing,reading (+2 more) → 128 hits; ADR-0076 D11, ADR-0125 D3, ADR-0056 D1, ADR-0058 D6, ADR-0062 D4, ADR-0067 D4, ADR-0069 D3, ADR-0076 D12, ADR-0090 D7
推荐:D。自检行「只看①选 D;②③④ 是否翻转:否」—— ③ 单独看更偏 C(闭合枚举优于自由结构),④ 单独看反对 C 的新增面;两者相消,都不改字母,只把 C 排成「D 发表之后仍复发才付的下一步」。回退项:C。
置信缺口:⛔ 本席没有实测卡面载体(governingClaim / cardDeclaration)那条路径 —— 上面七组读数全是正文形状经 readClause2Line,卡面那一侧是另一个谓词,卡上 instance 2 不被以上任何读数触及。⛔ 也没有数 2026-09-12 之后到今天有多少 PR 撞上这一形状:有三个被别的席位点名,那是实例不是速率。
Generated by Claude Code
Activity
os-zhuang commentedon Sep 7, 2026
Triage: lands in
domain:devx(scripts/pm/check-clause2-carriers.mjs,CLAUSE2_KEY_LINE— ⛔scripts/is not governed surface, so this is an ordinary queue card, not a skills-lane one); rationale: class (c), and it is the definitional case. A seat authors machine-read metadata, the predicate that consumes it does not match, and the declaration is silently not there. Two measured instances, both with controls: instance 1 driven withcheck-changeset-no-major.mjs --base origin/main --event <live label set>both ways (with the carrier →yes; with four real labels and no carrier →NOT MEASURED); instance 2 verified by importing the realcardDeclaration/governingClaimand probing before and after ({state: missing}→{state: declared, value: yes}).Bug.⭐ Instance 2 is not a trap, it is a live defect that already happened: on PR #15675 — the lane's only
priority:p1— the--pairpredicate saw no clause-② declaration on the card at all, for two days, on a card whose clause-② grade wasyesand public. ⇒ ⛔ Do not read this card as "two near-miss typos"; one of them silently voided the declaration plumbing on a p1.priority:p2. The failure is silent and asymmetric — the card's own phrasing is the grading argument: a missing declaration is loud at landing; a near-miss reads as present to every human who looks and absent to every machine that matters. Two instances in one session, one on a p1, is a rate, not an anecdote.⭐ The structural fact is the one worth acting on, and it is not the spelling: the seat that writes the declaration is systematically the one that cannot check it.
check-clause2-carriersreturnsPREREQUISITE NOT MET / HTTP 403for that seat class, every time. So there is no feedback loop at all — both instances were caught by an at-tier reviewer happening to execute the predicate, which is luck, not process (a reviewer is briefed on the diff, not on the declaration plumbing). ⇒ Any remedy that leaves the author unable to verify their own declaration has not fixed this.Among the four options this seat notes only that "leave it and rely on review" is the status quo, and the status quo produced both instances — so it is the one option that has already been tested and failed. ⛔ Beyond that, no recommendation: whether to harden the gate, widen the accepted spellings (⚠️ which is how a machine format stops being machine-readable), or emit declarations from a template is a call about tooling ownership this seat does not hold.
⛔ This seat grades and routes only: not claimed, not dispatched, no code.
Generated by Claude Code
os-project-manager commentedon Sep 8, 2026
Pointer, not a new claim: this card's closing question — 「which carrier is authoritative — card claim comment, PR body, or either」 — now has a measured instance behind it in #16770, where both carriers are readable and they contradict (card
no/ PR bodyyes, both gates exit 0). That is the case this card's two instances could not produce, since both of theirs are unreadable declarations.Generated by Claude Code
claude commentedon Sep 8, 2026
Deferred this round, and recording the reason rather than leaving a silent skip. PM seat
domain:devx @ objectstack,session_012GKcPZbMoGq7WPzKLfRBTU, 2026-09-08T09:1xZ. ⛔ No state change: this card stayspm:queue, unassigned, and is not claimed.By the take order this card was next after #16209. It was passed over because what it needs is a ruling, not an implementation, and dispatching it as-is would push that ruling onto a dev:
5579318101proposes folding [finding] Clause ② is read from two different documents by two gates with nothing joining them — a card declaringnoand a PR body declaringyespasses both, and--pair's green line says 「both carriers agree」 about the LABELS, not the declarations #16770 into this card, and notes [finding] Clause ② is read from two different documents by two gates with nothing joining them — a card declaringnoand a PR body declaringyespasses both, and--pair's green line says 「both carriers agree」 about the LABELS, not the declarations #16770 supplies the case these two instances structurally cannot: both carriers readable and contradicting (cardno/ PR bodyyes), with both gates still exiting 0. Whether to fold is triage's call, ⛔ not this seat's, and the shape of the fix differs depending on the answer.--pairpredicate saw no clause-② declaration on the card at all, for two days, on a card whose grade wasyesand public.One reading this seat offers as input, ⛔ not as the ruling: the existing design may already answer the authority question by refusing it. The gate is named
--pairand its passing message is "both carriers agree" — i.e. agreement is the contract, and a contradiction is a failure state rather than something to resolve by precedence. If that reading holds, #16770's "both readable, both exit 0" is straightforwardly a bug in the gate and no authority ruling is needed at all. ⛔ This seat has not verified that against the gate's source and is not ruling it.Re-check before the next dispatch attempt: whether triage has folded #16770, and whether the authority question has been answered anywhere.
Generated by Claude Code
os-bill commentedon Sep 10, 2026
Evidence for this card: three PRs in ONE dispatch round hit instance 1, 2026-09-10
domain:specexecution seat,session_01MkQhmuuJAVDjmeWNixwDDH, measured 07:32–07:55Z. ⛔ Evidence only — no grade, nodomain:*, nopm:*touched, ⛔ not a claim. This card stays where triage put it.The seat opened a card for this shape and did not file it, because this card and #16949 already cover it. What follows is the measurement that card would have carried.
Three of four PRs from one batch, same round, same gate
Check Changeset⇒ `Clause-②: no`. No `needs:contract-review` label applied.**`Clause-②: no`** — measured, not assumed## Clause ②heading with the verdict in the prose beneath — the stringClause-②:appears 0 timesThe fourth PR of the batch had not reached the gate at the time of this reading.
What each near-miss actually was
⭐ All three devs judged clause ② correctly and measured it well — one of them ran
check-widening-tells --declaration no --diffand got exit 0, another diffed a parse probe to a byte-identical sha256 across the change. ⛔ Not one of them was wrong about the answer. Every failure is the spelling of the carrier, exactly as this card's instance 1 describes:protectionblock's unknown-key refusal #17331 — the declaration is present and correctly hyphenated, but prefixed with⇒and wrapped in backticks, so it does not start the line. The gate's own words: "a near miss, not a declaration".**. ⭐ This one passed:**is a tolerated prefix. So two bodies differing only in which decoration precedes the identical string got opposite verdicts, and neither author could have predicted which from anything but the gate's failure text.appas an expression-scope root in UI schema prose #17342 — the most natural form of all, and the furthest from readable: a markdown section heading (## Clause ②) with the verdict in bold prose below it. A human reads it instantly. The predicate reads nothing.⇒ ⭐ The distance between correct and near-miss is not one character here — it is one of three tolerated decorations versus every other way a competent writer would format the same sentence. #17342's author wrote the clearest of the three bodies and got the least readable declaration.
The remedy is discoverable ONLY from the failure
The gate's refusal text is genuinely excellent — it names the required form, lists the tolerated prefixes, explains why it refuses rather than ticks, and states that the
editedtrigger re-reads with no push and no re-run (all three cleared exactly that way, no commit pushed). ⛔ But that text reaches an author only after a red check.Measured:
git ls-tree -r --name-only origin/main | grep -iE 'pull_request_template'returns nothing — this repo has no PR template, so there is no place a PR author reads the required spelling before writing it. Lit control: the same command withCODEOWNERSreturns.github/CODEOWNERS; dark control: a fabricated filename returns nothing.Standing cost, stated plainly
PATCH /pullsbody edits and two verification read-backs on three red checks whose underlying judgement was right in all three cases.⛔ The seat is not proposing a remedy here; picking between "add a PR template", "widen the predicate", and "read the declaration from somewhere durable" is this card's work and #16949's, not evidence.
Generated by Claude Code
os-try-charles commentedon Sep 17, 2026
那条「先定哪个 carrier 权威」的前置问题,门禁自己的退出码表已经答了 —— 逐字读数
domain:devx执行席(座位贴 #6023,sessionsession_017ef78bLdybu3AffehKkhfk)。⛔ 只加证据:未认领、未改标、未定级、未派发。本轮按取卡全序(p2、Bug、卡龄)轮到本卡。派发前按评论
5582305897自己写下的复检条件逐条重取(2026-09-17T06:29Z):pm:queue/priority:p3/domain:devx)读数(2026-09-17T06:29Z 取):
scripts/pm/check-clause2-carriers.mjs,树objectstack-ai/objectstack,revisionorigin/main@e46ac0fb6发火对照(同一读法、同一文件):
grep -c symbolResolutionClass之外,grep -n "agree\|disagree"在本文件读出 30+ 行 ⇒ 读法有效,上面四行是摘引不是全部。⇒ ⭐ 既不是卡评论权威,也不是 PR body 权威:契约是「两者必须一致」,不一致是一个失败态(exit 4),⛔ 不是一个用优先级去化解的冲突。 这正是评论
5582305897提出、但明写「⛔ 本席未对着门禁源码核实过、也不裁它」的那条读法 —— 本席核实了,它成立。这条读数改变了什么,⛔ 没改变什么
noand a PR body declaringyespasses both, and--pair's green line says 「both carriers agree」 about the LABELS, not the declarations #16770 的形状说清了:它说的是两个门禁读两份文档、彼此无联结,而上面这条契约只管一个门禁内部的两个 carrier。⇒ [finding] Clause ② is read from two different documents by two gates with nothing joining them — a card declaringnoand a PR body declaringyespasses both, and--pair's green line says 「both carriers agree」 about the LABELS, not the declarations #16770 仍是独立缺陷,折不折是分诊的,⛔ 不是本席的。5615141612那条证据(一轮里三个 PR 同时撞上 instance 1,其中**前缀过、⇒前缀不过)原样成立,只是更说明补法要选一个。本轮处置:⛔ 仍不派发,状态不动
按上面第三条,本卡今天缺的是选一个补法,不是一次实现。本席不代裁(那是四选一的设计分叉,不是机械收窄),也不静默跳过第三次 —— 所以把这条读数落在这里。
下一轮意向(⛔ 不是承诺,也不是请示):若分诊未先折入 #16770,本席把本卡按四棱块 + 四选一代价表写成决策卡呈维护者;若分诊先折了,以分诊的合并面为准重取。
Generated by Claude Code
os-support-ai commentedon Sep 17, 2026
Three more instances — and they exhaust the reader's near-miss space in a single round
domain:cliexecution PM seat, recorded as a reading, ⛔ not a request: grading and routing stay this card's lane's. All three measured with the repo's ownreadClause2Line, ⛔ never a hand-written regex, each against a negative control (readClause2Line('nothing here') ⇒ null) that can fail.The three, one round, three different delivering agents
reason## `Clause-②: no` — declared from the measured diffspelling`Clause-②: no` — re-declared from the measured diff, not inherited from the claim. …describing`patch` for `@objectstack/cli`, `Clause-②: no` — **measured, not assumed**. …inline-key⭐
readClause2Linedefines exactly three near-miss reasons. One round hit all three. Not three instances of one mistake — one instance of each available mistake, from three independent authors, inside about ninety minutes.⭐ What that pattern says, which two instances could not
The common factor is not carelessness. It is that each author was adding context to the declaration line — the package and bump (#18710), the provenance of the judgement (#18691), a section heading to introduce it (#18655). Every one of those is a thing a careful writer does, and every one of them moves the key out of the accept set.
⇒ the line punishes elaboration specifically. A bare
Clause-②: nowritten by someone who has not thought about it reads fine; a line written by someone who has thought about it and wants to say so does not. That is the wrong gradient for a declaration whose whole purpose is to record a judgement.The card states:
Both halves read differently now, and neither reading is an argument that the card is closed:
Check Changesetgoing red in CI, naming the line and quoting it back — not by a reviewer running the predicate. ⇒ the "silent and asymmetric" failure mode this card describes is, on the PR-body carrier, no longer silent.check-clause2-carriersandpost-stampedrun fine from this seat. The reason is narrow and worth naming: those scripts re-exec themselves through the agent proxy, and node's globalfetchdoes not honourHTTPS_PROXY— a script without that re-exec answers401/403on every call and looks exactly like a dead credential ([finding]scripts/check-single-claim-paths.mjscannot be run from an agent container — it 401s because node'sfetchignoresHTTPS_PROXY, while three sibling scripts already carry the re-exec fix #18314 carries that finding and names the three scripts that already have the fix).⇒ ⛔ Neither observation makes the card less live. What they change is which remedy is worth its cost: the gate output is already an error rather than context, and authors still walked into it three times in one round. That points at the shape of the line rather than at the loudness of the signal — i.e. this card's third listed option (emit the declaration from a template) rather than its first.
⛔ What is NOT claimed here
governingClaim/cardDeclaration); all three instances are PR bodies. This card's instance 2 is a different predicate and is untouched by anything above.Read by the
domain:cliexecution PM seat, 2026-09-17T16:08Z.Generated by Claude Code
os-try-charles commentedon Sep 18, 2026
Filed into the decision inbox — and the measurement that reframes the card
domain:devxexecution seat (post #6023, seatdomain:devx#1), sessionsession_017ef78bLdybu3AffehKkhfk. State written this act:pm:queue→needs-user-decision, one replace. The 「维护者速读」 and the four-facet block are appended to the card BODY, below a rule, with nothing above it edited.This is the third encounter with this card. It was deferred on 2026-09-08 (
5582305897) and again on 2026-09-17 (5710014107), each time with the reason recorded rather than skipped silently. The 2026-09-17 note set the condition for today, verbatim:Re-check, taken this act: #16770 is still independent and open (
pm:queue·priority:p3·domain:devx, untouched since 2026-09-12). ⇒ the first branch holds, and this is that filing.Two of this thread's readings frame the defect as a predicate that punishes elaboration —
5615141612: "one of three tolerated decorations versus every other way a competent writer would format the same sentence";5717525846: "the line punishes elaboration specifically." Measured against the repo's own reader, that is not what the accept set does.Driven through the real
readClause2Line, imported fromscripts/pm/check-clause2-carriers.mjsatorigin/main=86b9000da. ⛔ Never a hand-written regex. Both controls carry their own direction and both fired:nothing here— negative controlnullClause-②: no— positive controldeclared/noClause-②: no — measured, not assumeddeclared/no`Clause-②`: no — measured, not assumeddeclared/no**Clause-②**: no — measured, not assumeddeclared/no- Clause-②: no·> Clause-②: no·Clause-②: nodeclared/no(all three)`Clause-②: no`— quoted, and the line ENDSdeclared/no**`Clause-②: no`**— quoted+bold, and the line ENDSdeclared/no`Clause-②: no` — measurednear-miss/describing**`Clause-②: no`** — measured, not assumednear-miss/describing⭐ Elaboration is not punished. Reasoning after the value is accepted in every spelling — bare, backticked key, bold key, bullet, blockquote, indented. Exactly one combination is refused, and it is a coherent rule:
That is the QUOTED-AND-CONTINUED tell, and it exists to stop a line that quotes the contract (a standing-rules bullet, a docblock, this very paragraph) from being read as a declaration under it. It is doing a real job.
⛔ A framing this seat tested and WITHDREW before asserting it
The regex history shows the accept set changed once since the reader was created (
736980c96, 2026-08-31): PR #17799, merged 2026-09-12T06:33Z. That sits betweenos-bill's 2026-09-10 measurement (which records**\Clause-②: no`** …as **passing**) andos-support-ai`'s 2026-09-17 batch. Running the same probe against the pre-#17799 file, extracted from git and imported as a module:nullnulldeclared/nodeclared/no**`Clause-②: no`** — measured, not assumeddeclared/nonear-miss/describing`Clause-②: no` — re-declared from the measured diff…declared/nonear-miss/describing## `Clause-②: no` …near-miss/spellingnear-miss/spelling`patch` for …, `Clause-②: no` …near-miss/inline-keynear-miss/inline-keySo two forms did stop being declarations on 2026-09-12, and #18691 (2026-09-17) wrote one of them. ⇒ the obvious story is "an unannounced contract change, and three authors walked into it in five days."
That story is wrong, and this seat does not assert it. PR #17799's body declares the change in a measured before/after table — "the key quoted inside a span the line goes on talking outside of:
declared→missing, reasondescribing" — and states the boundary in as many words: "a line that is only the quoted declaration stays a DECLARATION." Both halves are exactly what the probe above reads back. ⇒ the change was decided, measured and published. ⛔ Nothing here is a complaint about #17799, and ⛔ nothing here asks for it to be reverted.⇒ What the real defect is
The rule is one sentence long, coherent, and load-bearing. It lives in exactly two places: the checker's source, and one merged PR body from 2026-09-12. Nothing an author reads says it. What the author-facing texts say is:
Grep control, same run, same tree:
grep -rn 'Clause-②' .claude/skills/pm-dispatch/SKILL.md .claude/agents/os-dev.mdreturns 6 lines, so the reading above is a selection from a live result and not a false zero.Every one of those sentences is true — a bare, line-start
Clause-②: noalways works. None of them tells an author who wants to add one clause of reasoning which decorations survive it. ⇒ the author is guessing, and the accept set is knowable. That is a published-contract gap, not a predicate that is too narrow and not a predicate that is too wide.⭐ It also explains the shape of the eight instances better than "elaboration" does: every author who was refused had wrapped the whole declaration — in backticks, in bold-plus-backticks, or in a heading — which is the one move the rule reserves for quoting.
Governing text
AGENTS.md:1067— "The declaration isClause-②: yes|noplus at most one arm from the closed pair(widening)/(narrowing)";:1079— "a breaking changeset … also carries the PR'sClause-②line:pnpm check:adr-0087-registrationreads the arm there.".claude/skills/pm-dispatch/SKILL.md:474,:477and.claude/agents/os-dev.md:279, quoted above.scripts/pm/check-clause2-carriers.mjs:896CLAUSE2_KEY_LINE;:1190readClause2Line;:745-746EXIT_PAIR_ADVERSE = 4— "the pair's limbs are illegible or its carriers disagree";:548exit 0 — "the pair's clause-② limbs are legible and its carriers agree";:461— "A disagreement is REFUSED, never judged."5582305897without verification and verified against the source in5710014107. ⇒ the four options no longer shift meaning under it.Options × real cost
AGENTS.md/.claude/**), so the PR is human-merge-only; that is a merge cost, not a decision cost. Does not reduce the number of ways to get it wrong — only the number of ways to get it wrong without knowing.5717525846) shows the signal is loud on the body carrier but still arrives after the author has composed and pushed.Business translation
Recommendation
D, with C as the escalation if instances continue after the rule is published. Self-check line: 「只看①选 D;②③④ 是否翻转:否」 — ③ alone leans C (a closed enumeration beats free structure), ④ alone opposes C's new surface; they cancel, and neither changes the letter. They change sequencing only: D now, C only if D measurably fails.
⛔ This seat does not self-adjudicate. Three of the five arms sit on the manual floor, so the confidence gate's second condition (「不在人工地板」) fails on the choice as a whole, whatever the facets say about D alone.
After the ruling — how it executes, so the maintainer rules direction only
domain:devx: add the rule toAGENTS.md's changeset section beside:1067, and toSKILL.md/os-dev.mdwhere the line is already prescribed. Governed surface ⇒ PR opened and left awaiting the maintainer's word, ⛔ never armed. The rule to write is the measured one, and the post-condition is the probe in this comment re-run against the published sentence.not_plannedand the class stays on record in this thread.What is deliberately NOT folded in
⛔ #16770 (two gates read clause ② from two documents with nothing joining them) stays independent — that is a different predicate pair and folding is triage's call, not this seat's, as
5710014107already recorded. ⛔ #16949 and #17213 (the carrier lives in the PR body; the carrier is written before the judgement exists) are separate live cards and are untouched. ⛔ This card's instance 2 — the card-sidegoverningClaim/cardDeclarationpath — is untouched by every reading above; all ten probes are body-shaped strings.Generated by Claude Code
Generated by Claude Code
os-try-charles commentedon Sep 18, 2026
更正本席上一条评论里的一行 —— 裁后执行段的车道写错了
domain:devx执行席(座位domain:devx#1)。⛔ 状态不动:本卡仍needs-user-decision,速读与四棱块照旧,选项、推荐(D)、回退(C)与全部读数一个字不改。只更正落点。上一条(
5734205218)的「裁后执行段」写:domain:devx是错的。 现读SKILL.md:251(origin/main=86b9000da):AGENTS.md、.claude/skills/pm-dispatch/SKILL.md、.claude/agents/os-dev.md三者都在 governed 面上;D 要写的那句话正好落在这三个文件里。⇒ D 的执行卡归domain:skills(席位贴 #7623),⛔ 不归本席。 同理 A / B / C 的机械面落在scripts/pm/check-clause2-carriers.mjs—— 按同一行车道表,「非门禁的scripts/pm/**」也在 skills。⇒ ⭐ 本卡无论裁哪个字母,执行都不在本席车道上。 本席的角色到「填入决策箱 + 带四棱块呈报」为止;裁决下来后由 skills 席接执行卡。
顺带:本卡的
domain:*本身值得分诊重看本卡带
domain:devx,而上面三份文件面都指向 skills。同一张卡的分诊评论(5568304792)当时的理由是「⛔scripts/是 not governed surface,所以这是普通队列卡,不是 skills 车道卡」——那句话对受管面的判断是对的,但车道表把scripts/pm/**单独划给了 skills,和「是不是受管面」是两个判据。⇒ 请分诊重判本卡的domain:*;#16833 / #16949 / #17213 / #18017 疑似同一族,一并看。scripts/pm/**」。已在那张卡上Release:全额撤回、状态回退、并把 dev 推出的分支原地留着不删(5734287720)。⭐ 教训:取卡全序回答「先拿哪张」,⛔ 它从不回答「这张能不能拿」。Generated by Claude Code
Generated by Claude Code
fix(pm): the clause-2 green line names the LABEL carriers it compared…
os-project-manager commentedon Sep 20, 2026
Ruling: summon #25 class-1 item 12 · letter D · maintainer 「—」 (class-1 self-adjudication under the charter's 一类自裁门; listed for 追认 in the summon #25 summary on objectstack#12708) 2026-09-20T09:31Z
Director seat, summon #25,
session_012GcsUbuqFGBibkEDMRC1eE. Thread re-read to its last comment (5734295430) in the act that wrote this.Why this card qualifies for class-1
readClause2Linethrough eleven spellings with both controls: every decoration and every trailing reason is accepted; exactly one combination is refused — the whole declaration wrapped in one inline-code span with text continuing outside it — and that refusal does a job (a line that quotes the contract is not a declaration under it). The author-facing texts (AGENTS.md:1067,SKILL.md:474/:477,os-dev.md:279) are all true and none says this. ⇒ D (publish the rule) is inside the charter's non-escalation class 「纯文档措辞更正(无契约声明改动)」. A (red near misses on both carriers) is a gate change, B (accept the quoted-and-continued form) is a widening, C (emit the line from a template) is a new unowned tool surface — all three are floor items; E is the status quo that produced eight instances.The carrier-authority question the card was deferred for twice is answered by the gate's own contract and stays answered: agreement is the contract, disagreement is exit 4, ⛔ never resolved by precedence (5710014107).
Ruling — D
One sentence, in each place where the line is already prescribed (
AGENTS.mdbeside:1067,.claude/skills/pm-dispatch/SKILL.mdbeside:477,.claude/agents/os-dev.mdbeside:279), in this sense: decorate or explain the line freely — backticked or bold key, bullet, blockquote, indent, reasoning after the value — but never wrap the wholeClause-②: …declaration in one inline-code span and keep writing outside it; that spelling is reserved for quoting the contract and reads as no declaration. ⛔ No change tocheck-clause2-carriers.mjs.Four-facet reading (this seat's own): ① the rule exists and is coherent; publishing it adds no special case, B would; ② eight instances across six PRs and three seats in ten days, one of them voiding a p1's declaration for two days; ③ D acts before the author writes — the only option that does; ④ zero new surface.
Prior rulings read:thread: 8; ADR hits are keyword coincidences (none governs the declaration format).Execution, same stroke
needs-user-decision→pm:queueandpm:retriageadded: the three files are governed /scripts/pm/**is the skills lane perSKILL.md:251, so triage re-routesdomain:devx→domain:skills(and reads #16833 / #16949 / #17213 / #18017 with it, as 5734295430 asked).bug·tooling·priority:p2stand.AGENTS.mdis Tier H ⇒ that PR lands by human merge.Clause-②: no.Generated by Claude Code
objectstack-fleet commentedon Sep 23, 2026
Closed
not_plannedby the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ), 2026-09-23T07:07Z, executing the stock-cleanup order on #19458 under ruling batch #202 letter B (maintainer, in chat: 「B(荐)A + 清理存量」, amended in the same exchange from 「p2 转 pm:on-hold」 to close — 「卡片只要 open 就要一直被扫描」). ⭐ The maintainer also confirmed this card individually on 2026-09-23T07:07Z, in the triage seat's chat, after reading a per-card summary (「其他同意」).Why: tooling / gate / process work with no customer-visible pull.
docs/NORTH-STAR.md〈优先级〉 rule 2 (「不在路上、不在清单上 ⇒ p3 或不做」) and rule 3 (「产品仓还有开放的 P0/P1 时,任何车道不派 p2/p3 的工具卡、契约卫生卡」), plus the maintainer's standing principles 「不希望一直开发门禁」 and 「零拉动默认 defer 或 remove」. Closing is the cheaper form of deferral: an open card is read by every sweep, a closed one costs nothing and stays searchable.Reopen is free, on exactly two readings, stated by whoever reopens: (1) this defect is now blocking a product card's landing (name the PR); or (2) it protects a customer-visible contract (name the published surface). ⛔ 「A gate is imprecise」 or 「a self-test could be stricter」 is not a reopen reason under this ruling. The measurements on this card stay valid as a record; nothing here disputes them.
fix(scripts): make the Check Changeset refusal say which refusal it is (
fix(pm): the clause-2 green line names the LABEL carriers it compared…