Find your message
When something goes wrong, match the text Kusaw printed or the reason code it recorded. Entries are grouped by where you see them. Each one quotes the message as the factory prints it, with placeholders where the factory fills values.
When something goes wrong, match the text Kusaw printed or the reason code it recorded. Entries are grouped by where you see them. Each one quotes the message as the factory prints it, with placeholders where the factory fills values.
The factory has to be serving for the queue to move. If a command says serve is not running, start it with kusaw serve first.
Questions that are not a specific failure are in the FAQ.
Installing
Claude Code was not found
You see: Claude Code was not found ("<command>"). Install it or set claude.command in kusaw.yaml.
What it means: the step tried to start the agent CLI and it was not on PATH (or the configured command does not exist).
What to do:
- Install the Claude Code you already use and confirm it is on
PATH. - If the binary is not named
claude, setclaude.commandinkusaw.yaml. - If the CLI is installed but not signed in, sign in with that CLI's own docs; Kusaw does not ask for credentials. Reference: Install, kusaw.yaml
Starting the factory
kusaw serve is not running
You see: Request <id> is queued. kusaw serve is not running, so it will be handled when it starts.
What it means: the command was accepted and written to the queue. Nothing runs until serve is up.
What to do:
- Start the factory with
kusaw serve. - Open the Dashboard with
kusaw ui --open. - Check
kusaw status. A down monitor printsMonitor: down (no heartbeat for <duration>). Reference: Install
Adding a task
kusaw.yaml is invalid
You see: kusaw.yaml is invalid: <message> (line <n>). or a summary that starts kusaw.yaml is invalid:
What it means: kusaw validate (or kusaw add) rejected the config. The line number is in the file it read.
What to do:
- Run
kusaw validateand fix the first error. - Check the key on that line against the config reference.
- For a missing version, the factory also prints
kusaw.yaml version <version> is not supported. This factory reads version 2.Reference: kusaw.yaml
A run that failed
Step "review" timed out
You see: Step "<id>" timed out after <duration>, or the reason code timeout on the step.
What it means: the step ran longer than its limit and was stopped.
What to do:
- Check the step's log for where it stopped (
<data_dir>/runs/<run>/attempts/thenstderr.log). - Raise
steps.<id>.timeoutif the work is just slow. Reference: Reason codes
crashed
You see: the reason code crashed on the step, or on stderr [serve] factory "<name>" crashed: <message>. Restarting in <n> s.
What it means: the step process exited without a valid result, or a served factory panicked and the supervisor is restarting it.
What to do:
- Open the attempt's
stderr.logandstdout.jsonlunder<data_dir>/runs/<run>/attempts/. - If a custom step crashed, fix the process and run
kusaw validateso the handshake still passes. - If serve itself crashed, read the serve log, then start
kusaw serveagain. Reference: Reason codes
rate_limited
You see: Claude Code hit a rate limit:, or the reason code rate_limited.
What it means: the user's configured Claude Code refused the call because of a usage or rate limit. Kusaw retries once after 60 seconds (or the provider's reported wait, up to 15 minutes), then fails. Requeue is the next try.
What to do:
- Wait and let the step retry, or requeue the run later.
- Check the plan and usage on the Claude Code account you configured. Kusaw does not manage that account.
- Shorten the task if the work is larger than that plan allows. Reference: Reason codes
Verification command failed
You see: Verification command <n> failed: <message>, or Verification command <n> failed in "<label>": <message>, or the reason code verification_failed.
What it means: a command from the spec's ## Verification section exited non-zero (or timed out: (timed out after <duration>)).
What to do:
- Run that command yourself in the worktree and read its output.
- Fix the change, or fix the verification command if the command is wrong.
- If the spec has no commands, the factory prints
The spec has no Verification commands.Reference: Reason codes, Write a good task
A run that needs attention
needs_attention after the loop limit
You see: Needs attention: in kusaw status, the run status needs_attention, and the reason loop_exhausted.
What it means: the loop used every iteration (max_iterations) without passing. The run is finished and waiting for you; it will not retry on its own.
What to do:
- Read the last findings on the run page.
- Requeue with a note (
kusaw requeue <run> --note "..."), dismiss it, or take it over and finish by hand. - Raise the loop's
max_iterationsonly if more tries would actually help. Reference: Reason codes, Rerun, requeue, resume or steer
Steps and providers
The agent CLI entries above (Claude Code was not found, rate_limited) are the provider failures users hit first. Messages printed by Claude Code itself are in that CLI's own docs.
Custom steps
protocol_error from a custom step
You see: the reason code protocol_error, or protocol error, or Step "<id>" speaks protocol <versions>; this factory needs protocol 2.
What it means: the step did not speak protocol 2: missing or extra result line, invalid JSON, or a handshake that does not offer version 2.
What to do:
- Run
kusaw validateso the handshake is checked before a run. - Confirm the program writes one handshake line and one result line, as in Write your first step.
- Check
stdout.jsonlfor the line the adapter rejected. Reference: Reason codes, Step protocol
Custom step handshake failed
You see: step "<id>" handshake failed: <message>, no handshake line within 5 s, or invalid handshake JSON.
What it means: kusaw validate (or the start of a run) asked the step for a handshake and did not get a valid protocol 2 reply in time.
What to do:
- Run the command from
steps.<id>.commandyourself with the handshake env the protocol reference describes. - Fix the program so it prints one JSON handshake line and exits 0.
- If the handshake's
interactiveflag does not matchkusaw.yaml, the factory printsstep "<id>" says interactive: <flag> in its handshake but kusaw.yaml says <flag>. Reference: Custom steps, Step protocol
The Dashboard
A gate is waiting
You see: Waiting for you: in kusaw status, a line <run> <task> gate "<gate>" since <time>, and the run status waiting_for_human.
What it means: the pipeline reached a gate. Delivery waits until you approve or reject.
What to do:
- Open the run in the Dashboard, or run
kusaw status. - Read the summary, diff, verification output, and review findings.
- Approve with
kusaw approve <run>(or the Dashboard button), or reject with a note. Approval delivers a local commit; Kusaw never merges or pushes. Reference: Review and approve a run, Read the Dashboard
A run stays queued while the queue is paused
You see: Queue: paused (or Queue: paused (<cause>)) and Queued (<n>): with the run still queued. The first queued run is marked [next] but does not start.
What it means: pause is on, so the factory will not take the head of the queue. Serve can be up and the run still waits.
What to do:
- Confirm pause with
kusaw status. - Resume with
kusaw resume. If the queue is not paused, that command printsQueue is not paused. - If serve is also down, start
kusaw serveas in kusaw serve is not running. Reference: Read the Dashboard, Reason codes
Telemetry
Telemetry is off until `kusaw telemetry on`. Nothing is sent before that. There is no built-in destination. The endpoint is one you host, over HTTPS, or `http` only for `127.0.0.1` or `localhost`.
FAQ
Short answers for questions people ask before and after a first run. For a printed error, start at [Find your message](index.md).