Skip to content

Commit af3add1

Browse files
claude[bot]claude
andauthored
docs(pm-dispatch): the claim comment carries the clause-② line at the start of its own line — the enqueue gate reads that comment only (#17800) (#18208)
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

File tree

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
469469
- 同笔 `Release:` 行点名已落项与余项去向;余项需换道/拆分加 `pm:retriage`,自队列重新认领。
470470
- 派发前按序执行原子对:① Assign @me,并把 `pm:dispatched` 与摘 `pm:queue` 放进同一次标签写入。
471471
- step ① 之后获得 assignee 的直接弃出本批。
472-
- ② 认领评论(英文),固定形状见 模板与表 节;首行以字面 `Claim:` 开头是机器判据。
473-
- 巡查谓词只认 `Claim:` 这一个拼写且保持严格,修法是全舰队向它收敛,⛔ 不放宽谓词。
474-
- session ID 不可省;`mode:subagent` 的 dev 与 PM 同会话同 ID,甄别身份是分支。
472+
- ② 认领评论(英文)照抄 模板与表 节:`Claim:` 首行,`Branch:`、`Clause-②:` 各占一行且行首。
473+
- 条款②入队闸门只读认领评论且只读行首键:句中提及与另发评论皆读不到,卡即不可读。
474+
- 谓词保持严格、⛔ 不放宽;session ID 不可省,`mode:subagent` 下 dev 与 PM 同 ID,身份看分支。
475475
- `Clause-②: yes | no` 恰这两种拼写,恒英文机器判据;判据:本卡放宽接受集或扩大公开面吗。
476476
- Container & model 行的档位引当次 `node scripts/pm/dispatch-gates.mjs --tier <paths>` 输出,⛔ 不凭记忆。
477477
- 末行 Serial constraints cleared 是落在评论里的读数,同包在飞单不点名等于没查。

0 commit comments

Comments
 (0)