Skip to content

docs(pm-dispatch): the filing door — a card is created only for four classes, paced writes through claude[bot]; and the grading contract's measured gaps (#19570) - #19575

Merged
os-zhuang merged 5 commits into
mainfrom
claude/issue-19570-filing-door
Sep 21, 2026
Merged

os-zhuang merged 5 commits into
mainfrom
claude/issue-19570-filing-door

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #19570

Clause-②: no

Tier H (.claude/** plus scripts/pm/) — the maintainer merges by hand. Draft; no ready, no auto-merge, no labels, no assignee written by this run.

Provenance — the maintainer's own sentences, verbatim and untranslated

19546 帮我派发处理

刚才 os-sam 又被封号了,也是因为分诊批量处理issue的时候,所以现在 issue 太多对于车队是负担。 19546 我希望在创建issue 的环节就卡死,没必要的issue就不要创建。

19546 卡片好像也丢了,要重新写。你创建一个新的吧,而且注意不要和之前的一模一样

之前封号的时候讨论过 issue 和 pr 应该使用 claude app 创建,名称应该是 claude(bot)

The second sentence is quoted at the head of the new charter section itself (references/filing-gate.md:10), the fourth beside it (:12), so the door carries its own authority where it is read.

Part A — the filing door, rule by rule, with the line that carries it

card rule carried at
1 · four classes or no card; the body's first line names the letter references/filing-gate.md:14 (headline), :15:18 (a/b/c/d), SKILL.md:351:352 (the door and its pointer, inside 〈分诊座位职责〉)
2 · named non-cards references/filing-gate.md:19:24 — instrument misfire (pointing at references/instrument-discipline.md, which #19513 landed this morning), seat mistakes and lessons, a finding outside the three classes, a lost-card rebuild, anything a comment can carry, a sweep-derived pin/bump reminder
3 · three answers before POST references/filing-gate.md:25:28; mirrored in references/core-rules.md:80
4 · quota (three per fire; groups of ten for stock cleanup) references/filing-gate.md:29:30
5 · paced writes references/filing-gate.md:31:33; the invariant every seat reads is SKILL.md:99
6 · writes go through the App identity claude[bot] references/filing-gate.md:34:36; SKILL.md:99 carries the prohibition beside the pacing numbers
the sweep reconciliation (first-touch closes only clear what predates the door) SKILL.md:391

Rule 6's consequence is stated where it bites: a user-class write is bound to its author and 404s with the account (references/platform-readings.md:135 is the standing reading, and :130:134 record that the class is set by the Claude account's GitHub connection rather than by the session and can flip mid-session). So each seat reads back user.type on its first write of a fire, records a User reading on the seat post and files nothing new that fire. The claim carrier stays the assignee and attribution stays the session ID in the text — nothing else in the protocol moves.

Part B — the grading contract's measured gaps, with the line that carries each

card item carried at
false green counts one human catch as one measured cost references/filing-gate.md:43
「仪器为车队服务」 has four answers, never two; a false red's standard cost is a seat complying references/filing-gate.md:44:45
chain inheritance is an upper bound, the failure shape decides the grade inside it references/filing-gate.md:46
the three-state checklist test, state (2) inheriting the item's priority references/filing-gate.md:40:42; SKILL.md:373 names the three states in the principal text
North Star item 4: shipped faces only; a wrong sentence, not a missing one references/filing-gate.md:47:48
the decision box re-reads the premise in the same act SKILL.md:365
pm:retriage judged by content, not shape SKILL.md:400
a zero carries a control, and the control proves reach, not that the probe is right already on main at SKILL.md:168 and references/core-rules.md:45 — nothing added, this PR only extends it
exact-name matching, not prefix; hit counts lie too references/filing-gate.md:60
the reach radius, two arms, and the two corollaries references/filing-gate.md:52:56
a git-ignored directory is a convention; the three-part zero references/filing-gate.md:57:59
one board enumeration per fire, statistics offline, patrol daily references/filing-gate.md:61

SKILL.md:170 is the pointer that puts all of the reading criteria in the reader's path, immediately under the 零命中须配同主体必中词 line the card names.

Why the reading criteria are in a new reference file rather than platform-readings.md

The card asks for them in references/platform-readings.md. Measured against that file as it stands, they cannot land there without either a ceiling raise or a deleted rule, both of which the card forbids:

  • platform-readings.md is 469 lines at ceiling 469 (headroom 0), and zero of its adjacent bullet pairs merge under the 120-byte cap (the smallest pair is 135 bytes).
  • dispatch-runbook.md is the same shape: 241/241, zero mergeable pairs, smallest 122 bytes.

So the charter text lands in a new references/filing-gate.md, following the pattern references/instrument-discipline.md set on main this morning (PR #19513, merged as 3e8e2b0d), and SKILL.md carries the pointers. One difference from that precedent, deliberately: this PR adds the new file to the ratchet map (CEILINGS and the table-row pin), at its landed count with headroom 0, because the map is an enumeration and a file merely absent from it is silently unratcheted.

Ratchet — per-file counts, every added line paid in place

file before after ceiling how it was paid
.claude/skills/pm-dispatch/SKILL.md 815 819 819 headroom 4 spent, plus three lines paid back: the three Acceptance-notes lines compress to one (their content is the door's rule 3), the two-level-inventory cadence lines merge into one, and the paced-writes invariant absorbs the identity prohibition without a new line
.claude/skills/pm-dispatch/references/core-rules.md 151 151 151 net zero, two in-place amendments only (:80 the three answers, :84 the door)
.claude/skills/pm-dispatch/references/filing-gate.md 61 61 new file, pinned at its landed count
.claude/agents/os-dev.md, AGENTS.md, every other map entry unchanged unchanged unchanged not touched

No ceiling was raised. No rule was deleted to pay: every limb removed from SKILL.md is present in the new file (git diff origin/main -- .claude/skills/pm-dispatch/SKILL.md removes seven lines, and each one's content is at a line named above).

Gates

Derived on the final tree with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 34a97c4 — 40 commands, identical to the list derived before the last two commits. All 40 were run with the exit code captured before any pipe; all exit 0.

Named families:

check:pm-skill-ratchet        exit 0   SKILL.md 819/819 · core-rules.md 151/151 · filing-gate.md 61/61 (+ self-test, 157 cases)
check:pm-widening-tells       exit 0   self-test, 525 cases (report-only family)
check:pm-label-desc-cap       exit 0   39 label descriptions, all at or under 100 characters
check:pm-skill-id-lint        exit 0   30 file(s) clean — no issue-number citation in the new charter text
check:skill-frame-sync        exit 0   77 markdown files scanned; the one declared copy of the decision frame is coherent
check:nul-bytes               exit 0   9134 text files, no raw control bytes
check:pm-governed-prose       exit 0
check:pm-governed-merges      exit 0
check:pm-dispatch-gates       exit 0
check:ratchet-remedy-authority exit 0  265 scripts swept
check:self-test-wired         exit 0   (the self-test-wired family, both arms)

Nine of the forty first returned exit 3, PREREQUISITE NOT MET, in a fresh worktree with no node_modules; they were re-run after pnpm install and, for check:doc-formula-expressions, after building @objectstack/formula and @objectstack/lint under the shared verify lock. Exit 3 is not a finding and was not read as one.

Acceptance greps

$ git grep -n '三态\|会 fail' .claude
.claude/skills/pm-dispatch/SKILL.md:373:- 清单项三态定级(会 fail / 步骤够不到 / 无项断言)与定级判据见 `references/filing-gate.md`。
.claude/skills/pm-dispatch/references/dispatch-runbook.md:149:…(pre-existing)
.claude/skills/pm-dispatch/references/platform-readings.md:371:…(pre-existing)

$ git grep -n '半径' .claude
.claude/skills/pm-dispatch/SKILL.md:168, :169                  (pre-existing, the line this PR extends)
.claude/skills/pm-dispatch/references/core-rules.md:45          (pre-existing twin)
.claude/skills/pm-dispatch/references/filing-gate.md:46, :48, :49, :50, :52   (the two arms and the corollaries)
.claude/agents/os-dev.md:240, .claude/skills/pm-dispatch/references/platform-readings.md:280, .claude/skills/spec-property-retirement/SKILL.md:278, :281, :301  (pre-existing, unrelated)

The three states are at references/filing-gate.md:40:42, which SKILL.md:373 names.

Collision with PR #19513

It merged while this branch was in flight (3e8e2b0d, then origin/main moved on to b3615f1a4c). origin/main is merged into this branch rather than proved clean against it. The one conflict was in the triage seat's filing rules and is resolved in favour of both: #19513's report-only-instrument line is kept verbatim and this branch's compressed Acceptance-notes question sits beside it. The door's instrument clause points at references/instrument-discipline.md instead of restating the no-dev half #19513 landed.

Not in this PR — pending the maintainer's word

Each needs the maintainer's own sentence on its own card (ruling #208 R6 — a new gate is not a maintenance edit):

  • a mechanical throttle inside scripts/pm/post-stamped.mjs and scripts/pm/label-write.mjs — this PR states the pacing numbers as charter only;
  • a refusal in scripts/pm/label-write.mjs when domain:* or priority:* is written with no pm-state label in the same write;
  • a filed.log receipt for newly filed cards;
  • the backup status written into the board snapshot itself.

Changeset

skip-changeset applies: nothing under packages/** is touched. The four paths are .claude/skills/pm-dispatch/** and scripts/pm/check-skill-line-ratchet.mjs, all on the fast track (internal protocol and PM tooling, not shipped by any package's files[]).

维护者速读(草稿)

改了什么:给「立什么卡」装了一道门。今天起,一张 issue 只为四类事存在:有落点或能复现的产品缺陷、只有你能做的决定、你直派的任务、跨仓跨层必须的协调父单。其余一律不立卡 —— 仪器误报、席位自己的失误、三类外的 finding、丢卡重建、一条评论能承载的知会、sweep 每次都能重新推出来的提醒。立卡前必须在正文答三件:类别字母、谁会动手、查重跑了什么命中几条;缺一件分诊首触就关。配额:一席一轮最多三张。写节奏进章程:每笔间隔 3 秒、每账号每小时 40 笔封顶,429 就停写。写入身份恒走 App 的 claude[bot],不走席位用户令牌。第二半是定级契约的十处实测缺口(假绿、四种答案、沿链继承是上界、清单三态、北极星第 4 条的两个限定、可达半径、零的三件判据等)。

为什么改:24 小时内两仓新立 183 张卡,其中 64 张当天就关、41 张是 finding;今天有两个席位账号因批量 issue 操作被封,它们立的卡跟着账号一起消失(本卡自己就是第二次重建)。成本已经不在开发队列,而在板面本身:每张开着的卡每轮都被每个席位扫一遍,每次写都是账号信誉的一笔支出。

风险与代价(含回滚):门收紧后,真缺陷有被判成「不是卡」的可能 —— 对冲是类别 (a) 的定义没有变,仍是原来的 pm:queue 判据。识别口径变严会让分诊首触关掉一些格式不全的卡,这些卡重开免费。回滚是一次 git revert:本 PR 只改三份协议文本和一份门禁脚本的两行台账,不动任何运行时代码,回滚零迁移。

席位意见:(留空,待席位复审填写)

你要做的:读一遍 references/filing-gate.md 的〈立卡门〉十六条,确认四类和两个数字(每轮三张、每小时四十笔、每笔三秒)是你要的口径;然后人工合并本 PR。另有四件被本 PR 明确挡在门外、等你一句话:label-write 的两道闸、filed.log、备份状态写进备份。


Generated by Claude Code

…sured misses

A card is created only for four classes; everything else is refused at the
door instead of being filed and closed. Paced REST writes become charter,
not advice. The grading contract gains the false-green clause, the four
acceptable answers, chain inheritance as an upper bound, the three-state
checklist test, North Star item 4's two qualifiers, and the reading
criteria (reach radius, three-part zero, git-ignored directories,
exact-name matching, one board enumeration per fire).

Every added line is paid in place: SKILL.md lands at its ceiling (819/819),
core-rules.md is net zero (151/151), and the new references file is added to
the ratchet map at its landed count with a table-row pin.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>
Resolves the SKILL.md conflict in the triage-seat filing rules: #19513's
report-only-instrument line is kept verbatim, and this branch's compressed
Acceptance-notes reader question sits beside it. The filing gate's
instrument clause now points at `references/instrument-discipline.md`
instead of restating the no-dev half #19513 landed.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>
…h claude[bot]

Door rule 6: issues, PRs and comments are written through the GitHub App
installation identity, never a seat's user token — a user-class write is
bound to its author and 404s with the account. Every seat reads back
`user.type` on its first write of a fire and files nothing new that fire
when it reads `User`. The claim carrier stays the assignee and attribution
stays the session ID in the text.

SKILL.md pays it in place: the paced-writes invariant now carries the
identity prohibition in the same line.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>
…elided

The three-state checklist test and the shapes that answer 「no reader」
(`.changeset/*`, an unowned doc page, a generated file, a swept batch)
moved out of SKILL.md behind pointers but had not landed in the reference
file. Both are back, and the new file's ceiling is re-pinned at its landed
count.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 34a97c480a5741169728b67d5911a1b67b7f5c75

Written 2026-09-21T10:00Z — the at-tier, adversarial contract review for card #19570 on PR #19575, in the R5 shape: the diff and the card were read, check conclusions are taken from the head's check-runs, and the only local run was node scripts/pm/check-skill-line-ratchet.mjs (plus git grep, git merge-tree, awk). Tier H (.claude/**): the maintainer merges by hand. This is the review of record, ⛔ not a landing record.

① Derived judgments

1. Scope — RIGHT. git diff origin/main...34a97c48 --name-status = M SKILL.md, M references/core-rules.md, A references/filing-gate.md, M scripts/pm/check-skill-line-ratchet.mjs; four files, +80/−9. The ratchet hunk adds exactly two rows for the new file (CEILINGS at 61, MAX_TABLE_ROW_BYTES at 0) and nothing else; no other entry's ceiling moved (the script's own summary line declared cross-file moves: 1, total ceilings down 9 lines is unchanged from main). Adding that row is the ratchet's own contract, not a new instrument: its header defines the covered surface as an ENUMERATION of 「the pm-dispatch surface (SKILL.md, its references/, the per-lane job descriptions)」 and says to read a file's absence 「as a fact to check, not an oversight to infer」, so a new references/ file without a row is the header's own named gap — and the card requires the ratchet paid on its text. (Noted, not a finding: references/instrument-discipline.md from #19513 sits on main with no row.) The merge commit cf5f2245 has parents c7cca670 (branch) and b3615f1a (origin/main, after #19513 at 3e8e2b0d); its diff against the main-side parent touches only the four PR files. git merge-tree b3615f1a c7cca670 reproduces one conflict, in SKILL.md at the Acceptance-notes lines — main's 「只报告的仪器,报错不配 dev:猜意图的只印读数,误报席位一句推翻,⛔ 不立卡不派 dev。」 against the branch's compressed 「Acceptance notes 前先答「哪个 PR 或人会碰到它」;答不出 ⇒ 仍然关,理由写「承接者:无」。」 — resolved by keeping both (SKILL.md:360-:361 at the head), plus the one resolution-adjacent edit the body names: filing-gate.md:19 went from 「既不派 dev,今亦不立卡」 to 「(不派 dev 见 references/instrument-discipline.md)」.

2. Part A, the door — WRONG: the six rules are present and faithful, the reconciliation is not. In references/filing-gate.md:

  • Rule 1 — :14 「立卡只为四类,正文首行写出类别字母;⛔ 其余一律不立卡,不论它叫什么。」; :15-:18 carry (a) 具名落点或复现的产品缺陷, (b) 只有维护者能做的决定 with 速读 + 四棱块, (c) 维护者直派的任务,正文引其原话, (d) 协调节点:跨仓/跨层父单与它的逐层子单. SKILL.md:351-:352 is the door and its pointer inside 〈分诊座位职责〉.
  • Rule 2 — :19-:24, all six named non-cards: instrument misfire (:19, pointing at instrument-discipline.md), seat's own mistake/observation (:20), :21 「⛔ 不是卡:三类外的 finding —— 原为首触即关,今门前即拒。」, :22 「⛔ 不是卡:丢卡重建,除非它自身即 (a)–(d)。」, pointer/notice a comment can carry (:23), sweep-derived pin/bump/hygiene (:24).
  • Rule 3 — :25 「每次 POST 之前正文答三件:类别字母、动手的读者(哪个席位哪一步)、查重词与命中数。」, :26 「缺任一件的卡由分诊首触即关、不定级,关单一行点名缺的是哪一件。」; twin core-rules.md:80.
  • Rule 4 — :29 「配额:一席每 fire 至多立三张;sweep 超出的折进一张带清单的卡,或折进座位贴。」, :30 「分诊席的存量清理仍走维护者确认的十张一组,⛔ 不因本门改批量。」.
  • Rule 5 — :31 「写节奏 ⛔ 非可选:REST 写(评论/标签/关单/立卡)间隔 ≥3 秒,每账号每小时 ≤40 笔。」, :32 (429 or secondary limit ⇒ that seat stops writing for the fire, recorded on the seat post), :33 「关单 ⛔ 永不由脚本循环连发:须维护者确认的分组,且逐笔之间留间隔。」; SKILL.md:99 carries the invariant. Stated as seat discipline: no line claims a script enforces the numbers, and none of the four 「Not in this card」 items appears (no throttle, no label-write refusal, no filed.log, no backup status — grep over the diff: 0 hits).
  • Rule 6 — :34 「立卡、开 PR 与评论恒走 App 安装身份(claude[bot]),⛔ 不走席位用户令牌。」, :35 「用户类写绑作者:封号则其卡与评论按作者 404,故一个 fire 的首写回读 user.type。」, :36 「读到 User ⇒ 记座位贴、本 fire ⛔ 不立新卡;认领仍靠 assignee,署名仍是文本的 session ID。」; SKILL.md:99 「写侧恒走 claude[bot] ⛔ 不走用户令牌;…」. Faithful to the briefed sixth rule, consequence included.

What is WRONG — the door lands beside four surviving lines that contradict it, and nothing reconciles them:

  • SKILL.md:187 「立卡者不查重、只附 3–5 查重词;真撞上重复,先比数值与作用域再决定关哪个。」 is the opposite of rule 3 (the filer runs the dedupe query and writes the hit count). And core-rules.md:80 WAS rewritten to the door's wording (「立卡者只答类别/读者/查重命中数」) while its SKILL.md twin :187 was not — against SKILL.md:42 「一条规则在本文与核心条款一处改动,另一处同 PR 同改。」.
  • SKILL.md:241 「任何跨座位请求都是工作(要读数、要开卡、要授权):一律立卡进目标车道队列。」 and :242 「⛔ 座位贴敲门或裁决评论永不作跨座位请求的唯一载体;评论是加速器不是记录。」, twin core-rules.md:61 「跨座位请求即立卡进目标车道,…」, versus filing-gate.md:23 「⛔ 不是卡:既有卡一条评论能承载的指针/知会/请求 —— 评论是加速器不是记录。」. A request for a reading or an authorization is none of (a)–(d), so :241 orders a card the door refuses; and :23 reuses :242's phrase with its meaning inverted (:242 uses it to REQUIRE the card).
  • SKILL.md:310 「顺带发现 ⇒ 独立立单进修复落地仓,附查重词;⛔ 不借 sub-issue 通道塞未分诊卡进池子。」 — under the door an incidental finding is a card only when it is (a); the line says always, and 「附查重词」 is the pre-door protocol again (so is SKILL.md:785 「…实属三类的补立、归挂、附查重词」).
  • core-rules.md:87 「立卡限三类:今日可达可复现缺陷、契约违背、具名生产者陷阱;…」 sits three lines under the new :84 「立卡门四类外 ⛔ 不立卡;…」 — two counts of what may be filed in one section, with no line saying the three are the inside of (a). The same at SKILL.md:351-:354, where the door's (a)(b)(c)(d) and finding's (a)(b)(c) share letters with different meanings and 「正文首行写类别字母」 does not say which set.
    The old finding first-touch lines ARE reconciled (SKILL.md:390 「三类外首触关闭只清门前存量,关 not planned(不等批准可否决重开);三类内无证据拒收。」; :374 unchanged and compatible). The remedy is in-place rewrites of :187, :241/:242, :310 (and :785), core-rules.md:87 — rewrites, not additions, so headroom 0 is no obstacle.

3. Part B — RIGHT. Every measured gap is carried, in the charter's own register: false green filing-gate.md:43 「假绿另有条款:绿线被读作「已核对」而实际没核对 ⇒ 一次人眼捕获即一次实测代价。」; four answers not two :44-:45 (「假红的标准代价形态是席位顺从它」, one named seat action on one named card counts as a mis-dispatch); chain inheritance :46 「沿链继承只给上界,界内哪格由失效形态定:墙齐平,税降一格;可重入队的 PR 是税。」; the three-state checklist :40-:42 with state ② 「补步骤并继承该项档 ⛔ 不降 p3」 and the pointer SKILL.md:373; North Star item 4 :47 (shipped faces only, ⛔ 不含 .claude/**) and :48 (「一句说错的话,⛔ 不是一句缺席的话」); premise re-read SKILL.md:365 「入决策箱那一笔连「前提今天还成立吗」一起现读;改状态只需现读卡。」; retriage by content SKILL.md:400 「retriage 的异议判据认内容(有评论写明所求)⛔ 不认形状(有一条异议评论)。」; zero-with-control and control-proves-reach are the pre-existing SKILL.md:167-:169 (extended by the :170 pointer, not restated) with exact-not-prefix at :60; reach radius, both arms :52-:54 (半径内 zero is a zero; the shipped-face list incl. 墓碑处方, 拒绝消息, CHANGELOG, 协议的接受/拒绝行为; 「点不出受害者」⛔ 不是证据) and both corollaries :55 (「辅助面」⛔ 不蕴含「可关」) and :56 (落点在半径内 ⛔ 不蕴含所护的在内); git-ignored directory :59 and the three-part zero :57-:58; one enumeration per fire :61 「全板枚举每 fire 至多一次,⛔ 不反复实扫;统计走 board-archive 离线做,巡查按日。」.

4. Ratchet and the seven deleted lines — RIGHT. node scripts/pm/check-skill-line-ratchet.mjs at the head: exit 0; SKILL.md is 819 lines (ceiling 819; headroom 0), core-rules.md is 151 lines (ceiling 151; headroom 0), filing-gate.md is 61 lines (ceiling 61; headroom 0), every other entry unchanged. The seven SKILL.md deletions each have a survivor: ①② the two 两级盘点 cadence lines merge into :322 with both limbs intact; ③④⑤ the three Acceptance-notes lines become :361 plus filing-gate.md:27-:28 (the 「说不出的形态」 list restored at 34a97c4); ⑥ 「清单项会 fail 才算断…」 becomes filing-gate.md:40 (the 「有人在等」 limb) and :42 (the 「缺项补账本」 limb) behind the :373 pointer; ⑦ 「每批先验三类…」 becomes :390 with all three limbs. No rule was deleted without a survivor. Line lengths (awk 'length($0) 大于 120', table rows excluded): only SKILL.md:818 (172 B — the claim template inside a code fence, pre-existing on main at :815) and filing-gate.md:10 (211 B — the maintainer's verbatim blockquote, a quotation exemption in the ratchet's own classifier); no new rule line exceeds 120 B.

5. Language and register — RIGHT, with two notes. Charter lines are Chinese, one rule per line; the door's numbers are written the way the charter writes others (三张 / 十张一组 / ≥3 秒 / ≤40 笔, cf. :84's 十五张 / 五张). The id-lint pattern (hash followed by three or more digits) over the three files: 0 hits. Notes for the maintainer's eye, neither a FAIL item: (i) provenance costs five lines (:8-:12, a dated header and two blockquotes) where the ratchet header's convention is 「provenance is one line」 and instrument-discipline.md:11 on main is one line; the bare 「19546」 inside the quote is the maintainer's own sentence kept verbatim, as AGENTS.md requires. (ii) The card named references/platform-readings.md as a landing file; the PR lands the reading criteria in the new file instead, with a measurement (469/469, no adjacent bullet pair merges under 120 B) — a declared deviation. The per-fire read grows by 65 lines (new file 61 + SKILL.md 815→819) under a card that said 「Ratchet paid in place」; the precedent is #19513's 11-line file from this morning.

② Semver level

Clause-②: no on the claim (5758101147), the PR body and the report — consistent; no changeset, nothing under packages/**, and skip-changeset is the correct label for a diff that publishes nothing. Carriers: none hung — needs:contract-review is on neither the PR (labels: documentation, size/s, skip-changeset) nor the card (tooling, priority:p1, pm:dispatched, domain:skills).

③ Boundary flags

  • CI, read from the head's check-runs at 2026-09-21T09:57Z — the seven required contexts: Lint & Repo Gates in_progress = NOT MEASURED; TypeScript Type Check success; Test Core aggregate in_progress = NOT MEASURED (shards 1/6–6/6 all success); Dogfood Regression Gate success; Build Core skipped (expected: ci.yml's filter job routes it by path); Temporal Conformance (live PG + MySQL) skipped (expected); Governed Surface Queue Guard success. The PR workflows do fire on a .claude/** + scripts/pm/** diff: lint.yml and ci.yml carry an unfiltered pull_request: trigger, and scripts/** is in ci.yml's crosspkg filter list. Advisory: Check Changeset failed once before the label and is skipped on its re-run.
  • skip-changeset was written by os-project-manager at 2026-09-21T09:48Z — the director's act, not the dev's (the report lists no label write); documentation and size/s are Auto Label's.
  • PR state: draft, auto_merge null, head repo = base repo (not a fork), mergeable_state: blocked. Tier H by .claude/**: no ready, no queue, no auto-merge from any seat; the maintainer's hand.
  • Dev open question 1 (the PR row was created under user.type = User): answer A — the branch at 34a97c4 is the durable artefact and rule 6's own consequence line (:36) is exactly this case; the report records the reading; do not re-create the PR.
  • Dev open question 2 (claude/issue-19546-grading-contract-amendments still on origin at cf5f224, delete refused 403): confirmed by git ls-remote; answer A — a seat or the maintainer with ref-delete permission removes it; not a defect of this PR.
  • Dev out-of-scope note (instrument-discipline.md unratcheted on main): under the door that is a seat observation, not a card; the next domain:skills PR touching the map carries it.

Implemented-by: claude/issue-19570-filing-door
Reviewed-by: session_012GcsUbuqFGBibkEDMRC1eE

VERDICT: FAIL — item 2: the door lands beside four unreconciled lines (SKILL.md:187 with its core-rules.md:80 twin already rewritten; :241/:242 with core-rules.md:61; :310 and :785; core-rules.md:87 beside :84). One patch round of in-place rewrites; items 1, 3, 4, 5 are RIGHT and CI is NOT MEASURED on two of seven.


Generated by Claude Code

…ed the door

Round 2 of the at-tier review (record 5758683730, item 2). In-place rewrites
only; every ceiling stays at headroom 0 and the new reference file's ceiling
comes down with it.

- SKILL.md:187 — the filer runs the dedupe query and writes it with its hit
  count, closed cards included; triage still owns the verdict. Its twin at
  core-rules.md:80 already carried the door's wording.
- SKILL.md:241-242 and core-rules.md:61 — a cross-seat request rides on the
  existing card it concerns: `Blocked-by:` on the requesting card and one
  comment on the target's, naming the seat and the step. A new card only when
  no existing card carries the work and the request is itself door class
  ①②④. The inverted 「评论是加速器不是记录」 phrase is gone from both sides.
- SKILL.md:310 and :785 — a 顺带发现 becomes a card only through the door.
- The door's classes are ①②③④ everywhere, so they no longer share letters
  with `finding`'s (a)(b)(c); core-rules.md:87 now reads as the `finding`
  sub-rule inside door class ①, not as a second door.
- os-dev.md:51 carried the same 「立卡者不查重」 claim and is rewritten too.
- filing-gate.md's provenance block shrinks from five lines to two, keeping
  both maintainer sentences verbatim.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m and removed size/s labels Sep 21, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: ae96af9dccb5487ee95cfcea0887ab2e796d1d0a

Written 2026-09-21T10:13Z — round 2 of the at-tier, adversarial contract review for card #19570 on PR #19575, same R5 shape as record 5758683730 (diff and card read, check conclusions from the head's check-runs, the only local run node scripts/pm/check-skill-line-ratchet.mjs plus git grep / git merge-tree / awk). Head 34a97c48 was reviewed in full in 5758683730 (items 1, 3, 4, 5 RIGHT; item 2 WRONG on four unreconciled lines); this record judges the round-2 delta 34a97c48..ae96af9d and re-judges item 2. Tier H (.claude/**): the maintainer merges by hand — a review of record, ⛔ not a landing record.

① Derived judgments

(a) The delta is exactly the rewrites — RIGHT. git diff 34a97c48 ae96af9d --numstat: os-dev.md 1/1, SKILL.md 7/7, core-rules.md 3/3, filing-gate.md 9/12, check-skill-line-ratchet.mjs 1/1 (the new file's CEILINGS row lowered 61 → 58, a lowering, always legitimate); five files, +21/−24, one commit, no rebase (34a97c48 is its parent). The os-dev.md hunk is the one line. The eleven rewritten rule lines at the head, verbatim:

  • SKILL.md:187 「立卡者自跑查重并写下查询与命中数(含 closed);判重仍归分诊,比数值与作用域定关哪个。」
  • SKILL.md:241 「跨座位请求骑在它所关的既有卡上:请求席在自卡写 Blocked-by:,并在目标卡留一条评论。」
  • SKILL.md:242 「该评论点名席位与步骤;无既有卡承载且请求自身即立卡门 ①②④ 时才立新卡。」
  • SKILL.md:310 「顺带发现只经立卡门:三类内缺陷才立,带查询与命中数;其余进 Acceptance notes 或座位贴。」
  • SKILL.md:351 「立卡门四类:① 缺陷 / ② 维护者决定 / ③ 直派任务 / ④ 协调节点,⛔ 其余一律不立卡。」
  • SKILL.md:352 「首行写立卡门类别 ①–④;四类定义、⛔ 清单、三答与配额见 references/filing-gate.md。」
  • SKILL.md:785 「席位读 PR ## Acceptance notes,实属三类的经立卡门补立、归挂;门外已立卡关 not planned。」
  • core-rules.md:61 「跨座位请求骑既有卡:自卡 Blocked-by: + pm:blocked,目标卡评论;无主被挡席认领,在飞即等。」
  • core-rules.md:84 「立卡门 ①–④ 外 ⛔ 不立卡;裸卡超十五张则下轮改域分批,每批不超过五张同族卡。」
  • core-rules.md:87 「门 ① 内 finding 限三类:今日可达可复现缺陷、契约违背、具名生产者陷阱;截断卡不派。」
  • os-dev.md:51 「dev ⛔ 不查重,只附 3–5 个查重词;查询与命中数由立卡席写,⛔ 不扫 open issues、不拉板。」
    In filing-gate.md the remaining hunk is the class rename (a)–(d) → ①–④ at :11-:15, :19, :22, the :20 rewrite 「⛔ 不是卡:既有卡一条评论能承载的指针/知会/请求;那条评论即其记录。」, and the provenance block 5 → 2 lines (:8-:9), both maintainer sentences still verbatim. Nothing else moved.

(b) Item 2 re-judged — RIGHT; the four contradictions are closed. Greps at the head over .claude/ (control: 「立卡门」 = 9 hits, SKILL.md 5 / core-rules.md 1 / filing-gate.md 3): 「不查重」 → only os-dev.md:51, which now says the DEV does not dedupe and the filing SEAT writes the query and hit count — consistent with SKILL.md:784 「dev 不立卡」 and door rule 3; 「一律立卡」 0; 「独立立单」 0; 「评论是加速器」 0; 「附查重词」 → os-dev.md:55 (dev attaches terms in the report for the seat to file) and dispatch-runbook.md:159 「…附查重词后派发…」 (a 细则 line, under-specified against the door's query + count, not contradicting it; the door outranks it by SKILL.md:42's order). Twin pairs now agree: SKILL.md:187core-rules.md:80, SKILL.md:241-:242core-rules.md:61, SKILL.md:351-:352core-rules.md:84; the same-PR twin rule (SKILL.md:44 「一条规则在本文与核心条款一处改动,另一处同 PR 同改。」 — cited as :42 in 5758683730, corrected here) is satisfied. Letter clash: the door is ①–④ everywhere (SKILL.md:351-:352, core-rules.md:84/:87, filing-gate.md:11-:15/:19/:22) and finding keeps (a)(b)(c) (SKILL.md:353-:359, :783 class: a|b|c, os-dev.md:42-:47), nested by filing-gate.md:12 「① …其内的 finding 限三类」 and core-rules.md:87 「门 ① 内 finding 限三类」 — no shared letters, and 「首行写立卡门类别 ①–④」 names the set. The cross-seat exception, 〈多仓协调〉 SKILL.md:241-:242 against filing-gate.md:20: consistent — a request rides on the existing card it concerns (Blocked-by: on the requesting card, one comment naming seat and step on the target card, 「那条评论即其记录」), and a new card only when no existing card carries it AND the request is itself ①②④. ③ is correctly excluded: ③ is 「维护者直派的任务,正文引其原话」, so a seat's own request can never be ③, and a card that does carry the maintainer's sentence enters by ③ through the door directly, filed by the seat the maintainer addressed — :242 neither blocks nor is needed for it. Residual readings, none a contradiction: SKILL.md:310 says 「三类内缺陷才立」 for a 顺带发现 while its opening 「只经立卡门」 makes ①–④ the authority (a discovery that is a decision still enters by ② via the decision-box lines); SKILL.md:243 「…指向请求卡」 now means the existing card the request rides on; filing-gate.md:8 puts the 「出处」 label inside the blockquote line, so the two sentences render as one quoted paragraph — a presentation nit, the text is verbatim.

(c) Ratchet — RIGHT. At the head: exit 0; SKILL.md is 819 lines (ceiling 819; headroom 0), core-rules.md is 151 lines (ceiling 151; headroom 0), filing-gate.md is 58 lines (ceiling 58; headroom 0), os-dev.md is 403 lines (ceiling 403; headroom 0); every other entry unchanged, declared cross-file moves: 1, total ceilings down 9 lines as on main. No rule deleted to pay: every removed rule line has its rewrite at the same position (numstat above), and the only net shrink is the three provenance lines. Non-table lines over 120 B: SKILL.md:818 (172 B, pre-existing code-fence template) and filing-gate.md:8 (252 B, the maintainer's blockquote — a quotation exemption in the ratchet's classifier). Id-lint pattern (hash + three or more digits) over the five files: 0 hits.

(d) Merge — RIGHT. After a fresh git fetch origin main (still b3615f1a4c), git merge-tree --write-tree origin/main ae96af9d exits 0, tree 9492ca1e08, no conflict.

② Semver level

Clause-②: no on the claim (5758101147), the PR body and both reports (5758532469, 5758768814) — consistent; no changeset; nothing under packages/**; skip-changeset correct. Carriers: none hung — needs:contract-review on neither the PR (documentation, size/m, skip-changeset) nor the card (tooling, priority:p1, pm:dispatched, domain:skills).

③ Boundary flags

  • CI, read from the head's check-runs at 2026-09-21T10:12Z — the seven required contexts on ae96af9d: Lint & Repo Gates in_progress = NOT MEASURED; TypeScript Type Check success; Test Core aggregate not yet published, shard 1/6 in_progress (2/6–6/6 success) = NOT MEASURED; Dogfood Regression Gate success; Build Core skipped (expected, ci.yml filter); Temporal Conformance (live PG + MySQL) skipped (expected); Governed Surface Queue Guard success. Advisory: Check Changeset skipped (label present), size/ssize/m re-labelled by Auto Label at 2026-09-21T10:07Z.
  • PR state: draft, auto_merge null, head repo = base repo, mergeable_state: blocked; one comment (5758683730); the round-2 report is on the card (5758768814). Tier H: no ready, no queue, no auto-merge from any seat.
  • Round-1 open questions stand unchanged, answers as in 5758683730 ③: the PR row is user-class (branch is the durable artefact; no re-create); the stale claude/issue-19546-grading-contract-amendments is still on origin at cf5f2245 (a seat or the maintainer with ref-delete permission removes it). Both for the director seat.

Implemented-by: claude/issue-19570-filing-door
Reviewed-by: session_012GcsUbuqFGBibkEDMRC1eE

VERDICT: PASS — the round-2 delta is exactly the reconciliation asked for; item 2 now RIGHT alongside items 1, 3, 4, 5 from 5758683730; ratchet green at headroom 0 everywhere; merge-tree clean; CI NOT MEASURED on two of seven at reading time. Tier H — the maintainer's hand.


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

Provenance — director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE), 2026-09-21T10:14Z

  • Contract review of record: 5758831589, Served-tier: CONTRACT_REVIEW_TIER, judged head ae96af9dccb5487ee95cfcea0887ab2e796d1d0a (the current head; round-1 head 34a97c48 reviewed in full at 5758683730 — FAIL on one item, closed by round 2), VERDICT: PASS. The reviewer's transcript re-read by this seat: every request stamped at the tier constant, zero fallbacks. Independence pair Implemented-by: claude/issue-19570-filing-door (the dev was this seat's mode:subagent, direct dispatch under the maintainer's 「19546 帮我派发处理」 and the successor filing 「你创建一个新的吧」) / Reviewed-by: session_012GcsUbuqFGBibkEDMRC1eE (an isolated reviewer subagent whose verdict this seat adopts verbatim).
  • What lands (R5 shape review: diff + the head's check-runs, no local gate sweep): the filing door in references/filing-gate.md — four classes ①–④ or no card, the named non-cards, three answers before POST, the quota, paced writes as seat discipline, and writes through the App identity claude[bot] with user.type read back on a fire's first write — plus the grading contract's measured gaps and the reading criteria; SKILL.md and core-rules.md carry the door's twins and pointers; the four pre-door lines that contradicted it (立卡者不查重 / 跨座位请求一律立卡 / 顺带发现独立立单 / 立卡限三类) and the same claim in .claude/agents/os-dev.md:51 are rewritten in place; the door's letters ①–④ no longer collide with finding's (a)(b)(c). Ratchet exit 0: SKILL.md 819/819, core-rules 151/151, filing-gate 58/58 (its own CEILINGS row), os-dev.md 403/403; no rule deleted to pay. Merge-tree onto origin/main (b3615f1a) exit 0.
  • Carriers: none hung (Clause-②: no); skip-changeset on the PR. The four mechanisms the card lists under 「Not in this card」 appear nowhere as promised machinery: the mechanical throttle is its own card Pace every seat write — one shared throttle in front of the five PM write scripts (maintainer 「截流应该要加」) #19572 (PR feat(pm): pace every seat write — one shared throttle in front of the five write scripts (#19572) #19584, maintainer 「截流应该要加」); §5 / ⑫ / ⑬ still await the maintainer's word.
  • Two readings for the maintainer, not defects: the PR row itself was created under a user-class token (os-project-manager, type User) — the durable artefact is the branch, and door rule 6 is what stops that from recurring once the seat accounts' GitHub connections are switched; the stale branch claude/issue-19546-grading-contract-amendments (cf5f224, the vanished card's number) is still on origin — the seat's token cannot delete refs (403), so its removal is the maintainer's.
  • Landing: Tier H (.claude/**) — the maintainer flips ready and merges by hand once the in-progress contexts on ae96af9d read success; this seat only clears the gate. After merge: landing record on Charter: the filing door — a card exists only for four classes, every seat paces its writes, and the grading contract closes the gaps it measured (successor of the lost #19494 / #19546) #19570 and close.

Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants