← All posts

Headless means no human to save it

Two fixes that belong together: making automation truly run unattended, and making it refuse to publish things it can't stand behind.

  • automation
  • engineering
  • content

There’s a version of “it works” that’s a lie. The script runs, the output looks right, and you ship it. What you’ve actually proven is that it works with you sitting there — answering a prompt, retrying a flaky step, eyeballing the result before it goes out. Pull the human out and the whole thing stalls or, worse, publishes garbage with confidence.

That was the content engine. It “ran.” But every run leaned on me being in the loop. Making it headless wasn’t about adding a flag — it was about finding every place I’d quietly been the error handler.

Two failure modes showed up, and they’re different problems.

The first is the engine getting stuck: waiting on input that will never come, hanging on a step that needs a decision. Headless means there’s nobody to decide. Every branch has to resolve on its own — a default, a skip, a clean exit — without a person nudging it.

The second is the engine running fine and publishing something it shouldn’t. This is the “publish honestly” half, and it’s the one that matters more. An automated writer will happily produce a confident paragraph full of invented specifics if you let it. The fix isn’t better prose. It’s a gate: if the inputs don’t support a claim, the system has to either not make the claim or not publish at all. Silence beats fabrication.

The thing I keep relearning: automation doesn’t remove your judgment, it forces you to encode it up front. Every “I’ll just check it before it goes” has to become a rule the machine can apply alone. If you can’t write the rule, you weren’t really making the call — you were guessing, and now the machine guesses too.

Headless and honest are the same discipline. Decide before, not during.