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
Conversation
…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>
Contract reviewServed-tier: 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 ① Derived judgments1. Scope — RIGHT. 2. Part A, the door — WRONG: the six rules are present and faithful, the reconciliation is not. In
What is WRONG — the door lands beside four surviving lines that contradict it, and nothing reconciles them:
3. Part B — RIGHT. Every measured gap is carried, in the charter's own register: false green 4. Ratchet and the seven deleted lines — RIGHT. 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 ② Semver level
③ Boundary flags
Implemented-by: VERDICT: FAIL — item 2: the door lands beside four unreconciled lines ( 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>
Contract reviewServed-tier: 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 ① Derived judgments(a) The delta is exactly the rewrites — RIGHT.
(b) Item 2 re-judged — RIGHT; the four contradictions are closed. Greps at the head over (c) Ratchet — RIGHT. At the head: exit 0; (d) Merge — RIGHT. After a fresh ② Semver level
③ Boundary flags
Implemented-by: 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 |
|
Provenance — director seat, summon #25 (
Generated by Claude Code |
Fixes #19570
Clause-②: no
Tier H (
.claude/**plusscripts/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
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
references/filing-gate.md:14(headline),:15–:18(a/b/c/d),SKILL.md:351–:352(the door and its pointer, inside 〈分诊座位职责〉)references/filing-gate.md:19–:24— instrument misfire (pointing atreferences/instrument-discipline.md, which #19513 landed this morning), seat mistakes and lessons, afindingoutside the three classes, a lost-card rebuild, anything a comment can carry, a sweep-derived pin/bump reminderreferences/filing-gate.md:25–:28; mirrored inreferences/core-rules.md:80references/filing-gate.md:29–:30references/filing-gate.md:31–:33; the invariant every seat reads isSKILL.md:99claude[bot]references/filing-gate.md:34–:36;SKILL.md:99carries the prohibition beside the pacing numbersSKILL.md:391Rule 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:135is the standing reading, and:130–:134record 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 backuser.typeon its first write of a fire, records aUserreading 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
references/filing-gate.md:43references/filing-gate.md:44–:45references/filing-gate.md:46references/filing-gate.md:40–:42;SKILL.md:373names the three states in the principal textreferences/filing-gate.md:47–:48SKILL.md:365pm:retriagejudged by content, not shapeSKILL.md:400mainatSKILL.md:168andreferences/core-rules.md:45— nothing added, this PR only extends itreferences/filing-gate.md:60references/filing-gate.md:52–:56references/filing-gate.md:57–:59references/filing-gate.md:61SKILL.md:170is 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.mdThe 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.mdis 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.mdis 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 patternreferences/instrument-discipline.mdset onmainthis morning (PR #19513, merged as3e8e2b0d), andSKILL.mdcarries the pointers. One difference from that precedent, deliberately: this PR adds the new file to the ratchet map (CEILINGSand 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
.claude/skills/pm-dispatch/SKILL.md.claude/skills/pm-dispatch/references/core-rules.md:80the three answers,:84the door).claude/skills/pm-dispatch/references/filing-gate.md.claude/agents/os-dev.md,AGENTS.md, every other map entryNo ceiling was raised. No rule was deleted to pay: every limb removed from
SKILL.mdis present in the new file (git diff origin/main -- .claude/skills/pm-dispatch/SKILL.mdremoves 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/objectstackat34a97c4— 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:
Nine of the forty first returned exit 3, PREREQUISITE NOT MET, in a fresh worktree with no
node_modules; they were re-run afterpnpm installand, forcheck:doc-formula-expressions, after building@objectstack/formulaand@objectstack/lintunder the shared verify lock. Exit 3 is not a finding and was not read as one.Acceptance greps
The three states are at
references/filing-gate.md:40–:42, whichSKILL.md:373names.Collision with PR #19513
It merged while this branch was in flight (
3e8e2b0d, thenorigin/mainmoved on tob3615f1a4c).origin/mainis 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 atreferences/instrument-discipline.mdinstead 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):
scripts/pm/post-stamped.mjsandscripts/pm/label-write.mjs— this PR states the pacing numbers as charter only;scripts/pm/label-write.mjswhendomain:*orpriority:*is written with no pm-state label in the same write;filed.logreceipt for newly filed cards;Changeset
skip-changesetapplies: nothing underpackages/**is touched. The four paths are.claude/skills/pm-dispatch/**andscripts/pm/check-skill-line-ratchet.mjs, all on the fast track (internal protocol and PM tooling, not shipped by any package'sfiles[]).维护者速读(草稿)
改了什么:给「立什么卡」装了一道门。今天起,一张 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