Skip to content

docs(pm-dispatch): hotcrm lane charter grades at first touch per the single-lane rule - #24521

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-24517-hotcrm-charter-grading
Oct 19, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-24517-hotcrm-charter-grading

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24517

Clause-②: no

What this changes

Two lines of .claude/skills/pm-dispatch/references/lanes/hotcrm.md, and nothing else in the PR:

@@ line 8 @@
-- ⛔ 不产 `domain:*`、type 与定级,纪律全文在 SKILL.md 多仓协调规则 4。
+- ⛔ 不产 `domain:*`;机械三务(含首触定级)按 cross-repo-coordination.md 单车道仓条自理。
@@ line 33 @@
-- 投机功能形状不入队:走决策箱或关 not planned;定级归分诊或维护者,本席只供证据。
+- 投机功能形状不入队:走决策箱或关 not planned;定级按 filing-gate.md,理由落卡,维护者可否决。

Ruling and 口径

How each line meets the card

  • :8 points at the single-lane-repo clause of cross-repo-coordination.md, which is its lines 9 and 10: 「单车道仓 repo:* 席自理机械三务,⛔ 不产 domain:*」 and 「机械三务 = 自扫 sweep、自打 type、自做 finding 首触定级」.
    • It keeps 「⛔ 不产 domain:*」, and it no longer says the seat produces no grade.
    • The dead pointer 「SKILL.md 多仓协调规则 4」 is gone.
    • type is not named on the line. It reaches the seat through the pointer, because 「机械三务」 includes 「自打 type」.
  • :33 keeps the speculative-shape half verbatim. It replaces 「定级归分诊或维护者,本席只供证据」 with three things: grading by filing-gate.md (its 〈定级判据〉 section starts at its line 34), the reason posted on the card, and the maintainer's veto.
  • The byte budget forced one split. The full sentence 「首触按 filing-gate.md 定级判据定级,理由落卡,维护者可否决」 after the kept half measures 141 bytes, and the line rule allows 120. The file is also at 53 of 53 lines, so no line could be added.
    • So "first touch" rides on :8 as 「机械三务(含首触定级)」.
    • :33 carries the criterion, the reason on the card and the veto, at exactly 120 bytes.

Acceptance notes (out of scope, not changed)

  • lanes/hotcrm.md:51 reads 「domain:* 与 type 留给分诊」. It still differs from the single-lane rule on type, and after this PR it also differs from what :8 points at. The 口径 excludes it, and the card body records it. Carrier: the card body.
  • cross-repo-coordination.md:37 (its rule 4) reads 「分诊座位唯一生产:定级/路由/type/查重/shadow/duplicate_of;执行席永不定级或路由裸卡」, with no single-lane-repo carve-out.
    • Its lines 7 to 10 scope central triage to the multi-lane repos, and they give first-touch grading to the single-lane repo:* seat.
    • The specific clause governs a hotcrm card, so the two files agree on who grades one. The general sentence is unscoped text.
    • Not filed: it is a text-drift observation. Carrier: none.

Verification, at head d4c8bb3ae

  • Acceptance grep: grep -c '多仓协调规则' .claude/skills/pm-dispatch/references/lanes/hotcrm.md answers 0 (exit 1). The control word 单车道仓 in the same file answers 1 (exit 0).
  • Line budget:
    • 53 lines before and 53 after, against a ceiling of 53: ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/hotcrm.md is 53 lines (ceiling 53; headroom 0).
    • :8 went from 89 to 108 bytes, and :33 from 110 to 120 bytes.
    • The 120-byte line rule, read from the ratchet's own lengthVerdict: lanes/hotcrm.md: every line is within 120 bytes (or structurally exempt).
  • Derived gate list: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack gave 17 commands. Each exit code was captured before any pipe, and all 17 exited 0.
    • --ran reconciliation: ✓ dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3).
    • check:pm-skill-id-lint: ✓ check-skill-id-lint: 87 file(s) clean (pattern /#[0-9]{3,}/g).
    • check:pm-skill-ratchet: exit 0. check:skill-frame-sync: exit 0. check:nul-bytes: exit 0.
    • check:doc-formula-expressions first refused with PREREQUISITE NOT MET (exit 3), because @objectstack/formula and @objectstack/lint were not built. After turbo run build --filter=@objectstack/formula --filter=@objectstack/lint under the verify lock (exit 0, 4 of 4 tasks cached), it re-ran at exit 0.
    • The derivation also names pnpm check:pm-settings-deny-roster as a roster under .claude. It ran at exit 0.
  • Changeset: none. .claude/** publishes nothing, so skip-changeset is declared with this PR's create.
  • No ablation: a text change to an agent protocol file pins no tested behaviour.

维护者速读(草稿)

  • 改了什么:hotcrm 车道岗位说明里的两行字。
    • 第 8 行删掉指向已不存在章节的死链,改为指向 cross-repo-coordination.md 的单车道仓规则,仍写明本席不产 domain:*。
    • 第 33 行把「定级归分诊或维护者,本席只供证据」改为本席按 filing-gate.md 定级,理由落卡,维护者可否决。
  • 为什么改:您在 hotcrm#2178 裁了 A,即 hotcrm 席首触自己定级。旧文本仍禁止它定级,还指向一个早已搬走的章节,席位照旧文本做事就会违背裁决。
  • 风险与代价(含回滚):纯文字,只动内部协议文件,不发布任何东西。第 51 行在 type 上与单车道仓规则仍不一致,口径明令排除,卡正文已记录。回滚即 revert 本 PR。
  • 席位意见:
  • 你要做的:无需操作。本 PR 属 Tier S,由席位达档复核后入队落地。

Generated by Claude Code

…single-lane rule

Line 8 drops the dead pointer to a SKILL.md section that no longer exists and
points at the single-lane-repo rule in cross-repo-coordination.md, keeping the
no-domain-label prohibition. Line 33 replaces "grading belongs to triage or the
maintainer" with grading by filing-gate.md, reason on the card, maintainer veto.
Line-neutral: 53 lines against the 53-line ceiling.

Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 19, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Oct 19, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review October 19, 2026 14:28
@os-zhuang
os-zhuang enabled auto-merge October 19, 2026 14:28
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit 2667e24 Oct 19, 2026
39 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-24517-hotcrm-charter-grading branch October 19, 2026 14:45
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿,事后记录)· PR #24521 · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-19T23:04Z

  • 改了什么: hotcrm 车道岗位说明两行。第 8 行删掉指向已不存在的「SKILL.md 多仓协调规则 4」的死链,改指 cross-repo-coordination.md 的单车道仓规则,仍写明本席不产 domain:*,不再说本席不定级。第 33 行把「定级归分诊或维护者,本席只供证据」改为按 filing-gate.md 定级、理由落卡、维护者可否决。
  • 为什么改: 您在 hotcrm#2178 裁了 A:hotcrm 席首触自己定级。旧文本仍禁止它定级,席位照旧文本做事会违背裁决。
  • 风险与代价(含回滚): 纯文本,不发布。第 51 行(「domain:* 与 type 留给分诊」)在 type 上仍与单车道仓规则不一致,口径明令本 PR 不碰,卡正文已记录。回滚 = revert 一个提交。
  • 席位意见: 接受。两行都在 120 字节行预算内落地,文件仍 53 行;「首触」落在第 8 行、判据与否决落在第 33 行,是预算下的合理拆分。第 51 行的 type 分歧是下一张卡的事,若您愿意一并改,一句话即可。
  • 你要做的: 无。已由 os-zhuang 批准并经队列合并。

席位核对

  • 形态: draft、base main、首行 Fixes #24517、行首 Clause-②: no、assignee os-justin、skip-changeset 随创建同笔;1 文件 +2/−2;正文闭合关键词只有首行一处,hotcrm#2178 旁无动词。
  • 前提实测(席位,origin/main f4755a68a): 第 8、33 行原文如卡所引;git grep -c '多仓协调规则' -- SKILL.md 为 0(对照 路径分叉 为 2);cross-repo-coordination.md:9-10 载单车道仓规则;filing-gate.md:34 起为〈定级判据〉。分支 tip 上实测:第 8 行 108 字节、第 33 行 120 字节、文件 53 行,与报告一致。
  • 门禁 check-runs(head d4c8bb3ae,2026-10-19T11:46Z): 38 条,26 success、12 skipped、0 failed、0 in_progress;check-expected-skips --pr 24521:OK,12 skipped 全在名单。dev 本地 17 条派生门禁全 0,--ran 17/17。check-governed-merges --pr 24521:GOVERNED,Tier S,4 行。
  • 接受的偏差: 「首触」与「定级判据」拆到两行(第 33 行指文件名不指节名);第 8 行文件名无反引号,随同文件第 3 行拼法;doc-formula-expressions 首跑 exit 3 为前置未建,补建后 0。
  • 范围外去向: 第 51 行 type 分歧 —— carrier 卡正文,口径排除;cross-repo-coordination.md:37 规则 4 无单车道仓 carve-out 的文本漂移 —— 记座位贴 Carried pointers,不立卡(非三类)。
  • 落地条款与实际落地: Tier S。本席派出的隔离 CONTRACT_REVIEW_TIER 复核子代理在 2026-10-19T11:50Z 前后撞上账号周额度墙(HTTP 429,resets 23:00Z),未落任何记录;本席会话同时停摆。其间 os-zhuang(GOVERNED_APPROVERS 账户)APPROVED 本 head(review 5573080948),翻 ready、挂 auto-merge、入队,队列于 2026-10-19T14:45Z 合并为 2667e2402。按 SKILL.md 〈路径分叉〉②,授权账户的批准与合并即审核记录;本记录为事后补录,⛔ 不是第二次放行。

ACCEPT


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review — PR #24521 (card #24517) · 2026-10-19T23:27Z

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: d4c8bb3ae35b4eec6c80d3ab6ab9ab872396fc2e
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/lanes/hotcrm.md + .claude/skills/pm-dispatch/references/cross-repo-coordination.md, .claude/skills/pm-dispatch/references/filing-gate.md

Isolated contract review, written after the fact: this head merged as 2667e2402 on an authorized approval before any record of this shape existed, and the maintainer asked for the re-review in so many words (「两张 PR 你可以重新复审」). Inputs: card #24517's body and all four comments, the PR body, its file list and net diff against main at this head, the 40 check-runs on the head, the director's ledger comment 6265393657 (batch #371, item 3), and the governed file plus the two files its new lines cite, read at the head and at its parent f4755a68a. Nothing built, run or re-run.

① Derived judgments

Judged against the ruling hotcrm#2178 「A」 as the card quotes it and the ledger carries it, and the 口径 verbatim from 6264888052: 「the skills lane opens one text PR on lanes/hotcrm.md:8 and :33 (pointer to cross-repo-coordination.md, the grading sentence aligned), ⛔ nothing else in that PR.」

  • Diff extent — right. One file, 2 insertions, 2 deletions: lines 8 and 33 of lanes/hotcrm.md and nothing else. The pre-image at the parent reads exactly as the card quotes both lines. 53 lines before and after, on a 53-line ceiling with zero headroom; line 8 goes from 89 to 108 bytes and line 33 from 110 to 120, both inside the 120-byte cap the ratchet enforces. 多仓协调规则 occurs 0 times in the file at the head, and 0 times in SKILL.md at the parent, so the pointer it replaces was dead exactly as the card says.
  • Line 8 — right. 「- ⛔ 不产 domain:*;机械三务(含首触定级)按 cross-repo-coordination.md 单车道仓条自理。」 The pointer now names the single-lane clause, cross-repo-coordination.md:9-10 (「单车道仓 repo:* 席自理机械三务,⛔ 不产 domain:*」 and 「机械三务 = 自扫 sweep、自打 type、自做 finding 首触定级」), which is the rule the ruling applied. The domain:* prohibition survives because the clause itself keeps it. The no-grade clause is gone, as the card requires. The old line's type prohibition goes with it, by implication: a line that forbids type and in the same breath delegates 机械三务, which includes 自打 type, would contradict its own pointer, so dropping it is the alignment the ruling orders, not a widening. The file name is spelled without backticks, matching line 3 of the same file.
  • Line 33 — right, as a declared split. 「- 投机功能形状不入队:走决策箱或关 not planned;定级按 filing-gate.md,理由落卡,维护者可否决。」 The speculative-shape half is byte-identical to the old line. The grading sentence carries three of the card's four elements: the criterion (filing-gate.md, whose 〈定级判据〉 section opens at its line 34 and is the only grading criterion in that file), the reason on the card, and the maintainer's veto. The fourth, first touch, rides on line 8 as 「含首触定级」. I measured the alternatives: the card's full wording behind the kept half is 139 bytes (the dev measured 141 with its own spelling), and the shortest variant that still names the section is 133; the cap is 120 and the file has no spare line. The split is the only shape that satisfies the 口径 (nothing else changes) and the ratchet at once. Read together, the two lines say what the card asks: the seat grades at first touch by filing-gate.md, posts the reason on the card, and the maintainer can veto.
  • Who grades a hotcrm card — the two files agree. lanes/hotcrm.md:8 defers to the single-lane clause; the clause gives first-touch grading to the repo:* seat; the triage seat's comment on the card records the same reading from its side. Acceptance met.
  • Accept-set and public surface — none. .claude/** is the internal protocol tree: no package, schema, REST route, CLI flag, doc page or published skill changes. The governed register maps the path to Tier S, the tier this record serves.
  • Gates — all green on this head. 40 check-runs: 28 success, 12 skipped by the path filter, 0 failure. Lint · repo & tooling gates, the job that runs check:pm-skill-ratchet and check:pm-skill-id-lint, succeeded; so did every other lint, type-check and test job, Check Changeset, Check Documentation Links, and both runs of Governed Surface Queue Guard. The conclusions are the verdicts; nothing was re-run here.
  • Card acceptance, item by item. Grep answers 0 — met. The two files agree on who grades — met. The PR body quotes the ruling (6265194393) and the 口径 (6264888052) — met. Line ratchet and id-lint pass — met by the check-runs.

② Semver level

  • Clause-②: no, no arm, with the skip-changeset label — right. The diff publishes nothing from any released package, which is exactly the case AGENTS.md reserves that label for; Check Changeset is green; no migration text is owed.
  • Commit d4c8bb3ae carries the model-free trailer pair; the PR body carries the session-URL footer and no model identifier — right.

③ Boundary flags

open_questions is empty. Every dev deviation and out-of-scope finding, answered:

  1. 首触 on line 8, the criterion on line 33 — answered in ①, accepted: the PR body states the split and the pair of lines carries all four elements.
  2. type not named on line 8 — accepted: it reaches the seat through the pointer, and naming it would reopen the byte budget the ratchet closed.
  3. check:doc-formula-expressions exit 3 then 0 — a missing prerequisite build, not a finding; CI ran the family green.
  4. Families not run locally (check:skill-frame-freshness, check:dev-prereqs, test:repo) — the diff reaches none of their inputs and the head's check-runs cover the CI-owned one. Accepted.
  5. Attribution trailer — the dev followed AGENTS.md over the harness reminder; that is the repo's rule, and reporting it was right.
  6. Worktree cleanup — housekeeping, nothing to judge.
  7. lanes/hotcrm.md:51 「domain:* 与 type 留给分诊;催办不代裁」 — the 口径 excluded it, so leaving it was right. The cost is real and new, though: before this PR lines 8 and 51 agreed with each other and both disagreed with the single-lane clause; after it, line 8 defers to a clause that gives the seat type while line 51 still reserves type for triage, so the file now disagrees with itself on type. The card recorded this, but the card is closed, so no live carrier holds it. Escalated to the seat: file the follow-up card for line 51 (one line, line-neutral, under the same ruling), per 「已落地工作欠的后续照立卡」. Not a defect of this PR.
  8. cross-repo-coordination.md:37 「分诊座位唯一生产:定级/路由/type/查重/shadow/duplicate_of;执行席永不定级或路由裸卡」, unscoped, in the same file whose lines 9-10 give the single-lane seat first-touch grading; and filing-gate.md:26-27, which assigns 首触 of a missing-item card to 分诊 with no single-lane qualifier. Pre-existing text, outside the 口径, and the specific clause governs a hotcrm card, so neither blocks this PR. Escalated to the seat as a carrier decision, not left at 「carrier: none」: either one card for a one-clause carve-out on rule 4 (and the 首触 line), or a seat-post note that the single-lane clause is the specific rule.
  9. Landing order, for the audit trail. The merge (2667e2402) landed on an authorized approval, which the queue guard accepts for a governed diff on its own; this is the first ## Contract review record on this head, written at the maintainer's request after the landing. The record confirms the landing and does not re-judge the approval route.

Implemented-by: claude/issue-24517-hotcrm-charter-grading
Reviewed-by: session_01HEdP5tPhqQfzwRmKDxwn85

VERDICT: PASS


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants