A sourced, append-only record of discretionary AI quota resets — and two forecasts built on it. Covers March–July 2026. Published by Kingy AI.
Ledger covers March–July 2026 · last updated · the Codex figure is re-reckoned against your clock on load, so it is never the frozen build-time number. If a reset happened that this ledger has not recorded yet, the figure reads low, not high.
Uncalibrated. These are hand-set priors from the public event record, not fitted parameters, and none has been checked against an outcome. There is no accuracy score behind them yet. The Codex figure is derived from this ledger's own record of when resets actually happened and updates as time passes; the Claude Code figure comes from a stated baseline, because no supported channel exposes its usage state. How they are built · why they may be wrong.
How the Quota Reset Index records events and how it forecasts them — including what it cannot do, and what it would take to fix that.
The ledger is the asset. It records discretionary quota resets with evidence links and a confidence grade, and it makes no predictions, so it cannot be wrong in the way a forecast can. The forecasts below sit on top of it and are strictly the less trustworthy half of this project.
An audit on 2026-07-26 found that 24 of 29 records carried at least one over-claimed enrichment field — a scope or trigger value that no source asserted of that specific event. The events themselves survived: every record's vendor, date and evidence held up under adversarial review, and six candidate events were rejected before entry. The defects were in the metadata around them.
That correction has landed. Every accepted change was written as a superseding record; nothing was edited in place and nothing was deleted. Two details worth stating, because they are the reason to believe the rest:
The root cause was a schema property rather than 24 careless judgments. A required boolean cannot say "we do not know", so nine records asserted account coverage no source had addressed. Fields can now be explicitly unestablished, and every enrichment field carries a provenance marker.
Codex quota state is not observable from outside, so the reset history is the richest signal available. Resets arrive in bursts, which is the signature of a self-exciting process rather than a memoryless one — hence a Hawkes intensity with a short refractory dip.
λ(t) = [ μ + α·e^(−Δt/τ) ] · refractory(Δt) · exp( Σ wⱼ·sⱼ·2^(−ageⱼ/hlⱼ) ) P(reset within W) = 1 − exp( −∫₀^W λ dt )
| Constant | Value | Meaning |
|---|---|---|
| α (excitation) | 0.02 | Added intensity per recent reset. |
| τ (excitation decay) | 30h | How long a burst stays hot. |
| Refractory depth | 0.85 | Suppression immediately after a reset. |
| Refractory relaxation | 8h | How fast that suppression lifts. |
| μ intercept | 0.55 | EWMA stand-in: base × (intercept + per-reset × resets/14d). |
| μ per prior reset | 0.075 | So 6 resets/14d lands exactly on the unmodified base rate. |
The behaviour most likely to look like a bug: a reset 2 hours ago lowers the instantaneous rate but raises the 48-hour probability. That is deliberate — excitation outlives the refractory dip, and same-day repeats happened twice in July 2026. A change that reverses it is a regression, and a test pins it.
| Term | weight | half-life | Note |
|---|---|---|---|
| Status incident | 1.1 | 36h | OpenAI status severity, 0–100. |
| @thsottiaux post | 1.45 | 10h | UNREACHABLE in v1 — scraping X is prohibited, so nothing can raise this above 0. |
| Launch proximity | 0.75 | ∞ | No decay: proximity to a release is a state, not an event. |
| Anthropic mirroring | 0.6 | 40h | Hours since the other vendor acted; ignored beyond 120h. |
Claude Code exposes usage state, so it can in principle be instrumented — which is why it gets a different model rather than the same one twice. It reports two numbers because the vendor offers two knowable things: a near-deterministic scheduled recycle, and a genuinely uncertain discretionary reset. They are different questions and must never be added together.
λ(t) = λ₀ · D(utilisation) · K(day, hour) · exp( Σ wⱼ·sⱼ·2^(−ageⱼ/hlⱼ) ) D(u) = 1 + 1.7 / (1 + e^(−(u − 0.74) / 0.075)) scheduled: Φ((W − t_due) / σ), σ = 0.6h, period ≈ 72h
| Term | weight | half-life | Note |
|---|---|---|---|
| Status incident | 1.05 | 36h | Anthropic status severity, 0–100. |
| @ClaudeDevs post | 1.35 | 12h | UNREACHABLE in v1 — same prohibition. |
| Model availability | 0.95 | 48h | Restoration or launch in progress. |
| OpenAI mirroring | 0.7 | 44h | Hours since the other vendor acted; ignored beyond 120h. |
| Window (UTC) | multiplier |
|---|---|
| Friday 11:00–18:00 | 1.95 |
| Monday 5:00–11:00 | 1.35 |
| Weekend | 0.75 |
| Ordinary weekday hour | 1 |
This is the only clock-dependent term in either model, and it is why the Claude Code figures move between a Tuesday and a Saturday on otherwise identical inputs.
| Regime | Codex /day | Claude Code /day |
|---|---|---|
| quiet | 0.09 | 0.04 |
| normal | 0.18 | 0.07 |
| launch | 0.33 | 0.12 |
Integration is a midpoint rule at 0.25h steps over a 96h horizon. Midpoint rather than left-endpoint because both models are steep near t=0 and a left-endpoint sum would bias the short windows.
§8 requires this stated plainly, so:
There is no sentinel, and there will not be one in this form. It was specified to poll an undocumented endpoint using a local OAuth token. That was declined on 2026-07-26: no stability contract, risk transferred to end users, and a conflict with the editorial-independence position this project depends on.
Investigating alternatives produced a harder finding. Anthropic's own developer documentation states that, absent prior approval, third-party products may not offer claude.ai login or rate limits. That applies whichever surface supplies the number — an undocumented endpoint, scraped terminal output, or the fully documented status-line field. Picking a cleaner surface changes the engineering and not the permission.
And even a working sentinel would answer the wrong question. No channel — supported or otherwise — distinguishes a vendor-wide grant from an ordinary scheduled rollover. Telemetry can establish that your quota changed. It cannot establish that the vendor granted anything. That is precisely what this ledger records, which is why the ledger is not the fallback instrument here. It is the only one.
Both files are regenerated from the flat record files by a deterministic build — same inputs, byte-identical output — and are never hand-edited. They are served CORS-open because the point is for other people to check our work.
| endpoint | format | headers |
|---|---|---|
/ledger.json | array of record objects | Access-Control-Allow-Origin: *Cache-Control: public, max-age=3600, stale-while-revalidate=86400 |
/ledger.csv | one row per record, RFC 4180 | same |
Four things a consumer needs to know:
superseded_by === null
for the current view. They are present rather than removed because the correction chain is the
audit trail — a ledger that deletes its own history is asking to be believed rather than checked.field_support tells you what to trust. Per enrichment field:
attested (a source states it of that event), inferred (it follows from a
general statement, nobody asserted it here), unestablished (nothing addresses it).
A field with no marker predates 2026-07-26 and its provenance was never recorded.scope.partial: null means unestablished, and is distinct from
false. In the CSV it renders as an empty cell rather than the string "false".archive_url and an archive_timestamp, so the claim you can check is
"as of that date, this source said this" rather than "this URL currently resolves". Where a source
cannot be archived — some hosts refuse it — the fields are absent rather than faked, and that
refusal is itself recorded.The record files are append-only: once committed, every field except
superseded_by is sealed, and a pre-commit hook plus a CI check against full history
enforce it. Writing an archive link into a committed record would be a mutation, and the
hook rejects it.
So archives live in their own append-only index, keyed by URL, and are joined into the published files at build time. This is not a workaround for the guarantee — it is a better fit for the data. An archive is not a claim about the event; it is a durability measure for a citation, with its own lifetime. A single field holds one capture, whereas the index holds a series of attempts, successes and failures alike. That is what supports a dated claim rather than a current one.
The build order is fixed: ledger, then sentinel, then models, then this page. Calibration is blocked on roughly 40 labelled events per vendor. When that unblocks, the work is maximum-likelihood fitting against the ledger with a held-out window, and a Brier score published beside each forecast. Until then the banner at the top of this page stays exactly where it is.