Skip to content

Commit 681317c

Browse files
claude[bot]claude
andauthored
docs(pm-dispatch): a triage direction landing in an adjudicated area quotes the governing line (#18256)
Fixes #17497 One rule line in 〈分诊座位职责〉 of `.claude/skills/pm-dispatch/SKILL.md`: a triage grading whose direction lands inside an adjudicated area (an ADR, a ruled card, a not-re-adjudicable rule) pastes the governing line — the `Prior rulings read:` line that `check-prior-rulings.mjs` prints — or names no target. Triage keeps writing directions (「写方向」 is charter text); the line binds the direction's evidence, never removes the direction. Governed surface (`.claude/**`, rules layer): draft, no reviewer requested, no ready flip — the skills seat hangs the four-piece and the maintainer lands it. REGION claim :306–:415 only; PR #18242 holds :172–:185 and PR #18250 holds :645–:646 on the same file and neither range is touched here (the seat merges `origin/main` at landing). ## The added line (SKILL.md :339 on the head, 120 bytes) ```text - 方向落在 ADR/已裁卡/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。 ``` Vocabulary is the corpus's own: 「已裁卡」 (SKILL.md 〈家族派发〉), 「不可重裁」 (〈派发词三分区〉), 「落点」 = the named fix target (〈分诊座位职责〉's `pm:queue` definition). The tool is cited by file name and the paste line by its literal prefix — no issue or PR number (`check:pm-skill-id-lint` green). **Placement (P2, chosen by reading the section's order):** directly under the line that mandates the direction — 「裁定写方向、给六态之一」 (:338 on the head, :339 on `origin/main`). That is where 「写方向」 actually lives on this tree: `references/lanes/triage.md` is 7 lines and its :7 is the half-state rule, so the grading's citation of 「写方向」 at `triage.md :7` is stale as a location while its substance holds. The English audit comment line (`Triage: lands in …; rationale: …`, :364 on the head) was the alternative; it names the artifact the direction is written into, but the obligation reads best beside the mandate it qualifies, and 「方向」 is anchored by the preceding line there. **P1 confirmed by a live run** (`node scripts/pm/check-prior-rulings.mjs --card 17497`, exit 0) — the tool printed exactly the shape the line cites: ```text Prior rulings read: triage,gradings,named,target,governing,itself,rejects,grading,quotes,line,adjudication,routes → 61 hits; ADR-0129 D4, ADR-0067 D3, ADR-0076 D11, ADR-0006 D2, ADR-0020 D2, ADR-0021 D1 ``` `formatPasteLine` (`check-prior-rulings.mjs`) prints `Prior rulings read: TERMS → N hits; ADR-xxxx Dn|none` and the whole-line form `Prior rulings read: unresolved` when the search did not run; `check-half-states.mjs` H62 reads the same key (`PRIOR_RULINGS_KEY`), and `references/decision-analysis.md` already binds that line for decision cards. ## Payment (P3, measured) — one adjacent pair inside the region rewritten tighter Before (`origin/main` :311 + :312, 89 B + 50 B): ```text - fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:` 形式。 - 判定本轮有活之后才加载其余工具。 ``` After (head :311, 116 B): ```text - fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。 ``` Nothing operative is lost: every instruction token survives — `fire 开局`, `只按名加载`, `互斥检查所需工具`, `ToolSearch`, `select:`, `判定本轮有活`, the ordering `才加载其余` — and the three dropped words are filler (「形式」 names the code span it follows; 「之后才」 → 「才」 keeps the only-after ordering; 「其余工具」 → 「其余」 in a line whose subject is tool loading). The PM's measured pairs (:312+:314, :363+:364, :397+:398) all rewrite past 120 B; this is the pair that fits. Not a re-wrap (no line-joining bought the budget), no rule deleted, ceiling untouched. ## Reverse verification (on head `c96b507d`) - `git diff origin/main -- .claude/skills/pm-dispatch/SKILL.md`: two hunks, `@@ -308,8 +308,7 @@` (the fold) and `@@ -337,6 +336,7 @@` (the insert) — both inside :306–:415; no other line moves. - `wc -l` = 812 (ceiling 812, headroom 0 — the ratchet's own line: `.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)`). - `sed -n '734,755p' | md5sum` = `3327d02c56f8a0eca88569dad2270f32` (frame block byte-identical). - an `awk` length scan for lines longer than 120 bytes over :306–:415 prints nothing; touched lines measure 116 B (fold) and 120 B (new). - Positive anchors: `grep -c 'Prior rulings read:'` = 1; the removed :312 text = 0 hits; the fold text = 1 hit. ## Gates (derived, run in the foreground, exits captured before any pipe, reconciled with `--ran`) `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set derived off merge base `cb648cb1`) → 16 commands; `--ran` verdict: `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)`, exit 0. | 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` | first run exit 3 `PREREQUISITE NOT MET` (unbuilt `@objectstack/formula` / `@objectstack/lint`) — built both under `os-verify-lock.sh` (`VERDICT command-exit 0`), re-ran: 0 | | `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 (`2 instruction surface(s) name all 5 registered governed surfaces`) | | `pnpm check:pm-skill-id-lint` | 0 (`27 file(s) clean`) | | `pnpm check:pm-skill-ratchet` | 0 (812/812) | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:skill-frame-sync` | 0 (`the one declared copy of the decision frame is internally coherent`) | | `pnpm check:watch-hint-literal` | 0 | Extra, outside the roster: `node scripts/check-skill-frame-freshness.mjs --self-test` exit 0 and `--no-fetch` exit 0 (`the decision frame in this tree is current with refs/remotes/origin/main`). The roster did not derive `check:pm-dispatch-gates`, so no detached run was owed. Full repo-level scans (`pnpm lint`) belong to CI. `skip-changeset`: `.claude/**` is published by no package's `files[]` (fast track) — nothing released moves. ## Acceptance notes - noted, not filed: the grading's location citation for 「写方向」 (`lanes/triage.md :7`) is stale — that file's :7 is the half-state rule and the charter text lives at SKILL.md :339 on `origin/main`; the ruling's substance is unaffected. 承接者: the skills seat, at landing of this PR. - noted, not filed: the dispatch names a gate `check:pm-skill-frame-sync`; the script's real name is `check:skill-frame-sync` (`scripts/check-skill-frame-sync.mjs`), and it ran green. 承接者: the dispatching PM seat, via this report. - noted, not filed: the ratchet header's reading 「of the file's 601 adjacent bullet pairs ZERO merge under the 120-byte cap」 was a pure-join measurement on an earlier tree; on this tree one pair folds at 116 B as a tighter rewrite. Not a contradiction of that reading and not a defect. 承接者:无. ## 维护者速读(草稿) **改了什么**:分诊座位职责里加一行:分诊的方向若落在 ADR、已裁卡或不可重裁规则内,须贴 `check-prior-rulings.mjs` 印出的 `Prior rulings read:` 行,否则不点落点。为了不突破 812 行上限,把开局工具加载的两行合成一行(116 字节),每条指令原样保留。 **为什么改**:两次分诊给出的落点恰是治理文本已经拒绝的拼写或形状(一次是字段 schema 拒收的扁平拼写,一次是标记为不可重裁的通则),都在执行席的围栏才被拦下,其中一次派发令已写出。分诊的推理没错,错在落点没有引治理行,所以看不见。决策卡那边已有同一行的约束,这次把它也绑到分诊评级上。 **风险与代价(含回滚)**:一行规则、一次同义压缩,不动上限、不删规则、不改工具。风险是新行 120 字节写得紧,读者需要认得 `check-prior-rulings.mjs` 这个工具(它已在仓内、有自检)。回滚 = revert 本 PR 一次提交。 **席位意见**:(留空,席位定稿成评论) **你要做的**:确认这条规则的措辞与落位(放在「裁定写方向」那一行之下);同意即批准本 PR,由席位落地。 --- _Generated by [Claude Code](https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 41ff021 commit 681317c

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
308308
- sweep 与首触定级只对多车道仓,单车道仓机械三务自理。
309309
- 发版板(无板仓跳过)、查重/shadow 检查与代裁通道全仓照跑。
310310
- 代裁只由维护者召唤的总监席产出,⛔ 永不凭自述、⛔ 无子代理裁决。
311-
- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:` 形式。
312-
- 判定本轮有活之后才加载其余工具。
311+
- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。
313312
- ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。
314313
- 工具加载纪律只约束分诊 fresh session 的开局;执行座位与 dev 不受约束。
315314
- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。
@@ -337,6 +336,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
337336
- bump 单单张封顶:先查同题 open 单,已有就追评刷新;工具链新形态只提请不扩面。
338337
- 分类动作每张三选一,外加一个修复通道。
339338
- ⛔ 不挂 `needs:contract-review`:随 draft PR 或 `Clause-②: yes` 认领;裁定写方向、给六态之一。
339+
- 方向落在 ADR/已裁卡/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。
340340
- `pm:queue` = 有具名落点或复现的具体缺陷,或范围明确的工具/门禁修复,无可问之事。
341341
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
342342
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。

0 commit comments

Comments
 (0)