delegate-agent-cli 0.29.1__tar.gz → 0.31.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 (279) hide show
  1. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/CHANGELOG.md +400 -4
  2. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/CONTRIBUTING.md +3 -3
  3. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/MANIFEST.in +1 -0
  4. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/PKG-INFO +70 -21
  5. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/README.md +67 -20
  6. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/bin/delegate-profile-shim +3 -3
  7. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/config.example.json +7 -1
  8. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/agent-setup.md +13 -3
  9. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/cli-reference.md +305 -94
  10. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/configuration.md +218 -18
  11. delegate_agent_cli-0.31.0/docs/delegate-workflows.md +391 -0
  12. delegate_agent_cli-0.31.0/docs/development.md +95 -0
  13. delegate_agent_cli-0.31.0/docs/live-runtime.md +156 -0
  14. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/publishing-checklist.md +29 -1
  15. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/security-model.md +133 -12
  16. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/troubleshooting.md +96 -29
  17. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/worktrees.md +61 -2
  18. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/pyproject.toml +3 -1
  19. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/__init__.py +1 -1
  20. delegate_agent_cli-0.31.0/src/delegate_agent/account_binding.py +88 -0
  21. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/argv_builders.py +163 -81
  22. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/argv_utils.py +2 -0
  23. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/bundled_models.py +10 -5
  24. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/capability_commands.py +64 -1
  25. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/child_failures.py +40 -0
  26. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/cli.py +656 -434
  27. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/cli_parser.py +804 -248
  28. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/command_help.py +471 -237
  29. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/config.py +385 -17
  30. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/constants.py +53 -1
  31. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/describe_payload.py +176 -172
  32. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/errors.py +12 -0
  33. delegate_agent_cli-0.31.0/src/delegate_agent/followup_command.py +444 -0
  34. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/harness_discovery.py +349 -60
  35. delegate_agent_cli-0.31.0/src/delegate_agent/harness_events.py +2143 -0
  36. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/inspection_commands.py +9 -6
  37. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/isolation.py +73 -1
  38. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail.py +61 -12
  39. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail_core.py +36 -71
  40. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail_push.py +22 -10
  41. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/model_discovery.py +0 -20
  42. delegate_agent_cli-0.31.0/src/delegate_agent/notify.py +200 -0
  43. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/private_io.py +183 -38
  44. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/profile_guard.py +6 -8
  45. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/profiles.py +67 -0
  46. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/prompt_transport.py +4 -4
  47. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/reasoning.py +47 -24
  48. delegate_agent_cli-0.31.0/src/delegate_agent/record_io.py +244 -0
  49. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/redaction.py +88 -3
  50. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/rendering.py +21 -0
  51. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/request_build.py +969 -417
  52. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/request_models.py +114 -73
  53. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/resume_command.py +62 -60
  54. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/retention.py +42 -3
  55. delegate_agent_cli-0.31.0/src/delegate_agent/run_context.py +115 -0
  56. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_metadata.py +76 -1
  57. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_output_commands.py +99 -2
  58. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_registry.py +443 -169
  59. delegate_agent_cli-0.31.0/src/delegate_agent/run_scratch.py +229 -0
  60. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_status.py +132 -42
  61. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/runner.py +1716 -351
  62. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/safe_workspace.py +316 -27
  63. delegate_agent_cli-0.31.0/src/delegate_agent/sandbox_bwrap.py +606 -0
  64. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/snapshot_view.py +56 -99
  65. delegate_agent_cli-0.31.0/src/delegate_agent/stall_watchdog.py +607 -0
  66. delegate_agent_cli-0.31.0/src/delegate_agent/stream_capture.py +179 -0
  67. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/structured_output.py +36 -0
  68. delegate_agent_cli-0.31.0/src/delegate_agent/terminal_states.py +63 -0
  69. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/wait_cancel_commands.py +93 -36
  70. delegate_agent_cli-0.31.0/src/delegate_agent/workflow_attempts.py +271 -0
  71. delegate_agent_cli-0.31.0/src/delegate_agent/workflow_identity.py +123 -0
  72. delegate_agent_cli-0.31.0/src/delegate_agent/workflow_pinning.py +1075 -0
  73. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/workflows/__init__.py +1 -0
  74. delegate_agent_cli-0.31.0/src/delegate_agent/workflows/commands.py +1382 -0
  75. delegate_agent_cli-0.31.0/src/delegate_agent/workflows/registry.py +408 -0
  76. delegate_agent_cli-0.31.0/src/delegate_agent/workflows/runtime.py +5265 -0
  77. delegate_agent_cli-0.31.0/src/delegate_agent/workflows/schema.py +306 -0
  78. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/workflows/script.py +110 -15
  79. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_commands.py +29 -7
  80. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_execution.py +84 -104
  81. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_gc.py +602 -61
  82. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_mgmt.py +595 -67
  83. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_records.py +124 -4
  84. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_remove.py +75 -196
  85. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_summary.py +104 -5
  86. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/PKG-INFO +70 -21
  87. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +71 -0
  88. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/requires.txt +2 -0
  89. delegate_agent_cli-0.31.0/tests/test_acceptance_toolchain.py +141 -0
  90. delegate_agent_cli-0.31.0/tests/test_account_binding.py +99 -0
  91. delegate_agent_cli-0.31.0/tests/test_bundled_models_lane_r.py +43 -0
  92. delegate_agent_cli-0.31.0/tests/test_call_capture_contract.py +44 -0
  93. delegate_agent_cli-0.31.0/tests/test_cancel_terminal_override.py +216 -0
  94. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_capability_commands.py +146 -2
  95. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_child_failures.py +19 -0
  96. delegate_agent_cli-0.31.0/tests/test_cli_simplification.py +247 -0
  97. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_codex_pure_sandbox.py +8 -4
  98. delegate_agent_cli-0.31.0/tests/test_codex_scratch.py +557 -0
  99. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_codex_thread_resilience.py +19 -12
  100. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_command_help.py +138 -26
  101. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_config_commands.py +37 -21
  102. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_delegate_help_cli.py +147 -109
  103. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_delegate_parser.py +781 -550
  104. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_delegate_validation.py +634 -114
  105. delegate_agent_cli-0.31.0/tests/test_describe_models_binary.py +66 -0
  106. delegate_agent_cli-0.31.0/tests/test_devin_read_only_behavior.py +130 -0
  107. delegate_agent_cli-0.31.0/tests/test_discovery_contracts.py +191 -0
  108. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_end_to_end_tracking.py +21 -11
  109. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_engine_argv.py +772 -354
  110. delegate_agent_cli-0.31.0/tests/test_engine_universe.py +35 -0
  111. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_execution_argv_and_prompt.py +518 -204
  112. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_execution_dry_run.py +62 -59
  113. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_failure_cleanup.py +89 -84
  114. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_preflight.py +32 -25
  115. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_run.py +210 -134
  116. delegate_agent_cli-0.31.0/tests/test_followup_after_retry_e2e.py +224 -0
  117. delegate_agent_cli-0.31.0/tests/test_followup_capture.py +285 -0
  118. delegate_agent_cli-0.31.0/tests/test_followup_parser.py +130 -0
  119. delegate_agent_cli-0.31.0/tests/test_followup_refusals.py +255 -0
  120. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_harness_discovery.py +366 -11
  121. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_harness_events.py +1275 -23
  122. delegate_agent_cli-0.31.0/tests/test_harness_json_limits.py +34 -0
  123. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_inspection_commands.py +27 -0
  124. delegate_agent_cli-0.31.0/tests/test_isolation_plans.py +95 -0
  125. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_kimi_commands.py +36 -10
  126. delegate_agent_cli-0.31.0/tests/test_lane_a_transport.py +927 -0
  127. delegate_agent_cli-0.31.0/tests/test_lane_b_lifecycle.py +73 -0
  128. delegate_agent_cli-0.31.0/tests/test_lane_m_mail_defaults.py +220 -0
  129. delegate_agent_cli-0.31.0/tests/test_lane_r_public_surface.py +86 -0
  130. delegate_agent_cli-0.31.0/tests/test_lane_s_structured_retry.py +121 -0
  131. delegate_agent_cli-0.31.0/tests/test_launch_input_parity.py +543 -0
  132. delegate_agent_cli-0.31.0/tests/test_launch_mapping.py +370 -0
  133. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_bounds.py +28 -0
  134. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_contract.py +8 -1
  135. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_eligibility.py +2 -4
  136. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_gating.py +167 -44
  137. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_identity.py +5 -6
  138. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_parser.py +10 -9
  139. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push.py +9 -11
  140. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push_adapters.py +25 -7
  141. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push_gating.py +2 -2
  142. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push_seams.py +41 -21
  143. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_reply.py +2 -4
  144. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_resolution.py +2 -4
  145. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_rules.py +2 -4
  146. delegate_agent_cli-0.31.0/tests/test_mail_tempdir.py +75 -0
  147. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_model_discovery.py +23 -47
  148. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_model_selection_wave1a.py +28 -33
  149. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_model_selection_wave1b.py +144 -146
  150. delegate_agent_cli-0.31.0/tests/test_nested_workflow_threads.py +249 -0
  151. delegate_agent_cli-0.31.0/tests/test_notify.py +440 -0
  152. delegate_agent_cli-0.31.0/tests/test_omp_output_capture.py +289 -0
  153. delegate_agent_cli-0.31.0/tests/test_omp_read_only_behavior.py +213 -0
  154. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_capability.py +18 -37
  155. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_claude.py +11 -6
  156. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_contract.py +17 -1
  157. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_framer.py +19 -7
  158. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_opencode.py +3 -3
  159. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_parser.py +32 -13
  160. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_records.py +5 -2
  161. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_resolution.py +7 -6
  162. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_size_guard.py +21 -12
  163. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_workflow.py +10 -5
  164. delegate_agent_cli-0.31.0/tests/test_private_directory_publish.py +75 -0
  165. delegate_agent_cli-0.31.0/tests/test_private_io_bounded.py +177 -0
  166. delegate_agent_cli-0.31.0/tests/test_proc_harness.py +196 -0
  167. delegate_agent_cli-0.31.0/tests/test_process_guard.py +42 -0
  168. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_profiles.py +51 -38
  169. delegate_agent_cli-0.31.0/tests/test_provider_outcomes.py +422 -0
  170. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_pure_call.py +156 -67
  171. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_reasoning_capabilities.py +128 -47
  172. delegate_agent_cli-0.31.0/tests/test_registry_contention.py +145 -0
  173. delegate_agent_cli-0.31.0/tests/test_registry_lock_guard.py +85 -0
  174. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_attachment.py +62 -68
  175. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_capture.py +41 -1
  176. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_inheritance.py +86 -25
  177. delegate_agent_cli-0.31.0/tests/test_resume_parser.py +89 -0
  178. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_projections.py +1 -1
  179. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_refusals.py +8 -1
  180. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_size_guard.py +13 -11
  181. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_stale.py +25 -19
  182. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_resume_trust.py +55 -18
  183. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_retention.py +356 -14
  184. delegate_agent_cli-0.31.0/tests/test_run_listing_cost.py +98 -0
  185. delegate_agent_cli-0.31.0/tests/test_run_record_imports.py +46 -0
  186. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_run_registry.py +374 -6
  187. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_runner_capture.py +1337 -63
  188. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_safe_workspace_isolation.py +263 -103
  189. delegate_agent_cli-0.31.0/tests/test_sandbox_bwrap.py +1302 -0
  190. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_setup_commands.py +15 -13
  191. delegate_agent_cli-0.31.0/tests/test_simplification_integration.py +288 -0
  192. delegate_agent_cli-0.31.0/tests/test_single_run_record.py +232 -0
  193. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_slash_passthrough.py +28 -16
  194. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_snapshot_redaction.py +81 -4
  195. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_snapshot_run_output.py +107 -20
  196. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_snapshot_view.py +82 -0
  197. delegate_agent_cli-0.31.0/tests/test_stall_watchdog.py +445 -0
  198. delegate_agent_cli-0.31.0/tests/test_stall_watchdog_cursor.py +93 -0
  199. delegate_agent_cli-0.31.0/tests/test_terminal_states.py +27 -0
  200. delegate_agent_cli-0.31.0/tests/test_test_environment.py +43 -0
  201. delegate_agent_cli-0.31.0/tests/test_tracked_output_bounds.py +356 -0
  202. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_tracked_timeout.py +43 -35
  203. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_utility_modules.py +30 -5
  204. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_wait_cancel_commands.py +209 -15
  205. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_wave4_launch_features.py +54 -25
  206. delegate_agent_cli-0.31.0/tests/test_workflow_attempts.py +561 -0
  207. delegate_agent_cli-0.31.0/tests/test_workflow_commands.py +7577 -0
  208. delegate_agent_cli-0.31.0/tests/test_workflow_gate_binding.py +300 -0
  209. delegate_agent_cli-0.31.0/tests/test_workflow_journal_reader.py +322 -0
  210. delegate_agent_cli-0.31.0/tests/test_workflow_jsonl_cli.py +74 -0
  211. delegate_agent_cli-0.31.0/tests/test_workflow_pinning.py +1078 -0
  212. delegate_agent_cli-0.31.0/tests/test_workflow_profile_identity.py +229 -0
  213. delegate_agent_cli-0.31.0/tests/test_workflow_retry_outcomes.py +917 -0
  214. delegate_agent_cli-0.31.0/tests/test_workflow_schema.py +328 -0
  215. delegate_agent_cli-0.31.0/tests/test_workflow_simplification.py +222 -0
  216. delegate_agent_cli-0.31.0/tests/test_workflow_watchdog.py +505 -0
  217. delegate_agent_cli-0.31.0/tests/test_workflow_watchdog_unit.py +889 -0
  218. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_worktree_list_show.py +41 -40
  219. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_worktree_prune_gc.py +557 -119
  220. delegate_agent_cli-0.31.0/tests/test_worktree_record_bundle.py +95 -0
  221. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_worktree_remove.py +151 -59
  222. delegate_agent_cli-0.31.0/tests/test_worktree_retirement.py +633 -0
  223. delegate_agent_cli-0.31.0/tests/test_worktree_safety_policy.py +227 -0
  224. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_wsl_guardrails.py +8 -8
  225. delegate_agent_cli-0.29.1/docs/delegate-workflows.md +0 -241
  226. delegate_agent_cli-0.29.1/docs/development.md +0 -70
  227. delegate_agent_cli-0.29.1/docs/live-runtime.md +0 -64
  228. delegate_agent_cli-0.29.1/src/delegate_agent/harness_events.py +0 -1188
  229. delegate_agent_cli-0.29.1/src/delegate_agent/workflows/commands.py +0 -743
  230. delegate_agent_cli-0.29.1/src/delegate_agent/workflows/registry.py +0 -252
  231. delegate_agent_cli-0.29.1/src/delegate_agent/workflows/runtime.py +0 -1669
  232. delegate_agent_cli-0.29.1/src/delegate_agent/workflows/schema.py +0 -177
  233. delegate_agent_cli-0.29.1/tests/test_omp_read_only_behavior.py +0 -88
  234. delegate_agent_cli-0.29.1/tests/test_resume_parser.py +0 -54
  235. delegate_agent_cli-0.29.1/tests/test_tracked_output_bounds.py +0 -167
  236. delegate_agent_cli-0.29.1/tests/test_workflow_commands.py +0 -2811
  237. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/LICENSE +0 -0
  238. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/SECURITY.md +0 -0
  239. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/bin/delegate.py +0 -0
  240. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/docs/assets/delegate-agent-header.png +0 -0
  241. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.claude.json +0 -0
  242. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.codex.json +0 -0
  243. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.cursor.json +0 -0
  244. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.droid.json +0 -0
  245. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.grok.json +0 -0
  246. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.judge.json +0 -0
  247. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/examples/task.kimi.json +0 -0
  248. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/setup.cfg +0 -0
  249. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/archived_logs.py +0 -0
  250. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/command_errors.py +0 -0
  251. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/config_commands.py +0 -0
  252. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/failover_state.py +0 -0
  253. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/git_utils.py +0 -0
  254. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/json_types.py +0 -0
  255. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/log_output.py +0 -0
  256. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/personas.py +0 -0
  257. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/profile_commands.py +0 -0
  258. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/prompt_instructions.py +0 -0
  259. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/seatbelt.py +0 -0
  260. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/setup_commands.py +0 -0
  261. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent/wsl.py +0 -0
  262. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  263. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  264. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  265. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_call_text_fixtures.py +0 -0
  266. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_child_root_env.py +0 -0
  267. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_delegate_isolation.py +0 -0
  268. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_failover_state.py +0 -0
  269. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_launch_error_hints.py +0 -0
  270. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_delivery.py +0 -0
  271. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_framing.py +0 -0
  272. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_io.py +0 -0
  273. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_prune.py +0 -0
  274. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push_batch.py +0 -0
  275. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_mail_push_cursor.py +0 -0
  276. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_packaging.py +0 -0
  277. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_persona_validation.py +0 -0
  278. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_snapshot_rendering.py +0 -0
  279. {delegate_agent_cli-0.29.1 → delegate_agent_cli-0.31.0}/tests/test_structured_output.py +0 -0
@@ -5,18 +5,411 @@ 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.29.1] - 2026-08-11
8
+ ## [0.31.0] - 2026-09-14
9
+
10
+ ### Harness compatibility audit (2026-09-07)
11
+
12
+ Eleven audits, one per supported harness plus a shared pass, checked Delegate's
13
+ assumptions against each vendor's current release. Every finding that could
14
+ produce a wrong run outcome is fixed below.
15
+
16
+ #### Per-engine fixes
17
+ - Codex: `--search` and `--ask-for-approval` are declared on the interactive TUI
18
+ and never reached `codex exec`, so `policy.webSearch` was a no-op and the
19
+ approval policy was never stated. Both now ride `exec` as `-c
20
+ web_search="live"` and `-c approval_policy="never"`. Codex usage survives a
21
+ patch, and a preamble is no longer promoted to an answer after one.
22
+ - Claude: safe and read-only call emit `--permission-prompts none` when
23
+ discovery has seen the flag, so a prompt is denied rather than hanging. A
24
+ pinned run judges the served model by Claude's own naming instead of string
25
+ equality, and `--continuity-mode pinned` refuses an alias that names no family
26
+ (`best`, `opusplan`, `default`) at preflight.
27
+ - Cursor: `cursor call --read-only` emits `--mode ask`, which Cursor documents as
28
+ read-only; safe mode deliberately does not, and keeps relying on the isolated
29
+ workspace copy and the safe-review prefix. Tool events are parsed from the
30
+ shape Cursor actually emits, and a pinned run accepts the display name Cursor
31
+ reports in place of the requested selector.
32
+ - Grok: a response is sealed on usage rather than on `end`, so a multi-response
33
+ stream keeps every part. The effort vocabulary is `low, medium, high, xhigh`;
34
+ `max` was never accepted.
35
+ - Oh My Pi: work mode pins `--approval-mode yolo` and names its working
36
+ directory with `--cwd`. An omp selector missing from a fresh account catalog
37
+ now warns, because omp resolves an unknown id by fuzzy match.
38
+ - Pi and Oh My Pi: the `--thinking` vocabulary is `off, minimal, low, medium,
39
+ high, xhigh, max`, and omp additionally accepts `auto`.
40
+ - Kimi: the goal summary is kept rather than dropped, pass-through runs pin
41
+ `--output-format text`, and bwrap binds the selected Kimi home.
42
+ - OpenCode: read-only runs set `OPENCODE_DISABLE_CLAUDE_CODE=1`, and discovery
43
+ probes with `--pure models --verbose`.
44
+ - Devin: the read-only argv is documented-compatible with 3000.6.14, but that
45
+ release's read-only behavior is unproven, so the 3000.4.x gate is retained
46
+ until `DELEGATE_DEVIN_BEHAVIOR_TEST` passes against it.
47
+
48
+ #### Transports
49
+ - Cursor Agent and Oh My Pi prompts move to stdin, verified live against
50
+ 2026.09.02-c22c1a3 and 18.1.13. That deletes their argv redaction constants,
51
+ their membership in the 100 KiB argv guard, and the omp flag-like-prompt
52
+ rejection, and it takes the prompt out of `/proc/<pid>/cmdline`. Kimi is now
53
+ the only engine on argv transport and the only one whose prompt Delegate
54
+ redacts.
55
+
56
+ #### Stream parsing
57
+ - An error event with a `message` or `error.message` now records a `failed`
58
+ terminal on every harness, and a `result` carrying only `is_error: true` does
59
+ the same instead of being read as a clean success.
60
+ - A non-JSON stdout line from kimi, opencode, or pi is no longer discarded in
61
+ silence: it is counted and sampled, bounded and redacted, while the
62
+ malformed-tool-output protection that stops a raw envelope becoming an answer
63
+ is unchanged.
64
+ - Event types no parser branch handles are counted, so the next vendor rename
65
+ is visible rather than silent.
66
+ - Run records and snapshots carry `malformedLines`, `malformedSamples`,
67
+ `unhandledEventTypes`, and `unhandledEventTypesTruncated`. The block appears
68
+ only when there is something to report, and it survives a retry or auth
69
+ fallback instead of being reset with the accumulator. A merged usage record
70
+ keeps grok's `costUsd`.
71
+ - The stall watchdog tracks opencode and grok tool lifecycles. Kimi and Devin,
72
+ whose stdout is silent by design during tool execution, are exempt from the
73
+ engine-default detector only when the run carries a finite timeout; an
74
+ explicit `stallMinutes` is always honored.
75
+
76
+ #### Structured output
77
+ - One engine-keyed eligibility helper decides whether a schema can be enforced
78
+ natively. Claude and Codex both require an explicit object root, and Claude
79
+ additionally requires the serialized argv value to stay under the Linux
80
+ argument-length limit. An ineligible workflow schema falls back to
81
+ prompt-and-parse with the reason journaled; a direct `claude --output-schema`
82
+ fails at preflight with `schema_not_native` instead of forwarding an argv the
83
+ API will reject.
84
+ - In the structured retry loop, an attempt that fails with no assistant text
85
+ clears native enforcement for the remaining attempts and embeds the original
86
+ schema in the correction prompt, including on the resumable path.
87
+
88
+ #### Deferred, recorded as decisions rather than omissions
89
+ - Devin's 3000.4.x read-only version gate stays until a behavioral probe passes
90
+ on 3000.6.x; Devin is not installed on the machine that ran the audit.
91
+ - Claude's `ultracode` effort is not added. Discovery overrides the static enum
92
+ with a warning list that omits the level, so an enum edit alone is unreachable
93
+ and would need a compatibility exception with its own proof.
94
+ - Usage-limit cooldowns stay Codex-only. Widening the valid-tool set alone
95
+ changes nothing; the write and check paths are engine-specific.
96
+ - Followup and resume support for grok, droid, opencode, pi, kimi, and devin is
97
+ verified possible and additive, but each needs a live round trip to prove and
98
+ none was run.
99
+ - Grok stays on its current stream format, and `validate_schema_subset` still
100
+ rejects `$defs` and `format`.
101
+
102
+ ### Workflow resume and stale runs (2026-09-14)
103
+
104
+ Found in the dogfood window after the 0.31.0 candidate was promoted: one
105
+ workflow that lost its supervisor 28 times left 10 children listed as `stale`
106
+ forever, and every resume that reached one of them failed its thunk with
107
+ "already terminal (stale)" instead of relaunching.
108
+
109
+ - `delegate cancel` seals a `stale` run whose tracked pid is dead as
110
+ `cancelled`, with `staleReason: dead_pid` on the record and a warning that
111
+ nothing was signalled, instead of refusing it with `run_already_terminal`.
112
+ A `stale` run with no pid at all is still refused: under the registry lock
113
+ that can be a launch that has not published its pid yet. A dead leader
114
+ whose recorded process group still has members is refused with
115
+ `run_group_alive`, naming the group, because a dead pid is not proof the
116
+ run's work stopped and the group id may already belong to someone else.
117
+ - `workflow run --resume` and `workflow approve` seal the prior attempt's
118
+ in-flight children before the new supervisor starts, the same way `workflow
119
+ kill` does, and journal `attempt_superseded` with the lost supervisor's pid,
120
+ its last status, and the sealed children. The replay then relaunches the
121
+ agent instead of tripping over the orphan. The seal runs after gate
122
+ validation and never on `--dry-run`, which launches no replacement.
123
+ - The workflow supervisor handles `SIGTERM` and `SIGHUP` by requesting the
124
+ same cooperative cancellation the stall watchdog uses. The signal handler
125
+ itself only records; a wakeup-pipe relay thread journals
126
+ `supervisor_signalled` and sets the cancel event in ordinary thread context,
127
+ so the handler never takes a lock. Admission closes, in-flight children are
128
+ cancelled, retry worktrees are released, and the supervisor exits through
129
+ its normal cleanup with `status: failed`, `signal`, `watchdogReason:
130
+ signal:<NAME>` (a genuine watchdog reason that started the shutdown is
131
+ kept, and its error text is not replaced by the signal's), and the
132
+ `cancelled` list on `status.json`. Before any terminal status is chosen or
133
+ published the supervisor drains the relay, so a signal already delivered
134
+ to the process is on the record consumers read as final; one that lands
135
+ after the last child completed is recorded on the `succeeded` status as
136
+ `signalAfterCompletion`. Each drain is answered only by its own marker,
137
+ and a drain the relay did not acknowledge in time is published as
138
+ `signalDrainIncomplete: true` on the terminal status instead of as a
139
+ settled record, which `workflow wait` and `workflow watch` repeat in every
140
+ output mode; the workflow lock is released only once the relay can no
141
+ longer write (the supervisor fences it at exit, waiting without bound
142
+ in-process and, as the detached supervisor process, ending itself
143
+ unconditionally while it still holds the lock rather than letting a writer
144
+ outlive ownership; every exit from the lock context, exceptional or not,
145
+ fences the relay and hands the lock to a delivery in flight, which closes
146
+ it when it completes; arming the relay rolls back handlers, wakeup fd, and
147
+ descriptors when it fails before the reader thread exists, and the read
148
+ end is owned by whichever of the reader and the rollback claims it first). A repeated signal is recorded, not re-raised. `workflow kill` notes which
149
+ children were already terminal before it signals and completes its
150
+ `cancelled` report from the whole group afterwards (`observedIn: registry`
151
+ on entries it did not cancel itself), so a supervisor sealed by the kill's
152
+ own SIGTERM, a child admitted just before cancellation closed, or a
153
+ supervisor cut short by the SIGKILL escalation still yield a full list; the
154
+ `killed` status drops only the diagnostics the signal itself produced. A signal used to end the supervisor with the lock released,
155
+ `status.json` still `running`, and no record of why.
156
+ - A `--continuity-mode pinned` run that completes without any harness model
157
+ observation carries a `pinned_continuity_unverified` warning naming the
158
+ harness, on tracked runs and on ungrouped `call` payloads alike. Claude and Oh My Pi were observed reporting the served model in
159
+ the dogfood window; Codex and Grok streams carry no model field, so on those
160
+ engines a pinned run is pinned in name only and now says so.
161
+ - `delegate models` marks a configured binary that does not resolve from the
162
+ Delegate process (`binaryMissing: true`, `(missing)` in text) instead of
163
+ printing the configured path as if it were installed. The check is the
164
+ launch check: `shutil.which` on the configured value, no `~` expansion.
165
+
166
+ ### CI and runtime hardening (2026-09-07)
167
+
168
+ - Pinned runtime snapshots and workflow attempt directories are published while
169
+ still writable and sealed to `0o500` only after the rename. macOS `rename(2)`
170
+ refuses to move a directory that lacks owner write permission, which made
171
+ every pin-store test fail on the macOS CI runner while Linux passed. A stale
172
+ temporary snapshot that cannot be removed now raises a typed
173
+ `runtime_snapshot_collision` error, and the writable pre-pass walks the tree
174
+ through directory descriptors so a swapped symlink cannot redirect the chmod.
175
+ - Test process guards read `ps -ww` and pin `COLUMNS=80`; narrow runner
176
+ terminals truncated the argument column and left children unreaped.
177
+ - `trackedStreamMaxBytes` is a per-engine config value: 16 MiB by default and
178
+ 64 MiB for Pi and Oh My Pi. The limit is resolved at request build and
179
+ pinned into the run context and manifest, so a config edit does not change
180
+ an already-launched run. Limit errors name the engine and which limit fired.
181
+ - Harness discovery fingerprints an explicitly configured wrapper whose
182
+ basename is not another harness's binary name (an `estate-pi` style wrapper
183
+ now discovers), while still refusing ambiguous basenames and any basename
184
+ that names a different harness.
185
+ - Harness event capture no longer duplicates the final assistant text when a
186
+ completion event repeats the last streamed chunk.
187
+
188
+ ### Added
189
+ - `describe` provides a compact command index; `describe --full` expands the
190
+ command/config catalog. Help is generated from the same command specifications
191
+ used to validate supported global options.
192
+ - `workflow resume` aliases `workflow run --resume`; focused reject help,
193
+ workflow typo suggestions, and additive error recovery fields reduce guesswork.
194
+ `workflow watch --jsonl` streams events without retaining the full response.
195
+ - Workflow pins use immutable per-attempt operational settings with effective
196
+ values, origins, and digests, and bind the selected profile and credential
197
+ namespaces.
198
+
199
+ ### Fixed
200
+ - `delegate doctor` warns when `codex.profile` names an overlay file that does
201
+ not exist. Codex reads the setting as `$CODEX_HOME/<name>.config.toml` and
202
+ accepts a missing file silently, so a stale profile cost every run its overlay
203
+ without a word.
204
+ - A recognized option name typed after the prompt warns that it is being treated
205
+ as prompt text.
206
+ - A terminal reason is redacted before it reaches the run record.
207
+ - Persistent-worktree launches preserve requested continuity and process-group
208
+ termination grace through the shared request-to-run mapping.
209
+ - Doctor distinguishes executing, installed, and last-promoted artifacts and
210
+ verifies the outer launcher chain instead of equating matching version strings.
211
+ - PI/OMP failed, aborted, and exhausted turns no longer become successful merely
212
+ because the process exits zero. Later retry/compaction recovery remains supported.
213
+ - Noisy OMP thinking deltas use bounded diagnostic sampling with explicit capture
214
+ receipts. Useful output, individual records, and total ingress retain finite caps.
215
+ - Safe Codex runs can write their designated scratch directory without granting
216
+ source or metadata write access. Unsupported native permission configuration
217
+ fails closed rather than falling back to broader workspace permissions.
218
+ - Workflow replay reads the journal once; watch tails new bytes and handles
219
+ interrupted final records. Approval/resume handles draining supervisors and
220
+ rolls back approval when launch publication fails.
221
+ - Attempt publication atomically refuses an existing destination, including empty
222
+ directories. Conflicting worktree identity retains files instead of guessing a
223
+ removal target, and limited run listings avoid probing logs for excluded rows.
9
224
 
10
225
  ### Changed
226
+ - The auto-injected skill-review preamble is behind
227
+ `tracking.skillReviewPreamble.enabled`, default `false`. Call, slash
228
+ pass-through, and `--pass-through` prompts never receive it either way.
229
+ - Workspace mail setup is on by default; global `--no-mail` or
230
+ `mail.enabled: false` opts out without suppressing `--notify`. Push remains
231
+ opt-in.
232
+ - Mail storage failures warn and disable launch-time mail instead of refusing
233
+ the run; unreachable isolated mailboxes record manifest-only warnings.
234
+ - The wrapped work prompt gains 303 UTF-8 bytes, which count toward the argv
235
+ size guard; `--no-mail` avoids that overhead near the boundary.
236
+ - Droid uses the same `--model <alias-or-model>` grammar as other engines. The
237
+ positional model-alias form is retired.
238
+ - Droid custom-model selectors use Factory's documented
239
+ `custom:<Display-Name>-<index>` form. The previous id-based selectors no longer
240
+ resolve: re-read `delegate models droid` and update any `droid.models` alias
241
+ that pinned one.
242
+ - Workflow resume requires current-format pins, attempt configuration and
243
+ version-2 structural keys. Legacy formats are refused before child launch;
244
+ start a new workflow instead of migrating old state. Gate approvals require
245
+ the matching result hash.
246
+ - Run progress, finalization and cancellation share one bounded mutable record.
247
+ Snapshot output is computed from that record; new runs do not maintain a
248
+ second mutable `snapshot.json`. Keep old and new runtime writers in separate
249
+ workspace registries during development or cutover.
250
+ - Routine progress updates recover only their own pending finalization record.
251
+ Inspection remains lock-free and can observe a valid pending completion.
252
+ Automatic retention is throttled and is not on the cancellation path.
253
+ - Nested workflows share runtime state without replaying the journal again.
254
+ New-agent and followup execution share locked replay and lifecycle decisions,
255
+ including concurrent rejection and interrupted-result recovery.
256
+ - Worktree maintenance shares safety predicates while retaining command-specific
257
+ policies, retirement ignore-globs, and fresh checks before destructive changes.
258
+ - CLI and input JSON normalize into one launch builder for tracked and call
259
+ modes, retaining input-specific validation and workflow-session checks.
260
+ Invalid JSON instruction modes return usage errors; Droid raw model IDs no
261
+ longer become spurious worktree-planning aliases.
262
+ - Shared metadata projections, typed isolation plans and retirement inputs, and
263
+ a read-only record module reduce duplicated policy and circular imports.
264
+ - Unit tests use owning modules while CLI contracts retain entrypoint coverage.
265
+ Acceptance selects the pinned Ruff toolchain. Pytest uses private temporary
266
+ state and ownership-checked process cleanup; runner parity retains complete
267
+ logs and cancellation regressions.
11
268
 
12
- - The PyPI artifact handoff now uses the official Node 24 upload and download
13
- actions, removing the deprecation warnings emitted during the 0.29.0 publish.
269
+ ### Fixed
270
+ - Claude `--output-schema` is accepted in tracked `safe`/`work` modes, not only
271
+ `call`, and is passed natively as `--json-schema`, recorded in the manifest,
272
+ and inherited on resume. Unblocks structured Claude review lanes such as
273
+ deslop's `--runner delegate --lane claude`.
274
+ - Workflow `schema=` validation now matches Claude's schema preflight: empty or
275
+ duplicate `enum` values (JSON equality, integers beyond 2**53 and non-string
276
+ object keys refused), repeated `required` or `type` entries are rejected
277
+ before launch, and runtime enum membership uses the same JSON equality.
278
+ Claude workflow children receive every supported schema natively.
279
+ - Worktree retirement no longer treats the shared `.beads/` and
280
+ `.papercuts.jsonl` ledgers as lane work, so a run that filed a papercut or
281
+ closed a bead can retire its worktree instead of stranding it. Configurable
282
+ via `worktrees.retirementIgnoreGlobs`.
283
+ - `worktree prune` (and the auto-prune that runs at completion) no longer
284
+ selects a worktree whose owning Run is still alive, reporting `run_active`,
285
+ `run_not_terminal`, or `process_group_alive` instead. `--force` overrides.
286
+ - `workflow run --dry-run` can no longer hang indefinitely on a script that
287
+ waits for a human gate: scripts now receive a `dry_run` global, dry-run item
288
+ threads are disposable, and `workflows.dryRunTimeoutSeconds` (default 300)
289
+ bounds the run with a `dry_run_timeout` error.
290
+
291
+ ### Added
292
+ - `delegate doctor` (read-only, `delegate.doctor.v1`) reports the live runtime
293
+ digest against the last promotion stamp and warns when the installed runtime
294
+ changed without a promotion, when the installed launcher drifted, and which
295
+ workflow supervisors are still pinned to older runtimes. `delegate promote
296
+ --actor WHO --source TEXT [--runtime-digest HEX]` writes the stamp
297
+ (`~/.delegate/last-promotion.json`) under a lock, reading the live digest
298
+ inside it.
299
+ - Structured-output retries now resume in place when the harness supports it,
300
+ retaining a safe temporary workspace across attempts and reaping it from
301
+ durable child snapshots on timeout, kill, crash, or supervisor resume.
302
+
303
+ - `delegate workflow run --notify room:<name>|channel:<name>` rings a detached
304
+ supervisor's owner when it pauses at a checkpoint, fails, succeeds, or times
305
+ an agent out. The target survives resume and dry-run, and a notification that
306
+ cannot be delivered is recorded as a `notify_degraded` journal event without
307
+ changing the workflow's outcome.
14
308
 
15
309
  ### Fixed
310
+ - `agent_timeout` and `agent_structured_retry` journal rows carry the task key
311
+ and label, so which lane died no longer has to be inferred by cross-referencing
312
+ `agent_started` timestamps.
313
+ - A persistent-worktree run warns at completion when its base is N commits behind
314
+ the source branch — the child never saw work that landed after it was
315
+ dispatched.
316
+ - Parse-time option errors name `delegate dry-run`, which already validated an
317
+ invocation without launching it. The hint appears only for launch-shaped
318
+ commands, never when the caller has already typed `dry-run`, and a correction
319
+ for a dry-run stays a dry-run instead of handing back a live launch.
320
+ - `workflow approve` now accumulates approvals (`approvedKeys` in `approval.json`) instead of overwriting the single `gateKey`, so a resume that replays an earlier approved gate no longer re-pauses the run there.
321
+ - Workflow `agent(schema=...)` on Codex no longer dies before launch when the
322
+ schema has optional fields or a typed `additionalProperties` map: native
323
+ `--output-schema` is used only for strict-compatible schemas, everything else
324
+ falls back to the prompt-and-parse path the other engines use.
325
+ - `parse_json_tolerant` now returns the last JSON value that validates against
326
+ the schema instead of decoding from the first `{`/`[` in the text, so a
327
+ markdown completion report with decoy brackets (`[T1]`, `{run, exit, note}`)
328
+ no longer burns structured-output retries.
329
+ - Workflow child failures report the child's JSON `error`/`message`/`runId`
330
+ instead of only stderr (which was often just the persona preface).
331
+ - `workflow run --resume` treats a key whose retries were exhausted as
332
+ retryable: a finished child run is adopted, otherwise the agent re-runs,
333
+ instead of replaying the cached failure straight back into the same gate.
334
+
335
+ - The workflow journal no longer sorts event keys: a structured result's key
336
+ order is part of the data (scripts embed prior results via `repr()` in later
337
+ prompts, which the agent cache key hashes), so a sorted replay missed every
338
+ downstream key after a resume and re-ran the whole wave.
339
+
340
+ ### Added
16
341
 
17
- - `workflow run --resume` now turns a completed workflow dry-run into live
342
+ - Workflow schema subset: `additionalProperties` may be a schema, typing a map
343
+ with unknown keys.
344
+
345
+ ## [0.30.0] - 2026-08-22
346
+
347
+ ### Added
348
+
349
+ - Added an opt-in bubblewrap safe backend for eligible Linux safe runs. Set
350
+ `isolation.safeBackend` to `"bwrap"` or use `DELEGATE_SAFE_BACKEND` to run
351
+ zero-copy against the real workspace, bound read-only inside a bubblewrap
352
+ boundary with gitignore-parity masks. The workspace `.delegate/` registry is
353
+ hidden except for the current run's writable scratch, and `$HOME` is a private
354
+ tmpfs where only the selected engine's config home is made writable by
355
+ default. `isolation.bwrapBinds` adds explicit `{path, mode}` host paths. Each
356
+ run preflights its final mount plan and launches with the exact probed binary.
357
+ The backend fails closed when bubblewrap is unavailable, an untracked symlink
358
+ could expose a host path, parity needs more than 2000 masks, a submodule is
359
+ initialized, a writable bind covers or sits inside the workspace, or
360
+ `--pass-through` is requested. Linked Git worktrees are supported. See the
361
+ [security model](docs/security-model.md#zero-copy-safe-isolation-linux-isolationsafebackend-bwrap)
362
+ and [configuration guide](docs/configuration.md#isolationsafebackend-and-isolationbwrapbinds-linux).
363
+ - Added `--notify room:<name>|channel:<name>` for one metadata-only completion
364
+ line through the optional `post` CLI. A missing, refused, or timed-out send
365
+ degrades to a manifest record without changing the run result. Notifications
366
+ also fire for child launch failures and persistent-worktree setup failures,
367
+ and the option works with `resume`; `call` and `--pass-through` reject it.
368
+ - Cursor dry-run and terminal JSON now include a stable `accountFingerprint`
369
+ derived from `cursor-agent status --format json`. Raw account fields and
370
+ tokens are never emitted or persisted; unauthenticated or malformed status
371
+ output omits the fingerprint so consumers can fail closed.
372
+
373
+ ### Changed
374
+
375
+ - The dev extra now ships `pytest` and `pytest-xdist`; `scripts/test-parity.sh`
376
+ checks that the parallel accelerator and the unittest gate agree on executed
377
+ and skipped counts.
378
+ - Bundled Grok declarations move to Grok 4.6: `grok-4.6` is the Grok CLI
379
+ default, and Cursor entries use the canonical `cursor-grok-*` IDs with the
380
+ full `cursor-grok-4.6` effort ladder (cursor-agent no longer accepts the
381
+ legacy `grok-4.5-fast-*` style).
382
+ - Devin runs use the current noninteractive workspace-trust flow.
383
+ - Release hygiene: CI also runs the suite on macOS (Python 3.12), the
384
+ repository has one canonical pull-request template, and the sdist ships
385
+ `scripts/test-parity.sh`.
386
+
387
+ ### Fixed
388
+
389
+ - `workflow run --resume` turns a completed workflow dry-run into live
18
390
  execution under the same workflow ID. Simulated agent and budget events stay
19
391
  in the journal for audit but never satisfy replay or consume live budget.
392
+ (Listed under 0.29.1 in earlier drafts; it landed after that tag.)
393
+ - Workflow child runs keep their identity (workflow ID and child name)
394
+ through registration, journal events, and snapshots, including children
395
+ launched in isolated worktrees.
396
+ - Safe mode never places its scratch copy inside the source workspace. When
397
+ the system temp directory is the source (for example `delegate ... safe` run
398
+ from `/tmp`), the copy goes to `$XDG_CACHE_HOME/delegate/safe-workspaces`
399
+ or `~/.cache/delegate/safe-workspaces`; a source that contains every
400
+ candidate is refused with `safe_workspace_source_too_broad`. Previously the
401
+ copy recursed into its own output until `ENAMETOOLONG`.
402
+ - Safe-mode copies skip directories the caller cannot read (other users'
403
+ `/tmp/systemd-private-*`, for example) with a bounded warning, and any
404
+ residual copy failure is reported as `safe_workspace_copy_failed` instead of
405
+ a traceback.
406
+
407
+ ## [0.29.1] - 2026-08-11
408
+
409
+ ### Changed
410
+
411
+ - The PyPI artifact handoff now uses the official Node 24 upload and download
412
+ actions, removing the deprecation warnings emitted during the 0.29.0 publish.
20
413
 
21
414
  ## [0.29.0] - 2026-08-11
22
415
 
@@ -994,6 +1387,9 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
994
1387
 
995
1388
  - Releases before 0.1.3 predate this changelog.
996
1389
 
1390
+ [Unreleased]: https://github.com/treygoff24/delegate-agent/compare/v0.31.0...HEAD
1391
+ [0.31.0]: https://github.com/treygoff24/delegate-agent/compare/v0.29.1...v0.31.0
1392
+ [0.30.0]: https://github.com/treygoff24/delegate-agent/compare/v0.29.1...v0.30.0
997
1393
  [0.29.1]: https://github.com/treygoff24/delegate-agent/compare/v0.29.0...v0.29.1
998
1394
  [0.29.0]: https://github.com/treygoff24/delegate-agent/compare/v0.28.0...v0.29.0
999
1395
  [0.28.0]: https://github.com/treygoff24/delegate-agent/compare/v0.27.0...v0.28.0
@@ -9,14 +9,14 @@ python3 -m venv .venv
9
9
  . .venv/bin/activate
10
10
  python3 -m pip install -e ".[dev]"
11
11
  python3 bin/delegate.py --json describe
12
- python3 -m unittest discover -s tests -t .
12
+ python3 -m pytest -q
13
13
  ```
14
14
 
15
15
  Use `python3 bin/delegate.py` from this repository when validating development changes. Do not overwrite an installed `delegate` shim, `~/.delegate/config.json`, or any live runtime unless an operator explicitly asks for promotion.
16
16
 
17
17
  ## Supported platforms
18
18
 
19
- Required CI currently runs on Linux for Python 3.11, 3.12, 3.13, and 3.14. Contributions for macOS or Windows compatibility are welcome, but do not claim support for a platform until tests cover it.
19
+ Required CI runs the suite on Linux for Python 3.11, 3.12, 3.13, and 3.14, and on macOS for Python 3.12. The bubblewrap safe backend is Linux-only and its live tests skip elsewhere. Contributions for Windows compatibility are welcome, but do not claim support for a platform until tests cover it.
20
20
 
21
21
  ## Development guidelines
22
22
 
@@ -35,7 +35,7 @@ Run the narrowest useful checks for your change, then the full suite before prop
35
35
  ```bash
36
36
  python3 -m compileall -q src tests bin
37
37
  git diff --check
38
- python3 -m unittest discover -s tests -t .
38
+ python3 -m pytest -q
39
39
  ruff check .
40
40
  ruff format --check .
41
41
  ```
@@ -6,6 +6,7 @@ include SECURITY.md
6
6
  include config.example.json
7
7
  include bin/delegate.py
8
8
  include bin/delegate-profile-shim
9
+ include scripts/test-parity.sh
9
10
  include docs/agent-setup.md
10
11
  include docs/cli-reference.md
11
12
  include docs/configuration.md