delegate-agent-cli 0.18.0__tar.gz → 0.21.0__tar.gz

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.
Files changed (149) hide show
  1. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/CHANGELOG.md +269 -1
  2. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/PKG-INFO +36 -12
  3. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/README.md +35 -11
  4. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/bin/delegate-profile-shim +92 -1
  5. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/agent-setup.md +35 -9
  6. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/cli-reference.md +192 -17
  7. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/configuration.md +70 -16
  8. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/delegate-workflows.md +5 -1
  9. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/security-model.md +49 -8
  10. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/troubleshooting.md +91 -21
  11. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/worktrees.md +22 -0
  12. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/pyproject.toml +1 -1
  13. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/__init__.py +1 -1
  14. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/bundled_models.py +2 -1
  15. delegate_agent_cli-0.21.0/src/delegate_agent/capability_commands.py +298 -0
  16. delegate_agent_cli-0.21.0/src/delegate_agent/child_failures.py +93 -0
  17. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/cli.py +47 -1
  18. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/cli_parser.py +94 -16
  19. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/command_help.py +83 -16
  20. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/config.py +27 -41
  21. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/config_commands.py +2 -0
  22. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/describe_payload.py +123 -46
  23. delegate_agent_cli-0.21.0/src/delegate_agent/harness_discovery.py +1679 -0
  24. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/isolation.py +128 -0
  25. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/model_discovery.py +121 -230
  26. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/private_io.py +92 -5
  27. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profile_guard.py +6 -3
  28. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profiles.py +12 -29
  29. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/reasoning.py +566 -174
  30. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/redaction.py +94 -1
  31. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/rendering.py +41 -0
  32. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/request_build.py +743 -181
  33. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/request_models.py +10 -0
  34. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_metadata.py +27 -0
  35. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_status.py +8 -4
  36. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/runner.py +441 -64
  37. delegate_agent_cli-0.21.0/src/delegate_agent/setup_commands.py +514 -0
  38. delegate_agent_cli-0.21.0/src/delegate_agent/structured_output.py +177 -0
  39. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_commands.py +22 -4
  40. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_execution.py +12 -15
  41. delegate_agent_cli-0.21.0/src/delegate_agent/worktree_gc.py +1129 -0
  42. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_mgmt.py +8 -0
  43. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/PKG-INFO +36 -12
  44. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +9 -0
  45. delegate_agent_cli-0.21.0/tests/test_capability_commands.py +1027 -0
  46. delegate_agent_cli-0.21.0/tests/test_child_failures.py +73 -0
  47. delegate_agent_cli-0.21.0/tests/test_codex_thread_resilience.py +410 -0
  48. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_command_help.py +2 -0
  49. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_config_commands.py +69 -0
  50. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_help_cli.py +35 -0
  51. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_parser.py +120 -5
  52. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_validation.py +96 -0
  53. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_engine_argv.py +1132 -113
  54. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_argv_and_prompt.py +3 -1
  55. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_run.py +21 -2
  56. delegate_agent_cli-0.21.0/tests/test_harness_discovery.py +1609 -0
  57. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_kimi_commands.py +3 -3
  58. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_discovery.py +354 -33
  59. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_selection_wave1b.py +183 -20
  60. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_pure_call.py +24 -1
  61. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_reasoning_capabilities.py +390 -9
  62. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_runner_capture.py +28 -6
  63. delegate_agent_cli-0.21.0/tests/test_setup_commands.py +786 -0
  64. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_redaction.py +14 -0
  65. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_run_output.py +11 -0
  66. delegate_agent_cli-0.21.0/tests/test_structured_output.py +212 -0
  67. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_utility_modules.py +181 -0
  68. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wait_cancel_commands.py +1 -1
  69. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_workflow_commands.py +19 -0
  70. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_prune_gc.py +1032 -1
  71. delegate_agent_cli-0.18.0/src/delegate_agent/capability_commands.py +0 -99
  72. delegate_agent_cli-0.18.0/src/delegate_agent/worktree_gc.py +0 -577
  73. delegate_agent_cli-0.18.0/tests/test_capability_commands.py +0 -370
  74. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/CONTRIBUTING.md +0 -0
  75. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/LICENSE +0 -0
  76. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/MANIFEST.in +0 -0
  77. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/SECURITY.md +0 -0
  78. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/bin/delegate.py +0 -0
  79. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/config.example.json +0 -0
  80. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/assets/delegate-agent-header.png +0 -0
  81. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/development.md +0 -0
  82. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/live-runtime.md +0 -0
  83. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/publishing-checklist.md +0 -0
  84. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.claude.json +0 -0
  85. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.codex.json +0 -0
  86. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.cursor.json +0 -0
  87. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.droid.json +0 -0
  88. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.grok.json +0 -0
  89. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.judge.json +0 -0
  90. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.kimi.json +0 -0
  91. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/setup.cfg +0 -0
  92. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/archived_logs.py +0 -0
  93. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/argv_builders.py +0 -0
  94. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/argv_utils.py +0 -0
  95. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/command_errors.py +0 -0
  96. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/constants.py +0 -0
  97. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/errors.py +0 -0
  98. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/git_utils.py +0 -0
  99. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/harness_events.py +0 -0
  100. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/inspection_commands.py +0 -0
  101. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/json_types.py +0 -0
  102. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/log_output.py +0 -0
  103. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profile_commands.py +0 -0
  104. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/prompt_instructions.py +0 -0
  105. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/prompt_transport.py +0 -0
  106. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/retention.py +0 -0
  107. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_output_commands.py +0 -0
  108. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_registry.py +0 -0
  109. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/safe_workspace.py +0 -0
  110. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/seatbelt.py +0 -0
  111. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/snapshot_view.py +0 -0
  112. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/wait_cancel_commands.py +0 -0
  113. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/__init__.py +0 -0
  114. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/commands.py +0 -0
  115. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/registry.py +0 -0
  116. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/runtime.py +0 -0
  117. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/schema.py +0 -0
  118. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/script.py +0 -0
  119. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_records.py +0 -0
  120. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_remove.py +0 -0
  121. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_summary.py +0 -0
  122. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/wsl.py +0 -0
  123. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  124. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  125. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
  126. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  127. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_codex_pure_sandbox.py +0 -0
  128. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_isolation.py +0 -0
  129. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_end_to_end_tracking.py +0 -0
  130. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_dry_run.py +0 -0
  131. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_failure_cleanup.py +0 -0
  132. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_preflight.py +0 -0
  133. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_harness_events.py +0 -0
  134. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_inspection_commands.py +0 -0
  135. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_selection_wave1a.py +0 -0
  136. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_omp_read_only_behavior.py +0 -0
  137. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_packaging.py +0 -0
  138. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_profiles.py +0 -0
  139. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_retention.py +0 -0
  140. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_run_registry.py +0 -0
  141. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_safe_workspace_isolation.py +0 -0
  142. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_slash_passthrough.py +0 -0
  143. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_rendering.py +0 -0
  144. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_view.py +0 -0
  145. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_tracked_timeout.py +0 -0
  146. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wave4_launch_features.py +0 -0
  147. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_list_show.py +0 -0
  148. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_remove.py +0 -0
  149. {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wsl_guardrails.py +0 -0
@@ -5,6 +5,272 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.21.0] - 2026-07-26
9
+
10
+ ### Added
11
+
12
+ - Added `delegate worktree gc --all`, which scans the machine-wide worktree
13
+ pool for worktrees whose source repository no longer exists. Such worktrees
14
+ were previously unreachable by any `gc` invocation, because reaping is driven
15
+ by the run registry inside each source repository and that registry dies with
16
+ the repository. The scan adds no catalog or persistent state: it reads each
17
+ worktree's Git backlink directly, and treats a backlink whose target is gone
18
+ as the sole orphan signal. The scan removes nothing at all, at any depth: a
19
+ missing source repository makes a worktree's uncommitted state impossible to
20
+ inspect, so orphans and empty pool directories alike are reported for
21
+ deliberate manual cleanup. Because that output invites manual deletion, every
22
+ uncertainty resolves away from an orphan verdict: a pointer file that cannot
23
+ be read, a path comparison the filesystem cannot answer, an entry too recently
24
+ modified to have settled, and a directory whose name does not match the pool's
25
+ own fingerprint contract are all reported as warnings rather than orphans.
26
+ That last rule is what keeps a scan of an arbitrary root from labelling
27
+ somebody else's directories. `--pool PATH` scans a different pool root, which
28
+ reaches pools stranded by an earlier `worktrees.dataHome`.
29
+ - `capabilities refresh` and `setup` now name each harness on stderr as it is
30
+ probed, so a harness that hangs is identifiable rather than anonymous
31
+ silence. Progress output is suppressed under `--json`.
32
+
33
+ ### Changed
34
+
35
+ - A launch now fails instead of proceeding when the configured binary for a
36
+ harness identifies itself as a *different* known harness. Delegate re-probes
37
+ `--version` when a cached capability record has refused a run, and during
38
+ `capabilities refresh` and `setup` (see Fixed); when that banner positively
39
+ names another harness — a Codex path replaced in place by Grok, say — the run
40
+ stops with `harness_identity_mismatch` and exit code 2, naming the configured
41
+ harness, the harness that answered, and the selector path.
42
+ Previously the launch continued against that same binary with the same Codex
43
+ argv, sandbox flags, and approval policy, and only the cached capability
44
+ metadata was discarded. This fires solely on a banner that NAMES another known
45
+ harness, never on uncertainty: a probe that errors, times out, exceeds its
46
+ output bound, or prints an unbranded banner still fails open and launches on
47
+ the cached record. An unbranded shape — a bare date-and-hash build ID is the
48
+ clearest case — is deliberately not identification, because wrapper prefixes
49
+ are a supported configuration and refusing a legitimate launch costs more than
50
+ carrying a stale record until the next refresh. The selector is scrubbed of
51
+ credentials before it reaches the message or the diagnostics, since a wrapper
52
+ prefix can carry a token inline or after a flag. Dry runs do not probe and are
53
+ unaffected. The refusal also names the discovery cache file for the active
54
+ auth profile, in its `cachePath` diagnostic and in a next action, because
55
+ `capabilities refresh` cannot clear this state: a refresh keeps the
56
+ last-known-good record whenever a probe fails, which is correct for a flaky
57
+ probe and wrong here, where the record itself is the problem. Without the
58
+ path, a wrong identification would refuse every launch with no documented way
59
+ out short of editing configuration.
60
+ - A run whose cached capability record is discarded for version drift now says
61
+ so, naming `delegate capabilities refresh <engine>`. The record is dropped for
62
+ that run only and the superseded copy stays on disk, so every later launch
63
+ repeats the drop and loses the same discovery-sourced models and reasoning
64
+ levels — previously with no indication that a stale cache was the cause.
65
+ Selector drift stays silent, since `capabilities` already reports it under
66
+ `driftedHarnesses`.
67
+
68
+ ### Fixed
69
+
70
+ - Discovery now detects a harness that was upgraded in place. Cached capability
71
+ records were invalidated only by comparing the configured selector, so an
72
+ upgrade behind an unchanged selector left stale capabilities cached
73
+ indefinitely and a newly supported reasoning level was rejected until a manual
74
+ `capabilities refresh`. Delegate now re-probes `--version` for the single
75
+ harness it is about to use and compares it against the version already stored
76
+ in the record, then rebuilds the run against the refreshed picture. The probe
77
+ runs only once the cached record has already cost the run something, never on
78
+ the ordinary path, which therefore spawns no extra process at all — and that
79
+ matters because the probe costs 26-668ms, worst on the Node and Bun harnesses
80
+ that are already slow to start. Two things trigger it: an explicit
81
+ `--reasoning-effort` the record refuses, and a `defaultReasoningEffort` the
82
+ record silently drops. The second is the one most likely to go unnoticed,
83
+ since a configured default degrades to a warning rather than failing the
84
+ launch, and it is set once and then never typed again. A probe that cannot
85
+ repair the default leaves the run exactly as it was: a launch that succeeded
86
+ is never turned into a failure. The check fails open — a probe that errors,
87
+ times out, or prints a banner nothing recognizes keeps the cached record, so a
88
+ failing probe can never prevent a launch. A banner that positively identifies
89
+ a *different* known harness is the exception, and it aborts the launch rather
90
+ than merely invalidating the record — see Changed. Each banner is matched
91
+ against the expected harness's own pattern before anyone else's, so a banner
92
+ mentioning more than one tool is read as the harness that was asked for
93
+ instead of whichever pattern happens to be declared earlier. Banners are read
94
+ with escape sequences stripped, so a colorized version line no longer freezes
95
+ a record permanently. A cached selector whose binary no longer exists is also
96
+ treated as drift.
97
+ - Not covered, deliberately: a harness that *removes* a capability leaves its
98
+ cached record listing more than the harness now supports, which produces no
99
+ refusal and so no probe. The child rejects the effort it was handed, which is
100
+ loud; the one quiet case is Cursor's route table aiming a run at a superseded
101
+ model id. Catching either would cost a probe on every launch, which is the
102
+ trade this path exists to refuse. `capabilities refresh` remains the cure.
103
+ - A dry run never probes the harness for its version. Dry run documents that it
104
+ neither launches a child runtime nor requires the real child binary, and the
105
+ drift probe is a child runtime; it now runs only on a real launch, leaving dry
106
+ run with the two filesystem-local checks.
107
+ - A discovery cache carrying a newer schema than the running build is no longer
108
+ discarded and overwritten. It is left intact while the run degrades to
109
+ probing without persisting, so an older Delegate can no longer destroy a newer
110
+ cache. Losing that race mid-probe degrades the same way rather than failing the
111
+ command: `capabilities refresh` and `setup` both report `cacheWriteSkipped`,
112
+ `setup` additionally leaving `cacheState` at `unchanged`, and each exits
113
+ successfully, since only persistence was lost. The
114
+ schema is re-read immediately before the atomic replacement rather than before
115
+ the snapshot is serialized, which narrows the window in which a newer cache
116
+ could be published and then overwritten down to the `os.replace` call itself.
117
+ POSIX offers no compare-and-swap for a rename, so that last window remains.
118
+ - The test suite no longer writes into the developer's real
119
+ `~/.delegate/worktrees`. Tests exercising persistent-worktree runs created
120
+ real pooled worktrees over temporary source repositories and orphaned them
121
+ permanently, because `worktrees_data_home` falls through to the user's home
122
+ directory with no seam a test could redirect. `HOME` is now redirected at test
123
+ collection time, which reaches every such resolver at once.
124
+
125
+ ## [0.20.0] - 2026-07-25
126
+
127
+ ### Added
128
+
129
+ - Added typed child-failure reporting for usage/quota limits (including reset
130
+ details when present), expired or rejected auth tokens, and Codex thread/state
131
+ lookup loss. Run state, snapshots, listings, completion envelopes, and
132
+ synthesized reports now carry the specific error and message. The existing
133
+ generic public error remains `child_failed`; `usage_limit`, `auth_failed`, and
134
+ `codex_thread_lost` are additive typed codes. Classification reads only stderr
135
+ and normalized harness error/terminal events, never assistant/model output.
136
+ - Added `delegate ps` as the first-class active-run view, equivalent to
137
+ `delegate runs --active`.
138
+ - Added `delegate setup` for first-run harness discovery. It fingerprints all
139
+ supported installed harnesses, records available model/reasoning metadata in
140
+ a profile-scoped user cache, creates a minimal selector-only config when no
141
+ config exists, and reports discovery readiness separately from launchability.
142
+ - Cached `models`/`capabilities` views now project profile discovery with source
143
+ and evidence metadata. `models <engine> --live` provides a non-persistent
144
+ one-off probe; `capabilities refresh` persists a full refresh for the selected
145
+ profile, and `capabilities refresh <engine> [...]` re-probes only the named
146
+ harnesses while the rest keep their last-known-good records.
147
+ - Runtime model and reasoning metadata now distinguish the requested model,
148
+ argv-resolved model, capability-validation model, requested effort, resolved
149
+ effort, source, evidence strength, and transport.
150
+
151
+ ### Changed
152
+
153
+ - Codex output schemas are now linted before launch. Delegate recursively
154
+ supplies missing `additionalProperties: false` on object schemas with a loud
155
+ warning, rejects partial `required` lists precisely, and passes a normalized
156
+ temporary copy without modifying the source schema. Object-bearing `allOf`,
157
+ `patternProperties`, and external or unresolvable `$ref` values fail closed
158
+ rather than being rewritten unsafely. Workflow Codex stages and direct
159
+ `--output-schema`/`outputSchema` launches share the same preflight. The
160
+ normalized copy preserves the source schema's property order, so
161
+ think-before-answer schemas keep their intended generation order.
162
+ - On retry-safe paths, Codex thread/state lookup failures now retry once and,
163
+ only if the same typed failure repeats, retry through an ephemeral
164
+ `--ignore-user-config` launch. Retry-safe paths are read-only calls and
165
+ pre-tool attempts whose workspace remains unchanged; work mode also requires
166
+ a clean captured baseline. Envelopes and events record fallback engagement.
167
+ - `--prompt-file /dev/stdin` and equivalent stdin descriptors now consume the
168
+ piped prompt once instead of conflicting with stdin as a second source.
169
+ - Model and reasoning resolution now prefers explicit CLI/config choices and
170
+ exact discovered evidence before legacy workspace or bundled fallbacks.
171
+ Exact negative menus fail closed; partial harness evidence and Cursor inferred
172
+ routes remain visibly labeled rather than being promoted to model-exact facts.
173
+ - Discovery refresh is last-known-good per harness. Successful records update
174
+ independently, failed probes retain the prior record and report staleness,
175
+ and selector drift invalidates only the affected harness without probing on
176
+ an ordinary launch.
177
+ - `capabilities refresh` now writes the selected profile's private discovery
178
+ cache. The old workspace reasoning cache remains a lower-precedence read-only
179
+ compatibility source. The cached `capabilities` read reports the discovery
180
+ cache location in `cachePath`; the previous workspace path, when present, is
181
+ reported under `legacyWorkspaceCachePath`.
182
+ - `reasoning.capabilities` config entries are now accepted for `grok` in
183
+ addition to `codex` and `droid`.
184
+ - `--auth-profile` is now accepted on cached `capabilities` reads (previously
185
+ rejected as an invalid option combination) and on `models` and `setup`.
186
+ - Cursor reasoning-effort routing now defers to a pinned selector when discovery
187
+ has no same-family route for it: the run proceeds on the pinned model and
188
+ records a bypass warning. When discovery does carry exact same-family routes,
189
+ the requested effort still routes to the matching selector, and a family that
190
+ omits the requested effort still fails closed.
191
+ - Grok reasoning-effort support is once again governed by the documented CLI
192
+ enum (low, medium, high, xhigh, max); a bundled `grok-4.5` declaration that
193
+ narrowed it to low/medium/high was removed, since `grok --help` enumerates no
194
+ per-model efforts. Config, discovery-exact, and cached grok declarations
195
+ still take precedence.
196
+ - Embedded Devin and Kimi `defaultModel` values are now `null`, deferring model
197
+ selection to each harness. The editable `config init` example may still pin
198
+ an explicit default.
199
+ - Claude and Grok `defaultReasoningEffort` config values are now only
200
+ format-checked at load time instead of validated against the static enum; an
201
+ unsupported configured default degrades to a launch-time warning so that
202
+ discovery, not a hardcoded table, decides which levels are accepted.
203
+
204
+ ### Security
205
+
206
+ - Discovery probes use fingerprinted allowlisted selectors, fixed argv with no
207
+ shell, closed stdin, neutral temporary working directories, bounded output,
208
+ timeouts, normalized cache schemas, atomic owner-only writes, and scrubbed
209
+ model/warning projections. Config and cache source paths remain intentionally
210
+ visible diagnostics. Automatic Devin discovery remains prompt-free; only the
211
+ explicitly requested `models devin --live` path uses its bounded prompt-like
212
+ invalid-model probe.
213
+ - Setup never overwrites an existing config and refuses unsafe selectors,
214
+ final-component symlinks, and concurrent config races rather than mixing
215
+ discovery results across config states.
216
+
217
+ ### Fixed
218
+
219
+ - Credentials appearing in a child harness quota or reset message are now
220
+ redacted before they reach `state.json`, `snapshot.json`, the completion
221
+ report, or the run envelope; Codex reports quota walls as stdout events,
222
+ which bypassed the stderr-tail redaction. The in-progress activity label is
223
+ likewise redacted when persisted, matching the progress heartbeat.
224
+ - A Codex output schema that omits `required` entirely is now repaired to list
225
+ every property (in declaration order) instead of being rejected, matching how
226
+ a missing `additionalProperties` is handled. A partial `required` is still an
227
+ error.
228
+ - The `primary` attempt banner is written once in the run's stderr log even
229
+ when several retry paths run in sequence.
230
+ - `delegate ps` now reports argument errors in its own terms — unknown options,
231
+ `--limit`, `--harness`, and `--group` failures name `ps` instead of the
232
+ `runs` command it delegates to, and `ps --recent` gets the same tailored
233
+ redirect as `--running` and `--stale`.
234
+ - `delegate capabilities refresh` exits 3 (missing binary) when no supported
235
+ harness is installed — including when an engine subset such as
236
+ `capabilities refresh codex` names only uninstalled harnesses — matching
237
+ `delegate setup` on identical machine state instead of returning the generic
238
+ usage code 2.
239
+ - `delegate capabilities` no longer advertises harnesses whose configured
240
+ selector has drifted from the cached record, on both the cached read and
241
+ after a refresh — a subset refresh returns the full snapshot, so engines it
242
+ never probed could otherwise surface stale catalogs the launch path would
243
+ refuse. Excluded harnesses are named in a new `driftedHarnesses` payload
244
+ field and in the text output.
245
+ - Pi catalog rows whose column count does not match the header are skipped
246
+ instead of being read by shifted column position, which could cache a
247
+ thinking-capable model as having no reasoning support (unrecoverable, since
248
+ Pi has no config override) or hand a non-thinking model the full effort enum.
249
+ - A configured harness binary or argv prefix that no longer resolves while the
250
+ CLI is still on PATH is now reported as a stale config setting rather than an
251
+ uninstalled harness, and `delegate setup` names the config key and file to
252
+ fix instead of telling you to install a CLI you already have.
253
+ - An unreadable `~/.factory/settings.json` (permissions or I/O error) is
254
+ reported as a read failure instead of being misreported as invalid JSON.
255
+ - Two Cursor selectors that normalize to the same route family and effort now
256
+ drop just the ambiguous routes with a warning, instead of turning the entire
257
+ Cursor discovery record into an error record.
258
+ - OpenCode catalog parsing resumes past a malformed entry's whole object, so a
259
+ `provider/model`-shaped line nested inside the rejected body can no longer be
260
+ re-read as a real selector.
261
+ - `capabilities refresh` now hints "global options before the subcommand" for a
262
+ misplaced global option instead of mislabeling it `invalid_engine`, and a
263
+ subset refresh whose requested harnesses are all uninstalled reports
264
+ `requested_harnesses_not_installed` instead of the misleading
265
+ `no_harnesses_installed`.
266
+
267
+ ## [0.19.0] - 2026-07-20
268
+
269
+ ### Added
270
+
271
+ - Codex `--reasoning-effort max` support for `gpt-5.6-sol`; other Codex models
272
+ still fail closed unless config or workspace capability-cache overrides opt them in.
273
+
8
274
  ## [0.18.0] - 2026-07-19
9
275
 
10
276
  ### Added
@@ -137,7 +403,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
137
403
  consistently across the CLI reference and worktree guidance.
138
404
  - Devin help and discovery surfaces now derive supported modes consistently and
139
405
  reject unknown modes before constructing executable arguments.
140
-
141
406
  ## [0.14.0] - 2026-07-15
142
407
 
143
408
  ### Added
@@ -483,6 +748,9 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
483
748
 
484
749
  - Releases before 0.1.3 predate this changelog.
485
750
 
751
+ [0.21.0]: https://github.com/treygoff24/delegate-agent/compare/v0.20.0...v0.21.0
752
+ [0.20.0]: https://github.com/treygoff24/delegate-agent/compare/v0.19.0...v0.20.0
753
+ [0.19.0]: https://github.com/treygoff24/delegate-agent/compare/v0.18.0...v0.19.0
486
754
  [0.18.0]: https://github.com/treygoff24/delegate-agent/compare/v0.17.0...v0.18.0
487
755
  [0.17.0]: https://github.com/treygoff24/delegate-agent/compare/v0.16.0...v0.17.0
488
756
  [0.16.0]: https://github.com/treygoff24/delegate-agent/compare/v0.15.0...v0.16.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: delegate-agent-cli
3
- Version: 0.18.0
3
+ Version: 0.21.0
4
4
  Summary: A tiny CLI for delegating bounded agent tasks across coding-agent runtimes.
5
5
  Author: Trey Goff
6
6
  License-Expression: MIT
@@ -130,22 +130,28 @@ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
130
130
  normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
131
131
  Extend `PATH` or set `opencode.binary` to the absolute binary path.
132
132
 
133
- Initialize a starter config and replace placeholder Droid model IDs before real Droid runs:
133
+ Let Delegate discover the supported harnesses already on your `PATH`:
134
134
 
135
135
  ```bash
136
- delegate config init
137
- $EDITOR ~/.delegate/config.json
136
+ delegate setup
138
137
  ```
139
138
 
140
- `config init` also writes missing `~/.delegate/config.work.json` and
141
- `~/.delegate/config.personal.json` profile overlays. For an existing install,
142
- run `env -u AI_PROFILE delegate config sync-profiles` to materialize any missing
143
- overlays without overwriting ones you already edited.
139
+ `setup` fingerprints installed harnesses, reads their model and reasoning metadata where
140
+ the harness exposes it, and writes a private discovery cache for the active auth profile.
141
+ On a clean install it creates only the absolute binary selectors needed to launch the
142
+ detected harnesses. It never rewrites an existing config, installs a harness, logs in, or
143
+ submits a model prompt.
144
+
145
+ Use `delegate config init` instead when you want the editable example config and profile
146
+ overlays. Replace its placeholder Droid model IDs before real Droid runs. For an existing
147
+ install, `env -u AI_PROFILE delegate config sync-profiles` creates missing overlays without
148
+ overwriting ones you already edited.
144
149
 
145
150
  Inspect what Delegate sees:
146
151
 
147
152
  ```bash
148
153
  delegate --version # installed version — include this in bug reports
154
+ delegate --json setup
149
155
  delegate --json describe --summary
150
156
  delegate --json models --summary
151
157
  delegate --json describe
@@ -156,9 +162,10 @@ delegate --json models opencode --live # query every model visible to OpenCode
156
162
  delegate --json models pi --live # query every model visible to Pi
157
163
  delegate --json models omp --live # query every model visible to Oh My Pi
158
164
  delegate --json capabilities
165
+ delegate --json capabilities refresh # refresh the active profile's discovery cache
159
166
  ```
160
167
 
161
- Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. `delegate --json capabilities` reports reasoning-effort support without launching a child runtime.
168
+ Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. Cached `models` and `capabilities` reads launch no child process. `models <engine> --live` performs a one-off probe without updating the cache; rerun `delegate setup` or `delegate capabilities refresh` when ordinary launches should consume newly discovered models or effort levels.
162
169
 
163
170
  From this development checkout, use `python3 bin/delegate.py ...` instead of an installed `delegate` shim.
164
171
 
@@ -243,7 +250,12 @@ $EDITOR /tmp/delegate-task.json
243
250
  delegate --json run --input-json /tmp/delegate-task.json
244
251
  ```
245
252
 
246
- For Codex fan-outs that must return machine-parseable records, add `--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report injection so the schema owns the final message.
253
+ For Codex fan-outs that must return machine-parseable records, add
254
+ `--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report
255
+ injection so the schema owns the final message. Codex schemas are
256
+ strict-preflighted recursively: every property must be required, and a missing
257
+ `additionalProperties: false` is supplied in a warned temporary copy without
258
+ changing the source file.
247
259
 
248
260
  For a one-hop prompt that should not see the current repo or create a tracked
249
261
  run, use stateless `call` mode:
@@ -280,7 +292,16 @@ python3 bin/delegate.py workflow approve wf_0123abcdef45
280
292
  See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
281
293
  limits, config, and gate semantics.
282
294
 
283
- Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude and Grok map to native `--effort`, OpenCode passes it through as `--variant`, and Pi/Oh My Pi map `low|medium|high|xhigh|max` directly to `--thinking`. Devin and Kimi do not expose a Delegate reasoning-effort flag. Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
295
+ Reasoning effort is provider-aware. Unsupported combinations fail before launch.
296
+ It changes only the requested model thinking depth/cost/latency; it does not
297
+ change safe/work/call mode, sandboxing, approvals, or edit capability.
298
+ Codex/Droid validate exact model metadata, Cursor selects an explicit configured
299
+ or corroborated discovered effort route, Claude and Grok map to native
300
+ `--effort`, OpenCode validates discovered exact variants when present and
301
+ otherwise warns on pass-through, and Pi/Oh My Pi map to `--thinking` with
302
+ evidence-aware validation. Devin and Kimi do not expose a Delegate
303
+ reasoning-effort flag. Explicit Codex effort can target the harness default model
304
+ even when `codex.defaultModel` is unset:
284
305
 
285
306
  ```bash
286
307
  delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
@@ -291,7 +312,9 @@ Codex model routing is deliberately model-first rather than aliasing every
291
312
  model/effort pair: define model aliases in `codex.models`, then set effort per
292
313
  run with `--reasoning-effort`. Per-model effort menus (including any efforts
293
314
  newer than the bundled data) belong in the private `reasoning.capabilities`
294
- config block, which overrides the bundled defaults.
315
+ config block, which overrides the bundled defaults. Codex `max` is bundled only
316
+ for `gpt-5.6-sol` as of 2026-07; other Codex models require an exact config or
317
+ profile-discovery declaration, or legacy workspace-cache declaration.
295
318
 
296
319
  Fast mode is an independent per-run serving choice. `--fast` requests Codex's
297
320
  Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
@@ -306,6 +329,7 @@ Inspect tracked output by alias:
306
329
 
307
330
  ```bash
308
331
  delegate runs --recent
332
+ delegate ps # active and stale tracked runs
309
333
  delegate snapshot <alias-or-runId>
310
334
  delegate run-output <alias-or-runId>
311
335
  ```
@@ -97,22 +97,28 @@ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
97
97
  normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
98
98
  Extend `PATH` or set `opencode.binary` to the absolute binary path.
99
99
 
100
- Initialize a starter config and replace placeholder Droid model IDs before real Droid runs:
100
+ Let Delegate discover the supported harnesses already on your `PATH`:
101
101
 
102
102
  ```bash
103
- delegate config init
104
- $EDITOR ~/.delegate/config.json
103
+ delegate setup
105
104
  ```
106
105
 
107
- `config init` also writes missing `~/.delegate/config.work.json` and
108
- `~/.delegate/config.personal.json` profile overlays. For an existing install,
109
- run `env -u AI_PROFILE delegate config sync-profiles` to materialize any missing
110
- overlays without overwriting ones you already edited.
106
+ `setup` fingerprints installed harnesses, reads their model and reasoning metadata where
107
+ the harness exposes it, and writes a private discovery cache for the active auth profile.
108
+ On a clean install it creates only the absolute binary selectors needed to launch the
109
+ detected harnesses. It never rewrites an existing config, installs a harness, logs in, or
110
+ submits a model prompt.
111
+
112
+ Use `delegate config init` instead when you want the editable example config and profile
113
+ overlays. Replace its placeholder Droid model IDs before real Droid runs. For an existing
114
+ install, `env -u AI_PROFILE delegate config sync-profiles` creates missing overlays without
115
+ overwriting ones you already edited.
111
116
 
112
117
  Inspect what Delegate sees:
113
118
 
114
119
  ```bash
115
120
  delegate --version # installed version — include this in bug reports
121
+ delegate --json setup
116
122
  delegate --json describe --summary
117
123
  delegate --json models --summary
118
124
  delegate --json describe
@@ -123,9 +129,10 @@ delegate --json models opencode --live # query every model visible to OpenCode
123
129
  delegate --json models pi --live # query every model visible to Pi
124
130
  delegate --json models omp --live # query every model visible to Oh My Pi
125
131
  delegate --json capabilities
132
+ delegate --json capabilities refresh # refresh the active profile's discovery cache
126
133
  ```
127
134
 
128
- Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. `delegate --json capabilities` reports reasoning-effort support without launching a child runtime.
135
+ Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. Cached `models` and `capabilities` reads launch no child process. `models <engine> --live` performs a one-off probe without updating the cache; rerun `delegate setup` or `delegate capabilities refresh` when ordinary launches should consume newly discovered models or effort levels.
129
136
 
130
137
  From this development checkout, use `python3 bin/delegate.py ...` instead of an installed `delegate` shim.
131
138
 
@@ -210,7 +217,12 @@ $EDITOR /tmp/delegate-task.json
210
217
  delegate --json run --input-json /tmp/delegate-task.json
211
218
  ```
212
219
 
213
- For Codex fan-outs that must return machine-parseable records, add `--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report injection so the schema owns the final message.
220
+ For Codex fan-outs that must return machine-parseable records, add
221
+ `--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report
222
+ injection so the schema owns the final message. Codex schemas are
223
+ strict-preflighted recursively: every property must be required, and a missing
224
+ `additionalProperties: false` is supplied in a warned temporary copy without
225
+ changing the source file.
214
226
 
215
227
  For a one-hop prompt that should not see the current repo or create a tracked
216
228
  run, use stateless `call` mode:
@@ -247,7 +259,16 @@ python3 bin/delegate.py workflow approve wf_0123abcdef45
247
259
  See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
248
260
  limits, config, and gate semantics.
249
261
 
250
- Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude and Grok map to native `--effort`, OpenCode passes it through as `--variant`, and Pi/Oh My Pi map `low|medium|high|xhigh|max` directly to `--thinking`. Devin and Kimi do not expose a Delegate reasoning-effort flag. Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
262
+ Reasoning effort is provider-aware. Unsupported combinations fail before launch.
263
+ It changes only the requested model thinking depth/cost/latency; it does not
264
+ change safe/work/call mode, sandboxing, approvals, or edit capability.
265
+ Codex/Droid validate exact model metadata, Cursor selects an explicit configured
266
+ or corroborated discovered effort route, Claude and Grok map to native
267
+ `--effort`, OpenCode validates discovered exact variants when present and
268
+ otherwise warns on pass-through, and Pi/Oh My Pi map to `--thinking` with
269
+ evidence-aware validation. Devin and Kimi do not expose a Delegate
270
+ reasoning-effort flag. Explicit Codex effort can target the harness default model
271
+ even when `codex.defaultModel` is unset:
251
272
 
252
273
  ```bash
253
274
  delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
@@ -258,7 +279,9 @@ Codex model routing is deliberately model-first rather than aliasing every
258
279
  model/effort pair: define model aliases in `codex.models`, then set effort per
259
280
  run with `--reasoning-effort`. Per-model effort menus (including any efforts
260
281
  newer than the bundled data) belong in the private `reasoning.capabilities`
261
- config block, which overrides the bundled defaults.
282
+ config block, which overrides the bundled defaults. Codex `max` is bundled only
283
+ for `gpt-5.6-sol` as of 2026-07; other Codex models require an exact config or
284
+ profile-discovery declaration, or legacy workspace-cache declaration.
262
285
 
263
286
  Fast mode is an independent per-run serving choice. `--fast` requests Codex's
264
287
  Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
@@ -273,6 +296,7 @@ Inspect tracked output by alias:
273
296
 
274
297
  ```bash
275
298
  delegate runs --recent
299
+ delegate ps # active and stale tracked runs
276
300
  delegate snapshot <alias-or-runId>
277
301
  delegate run-output <alias-or-runId>
278
302
  ```
@@ -33,6 +33,75 @@ _delegate_subcommand() {
33
33
  done
34
34
  }
35
35
 
36
+ _delegate_launch_help_request() {
37
+ _delegate_launch_cmd="${1:-}"
38
+ [ "$#" -gt 0 ] && shift
39
+
40
+ if [ "$_delegate_launch_cmd" = "dry-run" ]; then
41
+ case "${1:-}" in
42
+ --help|-h)
43
+ return 0
44
+ ;;
45
+ esac
46
+ _delegate_launch_cmd="${1:-}"
47
+ [ "$#" -gt 0 ] && shift
48
+ fi
49
+
50
+ case "$_delegate_launch_cmd" in
51
+ cursor|codex|kimi|claude|grok|devin|opencode|pi|omp)
52
+ # Parser parity: help is diagnostic only before the mode or immediately
53
+ # after it. Once inline prompt text starts, a later help token is data.
54
+ case "${1:-}" in
55
+ --help|-h)
56
+ return 0
57
+ ;;
58
+ safe|work|call)
59
+ case "${2:-}" in
60
+ --help|-h)
61
+ return 0
62
+ ;;
63
+ esac
64
+ ;;
65
+ esac
66
+ return 1
67
+ ;;
68
+ droid)
69
+ # Droid may place a model alias before the mode, so its last diagnostic
70
+ # help position is one token later than the modeless harnesses.
71
+ case "${1:-}" in
72
+ --help|-h)
73
+ return 0
74
+ ;;
75
+ safe|work|call)
76
+ case "${2:-}" in
77
+ --help|-h)
78
+ return 0
79
+ ;;
80
+ esac
81
+ ;;
82
+ *)
83
+ case "${2:-}" in
84
+ --help|-h)
85
+ return 0
86
+ ;;
87
+ safe|work|call)
88
+ case "${3:-}" in
89
+ --help|-h)
90
+ return 0
91
+ ;;
92
+ esac
93
+ ;;
94
+ esac
95
+ ;;
96
+ esac
97
+ return 1
98
+ ;;
99
+ *)
100
+ return 1
101
+ ;;
102
+ esac
103
+ }
104
+
36
105
  _delegate_is_readonly_request() {
37
106
  while [ "$#" -gt 0 ]; do
38
107
  case "$1" in
@@ -51,7 +120,29 @@ _delegate_is_readonly_request() {
51
120
  _cmd="${1:-}"
52
121
  [ "$#" -gt 0 ] && shift
53
122
  case "$_cmd" in
54
- profiles|runs|run-output|describe|models|snapshot|agent-help|help|--help|-h|--version)
123
+ cursor|droid|codex|kimi|claude|grok|devin|opencode|pi|omp|dry-run)
124
+ _delegate_launch_help_request "$_cmd" "$@" && return 0
125
+ return 1
126
+ ;;
127
+ esac
128
+ # Non-launch command parsers treat help as diagnostic wherever accepted.
129
+ for _delegate_help_arg in "$@"; do
130
+ case "$_delegate_help_arg" in
131
+ --help|-h)
132
+ return 0
133
+ ;;
134
+ esac
135
+ done
136
+ case "$_cmd" in
137
+ profiles|runs|ps|run-output|describe|snapshot|agent-help|help|--help|-h|--version)
138
+ return 0
139
+ ;;
140
+ models)
141
+ for _delegate_model_arg in "$@"; do
142
+ if [ "$_delegate_model_arg" = "--live" ]; then
143
+ return 1
144
+ fi
145
+ done
55
146
  return 0
56
147
  ;;
57
148
  capabilities)