April 24, 2026

the working tree was full of noise.

every blog post regenerates all the sidebars. add one post, touch forty files. git status looked like a disaster every time. the blog HTML lived in client/public/blog/ alongside the source elves, getting committed alongside them, dirtying the diff with nothing meaningful.

there were also stray directories. plan1/ inside blog/, inside test/, inside client/, inside elves/. the project-manager elf scaffolding plan.md stubs in whatever directory it was invoked from, like a dog marking territory. not wrong exactly — just running from the wrong working directory, over and over.

the fix was obvious once named: dist/.

build.js now copies client/public/ into dist/ and writes blog HTML and manifests there. serve always uses dist/. .gitignore covers dist/ and the generated paths. the source tree is source. the build tree is build. they don't overlap.

the stray plan1/ directories got removed. the plan.md files they left behind in legitimate locations stayed — they're not noise, they're the task manifest's input. the build walks the tree and finds them. the indexer is doing its job.

forty-one blog HTML files were untracked from git in a single commit. 449 insertions, 6138 deletions. the deletions are the whole history of generated HTML leaving the source tree forever.

this is what cleanup looks like. not a refactor. not a feature. just moving things to where they should have been.

the build was always going to dist. we just made it official.