Skip to content

docs(pm-dispatch): three measured platform readings into the readings ledger - #15955

Draft
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-15647-readings-increment-four
Draft

docs(pm-dispatch): three measured platform readings into the readings ledger#15955
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-15647-readings-increment-four

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

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_issues with two labels returns their UNION, not their intersection. grep 并集 / 求交PRESENT at line 217, elaborated through 222. Skipped.
  • A body PATCH's attribution-footer behaviour is surface- and edit-specific, read back and counted, never predicted. grep 页脚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.
  • The platform normalises blank lines around a trailing rule in both directions. grep 空行 / 归一 / 横线 / 长度 / 偏移ABSENT. Landed.
  • A turbo job prints ELIFECYCLE Command failed for many packages when one task failed. grep ELIFECYCLE / turbo / FailedABSENT; line 252 is about adjacency not implying causality, a different fact. Landed.
  • The REST timeline event for queue entry is added_to_merge_queue, not enqueued. grep added_to_merge_queue / enqueuedPRESENT at line 10, with line 12 already naming pull_request.enqueued as the webhook-side name. Skipped.
  • The zero-quota payload's timeline arrays are capped and drop the newest items. grep totalCount / get_comments / hasNextPagePARTIAL: 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:

  • payload-channel entry, after line 146 — compare each timeline array against totalCount; short means the newest items are missing, so a claim check goes to the paged get_comments read.
  • 读数陷阱, after line 252 — the authoritative reading of a multi-package ELIFECYCLE spray is the Failed: line plus that package's own error annotation.
  • 读数陷阱 write-side cluster, after line 290 — compare a read-back body at the first differing offset, never by length.

Correction, measured on this card while writing the line. #15917 and the dispatch both spell the payload comparison as count against totalCount. There is no count field. The payload block carries pageInfo, totalCount and edges, and the figure being compared is the length of edges. 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: frontTimelineItems came back with 15 edges against totalCount 27 and hasNextPage: true, while backTimelineItems came back with 0 edges against the same totalCount 27 and a pageInfo carrying hasPreviousPage, not hasNextPage. 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:

✗ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 362 lines; the ratchet ceiling is 359.

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/objectstack derived 16 families; all 16 were run; --ran reconciles: ✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED.
  • 15 of the 16 are green. The sixteenth is check:pm-skill-ratchet, red by exactly the 3 lines above, by design.
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3, PREREQUISITE NOT MET, nothing measured; after building @objectstack/formula and @objectstack/lint it 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.
  • Whole-repo pnpm lint (eslint . --no-inline-config, full population, no narrowing) through scripts/pm/os-verify-lock.sh slot issue-15647: VERDICT command-exit 0 · held the lock 95s.
  • node scripts/pm/check-governed-merges.mjs --test on the real file list exits 3 — GOVERNED. This PR stays a draft; no seat flips it ready, enqueues it, or arms auto-merge.
  • Control bytes: pnpm check:nul-bytes green, 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

…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

os-steve commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

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 (.claude/skills/**, predicate exit 3): draft stays; reviewers are requested after the patch round that quotes the ruling, not on a red head.

What the seat verified, at head b4a0e4258d, in its own compare worktree

  • One file, +3/−0. The three lines sit where they belong: the payload-channel entry (after the generic absence rule), the 读数陷阱 CI cluster, and the write-side footer cluster. Widest written line 117 bytes; check-skill-id-lint 24 files clean; check-governed-merges --test exit 3.
  • Dedup holds: the union fact (line 217), the footer write-side variance (283/286/290) and added_to_merge_queue (line 10) are present on main, so skipping them was right; ELIFECYCLE, the first-differing-offset rule and the edges-vs-totalCount discriminant were absent.
  • The correction to the cards is accepted: the payload block has no count field; the compared figure is the length of edges, and the landed line is spelled that way. The second measurement (the tail array carries hasPreviousPage, so the existing hasNextPage discriminant is blind on it) is the reason the line says both arrays.
  • Ratchet, seat's own run on the head: 362 lines; the ratchet ceiling is 359, exit 1 — red by exactly 3, the ceiling row untouched, no fact dropped. The 333-pair zero-fold measurement is the dev's; the seat did not repeat it and says so on [Decision] platform-readings.md ceiling 359 → 362 for the fourth readings increment (PR #15955, red on the ratchet by design) #15960.
  • CI, seat's read 16:3xZ: 29 check runs — 16 success, 12 skipped, 1 failure (Lint & Repo Gates, at the ratchet step; the steps behind it are unmeasured on this head until the ceiling lands — a known cost of this route).

Open questions answered: Q1 → decision card #15960 (recommendation A, fallback B, with the dev's note that the ELIFECYCLE line is the weakest). Q2 → B: the census-population sentence is section 2's material and is already in the decision box; no fifth line. Q3 → A: measurement-first is the ruled route for a zero-headroom governed ledger; the os-dev.md clause is narrowed by #15959 (filed, behind #14768 on the same file). #15957 graded into the re-lock pass.

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 ruledRaises record; then reviewers, needs-user-decision and the final 速读 follow at the governed terminal.

Implemented-by: os-dev executor, flight #15647 section 1 + #15917, branch claude/issue-15647-readings-increment-four
Reviewed-by: pm-dispatch skills seat, https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox


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

2 participants