Skip to main content
Plans behave like well-mannered CLI commands — clean stdout, meaningful exit codes, explicit inputs — so shell automation composes around them. The scripting contract defines the guarantees; these are the recipes.

urgent_issues — output mode, zero LLM

Lessons:
  • No solver + an output map = structured JSON on stdout, zero inference, sub-second after the tool call.
  • As a plan tool in chat, the agent receives the raw data — it can then reason over actual issue objects rather than a prose summary.
  • The typed splice does the heavy lifting: "{{E0.issues}}" is a real JSON array in the output, "{{E0.issues.length}}" a real number.

Recipe: fixtures + overrides

Check in the base inputs, override per run — the document is the base, --input layers on top:

Recipe: branch on outcomes

Exit codes separate “the data says act” from “the run broke” (full table):
For assertion-style automation, put the condition in the plan as an exit gate and branch on exit 4 — that’s how the CI checks work.

Recipe: silent action plan

A plan with no solver and no output performs side effects and exits — e.g. file a Linear issue for every failing canary from an exec tool’s output. Zero inference, fully deterministic, reviewable in the PR that adds the plan file.

Concurrency note

Storage is safe under concurrent processes; use GRAPH_STORAGE=memory when a job should leave no state behind.

Patterns to reuse