Skip to content

docs(pm-skill): correct the merge-queue membership reading — refs answer about BUILDS, the probes answer about membership - #12889

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-12873-queue-membership-reading
Aug 28, 2026
Merged

docs(pm-skill): correct the merge-queue membership reading — refs answer about BUILDS, the probes answer about membership#12889
os-litant merged 2 commits into
mainfrom
claude/issue-12873-queue-membership-reading

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes #12873

Governed surface (.claude/**) — DRAFT, awaiting a human merge. No reviewer requested here; the skills-lane PM runs the ACCEPT four-piece.

One file, one row rewritten, net 0 lines against a ceiling with headroom 0.

The correction

gh-readonly-queue/* answers about queue BUILDS, never about queue MEMBERSHIP. A PR can be queued and carry no ref at all, so the ref is evidence only when it is PRESENT — its absence is a reading in neither direction. The standing row read absence as weak-but-real counter-evidence and attributed it to a saturated queue not having built the branch yet; both measurements below show a queued PR with zero refs and two independent positives at the same moment.

Old row to new row

retired replaced by
"the queue branch is decisive on a positive hit; absence is not counter-evidence — the branch is not built yet when the queue is saturated" (inside the timeline row) deleted; the general rule now lives in the row below
the five-step enable-verification sequence, ref-first: verify the queue branch (20-30s to build) → present ⇒ stop → absent ⇒ update-branch to flush a dark conflict → still absent ⇒ re-arm once, the 405 being the retry's byproduct → never interleave a disable one row headed "queue ref answers BUILD, not membership": refs meaningful only when present; positive probes in cost order — (1) update_pull_request_branch answering "Branches that are queued for merging cannot be updated" = queued, and on a normal return it still flushes the dark conflict as a byproduct; (2) merge_pull_request answering 405 "Pull Request is in the merge queue" = queued, while 405 "Merge commits are not allowed" = not queued, so arm auto-merge instead. Plus: the two response shapes of enable_pr_auto_merge answer about the CALL, not about membership; the no-interleaved-disable rule kept verbatim in effect; two dequeue causes recorded

Facts carried in

  • Refs are a build signal. Present = a build is running; absent = nothing measured.
  • Probes, cheapest first. The update-branch refusal text, then the merge-call 405. Two dated measurements, both 2026-08-28, from two different seats, each a positive with zero refs visible: the finding's spec-seat reading, and the dispatching seat's own 405 on a live queued PR that morning.
  • The 405 discriminates both ways. The in-the-merge-queue text is a positive; the merge-commits-not-allowed text is a negative, and the remedy for it is to arm auto-merge.
  • enable_pr_auto_merge has two response shapes. A timestamped one (this call did something) and an empty-field one (this call did nothing, seen on PRs already clean or already armed). Deliberately worded to say what each shape reports about the call, and no more: the same section already records a quota-exhausted success response with no arming behind it, and an empty-field response accompanying a perfectly real queue-path enqueue, so neither shape is effect evidence and the corrected row does not resurrect either inference.
  • Two dequeue causes observed. A sibling landing ahead ⇒ MERGE_CONFLICT; a missing required approval ⇒ the governed guard's merge_group leg reports CI_FAILURE — a dequeue that reads like a flaky test and is not one. It sits directly above the existing signature-triage row.

Cut ledger — what paid for it, and where each survivor lives

Net 0 lines (9 insertions, 9 deletions) against platform-readings.md at 314/314.

cut disposition
the ref-presence sentence in the timeline row (2 lines) superseded; the general rule replaces it
sequence steps 1-2 (verify the branch first; present ⇒ stop, do not flip) the positive half survives as "meaningful only when present"; the ordering it implied is retired
the "20-30s to build" latency figure dropped — it priced a wait for a signal that no longer decides membership
sequence step 3, the dark-conflict flush kept, folded into probe (1) as the byproduct of a normal return: a dark conflict does not eject an armed PR, it only prevents it from ever enqueueing
the "measured one PR armed 40+ minutes before update-branch surfaced the conflict" datum dropped for budget; the operative half ("never enqueues") is kept
sequence step 4, re-arm once dropped as a step; the 405 it produced is now probe (2) in its own right
sequence step 5, never interleave a disable kept verbatim in effect, compressed

Everything else in the file is byte-identical — confirmed by the diff being exactly the two hunks above.

Verification

Gate union derived mechanically from the changeset, not recalled: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (8 families; re-derived after the main merge from a non-stale tree). All verdicts below are from runs on the final commit 8d2392eb7, exit codes captured before any pipe.

check:pm-skill-ratchet     EXIT=0
  platform-readings.md is 314 lines (ceiling 314; headroom 0)
  platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0)
  (the 120-byte max-line rule is inside this gate; every new line measures 109-120 bytes)
check:pm-skill-id-lint     EXIT=0   23 file(s) clean (no issue-id citations in the new text)
check:skill-frame-sync     EXIT=0   4 copies of the decision frame structurally isomorphic
check:skill-frame-freshness EXIT=0  the frame in this tree is current with origin/main
check:agent-test-spelling  EXIT=0
check:doc-authoring        EXIT=0   392 files clean; 48 published skill files clean
check:doc-formula-expressions EXIT=0  self-test 50 cases; 22 examples across 425 files clean
check:pm-governed-merges   EXIT=0   self-test 204 assertions
check:nul-bytes            EXIT=0   7168 text files, no raw ASCII control bytes

Two of the eight could not be measured locally and are named rather than claimed: check-governed-queue-guard.mjs is a workflow-event guard and refuses without an event payload (its --self-test runs here: 113 cases pass), and both check:doc-authoring and check:doc-formula-expressions first answered PREREQUISITE NOT MET until pnpm install and a @objectstack/formula + @objectstack/lint build under the shared verify lock — the exit-1 in between was a missing prerequisite, not a finding. No repo-wide pnpm lint sweep was run; CI owns that run.

Follow-up filed, not fixed here

#12888 records three sites that still read ref ABSENCE as proof a PR left the queue — the draft-flip dequeue-remedy row and the arming-effect enumeration in this same file, and the ACCEPT-fork sentence in pm-dispatch/SKILL.md. Correcting them is a line-budget transaction on two ceilings at headroom 0, which this card's net-0 scope could not fund. That card is not addressed here.

No script quotes the retired rule: the two scripts that mention gh-readonly-queue parse head refs out of merge_group payloads, which is a queue-BUILD question and stays correct.

Changeset

None — .claude/** publishes nothing. Carries skip-changeset.


Generated by Claude Code

claude added 2 commits August 28, 2026 06:57
Queue refs answer about queue BUILDS, not membership: a queued PR can carry
no ref at all, so absence is a reading in neither direction. Replace the
superseded ref-presence rule with the measured positive probes in cost order
(update-branch refusal text, then the merge-call 405), the two response shapes
of enable_pr_auto_merge, and the two observed dequeue causes.

Net 0 lines against the 314-line ceiling: the superseded rows fund the
correction.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 28, 2026
@os-litant
os-litant added this pull request to the merge queue Aug 28, 2026
Merged via the queue into main with commit b8ee402 Aug 28, 2026
32 checks passed
@os-litant
os-litant deleted the claude/issue-12873-queue-membership-reading branch August 28, 2026 09:32
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 skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants