car-runtime 0.52.0 → 0.53.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.51.0 (2026-09-03). Every subcommand the installed binary reports is
5
+ > 0.52.1 (2026-09-06). 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
- > 66 top-level commands, 98 nested subcommands
9
+ > 69 top-level commands, 106 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 66 subcommands spanning several different jobs:
15
+ `car` is one binary with 69 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
@@ -163,15 +163,18 @@ commands on a cadence via launchd / cron / schtasks).
163
163
  | Command | Description |
164
164
  |---|---|
165
165
  | [`car info`](#car-info) | Show runtime info |
166
+ | [`car capabilities`](#car-capabilities) | Print the deterministic CAR capability manifest |
166
167
  | [`car ui`](#car-ui) | Open the browser dashboard served by the daemon |
167
168
  | [`car verify`](#car-verify) | Statically verify a proposal |
168
169
  | [`car simulate`](#car-simulate) | Simulate a proposal's state effects without executing |
169
170
  | [`car optimize`](#car-optimize) | Optimize a proposal (remove phantom dependencies) |
170
171
  | [`car replay`](#car-replay) | Replay an event journal and show reconstructed state |
172
+ | [`car run-cancel`](#car-run-cancel) | Cancel one active CAR run and print its deterministic durable receipt |
171
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 |
172
174
  | [`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 |
173
175
  | [`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) |
174
176
  | [`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 |
177
+ | [`car selfheal`](#car-selfheal) | Inspect and operate the daemon's deterministic self-healing detector |
175
178
  | [`car daemon`](#car-daemon) | Start the daemon server (delegates to car-server binary) |
176
179
  | [`car models`](#car-models) | Manage local inference models |
177
180
  | [`car setup`](#car-setup) | Set up the right model for this machine — detect hardware, recommend, and install. Run with no flags for an interactive walkthrough |
@@ -246,6 +249,19 @@ Options:
246
249
  -h, --help Print help
247
250
  ```
248
251
 
252
+ ### car capabilities
253
+
254
+ ```text
255
+ Print the deterministic CAR capability manifest
256
+
257
+ Usage: car capabilities [OPTIONS]
258
+
259
+ Options:
260
+ --json Emit machine-readable JSON
261
+ --md Emit generated Markdown (the default)
262
+ -h, --help Print help
263
+ ```
264
+
249
265
  ### car ui
250
266
 
251
267
  ```text
@@ -317,6 +333,23 @@ Options:
317
333
  -h, --help Print help
318
334
  ```
319
335
 
336
+ ### car run-cancel
337
+
338
+ ```text
339
+ Cancel one active CAR run and print its deterministic durable receipt
340
+
341
+ Usage: car run-cancel [OPTIONS] --run-id <RUN_ID> --idempotency-key <IDEMPOTENCY_KEY> --reason
342
+ <REASON>
343
+
344
+ Options:
345
+ --run-id <RUN_ID>
346
+ --idempotency-key <IDEMPOTENCY_KEY>
347
+ --reason <REASON>
348
+ --url <URL> [default: ws://127.0.0.1:9100/]
349
+ --json
350
+ -h, --help Print help
351
+ ```
352
+
320
353
  ### car run-task
321
354
 
322
355
  ```text
@@ -509,7 +542,7 @@ Usage: car coder-ab extract [OPTIONS] --out <OUT>
509
542
  Options:
510
543
  --repo <REPO>
511
544
  Repo to mine (default: current dir)
512
-
545
+
513
546
  [default: .]
514
547
 
515
548
  --out <OUT>
@@ -520,7 +553,7 @@ Options:
520
553
  rather than `python3 -m pytest -q`: `python3` does not exist on a standard Windows
521
554
  python.org install, and `python` is often absent on macOS/Linux — pytest's console script
522
555
  is the portable spelling
523
-
556
+
524
557
  [default: "pytest -q"]
525
558
 
526
559
  --path <PATH>
@@ -528,12 +561,12 @@ Options:
528
561
 
529
562
  --max <MAX>
530
563
  Limit to this many recent commits scanned
531
-
564
+
532
565
  [default: 50]
533
566
 
534
567
  --max-files <MAX_FILES>
535
568
  Skip a commit whose changed-file count exceeds this (keep tasks small)
536
-
569
+
537
570
  [default: 6]
538
571
 
539
572
  --full-tree
@@ -543,7 +576,7 @@ Options:
543
576
 
544
577
  --subject-filter <SUBJECT_FILTER>
545
578
  Keep only commits whose subject contains this substring (e.g. `fix(`).
546
-
579
+
547
580
  On a Rust repo this is close to required: a `feat` commit's test imports a symbol the
548
581
  commit itself adds, so it cannot compile at the pre-fix parent. Such tasks are rejected
549
582
  anyway, but only after a full tree materialize + build, which costs 30-200s each.
@@ -583,8 +616,8 @@ from stdin (keeps it out of shell history)
583
616
  Usage: car keys set <NAME> [VALUE]
584
617
 
585
618
  Arguments:
586
- <NAME>
587
- [VALUE]
619
+ <NAME>
620
+ [VALUE]
588
621
 
589
622
  Options:
590
623
  -h, --help Print help
@@ -609,7 +642,91 @@ Remove a stored provider key from the keychain
609
642
  Usage: car keys remove <NAME>
610
643
 
611
644
  Arguments:
612
- <NAME>
645
+ <NAME>
646
+
647
+ Options:
648
+ -h, --help Print help
649
+ ```
650
+
651
+ ### car selfheal
652
+
653
+ ```text
654
+ Inspect and operate the daemon's deterministic self-healing detector
655
+
656
+ Usage: car selfheal <COMMAND>
657
+
658
+ Commands:
659
+ status Show cadence, active counts, and the route resolved by the last tick
660
+ list List active detections, optionally filtered by kind, severity, or time
661
+ show Print the trusted local issue document for one detection
662
+ dismiss Dismiss one active detection by dedup key
663
+ run Run one deterministic detection tick now
664
+ help Print this message or the help of the given subcommand(s)
665
+
666
+ Options:
667
+ -h, --help Print help
668
+ ```
669
+
670
+ #### car selfheal status
671
+
672
+ ```text
673
+ Show cadence, active counts, and the route resolved by the last tick
674
+
675
+ Usage: car selfheal status
676
+
677
+ Options:
678
+ -h, --help Print help
679
+ ```
680
+
681
+ #### car selfheal list
682
+
683
+ ```text
684
+ List active detections, optionally filtered by kind, severity, or time
685
+
686
+ Usage: car selfheal list [OPTIONS]
687
+
688
+ Options:
689
+ --kind <KIND> Detection kind (metrics_alert, agent_gave_up, agent_log_error,
690
+ agent_silently_idle, recurring_tool_failure, capability_miss)
691
+ --severity <SEVERITY> Severity (warning or critical)
692
+ --since <SINCE> Only detections observed at or after this RFC3339 timestamp
693
+ -h, --help Print help
694
+ ```
695
+
696
+ #### car selfheal show
697
+
698
+ ```text
699
+ Print the trusted local issue document for one detection
700
+
701
+ Usage: car selfheal show <DEDUP_KEY>
702
+
703
+ Arguments:
704
+ <DEDUP_KEY> Detection SHA-256 dedup key
705
+
706
+ Options:
707
+ -h, --help Print help
708
+ ```
709
+
710
+ #### car selfheal dismiss
711
+
712
+ ```text
713
+ Dismiss one active detection by dedup key
714
+
715
+ Usage: car selfheal dismiss <DEDUP_KEY>
716
+
717
+ Arguments:
718
+ <DEDUP_KEY> Detection SHA-256 dedup key
719
+
720
+ Options:
721
+ -h, --help Print help
722
+ ```
723
+
724
+ #### car selfheal run
725
+
726
+ ```text
727
+ Run one deterministic detection tick now
728
+
729
+ Usage: car selfheal run
613
730
 
614
731
  Options:
615
732
  -h, --help Print help
@@ -724,7 +841,7 @@ Evaluate one local model without downloading or loading it
724
841
  Usage: car models preflight [OPTIONS] <MODEL_ID>
725
842
 
726
843
  Arguments:
727
- <MODEL_ID>
844
+ <MODEL_ID>
728
845
 
729
846
  Options:
730
847
  --context-tokens <CONTEXT_TOKENS> [default: 0]
@@ -739,7 +856,7 @@ Adopt an already-usable local artifact into CAR ownership
739
856
  Usage: car models adopt <MODEL_ID>
740
857
 
741
858
  Arguments:
742
- <MODEL_ID>
859
+ <MODEL_ID>
743
860
 
744
861
  Options:
745
862
  -h, --help Print help
@@ -1410,7 +1527,7 @@ Options:
1410
1527
  Safety cap on agent turns. This is a backstop, not the expected stop: the loop ends on its
1411
1528
  own when the model finishes (stops calling tools). 12 was too low for whole-project builds
1412
1529
  — it cut real work off mid-task; raise it further for large jobs
1413
-
1530
+
1414
1531
  [default: 50]
1415
1532
 
1416
1533
  --until <SHELL>
@@ -1426,7 +1543,7 @@ Options:
1426
1543
  --goal-max-iterations <GOAL_MAX_ITERATIONS>
1427
1544
  In goal mode, the hard cap on re-drive iterations (the governor's turn budget). A hard
1428
1545
  bound, not a soft prose clause
1429
-
1546
+
1430
1547
  [default: 10]
1431
1548
 
1432
1549
  --serve
@@ -1442,6 +1559,45 @@ Options:
1442
1559
  stdout, JSONL progress events on stderr, and no human progress rendering. Needs a goal —
1443
1560
  there is no JSON shape for an interactive REPL. See docs/car-do-json.md
1444
1561
 
1562
+ --response-format <MODE>
1563
+ Constrain the final answer to JSON. Applies to the final answer only; tool turns are
1564
+ unconstrained (a JSON-constrained request suppresses tool use). The loop checks the final
1565
+ answer itself and, if it is not a JSON object, re-asks the model ONCE with no tools and
1566
+ JSON mode on before returning; an answer that already parses costs no extra call.
1567
+ Provider-dependent on that repair turn: OpenAI-protocol and OpenRouter (which forwards it
1568
+ to the upstream provider) enforce it; Anthropic-protocol models reject it. Mutually
1569
+ exclusive with --json-schema. (Unrelated to --json, which shapes car's own output.)
1570
+
1571
+ [possible values: json_object]
1572
+
1573
+ --json-schema <FILE>
1574
+ Constrain the final answer to JSON matching this JSON Schema file. The schema's `title`
1575
+ names it for providers that want one. Applies to the final answer only, with the same
1576
+ one-shot tool-less repair and provider caveats as --response-format; the loop validates
1577
+ the final answer against the schema itself (a valid-JSON answer of the wrong shape is
1578
+ repaired too). Mutually exclusive with --response-format
1579
+
1580
+ --strict-model
1581
+ Use exactly the --model (or CAR_DO_MODEL) named, or fail. Without it `car do` substitutes
1582
+ a usable tool-capable model when the named one is unavailable here (and says so); with it
1583
+ a substitution is a startup error, and the inference layer will not fall back to an
1584
+ on-device model on a remote failure either. Off by default: the substitution is the right
1585
+ call for an interactive run
1586
+
1587
+ --context-window <TOKENS>
1588
+ Bound the running conversation to this many tokens instead of the model's registry window
1589
+ (older middle turns are compacted out to fit, as they are against the real window). Use it
1590
+ to tighten: a value above the model's known window is clamped back down to it, because
1591
+ letting the history overflow the real window is exactly the provider-side truncation
1592
+ compaction exists to prevent
1593
+
1594
+ --max-delegations <N>
1595
+ Run-level cap on `delegate` sub-agent calls. A call past the cap (or past the
1596
+ 300-child-turn budget) returns an error result to the assistant instead of spawning, so a
1597
+ delegating run cannot amplify its model calls without bound
1598
+
1599
+ [default: 20]
1600
+
1445
1601
  -h, --help
1446
1602
  Print help (see a summary with '-h')
1447
1603
  ```
@@ -1664,7 +1820,7 @@ Options:
1664
1820
 
1665
1821
  --max-attempts <MAX_ATTEMPTS>
1666
1822
  Max generate→validate→repair attempts per round
1667
-
1823
+
1668
1824
  [default: 3]
1669
1825
 
1670
1826
  -h, --help
@@ -1765,11 +1921,11 @@ Store a secret. Value is read from --value or piped stdin
1765
1921
  Usage: car secrets put [OPTIONS] <KEY>
1766
1922
 
1767
1923
  Arguments:
1768
- <KEY>
1924
+ <KEY>
1769
1925
 
1770
1926
  Options:
1771
- --service <SERVICE>
1772
- --value <VALUE>
1927
+ --service <SERVICE>
1928
+ --value <VALUE>
1773
1929
  -h, --help Print help
1774
1930
  ```
1775
1931
 
@@ -1781,10 +1937,10 @@ Retrieve a secret — prints the value on stdout
1781
1937
  Usage: car secrets get [OPTIONS] <KEY>
1782
1938
 
1783
1939
  Arguments:
1784
- <KEY>
1940
+ <KEY>
1785
1941
 
1786
1942
  Options:
1787
- --service <SERVICE>
1943
+ --service <SERVICE>
1788
1944
  -h, --help Print help
1789
1945
  ```
1790
1946
 
@@ -1796,10 +1952,10 @@ Delete a secret (idempotent)
1796
1952
  Usage: car secrets delete [OPTIONS] <KEY>
1797
1953
 
1798
1954
  Arguments:
1799
- <KEY>
1955
+ <KEY>
1800
1956
 
1801
1957
  Options:
1802
- --service <SERVICE>
1958
+ --service <SERVICE>
1803
1959
  -h, --help Print help
1804
1960
  ```
1805
1961
 
@@ -1811,10 +1967,10 @@ Check whether a secret exists, without returning the value
1811
1967
  Usage: car secrets status [OPTIONS] <KEY>
1812
1968
 
1813
1969
  Arguments:
1814
- <KEY>
1970
+ <KEY>
1815
1971
 
1816
1972
  Options:
1817
- --service <SERVICE>
1973
+ --service <SERVICE>
1818
1974
  -h, --help Print help
1819
1975
  ```
1820
1976
 
@@ -2004,7 +2160,7 @@ Report current grant state for a domain
2004
2160
  Usage: car permissions status [OPTIONS] <DOMAIN>
2005
2161
 
2006
2162
  Arguments:
2007
- <DOMAIN>
2163
+ <DOMAIN>
2008
2164
 
2009
2165
  Options:
2010
2166
  --target <TARGET> macOS Automation only: bundle ID of the target app to control. Ignored for
@@ -2020,10 +2176,10 @@ Trigger a native prompt if the OS supports one
2020
2176
  Usage: car permissions request [OPTIONS] <DOMAIN>
2021
2177
 
2022
2178
  Arguments:
2023
- <DOMAIN>
2179
+ <DOMAIN>
2024
2180
 
2025
2181
  Options:
2026
- --target <TARGET>
2182
+ --target <TARGET>
2027
2183
  -h, --help Print help
2028
2184
  ```
2029
2185
 
@@ -2035,10 +2191,10 @@ Human-readable explanation and fix suggestion
2035
2191
  Usage: car permissions explain [OPTIONS] <DOMAIN>
2036
2192
 
2037
2193
  Arguments:
2038
- <DOMAIN>
2194
+ <DOMAIN>
2039
2195
 
2040
2196
  Options:
2041
- --target <TARGET>
2197
+ --target <TARGET>
2042
2198
  -h, --help Print help
2043
2199
  ```
2044
2200
 
@@ -2105,7 +2261,7 @@ Remove an enrolled voiceprint by label
2105
2261
  Usage: car voice remove --label <LABEL>
2106
2262
 
2107
2263
  Options:
2108
- --label <LABEL>
2264
+ --label <LABEL>
2109
2265
  -h, --help Print help
2110
2266
  ```
2111
2267
 
@@ -2131,10 +2287,14 @@ onboarding step)
2131
2287
  Usage: car approvals <COMMAND>
2132
2288
 
2133
2289
  Commands:
2134
- default Set the default approval preset for all agents (`cautious` asks before any
2290
+ default Set the default approval preset for all agents (`cautious` asks before any
2135
2291
  edit/full-access, `balanced` allows sandboxed edits, `trusting` allows everything without asking)
2136
- get Show the current default approval posture
2137
- help Print this message or the help of the given subcommand(s)
2292
+ get Show the current default approval posture
2293
+ set-tool Set an approval mode for one exact agent and exact tool. `always_allow` requires
2294
+ that agent to be attached with an eligible live callback
2295
+ evaluate-tool Show whether one exact agent/tool override is active and schema-bound
2296
+ reset-tool Remove one exact agent/tool approval override
2297
+ help Print this message or the help of the given subcommand(s)
2138
2298
 
2139
2299
  Options:
2140
2300
  -h, --help Print help
@@ -2166,6 +2326,53 @@ Options:
2166
2326
  -h, --help Print help
2167
2327
  ```
2168
2328
 
2329
+ #### car approvals set-tool
2330
+
2331
+ ```text
2332
+ Set an approval mode for one exact agent and exact tool. `always_allow` requires that agent to be
2333
+ attached with an eligible live callback
2334
+
2335
+ Usage: car approvals set-tool <AGENT> <TOOL> <MODE>
2336
+
2337
+ Arguments:
2338
+ <AGENT>
2339
+ <TOOL>
2340
+ <MODE> One of: always_allow | require_approval | deny
2341
+
2342
+ Options:
2343
+ -h, --help Print help
2344
+ ```
2345
+
2346
+ #### car approvals evaluate-tool
2347
+
2348
+ ```text
2349
+ Show whether one exact agent/tool override is active and schema-bound
2350
+
2351
+ Usage: car approvals evaluate-tool <AGENT> <TOOL>
2352
+
2353
+ Arguments:
2354
+ <AGENT>
2355
+ <TOOL>
2356
+
2357
+ Options:
2358
+ -h, --help Print help
2359
+ ```
2360
+
2361
+ #### car approvals reset-tool
2362
+
2363
+ ```text
2364
+ Remove one exact agent/tool approval override
2365
+
2366
+ Usage: car approvals reset-tool <AGENT> <TOOL>
2367
+
2368
+ Arguments:
2369
+ <AGENT>
2370
+ <TOOL>
2371
+
2372
+ Options:
2373
+ -h, --help Print help
2374
+ ```
2375
+
2169
2376
  ### car accounts
2170
2377
 
2171
2378
  ```text
@@ -2201,7 +2408,7 @@ Open the native account-management UI
2201
2408
  Usage: car accounts open [OPTIONS]
2202
2409
 
2203
2410
  Options:
2204
- --account-id <ACCOUNT_ID>
2411
+ --account-id <ACCOUNT_ID>
2205
2412
  -h, --help Print help
2206
2413
  ```
2207
2414
 
@@ -2281,11 +2488,11 @@ Free-text contact search
2281
2488
  Usage: car contacts find [OPTIONS] <QUERY>
2282
2489
 
2283
2490
  Arguments:
2284
- <QUERY>
2491
+ <QUERY>
2285
2492
 
2286
2493
  Options:
2287
2494
  --limit <LIMIT> [default: 50]
2288
- --containers <CONTAINERS>
2495
+ --containers <CONTAINERS>
2289
2496
  -h, --help Print help
2290
2497
  ```
2291
2498
 
@@ -2330,7 +2537,7 @@ Inbox summaries per account
2330
2537
  Usage: car mail inbox [OPTIONS]
2331
2538
 
2332
2539
  Options:
2333
- --accounts <ACCOUNTS>
2540
+ --accounts <ACCOUNTS>
2334
2541
  -h, --help Print help
2335
2542
  ```
2336
2543
 
@@ -2343,7 +2550,7 @@ bounded: depth 8, 64 requests)
2343
2550
  Usage: car mail mailboxes [OPTIONS]
2344
2551
 
2345
2552
  Options:
2346
- --accounts <ACCOUNTS>
2553
+ --accounts <ACCOUNTS>
2347
2554
  -h, --help Print help
2348
2555
  ```
2349
2556
 
@@ -2356,7 +2563,7 @@ account, then concatenated)
2356
2563
  Usage: car mail messages [OPTIONS]
2357
2564
 
2358
2565
  Options:
2359
- --accounts <ACCOUNTS>
2566
+ --accounts <ACCOUNTS>
2360
2567
  --mailbox <MAILBOX> Mailbox selector — a `full_name` from `car mail mailboxes`, or a bare
2361
2568
  leaf name like "Travel". Defaults to INBOX
2362
2569
  --limit <LIMIT> [default: 50]
@@ -2373,7 +2580,7 @@ Fetch one message body by the `id` from `car mail messages`
2373
2580
  Usage: car mail body <ID>
2374
2581
 
2375
2582
  Arguments:
2376
- <ID>
2583
+ <ID>
2377
2584
 
2378
2585
  Options:
2379
2586
  -h, --help Print help
@@ -2476,7 +2683,7 @@ Free-text note search
2476
2683
  Usage: car notes find [OPTIONS] <QUERY>
2477
2684
 
2478
2685
  Arguments:
2479
- <QUERY>
2686
+ <QUERY>
2480
2687
 
2481
2688
  Options:
2482
2689
  --limit <LIMIT> [default: 50]
@@ -2664,8 +2871,8 @@ Sleep windows in an ISO-8601 time range
2664
2871
  Usage: car health sleep --start <START> --end <END>
2665
2872
 
2666
2873
  Options:
2667
- --start <START>
2668
- --end <END>
2874
+ --start <START>
2875
+ --end <END>
2669
2876
  -h, --help Print help
2670
2877
  ```
2671
2878
 
@@ -2677,8 +2884,8 @@ Workouts in an ISO-8601 time range
2677
2884
  Usage: car health workouts --start <START> --end <END>
2678
2885
 
2679
2886
  Options:
2680
- --start <START>
2681
- --end <END>
2887
+ --start <START>
2888
+ --end <END>
2682
2889
  -h, --help Print help
2683
2890
  ```
2684
2891
 
@@ -2690,8 +2897,8 @@ Daily activity summaries across a date range (YYYY-MM-DD)
2690
2897
  Usage: car health activity --start <START> --end <END>
2691
2898
 
2692
2899
  Options:
2693
- --start <START>
2694
- --end <END>
2900
+ --start <START>
2901
+ --end <END>
2695
2902
  -h, --help Print help
2696
2903
  ```
2697
2904
 
@@ -2720,12 +2927,12 @@ Options:
2720
2927
  Registry source for `<namespace>/<name>` references: an `http(s)://…/index.json` URL or a
2721
2928
  LOCAL registry directory (or `file://` URL). Defaults to the public mirror. The private
2722
2929
  source needs a token — set `CAR_REGISTRY_TOKEN`
2723
-
2930
+
2724
2931
  [default: https://raw.githubusercontent.com/Parslee-ai/car-releases/main/index.json]
2725
2932
 
2726
2933
  --url <URL>
2727
2934
  WebSocket URL of the running car-server daemon
2728
-
2935
+
2729
2936
  [default: ws://127.0.0.1:9100/]
2730
2937
 
2731
2938
  --json
@@ -181,6 +181,35 @@ Proposed → Validated → Executing → Succeeded
181
181
 
182
182
  `ActionStatus` is observable through the event log, not part of the input contract.
183
183
 
184
+ #### Execution outcome event data
185
+
186
+ Every per-action `ActionFailed` event carries:
187
+
188
+ - `params_digest`: lowercase SHA-256 of the RFC 8785/JCS-canonicalized action
189
+ `parameters` object. The event never copies raw parameters; consumers join
190
+ through `proposal_id` + `action_id` to the authoritative `ProposalReceived`
191
+ record and can use the digest to detect a mismatch.
192
+ - `expected_effects`: the action's declared expected-effects object, unchanged.
193
+ - `error_class`: one of `timeout`, `rejected_by_policy`, `tool_error`,
194
+ `validation`, or `unknown`.
195
+
196
+ `ActionSucceeded` carries `params_digest` and `expected_effects` too, making the
197
+ success/failure join symmetric without adding an error classification to a
198
+ successful call.
199
+
200
+ The normalized error mapping is intentionally low-cardinality:
201
+
202
+ | `error_class` | Mapping |
203
+ |---|---|
204
+ | `timeout` | the engine's action deadline expired, or the daemon-to-host tool callback reported its own timeout |
205
+ | `rejected_by_policy` | a dispatch-time tool guard returned the stable `denied by policy:` or `rejected by policy:` prefix |
206
+ | `validation` | post-dispatch output or callback-state JCS/I-JSON, state-key-set, or serialization validation failed |
207
+ | `tool_error` | any other error returned while dispatching a tool action |
208
+ | `unknown` | a post-dispatch failure on an action with no tool |
209
+
210
+ Normal action/schema/policy admission failures happen before execution and are
211
+ `ActionRejected`, not `ActionFailed`, so this mapping does not reclassify them.
212
+
184
213
  ---
185
214
 
186
215
  ## Precondition
@@ -220,6 +249,7 @@ Registered when a tool is added to the runtime. Carries everything the runtime n
220
249
  ```jsonc
221
250
  {
222
251
  "name": "deploy",
252
+ "source": "user_defined",
223
253
  "description": "Deploys an artifact to a target environment.",
224
254
  "parameters": {
225
255
  "type": "object",
@@ -238,6 +268,7 @@ Registered when a tool is added to the runtime. Carries everything the runtime n
238
268
  | Field | Type | Required | Default | Notes |
239
269
  |-------|------|----------|---------|-------|
240
270
  | `name` | string | **yes** | — | unique within a runtime |
271
+ | `source` | `builtin \| user_defined \| subprocess \| mcp` | no | `user_defined` | stable origin category assigned by the runtime; MCP server detail remains registry-private |
241
272
  | `description` | string | no | `""` | human-readable; included in tool catalog |
242
273
  | `parameters` | JSON Schema | no | `{}` | validated by the runtime before dispatch |
243
274
  | `returns` | JSON Schema | no | none | validated against tool return value when set |
@@ -562,15 +593,21 @@ allow = ["staging", "preview"] # any other target — or none at all — is de
562
593
  | `allow` | no | permitted values; defaults to empty, which denies every call |
563
594
 
564
595
  #### `deny_tool_param_matching`
565
- The content counterpart to `deny_tool_param`, for prohibitions no fixed substring expresses — credential shapes, account numbers, an address family. `matches` is a regex over the string-coerced parameter value. The match is **unanchored**, so the pattern fires anywhere in the value; anchor it with `^`/`$` when that matters. Like `deny_tool_param`, an absent parameter is not a violation — use `allow_tool_param` when absence itself must be refused.
596
+ The content counterpart to `deny_tool_param`, for conditions no fixed substring expresses — credential shapes, account numbers, an address family, or an open-ended trusted prefix. `matches` is a regex over the string-coerced parameter value. The match is **unanchored**, so the pattern fires anywhere in the value; anchor it with `^`/`$` when that matters.
566
597
 
567
- The pattern is compiled once when the rule set is applied, not per action. A pattern that fails to compile **denies every call to that tool** rather than disappearing, matching the loader's loud-error posture.
598
+ By default a regex match denies and an absent parameter does not. Set `negate = true` for the "unless" form: a mismatch denies, and an absent parameter also denies because nothing proves the required pattern. The pattern is compiled once when the rule set is applied, not per action. A pattern that fails to compile **denies every call to that tool** rather than disappearing, matching the loader's loud-error posture.
568
599
 
569
600
  ```toml
570
601
  [[deny_tool_param_matching]]
571
602
  tool = "http_request"
572
603
  param = "body"
573
604
  matches = "sk-[A-Za-z0-9]{20,}" # never let an API-key-shaped string leave in a body
605
+
606
+ [[deny_tool_param_matching]]
607
+ tool = "docker.rm"
608
+ param = "name"
609
+ matches = "^parslee-"
610
+ negate = true # deny unless the name has the trusted prefix
574
611
  ```
575
612
 
576
613
  | Param | Required | Notes |
@@ -578,6 +615,7 @@ matches = "sk-[A-Za-z0-9]{20,}" # never let an API-key-shaped string leave in
578
615
  | `tool` | yes | tool name the rule applies to |
579
616
  | `param` | yes | parameter key inspected on the action |
580
617
  | `matches` | yes | regex source; unanchored; an uncompilable pattern denies the tool outright |
618
+ | `negate` | no | defaults to `false`; when `true`, deny mismatch or absence instead of match |
581
619
 
582
620
  #### `rate_limit_tool`
583
621
  A sliding-window cap on how often `tool` may be called. The call is denied when admitting it would make it the `max_calls + 1`-th call to `tool` within the trailing `interval_secs`. `max_calls = 0` denies every call. This bounds how much of a side effect an agent can produce in a stretch of wall-clock time, independently of whether any single call is legitimate.