Skip to content

docs(pm-dispatch): six measured platform-reading rows — search zeroing, labels AND/OR, the MCP read-path trap, landing by content - #11279

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-11193-platform-readings-rows
Aug 23, 2026
Merged

docs(pm-dispatch): six measured platform-reading rows — search zeroing, labels AND/OR, the MCP read-path trap, landing by content#11279
os-zhuang merged 2 commits into
mainfrom
claude/issue-11193-platform-readings-rows

Conversation

@claude

@claudeclaudeBot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#11193
Fixes#11271

Six measured platform facts land as one-line-per-entry rows in
.claude/skills/pm-dispatch/references/platform-readings.md. Dispatched as a fold of
two graded cards, one PR, one commit per member.

Member commits

commitcardrows
39f6a6a1#11193search_issues session-level zeroing + control-term probe; REST list endpoints as the correct fallback (never MCP list_issues hand-scans); the labels AND/OR asymmetry; the qualifier-syntax candidate recorded as REFUTED
7fcab57f#11271the MCP read path eating angle-bracket fragments inside inline code, with its discriminator; landing judged by content on origin/main

Folded into existing entries, not appended

Per the grading note, the file was read in full first. Four of the six facts had an entry
that already owned their subject, so they were folded in rather than duplicated:

  • The labels row already carried the OR half (MCP list_issues). This adds the REST
    labels=a,b AND counterpart and the two independent same-day measurements.
  • The issue_read row claimed read-side artifacts were uniformly reversible. The new
    fact contradicts that in a way worth stating: a dropped fragment cannot be decoded back,
    so that row gets the correction plus a pointer to the full rule.
  • The truncation-judgment row already described the API-reads-short direction. The new leg
    is the same trap with the read paths swapped, so it extends that entry.
  • The landing-check row already required two readings; it now says the origin/main
    reading is a content reading, and why the two tempting shortcuts are both wrong.

Only one genuinely new entry was needed (the search-zeroing operating procedure).

How the ceiling was paid

The file sits at its line-ratchet ceiling with zero headroom (134/134). Payment follows
the remedy guidance in check-skill-line-ratchet.mjs's own header — compress in place,
never raise a ceiling (raising needs a maintainer ruling, and none was sought or given).
Each commit adds exactly one physical line and pays for it by re-flowing one loosely
wrapped bullet onto a single line, no words dropped; both re-flowed bullets land well
inside the file's established line-length convention. The ceiling constant is untouched and
the file is 134 lines at both commits, so the ratchet is green at each one, not just at
the tip.

Gate verdict at the final head 7fcab57f, quoted as the gate printed it:

check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 134 lines (ceiling 134; headroom 0).

#11106 remains open and is deliberately not addressed here. The line-vs-byte metering
question is in the decision inbox; this PR pays purely in lines per the current line-ratchet
remedy and neither resolves nor preempts it.

Governed surface

.claude/** is a governed surface: this PR opens as draft, is not to be flipped
ready by an agent, carries no auto-merge, and is for human merge only.
skip-changeset applies by convention — the diff is one instruction-surface reference file
and publishes nothing.

Verification

Gate families derived mechanically from the actual change set with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (re-derived after the
final commit; same six families, no new members). All seven run green at 7fcab57f:

gateverdict
check:pm-skill-ratchet134 lines, ceiling 134, headroom 0
check:pm-skill-id-lint17 file(s) clean (pattern for issue-number references)
check:doc-authoring389 files clean — no bare metadata literals
check:skill-frame-sync4 copies of the decision frame structurally isomorphic across 3 files
check:doc-formula-expressions22 record-scoped formula example(s) across 416 files / 1447 TS blocks clean
check:pm-governed-mergesself-test, 119 assertions
check:nul-bytes6332 text file(s), no raw ASCII control bytes

The new rows carry no issue numbers, per the file's own header rule and check:pm-skill-id-lint.

One fact verified first-hand while writing this PR

Fact 5 was confirmed in this session before it was written down, on this very fold: #11271's
body read through MCP showed an empty inline-code span and an identifier written without
angle brackets, while curl against api.github.com returned the same body carrying five
angle-bracket-bearing inline spans intact. The card was not damaged and was not
"repaired" — which is exactly the near-miss the row exists to prevent.

Declared narrowings

  • The @objectstack/formula dependency closure was built with dts generation skipped. That
    gate loads formula at runtime and consumes no .d.ts, and this diff contains no
    TypeScript, so no type judgment rests on it.
  • Repo-wide pnpm lint was not run; CI owns that run. Nothing here is a narrowing of a
    named family — all six derived families plus check:nul-bytes ran in full.

Reported at draft-PR time per the dispatch contract; CI convergence is the PM's to read.

Generated by Claude Code


Generated by Claude Code

… and the labels AND/OR asymmetry
Three measured platform facts into the fact table, folded into existing
entries where one already existed:
- `search_issues` can go silently to zero for a WHOLE SESSION, control
term included, while the same tool is healthy in another session at the
same moment. Diagnose with a `repo:`-scoped control term known to hit;
on zero switch channel immediately and never retry.
- The correct fallback is the REST list endpoints (core bucket, complete
results). Never hand-scan with MCP `list_issues`: GraphQL bucket, and a
paginated hand-scan reads as "searched, nothing there" while having
enumerated 100 of 226.
- The labels filter is asymmetric across the two channels: REST
`labels=a,b` is a true AND, MCP `list_issues` `labels` is an OR. The OR
half was already on the row; this adds the REST counterpart and the two
independent measurements from the same day.
- The qualifier-syntax candidate mechanism is recorded as REFUTED, with
both counter-measurements, so the mechanism hunt does not spend a
session on it.
The file sits at its line-ratchet ceiling with zero headroom, so the new
entry is paid for in place per the gate header's remedy guidance (never
raise a ceiling): one loosely wrapped bullet is re-flowed onto one line,
no words dropped. Ceiling untouched at 134; the file is 134 at this
commit and at the next.
Fixes#11193
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
…dging landing by content
Two measured read-path facts, both shaped to mislead in the safe-looking
direction, folded into the entries that already own their subject:
- The MCP `issue_read` / PR read path drops `<...>` fragments inside
inline code while GitHub's stored bytes are intact (raw REST returns
them verbatim). This matters because the repair-first rule then gets
applied CORRECTLY to an undamaged card and the rewrite destroys correct
content — three independent observations in one day, one of them a near
miss stopped only by that dev's own verification habit, with no
mechanical guard anywhere. The discriminator is empty inline-code
spans, and the rule is: never judge truncation from the MCP read alone,
confirm raw REST first. Numeric entities are ordinary encoding, not
truncation evidence. The `issue_read` row above claimed read-side
artifacts were uniformly reversible, so it gets the correction: a
dropped fragment cannot be decoded back.
- Landing is judged by CONTENT on `origin/main`, never by the PR head
sha's ancestry (the queue lands a DIFFERENT commit, so the ancestry
test answers NO for a fully merged PR — a distinct cause from the
shallow-checkout trap already on file) and never by the `merged`
boolean, which was measured returning false alongside a set `merged_at`
and `state: closed` under a `fields` projection.
Paid in place at the ceiling, same as the previous commit: one loosely
wrapped bullet re-flowed onto one line, no words dropped. Ceiling
untouched; the file is 134 lines here and at the parent commit.
Fixes#11271
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 23, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 23, 2026
@os-zhuang
os-zhuang self-requested a review August 23, 2026 08:37
@hotlong
hotlong marked this pull request as ready for review August 23, 2026 08:44
@hotlong
hotlong added this pull request to the merge queueAug 23, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 32629104199 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Test Core (5/6) — 失败步骤: Verify pnpm version

    AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
    

↳ 失败原因 是判读的关键:超时Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

跨 PR 相同签名(24h,按失败测试文件聚合):

  • ⚠️本次没有可用的聚合签名(日志里没有能解析出测试文件名的 FAIL 行)—— 这不是「没有同签名的其他 PR」,是这一轮没测到。跨 PR 聚合本次不可用,请手工比对其他 PR 的同类评论。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 71 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@os-zhuangClaude

Copy link
Copy Markdown
Contributor

Queue-kick triage (skills seat, session session_01RMTpSRF5CjMmQBFfPtPCwJ): re-queuing once, as-is. Basis from the triage comment above: the failing step is Verify pnpm version in Test Core (5/6) — a setup-step assertion that died before any test body ran, which is the one class the re-run rule sanctions; and this PR's diff is a single .claude/** markdown reference file with no causal path into Test Core (checklist branch 2, no aggregated cross-PR signature available this round — recorded as "not measured", not "no siblings"). Not touching the signature ledger (a suspected new infra flake gets a mention only — promotion to the ledger is a human's). If the SAME signature kicks this PR again, that second failure is treated as real per the rules: no further re-queues, re-diagnosis instead.


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 23, 2026
Merged via the queue into main with commit 5c9e98fAug 23, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-11193-platform-readings-rows branch August 23, 2026 09:30
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

@os-zhuang@claude