gaal sync --dry-run runs the full audit and planning pipeline but writes nothing. It’s the safety net you reach for whenever you’re not sure what’s in the pipeline.
The basics
| Symbol | Meaning |
|---|---|
+ | Will be created. |
~ | Will be updated in place. |
= | Already in the desired state. |
- | Would be removed (only with --prune). |
Exit codes
--dry-run uses the exit code as a status signal so you can drive it from scripts:
| Code | Meaning |
|---|---|
0 | Nothing to change. State is fully reconciled. |
1 | Changes are pending. Run gaal sync to apply them. |
2 | Error during planning (config invalid, source unreachable, …). |
Machine-readable output
jq or feeding a CI step. The ASCII banner is suppressed automatically when -o json is set.
Combining with other flags
| Combo | Behaviour |
|---|---|
--dry-run --prune | Reports what would be removed, removes nothing. |
--dry-run --force | Reports installs that would happen into agents not currently detected. |
--dry-run --sandbox /tmp/sb | Plans against the sandboxed filesystem, not your real one. |
--dry-run --service | Rejected. A dry-run service loop is meaningless. |
CI pattern: fail the build on drift
Run dry-run withset -e in CI to fail when checked-in skills/MCP entries don’t match the committed config: