The thing that was blocking the rebuild was not the design. It was that 9 legacy guides are hand-written HTML with their own styling, they have live URLs, and rewriting all 9 before launch is weeks of work I did not want to do before shipping anything.
Astro copies public/ into dist/ without processing it. No transformation, no bundling, no build step, no route definition. A file at public/guide/awesome-traffic-bot/index.html is served at /guide/awesome-traffic-bot/ exactly as written.
That turns the migration from a single cutover into a queue. Every legacy guide goes into public/ on day 1 and keeps working with its current markup and its current inline styles. The new site launches around them. Then each guide gets migrated to a content collection entry whenever I get to it, and the moment it exists as a real route, the public/ copy gets deleted.
Two properties make this actually safe.
Nothing 404s at any point. The URL is served by one of the two systems at all times, and the switch between them is a single commit.
The old and new can look different without that being a bug. A visitor landing on an unmigrated guide gets the old design. That is worse than the new design and better than a broken link, and it is visibly temporary.
One thing to watch: if a route exists in both src/pages/ and public/, the build has two things claiming one path. Do not leave both in place and assume the right one wins. Delete the public/ copy in the same commit that adds the route.