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 update

Commands

Running Pipelines

tracker <pipeline>
Run a pipeline. Accepts a file path (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>
Resume a previous run by ID. Prefix matching works — -r 7813b is enough if unambiguous.
tracker --no-tui <pipeline>
Run in console mode (no dashboard). Human gates use inline prompts. Auto-selected when stdin is not a TTY.
tracker --json <pipeline>
Stream events as newline-delimited JSON to stdout. Implies --no-tui. For CI/programmatic consumption.

Workflow Management

tracker workflows
List all embedded built-in workflows with display names and goals.
tracker init <name>
Copy a built-in workflow to ./name.dip in the current directory. Refuses to overwrite existing files.

Validation & Simulation

tracker validate <pipeline>
Check pipeline structure — parsing, structural validation, semantic validation, lint. Exits 1 on errors. Supports bare names. Accepts .dip, .dot, and .dipx bundles. .dipx v0.26.0
tracker simulate <pipeline>
Dry-run execution plan. Shows nodes, edges, BFS traversal, unreachable nodes, and graph-level attrs (sorted, deterministic). No LLM calls. Supports bare names. Accepts .dip, .dot, and .dipx bundles. .dipx v0.26.0
tracker estimate <pipeline>
Rough pre-run cost & scale ballpark v0.46.0 — prices each agent node's model against a turn heuristic and reports steps, agent-node count, distinct models, and a Low–High cost range with an expected value (e.g. 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>
Fully headless. Every human gate is POSTed as JSON to <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.0
tracker --param key=value <pipeline>
Override a workflow's top-level vars (available as ${params.key}). Repeatable. Unknown keys hard-fail at startup. v0.19.0
tracker --export-bundle <path> <pipeline>
After the pipeline completes, package the full artifact run directory as a portable git bundle (git bundle create --all). Clone with git clone <bundle> on any machine to inspect every commit and checkpoint tag. v0.17.0
tracker --gateway-url <url> <pipeline>
Route every provider through a Cloudflare AI Gateway. Tracker appends the per-provider suffix (/anthropic, /openai, /google-ai-studio, /compat). Equivalent to TRACKER_GATEWAY_URL. Per-provider *_BASE_URL env vars still win. v0.17.0

Autopilot

tracker --autopilot <persona> <pipeline>
Replace all human gates with LLM-backed decisions. Personas: lax, mid (default), hard, mentor.
tracker --auto-approve <pipeline>
Deterministic auto-approval of all human gates. No LLM calls — always picks the default or first option. For CI and testing.

Diagnostics

tracker doctor [pipeline]
Preflight health check. Per-provider API key validation (masked), dippin binary version, .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.0
tracker diagnose [runID]
Deep failure analysis. Reads 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>
Full audit report: timeline, retries, errors, recommendations. For post-hoc analysis of any run.
tracker list
List recent pipeline runs with timestamps, status, and node count.

Setup

tracker setup
Interactive provider configuration wizard. Saves keys to ~/.config/tracker/.env.
tracker version
Show version, commit hash, build time, and configured providers.
tracker update
Self-update to latest release. Downloads from GitHub, verifies SHA256 checksum, smoke-tests the binary, and atomically replaces with .bak rollback. Detects Homebrew and go install and advises accordingly.

Flags

Flags can appear before or after the pipeline argument.

FlagDescriptionDefault
Execution
-w, --workdirWorking directory for the pipeline runCurrent directory
-r, --resumeResume a previous run by ID (prefix match)
--force-bundle-mismatchAllow resume when the .dipx bundle identity differs from the original runOff
--gitGit preflight policy: auto (default) | off | warn | require | initauto
--allow-initLatch permitting --git init to initialize a repo in the working directoryOff
--artifact-dirOverride node state directory v0.19.0Derived from run
--paramOverride workflow vars (repeatable): --param key=value v0.19.0
--formatPipeline format override: dip or dotAuto-detect from extension
--backendAgent backend: native, claude-code, or acpnative
Output
--jsonStream events as NDJSON to stdoutOff
--no-tuiDisable TUI dashboard, use console modeTUI on (if TTY)
--verboseShow raw provider stream eventsOff
--export-bundleAfter the run, write a portable git bundle of run artifacts to the given path v0.17.0
Gate handling
--autopilotLLM judge persona: lax, mid, hard, mentorOff (human gates)
--auto-approveDeterministic auto-approve (no LLM)Off
--webhook-urlPOST gate prompts to this URL and wait for callback v0.17.0
--gate-callback-addrLocal addr for the inbound callback server:8789
--gate-timeoutHow long to wait for a webhook callback per gate10m
--gate-timeout-actionWhat to do on gate timeout: fail or successfail
--webhook-authAuthorization header on outbound webhook POSTs
Budget ceilings v0.17.0
--max-tokensHalt if total tokens exceed this
--max-costHalt if total cost (cents) exceeds this
--max-wall-timeHalt if wall-clock runtime exceeds this (e.g. 30m)
Provider routing & tool safety
--gateway-urlRoute 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-kindGateway path convention: cf-aig (default) or bedrockcf-aig
--tool-allowlistRestrict 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-addExtend 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-denylistDisable 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.0Off
--max-output-limitHard 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.00 (effective 10 MB)
Exit codes
--fail-on-overrideExit 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.0Off
Misc
--versionShow 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.

CodeMeaning
0Run completed. Terminal status is either success or validation_overridden.
1Run failed or was halted by a budget guard. Terminal status is fail or budget_exceeded.
2Run 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.sh

Tool 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 attributeNotes
tool_commands_allowComma-separated globs restricting every tool node's command to match at least one pattern. Unions with --tool-allowlist; cannot override the denylist.
tool_denylist_addComma-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:

  1. Explicit file path

    If the name contains / or ends in .dip/.dot/.dipx, treat as a filesystem path. No further resolution.

  2. Local .dip file

    Check if build_product.dip exists in the current directory. Local files always win.

  3. Bare file

    Check if build_product exists as a file in the current directory.

  4. Embedded workflow

    Look up build_product in the built-in workflow catalog. If found, load from go:embed.

  5. 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

VariableProviderNotes
ANTHROPIC_API_KEYAnthropicRequired for claude-* models
ANTHROPIC_BASE_URLAnthropicCustom endpoint (proxies, etc.)
OPENAI_API_KEYOpenAIRequired for gpt-*, o* models
OPENAI_BASE_URLOpenAICustom endpoint
GEMINI_API_KEYGeminiRequired for gemini-* models
GOOGLE_API_KEYGeminiAlternative to GEMINI_API_KEY
GEMINI_BASE_URLGeminiCustom 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

VariableDefaultNotes
TRACKER_GATEWAY_URLEquivalent 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_KEYSunsetSet 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_ENVunsetSet 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_OVERRIDEunsetSet 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_MODELunset (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_MODELunset (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_WORKDIRset by trackerOutputs, 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_product

Personas

PersonaApproval BiasReasoning StyleBest For
laxStrong approveBrief: "Looks fine, moving on"Demos, prototypes, overnight runs
midBalancedConcise: one paragraphGeneral-purpose unattended runs
hardPrefers retry/adjustDetailed: cites specific gapsPre-release quality sweeps
mentorApprove with notesVerbose: 3-5 sentences of feedbackLearning, review artifacts

How It Works

  1. Gate Reached

    Pipeline hits a human gate (ApprovePlan, EscalateMilestone, etc.)

  2. LLM Consulted

    The autopilot sends the gate's prompt, context, and available options to the LLM with the persona's system prompt.

  3. Structured Response

    LLM returns {"choice": "approve", "reasoning": "..."}. Choice is matched against edge labels.

  4. 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.0ACP v0.16.0
How it worksWraps agent.Session — tracker's built-in turn loopSpawns claude CLI as a subprocess, parses NDJSON outputSpawns ACP-compatible agents via JSON-RPC 2.0 over stdio
ProvidersAnthropic, OpenAI, Gemini, OpenAI-compatAnthropic (via Claude CLI)Routed to matching ACP binary per provider
Tool accessTracker's registered tool setFile editing, terminal, MCP serversFull agent toolset (file ops, terminal via ACP)
Best forStandard LLM calls, multi-provider pipelines, cross-reviewImplementation nodes that need file editing + terminalHosting third-party ACP coding agents inside a tracker pipeline
EnvironmentFull process environmentAPI keys stripped by default (subscription auth); TRACKER_PASS_API_KEYS=1 to keep themAPI keys stripped by default so agents use native auth
Error mappingProvider HTTP status + SSE eventsClaude CLI exit codes → pipeline outcomesACP JSON-RPC error codes → pipeline outcomes
Per-node overridebackend: nativebackend: claude-codebackend: 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_product

Per-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]
Run the harness over a SWE-bench dataset. Supports --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>
Bulk-triage a completed run. Reads 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.jsonl

Troubleshooting

SymptomCauseFix
"no LLM providers configured"Missing API keystracker setup or export env vars
TestMilestone instantly escalatesStale fix_attempts counterrm .ai/milestones/fix_attempts
Node fails with no visible errorTool stderr not surfacedtracker diagnose shows full output
Pipeline loops foreverUnconditional fallback to loop targetRoute fallbacks to escalation gates or Done
Run halted with budget_exceededHit --max-tokens / --max-cost / --max-wall-timetracker diagnose prints the per-provider breakdown and the dimension that tripped
Tool retries same error 5 timesDeterministic command bugtracker 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

PatternDetectionSuggestion
Identical retriesSame error signature across 2+ failuresDeterministic bug — fix the command
Varying retries3+ failures with different errorsFlaky command or environment issue
Escalation hitESCALATE + fix attempts in outputReset counter: rm .ai/milestones/fix_attempts
Silent failureNo stdout, stderr, or errors capturedCheck activity.jsonl manually
Missing command/filecommand not found or No such fileCheck working directory and tool availability
Go test failuresFAIL + go test in outputCheck known_failures exclusion list
Suspiciously fast<50ms for non-tool nodesConfiguration 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