commit e5737d504709bce3d53fe45296e6abe4da547509
parent 8f6c4b81a6dba250e27493cab11171bef65a89e5
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 25 Sep 2026 11:36:25 -0400
plans: release 7 slice Y — review fixes recorded, re-gated
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/plans/release-7.md b/plans/release-7.md
@@ -334,7 +334,10 @@ its `at` once it is a cooldown old, so members-only ids stop being re-scanned at
| `04f5c9be` | items 6 + 7. `autoQueueStatus.ts` adds `VideoDeferralView {videoId, channelSlug, untilMs}` and `AutoQueueKindStatus.deferred` (live deferrals only, soonest first). `RunnerOperationView.tsx` draws the strip when there are cooldowns OR deferrals. The strip is `role="region"` `aria-label="Rate-limit cooldown"`. Under the existing heading is `<ul aria-label="Platforms in cooldown">` (items unchanged, drawn only when a platform cools). Then, when there are deferrals, the heading "Deferred videos — skipped by auto-download until:" and `<ul aria-label="Deferred videos">`, whose items read `alpha/a1 — 5h 59m left` with the id a `Link` to the video page, as `NextUp` does. **The region is a `<div role="region">`, not the `<section>` the spec wrote**: the strip sits inside the lane's own `<section>`, and the file's structural contract (`:30-32`) forbids a nested one because every `locator("section", {has})` in the suite would match two ancestors. The accessible role and name are the same. `formatCooldown` gains an hours arm (`5h 59m`, or `6h` when the minutes are zero). Its only caller is this strip, and platform cooldowns cap at ~33 min, so their text does not change |
| `17dc70c0` | item 8. The fake's `dl429` sentinel is in `modeYoutubeSingleUrlManaged` only: stderr `ERROR: [youtube] <url>: Unable to download video subtitles for 'en': HTTP Error 429: Too Many Requests`, exit 1. The prefetch branch still succeeds, which is the real two-spawn shape. New `editor/e2e/pacing.spec.ts`. T1 seeds `download.videoDeferrals.a1` and checks: picks `["a2"]`, idle `deferred`, `deferred == [a1]`, and the region + `Deferred videos` list containing `alpha/a1` with no `Platforms in cooldown` list. T2 checks: `state.json` shows `videoDeferrals.dl429vid1` (slug `alpha`, > 5 h left) and `platformBackoff.youtube.fails === 1`; then, after the real ~60 s cooldown, picks become `["dl429vid1","a2"]` (`setTimeout(150_000)`) |
| `ffe71f42` | e2e fix. T1's idle-sentence assertion hit two elements (the rail and the lane both draw the sentence, a strict-mode violation), so it now asserts `.first()` |
-| *(this commit)* | this record, `[Unreleased]` bullets, and the correction note at the top of `plans/youtube-lane-pacing.md` |
+| `5be6ceb5` | this record, `[Unreleased]` bullets, and the correction note at the top of `plans/youtube-lane-pacing.md` |
+| `8094615d` | (review fix) `common/views/activeJobs.ts` `autoIdleNote` gains `case "deferred"` with `dispatch.ts`'s exact sentence. It is now typed `AutoRunnerIdleReason \| null` with no `default` (`"stopped"` and `null` return null), so a new idle reason fails to compile here as it does in `idleReasonText`. `activeJobs.test` +1: a download runner idling `deferred` shows that sentence as the `Auto-download` lane's note |
+| `74c24b1f` | (review fix) `autoQueueStatus.test` +1 for `deferred`. Lapsed and boundary (`until === NOW`) entries drop. Out-of-order input comes out soonest first, and entries tied on `until` are ordered by `videoId`. The shape is `{videoId, channelSlug, untilMs}`, transcription gets `[]`, and a later injected clock drops the lapsed pair. The builder's tie-break changed from `localeCompare` to code-point order, so the strip's order does not depend on the server locale |
+| *(this commit)* | record: the two review-fix rows and the re-gate |
**Gates** (worktree root, on `ffe71f42`). tsc (`pnpm -r --no-bail --workspace-concurrency=1 exec
tsc --noEmit`) was clean before every commit. common **1770/1770** = 1754 + 5 (`platformBackoff`)
@@ -361,6 +364,14 @@ files: config/site/sidecars), and no `settings.json`, `site.json` or `config.jso
the rollout boot.** That is the expected change outside the md5 baseline (rollout step 4 records
`.download|keys` before). An older build drops the key on its next write, so rollback is safe.
+**Re-gate after the review fixes** (tip `74c24b1f`). `editor/.next/dev` was removed first:
+e2e run 3 had left a truncated generated `validator.ts` there, and it was the only file tsc
+failed on. tsc clean. common **1772/1772** (1770 + 1 `activeJobs` + 1 `autoQueueStatus`). Editor
+unit **72/72**. EDITOR e2e `pacing.spec` alone (`y-e2e4.log`): **2 passed, 0 failed, 1.8 min**.
+The fixes change no runner behaviour, only the `/jobs` note, a test, and a same-`until` tie-break,
+so the other five specs were not rerun. test:scripts, mcp and the builds were not rerun either,
+because the fixes touch no file they cover beyond `common/views`, which tsc checks.
+
**Found and left.**
- **Manual Sync and *download missing* do not consult deferrals**, by design. A manual retry of a
deferred video still runs, and if it succeeds it clears the platform cooldown. It does not
@@ -371,12 +382,9 @@ the rollout boot.** That is the expected change outside the md5 baseline (rollou
- **The runner does not merge deferrals from disk mid-run** the way it merges `platformBackoff`.
Only the runner writes deferrals, so there is nothing outside it to merge. A deferral
hand-seeded into `state.json` takes effect at the next runner start, which is what T1 does.
-- **`common/views/activeJobs.ts` `autoIdleNote` has no `"deferred"` case** (it is not
- exhaustive: `default: null`). A runner idling `deferred` therefore shows no note on the
- `/jobs` row. The runner page and the rail do say it. The file is not Y's; the one-line fix is
- `case "deferred": return "every pending video deferred after a rate limit";`.
-- `common/views/autoQueueStatus.test.ts` has no case for `deferred` (the file is not on Y's list).
- The filter and sort are covered by T1 through the real route.
+- *(Fixed on review, `8094615d` / `74c24b1f`:)* `activeJobs.ts` `autoIdleNote` had no `deferred`
+ case, and `autoQueueStatus.test.ts` had no `deferred` case. Ownership of both files was
+ extended to Y for these fixes.
- The plan file's step 3 (a `plans/FACTS.md` entry: the lane defers a rate-limited video; the
cooldown escalates across distinct videos; YouTube 429s are per-video timedtext) is the
parent's to write.