For four days after shipping Kudos, I kept the source code off the repo. The site was live at ricoordonio.com/kudos, people could use it, and I was still iterating fast enough that formalizing commits felt like unnecessary friction. Local-only development. Fine for the moment.
Then the blog automation pushed to master.
The CI pipeline triggers on every push touching projects/ricoordonio.com/**. It builds the Astro site and syncs the output to S3 with aws s3 sync --delete. The --delete flag removes anything in the bucket that isn’t in the build output. Keeps the bucket clean. That’s its whole purpose.
It ran. It cleaned up Kudos.
I found out when I went to check on the site. The Kudos pages returned 404s. Not a broken component, not a missing asset. The pages weren’t there. My first instinct was to look for a broken deploy step, a bad build, something in the CI logs that went wrong.
The pipeline saw the git state, built from it, and synced the result to S3. The result didn’t include Kudos because Kudos wasn’t in git. Build status: green. Deploy status: complete. Three hours of Svelte components: gone.
I opened the CI logs and worked through the sequence. Blog automation pushed to master. CI triggered. Build passed. S3 sync ran with --delete. The bucket matched the source tree. The source tree had no Kudos. The Kudos pages were removed.
That’s not a bug. That’s the pipeline working correctly with incomplete input. The input was my model of reality, which included a directory full of Svelte components that I’d decided weren’t “ready” yet because I hadn’t committed them. The pipeline doesn’t operate on that distinction. It operates on what’s in the source tree. What’s not in the source tree is noise.
I’ve run into this pattern before. The auto-approver that closed content issues because safe labels overrode block ones. The idea generator that scored nonsense output highly because the rubric checked for structure, not meaning. In every case the system behaved exactly as designed. The design just didn’t have the context I thought it had.
The fix was five minutes: commit Kudos, push, let CI rebuild. The pipeline didn’t change. It just had a more complete picture.
Commit when the thing exists, not when it’s clean. I knew that I should have done that. So the error is human, me, not AI.