Skip to content

docs(pm-skill): record the spec lane's ledger-append class pre-approval; give the hotcrm lane a patrol criterion it can satisfy - #12101

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-11368-lanes-facts
Aug 25, 2026
Merged

docs(pm-skill): record the spec lane's ledger-append class pre-approval; give the hotcrm lane a patrol criterion it can satisfy#12101
hotlong merged 1 commit into
mainfrom
claude/issue-11368-lanes-facts

Conversation

@claude

@claudeclaudeBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Closes#11368, closes#11516.

Two lane-file facts, folded into one PR because both are one-bullet recordings into
ceilinged files. Gate union re-run at the final commit 922ee8f9; no changeset (this
diff is .claude/** only and publishes nothing — skip-changeset applied).

Per item

落点beforeafter
references/lanes/spec.md 常设承诺 (#11368)no ledger-append rule at all — git grep -n "ledger" lanes/spec.md = 0 hitsone bullet carrying the class pre-approval, its three conditions and the out-of-class boundary (4 lines)
references/lanes/hotcrm.md 常设承诺 (#11516)nothing about the patrol; SKILL.md's execution-seat first criterion applies unqualified and is unsatisfiable in that repoone bullet recording the measured absence, the vacuous step, and the manual half a hotcrm seat reads instead (4 lines)
lanes/spec.md ceiling46 lines (headroom 0)46 lines (headroom 0) — not raised
lanes/hotcrm.md ceiling57 lines (headroom 0)57 lines (headroom 0) — not raised

#11368 — the pre-approval line

The card's drafted text, landed with its substance intact and rendered in the file's own
idiom (the lane files are Chinese prose; the draft already ended in it). Written
id-free on purpose
: check:pm-skill-id-lint scans every .md under
.claude/skills/pm-dispatch/ with /#[0-9]{3,}/, so the card's suggested precedent-PR
citation could not be included — the rule stands on its own conditions instead, which is
what that gate exists to enforce.

Not incorporated, and deliberately so: the engine seat's comment on the card suggests the
lane file state the test ("does this defect give a consumer a branch it could act on
differently?") rather than only the permission. That would extend the spec seat's ruling
rather than record it, and this card is a recording card — filed separately as #12100 so
it outlives this card.

#11516 — premise moved while the card sat, and the sweep result

The line the card names is already gone.lanes/hotcrm.md no longer opens 常设承诺
with the patrol-anchor sentence: PR #11393 (6d35509, 2026-08-24) deleted that sentence
from all seven lane files after hoisting one copy into SKILL.md 执行座位职责. The
card's own grading comment recorded "all 7 lane files reference the patrol (measured
today)" — that reading was against a stale tree; on origin/main
grep -rn "half-state-patrol" .claude/skills/pm-dispatch/references/lanes/ returns zero.

So the sibling sweep the card asked for has a different answer than expected: it is
not "six siblings point at repos where the patrol runs" — it is no lane file carries the
sentence at all
. The duty now lives once, in SKILL.md 执行座位职责 (plus the H17 index
read in 派发前必查), and it binds execution seats unconditionally.

The defect therefore survived the deletion, just relocated: a hotcrm seat reading
SKILL.md still meets a ⛔-carrying first criterion it cannot clear. This PR settles that
for the hotcrm seat at the place the grading named — in the lane file, by
recording the repo fact and naming the readable substitute — and does not touch
SKILL.md, whose wording covers objectstack/objectui seats too, where the patrol does
run. Provisioning the patrol in hotcrm stays declined per the grading.

Measurement, re-run today rather than assumed: objectstack-ai/hotcrm at HEAD holds 14
workflows (changeset-check, ci, code-quality, codeql, deploy-docs, docs-app,
e2e, label-sync, labeler, link-check, publish-production, publish-staging,
release, stale) and no half-state-patrol.yml — read from a fresh clone, since
this session has git read but no GitHub API access to that repo. The anchor-issue half
(tracking-labelled open issues = 0, with the unfiltered control at 86) is the card's
2026-08-24 measurement, not re-run here; the landed text rests on the workflow reading and
states the inference explicitly (无 workflow 即无锚 issue). The already-fixed changeset
paragraph is untouched.

Paying for both bullets — the compression arithmetic

Both files sit at headroom 0, so eight added lines were bought back. Every other change in
this diff is a re-wrap produced by the ratchet's ownwrapLine export, so the wraps
are the canonical form the gate would produce and move whitespace only.

lanes/spec.md: +4 (new bullet) −4, from
(a) 一般开发工具面留 devx bullet re-wrapped 2→1;
(b) fixture-triage bullet re-wrapped 3→2;
(c) 候选卡评论必读 bullet: dropped 「看起来」, 2→1;
(d) 派发前触发文件 bullet: dropped the trailing 「跨仓 pin 滞后读法在 SKILL.md 多仓协调」
clause, 2→1. That clause was a bare signpost whose destination is still signposted twelve
lines above it in the same file (「判据见 SKILL.md 多仓协调」 on the objectui bullet), so
the pointer survives the cut.

lanes/hotcrm.md: +4 (new bullet) −4, from
(a) header paragraph re-wrapped 4→3;
(b) 双版本兼容 bullet re-wrapped 5→3;
(c) 依赖是已发布的 bullet: dropped the connective 「因此」, 3→2.

Proof that nothing else moved: with all whitespace stripped, the two files differ from
origin/main by exactly the two inserted bullets and the three declared deletions
(「看起来」, the pin-lag clause, 「因此」) — nothing else, in either file.

Checks run (verdict lines as each gate printed them, at 922ee8f9)

Derived with node scripts/pm/dispatch-gates.mjs (no paths passed — it reads its own
change set), which named eight families for this diff. All eight green:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/spec.md is 46 lines (ceiling 46; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/hotcrm.md is 57 lines (ceiling 57; headroom 0).
✓ check-skill-id-lint: 22 file(s) clean (pattern /#[0-9]{3,}/g).
✓ check-nul-bytes: OK (scanned 6711 text file(s) -- 6711 tracked, 0 untracked-not-ignored; skipped 6 binary; no raw ASCII control bytes).
✓ doc authoring guard: 389 files clean — no bare metadata literals.
✓ check-governed-merges --self-test: 129 assertions
✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 421 files / 1449 TS blocks judged clean by @objectstack/formula.
✓ check:skill-frame-sync … binding sentence present in all 4; 4 count mention(s) agree; 42 markdown files scanned for undeclared copies.
✓ check:agent-test-spelling (sweep clean; non-vacuity carried by --self-test)

Exit codes were captured before any pipe (cmd > file 2>&1; EXIT=$?), not read through
tail.

Governed surface ⇒ draft, human merge. Not marked ready.

Generated by Claude Code


Generated by Claude Code

…al, and give the hotcrm lane a patrol criterion it can actually satisfy
Two lane-file facts, both paid for by compression inside the existing
ceilings (46 / 57, neither raised).
- lanes/spec.md: the gate-mandated cross-lane error-code ledger append is
pre-approved as a class, with the three conditions and the out-of-class
boundary the spec seat ruled on its seat post. Written id-free because
check:pm-skill-id-lint bans /#[0-9]{3,}/ under .claude/skills/pm-dispatch.
- lanes/hotcrm.md: record that the half-state patrol has no carrier in that
repo (measured today) and name the manual half a hotcrm seat reads instead,
so SKILL.md's execution-seat first criterion stops being unsatisfiable
there. The already-corrected changeset paragraph is untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 25, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 25, 2026
@hotlong
hotlong marked this pull request as ready for review August 25, 2026 09:17
@hotlong
hotlong added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit 98df2d9Aug 25, 2026
27 checks passed
@hotlong
hotlong deleted the claude/issue-11368-lanes-facts branch August 25, 2026 09:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@hotlong@claude