rules(rate-limit-tier): REST PR-creation fallback under Pure-git tier (PR #4105 anchor)#4107
Merged
AceHack merged 1 commit intoMay 17, 2026
Conversation
… (PR #4105 empirical anchor) Adds a sub-section to refresh-world-model-poll-pr-gate.md under "Pure-git tick pattern (empirical)" documenting that `gh pr create` uses GraphQL but the REST POST /repos/.../pulls endpoint works during Pure-git tier (REST budget is separate from GraphQL budget). Empirical anchor: PR #4105 opened via REST at 2026-05-17T21:54Z when GraphQL was 0/5000 (28 min from reset). REST core was at 4838 at the time. Caveats documented: - gh pr merge --auto is GraphQL-only (no REST equivalent for enablePullRequestAutoMerge); PR opened via REST sits without auto-merge until post-reset tick. - gh pr comment is GraphQL; REST equivalent is POST /repos/.../issues/N/comments. - resolveReviewThread is GraphQL-only. - REST PR-creation does NOT bypass branch protection. - JSON body must use HEREDOC + temp file; inline shell-quoted JSON is fragile. The fallback applies when a substantive landing is ready but you want the PR visible BEFORE the reset window so reviewers can pick it up immediately. Without auto-merge arming, the next post-reset tick must explicitly arm it. Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Documentation-only addition to the Pure-git tier rule, recording a REST-based PR-creation fallback when the GraphQL budget is exhausted, with an empirical anchor (PR #4105) and explicit caveats about features (auto-merge, comments, review-thread resolution) that remain GraphQL-only.
Changes:
- Adds a new "REST PR-creation fallback under Pure-git tier" sub-section with a HEREDOC+
gh apirecipe. - Documents the GraphQL-only caveats (
gh pr merge --auto,gh pr comment,resolveReviewThread) and that branch protection still applies. - Anchors the pattern to the 2026-05-17T21:54Z PR #4105 instance.
3 tasks
AceHack
added a commit
that referenced
this pull request
May 17, 2026
… claim + duplicate-merge + clean-cycle count Three reviewer findings addressed: 1. **Codex P2 (line 330)** — "Align cadence claim with timeline": Original claim said "~2 pre-empts per ~30-min window"; table showed 4 pre-empts (cycles 3, 5, 6, 7). Corrected to "~3-4 Otto-initiated pre-empts per window, the 4th typically being the forced-#6 meta-fallback." 2. **Codex P2 (line 340)** — "Fix duplicate merge event for #4104": Cycle 3 listed PR #4104 as "merged" but it was OPENED + auto-armed in cycle 3 and didn't actually MERGE until cycle 4 (when CI cleared). Restated cycle 3 as "opened + auto-armed" and clarified cycle 4 as the merge event. 3. **Copilot (line 345)** — "Reconcile first ~4 clean pre-empts with cycle 2 = no concrete artifact": The "first ~4 cycles" wording over-counted. Cycle 2 had no pre-empt (no named dep, no escalation, no artifact); cycles 1 + 4 were external counter-reset-via-merge events, not Otto-initiated pre-empts. Restated to count only Otto-initiated pre-empts (3 clean before saturation + 1 forced-#6 = 4 total). Added a "Note on terminology" sub-section distinguishing: - Otto-initiated pre-empt (Otto produces a concrete artifact in response to brief-ack pressure) - Counter-reset-via-merge (external auto-merge firing resets the counter but doesn't count toward pre-empt cadence) Composes with the Codex finding's underlying concern: the rule must distinguish "discipline-bounded Otto behavior" from "external state changes" when measuring cadence. Without that distinction, the cadence claim conflated the two and over-stated the pre-empt budget. Bonus row added to timeline: cycle 8 (22:20Z) — PR #4107 merged via REST PUT /pulls/N/merge bypass when GraphQL was still exhausted. This is the post-forced-#6 substantive close of the window. Co-Authored-By: Claude <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 17, 2026
…self-documenting) (#4110) * rules(holding): pre-empt-substrate-pool-saturation anchor — single GraphQL-reset window cadence (2026-05-17T21:29Z-22:13Z, forced-#6 at end) Fifth empirical anchor for holding-without-named-dependency-is- standing-by-failure.md. Observed pattern: cycling brief-ack chains under sustained GraphQL exhaustion produce a natural cadence of roughly 2 substantive pre-empts per ~30-min GraphQL reset window before pre-empt-substrate-pool saturates. Session timeline: 7 cycles across ~44 min; first ~4 cycles produced clean pre-empts; cycles 5-6 were forced into REST-only operation by GraphQL exhaustion; cycle 7 reached forced-#6 because the substrate pool of non-fabricated improvements had saturated. Operational lesson: pre-empt-at-#5 is NOT infinitely repeatable within a single rate-limit window. The 06:02Z anchor demonstrated 10 cycles without forced-#6, but those were spread across 2h 27min with multiple resets between cycles (each reset refreshing the substrate-discovery context). When the window is shorter (~30 min) AND no major external state changes occur, the natural cadence is ~2 pre-empts before saturation. Forced-#6 is then NOT a failure of pre-empt discipline; it's substrate-honest acknowledgment that the pool is exhausted for THIS window. Riding cleanly to #6 and applying the meta-fallback is the discipline WORKING. THIS commit is itself the forced-#6 meta-fallback firing, recursively-self-documenting. Composes with refresh-world-model-poll-pr-gate.md (REST PR-creation fallback enabled cycles 5-6 productivity; without it those cycles would have deferred). Co-Authored-By: Claude <noreply@anthropic.com> * fix(rule-anchor/4110): address Codex P2 + Copilot findings on cadence claim + duplicate-merge + clean-cycle count Three reviewer findings addressed: 1. **Codex P2 (line 330)** — "Align cadence claim with timeline": Original claim said "~2 pre-empts per ~30-min window"; table showed 4 pre-empts (cycles 3, 5, 6, 7). Corrected to "~3-4 Otto-initiated pre-empts per window, the 4th typically being the forced-#6 meta-fallback." 2. **Codex P2 (line 340)** — "Fix duplicate merge event for #4104": Cycle 3 listed PR #4104 as "merged" but it was OPENED + auto-armed in cycle 3 and didn't actually MERGE until cycle 4 (when CI cleared). Restated cycle 3 as "opened + auto-armed" and clarified cycle 4 as the merge event. 3. **Copilot (line 345)** — "Reconcile first ~4 clean pre-empts with cycle 2 = no concrete artifact": The "first ~4 cycles" wording over-counted. Cycle 2 had no pre-empt (no named dep, no escalation, no artifact); cycles 1 + 4 were external counter-reset-via-merge events, not Otto-initiated pre-empts. Restated to count only Otto-initiated pre-empts (3 clean before saturation + 1 forced-#6 = 4 total). Added a "Note on terminology" sub-section distinguishing: - Otto-initiated pre-empt (Otto produces a concrete artifact in response to brief-ack pressure) - Counter-reset-via-merge (external auto-merge firing resets the counter but doesn't count toward pre-empt cadence) Composes with the Codex finding's underlying concern: the rule must distinguish "discipline-bounded Otto behavior" from "external state changes" when measuring cadence. Without that distinction, the cadence claim conflated the two and over-stated the pre-empt budget. Bonus row added to timeline: cycle 8 (22:20Z) — PR #4107 merged via REST PUT /pulls/N/merge bypass when GraphQL was still exhausted. This is the post-forced-#6 substantive close of the window. Co-Authored-By: Claude <noreply@anthropic.com> * fix(rule-anchor/4110): address Codex P2 line-355 cadence-baseline inconsistency Codex caught a remaining inconsistency in the "Composes with" paragraph: the rest of the new anchor consistently uses "3-4 pre-empts" but line 355's compose paragraph still said "natural-cadence-of-2-pre-empts." That created conflicting operational guidance inside the same section. Fixed: paragraph now reads "The 3-4-Otto-initiated-pre-empts cadence observed here is conditional on REST fallback being available — without it, cycles 5-6 fall out and the cadence drops to ~2 with the meta-fallback firing earlier." This preserves the original load-bearing point (REST fallback enables more pre-empts per window) while keeping the cadence baseline consistent with the rest of the anchor (3-4 with REST, ~2 without). Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
This was referenced May 17, 2026
5 tasks
AceHack
added a commit
that referenced
this pull request
May 18, 2026
…t window (4 min before reset) under pure rate-zero tier — 2nd counter cycle this session (0020Z-0024Z) Specific edge case of substrate-pool-saturation: forced-#6 counter escalation lands when genuinely-substantive work (REST PR-creation post-reset) is single-digit minutes away. Rule discipline says escalate NOW; substantive work says wait 4 min for reset. This memo ships as forced-#6 substrate (composes with #4110 substrate-pool- saturation anchor; does NOT duplicate scope). Anti-fabrication check: names specific empirical shape not covered by existing rules; concrete tick-by-tick evidence (6 brief-acks 0020Z-0024Z); identifies rule-refinement question without recommending change. Single-anchor; rule-change threshold 2-3 sessions. Counter discipline: forced-#6 → concrete artifact ships (this memo) → counter resets. Post-rate-reset (0028Z, 4 min) handles 848bdcf Kestrel-preservation decompose-PR via REST PR-creation per rule #4107. Co-Authored-By: Claude <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 18, 2026
… + REST fallback pagination per_page=100 --paginate (PR #4109 threads)
AceHack
added a commit
that referenced
this pull request
May 18, 2026
AceHack
added a commit
that referenced
this pull request
May 18, 2026
AceHack
added a commit
that referenced
this pull request
May 21, 2026
…t window (4 min before reset) under pure rate-zero tier — 2nd counter cycle this session (0020Z-0024Z) Specific edge case of substrate-pool-saturation: forced-#6 counter escalation lands when genuinely-substantive work (REST PR-creation post-reset) is single-digit minutes away. Rule discipline says escalate NOW; substantive work says wait 4 min for reset. This memo ships as forced-#6 substrate (composes with #4110 substrate-pool- saturation anchor; does NOT duplicate scope). Anti-fabrication check: names specific empirical shape not covered by existing rules; concrete tick-by-tick evidence (6 brief-acks 0020Z-0024Z); identifies rule-refinement question without recommending change. Single-anchor; rule-change threshold 2-3 sessions. Counter discipline: forced-#6 → concrete artifact ships (this memo) → counter resets. Post-rate-reset (0028Z, 4 min) handles 848bdcf Kestrel-preservation decompose-PR via REST PR-creation per rule #4107. Co-Authored-By: Claude <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 21, 2026
…t window (4 min before reset) under pure rate-zero tier — 2nd counter cycle this session (0020Z-0024Z) Specific edge case of substrate-pool-saturation: forced-#6 counter escalation lands when genuinely-substantive work (REST PR-creation post-reset) is single-digit minutes away. Rule discipline says escalate NOW; substantive work says wait 4 min for reset. This memo ships as forced-#6 substrate (composes with #4110 substrate-pool- saturation anchor; does NOT duplicate scope). Anti-fabrication check: names specific empirical shape not covered by existing rules; concrete tick-by-tick evidence (6 brief-acks 0020Z-0024Z); identifies rule-refinement question without recommending change. Single-anchor; rule-change threshold 2-3 sessions. Counter discipline: forced-#6 → concrete artifact ships (this memo) → counter resets. Post-rate-reset (0028Z, 4 min) handles 848bdcf Kestrel-preservation decompose-PR via REST PR-creation per rule #4107. Co-Authored-By: Claude <noreply@anthropic.com>
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 free
to 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.
Adds a sub-section to
refresh-world-model-poll-pr-gate.mdunder "Pure-git tick pattern (empirical)" documenting RESTPOST /repos/.../pullsas a fallback when GraphQL is exhausted.Empirical anchor: PR #4105 opened via REST at 2026-05-17T21:54Z when GraphQL was 0/5000 (28 min from reset). REST
corewas at 4838 at the time — separate budget.Caveats documented:
gh pr merge --autois GraphQL-only (no REST equivalent forenablePullRequestAutoMerge); PR opened via REST sits without auto-merge until post-reset tick.gh pr commentis GraphQL; REST equivalent isPOST /repos/.../issues/N/comments.resolveReviewThreadis GraphQL-only.The fallback applies when a substantive landing is ready but you want the PR visible BEFORE the reset window so reviewers can pick it up immediately. Without auto-merge arming, the next post-reset tick must explicitly arm it.
This PR itself was also opened via the REST endpoint — recursively-self-documenting the pattern.
Co-Authored-By: Claude noreply@anthropic.com