Converting home to blocks and handing `/` fully to Atelier surfaced a bug of my own making: the page whose slug is the special `home` one resolves correctly at `/`, but the URL builder used everywhere else, including the sitemap, builds `/home` instead.
Five pages were converted, a routing collision was fixed, sixteen blocks existed. The homepage was still on its own controller, deliberately last, because it's the most structurally different page on the site and the one most visitors actually land on.
Four new blocks, one extended one
Home needed a hero with a portrait image and two calls to action, a stack strip, a services preview pulling live data, and an about strip, none of which existed anywhere else on the site. Built all four, matching the current markup exactly rather than redesigning while I was in there.
The featured-work, writing, devlogs and resources sections on Home are the same shape ListingBlock already renders on their own index pages, just with an optional header instead of always requiring one. Extended ListingBlock with a collapsible section-header group in its schema rather than building four more blocks that would have been the same block with different copy.
defaults() doesn't do what the name suggests
The seeder for Home's content originally left several blocks with empty attributes, assuming each block's defaults() method would fill the gap at render time. It doesn't. Grepping the package's own source settled it: defaults() is called exactly once, by the page editor, to pre-fill a section the moment somebody adds it in the admin UI. Renderer never calls it. A block seeded with no attributes renders nothing, because nothing fills the hole for it later.
Rewrote the seeder to spell out every attribute explicitly, block by block, instead of leaning on a mechanism that only exists for the editor.
The stat strip that lost its border
After seeding, a screenshot comparison against the live homepage caught something a test wouldn't: the numbers strip, five packages published, ten plugins, fifty projects, thirty-six hundred downloads, was rendering full bleed with no top border and no dividers between the four numbers, instead of contained inside the same column as everything else.
The block had a bare toggle meaning "skip your own section wrapper, the caller already provides one," which is exactly what the old homepage's Blade markup did, wrapping the block in its own <section>. As a standalone Atelier block there is no caller left to provide that wrapper. bare: true just meant no wrapper existed at all.
Fixed by making the block always render its own correctly sized section, and removed the bare toggle from the editor schema entirely: there was no longer a context where turning it off made sense.
The sitemap, and the bug that actually mattered
With every page converted, the last piece was /sitemap.xml itself. This site had generated a static file with its own Artisan command since before Atelier existed. Atelier ships something better: a live sitemap built from published pages, plus a registry for URLs the package can't know about, blog posts, project pages, anything with its own model. Switched to it, registered the non-Atelier URLs, deleted the static-file command.
The sitemap came back with the homepage listed at /home.
PageController treats a page whose slug is literally home as the page served at /. That's the entire mechanism this site relies on for the homepage to work at all. Page::url(), the method that builds a page's public URL for exactly this kind of consumer, doesn't know about that convention. It builds /{slug} unconditionally, so the one page whose slug is the routing system's own special case gets the one URL that's wrong.
I wrote both halves of that inconsistency. PageController::__invoke() and Page::url() live in the same package, disagreeing about what home means, and nothing had called it until a sitemap needed both to agree.
Fixed it host side rather than editing the vendor package directly: bound a small subclass over Sitemap in the container that corrects the one URL after the parent class builds it, everything else untouched. That's the workaround for this site. The real fix belongs upstream, in Page::url() itself, and I'm the one who has to write it.
Where it stands
/ and /sitemap.xml both fully Atelier's now, HomeController deleted, the old re-registration workaround from the first install gone with it. Two hundred ninety four tests passing against the same baseline this project started with, zero new failures. One real bug found in my own package, by using it the way anyone else would.