# Task 20 — Cutover and cleanup

**Agent**: `astro-architect`, **with a human watching** · **Model**: MiniMax-M3 assisting
**Depends on**: all · **Worktree**: `.agents/scripts/worktree.sh start 20 cutover`

This task touches production publishing. Do not run it unattended.

## Goal

The Astro build is what the world sees, the old files are gone, and the docs
describe reality.

## Steps

1. **Full verification** on the built site: all 10 routes, all 6 query params,
   both languages, vote widget against the live API, screenshots at four widths.
2. **Delete the superseded files** — only after their replacements are proven:
   `app.js`, `styles.css`, `responsive.css`, `chapters.css`, `landing.css`,
   `rules/app.js`, `rules/styles.css`, `skills/app.js`, `skills/styles.css`,
   `skills-review/*.js`, `skills-review/*.css`, and the ten old `index.html`
   files. `git rm`, one commit, reviewable.
   **Keep**: `hands-on/**` (now under `public/`), `submitted-skills/**`,
   `skill-reviews/**`, `docs/**`, `vote-service/**`.
3. **Publish** via the mechanism chosen in task 01.
4. **Verify on the real host** with a cache-buster:
   ```bash
   for r in "" full-guide summary models agents skills rules skills-review \
            hands-on/starter hands-on/rules; do
     curl -sS -o /dev/null -w "%{http_code} $r\n" \
       "https://netcracker.pages.marcospaulo.dev.br/ai-for-dummies/$r/?v=$(git rev-parse --short HEAD)"
   done
   ```
   All ten must be 200. A stale cached 200 looks identical to success — the
   `?v=` is what distinguishes them.
5. **Update the docs**: `README.md`, `docs/operations-guide.md` (build + publish
   path, and it must stop claiming `pages` is "the exact published source" if
   that is no longer true), `GATES.md`, and `AGENTS.md` (stack is no longer
   "migration in progress").
6. **Fast-forward `pages`** per the procedure in `docs/operations-guide.md`.

## Rollback

`pages` still holds the working vanilla site until you overwrite it. If cutover
fails, reset `pages` to its previous commit — the old site returns immediately.
Note the SHA before you start:

```bash
git rev-parse origin/pages   # write it down
```

## Done when

- [ ] Ten routes 200 on the real host with a fresh cache-buster
- [ ] Vote widget works end-to-end from the published origin (CORS is
      origin-sensitive — `ALLOWED_ORIGIN` must still match)
- [ ] Old files deleted; `npm run gate` green
- [ ] Docs match reality
- [ ] Previous `pages` SHA recorded for rollback
