Skip to content

docs(pm-skills): adopt eight measured platform readings into the governed fact table, each paid in place - #18689

Merged
os-justin merged 2 commits into
mainfrom
claude/issue-18426-platform-readings-batch
Sep 17, 2026
Merged

os-justin merged 2 commits into
mainfrom
claude/issue-18426-platform-readings-batch

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Part of #18426 — the carrier of a seven-card batch, all landing rows in one governed file.

Clause-②: no

One file: .claude/skills/pm-dispatch/references/platform-readings.md, held at 466 / 466 (headroom 0,
widest line 120 B). No ceiling was raised. Every adopted row is paid by a compression or a dedup in the same
file
, listed beside the sentence it shortened. Rows :10–:12, :212 and :431 are untouched — verified by content,
and none of them appears in any hunk of the diff.

Each reading was adopted or rejected on its own, as the cards ask.

Verdicts

card reading verdict row line bytes paid by
#18426 zod v4 defines the parse methods per INSTANCE, so prototype spying throws; the seam is the barrel population ADOPTED :277 + :278 97 B + 116 B :172 — the conditional-request row absorbs the payload-precedence row (its 「只有 body 精确」 is restated at :178:179) · :185 — the payload-staleness pair
#18426 the REST write identity is per-TOKEN, not per-channel; read back your own write REJECTED already at :126:132
#18426 os-verify-lock.sh is objectstack's and absent in objectui ADOPTED :393 112 B :207 — the created-order pagination pair
#18426 ④ (comment) ref deletion is refused while every other write on the token succeeds REJECTED already at :374:377 and :430
#18426 ⑤ (comment) a suspended author's comment is counted but not served REJECTED already at :250 (cause at :164:167)
#18446 a label strip re-triggers the label-sensitive checks ⇒ pre-check ③ is read after the last state write ADOPTED :85 118 B :289 — the missing-command pair
#18458 gh-readonly-queue/* ref names embed the stacked-on sha ⇒ queue ORDER from ls-remote REJECTED already at :70:73
#18467 (main) a full rule-plus-footer BLOCK to an issue body is re-anchored, not doubled REJECTED already at :410 + :357
#18467 (operating half) that re-anchor is what post-stamped's body mode reports as mutated ADOPTED :357 (new row under it) 119 B :318 — the MCP-truncation pair
#18467 (addendum) bare REST POST /issues with a footerless body synthesises exactly one, +58 ADOPTED :410, refined in place 120 B zero — folded into the existing create row
#18498 row 1 grep -z with a literal newline is an OR — a false POSITIVE; grep -Pz with the backslash-n escape discriminates ADOPTED :291 118 B :451 — the usage-wall pair
#18498 row 2 (withdrawn on the card as a duplicate) not adopted
#18521 unstable can come from a commit STATUS the /check-runs enumeration cannot see ADOPTED :28 115 B :303 — the two CI-log reading rows
#18522 the footer has two spellings, so a bare-only strip strands the session-URL one mid-body ADOPTED :347 106 B :331 — the fence caveat folds into the trap row beside it

8 readings adopted, 9 lines, 8 payments (the create-channel cell costs nothing — it refines a row that was
already there). Net line change: 0.

Every payment, and what it shortened

payment before after fact lost
:172 「文档载明未实测:条件请求答 304 不计 core 池。」 + 「公开仓零配额读法两档,payload 档优先 —— 只有 body 精确。」 one row 「只有 body 精确」 — restated in full at :178:179 (assignees stale, claim-bearing fields never read from this channel)
:185 「⇒ 前 15 项那条判别式…」 + 「失效方向是据它对别人的工作下没有认领的判词。」 one row none
:207 created 序承重…」 + 「以两趟的重叠证覆盖…」 one row none
:289 「⛔ 一般规则:任何可能不存在的命令…」 + 「PR 与查重类核验改走 MCP GitHub 工具或 git。」 one row none
:303 get_check_run 对本仓 CI job 回空 output.text。」 + 「get_job_logs 无论 tail_lines 只回占满日志尾部的 post-step service-container teardown。」 one row 「post-step」 and 「占满」 — the position is still given by 「尾部的」
:318 「GitHub 存储字节完好,raw REST 取回一字不差。」 + 「⇒ ⛔ 永不单凭 MCP 读判截断…」 one row none
:331 「⛔ 围栏不防护:照删、留空围栏。」 + 「另一坑:感叹号紧跟左方括号即触发(TS 非空断言下标),无需尖括号。」 one row 「TS」 and 「下标」 from the parenthetical — the mechanism is already spelled out by 「感叹号紧跟左方括号」
:451 「盲区:窗口起点是本地推断的近似值。」 + 「撞墙报文形如 limit reached, resets at HH:MM…」 one row none

Why the five rejections — the four axes

All five reject for one reason: the reading is already in the fact table, measured and phrased. That makes
this a single class, so the axes are argued once and the per-card evidence follows.

  • 实际业务需求 — the need each card names is real, and it is already served. A seat asking 「who authors my
    REST writes」 lands on :129 (「类只认每次写回读的 user.login/user.type」); a seat asking 「where is my PR in
    the queue」 lands on :70:73, which carries the parent-tip chain recipe and a caution the card does not
    have (:72: the embedded parent is a presumed base, measured to reach main ten-plus minutes later). Adding a
    second row would not add a reader path; it would add a second place to disagree.
  • 项目长远合理性 — a fact table with two rows for one fact is the workaround shape this repo refuses. When one
    copy is later corrected, the other stays, and the next seat reads whichever it reaches first. One row, one
    reader path.
  • 防 AI 写代码犯错 — this is the axis that decides it. A duplicated row is a lenient surface: it lets a
    future edit narrow one copy while the other keeps the old claim, and nothing goes red. The strict form is one
    row, which the ratchet already prices. Note the direction of the rejection: none of the five loses a fact —
    each is being kept, in the line that already carries it.
  • 创业阶段不扩散需求 — at 466 / 466 every row is paid by deleting or compressing another. Paying real
    compression for a fact that is already written down spends the budget twice and shrinks the table's coverage by
    exactly the sentence that was compressed to make room.

Per-card evidence:

Measurements taken for this PR

Gates

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived the list from the tree
(no hand-fed paths); --ran reconciles: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN — a DERIVED zero, all 18
carry an exit code and none of them is 3.
Every code captured by redirect-then-$?, never through a pipe.

command exit
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0
node scripts/check-comment-mask-corpus.mjs 0
node scripts/pm/check-governed-queue-guard.mjs --self-test 0
node scripts/pm/check-harness-current.mjs --self-test 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0
pnpm check:agent-test-spelling 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:nul-bytes 0
pnpm check:pm-governed-merges 0
pnpm check:pm-half-states 0
pnpm check:pm-skill-id-lint 0
pnpm check:pm-skill-ratchet 0
pnpm check:refd-timer-probe 0
pnpm check:required-contexts 0
pnpm check:skill-frame-sync 0
pnpm check:watch-hint-literal 0

Named explicitly by the dispatch, both inside that list:

  • pnpm check:pm-skill-ratchetexit 0; its own verdict lines:
    platform-readings.md is 466 lines (ceiling 466; headroom 0) and
    platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0);
    contract-review.md is 60 lines (ceiling 60; headroom 0).
  • pnpm check:skill-frame-syncexit 0: the one declared copy of the decision frame is internally coherent,
    4 axes, 74 markdown files scanned for undeclared copies.

Governed-surface predicate, as the dispatch asks it be recorded:

  • node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/platform-readings.md
    exit 3 = GOVERNED (not a failure): 1 of 1 path(s) hit the register, .claude/** ×1.

First eight of those ran at exit 3 = PREREQUISITE NOT MET on a fresh worktree with no node_modules; that is
not a measurement, so pnpm install ran and every one was re-run. check:doc-formula-expressions then still
answered 3 (@objectstack/formula and @objectstack/lint unbuilt); its own prescribed fix was run through the
shared verify lock — os-verify-lock: VERDICT command-exit 0 — and the gate re-ran at 0.

Manual byte discipline beyond the gates: grep -naP for control characters over the edited file → exit 1
(none).

Acceptance notes

Noted while measuring, not filed, and not touched here:

维护者速读(草稿)

改了什么 —— 只改一个文件:PM 车道的平台读数事实表。八条今天实测出来的 GitHub/工具行为写进去,五条因为
表里已经有了而没写。文件行数一行没涨(466 / 466),每加一行都在同一个文件里删掉或压掉一行来付账。

为什么改 —— 这些读数原本只存在于各个 issue 的讨论里。没有载体的读数,下一个席位会从零重新推一遍;这次
的批次本身就是证据:五条里有五条已经在表里了,而填报席没查表就填了卡。

风险与代价(含回滚) —— 风险在八处压缩:两行合成一行,可能丢掉措辞。逐条列在正文的「Every payment」表里,
三处明确写了丢掉哪几个字以及那个事实在哪一行还能读到,其余五处无损。回滚是 git revert,单文件、无生成物、
无下游消费者。

席位意见 —— (留空,由席位在复核时填)

你要做的 —— 不需要做什么。这是事实层(references/**),按裁决 #17950 由技能席在自己的契约档复核后经队列
落地;⛔ 没有席位把它翻 ready、入队或挂 auto-merge。

Closing lines

Part of #18426 — readings ① and ③ adopted; readings ②, ④ and ⑤ rejected as already recorded, so the card stays
open for the seat to confirm those three duplication claims before it is retired.
Fixes #18446
Part of #18458 — the entire reading is already recorded at the queue-ref rows; no row was added, and the card
stays open for the seat to confirm that before it is retired.
Part of #18467 — the operating consequence and the create-channel cell are adopted; the re-anchor itself is
rejected as already recorded, so the card stays open for the seat to confirm that one.
Fixes #18498
Fixes #18521
Fixes #18522


Generated by Claude Code

…place

Six readings land in the governed fact table at zero headroom; each new row is
paid by a compression or a dedup in the same file, so the line count is
unchanged at 466/466 and every row stays under the 120-byte width rule.

New rows:
  - zod v4 hangs parse methods per instance, so prototype spying throws; the
    working seam is the barrel population, with its radius stated.
  - os-verify-lock.sh lives only in objectstack; a sibling-repo seat running
    this repo's copy reads a container-level lock, not that repo's depth.
  - a label strip and a ready flip are both state writes that restart the
    label-sensitive checks, so landing pre-check 3 is read after the last one.
  - sending a whole footer block to an issue body trips the blank-line
    normalisation, which post-stamped's body mode reports as `mutated`.
  - grep -z treats a literal newline in the pattern as a separator, so a
    wrapped phrase matches one side only -- a false positive, not a false zero.
  - the issue create channel synthesises exactly one footer for a footerless
    body (+58), folded into the existing create row at zero cost.

Payments: the conditional-request/payload row pair, the payload-staleness pair,
the created-order pagination pair, the missing-command pair, the MCP-truncation
pair and the usage-wall pair each compress two lines into one, losing no fact.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <noreply@anthropic.com>
The seat folded two more sibling cards onto this branch. Both land as one row
each, each paid by a compression in the same file, so the count stays 466/466.

New rows:
  - mergeable_state `unstable` can be produced by a commit STATUS, which the
    /check-runs enumeration cannot see, so landing pre-check 3 reads the
    commit status too before calling a head green.
  - the attribution footer has two spellings, so a "send no footer" strip that
    matches only the bare one strands the session-URL one mid-body while the
    58-byte read-back delta still looks exactly as documented.

Payments: the two CI-log reading rows compress into one, and the fence caveat
folds into the trap row beside it; no fact is dropped by either.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <noreply@anthropic.com>
@os-justin os-justin added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 17, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 17, 2026
@os-justin
os-justin marked this pull request as ready for review September 17, 2026 15:14
@os-justin
os-justin added this pull request to the merge queue Sep 17, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 5f809c1817b67f31dca0438b5677e0d35bfcb9aa

Review of record on the PR thread — the same record the seat posted on the carrier card as 5716694216 at 2026-09-17T15:10:43Z; the merge-group leg of the Governed Surface Guard reads the PR thread, not the card, and dequeued this PR at 2026-09-17T15:36:18Z for want of it. In-seat review of PR #18689 (the seven-card platform-readings batch carried by #18426) by the dispatching domain:skills seat, 2026-09-17T15:38Z, read against the PR's diff, files and head on GitHub and a scratch worktree at the head — ⛔ not against the dev report (5716488532). Clause-②: no on the PR body and on the claim (5716076148); check-clause2-carriers --pair 18689 answers 0 for all seven cards. Fact-layer landing: the one file is .claude/skills/pm-dispatch/references/platform-readings.md, so check-governed-merges --test answers GOVERNED (exit 3, .claude/** ×1) and the seat lands it on this review of record, not on a maintainer approval — the references/** carve-out the SKILL names.

① Derived judgments

② Semver level

None — no package is touched; skip-changeset on the PR is correct for .claude/**.

③ Boundary flags

Implemented-by: claude/issue-18426-platform-readings-batch
Reviewed-by: session_01Gqi43smmqjJ5sUrhfoPeKu

VERDICT: PASS


Generated by Claude Code

@os-justin
os-justin added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 72dd95f Sep 17, 2026
32 checks passed
@os-justin
os-justin deleted the claude/issue-18426-platform-readings-batch branch September 17, 2026 15:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment