Repository navigation
Commit 37ed9ae
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](https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4d0bd23 commit 37ed9ae
5 files changed
Lines changed: 85 additions & 17 deletions
File tree
- .claude
- agents
- skills/pm-dispatch
- references
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
| 51 | + | |
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
| 99 | + | |
99 | 100 | | |
100 | 101 | | |
101 | 102 | | |
| |||
166 | 167 | | |
167 | 168 | | |
168 | 169 | | |
| 170 | + | |
169 | 171 | | |
170 | 172 | | |
171 | 173 | | |
| |||
182 | 184 | | |
183 | 185 | | |
184 | 186 | | |
185 | | - | |
| 187 | + | |
186 | 188 | | |
187 | 189 | | |
188 | 190 | | |
| |||
236 | 238 | | |
237 | 239 | | |
238 | 240 | | |
239 | | - | |
240 | | - | |
| 241 | + | |
| 242 | + | |
241 | 243 | | |
242 | 244 | | |
243 | 245 | | |
| |||
305 | 307 | | |
306 | 308 | | |
307 | 309 | | |
308 | | - | |
| 310 | + | |
309 | 311 | | |
310 | 312 | | |
311 | 313 | | |
| |||
317 | 319 | | |
318 | 320 | | |
319 | 321 | | |
320 | | - | |
321 | | - | |
| 322 | + | |
322 | 323 | | |
323 | 324 | | |
324 | 325 | | |
| |||
347 | 348 | | |
348 | 349 | | |
349 | 350 | | |
| 351 | + | |
| 352 | + | |
350 | 353 | | |
351 | 354 | | |
352 | 355 | | |
| |||
355 | 358 | | |
356 | 359 | | |
357 | 360 | | |
358 | | - | |
359 | | - | |
360 | | - | |
| 361 | + | |
361 | 362 | | |
362 | 363 | | |
363 | 364 | | |
| 365 | + | |
364 | 366 | | |
365 | 367 | | |
366 | 368 | | |
367 | 369 | | |
368 | 370 | | |
369 | 371 | | |
370 | 372 | | |
371 | | - | |
| 373 | + | |
372 | 374 | | |
373 | 375 | | |
374 | 376 | | |
| |||
386 | 388 | | |
387 | 389 | | |
388 | 390 | | |
389 | | - | |
| 391 | + | |
390 | 392 | | |
391 | 393 | | |
392 | 394 | | |
| |||
395 | 397 | | |
396 | 398 | | |
397 | 399 | | |
| 400 | + | |
398 | 401 | | |
399 | 402 | | |
400 | 403 | | |
| |||
779 | 782 | | |
780 | 783 | | |
781 | 784 | | |
782 | | - | |
| 785 | + | |
783 | 786 | | |
784 | 787 | | |
785 | 788 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
| 61 | + | |
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | | - | |
| 80 | + | |
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | | - | |
| 87 | + | |
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
| |||
0 commit comments