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

@os-zhuang
os-zhuang marked this pull request as ready for review September 21, 2026 10:24
@os-zhuang
os-zhuang enabled auto-merge September 21, 2026 10:24
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 37ed9ae Sep 21, 2026
33 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-19570-filing-door branch September 21, 2026 10:59
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