CLI Reference
Every command, flag, and resolution rule. Install and operate tracker from the terminal.
Install
# Go install (binary includes embedded workflows)
go install github.com/2389-research/tracker/cmd/tracker@latest
# Homebrew
brew install 2389-research/tap/tracker
# Or build from source
git clone https://github.com/2389-research/tracker
cd tracker && make install
# Verify installation
tracker doctor
# Stay current (checks automatically, or run manually)
tracker updateCommands
Running Pipelines
tracker <pipeline>build_product.dip, build.dipx), bare name (build_product), or path with slash. .dipx bundles are SHA-256-verified at load time and the bundle identity is threaded through every audit surface. .dipx v0.26.0 Opens TUI dashboard by default.tracker -r <id> <pipeline>-r 7813b is enough if unambiguous.tracker --no-tui <pipeline>tracker --json <pipeline>--no-tui. For CI/programmatic consumption.Workflow Management
tracker workflowstracker init <name>./name.dip in the current directory. Refuses to overwrite existing files.Validation & Simulation
tracker validate <pipeline>.dip, .dot, and .dipx bundles. .dipx v0.26.0tracker simulate <pipeline>.dip, .dot, and .dipx bundles. .dipx v0.26.0tracker estimate <pipeline>build_product → $0.65–$10.02, expected ~$3.56). No LLM calls; supports bare names. A deliberately wide range — actual cost depends on how many turns each agent uses and how many times loops run.Headless & Integration
tracker --webhook-url <url> <pipeline><url>; the pipeline blocks until a callback arrives at the local callback server. Slack bots, email approval, mobile push. Mutually exclusive with --autopilot and --auto-approve. v0.17.0tracker --param key=value <pipeline>vars (available as ${params.key}). Repeatable. Unknown keys hard-fail at startup. v0.19.0tracker --export-bundle <path> <pipeline>git bundle create --all). Clone with git clone <bundle> on any machine to inspect every commit and checkpoint tag. v0.17.0tracker --gateway-url <url> <pipeline>/anthropic, /openai, /google-ai-studio, /compat). Equivalent to TRACKER_GATEWAY_URL. Per-provider *_BASE_URL env vars still win. v0.17.0Autopilot
tracker --autopilot <persona> <pipeline>lax, mid (default), hard, mentor.tracker --auto-approve <pipeline>Diagnostics
tracker doctor [pipeline].ai/ writability, disk space, .gitignore hygiene, dangerous env var warnings. Live per-provider auth validation with a 1-token call runs by default; pass --probe=false to skip it. Optional pipeline arg runs full lint. Exit code 2 on warnings-only. v0.17.0tracker diagnose [runID]status.json + activity.jsonl. Shows tool output, stderr, errors, timing anomalies, actionable suggestions (deterministic failure pattern, escalation hit, suspicious timing, budget halt). Without ID, analyzes the most recent run.tracker audit <runID>tracker listSetup
tracker setup~/.config/tracker/.env.tracker versiontracker update.bak rollback. Detects Homebrew and go install and advises accordingly.Flags
Flags can appear before or after the pipeline argument.
| Flag | Description | Default |
|---|---|---|
| Execution | ||
-w, --workdir | Working directory for the pipeline run | Current directory |
-r, --resume | Resume a previous run by ID (prefix match) | — |
--force-bundle-mismatch | Allow resume when the .dipx bundle identity differs from the original run | Off |
--git | Git preflight policy: auto (default) | off | warn | require | init | auto |
--allow-init | Latch permitting --git init to initialize a repo in the working directory | Off |
--artifact-dir | Override node state directory v0.19.0 | Derived from run |
--param | Override workflow vars (repeatable): --param key=value v0.19.0 | — |
--format | Pipeline format override: dip or dot | Auto-detect from extension |
--backend | Agent backend: native, claude-code, or acp | native |
| Output | ||
--json | Stream events as NDJSON to stdout | Off |
--no-tui | Disable TUI dashboard, use console mode | TUI on (if TTY) |
--verbose | Show raw provider stream events | Off |
--export-bundle | After the run, write a portable git bundle of run artifacts to the given path v0.17.0 | — |
| Gate handling | ||
--autopilot | LLM judge persona: lax, mid, hard, mentor | Off (human gates) |
--auto-approve | Deterministic auto-approve (no LLM) | Off |
--webhook-url | POST gate prompts to this URL and wait for callback v0.17.0 | — |
--gate-callback-addr | Local addr for the inbound callback server | :8789 |
--gate-timeout | How long to wait for a webhook callback per gate | 10m |
--gate-timeout-action | What to do on gate timeout: fail or success | fail |
--webhook-auth | Authorization header on outbound webhook POSTs | — |
| Budget ceilings v0.17.0 | ||
--max-tokens | Halt if total tokens exceed this | — |
--max-cost | Halt if total cost (cents) exceeds this | — |
--max-wall-time | Halt if wall-clock runtime exceeds this (e.g. 30m) | — |
| Provider routing & tool safety | ||
--gateway-url | Route every provider through a Cloudflare AI Gateway root URL; equivalent to TRACKER_GATEWAY_URL. See the Bedrock Gateway integration guide for the AWS Bedrock recipe. v0.17.0 | — |
--gateway-kind | Gateway path convention: cf-aig (default) or bedrock | cf-aig |
--tool-allowlist | Restrict tool commands to glob patterns. Repeatable; each value can be a comma-separated list. Additive with the tool_commands_allow graph attr. Never overrides the denylist. v0.23.0 | — |
--tool-denylist-add | Extend the built-in tool-command denylist with extra glob patterns. Repeatable; each value can be a comma-separated list. Additive only — cannot remove built-ins. Pairs with the tool_denylist_add graph attr. --bypass-denylist still disables everything. v0.24.1 | — |
--bypass-denylist | Disable the built-in denylist for dangerous tool commands (eval, pipe-to-shell, curl | sh). Loud stderr warning on startup. Use only in sandboxed environments where dangerous patterns are intentional. v0.23.0 | Off |
--max-output-limit | Hard ceiling (bytes) on per-stream tool output size; caps per-node output_limit attrs. When a stream exceeds its cap, tracker keeps the tail (last limit bytes) so routing markers like printf 'tests-pass' emitted at end-of-output survive truncation. tracker diagnose surfaces a tool_output_truncated suggestion. v0.23.0 tail-window v0.27.0 | 0 (effective 10 MB) |
| Exit codes | ||
--fail-on-override | Exit code 2 when the run terminates as validation_overridden. Default behavior exits 0 (an override is a deliberate operator decision). Equivalent to TRACKER_FAIL_ON_OVERRIDE=1; the flag wins. See the Exit codes section. v0.35.0 | Off |
| Misc | ||
--version | Show version info | — |
Exit codes v0.35.0
tracker run uses three distinguishable exit codes so CI integrations can branch on terminal status without parsing stdout.
| Code | Meaning |
|---|---|
0 | Run completed. Terminal status is either success or validation_overridden. |
1 | Run failed or was halted by a budget guard. Terminal status is fail or budget_exceeded. |
2 | Run completed as validation_overridden and --fail-on-override (or TRACKER_FAIL_ON_OVERRIDE=1) was set. Lets CI distinguish operator-accepted overrides from clean successes without scraping output. |
Generic failures dominate --fail-on-override: a run that fails after an override exits 1, not 2. Without the flag, override runs exit 0 — an override is a deliberate operator decision and the default treats it as audit-positive. CI pipelines that should NOT auto-deploy on overrides must opt in:
tracker run --fail-on-override workflow.dip && deploy.shTool safety in pipeline files v0.23.0
The denylist, allowlist, and per-stream output ceiling are enforceable from a pipeline file as well as CLI flags. CLI values and graph attrs union; the denylist always wins.
| Graph attribute | Notes |
|---|---|
tool_commands_allow | Comma-separated globs restricting every tool node's command to match at least one pattern. Unions with --tool-allowlist; cannot override the denylist. |
tool_denylist_add | Comma-separated globs added to the built-in denylist for every tool node. Unions with --tool-denylist-add; strictly additive (cannot remove built-ins). v0.24.1 |
Example, DOT form:
digraph G {
// Only git and make commands are allowed in tool nodes.
graph [tool_commands_allow="git *,make *"];
Setup [handler="tool", tool_command="git init"];
Build [handler="tool", tool_command="make build"];
Setup -> Build;
}As of dippin-lang v0.23.0+ (tracker ships v0.45.0), both attributes are exposed via a defaults: block
in a .dip file (defaults: tool_commands_allow: "git *,make *"). The DOT form above and the
library API (graph.Attrs["tool_commands_allow"]) remain equivalent ways to set them.
Name resolution
When you run tracker build_product (bare name, no path, no extension), the resolver
checks in this order:
Explicit file path
If the name contains
/or ends in.dip/.dot/.dipx, treat as a filesystem path. No further resolution.Local .dip file
Check if
build_product.dipexists in the current directory. Local files always win.Bare file
Check if
build_productexists as a file in the current directory.Embedded workflow
Look up
build_productin the built-in workflow catalog. If found, load fromgo:embed.Error
Print "unknown pipeline" with a list of available built-in workflows.
This applies uniformly to tracker run, tracker validate, and tracker simulate.
Environment variables
Provider keys
| Variable | Provider | Notes |
|---|---|---|
ANTHROPIC_API_KEY | Anthropic | Required for claude-* models |
ANTHROPIC_BASE_URL | Anthropic | Custom endpoint (proxies, etc.) |
OPENAI_API_KEY | OpenAI | Required for gpt-*, o* models |
OPENAI_BASE_URL | OpenAI | Custom endpoint |
GEMINI_API_KEY | Gemini | Required for gemini-* models |
GOOGLE_API_KEY | Gemini | Alternative to GEMINI_API_KEY |
GEMINI_BASE_URL | Gemini | Custom endpoint |
Keys are loaded from three sources in order: shell environment (highest priority),
~/.config/tracker/.env (XDG config), then .env in the working directory.
Shell env vars are never overwritten.
Tracker runtime knobs
| Variable | Default | Notes |
|---|---|---|
TRACKER_GATEWAY_URL | — | Equivalent to --gateway-url. Tracker appends per-provider suffixes (/anthropic, /openai, /google-ai-studio, /compat). Per-provider *_BASE_URL still wins. v0.17.0 |
TRACKER_PASS_API_KEYS | unset | Set to 1 to keep *_API_KEY in the subprocess env when using --backend claude-code or --backend acp. Default behavior strips them so the subprocess uses subscription / native auth. v0.12.0 |
TRACKER_PASS_ENV | unset | Set to 1 to disable the sensitive-env scrub on tool subprocesses (*_API_KEY, *_SECRET, *_TOKEN, *_PASSWORD). Default scrubs them out. Use only when a tool genuinely needs a secret. |
TRACKER_FAIL_ON_OVERRIDE | unset | Set to exactly 1 (strict parsing) to exit code 2 when a run terminates as validation_overridden. Equivalent to --fail-on-override; the CLI flag wins when both are present. v0.35.0 |
TRACKER_SPRINT_WRITER_MODEL | unset (tool disabled when unset; the configured model name is used directly) | Model used by the write_enriched_sprint agent-runtime tool. When set, the tool registers in the native backend's tool registry. Pair with TRACKER_CODEGEN_MODEL for the full architect-side flow. v0.25.0 |
TRACKER_CODEGEN_MODEL | unset (tool disabled when unset; the configured model name is used directly) | Model used by the generate_code tool to expand a contract into files. Setting this also registers dispatch_sprints. v0.25.0 |
TRACKER_RUN_ID / TRACKER_RUN_DIR / TRACKER_WORKDIR | set by tracker | Outputs, not inputs: tracker injects these into every locally-executed tool subprocess — the run ID, the absolute per-run artifact dir, and the absolute workdir — so a tool can cat "$TRACKER_RUN_DIR/<NodeID>/response.md" for an upstream agent's output. Operator-exported values of these names are overridden, never inherited. Present on the TRACKER_PASS_ENV=1 path too. v0.37.0 |
Autopilot mode
Run pipelines fully autonomous. Human gates are answered by an LLM judge with a configurable decision-making persona.
# Balanced judgment (default persona)
tracker --autopilot mid build_product
# Move fast, approve everything reasonable
tracker --autopilot lax build_product
# High quality bar — pushes back on gaps
tracker --autopilot hard build_product
# Approves but writes detailed feedback
tracker --autopilot mentor build_product
# Deterministic auto-approve — no LLM, for CI
tracker --auto-approve build_productPersonas
| Persona | Approval Bias | Reasoning Style | Best For |
|---|---|---|---|
lax | Strong approve | Brief: "Looks fine, moving on" | Demos, prototypes, overnight runs |
mid | Balanced | Concise: one paragraph | General-purpose unattended runs |
hard | Prefers retry/adjust | Detailed: cites specific gaps | Pre-release quality sweeps |
mentor | Approve with notes | Verbose: 3-5 sentences of feedback | Learning, review artifacts |
How It Works
Gate Reached
Pipeline hits a human gate (ApprovePlan, EscalateMilestone, etc.)
LLM Consulted
The autopilot sends the gate's prompt, context, and available options to the LLM with the persona's system prompt.
Structured Response
LLM returns
{"choice": "approve", "reasoning": "..."}. Choice is matched against edge labels.Fallback on Error
If the LLM fails or returns an unmatchable choice, the default edge is taken with a warning.
Design Note
The autopilot reuses the pipeline's existing LLM client — no separate configuration. It picks the cheapest model from the configured default provider (falling back to claude-sonnet-4-6 if none is set) for cheap, fast gate decisions. All decisions are logged to the activity log for post-hoc review via tracker diagnose.
Agent backends
Three backends, one pipeline. Native is the default and works with every provider. Claude Code gives agents file editing,
terminal access, and MCP tool servers (subscription auth, no API key needed). ACP bridges tracker to third-party coding
agents like claude-agent-acp, codex-acp, and gemini --acp via JSON-RPC over stdio.
Side-by-Side Comparison
| Native (default) | Claude Code v0.12.0 | ACP v0.16.0 | |
|---|---|---|---|
| How it works | Wraps agent.Session — tracker's built-in turn loop | Spawns claude CLI as a subprocess, parses NDJSON output | Spawns ACP-compatible agents via JSON-RPC 2.0 over stdio |
| Providers | Anthropic, OpenAI, Gemini, OpenAI-compat | Anthropic (via Claude CLI) | Routed to matching ACP binary per provider |
| Tool access | Tracker's registered tool set | File editing, terminal, MCP servers | Full agent toolset (file ops, terminal via ACP) |
| Best for | Standard LLM calls, multi-provider pipelines, cross-review | Implementation nodes that need file editing + terminal | Hosting third-party ACP coding agents inside a tracker pipeline |
| Environment | Full process environment | API keys stripped by default (subscription auth); TRACKER_PASS_API_KEYS=1 to keep them | API keys stripped by default so agents use native auth |
| Error mapping | Provider HTTP status + SSE events | Claude CLI exit codes → pipeline outcomes | ACP JSON-RPC error codes → pipeline outcomes |
| Per-node override | backend: native | backend: claude-code | backend: acp + optional acp_agent: |
When to Use Which
Use Native When
- Your agents make standard LLM calls (analysis, planning, review)
- You need multi-provider pipelines (Claude + GPT + Gemini)
- Cross-review nodes that compare outputs from different models
- You want the fastest possible execution
Use Claude Code When
- Agents need to edit files on disk (implementation, fix nodes)
- Agents need terminal access (run tests, build commands)
- You want MCP tool servers available to agents
- You want Claude's built-in code intelligence
Usage
# Global: every agent node uses Claude Code
tracker --backend claude-code build_product
# The killer combo: autonomous + Claude Code
tracker --backend claude-code --autopilot mid build_product
# Native is the default — no flag needed
tracker build_productPer-Node Selection in .dip
Mix backends within a single pipeline. Use Claude Code for implementation, native for everything else. Per-node backend: attrs always override the global --backend flag.
agent Implement
label: "Build the feature"
model: claude-sonnet-4-6
backend: claude-code
prompt: |
Implement milestone ${ctx.current_milestone} following SPEC.md.
agent Review
label: "Review the implementation"
model: gpt-5.4
provider: openai
# No backend attr — uses native (default)
prompt: |
Review the implementation for correctness and style.The acp backend (v0.16.0+) spawns ACP-compatible coding agents as subprocesses via JSON-RPC over stdio
(claude-agent-acp, codex-acp, gemini --acp). Override the chosen binary per-node via
the acp_agent node attribute.
tracker-swebench companion binary v0.18.0+
Evaluates tracker's agent against the SWE-bench dataset. Orchestrates
per-instance Docker containers, a dataset JSONL parser, a resumable results writer, and an in-container
agent-runner that captures changes via git diff.
tracker-swebench --dataset <path.jsonl> [flags]--model, --provider, --gateway-url, --max-turns, --timeout, --instance, --results-dir, --docker-image, and forwarding of CF_AIG_TOKEN through the container for gateway auth.tracker-swebench analyze <results-dir>predictions.jsonl + run logs + empty-patch diagnostics and emits overall resolved/unresolved/empty/error counts, per-repo breakdown, top-10 empty-patch and longest-unresolved instances, and error-class distribution. Auto-detects SWE-bench evaluator resolved_ids; gracefully degrades when no evaluator report is present. v0.22.0# Analyze a completed run, pretty-printed
tracker-swebench analyze ./swebench-results/
# Structured JSON for downstream tooling
tracker-swebench analyze ./swebench-results/ --json > report.json
# Evaluate predictions against a specific ID file
tracker-swebench analyze ./swebench-results/ --predictions preds.jsonlTroubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| "no LLM providers configured" | Missing API keys | tracker setup or export env vars |
| TestMilestone instantly escalates | Stale fix_attempts counter | rm .ai/milestones/fix_attempts |
| Node fails with no visible error | Tool stderr not surfaced | tracker diagnose shows full output |
| Pipeline loops forever | Unconditional fallback to loop target | Route fallbacks to escalation gates or Done |
Run halted with budget_exceeded | Hit --max-tokens / --max-cost / --max-wall-time | tracker diagnose prints the per-provider breakdown and the dimension that tripped |
| Tool retries same error 5 times | Deterministic command bug | tracker diagnose flags it — fix the command in the .dip file |
Diagnose intelligence
tracker diagnose doesn't just dump errors — it analyzes failure patterns
and generates actionable suggestions.
Deterministic Failure Detection
When a tool node fails multiple retries with identical errors, diagnose recognizes it as a deterministic bug in the command — not a transient issue that retrying might fix. This saves users from wading through 5 identical stack traces to realize the command itself is wrong.
✗ T1Init
Handler: tool
Duration: 3.2s
Attempts: 5 failures (all identical — deterministic)
Output:
The workspace name "." is invalid.
Workspace names must start with a letter.
─── Suggestions ───────────────────────────────────────────
→ T1Init: Failed 5 times with identical errors — this is a
deterministic bug in the command, not a transient failure.
Retrying won't help. Fix the tool command in the .dip file
and re-run.All Detection Patterns
| Pattern | Detection | Suggestion |
|---|---|---|
| Identical retries | Same error signature across 2+ failures | Deterministic bug — fix the command |
| Varying retries | 3+ failures with different errors | Flaky command or environment issue |
| Escalation hit | ESCALATE + fix attempts in output | Reset counter: rm .ai/milestones/fix_attempts |
| Silent failure | No stdout, stderr, or errors captured | Check activity.jsonl manually |
| Missing command/file | command not found or No such file | Check working directory and tool availability |
| Go test failures | FAIL + go test in output | Check known_failures exclusion list |
| Suspiciously fast | <50ms for non-tool nodes | Configuration issue or missing handler |
Quick reference
The commands you'll use most, at a glance.
# First time
tracker doctor # check API keys + tools
tracker setup # configure providers interactively
# Run pipelines
tracker build_product # built-in workflow, no file needed
tracker my_pipeline.dip # local file
tracker --autopilot mid build_product # fully autonomous
tracker --backend claude-code my.dip # agents use claude CLI
# Full YOLO — Claude Code agents, autopilot gates, TUI dashboard
tracker --backend claude-code --autopilot lax build_product
# After a run
tracker diagnose # analyze most recent failure
tracker audit <runID> # full audit trail
tracker list # recent runs
# Manage pipelines
tracker workflows # list built-in workflows
tracker init build_product # copy to cwd for editing
tracker validate my.dip # lint + structure check
tracker simulate my.dip # dry-run all paths
# Maintenance
tracker update # self-update to latest release
tracker version # version + configured providers