Filed unassigned from the domain:cli lane execution seat (session session_019bmVFqoQPq63zhKrxdYG1r), recording only. Surfaced by the maintainer asking, in as many words, 「ci 绿了为什么不合并」 — a question the seat could not answer from its own state, which is the point of this card.
What is MEASURED
| time (UTC) |
event |
| 11:56Z |
enable_pr_auto_merge on #10788 → API rate limit already exceeded for user ID 318303764 |
| 12:01:36Z |
update_pull_request #10788 draft:false → success. enable_pr_auto_merge #10788 → returned a success message |
| 12:27Z |
#10788 read as open, draft:false, mergeable_state: clean, all six required checks terminal-green |
| 12:52Z · 12:56Z · 13:50Z |
re-arm attempts → rate limit again (even plain PR lookups failed) |
| 13:19Z · 14:04Z · 14:19Z |
other PRs merged to main (#10823, #10851, #10852) — the merge path was working the whole time |
| ~14:33Z |
quota recovered; enable_pr_auto_merge #10788 → same success message |
| 14:34:20Z |
#10788 merged — within ~1 minute of that call |
| 14:34:52Z |
#10819, armed in the same recovered window, also merged |
So: a call that returned success at 12:01Z was followed by 2.5 hours of nothing, and an identical call after quota recovery merged the PR in about a minute.
What is INFERRED (stated as inference, not measurement)
The most parsimonious reading is that the 12:01Z call's success message was false — the quota was already exhausted five minutes earlier, and the underlying mutation did not take effect while the tool reported that it had.
⚠️ I cannot prove this. The alternative — that the arm did take and something else held the PR for 2.5h, then coincidentally released it within a minute of a re-arm — is not ruled out by anything I measured. What is ruled out, by the table above, is the explanation I initially favoured: auto-merge does not silently no-op on an already-green PR. Both PRs in the recovered window were fully green when armed and both merged immediately. That hypothesis is dead, and it was wrong.
Why this is worth a card rather than a note
Two properties compound:
- The quota is a shared, cross-seat resource.
CLAUDE.md states every agent shares one GitHub identity. So exhaustion is collective — one seat's polling (mine, in this instance: I read one PR's check runs three times while waiting for it to converge) degrades every seat's ability to enqueue.
- The failure is silent and inverted. A refused call is loud and handled. A call that reports success while doing nothing leaves the seat believing the PR is enqueued, the card annotated
pm-dispatch-enqueue, and every gauge reading "in progress" — with nobody merging it. It is invisible from the seat's own state; only the absence of a merge, elsewhere, is wrong.
⭐ That second shape is one this repo already knows by name: it is the same class as the H20 half-state (a complete claim comment with no remote ref) and as the two CLI defects this lane landed today — os datasource validate passing over drift it never read, and os doctor printing ✓ over a tree it never walked. A tool that answers "done" about work it did not do.
Suggested shape (grading input, not a prescription)
Not a duplicate
Filed unassigned from the
domain:clilane execution seat (sessionsession_019bmVFqoQPq63zhKrxdYG1r), recording only. Surfaced by the maintainer asking, in as many words, 「ci 绿了为什么不合并」 — a question the seat could not answer from its own state, which is the point of this card.What is MEASURED
enable_pr_auto_mergeon #10788 →API rate limit already exceeded for user ID 318303764update_pull_request#10788draft:false→ success.enable_pr_auto_merge#10788 → returned a success messageopen,draft:false,mergeable_state: clean, all six required checks terminal-greenmain(#10823, #10851, #10852) — the merge path was working the whole timeenable_pr_auto_merge#10788 → same success messageSo: a call that returned success at 12:01Z was followed by 2.5 hours of nothing, and an identical call after quota recovery merged the PR in about a minute.
What is INFERRED (stated as inference, not measurement)
The most parsimonious reading is that the 12:01Z call's success message was false — the quota was already exhausted five minutes earlier, and the underlying mutation did not take effect while the tool reported that it had.
Why this is worth a card rather than a note
Two properties compound:
CLAUDE.mdstates every agent shares one GitHub identity. So exhaustion is collective — one seat's polling (mine, in this instance: I read one PR's check runs three times while waiting for it to converge) degrades every seat's ability to enqueue.pm-dispatch-enqueue, and every gauge reading "in progress" — with nobody merging it. It is invisible from the seat's own state; only the absence of a merge, elsewhere, is wrong.⭐ That second shape is one this repo already knows by name: it is the same class as the H20 half-state (a complete claim comment with no remote ref) and as the two CLI defects this lane landed today —
os datasource validatepassing over drift it never read, andos doctorprinting✓over a tree it never walked. A tool that answers "done" about work it did not do.Suggested shape (grading input, not a prescription)
enable_pr_auto_merge, read the PR'sauto_mergefield back and confirm it is non-null. A one-call read-back turns a silent 2.5-hour stall into an immediate, actionable error. (This is the same lesson as [finding] A GitHub comment body is TRUNCATED from the first angle-bracket fragment that names an HTML element onward — agent reports are being silently destroyed, not just their markers #10770's read-back-the-tail, one layer down: confirm the effect, not the response.)Not a duplicate
git— it costs no quota); it is recorded here as a contributing cause, not as the defect.