Troubleshooting¶
Each entry starts from what you see, a message of gdd or a change that stops, then gives the
cause and the fix. Messages are quoted as gdd prints them; CHANGE stands for the id of your
change, and the numbers, paths and ids in them are examples. For a change that parked, start with
Get a parked change going again.
Before you start¶
- Run
bin/gdd statusfirst: it says where G0, the red zones, the self-test and every change stand. - For a change,
bin/gdd inbox CHANGEgives its Decision Inbox, and.gdd/changes/CHANGE/holds the gate reports (g2.json,g3.json) and what each agent said (outputs/).
Find your message¶
| When | Entries |
|---|---|
| Before the build starts | G0 pending · G0 cannot open · Self-test: G2 red · Red zones not approved · Red zones changed · Scenarios without G1 · Red plan · Same model family · Agent not found · Uncommitted changes · Not the main checkout · The cap |
| At a sitting | G1 refused · No terminal · Builder cannot record |
| During the build | G2 still red · Protected path · Commands did not run · Approved scenario modified · Outside the package · Test mode wrote code · Agent changed GDD state · Agent did not answer · Spike budget |
| In G2 and G3 | Command timed out · Mutation timeouts · Not configured · Zero scenarios |
| At the merge | Conflicts with main · G3 red on main · Reviewer KO · Main checkout not clean |
| At G4 | Not paused at G4 · Pick a variant |
G0 pending: run the Setup¶
Cause. No change starts before the Setup Gate (G0) is open. bin/gdd status shows G0:
pending.
Fix. Start your agent and run the gdd-setup command (/gdd-setup in Claude Code and
OpenCode, $gdd-setup in Codex). It writes the Brief, runs bin/gdd selftest and opens G0
with bin/gdd gate G0 ok --by machines.
G0 cannot open¶
error: G0 cannot open: the harness self-test is not 4/4 (bin/gdd selftest).
error: G0 cannot open: docs/brief.md (Project Brief) is missing.
error: G0 is opened by the machines (--by machines): Brief written and harness 4/4.
Cause. The machines open G0 when the Project Brief exists and the last self-test passed all four checks, and nobody else can open it.
Fix. Write docs/brief.md, run bin/gdd selftest until it passes, then run bin/gdd gate
G0 ok --by machines. The self-test result is in .gdd/selftest.json.
Self-test: G2 is red without the failing test¶
KO a failing test turns G2 red (G2 is red without it: lint)
KO a failing test turns G2 red (gdd/debt.toml: invalid TOML: TOML parse error at line 17, column 1
Cause. The first check of the self-test needs G2 green before it plants its failing test.
It judges G2 as G2 does: a command held to its known debt in gdd/debt.toml does not make G2
red. The named command fails on main without known debt, or reports more than its count. In
the second form, gdd/debt.toml cannot be read, and the reason follows.
Fix. Make the named command pass on main, or, in a project that already has code, record
what fails today with bin/gdd adopt (see
Bring gdd to an existing project).
A command above its count needs its new problems fixed. Fix gdd/debt.toml when it cannot be
read. Then run bin/gdd selftest again.
Red zones not approved yet¶
error: Red zones not approved yet: the Orchestrator proposes them at the end of Discover. (bin/gdd gate zones ok --by human)
Cause. Until a human approves the red zones, only spikes can be built.
Fix. Read gdd/zones.toml, then approve them at the sitting of your change, or with
bin/gdd gate zones ok --by human. See Map and approve red zones.
Red zones changed after their approval¶
Cause. A red zone was added, removed or edited after its approval. Every change but a spike is refused until it is approved again.
Fix. Read what changed in the history of gdd/zones.toml, then bin/gdd gate zones ok --by
human.
New or changed scenarios without G1¶
Cause. The change created or modified a .feature file outside features/regression/, and
nobody approved it. A G1 KO stops the launch the same way.
Fix. Hold the sitting (bin/gdd sitting CHANGE) or run bin/gdd gate G1 ok CHANGE --by
human. See Write and approve scenarios.
Red change: a human must approve the plan¶
Cause. The change is red: it plans or touched a path of a red zone. A red change waits for a
human to approve its plan, in .gdd/changes/CHANGE/plan.md. A change can turn red on a
relaunch, when its Builder touched a red path: bin/gdd classify CHANGE counts what it touched.
Fix. Read the plan and approve it at the sitting, or with bin/gdd gate plan ok CHANGE --by
human --note "...".
Reviewer and Builder are the same model family¶
Cause. The Reviewer must be of another model family than the Builder, so it does not share
its blind spots. gdd init refuses the same way when every agent on the machine is of one
family:
error: one model family only (anthropic): the Reviewer would share the Builder's blind spots. Install an agent of another family (OpenCode takes models from many providers) or run again with --accept-same-family.
Fix. Give [reviewer] in gdd/models.toml an agent and a model of another family (see
[families] in the same file). If you have only one family, set the project up with gdd init
--accept-same-family: the change then says so in its Decision Inbox. See
Choose agents and models.
Cannot find the program of an agent on PATH¶
cannot find the claude program of Claude Code on PATH
error: no coding agent found on the PATH (claude, codex, opencode): install one or name it with --agents
Cause. The recipe checks that the program of every role's agent is on the PATH before
anything runs; gdd init looks for agents on the PATH when --agents is not given.
Fix. Install the agent and log in with its own command, or change the role in
gdd/models.toml. See Install gdd.
The working tree has uncommitted changes¶
Cause. gdd launch moves the main checkout to main and runs the change in its own
worktree; it refuses uncommitted changes in tracked files outside the change's branch.
Fix. Commit or stash them, then launch again. On the change's own branch, the earlier work is committed for you before the relaunch.
Run gdd launch from the main checkout¶
error: run gdd resume from the main checkout (/home/me/notes): the worktrees of the changes are made and removed from there
Cause. You ran gdd launch or gdd resume inside a change's worktree; the message names
the command.
Fix. cd to the main checkout and run it there.
The cap of changes building is reached¶
2 change(s) building, the cap is 2: cart-total, export-csv
login-rate-limit can launch once one of those building reaches G4 or is parked, or with a higher [parallel] max in gdd/rules.toml.
Cause. [parallel] max changes are already building. Changes parked or waiting at G4 do not
count.
Fix. Wait, or raise [parallel] max on main. See
Run changes in parallel.
G1 refused: hidden examples use step phrasings¶
error: G1 refused: hidden examples use step phrasings that no visible scenario has, so test mode can never write them. Reuse visible sentences with new data:
- a notebook with one note "…" and no tags
- the tags field of row # is empty
Cause. A hidden example uses a sentence no visible scenario has. Test mode never sees the hidden examples, so it could never write that step.
Fix. Rewrite the hidden example with the sentences of the visible scenarios and new data, or add the sentence to a visible scenario. Commit on the branch and approve again.
gdd sitting needs a terminal¶
error: gdd sitting needs a terminal; without one, record the sitting with gdd gate G1 ok export-csv --by human (and gdd gate zones ok --by human, gdd gate plan ok export-csv --by human for a red change)
Cause. The sitting is a screen, and there is no terminal (a script, CI, an agent's chat).
Fix. Run it in a terminal, or record each part with the gdd gate commands the message
names.
A Builder or Reviewer cannot open or close gates¶
Cause. The command ran with GDD_ROLE set to an agent role. Agents cannot record approvals,
answer G4 or release.
Fix. Run it yourself, in a shell without GDD_ROLE.
Parked: G2 still red after 3 retries and 1 replan¶
Change CHANGE parked: G2 still red after 3 retries and 1 replan. Message in .gdd/changes/CHANGE/inbox.md
Cause. Three Builder rounds and one replan by the Orchestrator did not turn G2 green. The
numbers come from [limits] builder_retries and replans of gdd/rules.toml.
Fix. Read .gdd/changes/CHANGE/g2.json for what failed, and the entries below for Path
Guard and scope failures. See Get a parked change going again.
Protected path for builder-build¶
Cause. Path Guard found a path the role must not touch since the build started: the harness
for everyone; the scenarios and the steps written in test mode for build mode; production code
for test mode. The paths are [protected] of gdd/rules.toml, as they were when the build
started.
A second cause catches people fixing a parked change by hand: a hand commit on a change's branch that holds the agents' uncommitted work moves its build start, and Path Guard then blames build mode for the steps test mode wrote.
Fix. Remove the agent's edit of the protected path. If you committed by hand, commit the agents' work first, then yours, as Fix by hand in the worktree shows.
The gate commands did not run: Path Guard must pass first¶
{"name":"path-guard","tail":"gdd/rules.toml: protected path for builder-build\nThe gate commands did not run: Path Guard must pass first."}
Cause. Every gate runs Path Guard before its commands. When it fails, no command runs, so an
agent that rewrote gdd/commands.toml never gets its commands run.
Fix. The same as for a protected path.
Scenario approved in G1 and modified afterwards¶
{"ok":false,"failures":["features/export_csv.feature: scenario approved in G1 and modified afterwards"]}
Cause. A sealed scenario file changed. Path Guard stops every role for it.
Fix. Put the approved file back, or, if the scenario must change, commit the new version on the branch and approve G1 again. See Change a scenario after its approval.
Outside the package and red¶
src/store/index.rs: outside the package and red (the change is yellow); remove it, or the Orchestrator widens the scope
Cause. In build mode, G2 also checks the scope: a path the change did not plan is accepted when its color is not higher than the change's, and listed in the Decision Inbox; a higher one fails, because the change would need gates it was not given.
Fix. Remove the file in the worktree and relaunch, or keep it: the relaunch classifies the change with what it touched, so it turns red and waits for its plan to be approved. See Why changes park.
Path Guard failed after test mode¶
Change CHANGE parked: Path Guard failed after test mode: src/x.rs: protected path for builder-test. Message in .gdd/changes/CHANGE/inbox.md
Cause. The Builder in test mode wrote production code, which only build mode may write.
Fix. Remove those files from the worktree and relaunch. If it happens again, check that
builder_test in [protected] matches where your production code lives.
Changed GDD state¶
Cause. gdd checks around every agent call that the agent did not touch the state in .gdd/
of its change or the state every change shares. It puts the state back and parks the change.
The same check parks a change when the Reviewer edits a file (the Reviewer changed ...:
Reviewers only read).
Fix. Read the agent's output in .gdd/changes/CHANGE/outputs/; check that its instructions
are the ones gdd wrote (bin/gdd agents check), then relaunch.
Did not answer within N seconds¶
Cause. An agent ran past its time limit and gdd stopped it, with every process it started.
The limit is [limits] agent_timeout_s of gdd/rules.toml, 3600 seconds when the file does
not set it. gdd also parks a change whose agent exits with an error (failed (exit N)).
Fix. Run the agent by hand once to check its login and quota. Raise agent_timeout_s on main
if the work is just slow, then relaunch.
The spike spent its budget¶
Cause. The agent calls of a Spike, or of one of its variants, cost [spike] max_usd.
Fix. Read what it found so far, then raise the budget on main and relaunch, or answer with what you know. See Explore with a spike.
Timed out: raise limits.command_seconds¶
Cause. A gate or release command ran longer than [limits] command_seconds (1800 seconds by
default) and gdd stopped it. The gate fails on that command.
Fix. On a slow machine, or with two changes in G3 at once, raise command_seconds in
gdd/rules.toml on main. It must be a whole number of seconds above 0, or every gate stops
with limits.command_seconds must be a whole number of seconds above 0.
Mutation testing times out¶
Cause. On the Rust sheet, a mutant can time out because it hangs or because the machine is busy. When only timeouts are left, the command runs those mutants again, one at a time with at least 120 seconds per test; one that hangs again counts as caught, one that now survives fails the gate. Missed mutants get no second chance.
Fix. Nothing when the gate passes. When the whole mutation command times out, raise
command_seconds, or avoid running two changes in G3 at once (see
Run changes in parallel). See
Tune the gates for the commands themselves.
gdd/commands.toml has no commands for this gate¶
Cause. Every command of the gate is empty. A gate with no commands fails (G2 not
configured): an empty gate would pass anything.
Fix. Fill in the commands, on main. See Tune the gates.
Zero scenarios counts as a failure¶
Cause. G3 counts the scenarios of features/, and [acceptance] required = true in
gdd/rules.toml makes zero a failure.
Fix. Write the first scenario (the Setup writes a smoke scenario). See Write and approve scenarios.
Main moved under it and the merge has conflicts¶
main moved under it and the merge has conflicts in src/export.rs: merge main into change/export-csv in its worktree (/home/me/notes/../notes.worktrees/export-csv), settle the conflicts, commit, then gdd launch export-csv
Cause. Another change merged first, and git cannot merge the latest main into this one.
Fix. Follow the message: see Settle merge conflicts with main.
G3 red on top of the latest main¶
Cause. Main merged cleanly into the change, but G3 fails with what main brought.
Fix. Read g3.json, fix it on the branch in the worktree, commit, relaunch.
Reviewer KO or G3 red after one fix¶
Cause. The Reviewer said KO, the Builder had its one fix, and the Reviewer said KO again (or G3 broke during the fix).
Fix. Read the last outputs/reviewer-<n>.md. When only the steps can fix the finding, build
mode cannot (they are protected for it): fix them by hand. See
Get a parked change going again.
The merge needs the main checkout without uncommitted changes¶
Change CHANGE parked: the merge needs the main checkout (/home/me/notes) without uncommitted changes in tracked files: commit or stash them.
Cause. Someone edited a tracked file in the main checkout while the change ran, and the merge happens there.
Fix. Commit or stash the edit, then bin/gdd launch CHANGE.
Not paused at G4¶
Cause. gdd resume answers only a change waiting at G4. After a failed observation the
change was rolled back and no longer waits.
Fix. Check the state with bin/gdd status. A rolled-back change needs a hotfix. See
Answer the Release Gate.
Pick a variant¶
Cause. OK and polish on a Spike with variants need the number of the variant.
Fix. Add --variant <n> with a variant that passed its gate. See
Explore with a spike.
Next steps¶
- Get a parked change going again: the full way back for a parked change.
- Command reference: every command and option.
- Files gdd writes: where the reports, outputs and records live.
- Keeping agents honest: why Path Guard and the state checks are this strict.