Back to blog
Aug 18
dogfooding
byok
anthropic
provider-reliability
engineering-log

BinChicken's First Real Run — What Worked, What Broke, and Why That's the Point

Today we ran BinChicken's real, authenticated application — not the demo — against BinChicken's own repository, for the first time. It's worth being precise about what that sentence does and doesn't mean before getting into what happened.

What this is not

This is not a "Built by BinChicken" journal entry. BinChicken's own internal rules for that specific milestone are strict on purpose: an entry only counts once a Self-Hosting Readiness Review — with a second human reviewer, not just whoever built the capability — has assessed the product READY, a human has explicitly approved the transition, and the run in question actually produced a complete, governed change. None of that happened here. What follows is a plainer thing: an engineering log of the first time the real product was pointed at a real task, written the same way we'd want any failure reported — honestly, and without smoothing it over.

The setup

Before this run was possible, a few real things had to be true, not simulated:

  • A real user account, signed in through the product's actual auth flow.
  • A real repository — BinChicken's own — connected through the same GitHub App flow a customer would use, including the branch-protection verification that flow requires before it'll connect anything.
  • A real Anthropic API key, added as a BYOK credential through Settings. BinChicken's provider architecture is built so a workspace's own key is what pays for its own runs — no platform-funded fallback unless a workspace explicitly opts in, and this run used the BYOK path.

With that in place, we submitted a real task through the "start a run" form — not a synthetic test string, an actual thing worth knowing the answer to:

"Improve the real BinChicken app's first-run UX. Ensure an authenticated new user is clearly guided from their workspace to connecting GitHub, selecting a repository, configuring their AI provider, and creating their first run. Use existing APIs and components; do not redesign architecture or add new features. Add/update tests for the journey."

Fittingly self-referential: the first real thing we asked BinChicken to look at was BinChicken's own onboarding.

What happened

The run started. The first role in the workflow — the Scoper, whose job is to turn a request into a scoped requirements artifact — picked up the task about six seconds later and made a real call to Anthropic.

That call took a little over a minute, and it succeeded, in the sense that it returned a response. That's an important distinction, and one the record actually lets us make cleanly: this wasn't an authentication failure, a network error, or a rate limit. The request reached Anthropic, ran against real repository content, and came back with something.

What came back didn't parse. BinChicken requires every role's response to match a strict, structured format — no free-form prose, a specific shape, checked in full before it's ever treated as a real result. This response failed that check. Rather than accepting something malformed, retrying blindly, or quietly falling back to something that looked plausible, the run did exactly what it's supposed to do when that happens: it recorded the failure, stopped, and left everything downstream untouched. The nine-step workflow shows one step failed and eight still sitting at "not started" — not because anything crashed, but because a rejected first step is correctly treated as reason not to proceed. The run's own record is the evidence for all of this; nothing here is a reconstruction.

Why a clean failure is worth writing about

It would be easy to treat this as an embarrassing outcome for a product's first real test. We'd rather treat it as confirmation that the boring, unglamorous infrastructure — schema validation, failure classification, "don't proceed on bad input" — did exactly the job it exists to do. A system that silently accepted malformed output as if it were a real requirements document would have been a much worse outcome than a system that stopped and said so. The whole premise BinChicken is built on is that AI output should be treated as something to validate and hold accountable, not something to trust by default — and the very first real run tested that premise in earnest, not hypothetically.

It's also worth being explicit about what this failure did not do: it didn't touch the repository, didn't open a pull request, didn't spend anything beyond one real model call on the account's own key. The blast radius of "the model didn't format its answer correctly" was exactly one failed step and nothing else.

The gap this exposed

We don't think this was a fluke worth ignoring, and we also don't think it's fully understood yet. Two things are true at once:

  • The response the model returned is never stored anywhere — not logged, not persisted, not visible to us after the fact. That's a deliberate choice: raw model output is untrusted, unbounded content, and a product whose customers submit real repository context shouldn't be casually logging what comes back from it. We stand by that choice.
  • The direct cost of that choice is that we genuinely can't say with certainty why the response failed to parse. Reviewing the relevant logic afterward, two plausible contributing factors stand out: the amount of output a single step is allowed to produce is a fixed ceiling, applied the same way regardless of how complex the underlying task is — a long, detailed response to a broad request like this one could plausibly have been cut off mid-structure. Separately, the logic that recognises when a model has wrapped its answer in a code block is stricter than it probably needs to be — it expects the entire response to be exactly one clean block, and has little tolerance for anything else around it.

We're not fixing either of those blind, on a guess. The honest position is: we have a real failure, a plausible-but-unconfirmed diagnosis, and a real diagnosability gap that made confirming it harder than it should have been. That's a more useful thing to have learned from a first run than a clean success would have been.

What's next

Nothing here has been fixed yet, and this post isn't announcing a fix — it's reporting what the first real run actually showed us, which was the point of running it. The next real run will tell us whether this was a one-off or a pattern. Either way, it'll get the same treatment: reported as it actually happened.