Skip to content

[finding] enable_pr_auto_merge reported success while the shared GitHub quota was exhausted, and auto-merge was never actually enabled — a green PR sat unmerged for 2.5h with every gauge reading "enqueued" #10872

Description

@os-elon

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:56Zenable_pr_auto_merge on #10788API rate limit already exceeded for user ID 318303764
12:01:36Zupdate_pull_request#10788draft:false → success. enable_pr_auto_merge#10788returned 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:50Zre-arm attempts → rate limit again (even plain PR lookups failed)
13:19Z · 14:04Z · 14:19Zother PRs merged to main (#10823, #10851, #10852) — the merge path was working the whole time
~14:33Zquota 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:

  1. 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.
  2. 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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions