Task 03 rebased its branch onto task 01 and flattened the merge into four duplicate commits — but the rule file was *telling* it to: "Before you start: git rebase origin/main". Replaced with merge-based guidance and an explicit prohibition, since a rewritten task branch is the same divergent-history trap that broke the pages branch. Also corrects gates.md tier 3, which promised screenshot comparison in CI that is not wired in and cannot be until visual-regression.mjs grows a compare mode. HANDOVER.md now reflects 01-04 merged, pnpm, and carries forward the review findings that were noted but deliberately not fixed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.8 KiB
Handover — Astro refactor, session of 2026-09-05
Phase 0 is done, merged, and green. Tasks 01–04 are all in main. The project
now runs on pnpm, not npm. Nothing has been pushed: main is 23 commits
ahead of origin/main.
Where the work is
| Branch | Head | State |
|---|---|---|
main |
see git log |
01–04 merged, gate green under pnpm |
refactor/task-01-scaffold |
71021e6 |
merged |
refactor/task-02-tokens |
c9ec9e3 |
merged |
refactor/task-03-verification-net |
2e79aac |
merged |
refactor/task-04-content-schema |
b554f87 |
merged (gate verified before merge) |
All four merged with --no-ff and zero conflicts. The four worktrees in
~/Projects/af-task-0* still exist and still hold npm-era node_modules; they
are stale. ~/Projects/af-task-02/before/ still holds 29 MB of misplaced
untracked screenshots — delete or move them before removing that worktree.
What each task actually produced
01 — scaffold (Codex). Astro 5.5 with base: '/ai-for-dummies', strict TS,
BaseLayout.astro, summary.astro as the single smoke page, lint/format/husky
configs, .gitea/workflows/, rewritten publishing section in
docs/operations-guide.md, hands-on/ copied verbatim into public/. Build
passes, gate passes, hooks verified live, 42/42 assertions intact.
02 — tokens (Gemini). src/styles/tokens.css and src/styles/base.css only
— 43 lines. It did not touch the legacy CSS, deliberately: rewriting
styles.css would break verify.mjs's exact-string assertions. So the three
drifting palettes are now resolved in the new token layer, while the live site
still runs on the old values. That is the correct scope, but it means the
consolidation is not proven visually yet.
03 — verification net (Codex). .agents/scripts/visual-regression.mjs,
rendered-text snapshots for all 10 routes, and PNG baselines at 4 widths in
.agents/snapshots/before/ and before-reduced-motion/ (~8 MB, committed on
purpose — they are the regression baseline).
04 — content schema (MiniMax). src/content/config.ts with eight empty
collections and a strict localized({en, pt}) helper. No content moved; that is
tasks 05 and 06.
Things I fixed that the plan got wrong
AGENTS.mdlistedpackage-lock.jsonunder Never touch, meaning never hand-edit. Task 01 read it as never create and shipped with--package-lock=false.npm ci— which is how every worktree spun up at the time — cannot work without it. Wording corrected; lockfile committed.- The first lockfile was reconstructed from a
node_modulesinstalled without one, so its entries had noresolved/integrityandnpm cifailed withETARGET tinyglobby@0.2.17. Regenerated from a clean install. .husky/commit-msgrejectedbuild:andrevert:. Both are standard conventional types. Added.launch.shread the agent name with[a-z-]*, which cannot matchcontent-i18n-migrator. Tasks 04/05/06 silently fell back toastro-architect. Fixed to[a-z0-9-]*and made it fail loudly instead of guessing. Task 04 was relaunched under the right agent.
Things the agents got wrong, and what I did
- Task 03 went outside its brief. It rewrote
scripts/audit-ui.mjsto ban external CSS dependencies — a sound check that the pre-existing malformed@font-faceinstyles.cssviolates, so it left the gate red for every downstream task. Reverted in2e79aac; the snapshot net was kept. The check should come back once the font decision is made. - Task 03 rebased instead of branching, flattening task 01's merge into four
duplicate commits with new SHAs — the same divergent-history trap that broke
the
pagesbranch. Replayed onto the proper base; task 01 is an ancestor again. Worth adding to.agents/rules/git-worktrees.md: never rebase a task branch onto anything. - Task 02 left 29 MB of screenshots in
~/Projects/af-task-02/before/— untracked, and in the wrong place (.agents/snapshots/is the right one). Its report claims the screenshot box is unticked while the files exist. Delete them or move them; do not commit them where they are.
Still open from task 01's own report
- Real-host smoke test of
/ai-for-dummies/summary/never ran — the branch is not merged and CI has not published. This is the #1 production-only failure mode in the whole migration. Do it before trusting any page work. - No Playwright locally, so screenshot comparison could not run in CI.
The decision that is still yours
styles.css:1 has an @font-face whose src: points at a Google Fonts
stylesheet, not a font file. Manrope and DM Mono have therefore never
rendered; the site has always been Arial and generic monospace. Self-hosting
them during the migration would silently redesign the site. Task 02 defaulted to
matching what renders today. Decide explicitly, then task 19 can restore the
external-CSS assertion. See .agents/context/design-system.md.
Next steps, in order
- Decide the font question (see below). It blocks task 19 and it is the only thing here that needs a human.
- Push
main— nothing has left this machine yet. Safe now: thepublishjob isworkflow_dispatch-only, so pushing no longer overwrites the live site. Watch that first CI run; the act-runner has never executed a job. - Once CI is green, do the real-host smoke test of
/ai-for-dummies/summary/. This is still the #1 production-only failure mode in the migration and it has not been done. Publish manually via the workflow'spublishinput, on a throwaway basis, or accept the risk until task 20. - Clean up the four merged worktrees and branches.
- Fan out phase 1 and 2:
All three are unblocked now that 02 and 04 are in
.agents/scripts/launch.sh 05 content-guide --base main .agents/scripts/launch.sh 06 content-review --base main .agents/scripts/launch.sh 07 primitives --base mainmain. After 07 lands, 08–11 run four at a time.
Carried over from the phase 0 review
Found while reviewing the four diffs, none of it blocking, none of it fixed:
public/hands-on/is a byte-identical copy ofhands-on/with no sync mechanism. Two trees will drift. Symlink, or copy as a build step.--bp-*tokens cannot work. CSS custom properties do not resolve inside@mediaqueries. The real enforcement ischeck-tokens.mjs'sALLOWED_BREAKPOINTSallowlist; the variables are decoration and will mislead whoever writes the first responsive component.tokens.csshas no font tokens at all, and the scale skips--step-2and--step-3. Downstream of the font decision.visual-regression.mjshas no compare mode. It only captures. It is out of CI for that reason — see.agents/rules/gates.md.src/content/config.tsuses the legacytype: 'data'API. Astro 5 auto-converts it to a glob loader and it works; prefer explicitfile()/glob()loaders insrc/content.config.tswhen 05/06 touch it.
Running an agent
.agents/scripts/launch.sh <nn> <slug> [--base ref] [--cli codex|agy|mm] [--fg]
Routing is automatic: Codex for 01/03/15/16/19, agy (Gemini 3.1 Pro) for
02/18, mm (Claude Code against MiniMax-M3) for the rest. All three launch with
permission prompts disabled, because a blocked edit in an unattended run just
hangs. Logs land in .agents/logs/ (gitignored).
Task 07 is the routing calibration point. It is small and easy to judge. Check it before committing to MiniMax for the other twelve.