Uh oh!
There was an error while loading. Please reload this page.
docs(pm-dispatch): an enumeration that cannot say it was truncated may not report clean - #13098
Merged
Merged
Conversation
…y not report clean The two-tier triage inventory told each hourly read-method WHAT to enumerate but never required it to check that it had finished. A list read returning fewer items than `totalCount` proceeded silently, and the scan's own output could not distinguish a complete reading from a partial one. Adds the completeness predicate to the section that owns the three read-methods: compare returned count against `totalCount` on every enumeration, and report `sweep INCOMPLETE` naming the gap when they differ -- never as a clean scan. Paginating alone is only half the answer, because the next list to outgrow the page size reintroduces it. Same standard `check-governed-merges.mjs` already applies to unaudited repos. Paid net-0 against the file's ratchet ceiling by rewrapping five paragraphs whose hard wraps had left orphan continuation fragments; content is byte-identical modulo whitespace. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
The first commit paid for the rule by re-wrapping orphan continuation lines, which the ratchet's governing clause bans outright: 「⛔ re-wrap(折行合并)不得 用作筹行 —— 棘轮治理的是内容体量,行数只是机读代理,新增以删减付账;密度优化仅随净 减内容的 PR 顺带」 (maintainer 2026-08-17). Content volume net-increased while the line count stayed flat -- the exact shape the clause forbids. Every re-wrap is reverted; the five paragraphs are byte-identical to origin/main again. The rule is compressed from six lines to three and appended to the paragraph that already specifies the hourly layer's three read-methods, so it costs no separator line. Paid instead by deleting three lines of genuine duplication, each with a surviving home: - the 落卡分析模板 + 业务写法六项 pointer (2 lines) -- a routing stub whose every element, both ruling dates included, lives in references/decision-analysis.md, which SKILL.md already routes to. - the 惰性判定 back-pointer (1 line) -- references/seat-post-protocol.md states the same lazy/standing split from the other end and points back here for the details. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
This was referenced Aug 29, 2026
This was referenced Aug 29, 2026
os-zhuang
approved these changes
Aug 29, 2026
os-zhuang
marked this pull request as ready for review
August 29, 2026 06:59
os-zhuang
enabled auto-merge
August 29, 2026 06:59
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#12817
What was wrong
The two-tier triage inventory section (
references/dispatch-runbook.md, maintainer ruling2026-08-20) tells each hourly read-method what to enumerate — sweep 析取, 解锁扫描反演,
健康指标 — but never required any of them to check that it had finished. A list read that
returns fewer items than
totalCountproceeded silently, and the scan's own output could notdistinguish a complete reading from a partial one.
Measured 2026-08-27: an enumeration ran at
perPage=50against atotalCountof 51. One cardwas never examined. Nothing printed distinguished "read all of them" from "read all but one" —
the caller saw a list and proceeded.
This is the same collapse class the tree-staleness cards name: an incomplete reading and a
complete reading print the same thing.
What changed
Three sentences appended to the paragraph that already specifies the hourly layer's three
read-methods — the completeness predicate lands where the enumerations are defined, not as a
second procedure, and appending costs no separator line:
totalCount;sweep INCOMPLETEnaming the gap, and⛔ may never be reported clean, the standard
check-governed-merges.mjsalready applies tounaudited repos;
rule is one predicate and ⛔ not a second code path.
Out of scope and untouched, per the 2026-08-24 ruling recorded in
platform-readings.md: whereBlocked-by:lives, and the body-only read direction. No issue numbers were written into theprotocol text — the entry carries a date, per the file's own 行文纪律.
Ratchet
The file sits at its ceiling with zero headroom, so the rule is paid for by deletion in the same
file. No ceiling was raised.
.claude/skills/pm-dispatch/references/dispatch-runbook.mdVerdict line, from the union run on the final commit:
Cut ledger — net 0 (+3 rule, -3 deleted content)
continuation lines with no prose deleted. That is banned outright by the ratchet's governing
clause, quoted verbatim (maintainer 2026-08-17,
SKILL.md):Content volume net-increased while the line count stayed flat — the exact shape the clause
forbids. Commit ac9ceed reverts every re-wrap: those five paragraphs are byte-identical to
origin/mainagain, and the rule was compressed from six lines to three. The funding is nowreal deletion, each cut with a surviving home:
references/decision-analysis.mdcarries the template, the six writing requirements, the 四棱块 shape and both ruling dates (中文 2026-08-19 at its line 17; 业务角度 2026-08-20 verbatim at its line 3);SKILL.mdalready routes readers there. The bullet was a routing stub, which the file's own header excludes — it holds 细则增量, not signposts to other files.references/seat-post-protocol.mdstates the same lazy/standing split from the other end — 「惰性半边在接管冲突时评估一次 … 常设半边是分诊轮的座位贴活性巡查,同一判据」 — and points back to this file for the details the deleted line merely re-announced.The resulting diff against
origin/mainis 4 insertions / 4 deletions in one file, with nore-wrapped line anywhere in it.
Serialization with PR #13106
PR #13106 also edits this file and is accepted ahead of this one; it lands first. Its cuts are
四件补遗 items ② and ④, the
pnpm --workspace-concurrencysentence, and the rejection-envelopeclause. This PR double-claims none of them — verified against its branch: it keeps the
落卡分析模板 pointer bullet as unchanged context, and never touches the 惰性判定 line in the
座位贴活性巡查 section. The two cut sets are disjoint, and the file is 274/274 under either
order, so the net-0 arithmetic holds whichever lands first.
At the time of writing #13106 had not merged, so this branch is merged up to
origin/maind48929e instead. Its new bullet lands in the same section this PR deletes a bullet from, so a
textual merge may need a hand at landing time.
Gates
Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(no pathspassed; the script took the change set from the merge base itself — 1 path). All eight ran as
one
&&chain on the final commit e215a64, exit 0 — each verdict quoted from the gate'sown output, never from a bare shell status.
check:pm-skill-ratchetdispatch-runbook.md is 274 lines (ceiling 274; headroom 0)check:pm-skill-id-lint23 file(s) clean (pattern /#[0-9]{3,}/g)check:agent-test-spelling0 violations — 398 file(s)check:doc-authoring392 files clean — no bare metadata literalscheck:doc-formula-expressions22 record-scoped formula example(s) across 425 files / 1453 TS blocks judged cleancheck:pm-governed-merges--self-test: 206 assertionscheck:skill-frame-sync4 copies of the decision frame are structurally isomorphic across 3 filescheck:nul-bytesOK (scanned 7285 text file(s) ... no raw ASCII control bytes)@objectstack/formulaand@objectstack/lintare built first in the same chain —check:doc-formula-expressionsotherwise exitsPREREQUISITE NOT MET, which is the gatedeclining to measure, not a red.
Changeset
None. The diff is
.claude/protocol text only and publishes nothing, so the PR carriesskip-changeset.Generated by Claude Code