delegate-agent-cli 0.13.0__tar.gz → 0.14.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 (133) hide show
  1. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/CHANGELOG.md +60 -0
  2. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/PKG-INFO +28 -1
  3. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/README.md +27 -0
  4. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/cli-reference.md +89 -25
  5. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/configuration.md +5 -0
  6. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/security-model.md +37 -0
  7. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/worktrees.md +4 -0
  8. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/pyproject.toml +1 -1
  9. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/__init__.py +1 -1
  10. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/argv_builders.py +84 -5
  11. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/argv_utils.py +9 -1
  12. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/cli.py +44 -7
  13. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/cli_parser.py +114 -3
  14. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/command_help.py +148 -51
  15. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/constants.py +25 -0
  16. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/describe_payload.py +108 -7
  17. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/git_utils.py +1 -1
  18. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/harness_events.py +28 -1
  19. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/isolation.py +1 -1
  20. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/json_types.py +2 -2
  21. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profiles.py +67 -9
  22. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/reasoning.py +3 -3
  23. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/request_build.py +143 -28
  24. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/request_models.py +9 -0
  25. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_metadata.py +12 -0
  26. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/runner.py +425 -29
  27. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/safe_workspace.py +86 -19
  28. delegate_agent_cli-0.14.0/src/delegate_agent/seatbelt.py +170 -0
  29. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/snapshot_view.py +1 -2
  30. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/wait_cancel_commands.py +50 -23
  31. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/commands.py +131 -34
  32. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/registry.py +77 -1
  33. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/runtime.py +95 -40
  34. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/schema.py +34 -4
  35. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/script.py +3 -2
  36. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_execution.py +10 -47
  37. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_summary.py +1 -2
  38. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/PKG-INFO +28 -1
  39. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +3 -0
  40. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_capability_commands.py +17 -0
  41. delegate_agent_cli-0.14.0/tests/test_codex_pure_sandbox.py +511 -0
  42. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_command_help.py +96 -11
  43. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_help_cli.py +72 -1
  44. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_isolation.py +3 -3
  45. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_parser.py +213 -20
  46. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_validation.py +0 -11
  47. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_end_to_end_tracking.py +19 -0
  48. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_engine_argv.py +32 -1
  49. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_argv_and_prompt.py +39 -2
  50. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_dry_run.py +23 -11
  51. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_failure_cleanup.py +1 -12
  52. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_preflight.py +2 -4
  53. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_run.py +0 -8
  54. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_discovery.py +2 -2
  55. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_selection_wave1a.py +1 -1
  56. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_selection_wave1b.py +3 -3
  57. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_profiles.py +64 -0
  58. delegate_agent_cli-0.14.0/tests/test_pure_call.py +570 -0
  59. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_retention.py +0 -3
  60. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_run_registry.py +0 -2
  61. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_runner_capture.py +0 -8
  62. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_safe_workspace_isolation.py +143 -0
  63. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wait_cancel_commands.py +130 -59
  64. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_workflow_commands.py +927 -20
  65. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_list_show.py +0 -1
  66. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_prune_gc.py +0 -1
  67. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_remove.py +0 -1
  68. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/CONTRIBUTING.md +0 -0
  69. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/LICENSE +0 -0
  70. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/MANIFEST.in +0 -0
  71. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/SECURITY.md +0 -0
  72. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/bin/delegate-profile-shim +0 -0
  73. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/bin/delegate.py +0 -0
  74. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/config.example.json +0 -0
  75. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/agent-setup.md +0 -0
  76. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/assets/delegate-agent-header.png +0 -0
  77. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/development.md +0 -0
  78. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/live-runtime.md +0 -0
  79. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/publishing-checklist.md +0 -0
  80. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/troubleshooting.md +0 -0
  81. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.claude.json +0 -0
  82. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.codex.json +0 -0
  83. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.cursor.json +0 -0
  84. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.droid.json +0 -0
  85. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.grok.json +0 -0
  86. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.judge.json +0 -0
  87. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/setup.cfg +0 -0
  88. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/archived_logs.py +0 -0
  89. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/bundled_models.py +0 -0
  90. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/capability_commands.py +0 -0
  91. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/command_errors.py +0 -0
  92. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/config.py +0 -0
  93. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/config_commands.py +0 -0
  94. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/errors.py +0 -0
  95. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/inspection_commands.py +0 -0
  96. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/log_output.py +0 -0
  97. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/model_discovery.py +0 -0
  98. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/private_io.py +0 -0
  99. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profile_commands.py +0 -0
  100. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profile_guard.py +0 -0
  101. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/prompt_instructions.py +0 -0
  102. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/prompt_transport.py +0 -0
  103. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/redaction.py +0 -0
  104. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/rendering.py +0 -0
  105. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/retention.py +0 -0
  106. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_output_commands.py +0 -0
  107. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_registry.py +0 -0
  108. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_status.py +0 -0
  109. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/__init__.py +0 -0
  110. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_commands.py +0 -0
  111. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_gc.py +0 -0
  112. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_mgmt.py +0 -0
  113. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_records.py +0 -0
  114. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_remove.py +0 -0
  115. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/wsl.py +0 -0
  116. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  117. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  118. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
  119. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  120. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_config_commands.py +0 -0
  121. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_harness_events.py +0 -0
  122. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_inspection_commands.py +0 -0
  123. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_kimi_commands.py +0 -0
  124. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_packaging.py +0 -0
  125. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_reasoning_capabilities.py +0 -0
  126. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_slash_passthrough.py +0 -0
  127. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_redaction.py +0 -0
  128. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_rendering.py +0 -0
  129. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_run_output.py +0 -0
  130. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_view.py +0 -0
  131. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_utility_modules.py +0 -0
  132. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wave4_launch_features.py +0 -0
  133. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wsl_guardrails.py +0 -0
@@ -5,6 +5,64 @@ 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.14.0] - 2026-07-15
9
+
10
+ ### Added
11
+
12
+ - `workflow result --field` for extracting a single field from a workflow
13
+ result, reliable latest-workflow selection, immutable creation ordering,
14
+ dry-run visibility, and orphan detection (PR #14).
15
+ - Schema validation for `agent()` results supports `minLength` and
16
+ `minItems`, including in retries and dry-run placeholders (PR #14).
17
+ - Grouped work runs sharing one non-isolated workspace now emit a warning
18
+ with guidance for commit boundaries and persistent worktrees (PR #13).
19
+
20
+ ### Changed
21
+
22
+ - Focused call help (`delegate <engine> call --help`) now reflects
23
+ call-mode option boundaries and documents the grouped-call tracking
24
+ exception (`--cwd` accepted only with `--group`); explicit `agent` input
25
+ is rejected on engines that do not support it (PR #13).
26
+ - Overview, dry-run, agent-help, README, CLI reference, and worktree docs
27
+ corrected from user feedback (PR #13).
28
+
29
+ ### Fixed
30
+
31
+ - Structured Codex workflows consume the child-authored completion report
32
+ (including on resume) and fail closed when it is missing; workflow resume
33
+ transitions atomically to `starting`, hides stale results, rolls back
34
+ failed launches, and releases locks on preparation errors (PR #14).
35
+ - Safe isolation re-roots exact source-workspace paths while preserving
36
+ slash-command payloads verbatim (PR #14).
37
+ - `wait`: a run matched by both `--latest HARNESS` and `--group NAME`
38
+ was emitted twice in the resolved-target list; it now appears once, with
39
+ first-selection precedence and ordering preserved.
40
+ - `git_root_for` degrades any `OSError` from the git probe (not just
41
+ `FileNotFoundError`) to the non-git fallback, so e.g. a `PermissionError`
42
+ spawning git no longer crashes workspace resolution.
43
+
44
+ ### Changed
45
+
46
+ - Internal cleanup pass across `src/` and `tests/`: removed dead code (unused
47
+ protocol types, private helpers, stale fixtures), collapsed redundant
48
+ exception tuples into their `OSError` base, replaced a hand-rolled
49
+ path-containment helper with `Path.is_relative_to`, and stripped stale
50
+ review-artifact comments. Behavior-preserving; the workflow supervisor's
51
+ broad exception boundary around child-model output is now explicitly
52
+ commented and regression-tested.
53
+
54
+ ## [0.13.1] - 2026-07-09
55
+
56
+ ### Added
57
+
58
+ - Codex-only `--fast` / `--no-fast` per-run service-tier overrides (and a
59
+ `fast` boolean in run-input JSON). `--fast` emits `service_tier="fast"` plus
60
+ `features.fast_mode=true` so the tier cannot be silently dropped by ambient
61
+ Codex config; `--no-fast` emits the explicit `service_tier="default"`
62
+ standard-routing sentinel; omitting both inherits Codex configuration. The
63
+ explicit choice is recorded as `requestedFast` in run metadata. The flag and
64
+ JSON key fail closed on every other engine, including a bare `"fast": null`.
65
+
8
66
  ## [0.13.0] - 2026-07-09
9
67
 
10
68
  ### Added
@@ -292,6 +350,8 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
292
350
 
293
351
  - Releases before 0.1.3 predate this changelog.
294
352
 
353
+ [0.14.0]: https://github.com/treygoff24/delegate-agent/compare/v0.13.1...v0.14.0
354
+ [0.13.1]: https://github.com/treygoff24/delegate-agent/compare/v0.13.0...v0.13.1
295
355
  [0.13.0]: https://github.com/treygoff24/delegate-agent/compare/v0.12.0...v0.13.0
296
356
  [0.12.0]: https://github.com/treygoff24/delegate-agent/compare/v0.11.0...v0.12.0
297
357
  [0.11.0]: https://github.com/treygoff24/delegate-agent/compare/v0.10.0...v0.11.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: delegate-agent-cli
3
- Version: 0.13.0
3
+ Version: 0.14.0
4
4
  Summary: A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes.
5
5
  Author: Trey Goff
6
6
  License-Expression: MIT
@@ -221,8 +221,17 @@ run, use stateless `call` mode:
221
221
 
222
222
  ```bash
223
223
  delegate --json codex call "Summarize this context in three bullets."
224
+ delegate --json claude call --pure --timeout 60 --output-schema result.schema.json < prompt.txt
224
225
  ```
225
226
 
227
+ `call --pure` is a hostile-input completion boundary available on Claude only.
228
+ It uses an empty temporary cwd, an allowlisted child environment, no Delegate
229
+ prompt framing, and no session persistence or tools according to the engine
230
+ capability contract. Claude receives the prompt only on stdin and is
231
+ schema-capable via `--output-schema`; `delegate --json describe` reports
232
+ `pureCall`, `structuredOutput`, `noSessionPersistence`, `usageEvents`, and
233
+ `promptStdin` per engine. `--timeout SECONDS` applies to every call-mode engine.
234
+
226
235
  For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
227
236
  is a Python script that launches normal Delegate child runs, journals progress,
228
237
  can pause on approval gates, and can resume from cached child results:
@@ -243,6 +252,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
243
252
  delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
244
253
  ```
245
254
 
255
+ Codex model routing is deliberately model-first rather than aliasing every
256
+ model/effort pair: define model aliases in `codex.models`, then set effort per
257
+ run with `--reasoning-effort`. Per-model effort menus (including any efforts
258
+ newer than the bundled data) belong in the private `reasoning.capabilities`
259
+ config block, which overrides the bundled defaults.
260
+
261
+ Fast mode is an independent per-run serving choice. `--fast` requests Codex's
262
+ Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
263
+ inherits the active Codex configuration:
264
+
265
+ ```bash
266
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
267
+ delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
268
+ ```
269
+
246
270
  Inspect tracked output by alias:
247
271
 
248
272
  ```bash
@@ -279,6 +303,9 @@ cancelled, and `124` on timeout. `cancel` signals the run's process group
279
303
  start-identity check against PID reuse; a cancelled run reports `cancelled`
280
304
  rather than a false success. Tag a batch of launches with `--group NAME` and
281
305
  `wait`, `runs`, and the worktree commands can select the whole group at once.
306
+ Commit between grouped feature waves that edit the same workspace. If features
307
+ need separate review or commits, give each a persistent worktree and integrate
308
+ them separately; `wait --group` warns about shared non-isolated workspaces.
282
309
 
283
310
  ## Task design: cluster related work into fewer, richer delegations
284
311
 
@@ -188,8 +188,17 @@ run, use stateless `call` mode:
188
188
 
189
189
  ```bash
190
190
  delegate --json codex call "Summarize this context in three bullets."
191
+ delegate --json claude call --pure --timeout 60 --output-schema result.schema.json < prompt.txt
191
192
  ```
192
193
 
194
+ `call --pure` is a hostile-input completion boundary available on Claude only.
195
+ It uses an empty temporary cwd, an allowlisted child environment, no Delegate
196
+ prompt framing, and no session persistence or tools according to the engine
197
+ capability contract. Claude receives the prompt only on stdin and is
198
+ schema-capable via `--output-schema`; `delegate --json describe` reports
199
+ `pureCall`, `structuredOutput`, `noSessionPersistence`, `usageEvents`, and
200
+ `promptStdin` per engine. `--timeout SECONDS` applies to every call-mode engine.
201
+
193
202
  For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
194
203
  is a Python script that launches normal Delegate child runs, journals progress,
195
204
  can pause on approval gates, and can resume from cached child results:
@@ -210,6 +219,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
210
219
  delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
211
220
  ```
212
221
 
222
+ Codex model routing is deliberately model-first rather than aliasing every
223
+ model/effort pair: define model aliases in `codex.models`, then set effort per
224
+ run with `--reasoning-effort`. Per-model effort menus (including any efforts
225
+ newer than the bundled data) belong in the private `reasoning.capabilities`
226
+ config block, which overrides the bundled defaults.
227
+
228
+ Fast mode is an independent per-run serving choice. `--fast` requests Codex's
229
+ Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
230
+ inherits the active Codex configuration:
231
+
232
+ ```bash
233
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
234
+ delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
235
+ ```
236
+
213
237
  Inspect tracked output by alias:
214
238
 
215
239
  ```bash
@@ -246,6 +270,9 @@ cancelled, and `124` on timeout. `cancel` signals the run's process group
246
270
  start-identity check against PID reuse; a cancelled run reports `cancelled`
247
271
  rather than a false success. Tag a batch of launches with `--group NAME` and
248
272
  `wait`, `runs`, and the worktree commands can select the whole group at once.
273
+ Commit between grouped feature waves that edit the same workspace. If features
274
+ need separate review or commits, give each a persistent worktree and integrate
275
+ them separately; `wait --group` warns about shared non-isolated workspaces.
249
276
 
250
277
  ## Task design: cluster related work into fewer, richer delegations
251
278
 
@@ -28,9 +28,9 @@ delegate droid [MODEL_ALIAS] safe [--model <alias-or-model>] [--reasoning-effort
28
28
  delegate droid [MODEL_ALIAS] work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
29
29
  delegate droid [MODEL_ALIAS] call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
30
30
 
31
- delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
32
- delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
33
- delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [--output-schema FILE] [prompt...]
31
+ delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
32
+ delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
33
+ delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--prompt-file PATH] [--output-schema FILE] [prompt...]
34
34
 
35
35
  delegate claude safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
36
36
  delegate claude work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
@@ -57,6 +57,13 @@ positional prompt input, and Kimi Code prompt mode currently uses `--prompt`,
57
57
  so those launches still use argv transport; Delegate redacts Cursor and Kimi
58
58
  prompt argv in dry-run output and run manifests.
59
59
 
60
+ Temporary safe isolation also re-roots absolute paths under the source workspace
61
+ when it transports the prompt, so `/source/repo/src/app.py` becomes the matching
62
+ path inside the isolated copy. Paths outside the workspace and prefix lookalikes
63
+ are left unchanged. The safe prompt asks the child to cite workspace-relative
64
+ paths in its report; consumers should not depend on temporary isolation paths.
65
+ Verbatim slash pass-through prompts are not rewritten.
66
+
60
67
  For launch and `dry-run` commands, `--json` and `--isolation auto|none|worktree`
61
68
  are unambiguous before inline prompt text starts and may appear with launch
62
69
  options, such as `delegate codex work --prompt-file task.md --json` or
@@ -77,6 +84,8 @@ engines report live unsupported).
77
84
 
78
85
  `--reasoning-effort LEVEL` is optional and parsed only before prompt text begins. Engines with capability metadata reject unsupported model/effort pairs before launch with `unsupported_reasoning_effort`. It affects only model reasoning depth, cost, or latency; it does not change `safe`/`work`/`call` permissions, sandboxing, approvals, network policy, or edit capability. Cursor effort is model-selection based and requires `cursor.reasoningEffortModels`; an explicit `--model` wins over effort→model routing. Droid emits `--reasoning-effort LEVEL`; Codex emits a `model_reasoning_effort` config override for the resolved model, or for the Codex harness default model when no `codex.defaultModel` is configured and the request was explicit; Claude emits Claude Code `--effort LEVEL`; Grok emits Grok `--effort LEVEL` (`low`, `medium`, `high`, `xhigh`, `max`); OpenCode emits `--variant LEVEL` without validating it against the selected model. Kimi does not support reasoning effort in v1.
79
86
 
87
+ `--fast` and `--no-fast` are Codex-only, mutually exclusive per-run service-tier overrides. `--fast` emits `service_tier="fast"` plus `features.fast_mode=true` (Codex silently drops a Fast tier when that feature flag is off in the ambient config, so Delegate enables it explicitly); `--no-fast` emits `service_tier="default"` so a globally enabled Fast setting can be turned off for one child. Omitting both emits no override and inherits Codex configuration. Fast is orthogonal to model selection, reasoning effort, and Delegate safety policy. Two upstream caveats: Codex strips the service tier when authenticated with an API key (Fast is a ChatGPT-plan feature), and neither Codex nor the API fails on a tier the model does not offer — Delegate's flag validation is the only fail-closed layer, so an unsupported combination degrades silently to standard routing rather than erroring.
88
+
80
89
  `--progress` enables parent progress heartbeats on stderr for tracked foreground
81
90
  runs. `--no-progress` disables them even when `progress.enabled` is true in
82
91
  config. When neither flag is set, config `progress.enabled` applies (default
@@ -123,6 +132,11 @@ A few boundaries are worth stating explicitly:
123
132
  create an orchestration manifest; it only enables selectors such as
124
133
  `delegate runs --group NAME`, `delegate wait --group NAME`, and worktree
125
134
  management filters. Group names must match `[A-Za-z0-9._-]{1,64}`.
135
+ If grouped feature waves run in the same non-isolated workspace, commit between
136
+ waves so later edits do not become interleaved with earlier work. When features
137
+ need separate review or commits, launch each in a persistent worktree and
138
+ integrate them separately; `wait --group` warns when it sees shared same-tree
139
+ work runs.
126
140
 
127
141
  `--auth-profile NAME` selects a top-level `profiles.definitions` entry and
128
142
  injects that profile's flat env map into child processes. It overrides ambient
@@ -137,13 +151,15 @@ auth/env selection happens.
137
151
  Usage:
138
152
 
139
153
  ```bash
140
- delegate [--json] [--isolation auto|none|worktree] codex {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
154
+ delegate [--json] [--isolation auto|none|worktree] codex {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
155
+ delegate [--json] codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--prompt-file PATH] [--output-schema FILE] [prompt...]
141
156
  ```
142
157
 
143
158
  - Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Codex safe always uses `--sandbox read-only`. Under `--isolation auto`, Codex safe is the only safe harness that may opt out with `--isolation none`, because Codex still keeps its read-only sandbox active.
144
159
  - Prompt text is delivered on stdin to `codex exec`; dry-run argv and tracked run manifests do not contain the prompt.
145
160
  - Model selection uses `--model` (alias from `codex.models` or a raw model ID), the run-input JSON `model`, or `codex.defaultModel`.
146
161
  - `--reasoning-effort` maps to a Codex `model_reasoning_effort` config override after the model is resolved.
162
+ - `--fast` requests Codex Fast for one run; `--no-fast` explicitly requests Standard; omission inherits Codex configuration. The selected tier is recorded as `requestedFast` when explicit.
147
163
  - `--output-schema FILE` is **codex-only**. Every other engine rejects it. `FILE` is a path to a JSON Schema that OpenAI enforces on Codex's final message, for machine-parseable output in fan-outs and JSON run input. Relative paths resolve against the process launch cwd, the same rule as `--prompt-file`. When set, Delegate suppresses the completion-report prompt injection for that run so the schema owns the whole final message. Missing or unreadable files fail fast before launch.
148
164
 
149
165
  Examples:
@@ -151,6 +167,7 @@ Examples:
151
167
  ```bash
152
168
  delegate codex safe "Review this repo for regressions; report file/line/severity."
153
169
  delegate codex safe --model gpt-5.5 "Review this repo for regressions; report file/line/severity."
170
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
154
171
  delegate codex work "Implement the scoped task; report changed files and tests."
155
172
  delegate codex call "Summarize this context in three bullets."
156
173
  delegate --json codex safe --output-schema findings.schema.json "Return one record per finding."
@@ -162,7 +179,8 @@ delegate --isolation worktree codex work "Implement the feature in a persistent
162
179
  Usage:
163
180
 
164
181
  ```bash
165
- delegate [--json] [--isolation auto|none|worktree] claude {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
182
+ delegate [--json] [--isolation auto|none|worktree] claude {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
183
+ delegate [--json] claude call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
166
184
  ```
167
185
 
168
186
  - Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Under `--isolation auto`, Claude safe uses `--permission-mode plan`, `--strict-mcp-config`, Read/Grep/Glob, and selected read-only Bash tools such as `git diff`/`git status`.
@@ -187,7 +205,8 @@ delegate --isolation worktree claude work "Implement the feature in a persistent
187
205
  Usage:
188
206
 
189
207
  ```bash
190
- delegate [--json] [--isolation auto|none|worktree] grok {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
208
+ delegate [--json] [--isolation auto|none|worktree] grok {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
209
+ delegate [--json] grok call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
191
210
  ```
192
211
 
193
212
  - Safe mode reviews your **current working tree** in an isolated throwaway copy plus Grok read-only controls (`--sandbox read-only`, `--permission-mode dontAsk` by default). Delegate does not use Grok `plan` mode for safe review.
@@ -270,7 +289,8 @@ delegate --isolation worktree opencode work "Implement the feature in a persiste
270
289
  Usage:
271
290
 
272
291
  ```bash
273
- delegate [--json] [--isolation auto|none|worktree] kimi {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
292
+ delegate [--json] [--isolation auto|none|worktree] kimi {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
293
+ delegate [--json] kimi call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
274
294
  ```
275
295
 
276
296
  - Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Under `--isolation auto`, Kimi safe uses a read-only safety prompt. Delegate intentionally avoids Kimi `--plan` in safe mode. Kimi prompt mode auto-approves tool actions, so the isolation is the effective write boundary; the safety prompt is advisory.
@@ -304,8 +324,8 @@ delegate [--json] workflow run --resume <wfId> [--budget N]
304
324
  delegate [--json] workflow status <wfId>
305
325
  delegate [--json] workflow events <wfId> [--since SEQ]
306
326
  delegate [--json] workflow watch <wfId> [--since SEQ]
307
- delegate [--json] workflow wait <wfId> [--timeout SEC]
308
- delegate [--json] workflow result <wfId>
327
+ delegate [--json] workflow wait [<wfId>] [--timeout SEC]
328
+ delegate [--json] workflow result [<wfId>] [--field KEY]
309
329
  delegate [--json] workflow approve <wfId>
310
330
  delegate [--json] workflow kill <wfId>
311
331
  delegate [--json] workflow list
@@ -315,9 +335,18 @@ delegate [--json] workflow save <script.py> --name NAME
315
335
  - `check` validates the workflow script, including literal preflight checks for
316
336
  unsupported `agent()` combinations.
317
337
  - `run` launches a detached supervisor; `--dry-run` renders planned stubs
318
- without launching child agents or consuming real budget.
338
+ without launching child agents or consuming real budget. Each entry in
339
+ `runTree.calls` includes the resolved `model`, `effort`, `fast`, `isolation`,
340
+ and UTF-8 `promptBytes`; Cursor/Kimi prompts over 102400 bytes add a warning
341
+ before their argv transport limit can fail a real run.
319
342
  - `--resume` replays the journal, adopts matching child runs by workflow agent
320
343
  key, and continues from missing work.
344
+ - `wait` and `result` accept an explicit workflow ID or, when omitted, resolve
345
+ the latest eligible workflow. JSON output for implicit selection includes the
346
+ selected `wfId` and `resolutionKind: "latest"`.
347
+ - `result --field KEY` extracts a top-level field from an object result. Text
348
+ mode prints strings directly and JSON-encodes other values; JSON mode returns
349
+ a field/value envelope.
321
350
  - `approve` releases a paused gate (and resumes). Do not also run
322
351
  `run --resume` for the same gate — approve already is that resume. `kill`
323
352
  validates the supervisor process group before signaling and always attempts
@@ -336,6 +365,7 @@ Codes raised as `DelegateError` from workflow commands (`workflows/commands.py`)
336
365
  | `invalid_workflow_name` | Saved-workflow `--name` is not a simple file stem. |
337
366
  | `invalid_workflow_script` | Script failed `check` / load validation. |
338
367
  | `missing_workflow` | A verb that needs `<wfId>` was invoked without one. |
368
+ | `missing_workflow_result_field` | `result --field` was invoked without a key. |
339
369
  | `missing_workflow_save_args` | `save` needs both `<script.py>` and `--name`. |
340
370
  | `missing_workflow_script` | `run`/`check` need `<script.py>` or `--name`. |
341
371
  | `unknown_workflow_action` | Unrecognized `workflow` subcommand. |
@@ -344,6 +374,8 @@ Codes raised as `DelegateError` from workflow commands (`workflows/commands.py`)
344
374
  | `workflow_not_found` | No workflow directory / status for that `wfId`. |
345
375
  | `workflow_not_gated` | `approve` on a workflow that is not paused on a gate. |
346
376
  | `workflow_result_missing` | `result` before `result.json` exists. |
377
+ | `workflow_result_field_missing` | The requested top-level result field does not exist. |
378
+ | `workflow_result_not_object` | `--field` was requested for a non-object result. |
347
379
  | `workflow_script_not_found` | Resolved script path is missing or not a file. |
348
380
 
349
381
  See [Delegate Workflows](delegate-workflows.md) for the DSL, caps, config, and
@@ -352,24 +384,26 @@ gate semantics.
352
384
  ### Stateless `call` mode
353
385
 
354
386
  `call` is the one-hop model-call form of Delegate: "work mode minus a repo." It
355
- gives a child runtime a prompt with no project tree to resolve, captures the
356
- final assistant text, and exits without creating a tracked run so you can call
357
- a model to *do something* (or to *judge something*) from anywhere, including a
358
- non-git directory.
387
+ gives a child runtime a prompt with no project tree to resolve and captures the
388
+ final assistant text, so you can call a model to *do something* (or to *judge
389
+ something*) from anywhere, including a non-git directory. Calls are untracked
390
+ by default; grouped calls are the narrow exception described below.
359
391
 
360
392
  ```bash
361
393
  delegate codex call "Write a Python script that finds the 500th prime and run it."
362
394
  delegate --json grok call --read-only --prompt-file rubric.md
363
395
  delegate --json codex call --read-only --output-schema verdict.json --prompt-file rubric.md
396
+ delegate --json claude call --pure --timeout 60 --output-schema verdict.json < rubric.md
364
397
  ```
365
398
 
366
399
  Call mode uses an empty temporary cwd instead of resolving the current repo, and
367
- it deletes that cwd after the child exits. It does not write `.delegate/runs`,
368
- create snapshots, inject safe/work skill or completion-report framing, emit
369
- progress heartbeats, or honor persistent worktree/commit policy options. JSON
400
+ it deletes that cwd after the child exits. It does not create snapshots, inject
401
+ safe/work skill or completion-report framing, emit progress heartbeats, or honor
402
+ persistent worktree/commit policy options. JSON
370
403
  output returns fields such as `ok`, `status`, `exitCode`, `engine`, `mode`,
371
- `model`, `text`, `textChars`, `textTruncated`, `stdoutBytes`, `stderrBytes`,
372
- reasoning metadata, and `warnings`. Failed calls include a redacted `stderrTail`.
404
+ `model`, `pure`, `structuredOutput`, `modelRequested`, `modelResolved`, `usage`,
405
+ `text`, `textChars`, `textTruncated`, `stdoutBytes`, `stderrBytes`, reasoning
406
+ metadata, and `warnings`. Failed calls include a redacted `stderrTail`.
373
407
  `textTruncated` is `true` when the returned
374
408
  `text` was bounded (large outputs keep the head and tail); `textChars` is the
375
409
  full untruncated character count.
@@ -388,11 +422,38 @@ changed files…" on a repo-flavored prompt. Pair it with `--output-schema` (Cod
388
422
  for structured verdicts. Use `--read-only` for any LLM-as-judge, grader, or
389
423
  oracle use where the text is the product and the model must not act.
390
424
 
391
- `--read-only` applies only to `call`; passing it with `safe`/`work` is rejected.
392
- Because call mode is stateless, `--cwd`, `--isolation`, `--pass-through`,
425
+ **`--pure` is the hostile-content completion boundary.** It is supported by
426
+ Claude only; other engines fail before launch with `unsupported_pure_call`. Pure
427
+ mode sends the prompt verbatim, drops ambient
428
+ environment variables outside the documented allowlist, and cannot be combined
429
+ with `--read-only`. Claude uses `--safe-mode`, disables every tool, ignores MCP
430
+ and ambient customization, disables session persistence, and receives the prompt
431
+ only on stdin. Use `--output-schema FILE` with Claude (schema contents inline)
432
+ or with ordinary Codex call mode (schema path).
433
+
434
+ `--timeout SECONDS` is a positive integer available on every call-mode engine.
435
+ On expiry Delegate terminates the whole child process group and returns
436
+ `call_timeout` with exit code 1.
437
+
438
+ `--read-only`, `--pure`, and `--timeout` apply only to `call`; passing them with
439
+ `safe`/`work` is rejected.
440
+ Because the child call is stateless, `--isolation`, `--pass-through`,
393
441
  `--progress`, `--forbid-commit`, and markdown completion reports are rejected.
394
- Use `safe` or `work` when the child should see the project tree or when you need
395
- run registry inspection.
442
+ An ordinary call also rejects `--cwd`.
443
+
444
+ **Grouped calls preserve workflow tracking without exposing the workspace to the
445
+ child.** `--group NAME` registers the call in the invocation workspace so
446
+ workflow kill/adopt and group selectors can find it. In that one combination,
447
+ `--cwd PATH` may select the registry/config workspace:
448
+
449
+ ```bash
450
+ delegate --cwd /path/to/project --group wf_0123abcdef45 codex call "Summarize this input."
451
+ ```
452
+
453
+ The child still executes in an empty temporary cwd; `--cwd` does not give it the
454
+ project tree. Dry-run accepts the same combination for faithful planning but
455
+ creates no run entry. Use `safe` or `work` when the child should see the project
456
+ tree.
396
457
 
397
458
  ### Dry-run
398
459
 
@@ -513,6 +574,7 @@ Supported input keys:
513
574
  "cwd": "/path/to/workspace",
514
575
  "isolation": "worktree",
515
576
  "reasoningEffort": "high",
577
+ "fast": false,
516
578
  "progress": true,
517
579
  "forbidCommit": true,
518
580
  "includeDirty": true,
@@ -527,10 +589,11 @@ Supported input keys:
527
589
  - `cwd`: optional workspace path. Git directories resolve to the repo root. Omit it for `mode: "call"`, which always uses an empty temporary cwd.
528
590
  - `isolation`: optional `auto`, `none`, or `worktree`. `null` is invalid. `mode: "call"` rejects isolation. For Cursor, Claude, Grok, Devin, OpenCode, Droid, and Kimi safe mode, `none` is normalized to `auto` with a warning.
529
591
  - `reasoningEffort`: optional non-empty effort string. It overrides provider `defaultReasoningEffort` for that JSON run.
592
+ - `fast`: optional Codex-only boolean or `null`. `true` requests Fast, `false` explicitly requests Standard, and `null`/omission inherits Codex configuration.
530
593
  - `progress`: optional boolean. `true` enables parent progress heartbeats on stderr; `false` disables them even when `progress.enabled` is true in config. When omitted, config `progress.enabled` applies (default `false`). `mode: "call"` rejects progress.
531
594
  - `forbidCommit`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and fails the run if the child creates commits. `mode: "call"` rejects commit policy.
532
595
  - `includeDirty`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and syncs tracked edits plus untracked non-ignored files into the new worktree before launch.
533
- - `outputSchema`: optional path to a JSON Schema for Codex's final message. Codex-only; same semantics as `--output-schema`. Other engines fail with `unsupported_output_schema`.
596
+ - `outputSchema`: optional path to a JSON Schema for the final message. Supported for Codex and Claude call mode (same semantics as `--output-schema`). Other engines fail with `unsupported_output_schema`.
534
597
  - `prompt`: required task prompt.
535
598
 
536
599
  `profile` is not accepted in run input JSON. Configure the Codex CLI config
@@ -728,7 +791,8 @@ signals the recorded process group with SIGTERM, waits a 5s grace period, then
728
791
  uses SIGKILL if needed. It never signals pid/pgid `<= 1`. Legacy runs without a
729
792
  recorded pgid fall back to the recorded pid with a warning. Cancel marks the run
730
793
  `cancelled` with `failureReason: cancelled_by_user` and records current captured
731
- stdout/stderr byte counts. `call` mode is untracked and therefore not cancellable.
794
+ stdout/stderr byte counts. Ungrouped `call` mode is untracked; grouped calls are
795
+ registered and can be selected for cancellation.
732
796
 
733
797
  Before sending any signal, cancel stamps a `cancelRequested: true` marker (with
734
798
  a `cancelRequestedAt` timestamp) on the run state under the registry lock, so
@@ -138,6 +138,11 @@ layers. This is read-only observability; inspecting it does not modify
138
138
 
139
139
  Reasoning-effort settings are optional. A per-run `--reasoning-effort LEVEL` or JSON `reasoningEffort` overrides provider defaults. If no effort is requested or defaulted, Delegate emits no reasoning-effort argv and preserves current runtime behavior.
140
140
 
141
+ Codex Fast is intentionally not a Delegate config default. Use per-run
142
+ `--fast`, `--no-fast`, or JSON `fast`; omission inherits the active Codex CLI
143
+ configuration. This keeps speed selection independent from model aliases and
144
+ reasoning defaults.
145
+
141
146
  ## Sections
142
147
 
143
148
  ### `tracking`
@@ -100,6 +100,35 @@ you need registry inspection.
100
100
  OpenCode `call --read-only` uses the same protected environment settings and
101
101
  `--pure` plugin restriction as OpenCode safe mode.
102
102
 
103
+ `call --pure` is a separate, stronger completion boundary. It is currently
104
+ supported on **Claude only**. Delegate sends the prompt verbatim on stdin, starts
105
+ the child in an empty temporary cwd, and builds the child environment from only
106
+ `PATH`, `HOME`, `USER`, `LOGNAME`, `SHELL`, `TMPDIR`, `LANG`, `LC_ALL`, `LC_CTYPE`,
107
+ and `TERM`, then applies trusted Delegate profile overrides. Claude additionally
108
+ uses `--safe-mode --tools "" --strict-mcp-config --no-session-persistence`, and the
109
+ result must carry an empty `permission_denials` list — a missing, null, or
110
+ non-empty value fails the call closed (`pure_boundary_unverified` /
111
+ `pure_boundary_violation`) rather than reporting success.
112
+
113
+ Codex and OpenCode are **not** pure-eligible; `<engine> call --pure` is rejected
114
+ before launch (`unsupported_pure_call`). They were disabled after review:
115
+
116
+ - **Codex** would need external OS confinement (a macOS Seatbelt profile) because
117
+ it stays a tool-using agent. The prototype handed the child an ephemeral
118
+ `CODEX_HOME` holding the resolved `auth.json`, but a single inherited Seatbelt
119
+ profile cannot distinguish a read by the Codex parent from a read by a
120
+ model-driven subprocess, so the credential was reachable inside the boundary it
121
+ was meant to protect. A credential transport the parent can use but model tools
122
+ cannot read is required before Codex pure is re-enabled. `sandbox-exec` is also
123
+ deprecated on macOS and would never cover other platforms.
124
+ - **OpenCode**'s native `--pure` only disables external plugins; it offers no
125
+ session non-persistence, no schema output, and no denial tripwire, so it does
126
+ not meet the hostile-input contract.
127
+
128
+ Fail-closed eligibility is intentional: an engine without a verified boundary
129
+ rejects `--pure` rather than presenting a weaker one under the same name. The
130
+ supported pure matrix may contain only Claude for some time.
131
+
103
132
  ## Reasoning-effort boundary
104
133
 
105
134
  `--reasoning-effort LEVEL` and JSON `reasoningEffort` request model thinking depth only. They do not change:
@@ -118,6 +147,14 @@ combinations before launch. OpenCode is the exception: Delegate passes the value
118
147
  through as `--variant`, and OpenCode may silently ignore an unknown variant.
119
148
  Treat higher effort as a possible latency/cost change, not as a safety control.
120
149
 
150
+ ## Codex Fast boundary
151
+
152
+ `--fast`, `--no-fast`, and JSON `fast` select a Codex service tier for one run.
153
+ They do not change the selected model, reasoning effort, sandbox, approvals,
154
+ isolation, network policy, credentials, or edit capability. Fast may consume
155
+ plan usage at a different rate; treat it as a latency/usage choice, never a
156
+ security control.
157
+
121
158
  ## Isolation boundaries
122
159
 
123
160
  ### Temporary safe isolation
@@ -12,6 +12,10 @@ Use persistent worktree isolation when:
12
12
 
13
13
  Use the real workspace instead when the task depends on uncommitted local files that you do not want to commit or mirror into a worktree. If you do want a persistent worktree that starts from your current dirty checkout, use `--include-dirty`.
14
14
 
15
+ For grouped feature waves, commit between waves when they share the real
16
+ workspace. If each feature needs its own review or commit, use one persistent
17
+ worktree per feature and integrate those worktrees separately.
18
+
15
19
  ## Launch
16
20
 
17
21
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "delegate-agent-cli"
7
- version = "0.13.0"
7
+ version = "0.14.0"
8
8
  description = "A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,5 +1,5 @@
1
1
  """Delegate Agent CLI package."""
2
2
 
3
- VERSION = "0.13.0"
3
+ VERSION = "0.14.0"
4
4
 
5
5
  __all__ = ["VERSION"]