Commit af3add1
Fixes #17800
## What changed
`.claude/skills/pm-dispatch/SKILL.md` 〈执行座位职责〉 › 认领(先认领后动工), lines
:472–:474 on base `99edfd008e`: three lines → three lines. 812/812 held;
every changed line ≤ 120 bytes. Nothing else in the tree moves — ⛔ not
the 〈模板与表〉 template (P5), ⛔ not `scripts/pm/check-clause2-carriers.mjs`,
⛔ not the reader tolerance that #17098 is about (#17098 remains open), ⛔
no label, sweep or gate, ⛔ not `references/core-rules.md` (P3).
```diff
-- ② 认领评论(英文),固定形状见 模板与表 节;首行以字面 `Claim:` 开头是机器判据。
-- 巡查谓词只认 `Claim:` 这一个拼写且保持严格,修法是全舰队向它收敛,⛔ 不放宽谓词。
-- session ID 不可省;`mode:subagent` 的 dev 与 PM 同会话同 ID,甄别身份是分支。
+- ② 认领评论(英文)照抄 模板与表 节:`Claim:` 首行,`Branch:`、`Clause-②:` 各占一行且行首。
+- 条款②入队闸门只读认领评论且只读行首键:句中提及与另发评论皆读不到,卡即不可读。
+- 谓词保持严格、⛔ 不放宽;session ID 不可省,`mode:subagent` 下 dev 与 PM 同 ID,身份看分支。
```
Bytes per line (`Buffer.byteLength`, utf8, measured
2026-09-14T15:05:43Z): before 109 / 114 / 94 → after **116 / 118 /
114**; the cap is `MAX_LINE_BYTES = 120` in
`scripts/pm/check-skill-line-ratchet.mjs`.
What each new line carries:
- **:472 — the binding shape.** The claim comment copies the template:
`Claim:` is the first line; `Branch:` and `Clause-②:` each occupy a line
of their own, at the start of the line. 「照抄」 (copy) is the remedy the
checker's own remedy text names — "COPY the template's line rather than
composing one" (`TEMPLATE_POINTER`, check-clause2-carriers.mjs :1502).
- **:473 — the why, in the line itself.** The clause-② enqueue gate
reads only the claim comment and only line-initial keys; a key mentioned
inside a sentence (the dispatch-order bullet form measured on #17234,
#17620 and #17948 — an instruction that describes the key inside a
sentence IS the violation) or posted as a separate comment is unread,
and the card is then illegible. 「条款②入队闸门」 is the charter's own name for
it (:637).
- **:474 — old :473 + old :474, compressed, content kept.** The readers
stay strict and are never widened (the standing 「⛔ 不放宽谓词」); the session
ID is mandatory; under `mode:subagent` the dev and the PM share one ID,
so identity is the branch. Two clauses dropped as now-redundant: 「只认
`Claim:` 这一个拼写」 — the literal spelling is shown in :472 and in the
template header (:799) — and 「修法是全舰队向它收敛」 — converging on the template
is what 「照抄」 in :472 says.
## Triage direction (comment 5645818231, verbatim)
> wherever the charter states the claim form, make the three lines
non-optional (`Claim:` / `Branch:` / `Clause-②:` each at the start of
its own line in the claim comment) and say why (the gate reads the claim
comment only); ⛔ not the checker (right on both limbs); ⛔ not #17098
(the reader's tolerance — a different defect)
Where the charter states the claim form: SKILL.md :472 (the
claim-discipline line) and 〈模板与表〉 :799–:811 (the template, already
three-line). The rule line was the gap; the template was not.
## Premises, read against `origin/main` `99edfd008e` before writing
**P1 — holds in substance; the instrument's predicted count was wrong.**
:472 and :475 read exactly as the dispatch quoted (2026-09-14T14:57Z).
The grep `各占一行|各自一行|own line|行首` over SKILL.md, `references/*.md`,
os-dev.md and AGENTS.md returned **5 hits, not 0** (14:57:17Z; the
control `机器判据` in SKILL.md → 2, as predicted). Each read: SKILL.md:111
(`Maintainer-action:` line-initial — a different key),
state-machine.md:25 and :42 (`Blocked-by:` / `Release:` — different
keys), platform-readings.md:352 (`CLAIM_COMMENT_MARKER` recognises
line-initial `Claim:` — the marker, not the declaration), and
platform-readings.md:350–:351 「认领腿 `CLAUSE2_KEY_LINE`
的轴是行首位置:引用块、项目符、粗体、反引号全容,冒号可在外。只有 `#` 标题与行中键破它」 — a READING of the
checker's axis in the readings reference, not a rule binding the claim
comment's shape, and not at the place the charter states the claim form.
No line said the gate reads the claim comment only. The rule gap the
card names is real; the new :473 is its first rule-layer statement and
agrees with that readings line.
**P2 — falsified in its literal form; direction unchanged, "why"
stronger.** `grep -c 'Branch:' scripts/pm/check-clause2-carriers.mjs` →
**23** (14:57:17Z). The checker DOES read the claim's `Branch:` line: it
imports `claimedBranches` from `check-half-states.mjs` (:608), whose
reader is line-anchored —
`/^\s*(?:[-*+]\s+)?>?\s*Branch(?:es)?\s*:\s*(.*)$/gim`
(check-half-states.mjs :4789) — and `governingClaim` picks "the newest
claim comment from which at least one branch parses" (:4802). An inline
`Branch:` parses to zero and the pair is reported UNJUDGED with the
remedy "a `Branch:` line of its OWN … ⛔ not inside the `Claim:`
sentence, which no reader parses" (check-clause2-carriers.mjs
:3194–:3200, pinned at :5209–:5221). So the gate reads ONE comment and
all three keys line-anchored: `Claim:` as the marker
(`CLAIM_COMMENT_MARKER`, check-half-states.mjs :1134), `Branch:` to
resolve which claim governs the pair, `Clause-②:` as the declaration
(`CLAUSE2_KEY_LINE`, :762). The new :473 says exactly that —
「只读认领评论且只读行首键」 — and neither claims nor denies anything beyond it; :479
「分支名必须带 issue 号」 is untouched. Reported per the three-zone rule
(mechanism assumption tested, falsification reported, ruling's intent
kept), not as a stop.
**P3 — SKILL.md only.** `references/core-rules.md` :109 reads
「认领原子对:一次标签写入完成认领与状态对调,随后留 `Claim:` 开头的评论并重读全线程。」 (151/151, headroom 0).
It states the atomic pair and the `Claim:`-initial comment and nothing
about the other two keys' placement, and the new :472 leaves that
sentence true. The placement of `Branch:` / `Clause-②:` is form detail
of the template (细则), not a principle (核心条款); 〈优先级〉's same-PR sync
clause 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」 fires on a rule that lives in both
files and changes in one — no core-rules sentence changed meaning.
Touching core-rules would have cost a trim in a 0-headroom file for a
detail; not taken.
**P4 — holds.** Base `pnpm check:pm-skill-ratchet` exit 0 at
2026-09-14T15:00:16Z: 「.claude/skills/pm-dispatch/SKILL.md is 812 lines
(ceiling 812; headroom 0)」, 「widest table row is 342 bytes (pin 342;
headroom 0)」; base `pnpm check:skill-frame-sync` exit 0 at 15:00:17Z.
`git ls-remote --heads origin` at 15:13:32Z: only
`claude/issue-17800-claim-form-three-lines` matches
`issue-17497|issue-17800` — no #17497 branch exists. After the edit
`origin/main` advanced by one commit (`d4554d4f5a`, #18191, a
`content/docs` page); `git diff --stat 99edfd0 origin/main --
.claude/skills/pm-dispatch/ .claude/agents/os-dev.md AGENTS.md` is empty
(15:15:22Z) — no governed file moved; the merge-base is still
`99edfd008e`.
**P5 — holds.** 〈模板与表〉 :799–:811 (read 14:57:13Z) carries `Claim: PM
loop round N`, `Branch: …`, `Clause-②: yes | no` each on its own line at
column 0. The template is untouched.
## Gates — this tree, `4c91f60ef2`
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (no paths; changeset from merge-base
`99edfd008`: committed 1, working tree 0, untracked 0 —
`.claude/skills/pm-dispatch/SKILL.md`) derived **16** commands. Each run
in the foreground, exit captured by redirect-then-`$?`:
| command | exit |
|:--|--:|
| `node scripts/check-closing-keyword-parity.mjs` | 0 |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 |
| `node scripts/check-comment-mask-corpus.mjs` | 0 |
| `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
3 → 0 (see below) |
| `pnpm check:agent-test-spelling` | 0 |
| `pnpm check:doc-authoring` | 0 |
| `pnpm check:driver-memory-census` | 0 |
| `pnpm check:nul-bytes` | 0 |
| `pnpm check:pm-governed-merges` | 0 |
| `pnpm check:pm-governed-prose` | 0 |
| `pnpm check:pm-skill-id-lint` | 0 |
| `pnpm check:pm-skill-ratchet` | 0 |
| `pnpm check:refd-timer-probe` | 0 |
| `pnpm check:skill-frame-sync` | 0 |
| `pnpm check:watch-hint-literal` | 0 |
`check:doc-formula-expressions` first exited **3** — 「PREREQUISITE NOT
MET — the workspace package `@objectstack/formula` is not built …
Nothing was measured」 — not a reading. Built `@objectstack/formula` and
`@objectstack/lint` under `scripts/pm/os-verify-lock.sh` (「VERDICT
command-exit 0 · held the lock 219s (3m39s) · waited 0s」), rerun →
**exit 0** at 15:13:30Z.
`--ran` reconciliation (15:15:20Z): 「Run reconciliation — 16 derived, 16
run, 0 NOT-MEASURED, 0 UNRUN.」 … 「✓ dispatch-gates --ran: 16 derived
famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all
16 recorded an exit code and none of them is 3).」
Post-edit ratchet (`pnpm check:pm-skill-ratchet` exit 0, 15:08:39Z):
「.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom
0)」, 「widest table row is 342 bytes (pin 342; headroom 0)」. `pnpm
check:skill-frame-sync` exit 0: 「the one declared copy of the decision
frame is internally coherent」. `pnpm check:pm-skill-id-lint` exit 0: 「27
file(s) clean」 — the new lines cite no card number. `pnpm
check:nul-bytes` exit 0; the control-character self-scan of SKILL.md →
no hits.
Not derived, not run: `pnpm lint` (repo-wide eslint, CI-owned; markdown
is outside its population) and `docs:check-links`. Not run: `pnpm test`
/ `pnpm typecheck` — the diff touches no package.
Changeset: none. `.claude/**` publishes nothing (fast lane: no `files[]`
of any released package ships it). No label is written from this
container.
## 维护者速读(草稿)
- 改了什么/为什么改:认领评论里 `Clause-②:`(连同
`Claim:`、`Branch:`)必须各自独占一行、写在行首,因为条款②入队闸门只读认领评论、只按行首读键——写进派发令的句子里或另发一条评论,闸门都读不到,卡就不可读。模板不变、脚本不变,只把规则层这三行改成
3→3(812/812 不动)。
- 风险与代价(含回滚)/席位意见/你要做的:零运行时影响,纯规则文本,回滚即 revert 本 PR 的一个
commit;席位意见:(留空,席位定稿成评论);你要做的:授权审批后由席位落地(裁决 C)。
## Acceptance notes
- Governed rules layer: this PR is a DRAFT and stays one. Ruling C
(#17971) 「C. approve 后不管后续改动都由席位落地:」 governs the landing — the seat does
the four-piece after an authorized approval; nothing here is readied,
enqueued, auto-merged, approved or labelled from the dev container.
- P2's literal claim (the checker does not read `Branch:`) was falsified
by the tree (above) and reported as a mechanism-assumption correction;
the ruling's direction was kept and the "why" written so it is true of
all three keys.
- P1's predicted grep count was 0; measured 5 — none a rule on the claim
form (each hit read above).
- noted, not filed: `references/platform-readings.md` :350–:351 already
carries the checker-axis reading the new :473 agrees with; no drift,
nothing to file. 承接者:无.
- #17497 (same file) stays queued behind this PR; #17098 remains open
and its reader tolerance is untouched.
- Line-count payment: the 3→3 replacement pays its density inside the
same subsection by merging old :473 and :474 — no re-wrap, no line
elsewhere touched.
Clause-②: no
---
_Generated by [Claude
Code](https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8)_
Co-authored-by: Claude <noreply@anthropic.com>
1 parent d285bf0 commit af3add1
1 file changed
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
469 | 469 | | |
470 | 470 | | |
471 | 471 | | |
472 | | - | |
473 | | - | |
474 | | - | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
475 | 475 | | |
476 | 476 | | |
477 | 477 | | |
| |||
0 commit comments