docs(pm-dispatch): three measured platform readings into the readings ledger - #15955
docs(pm-dispatch): three measured platform readings into the readings ledger#15955claude[bot] wants to merge 1 commit into
Conversation
…gs ledger Three rules absent from `references/platform-readings.md`, one line each, placed in the section each belongs to: - payload-channel entry: compare each timeline array's `edges` length against `totalCount`; short means the NEWEST items are missing, so a claim check goes to the paged `get_comments` read. The existing `hasNextPage` discriminant is blind on `backTimelineItems`, whose `pageInfo` carries `hasPreviousPage` instead. - 读数陷阱: a turbo job prints `ELIFECYCLE Command failed` for many packages when one task failed; the authoritative reading is the `Failed:` line plus that package's own `##[error]`. - 读数陷阱 write-side cluster: the platform normalises blank lines around a trailing `---` rule in both directions, so a read-back comparison goes by the first differing offset, never by length. Deduplicated against the rewritten file first: the `list_issues` two-label union fact, the `added_to_merge_queue` timeline event name, and the surface- and edit-specific footer write-side behaviour are all already present and were not re-added. The file has zero headroom (359/359) and zero fold slack: none of its 333 adjacent rule pairs fits the 120-byte line cap when merged. The three lines are therefore landed measurement-first at 362 lines; the ratchet reads RED by 3 by design and the ceiling row is deliberately NOT raised here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT, pending the ceiling ruling — lands #15647 section 1 and #15917 as ruled, measurement-first. The diff is correct and complete; what stands between it and the governed terminal is one number the maintainer owns: the readings ledger's ceiling, 359 → 362, put to him as decision card #15960 with this PR's measured count. Governed ( What the seat verified, at head
Open questions answered: Q1 → decision card #15960 (recommendation A, fallback B, with the dev's note that the Next on this PR: when #15960 is ruled, a patch round on this branch sets the ceiling row, quotes the ruling in the body, adds the Implemented-by: os-dev executor, flight #15647 section 1 + #15917, branch Generated by Claude Code |
Part of #15647
Fixes #15917
Three measured platform readings were absent from the pm-dispatch readings ledger. They land here as one rule line each, placed in the section each belongs to. One file moves:
.claude/skills/pm-dispatch/references/platform-readings.md. Nothing else.Dedup first — every candidate grepped against the rewritten file
Section 1 of #15647 offered four facts, Addendum 2 a fifth, and #15917 a sixth. Each was grepped against the file as PR #15641 left it before anything was written:
list_issueswith twolabelsreturns their UNION, not their intersection. grep并集/求交— PRESENT at line 217, elaborated through 222. Skipped.页脚— PRESENT: line 283 carries the double-localisation and the prohibition on reading it as a law, 286 the counter-example on the same wrapper, 290 the create-versus-edit variance plus the mandatory read-back. Skipped.空行/归一/横线/长度/偏移— ABSENT. Landed.ELIFECYCLE Command failedfor many packages when one task failed. grepELIFECYCLE/turbo/Failed— ABSENT; line 252 is about adjacency not implying causality, a different fact. Landed.added_to_merge_queue, notenqueued. grepadded_to_merge_queue/enqueued— PRESENT at line 10, with line 12 already namingpull_request.enqueuedas the webhook-side name. Skipped.totalCount/get_comments/hasNextPage— PARTIAL: line 143 records the cap and line 146 the generic absence rule, but the durable discriminant, the newest-first direction and the named authoritative fallback are all absent. Landed.What landed, and one correction to the card's own wording
Three lines, each under the 120-byte cap:
totalCount; short means the newest items are missing, so a claim check goes to the pagedget_commentsread.ELIFECYCLEspray is theFailed:line plus that package's own error annotation.Correction, measured on this card while writing the line. #15917 and the dispatch both spell the payload comparison as
countagainsttotalCount. There is nocountfield. The payload block carriespageInfo,totalCountandedges, and the figure being compared is the length ofedges. The rule line is spelled that way, so a reader is not sent looking for a field that does not exist.Second measurement from the same read, on #15647 itself:
frontTimelineItemscame back with 15 edges againsttotalCount27 andhasNextPage: true, whilebackTimelineItemscame back with 0 edges against the sametotalCount27 and apageInfocarryinghasPreviousPage, nothasNextPage. So the existing line-146 discriminant is structurally blind on the tail array — the new line's "compare both arrays" is what covers it. The measurement stays here; the ledger keeps only the rule.Ceiling — measurement-first, RED by 3, and no ceiling raise
The file sits at 359 lines with a ceiling of 359 and zero headroom. Line-neutral folding was measured, not assumed: of its 333 adjacent rule pairs, zero fit the 120-byte line cap when merged, so there is no re-wrap slack at all, and re-wrap is in any case not legal currency for buying lines.
The three lines therefore land measurement-first. The ratchet's own verdict:
Exactly 3 over. The ceiling row is deliberately not raised in this PR — that is a maintainer ruling, and this PR exists partly to put the measured number in front of it. No fact was dropped to make the ratchet green.
Verification
At commit
b4a0e42, all figures below from that tree.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 16 families; all 16 were run;--ranreconciles:✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED.check:pm-skill-ratchet, red by exactly the 3 lines above, by design.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3, PREREQUISITE NOT MET, nothing measured; after building@objectstack/formulaand@objectstack/lintit exits 0.node scripts/pm/check-skill-line-ratchet.mjs --self-test— 155 cases pass. Live before the edit:✓ ... is 359 lines (ceiling 359; headroom 0). Live after: the red quoted above.node scripts/pm/check-skill-id-lint.mjs,node scripts/check-skill-frame-sync.mjs,node scripts/pm/check-governed-prose.mjs— all green; governed-prose confirms 2 instruction surfaces name all 5 registered governed surfaces.pnpm lint(eslint . --no-inline-config, full population, no narrowing) throughscripts/pm/os-verify-lock.shslotissue-15647:VERDICT command-exit 0 · held the lock 95s.node scripts/pm/check-governed-merges.mjs --teston the real file list exits 3 — GOVERNED. This PR stays a draft; no seat flips it ready, enqueues it, or arms auto-merge.pnpm check:nul-bytesgreen, plus a direct scan of the edited file for the wider control-character class, no hits.维护者速读(草稿)
这是什么。 pm-dispatch 的「平台读数事实表」是 PM 与 dev 席位在操作 GitHub 时的查表依据 —— 哪个字段可信、哪个读数是静默假阴性、配额往哪走。本 PR 往里加三条实测规则,一条一行,不动别的。
为什么值得改。 三条里最重的一条是认领读数:零配额通道读单卡时间线会静默丢掉最新的几条评论,而认领评论按定义就是最新那条。席位据它判「这张卡没人认领」,就会重复认领、两个 agent 撞在同一张卡上 —— 已经发生过一次未遂。新规则给出一个不依赖缓存行为的判别式,并点名权威回退读法。
代价是什么。 该文件行数棘轮满格(359/359),而实测下来它一条折行余量都没有:333 对相邻规则行里,合并后能塞进 120 字节上限的是 0 对。所以这三行只能顶着棘轮落地,PR 在棘轮上红 3 行,是设计如此,不是失误。
需要您定的事。 抬不抬这个 ceiling(359 到 362)是维护者裁决,本 PR 不自行抬、也不为了变绿而砍掉任何一条事实。若您认为其中某条不值三行的额度,请直接点名删哪条;若认为都值,则需要一条 ceiling 裁决。
风险面。 纯文档改动,零运行时影响,零发布面;
.claude/**属受管面,按规矩人工合并。席位意见:
Generated by Claude Code
Generated by Claude Code