# Final capture fixture matrix — PR quota pause logging

Target: [#19794](https://git.cafe/pingdotgg/t3code/pulls/19794), replacement branch `takeover/19794-quota-pause-logs`.
Before: [76da264a0c](https://github.com/pingdotgg/t3code/commit/76da264a0ccaeff5fa88bcb5cfada1be6ae320c4). After: [bcfa2526f1](https://github.com/pingdotgg/t3code/commit/bcfa2526f1d8679836def5f834ba19bb1d414fdc).

Derived by read-only proof auditor from the complete diff, refreshed by lead for the committed Bitbucket body-read fix and current merge-base. These are required fixtures, not claims of final capture completion. Every row is affected. Prior captures are historical and must be rerun.

Server-only: no render paths, viewport/theme variants, screenshots, video or visual image diffs apply. All rows use log transcripts; no timed human interaction is involved. APP+STUB means the real source dev server, workers, pretty logger, commands and isolated SQLite state, with PR-read dependencies fetching loopback 429/502 responses and constructing typed causes. It bypasses real forge HTTP clients and quota admission; do not claim real-adapter or live-quota proof. HARNESS means a labelled direct classifier call for guard combinations that do not require duplicating every catch.

Use new fresh homes below `/tmp/ev-19794`, `T3CODE_DEV_SEED=0`, `--no-seed`, explicit `--home-dir` resolved to `--base-dir` as required by the source entrypoint. Never read/copy/write `~/.t3/userdata`. Pin executable changed sources to the two commits above; never relabel old captures. Synthetic seed: project plus nine eligible branch threads, four with saved PR references. Trigger real startup discovery/backfill and settlement sweeps. No provider turns.

INFO means exactly one physical console line, thread context present, no stack, UTC reset only if supplied and valid. WARN means original formatted cause/stack retained. Verify no settlement, saved references retained and before/after state equal excluding timestamps.

| Row | State / trigger and affected catch | Expected before → final after | Required final evidence |
|---|---|---|---|
| 1 | Branch `quota`; provider → Error wrapper → typed admitted pause with reset; startup discovery/backfill | WARN → INFO + UTC reset | APP+STUB transcript + classifier HARNESS |
| 2 | Branch `unknown`; provider → plain unexpected error; grouped discovery | WARN+stack → WARN+stack | APP+STUB transcript + classifier HARNESS |
| 3 | `saved-quota`, saved reference 41; null branch result then summary typed pause; per-thread discovery | WARN → INFO + reset; retain saved reference | APP+STUB transcript + classifier HARNESS |
| 4 | `saved-unknown`, saved reference 42; null branch result then unknown summary failure | WARN+stack → WARN+stack; retain reference | APP+STUB transcript + classifier HARNESS |
| 5 | Eligible quota threads from rows 1/3; startup settlement, branch and saved-summary forms | WARN → INFO + reset; no settlement | APP+STUB transcript + classifier HARNESS |
| 6 | Eligible unknown threads from rows 2/4; startup settlement | WARN+stack → WARN+stack; no settlement | APP+STUB transcript + classifier HARNESS |
| 7 | `saved-no-time`, reference 43; generic provider rate-limited refusal without timestamp; discovery + settlement | WARN → INFO without invented time; retain state | APP+STUB transcript + classifier HARNESS |
| 8 | `saved-inner-time`, reference 44; no-time provider refusal wrapping typed pause with reset | WARN → INFO with inner UTC reset | APP+STUB transcript + classifier HARNESS |
| 9 | Single Fail of generic rate-limited provider refusal with its own timestamp | WARN → INFO with provider UTC reset | Labelled classifier HARNESS transcript |
| 10 | `initial-github`; provider → GitHubApiRateLimitError; grouped discovery + settlement | WARN → INFO with UTC reset; no state update | APP+STUB transcript + classifier HARNESS |
| 11 | `initial-gitcafe429`; provider → GitCafeApiError(reason=rate-limited,status=429); discovery + settlement | WARN → INFO without invented time | APP+STUB transcript + classifier HARNESS |
| 12 | Unknown Error whose text mentions rate limits; single Fail | WARN+stack → WARN+stack | Labelled classifier HARNESS transcript |
| 13 | Combined Fail(typed pause) + Fail(unknown) | WARN+causes → WARN+causes | Labelled classifier HARNESS transcript |
| 14 | Combined Fail(typed pause) + Die(unknown defect) | WARN+causes → WARN+causes | Labelled classifier HARNESS transcript |
| 15 | Die(typed pause), rather than Fail | WARN+cause → WARN+cause | Labelled classifier HARNESS transcript |
| 16 | Other initial refusal hooks: GitHub no reset; BitbucketResponseError 429 with/without reset; GitLab/Azure typed quota; Forgejo reason=rate-limit | WARN → INFO; reset only when supplied | Labelled classifier HARNESS transcript |
| 17 | Hook rejection: BitbucketResponseError 502; Forgejo invalid-response; GitCafe failed/502 | WARN+stack → WARN+stack | Labelled classifier HARNESS transcript |
| 18 | Recognized refusal with finite out-of-Date-range reset 1e30, or Bitbucket reset NaN | WARN → INFO without invalid timestamp; logger must not throw | Labelled classifier HARNESS transcript |
| 19 | BitbucketResponseBodyReadError(status=429,retryAt) inside provider wrapper; discovery + settlement | **WARN → INFO + UTC reset**; no state update | APP+STUB transcript + classifier HARNESS |

Row16 must include each named forge refusal, both with/without optional reset where listed. Row17 includes the Bitbucket body-read variant at502 as the inverse guard. Row18 includes missing, invalid/out-of-range reset and NaN. Compound/defect rows must retain all cause diagnostics.

Expected app records for nine seeded threads:18 distinct catch/fixture records per revision; baseline18WARN; after14INFO and4unknownWARN. These counts are planned until observed. Publish paired before/after records, classifier harness result per matrix row, state proof, focused test output, and every seed/loader/driver/pinning script with ghdrop. Filter startup auth URLs from public logs. Scratch never enters the PR. Pass2 must inspect every record and independently rebuild one affected case at the final SHA.
