Filed by the domain:devx execution seat, session session_017ef78bLdybu3AffehKkhfk, round 5, from a cycle it burned on PR #18415. ⛔ Observation-class: finding only, unlabelled for domain:* and ungraded; routing and the first grading are triage's.
What was measured, in one arming
Arming PR #18415 (a content/docs/** diff, not a governed surface), two channels, both asking for squash:
| channel |
what was asked |
what came back |
MCP enable_pr_auto_merge with mergeMethod: "SQUASH" |
squash |
Auto-merge enabled … (method: MERGE, enabled at 2026-09-16T10:08:26Z) |
the CCR route PUT /repos/{o}/{r}/pulls/{n}/ccr/auto_merge, body {"merge_method":"squash"} |
squash |
{"enabled":true,"merge_method":"merge"} |
GET /pulls/18415 readback |
— |
auto_merge.merge_method: "merge" |
⇒ Both channels accept squash, neither honours it, and neither says it did not. The request is not rejected and no warning is emitted; the only tell is a readback a seat has to think to take.
⛔ GraphQL is not an escape hatch — enablePullRequestAutoMerge(mergeMethod: SQUASH) answers GitHub GraphQL is not available from Claude Code sessions and names the CCR route above as the replacement, so the CCR route is the whole of the channel.
Why it costs a cycle rather than a merge commit
The shape the repository actually lands is squash, and the merge queue is what decides it — ⛔ not the PR's auto_merge.merge_method:
| landing |
parents |
armed by |
588475c30f (PR #18398) |
1 |
os-elon-musk, added_to_merge_queue 2026-09-16T09:24:08Z, merged by github-merge-queue[bot] |
c3a95d97b8 (PR #18381) |
1 |
this seat, through this same channel that can only set merge |
⇒ the outcome is correct; the readback is misleading, and it is misleading at exactly the moment a seat is deciding whether it is about to break the repository's history convention. A seat that reads merge_method: "merge" and believes it has to disarm, hunt for a squash channel, try GraphQL and get refused, has spent a cycle to arrive back where it started. ⚠️ That is the cycle this filing is made of; ⛔ the arming itself was never wrong.
The gap
Nothing in the seat's own references says this. The arming guidance treats auto_merge as a thing with a method, and the queue-membership guidance (see #18400, which establishes that the timeline added_to_merge_queue event is the decisive membership reading) is about membership, not method — ⛔ a different question, and neither answers the other.
Shape (⛔ a proposal, not a prescription)
One row wherever the arming channel is described, saying three things: the channel forces merge_method: merge; a requested squash is dropped without an error; and the landing shape is the merge queue's to decide, so auto_merge.merge_method is ⛔ not a reading about what will land — the same footing the auto_merge boolean already has for membership.
⚠️ If that row lands in .claude/skills/pm-dispatch/references/platform-readings.md it is a governed surface ⇒ human-merge or a pinned approval, ⛔ never seat-armed.
Dedupe
All 522 open non-PR issues read via REST (⛔ no search_issues), title and body grepped. merge_method → 4 hits, all four are pm:seat status boards (#6367, #6026, #6024, #6021) mentioning it in ledger prose, ⛔ none a finding about the channel. mergeMethod → 0. Firing controls on the same corpus: auto_merge|auto-merge → 16, merge queue|merge_queue|合并队列 → 16, squash → 13. Dark control → 0. ⇒ the corpus was really read.
⚠️ Related, ⛔ not asserted as a duplicate: #18400 (domain:skills, pm:queue) — the queue-membership reading on the same page.
Generated by Claude Code
Filed by the
domain:devxexecution seat, sessionsession_017ef78bLdybu3AffehKkhfk, round 5, from a cycle it burned on PR #18415. ⛔ Observation-class:findingonly, unlabelled fordomain:*and ungraded; routing and the first grading are triage's.What was measured, in one arming
Arming PR #18415 (a
content/docs/**diff, not a governed surface), two channels, both asking for squash:enable_pr_auto_mergewithmergeMethod: "SQUASH"Auto-merge enabled … (method: MERGE, enabled at 2026-09-16T10:08:26Z)PUT /repos/{o}/{r}/pulls/{n}/ccr/auto_merge, body{"merge_method":"squash"}{"enabled":true,"merge_method":"merge"}GET /pulls/18415readbackauto_merge.merge_method: "merge"⇒ Both channels accept
squash, neither honours it, and neither says it did not. The request is not rejected and no warning is emitted; the only tell is a readback a seat has to think to take.⛔ GraphQL is not an escape hatch —
enablePullRequestAutoMerge(mergeMethod: SQUASH)answersGitHub GraphQL is not available from Claude Code sessionsand names the CCR route above as the replacement, so the CCR route is the whole of the channel.Why it costs a cycle rather than a merge commit
The shape the repository actually lands is squash, and the merge queue is what decides it — ⛔ not the PR's
auto_merge.merge_method:588475c30f(PR #18398)os-elon-musk,added_to_merge_queue2026-09-16T09:24:08Z, merged bygithub-merge-queue[bot]c3a95d97b8(PR #18381)merge⇒ the outcome is correct; the readback is misleading, and it is misleading at exactly the moment a seat is deciding whether it is about to break the repository's history convention. A seat that reads⚠️ That is the cycle this filing is made of; ⛔ the arming itself was never wrong.
merge_method: "merge"and believes it has to disarm, hunt for a squash channel, try GraphQL and get refused, has spent a cycle to arrive back where it started.The gap
Nothing in the seat's own references says this. The arming guidance treats
auto_mergeas a thing with a method, and the queue-membership guidance (see #18400, which establishes that the timelineadded_to_merge_queueevent is the decisive membership reading) is about membership, not method — ⛔ a different question, and neither answers the other.Shape (⛔ a proposal, not a prescription)
One row wherever the arming channel is described, saying three things: the channel forces
merge_method: merge; a requestedsquashis dropped without an error; and the landing shape is the merge queue's to decide, soauto_merge.merge_methodis ⛔ not a reading about what will land — the same footing theauto_mergeboolean already has for membership..claude/skills/pm-dispatch/references/platform-readings.mdit is a governed surface ⇒ human-merge or a pinned approval, ⛔ never seat-armed.Dedupe
All 522 open non-PR issues read via REST (⛔ no
search_issues), title and body grepped.merge_method→ 4 hits, all four arepm:seatstatus boards (#6367, #6026, #6024, #6021) mentioning it in ledger prose, ⛔ none a finding about the channel.mergeMethod→ 0. Firing controls on the same corpus:auto_merge|auto-merge→ 16,merge queue|merge_queue|合并队列→ 16,squash→ 13. Dark control → 0. ⇒ the corpus was really read.domain:skills,pm:queue) — the queue-membership reading on the same page.Generated by Claude Code