commit 5eed01ccdaf06b16c535f308bdff6979281261e0
parent 813208b9081e77f7ddf8e783fd81f9e59cd92299
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 28 Sep 2026 02:12:38 -0400
plans: O4 review fixes recorded — both queues held in the homepage and hub refusal tests and the Build homepage test, deployHomepage ships homepageOutDir; ops-api + sites-homepage 26/26 on 813208b9
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 37 insertions(+), 12 deletions(-)
diff --git a/plans/homepage-deploy-from-ui.md b/plans/homepage-deploy-from-ui.md
@@ -131,15 +131,17 @@ build corrected here:
where the hub's are, in the action's `kind` and in `/sites`' `BUILD_KINDS` comment.
- **`homepageOutDir(paths)` is exported from `common/publish/build.ts`.** The editor needs
`homepage/out` for `builtHomepageProblem` and for "built <when>", and `homepageDir` was private.
- `buildHomepage` and `deployHomepage` are unchanged, so the job's own refusal keeps its sentence
- ("… — run archilyzer build homepage first"). The refusal before the job says "… — build the
- homepage first".
+ After review, `deployHomepage` takes its directory from `homepageOutDir` too, with no behaviour
+ change. Otherwise `buildHomepage` and `deployHomepage` are unchanged, so the job's own refusal
+ keeps its sentence ("… — run archilyzer build homepage first"). The refusal before the job says
+ "… — build the homepage first".
- **`JobLane` needed a fix to be testable at all.** Under `next dev`, Strict Mode's
mount → cleanup → mount dropped every update of a lane's one launch, so it sat on "Starting…"
while its job ran. Production mounts once and never showed it; no spec had clicked a lane
button before.
- **How the e2e avoids a real `next build` and wrangler.** There is no fake wrangler, and the hub's
- buttons have no spec. The Build homepage spec holds the `build` queue with `/api/test/stuck-job`,
- so its job only queues, and cancels it from the lane before it starts. The deploy-homepage
- refusals run with the `deploy` queue held the same way. The missing-build refusal is asked only
+ buttons have no spec. The Build homepage spec holds the `build` and `deploy` queues with
+ `/api/test/stuck-job`, so its job only queues, and it cancels the job from the lane before it
+ starts. The deploy-homepage refusals run with both queues held the same way (after review; each
+ test held only one queue at first). The missing-build refusal is asked only
when the checkout has no `homepage/out/index.html`, and asked as a preview.
diff --git a/plans/release-11.md b/plans/release-11.md
@@ -93,14 +93,17 @@ job's `tmp/overnight`.
checkout's own directory (the primary's holds the live homepage's build), and the hub's buttons have
no spec to copy. So:
- **No spec clicks Deploy homepage.** None ticks Deploy after build and then clicks Build.
-- **Build homepage is clicked only with the `build` queue held** by `/api/test/stuck-job`, which is
- never released in the spec. The `build-homepage` job only queues, and the spec cancels it from its
- lane. Its `start()` never runs: no log file, no child, nothing written under `homepage/`.
+- **Build homepage is clicked only with the `build` and `deploy` queues both held** by
+ `/api/test/stuck-job`, which is never released in the spec. The `build-homepage` job only
+ queues, and so would a `build-deploy-homepage` if the click regressed into one. The spec cancels
+ it from its lane. Its `start()` never runs: no log file, no child, nothing written under
+ `homepage/`.
- **If that spec fails before its Cancel,** the next `resetData` cancels live jobs newest first
(`registry.list()` sorts by `queuedAt` descending). The queued build is removed before the
holder's slot is freed, so nothing is ever promoted.
-- **The deploy-homepage refusals run with the `deploy` queue held the same way.** A deploy a refusal
- failed to stop would only queue, and the spec's job-list check would fail.
+- **The deploy-homepage refusals run with both queues held the same way** (`holdBuildAndDeployQueues`
+ in `ops-api.spec`). A build or deploy that a refusal failed to stop would only queue, and the
+ spec's job-list check would fail.
- **The missing-build refusal is asked only when the checkout has no `homepage/out/index.html`,** as
`deploy-hub`'s is (`211d4666`), and it is asked as a preview.
- **Checked after every run:** the worktree has no `homepage/out`, and `homepage/public` holds only
@@ -116,7 +119,10 @@ no spec to copy. So:
| `d52d017d` | `sites:` `JobLane` survives Strict Mode |
| `d9218cb7` | `sites:` the group stamps `data-hydrated`; the specs wait for it |
| `40b6a0d7` | `changelog:` `[Unreleased]` above `[0.9.4]` in `editor/CHANGELOG.md` |
-| _this_ | `plans:` this record; the plan's "As shipped" note |
+| `ff8b9382` | `plans:` this record; the plan's "As shipped" note |
+| `72175134` | `e2e:` review fix — the homepage refusal test, the Build homepage test and the hub's refusal test hold both the `build` and the `deploy` queue |
+| `275c0fa6` | `common:` review fix — `deployHomepage` ships `homepageOutDir(paths)` (no behaviour change) |
+| _this_ | `plans:` the review fixes in this record and the plan's note |
**Gates** (logs `o4-*.log`):
- **tsc** clean before every code commit (the last run on `d9218cb7`'s tree).
@@ -132,6 +138,9 @@ no spec to copy. So:
- `sites-homepage` ×3 with the old `JobLane`: **6 passed, 3 failed**.
- The same ×3 on `d9218cb7`: **9 passed** (27 s).
- The final list on `d9218cb7` (the same seven specs): **64 passed** (1.8 min).
+ - After the review fixes, on `275c0fa6`: `ops-api` + `sites-homepage` **26 passed** (40.5 s).
+ tsc was clean, common 2,041/2,041 and `build.test.ts` 10/10. The worktree still has no
+ `homepage/out`.
- No spec here greps `deploy-hub|build-hub|HubBuild` except `ops-api`, which is in the list.
- **Numbers tool:** none.
@@ -148,6 +157,20 @@ no spec to copy. So:
- **The `JobLane` fix:** the Build homepage test fails 3 of 3 with the old lane and passes 3 of 3
with the fix.
+**Review fixes** (review: SHIP AFTER FIXES, `o4-review.md`):
+- **Should-fix 1, one queue held where a regression could reach the other.** The deploy-homepage
+ refusal test held only `deploy`. A regressed "preview needs deploy" guard would have run a real
+ `build-homepage` there: in the primary checkout, compose writes fixture numbers into
+ `homepage/public`, then `next build` runs. The Build homepage test held only `build`, so a click
+ turned into build-and-deploy would have reached `deploy`. Both tests now hold both queues. So does
+ the hub's `deploy-hub` / `build-hub` refusal test (the review's low 4). That test **predates this
+ slice** (release 7) and held nothing. In `ops-api.spec` the holds sit in one helper,
+ `holdBuildAndDeployQueues`, and `before` is taken after them.
+- **Low 2:** `deployHomepage` now takes its directory from `homepageOutDir(paths)`. This is a pure
+ refactor, and what it ships is exactly the directory the editor judged "built".
+- **Low 3** (the "built <when>" line does not refresh after an in-page build) is left as recorded
+ below.
+
**Found and left**
- **A job cancelled while still queued keeps `"status":"queued"` in its `.meta.json`.** The
`onCancel` path never rewrites the sidecar. The registry says cancelled, and the boot pass settles