car-runtime 0.53.0 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/CLI.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  > **Generated file — do not hand-edit below the task map.** Produced by
4
4
  > `scripts/gen-cli-docs.sh` from `car --help` / `car help <command>` on car
5
- > 0.52.1 (2026-09-06). Every subcommand the installed binary reports is
5
+ > 0.54.0 (2026-09-15). Every subcommand the installed binary reports is
6
6
  > below; a new subcommand cannot ship without appearing here the next time
7
7
  > this script runs. To regenerate: `bash scripts/gen-cli-docs.sh`.
8
8
  >
9
- > 69 top-level commands, 106 nested subcommands
9
+ > 73 top-level commands, 117 nested subcommands
10
10
  > (one level deep) — counted from the live binary at generation time, not
11
11
  > typed by hand.
12
12
 
13
13
  ## Finding your way around
14
14
 
15
- `car` is one binary with 69 subcommands spanning several different jobs:
15
+ `car` is one binary with 73 subcommands spanning several different jobs:
16
16
  running the built-in agent, coding, local model management, OS integrations,
17
17
  and installing other people's agents on your machine. This map groups the
18
18
  commands people actually reach for; the full alphabetical reference with every
@@ -162,7 +162,7 @@ commands on a cadence via launchd / cron / schtasks).
162
162
 
163
163
  | Command | Description |
164
164
  |---|---|
165
- | [`car info`](#car-info) | Show runtime info |
165
+ | [`car info`](#car-info) | Show runtime and live machine state |
166
166
  | [`car capabilities`](#car-capabilities) | Print the deterministic CAR capability manifest |
167
167
  | [`car ui`](#car-ui) | Open the browser dashboard served by the daemon |
168
168
  | [`car verify`](#car-verify) | Statically verify a proposal |
@@ -171,9 +171,11 @@ commands on a cadence via launchd / cron / schtasks).
171
171
  | [`car replay`](#car-replay) | Replay an event journal and show reconstructed state |
172
172
  | [`car run-cancel`](#car-run-cancel) | Cancel one active CAR run and print its deterministic durable receipt |
173
173
  | [`car run-task`](#car-run-task) | Run a goal autonomously against stdio MCP tool servers, emitting a JSONL transcript. Headless entry point for external eval harnesses |
174
+ | [`car tools`](#car-tools) | Invoke CAR's built-in runtime tools directly, in-process and without a daemon |
174
175
  | [`car code-task`](#car-code-task) | Run a coder session headlessly and IN THIS PROCESS: derive or accept an outcome contract, work in a git worktree until the runtime's own re-run of that contract is green, then deliver the result as a pull request |
175
176
  | [`car coder-ab`](#car-coder-ab) | A/B-test CAR's coder against an external agent (Codex / Claude Code) over a corpus, and grow that corpus from git history — the productionized dogfooding loop (docs/proposals/coder-ab-dogfood.md) |
176
177
  | [`car keys`](#car-keys) | Store cloud-provider API keys in the OS keychain, so a native-app user never sets an environment variable (docs/proposals/native-secrets-no-env.md). The key is read env-first, keychain-fallback by the runtime |
178
+ | [`car heal`](#car-heal) | Inspect and operate the daemon's self-healing REPAIR loop: it reads a configured issue tracker, runs a coder session, gates the result on a multi-model panel, and opens a pull request. It never merges |
177
179
  | [`car selfheal`](#car-selfheal) | Inspect and operate the daemon's deterministic self-healing detector |
178
180
  | [`car daemon`](#car-daemon) | Start the daemon server (delegates to car-server binary) |
179
181
  | [`car models`](#car-models) | Manage local inference models |
@@ -189,6 +191,7 @@ commands on a cadence via launchd / cron / schtasks).
189
191
  | [`car identity`](#car-identity) | Show or change the name your assistant answers to — in conversation, in the host apps, and as its voice wake word |
190
192
  | [`car init`](#car-init) | Initialize a .car/ project directory for team-shared configuration |
191
193
  | [`car doctor`](#car-doctor) | Diagnose (and optionally repair) a CAR install: corrupt model weights, unparseable `~/.car` state files, version skew, and leftover files from a previous install. Runs entirely against the local filesystem — no daemon required, so it works even when `car-server` won't start |
194
+ | [`car feedback`](#car-feedback) | Report a problem to Parslee. Captures a redacted diagnostic bundle (your description, the `car doctor` report, bounded log tails, and a version stamp) into the local outbox at `~/.car/feedback-outbox` — nothing is uploaded by this command; queued reports send when CAR can reach Parslee. Works with the daemon down, like `car doctor`. macOS-only in this release |
192
195
  | [`car update`](#car-update) | Update the locally-installed `car` CLI and its sibling `car-server` daemon to the latest release (or `--version <X.Y.Z>`), in place — regardless of how they were installed. Reconciles the drift that otherwise builds up when one channel updates and another doesn't (e.g. CarHost.app auto-updates its bundled daemon via Sparkle but leaves the `/usr/local/bin/car` CLI behind). The npm/PyPI `car-runtime` client packages are separate — this command never touches them; `car doctor` reports which of your agents have drifted, and prints the exact command per environment. Both remedies pin: `npm install car-runtime@<version>` (`npm update` CANNOT cross a 0.x minor — npm reads `^0.41.0` as `>=0.41.0 <0.42.0`, so it is a no-op) and `<venv>/bin/python -m pip install -U car-runtime==<version>` (a bare `-U` can be silently defeated by the consumer's own pin, and the wrong interpreter installs into an environment that does not hold the stale wheel) |
193
196
  | [`car purge`](#car-purge) | Remove this CAR install's own state under `~/.car` (config, logs, managed models, binaries) and reap any OS-level schedules CAR installed — for a clean slate before a reinstall. On macOS this also clears CarHost.app's user-level state and resets its privacy (TCC) permissions, so a reinstall really does re-run permission onboarding. NEVER touches the shared HuggingFace model cache (other tools use it); managed models are symlinks into it, so only the links are removed, not the multi-GB blobs. (To uninstall a single contributed agent instead, use `car uninstall <id>`.) |
194
197
  | [`car code`](#car-code) | Built-in coding agent: state an intent, confirm the verifiable outcome contract, and CAR delivers it in an isolated git worktree — natively or via an installed frontier CLI. Results land on a `car/coder/<id>` branch after your approval; your checkout is never touched |
@@ -229,6 +232,7 @@ commands on a cadence via launchd / cron / schtasks).
229
232
  | [`car uninstall`](#car-uninstall) | Uninstall a contributed agent (Parslee-ai/car#182 phase 4). Stops the running child if any, removes the manifest from `~/.car/agents/<id>/`, and reaps the legacy `agents.json` entry. Idempotent |
230
233
  | [`car schedule`](#car-schedule) | Schedule commands to run on a cadence (launchd / cron / schtasks) |
231
234
  | [`car registry`](#car-registry) | Registry tooling for the contributed-agents registry (Parslee-ai/car#182 phase 5): `digest` a manifest, or `validate` a registry directory (the CI gate run by Parslee-ai/car-agent-registry) |
235
+ | [`car fleet`](#car-fleet) | What every CAR instance you can reach can do — agents, capabilities and models across the fleet — and whether this machine takes coding subtasks farmed out by peers (`car fleet enroll`). Needs a running daemon |
232
236
  | [`car publish`](#car-publish) | Publish a contributed agent to the registry (Parslee-ai/car#182 phase 5). Reads a local agent's `manifest.toml`, signs it for `--audience public` (ed25519 key at `$CAR_PUBLISH_KEY_PATH`), stages it at the versioned `agents/<namespace>/<name>/<version>/` path, updates `index.json` + the README catalog, re-runs the EXACT `car registry validate` CI gate locally, and opens a PR against the registry repo. Aborts (no PR) on a missing signing key or a validation failure |
233
237
  | [`car help`](#car-help) | Print this message or the help of the given subcommand(s) |
234
238
 
@@ -241,11 +245,12 @@ Full `--help` output for every command, generated directly from the binary.
241
245
  ### car info
242
246
 
243
247
  ```text
244
- Show runtime info
248
+ Show runtime and live machine state
245
249
 
246
- Usage: car info
250
+ Usage: car info [OPTIONS]
247
251
 
248
252
  Options:
253
+ --json Emit machine-readable JSON
249
254
  -h, --help Print help
250
255
  ```
251
256
 
@@ -257,9 +262,11 @@ Print the deterministic CAR capability manifest
257
262
  Usage: car capabilities [OPTIONS]
258
263
 
259
264
  Options:
260
- --json Emit machine-readable JSON
261
- --md Emit generated Markdown (the default)
262
- -h, --help Print help
265
+ --json Emit machine-readable JSON
266
+ --md Emit generated Markdown (the default)
267
+ --role <ROLE> Print exactly the daemon method names assigned to this caller role [possible
268
+ values: agent, owner, operator, host]
269
+ -h, --help Print help
263
270
  ```
264
271
 
265
272
  ### car ui
@@ -373,6 +380,37 @@ Options:
373
380
  -h, --help Print help
374
381
  ```
375
382
 
383
+ ### car tools
384
+
385
+ ```text
386
+ Invoke CAR's built-in runtime tools directly, in-process and without a daemon
387
+
388
+ Usage: car tools <COMMAND>
389
+
390
+ Commands:
391
+ call Invoke one CAR built-in tool in this process; no daemon is contacted
392
+ help Print this message or the help of the given subcommand(s)
393
+
394
+ Options:
395
+ -h, --help Print help
396
+ ```
397
+
398
+ #### car tools call
399
+
400
+ ```text
401
+ Invoke one CAR built-in tool in this process; no daemon is contacted
402
+
403
+ Usage: car tools call [OPTIONS] <TOOL>
404
+
405
+ Arguments:
406
+ <TOOL> Built-in tool name (for example: calculate, read_file, or grep_files)
407
+
408
+ Options:
409
+ --params-file <PATH> Read the tool's JSON parameter object from this file
410
+ --params <JSON> Supply the tool's JSON parameter object inline
411
+ -h, --help Print help
412
+ ```
413
+
376
414
  ### car code-task
377
415
 
378
416
  ```text
@@ -404,6 +442,9 @@ Options:
404
442
  --pr-base <PR_BASE>
405
443
  PR base branch. Defaults to the repo's default branch
406
444
 
445
+ --body-prefix <BODY_PREFIX>
446
+ Trusted caller-supplied text placed at the start of the pull-request body
447
+
407
448
  --draft
408
449
  Open the pull request as a draft
409
450
 
@@ -421,6 +462,10 @@ Options:
421
462
  --max-iterations <MAX_ITERATIONS>
422
463
  Override the coder config's iteration ceiling (default 8)
423
464
 
465
+ --browser
466
+ Expose the assistant's browser tools for this run. Off by default; calls remain
467
+ policy-gated and appear in the JSONL event stream
468
+
424
469
  --max-session-wall-secs <MAX_SESSION_WALL_SECS>
425
470
  Override the coder config's session wall clock (default 3600). 0 = unlimited
426
471
 
@@ -648,6 +693,54 @@ Options:
648
693
  -h, --help Print help
649
694
  ```
650
695
 
696
+ ### car heal
697
+
698
+ ```text
699
+ Inspect and operate the daemon's self-healing REPAIR loop: it reads a configured issue tracker, runs
700
+ a coder session, gates the result on a multi-model panel, and opens a pull request. It never merges.
701
+
702
+ Configured in `<CAR_HOME>/heal.toml`; off by default, and an issue must carry an explicit opt-in
703
+ label. See `car selfheal` for the separate watch-only detector, which never writes.
704
+
705
+ Usage: car heal <COMMAND>
706
+
707
+ Commands:
708
+ status Show whether the loop is enabled — and if not, why — plus its targets, review panel, and
709
+ engine
710
+ run Run one sweep now instead of waiting for the cadence
711
+ help Print this message or the help of the given subcommand(s)
712
+
713
+ Options:
714
+ -h, --help
715
+ Print help (see a summary with '-h')
716
+ ```
717
+
718
+ #### car heal status
719
+
720
+ ```text
721
+ Show whether the loop is enabled — and if not, why — plus its targets, review panel, and engine
722
+
723
+ Usage: car heal status
724
+
725
+ Options:
726
+ -h, --help Print help
727
+ ```
728
+
729
+ #### car heal run
730
+
731
+ ```text
732
+ Run one sweep now instead of waiting for the cadence.
733
+
734
+ At most one item per configured target. This can run a real coder session and open a real pull
735
+ request. It never merges.
736
+
737
+ Usage: car heal run
738
+
739
+ Options:
740
+ -h, --help
741
+ Print help (see a summary with '-h')
742
+ ```
743
+
651
744
  ### car selfheal
652
745
 
653
746
  ```text
@@ -660,7 +753,8 @@ Commands:
660
753
  list List active detections, optionally filtered by kind, severity, or time
661
754
  show Print the trusted local issue document for one detection
662
755
  dismiss Dismiss one active detection by dedup key
663
- run Run one deterministic detection tick now
756
+ fix Start one bounded coder round for an eligible recurring-tool key
757
+ run Run one deterministic detection tick and its auto-fix cadence hook now
664
758
  help Print this message or the help of the given subcommand(s)
665
759
 
666
760
  Options:
@@ -721,10 +815,24 @@ Options:
721
815
  -h, --help Print help
722
816
  ```
723
817
 
818
+ #### car selfheal fix
819
+
820
+ ```text
821
+ Start one bounded coder round for an eligible recurring-tool key
822
+
823
+ Usage: car selfheal fix <DEDUP_KEY>
824
+
825
+ Arguments:
826
+ <DEDUP_KEY> Detection SHA-256 dedup key
827
+
828
+ Options:
829
+ -h, --help Print help
830
+ ```
831
+
724
832
  #### car selfheal run
725
833
 
726
834
  ```text
727
- Run one deterministic detection tick now
835
+ Run one deterministic detection tick and its auto-fix cadence hook now
728
836
 
729
837
  Usage: car selfheal run
730
838
 
@@ -788,6 +896,8 @@ Options:
788
896
  -c, --capability <CAPABILITY> Filter by capability (generate, embed, code, reasoning, etc.)
789
897
  --provider <PROVIDER> Filter by provider (e.g., openai, qwen, google, vllm-mlx)
790
898
  --local-only Only show local models
899
+ --all Show every row, including models that do not fit this machine and
900
+ deprecated ones (hidden by default), with a FIT column explaining why
791
901
  -h, --help Print help
792
902
  ```
793
903
 
@@ -1392,6 +1502,25 @@ Options:
1392
1502
  -h, --help Print help
1393
1503
  ```
1394
1504
 
1505
+ ### car feedback
1506
+
1507
+ ```text
1508
+ Report a problem to Parslee. Captures a redacted diagnostic bundle (your description, the `car
1509
+ doctor` report, bounded log tails, and a version stamp) into the local outbox at
1510
+ `~/.car/feedback-outbox` — nothing is uploaded by this command; queued reports send when CAR can
1511
+ reach Parslee. Works with the daemon down, like `car doctor`. macOS-only in this release
1512
+
1513
+ Usage: car feedback [OPTIONS]
1514
+
1515
+ Options:
1516
+ --description <DESCRIPTION> What went wrong (10–5000 characters). Prompts when omitted
1517
+ --list List your saved reports and their status in plain language
1518
+ --show <ID> Print exactly what a saved report will send (its redacted bundle)
1519
+ --export <ID|latest> <PATH> Save a report's redacted bundle to a file: `--export <ID|latest>
1520
+ <PATH>`
1521
+ -h, --help Print help
1522
+ ```
1523
+
1395
1524
  ### car update
1396
1525
 
1397
1526
  ```text
@@ -1449,26 +1578,49 @@ in an isolated git worktree — natively or via an installed frontier CLI. Resul
1449
1578
  Usage: car code [OPTIONS] [INTENT]...
1450
1579
 
1451
1580
  Arguments:
1452
- [INTENT]... What to build or fix, in plain English
1581
+ [INTENT]...
1582
+ What to build or fix, in plain English
1453
1583
 
1454
1584
  Options:
1455
1585
  --repo <REPO>
1456
1586
  Repository to work on. Relative paths (`.`, `../sibling`) resolve against your current
1457
1587
  directory (default: `.`)
1588
+
1458
1589
  --engine <ENGINE>
1459
- Engine: auto | native | external[:agent_id] | foreman[:agent_id]. Foreman farms subtasks
1460
- to the external CLI in parallel worktrees behind a merge-verify gate; auto prefers it for
1461
- broad tasks
1590
+ Engine: `auto` | `native` | `external[:agent_id]` | `foreman[:agent_id]`. Foreman farms
1591
+ subtasks to the external CLI in parallel worktrees behind a merge-verify gate; auto
1592
+ prefers it for broad tasks
1593
+
1594
+ --distributed
1595
+ Spread a foreman run's subtasks across reachable CAR instances instead of this machine
1596
+ alone.
1597
+
1598
+ **Spends agent quota — on other machines too.** The merge-verify gate and delivery stay
1599
+ here: a peer returns a patch, this host gates it, so the run still ends in a pull request
1600
+ you approve. Requires `--engine foreman[:agent_id]`; any other engine runs locally and
1601
+ says so. See `car fleet peers` for who is reachable.
1602
+
1603
+ --worker <WORKERS>
1604
+ Restrict a distributed run to these instances. Repeatable; default is every instance that
1605
+ can serve this repository
1606
+
1462
1607
  -y, --yes
1463
1608
  Skip the interactive contract and merge prompts
1609
+
1464
1610
  --max-iterations <MAX_ITERATIONS>
1465
1611
  Max plan→edit→verify iterations before giving up
1612
+
1466
1613
  --model <MODEL>
1467
1614
  Pin the native loop's inference model for this session (e.g. `parslee/reasoning` for
1468
1615
  gpt-5.5), overriding `~/.car/coder.toml`. Blank/omitted keeps the config default, then
1469
1616
  adaptive routing
1617
+
1618
+ --browser
1619
+ Expose the assistant's browser tools to this coder session. Off by default; calls remain
1620
+ policy-gated and recorded in coder events
1621
+
1470
1622
  -h, --help
1471
- Print help
1623
+ Print help (see a summary with '-h')
1472
1624
  ```
1473
1625
 
1474
1626
  ### car board
@@ -1726,6 +1878,7 @@ Commands:
1726
1878
  in-daemon
1727
1879
  run Run a registered agent on an input
1728
1880
  list List registered in-daemon agents
1881
+ where Show where a declarative or supervised agent's files live
1729
1882
  external Show installed external agentic CLIs (Claude Code, Codex, Gemini): which binary each
1730
1883
  resolved to, and whether it can actually run
1731
1884
  help Print this message or the help of the given subcommand(s)
@@ -1737,16 +1890,29 @@ Options:
1737
1890
  #### car agent new
1738
1891
 
1739
1892
  ```text
1740
- Describe an agent in plain language; CAR builds, verifies, and registers it to run in-daemon
1893
+ Describe an agent in plain language; CAR builds, verifies, and registers it to run in-daemon.
1894
+
1895
+ CAR uses the complete description to generate the agent's identity, standing goal, and scenarios.
1896
+ Long descriptions get a bounded project directory name without truncating that build input.
1897
+
1898
+ The project's agent.json is committed build output. After approval, the daemon runs the separately
1899
+ registered copy in declagents.json; editing agent.json alone does not update the active agent.
1741
1900
 
1742
1901
  Usage: car agent new [OPTIONS] [DESCRIPTION]...
1743
1902
 
1744
1903
  Arguments:
1745
- [DESCRIPTION]... What the agent should do
1904
+ [DESCRIPTION]...
1905
+ What the agent should do
1746
1906
 
1747
1907
  Options:
1748
- -y, --yes Skip the interactive confirm/approve prompts
1749
- -h, --help Print help
1908
+ -y, --yes
1909
+ Skip the interactive confirm/approve prompts
1910
+
1911
+ --json
1912
+ Emit one JSON object; requires --yes so prompts do not share stdout
1913
+
1914
+ -h, --help
1915
+ Print help (see a summary with '-h')
1750
1916
  ```
1751
1917
 
1752
1918
  #### car agent run
@@ -1775,6 +1941,21 @@ Options:
1775
1941
  -h, --help Print help
1776
1942
  ```
1777
1943
 
1944
+ #### car agent where
1945
+
1946
+ ```text
1947
+ Show where a declarative or supervised agent's files live
1948
+
1949
+ Usage: car agent where [OPTIONS] <ID>
1950
+
1951
+ Arguments:
1952
+ <ID> The declarative or supervised agent id
1953
+
1954
+ Options:
1955
+ --json Emit a JSON object instead of labeled lines
1956
+ -h, --help Print help
1957
+ ```
1958
+
1778
1959
  #### car agent external
1779
1960
 
1780
1961
  ```text
@@ -1810,7 +1991,7 @@ Arguments:
1810
1991
 
1811
1992
  Options:
1812
1993
  -o, --output <OUTPUT>
1813
- Where to write the workflow JSON (default: ~/.car/workflows/<id>.json)
1994
+ Where to write the workflow JSON (default: `~/.car/workflows/<id>.json`)
1814
1995
 
1815
1996
  -u, --update <UPDATE>
1816
1997
  Update this existing workflow file instead of creating a new one
@@ -2607,6 +2788,7 @@ Usage: car messages <COMMAND>
2607
2788
  Commands:
2608
2789
  services List Messages.app services/accounts
2609
2790
  chats List recent Messages.app chats
2791
+ read Read Messages.app conversation rows, newest first
2610
2792
  send Send a message. JSON payload on stdin matching Messages SendRequest
2611
2793
  help Print this message or the help of the given subcommand(s)
2612
2794
 
@@ -2637,6 +2819,21 @@ Options:
2637
2819
  -h, --help Print help
2638
2820
  ```
2639
2821
 
2822
+ #### car messages read
2823
+
2824
+ ```text
2825
+ Read Messages.app conversation rows, newest first
2826
+
2827
+ Usage: car messages read [OPTIONS]
2828
+
2829
+ Options:
2830
+ --chats <CHATS> Optional comma-separated chat GUIDs from `car messages chats`
2831
+ --since <SINCE> Only messages at or after this RFC3339 instant
2832
+ --limit <LIMIT> [default: 50]
2833
+ --include-body Include decoded message bodies inline (bounded per message)
2834
+ -h, --help Print help
2835
+ ```
2836
+
2640
2837
  #### car messages send
2641
2838
 
2642
2839
  ```text
@@ -3214,6 +3411,154 @@ Options:
3214
3411
  -h, --help Print help
3215
3412
  ```
3216
3413
 
3414
+ ### car fleet
3415
+
3416
+ ```text
3417
+ What every CAR instance you can reach can do — agents, capabilities and models across the fleet —
3418
+ and whether this machine takes coding subtasks farmed out by peers (`car fleet enroll`). Needs a
3419
+ running daemon
3420
+
3421
+ Usage: car fleet <COMMAND>
3422
+
3423
+ Commands:
3424
+ show Every agent, capability, and model across this daemon and every CAR instance it can
3425
+ reach
3426
+ worker Show whether this machine takes coding subtasks farmed out by peers
3427
+ enroll Enroll this machine as a fleet worker for the named repositories
3428
+ withdraw Stop taking work from peers. Keeps the repository list for next time
3429
+ run Run one coding goal across the fleet: decompose it, place the independent subtasks on
3430
+ the instances that have this repository, and gate the reassembly **here**
3431
+ help Print this message or the help of the given subcommand(s)
3432
+
3433
+ Options:
3434
+ -h, --help Print help
3435
+ ```
3436
+
3437
+ #### car fleet show
3438
+
3439
+ ```text
3440
+ Every agent, capability, and model across this daemon and every CAR instance it can reach
3441
+
3442
+ Usage: car fleet show [OPTIONS]
3443
+
3444
+ Options:
3445
+ --json Print the raw `FleetComposite` JSON instead of the summary
3446
+ --local Only this instance — skip the network entirely
3447
+ --timeout-ms <TIMEOUT_MS> Per-peer deadline in milliseconds (default 10000)
3448
+ -h, --help Print help
3449
+ ```
3450
+
3451
+ #### car fleet worker
3452
+
3453
+ ```text
3454
+ Show whether this machine takes coding subtasks farmed out by peers
3455
+
3456
+ Usage: car fleet worker
3457
+
3458
+ Options:
3459
+ -h, --help Print help
3460
+ ```
3461
+
3462
+ #### car fleet enroll
3463
+
3464
+ ```text
3465
+ Enroll this machine as a fleet worker for the named repositories.
3466
+
3467
+ A real grant: a trusted peer may then run a coding CLI against those checkouts. Peers are already
3468
+ limited to CAR daemons whose key this host trusts, every dispatch is audited in
3469
+ `~/.car/fleet-work.jsonl`, and a dispatch for any other repository is declined.
3470
+
3471
+ Usage: car fleet enroll [OPTIONS] --repo <REPOS>
3472
+
3473
+ Options:
3474
+ --repo <REPOS>
3475
+ Repository checkout to serve. Repeatable; replaces the current list
3476
+
3477
+ --max-parallel <MAX_PARALLEL>
3478
+ Subtasks peers may run here at once (default 2). Concurrency, not spend — see
3479
+ `--dispatches-per-hour` for the budget
3480
+
3481
+ --dispatches-per-hour <DISPATCHES_PER_HOUR>
3482
+ Subtasks ONE peer may start here per hour (default 60). A peer that dispatches serially
3483
+ never hits `--max-parallel` and can still drain this machine's coding-CLI quota; this is
3484
+ what stops that
3485
+
3486
+ --max-subtask-secs <MAX_SUBTASK_SECS>
3487
+ Longest a peer's subtask may occupy this machine (default 1800s). The sender proposes a
3488
+ timeout; this is the ceiling it is clamped to
3489
+
3490
+ --allow-tool <ALLOWED_TOOLS>
3491
+ Tools a peer's coding CLI may use here, intersected with whatever the dispatch asks for.
3492
+ Repeatable. Unset adds no restriction
3493
+
3494
+ --runner
3495
+ Enroll as a **runner**: a machine that is not a person's desk.
3496
+
3497
+ Instead of declining a base commit it does not hold, it fetches from its own remote and
3498
+ serves the subtask. That is what makes a pool useful — a runner tracking `origin` always
3499
+ has the commit, where a laptop on an unpushed branch declines every dispatch. Off for a
3500
+ laptop, where a peer should not cause a fetch in a repository someone is working in.
3501
+
3502
+ --fetch-remote <FETCH_REMOTE>
3503
+ Remote a runner fetches from. Defaults to `origin`
3504
+
3505
+ -h, --help
3506
+ Print help (see a summary with '-h')
3507
+ ```
3508
+
3509
+ #### car fleet withdraw
3510
+
3511
+ ```text
3512
+ Stop taking work from peers. Keeps the repository list for next time
3513
+
3514
+ Usage: car fleet withdraw
3515
+
3516
+ Options:
3517
+ -h, --help Print help
3518
+ ```
3519
+
3520
+ #### car fleet run
3521
+
3522
+ ```text
3523
+ Run one coding goal across the fleet: decompose it, place the independent subtasks on the instances
3524
+ that have this repository, and gate the reassembly **here**.
3525
+
3526
+ Peers edit their own worktrees and return patches; this machine applies them and runs the
3527
+ merge-verify gate, so a peer can never widen what gets accepted. This machine is always in the pool,
3528
+ so a run whose peers all decline still completes. **Spends agent quota — on other machines too.**
3529
+
3530
+ Usage: car fleet run [OPTIONS] <GOAL>
3531
+
3532
+ Arguments:
3533
+ <GOAL>
3534
+ What to build
3535
+
3536
+ Options:
3537
+ --repo <REPO>
3538
+ Repository to work in. Defaults to the daemon's working directory
3539
+
3540
+ --adapter <ADAPTER>
3541
+ Coding CLI to ask for (`claude-code`, `codex`, `gemini`)
3542
+
3543
+ --verify <VERIFY>
3544
+ Per-subtask regression check — "does this one change still build?". A goal-level test
3545
+ belongs on `--union-verify`, not here: a subtask implements only part of the goal, so a
3546
+ goal test would reject every one of them
3547
+
3548
+ --union-verify <UNION_VERIFY>
3549
+ Check the *integrated* result must pass. Falls back to `--verify`
3550
+
3551
+ --worker <WORKERS>
3552
+ Restrict placement to these instances. Repeatable; default is every instance that reports
3553
+ it can serve this repository
3554
+
3555
+ --json
3556
+ Print the raw run report JSON
3557
+
3558
+ -h, --help
3559
+ Print help (see a summary with '-h')
3560
+ ```
3561
+
3217
3562
  ### car publish
3218
3563
 
3219
3564
  ```text
@@ -168,6 +168,24 @@ Snake-case enum. What happens when this action's tool returns an error or a prec
168
168
  | `"retry"` | retry up to `max_retries` times before aborting |
169
169
  | `"skip"` | mark this action skipped and continue with the rest |
170
170
 
171
+ ### Tool failure classification
172
+
173
+ A tool executor may return a typed `ToolFailure` with classification
174
+ `"ordinary"` or `"terminal"`. This is evidence produced by the tool during
175
+ execution, not a fourth `FailureBehavior`:
176
+
177
+ - `"ordinary"` follows the action's declared failure behavior. Existing string
178
+ errors convert to this classification, so legacy errors keep their current
179
+ retry, skip, or abort behavior.
180
+ - `"terminal"` stops retrying immediately and aborts and rolls back the
181
+ proposal regardless of its declared failure behavior. The failed
182
+ `ActionResult` carries `"terminal": true`; the field is absent for all other
183
+ results and defaults to false when deserializing older results.
184
+
185
+ Terminality is strictly opt-in. CAR never infers it from words such as
186
+ "terminal" or "fatal" in an error message. This engine-level contract does not
187
+ halt a daemon session; session halting is a separate daemon-owned layer.
188
+
171
189
  ### Action lifecycle (informational)
172
190
 
173
191
  The runtime tags each action with an `ActionStatus` as it moves through validation and execution:
@@ -333,12 +351,10 @@ Returned by `proposal.submit` (WebSocket), `executeProposal` (NAPI), `execute_pr
333
351
  {
334
352
  "action_id": "a1",
335
353
  "status": "succeeded",
354
+ "rolled_back": true,
336
355
  "output": { "deployed": true },
337
- "error": null,
338
- "state_changes": {
339
- "deployed": { "op": "set", "value": true },
340
- "obsolete_key": { "op": "delete" }
341
- },
356
+ "error": "proposal aborted; state effects were rolled back; external effects may remain and were not undone",
357
+ "state_changes": {},
342
358
  "duration_ms": 1230.0,
343
359
  "timestamp": "2026-05-02T12:00:01Z"
344
360
  }
@@ -349,6 +365,19 @@ Returned by `proposal.submit` (WebSocket), `executeProposal` (NAPI), `execute_pr
349
365
 
350
366
  `status` is one of: `"proposed"`, `"validated"`, `"rejected"`, `"executing"`, `"succeeded"`, `"failed"`, `"skipped"`.
351
367
 
368
+ A failed action includes `"terminal": true` only when its tool returned
369
+ `ToolFailureClassification::Terminal`. The field is omitted otherwise. A
370
+ terminal result means the engine stopped retries and aborted this proposal; it
371
+ does not by itself describe daemon session state.
372
+
373
+ `rolled_back` is an independent commit marker. A successful action in an
374
+ aborted proposal remains `status: "succeeded"` because it executed, while
375
+ `rolled_back: true` reports that the enclosing state transaction was restored.
376
+ Its `state_changes` are empty and `error` may carry the warning that external
377
+ effects can remain. Consumers must use `rolled_back`, never compare that warning
378
+ text. The field defaults to `false` when absent and false values are omitted from
379
+ the serialized response for compatibility with older readers.
380
+
352
381
  Each `state_changes` value is a tagged `StateMutation`: `{"op":"set","value":…}`
353
382
  sets the key (including explicitly setting it to JSON `null`), while
354
383
  `{"op":"delete"}` removes it. Rust consumers can encode and decode that stable