Skip to content

investigate: GitHub secondary rate limits — fleet content-creation pacing so filing bursts stop blocking the account #2013

Closed

Description

@dezren39

On 2026-10-28 ~18:30 CDT the account was 'temporarily blocked from content creation' (HTTP 403, secondary rate limit) during a heavy fleet filing evening (the repo's issue count raced past 1999), which blocked a prepared 42-issue program filing. Investigate GitHub's secondary-limit mechanics for issue/PR/comment creation, measure the fleet's creation rates per lane/job, and propose pacing (per-job creation budgets, batching windows, a shared creation throttle) so one burst cannot block the whole account. Note the failure mode that hid it: gh issue create exited 0 with empty output while creating nothing — any fleet filing script must verify creation via a follow-up API read.

Activity

  1. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Parent epic: #2055 — fleet expansion & placement program (2026-10-28 directive). This issue is batch-2 item B11 of that program; it was filed first, as the probe that confirmed the content-creation limit had cleared.

  3. added
    priority/highImportant and time-sensitive
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
  4. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Top priority — ID program wave-1. Drew directed this be picked up in the next runs (2026-10-29): enqueued directly as triage task 3334 in repo-health-code-pilot at queue priority 20 (only breakage-class work at priority 10 outranks it). Wave-1 is the ungated investigations and designs; syntheses and PoCs stay gated on their named inputs. Investigation route: Workhorse.

  5. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
  6. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  7. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Investigation result

    Design record: PR #2226 — doc/2026-10-29T10-08-00Z_design_github-content-creation-pacing/. Follow-on implementation: #2227.

    Premise: confirmed, with measurements

    GitHub API, developing-today/code, bucketed by created_at on the laptop 2026-10-29 (issues + PRs from /issues?state=all, comments from /issues/comments):

    Day (UTC) Issues + PRs Comments Total content-creating events
    2026-10-27 494 1 363 1 857
    2026-10-28 479 2 437 2 916
    2026-10-29¹ 217 1 325 1 542

    ¹ through 10:00Z.

    Caveat: the 403 itself and the gh issue create exit-0-with-no-output behaviour come from this issue's report; no client log of them exists on the laptop, and they were not reproduced. The rates, the gap and the composition are measured independently.

    Documented limits (verified 2026-10-29)

    ~80 content-generating requests/min and ~500/hour (web UI counts too; some endpoints lower); 100 concurrent requests; 900 points/min per REST endpoint; 90 s CPU per 60 s. No way to query secondary-limit status — x-ratelimit-* covers the primary limit only. A breach is 403/429 with optional retry-after; without it wait ≥ 60 s; continuing to retry "may result in the banning of your integration".

    Proposed design

    1. Shared creation ledger (~/.local/state/fleet/content-ledger.sqlite): one row per content-creating call, reservation before, outcome after; 60 s and 3 600 s windows read from the ledger, atomic across processes.
    2. Throttle wrapper: 45/min and 300/hour account-wide (~60 % of the ceiling), ≥ 1 s between POSTs, ≤ 8 in flight, per-lane 50/hour sustained with idle share reclaimable, 75/hour held for priority-10 breakage, bulk programs ≤ 20 issues per 30-minute window.
    3. Verify-by-read: success only when a read confirms the object — non-empty stdout with a number/URL, else a <!-- fleet-nonce:… --> search; empty output is a failure, never success. This is the fix for the silent no-op.
    4. Circuit breaker: honour retry-after, else 60 s then ×2 up to 5 attempts; then stop content creation for 15 minutes and park the calling task with a resume brief.
    5. Structural: one live agent note per task edited in place instead of one comment per checkpoint; target ≤ 2 comments per task.
    6. Gap detector: alert when filing work is queued and no creation happens for > 5 minutes.

    Rollout order: ledger + verify-by-read, then warn-only throttle for a week, then enforcing. Implementation is #2227; this issue can close once #2227 lands.

  8. added a commit that references this issue on Oct 29, 2026
  9. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions