Glass console beneath a fractured holographic error panel

This is a build log entry, told as a story. A coding run is queued, it starts, and it does not finish. What matters is what the record looks like afterwards.

Sources: spec/GOAL.md, PLAN.md, VERIFICATION.md, and apps/web/src/content/docs/docs/troubleshooting.md. Shiba is a local prototype, and this post describes required and unit-tested behaviour rather than a verified live cloud run.

Prototype status

The rules below are code requirements with unit coverage. A live cloud run is recorded as not attempted, and the verification record is dated, so treat it as an honest account rather than a live demonstration.

The requirement

spec/GOAL.md gives the sandbox a numbered list, and item six is the one this post is about: report failures honestly, including process exit code and a bounded stderr tail.

Item five, capturing changed files and a unified diff including new files, sits directly above it. A run that produced a diff and then failed still has a diff, and the report has to say so without dressing the partial work up as a finished task.

spec/GOAL.md closes the same section with a rule about the assistant’s own output: no generated placeholder implementation, no fake successful output, no external deployment, no push. If a dry run cannot complete because no compatible local container engine is running, the exact limitation gets recorded, while the TypeScript build and unit tests still have to pass.

The envelope

PLAN.md describes the structured result a run returns. Error envelopes must report error. A malformed result, or an absent one, is error too. The plan’s word for the failure mode is never silent success.

troubleshooting.md turns that into a symptom you can actually see. If a completed badge conflicts with the output, inspect the structured result envelope, because failed runs should report error rather than successful completion.

That conflict is the bug this rule exists to prevent. A UI that shows a green completion for a run whose envelope says error is lying about the run, and the envelope is the source of truth.

What the failure message carries

PLAN.md requires failure messages to include the real error and the real exit code, passed through safeText and redactSecrets before they leave the runtime. Redaction is not optional formatting; it is what allows a real error to be reported at all.

The tail is bounded. costs.md lists the stderr tail at 8,000 characters, with the collected diff at 120,000, the transcript diff display at 20,000, captured files at 50, per-file captured contents at 100,000 characters, and total captured contents at 500,000. These are application settings, not guaranteed in-memory read bounds, and capture truncation can make a publication incomplete.

So a failure report is deliberately partial. It is partial by design, and the limit is documented rather than discovered.

The record-keeping rule

PLAN.md also sets the standard for the build log itself. Record the date, the versions, and every failure. A failing task reports its real exit code.

VERIFICATION.md is written to that standard, which is why it contains awkward lines. A live cloud run is listed as not attempted. The one local end-to-end exercise with OpenCode on 2026-09-19 returned a 401, so model inference was not verified. Claude Code and Codex have not run live. troubleshooting.md adds that the verification file is dated, that unit tests use fakes, and that none of it establishes successful cloud deployment or model inference.

An unflattering 401 in the record is the system working. A green run nobody can reproduce is the failure mode.

How to report one yourself

troubleshooting.md gives the format for a bug report: the command, the versions, bounded redacted output, the expected and actual behavior, and whether the evidence is a unit test, a local exercise, or a cloud run. Never send secrets or private run transcripts.

Label the evidence type and the claim follows it. A 401 means the provider call was not successful, and egress routing alone is not inference. If the container engine is missing, say the container engine is missing, because static build success does not validate container startup.

Why the honesty costs something

Bounded tails mean you cannot always see why a run failed. Redaction means the exact secret-adjacent line is gone. Truncation means a publication can be incomplete. A refused config check means a run you wanted did not start.

Each of those is a worse experience than a confident success message. The project takes them anyway, because the alternative is a dashboard that reports activity it cannot back up, and spec/GOAL.md rules out fake metrics, testimonials, and fabricated activity outright.

The rule is simple enough to state and hard enough to keep. A run that fails is reported as failed, with the exit code it actually had, the stderr it actually produced, up to a documented limit, with secrets removed.

Read next: why the approval gate comes before the container.