Uh oh!
There was an error while loading. Please reload this page.
docs(pm-skill): record the three label-blind PR read legs, paid by two cuts - #12995
Merged
Merged
Conversation
…o cuts All three documented ways to read a PR's labels are blind, two of them silently: get_labels cannot resolve a PR number (loud), pull_request_read's labels field is intermittently absent or stale, and the issue-page anchor grep matches zero on a PR page. A union-write computed from either silent leg strips labels while reporting success, so the row carries the operative rule: an empty/absent label reading is not a reading of "no labels", and neither a single read nor a single immediate read-back is decisive. Net 0 at the 314-line ceiling, funded by two cuts with surviving homes: the superseded get_labels row (its loud-failure half is carried forward into the new row; its remedy is what this measurement falsifies) and the shared remote-tracking-ref row (AGENTS.md carries it more fully, and .claude/agents/os-dev.md carries the dev-facing half verbatim). Co-Authored-By: Claude <noreply@anthropic.com>
os-zhuang
approved these changes
Aug 28, 2026
os-zhuang
marked this pull request as ready for review
August 28, 2026 13:27
os-zhuang
enabled auto-merge
August 28, 2026 13:27
Uh oh!
There was an error while loading. Please reload this page.
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#12902
One fact row in
.claude/skills/pm-dispatch/references/platform-readings.md, beside theexisting label-write facts (the
skip-changeset/ size-labeler / union-write cluster).All three documented ways to read a PR's label set are blind — two of them silently — so a
union computed from either silent leg strips labels while every step reports success.
The row as landed
Nine lines. All three dated 2026-08-28 measurements are banked in it: leg 2's two
directions (dev seat — field absent twice on a fresh PR; PM seat — present on three
established PRs) and the third measurement (a read minutes after a compare-read-back
reported three labels returned one, two auto-labels gone with no intervening write), which
is what forces the DELAYED confirm into the operative rule.
Net 0 at the 314-line ceiling — cut ledger
The file's ratchet ceiling is 314 with zero headroom, so the nine new lines are paid for by
nine cut lines. No re-wrap line-buying: both cuts remove whole bullets.
issue_read/get_labelsPR rowCould not resolve to an Issuestring, the note that REST's "a PR is an issue" convention does not hold for this method, and the loud-failure-is-a-routing-signal reading. Its remedy (「PR 的标签读数走pull_request_read get(labels 随响应回来)」) is precisely what this card's measurement falsifies, so it is corrected rather than lost.refs/remotes/origin/mainshared-ref rowAGENTS.md§9, which carries it more fully — the four isolated ref namespaces stated exactly (the cut copy said only 工作树与 HEAD), the "staged on arrival" hazard, theFETCH_HEAD-is-per-checkout corollary, and theBASE=$(git rev-parse HEAD)practice — and.claude/agents/os-dev.md「标准条款」家族规则, which carries the dev-facing half verbatim including thegit reset --soft origin/mainspelling and the four-agent measurement.CLAUDE.mdinlines the worktree-isolation half. It is also a local-git fact rather than a GitHub API/tool reading, which is what this table's own header scopes it to.One provenance detail is deliberately dropped: leg 1's earlier
2026-08-27 两个 dev 独立实测date. It is superseded, not lost — leg 1 was reproduced twice on 2026-08-28 (~2 minutes
apart, ruling out creation lag) and the row carries that date with the error string intact.
Gate verdicts
Union derived mechanically, not recalled:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(8 families matched from the change set the script derivesitself). Re-run after the final commit and green on it — all figures below are from
d6e9dc3b3. Every exit code captured before any pipe (redirect to a file, read the fileafter).
check:pm-skill-ratchet(314 ceiling)✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 314 lines (ceiling 314; headroom 0).check:pm-skill-ratchet(max-line rule).claude/skills/pm-dispatch/references/platform-readings.md: every line is within 120 bytes (or structurally exempt).— the 120-byte rule prints only on failure, so this verdict was taken positively by calling the gate's ownscanLineLengths/lengthVerdictexports on the landed file rather than read off an absence.check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).check:pm-governed-prose✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck:skill-frame-freshness✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).check:agent-test-spellingcheck:doc-authoringcheck:doc-formula-expressions@objectstack/formulaand@objectstack/lintbuilt first — its two earlierPREREQUISITE NOT METexits were not measurements)check:pm-governed-mergescheck:nul-bytescheck-governed-queue-guard.mjs⛔ … could not read GITHUB_EVENT_PATH— NOT MEASURED locally, not red. It reads the workflow event payload and nothing else, so it is CI-owned; it exits non-zero rather than green when it cannot look, by design.Everything ran through
scripts/pm/os-verify-lock.shon slotissue-12902-skills(
VERDICT command-exit 0 · held the lock 17s · waited 0son the final pass).Delivery
Draft, base
main, docs-only. Not flipped ready, no reviewers requested, no auto-merge —the PM runs the four-piece. Authored in session
https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq(recorded here as prose because abody PATCH downgrades the session-form footer to the bare form).
skip-changesetwas applied at open through the MCP fallback, running the exact protocolthis row lands — and the run reproduced the card's near-miss live, with the legs swapped:
chips in the HTML, and the PR page's embedded JSON carries no labels array at all (four
JSON blocks scanned) — unlike an issue page. A
data-name=grep on a PR page whose bodydocuments that spelling also matches the body text, so the grep must be scoped to the
chip markup or it reads its own documentation back.
pull_request_read get(leg 2) at the same minute:documentation,size/s—populated, and correct.
{skip-changeset}and thewhole-set replace would have stripped both auto-labels. The union actually written was
{documentation, size/s, skip-changeset}.So on this PR the silent leg was leg 3 and leg 2 was the sound one — the reverse of the
dev-seat run the row records. That is the row's point restated by a third instance: the
blindness is not stable per leg, which is why the rule is "empty is not a reading" rather
than "prefer leg N". Comparative read-back and a delayed confirm follow in the report on
the card.
Generated by Claude Code