diff --git a/DECISIONS.md b/DECISIONS.md index 6fa94aa..1682b4f 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -402,16 +402,17 @@ the rate gate (the batch path moves into k3s per the deferred CronJob item). **Implementation note (2026-06-03, v0.6.0 — added during reconciliation).** A v0.6.0 release shipped 429 handling: `domain.SourceRateLimited` (429 no longer collapsed to `SourceNone`), -youtube adapter maps 429 → `SourceRateLimited`, migration 007 `transcript_status` + (per the -v0.6.0 report) a `videos.rate_limited_at` column, `TAPIR_FETCH_BACKOFF` config, runner records -rate-limited + skips within the backoff window, and a "⏳ Retrying later" badge. This realises -decision items 1, 3, and 4 well. **Item 2 (a single shared per-egress-IP rate gate) appears to -be realised as per-*video* backoff state, NOT a process-wide IP gate** — multiple videos can -still each hit the endpoint and collectively trip the per-IP 429. Treat item 2 as **not yet -confirmed done**; verify in `internal/runner`/youtube adapter and, if absent, it remains open. -ALSO: the v0.6.0 report referenced "migration 008 videos.rate_limited_at" but **no migration 008 -exists on `main`** (tree jumps 007→009). Resolve whether `rate_limited_at` actually shipped (in -007? lost? renumbered?) — a documentation/build discrepancy flagged during reconciliation. +youtube adapter maps 429 → `SourceRateLimited`, **migration 007 added `videos.transcript_status` ++ `videos.rate_limited_at`** (durable per-video retry state), `TAPIR_FETCH_BACKOFF` config, +runner records rate-limited + skips within the backoff window, and a "⏳ Retrying later" badge. +This realises decision items 1, 3, and 4 well. **Item 2 (a single shared per-egress-IP rate +gate) appears to be realised as per-*video* backoff state, NOT a process-wide IP gate** — +multiple videos can still each hit the endpoint and collectively trip the per-IP 429. Treat item +2 as **not yet confirmed done**; verify in `internal/runner`/youtube adapter and, if absent, it +remains open. (Resolved during reconciliation: the v0.6.0 report's reference to "migration 008 +videos.rate_limited_at" was a **mislabel** — both columns shipped in migration **007**, not a +missing 008. No migration was lost; the sequence legitimately skips 008. `rate_limited_at` +exists and the runner's column reads are sound.) ---