You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
investigate: GitHub secondary rate limits — fleet content-creation pacing so filing bursts stop blocking the account #2013
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.
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.
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.
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.
Peak hour 2026-10-28 22:00Z = 511 events (359 comments + 152 issues/PRs) — at GitHub's documented 500 content-generating requests per hour ceiling, for this one repository, before the other three fleet repos and any web-UI actions.
Peak minute: 39 (2026-10-29 01:00Z, the batch-2 filing). Ten-minute stretches reached 144, 129 and 95 — the 80/min ceiling was never hit, so the block came from the hourly, not the per-minute, limit.
One identity: 1 900 of 1 978 recently created items are dezren39. Every lane, producer and interactive agent shares the account, so the ceiling is a single account-wide budget nothing can see.
Comments are the volume: 2 437 on 28 October, five times the issue/PR count — agent notes at every transition.
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
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.
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.
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.
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.
Structural: one live agent note per task edited in place instead of one comment per checkpoint; target ≤ 2 comments per task.
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.
Verified: design file present on main; treefmt on the changed file locally — 0 files changed. CI jobs (treefmt check, Auto Assign) were queued with no runner available at merge time; the repository has no required status checks and the change is one Markdown file.
Not verified: the 403 and the gh exit-0-with-no-output behaviour are from this issue's report; not reproduced (no client log found on the laptop).
Activity
developing-today commentedon Oct 29, 2026
CODE-934
dezren39 commentedon Oct 29, 2026
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.
dezren39 commentedon Oct 29, 2026
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.
dezren39 commentedon Oct 29, 2026
🤖 Agent note · picked up
dezren39 commentedon Oct 29, 2026
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 bycreated_aton the laptop 2026-10-29 (issues + PRs from/issues?state=all, comments from/issues/comments):¹ through 10:00Z.
dezren39. Every lane, producer and interactive agent shares the account, so the ceiling is a single account-wide budget nothing can see.Caveat: the 403 itself and the
gh issue createexit-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 optionalretry-after; without it wait ≥ 60 s; continuing to retry "may result in the banning of your integration".Proposed design
~/.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.<!-- fleet-nonce:… -->search; empty output is a failure, never success. This is the fix for the silent no-op.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.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.
Merge pull request #2226 from developing-today/queue/3334-2013-conten…
dezren39 commentedon Oct 29, 2026
🤖 Agent note · done
repo-worker-code), OpenChamber scheduled lanedoc/2026-10-29T10-08-00Z_design_github-content-creation-pacing/(merge1781911).main;treefmton the changed file locally — 0 files changed. CI jobs (treefmt check,Auto Assign) were queued with no runner available at merge time; the repository has no required status checks and the change is one Markdown file.ghexit-0-with-no-output behaviour are from this issue's report; not reproduced (no client log found on the laptop).