delegate-agent-cli 0.29.0__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.
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/CHANGELOG.md +410 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/CONTRIBUTING.md +3 -3
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/MANIFEST.in +1 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/PKG-INFO +70 -21
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/README.md +67 -20
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/bin/delegate-profile-shim +3 -3
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/config.example.json +7 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/agent-setup.md +13 -3
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/cli-reference.md +308 -95
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/configuration.md +218 -18
- delegate_agent_cli-0.31.0/docs/delegate-workflows.md +391 -0
- delegate_agent_cli-0.31.0/docs/development.md +95 -0
- delegate_agent_cli-0.31.0/docs/live-runtime.md +156 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/publishing-checklist.md +29 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/security-model.md +133 -12
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/troubleshooting.md +96 -29
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/worktrees.md +61 -2
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/pyproject.toml +3 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/__init__.py +1 -1
- delegate_agent_cli-0.31.0/src/delegate_agent/account_binding.py +88 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/argv_builders.py +163 -81
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/argv_utils.py +2 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/bundled_models.py +10 -5
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/capability_commands.py +64 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/child_failures.py +40 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/cli.py +656 -434
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/cli_parser.py +804 -248
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/command_help.py +471 -237
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/config.py +385 -17
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/constants.py +53 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/describe_payload.py +176 -172
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/errors.py +12 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/followup_command.py +444 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/harness_discovery.py +349 -60
- delegate_agent_cli-0.31.0/src/delegate_agent/harness_events.py +2143 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/inspection_commands.py +9 -6
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/isolation.py +73 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail.py +61 -12
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail_core.py +36 -71
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/mail_push.py +22 -10
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/model_discovery.py +0 -20
- delegate_agent_cli-0.31.0/src/delegate_agent/notify.py +200 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/private_io.py +183 -38
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/profile_guard.py +6 -8
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/profiles.py +67 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/prompt_transport.py +4 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/reasoning.py +47 -24
- delegate_agent_cli-0.31.0/src/delegate_agent/record_io.py +244 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/redaction.py +88 -3
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/rendering.py +21 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/request_build.py +969 -417
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/request_models.py +114 -73
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/resume_command.py +62 -60
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/retention.py +42 -3
- delegate_agent_cli-0.31.0/src/delegate_agent/run_context.py +115 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_metadata.py +76 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_output_commands.py +99 -2
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_registry.py +443 -169
- delegate_agent_cli-0.31.0/src/delegate_agent/run_scratch.py +229 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/run_status.py +132 -42
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/runner.py +1716 -351
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/safe_workspace.py +316 -27
- delegate_agent_cli-0.31.0/src/delegate_agent/sandbox_bwrap.py +606 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/snapshot_view.py +56 -99
- delegate_agent_cli-0.31.0/src/delegate_agent/stall_watchdog.py +607 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/stream_capture.py +179 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/structured_output.py +36 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/terminal_states.py +63 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/wait_cancel_commands.py +93 -36
- delegate_agent_cli-0.31.0/src/delegate_agent/workflow_attempts.py +271 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflow_identity.py +123 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflow_pinning.py +1075 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/workflows/__init__.py +1 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflows/commands.py +1382 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflows/registry.py +408 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflows/runtime.py +5265 -0
- delegate_agent_cli-0.31.0/src/delegate_agent/workflows/schema.py +306 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/workflows/script.py +110 -15
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_commands.py +29 -7
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_execution.py +84 -104
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_gc.py +602 -61
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_mgmt.py +595 -67
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_records.py +124 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_remove.py +75 -196
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/worktree_summary.py +104 -5
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/PKG-INFO +70 -21
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +71 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/requires.txt +2 -0
- delegate_agent_cli-0.31.0/tests/test_acceptance_toolchain.py +141 -0
- delegate_agent_cli-0.31.0/tests/test_account_binding.py +99 -0
- delegate_agent_cli-0.31.0/tests/test_bundled_models_lane_r.py +43 -0
- delegate_agent_cli-0.31.0/tests/test_call_capture_contract.py +44 -0
- delegate_agent_cli-0.31.0/tests/test_cancel_terminal_override.py +216 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_capability_commands.py +146 -2
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_child_failures.py +19 -0
- delegate_agent_cli-0.31.0/tests/test_cli_simplification.py +247 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_codex_pure_sandbox.py +8 -4
- delegate_agent_cli-0.31.0/tests/test_codex_scratch.py +557 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_codex_thread_resilience.py +19 -12
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_command_help.py +138 -26
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_config_commands.py +37 -21
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_delegate_help_cli.py +147 -109
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_delegate_parser.py +781 -550
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_delegate_validation.py +634 -114
- delegate_agent_cli-0.31.0/tests/test_describe_models_binary.py +66 -0
- delegate_agent_cli-0.31.0/tests/test_devin_read_only_behavior.py +130 -0
- delegate_agent_cli-0.31.0/tests/test_discovery_contracts.py +191 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_end_to_end_tracking.py +21 -11
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_engine_argv.py +772 -354
- delegate_agent_cli-0.31.0/tests/test_engine_universe.py +35 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_execution_argv_and_prompt.py +518 -204
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_execution_dry_run.py +62 -59
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_failure_cleanup.py +89 -84
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_preflight.py +32 -25
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_execution_worktree_run.py +210 -134
- delegate_agent_cli-0.31.0/tests/test_followup_after_retry_e2e.py +224 -0
- delegate_agent_cli-0.31.0/tests/test_followup_capture.py +285 -0
- delegate_agent_cli-0.31.0/tests/test_followup_parser.py +130 -0
- delegate_agent_cli-0.31.0/tests/test_followup_refusals.py +255 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_harness_discovery.py +366 -11
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_harness_events.py +1275 -23
- delegate_agent_cli-0.31.0/tests/test_harness_json_limits.py +34 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_inspection_commands.py +27 -0
- delegate_agent_cli-0.31.0/tests/test_isolation_plans.py +95 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_kimi_commands.py +36 -10
- delegate_agent_cli-0.31.0/tests/test_lane_a_transport.py +927 -0
- delegate_agent_cli-0.31.0/tests/test_lane_b_lifecycle.py +73 -0
- delegate_agent_cli-0.31.0/tests/test_lane_m_mail_defaults.py +220 -0
- delegate_agent_cli-0.31.0/tests/test_lane_r_public_surface.py +86 -0
- delegate_agent_cli-0.31.0/tests/test_lane_s_structured_retry.py +121 -0
- delegate_agent_cli-0.31.0/tests/test_launch_input_parity.py +543 -0
- delegate_agent_cli-0.31.0/tests/test_launch_mapping.py +370 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_bounds.py +28 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_contract.py +8 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_eligibility.py +2 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_gating.py +167 -44
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_identity.py +5 -6
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_parser.py +10 -9
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push.py +9 -11
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push_adapters.py +25 -7
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push_gating.py +2 -2
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push_seams.py +41 -21
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_reply.py +2 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_resolution.py +2 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_rules.py +2 -4
- delegate_agent_cli-0.31.0/tests/test_mail_tempdir.py +75 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_model_discovery.py +23 -47
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_model_selection_wave1a.py +28 -33
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_model_selection_wave1b.py +144 -146
- delegate_agent_cli-0.31.0/tests/test_nested_workflow_threads.py +249 -0
- delegate_agent_cli-0.31.0/tests/test_notify.py +440 -0
- delegate_agent_cli-0.31.0/tests/test_omp_output_capture.py +289 -0
- delegate_agent_cli-0.31.0/tests/test_omp_read_only_behavior.py +213 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_capability.py +18 -37
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_claude.py +11 -6
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_contract.py +17 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_framer.py +19 -7
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_opencode.py +3 -3
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_parser.py +32 -13
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_records.py +5 -2
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_resolution.py +7 -6
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_size_guard.py +21 -12
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_workflow.py +10 -5
- delegate_agent_cli-0.31.0/tests/test_private_directory_publish.py +75 -0
- delegate_agent_cli-0.31.0/tests/test_private_io_bounded.py +177 -0
- delegate_agent_cli-0.31.0/tests/test_proc_harness.py +196 -0
- delegate_agent_cli-0.31.0/tests/test_process_guard.py +42 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_profiles.py +51 -38
- delegate_agent_cli-0.31.0/tests/test_provider_outcomes.py +422 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_pure_call.py +156 -67
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_reasoning_capabilities.py +128 -47
- delegate_agent_cli-0.31.0/tests/test_registry_contention.py +145 -0
- delegate_agent_cli-0.31.0/tests/test_registry_lock_guard.py +85 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_attachment.py +62 -68
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_capture.py +41 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_inheritance.py +86 -25
- delegate_agent_cli-0.31.0/tests/test_resume_parser.py +89 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_projections.py +1 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_refusals.py +8 -1
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_size_guard.py +13 -11
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_stale.py +25 -19
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_resume_trust.py +55 -18
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_retention.py +356 -14
- delegate_agent_cli-0.31.0/tests/test_run_listing_cost.py +98 -0
- delegate_agent_cli-0.31.0/tests/test_run_record_imports.py +46 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_run_registry.py +374 -6
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_runner_capture.py +1337 -63
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_safe_workspace_isolation.py +263 -103
- delegate_agent_cli-0.31.0/tests/test_sandbox_bwrap.py +1302 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_setup_commands.py +15 -13
- delegate_agent_cli-0.31.0/tests/test_simplification_integration.py +288 -0
- delegate_agent_cli-0.31.0/tests/test_single_run_record.py +232 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_slash_passthrough.py +28 -16
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_snapshot_redaction.py +81 -4
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_snapshot_run_output.py +107 -20
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_snapshot_view.py +82 -0
- delegate_agent_cli-0.31.0/tests/test_stall_watchdog.py +445 -0
- delegate_agent_cli-0.31.0/tests/test_stall_watchdog_cursor.py +93 -0
- delegate_agent_cli-0.31.0/tests/test_terminal_states.py +27 -0
- delegate_agent_cli-0.31.0/tests/test_test_environment.py +43 -0
- delegate_agent_cli-0.31.0/tests/test_tracked_output_bounds.py +356 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_tracked_timeout.py +43 -35
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_utility_modules.py +30 -5
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_wait_cancel_commands.py +209 -15
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_wave4_launch_features.py +54 -25
- delegate_agent_cli-0.31.0/tests/test_workflow_attempts.py +561 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_commands.py +7577 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_gate_binding.py +300 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_journal_reader.py +322 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_jsonl_cli.py +74 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_pinning.py +1078 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_profile_identity.py +229 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_retry_outcomes.py +917 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_schema.py +328 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_simplification.py +222 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_watchdog.py +505 -0
- delegate_agent_cli-0.31.0/tests/test_workflow_watchdog_unit.py +889 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_worktree_list_show.py +41 -40
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_worktree_prune_gc.py +557 -119
- delegate_agent_cli-0.31.0/tests/test_worktree_record_bundle.py +95 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_worktree_remove.py +151 -59
- delegate_agent_cli-0.31.0/tests/test_worktree_retirement.py +633 -0
- delegate_agent_cli-0.31.0/tests/test_worktree_safety_policy.py +227 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_wsl_guardrails.py +8 -8
- delegate_agent_cli-0.29.0/docs/delegate-workflows.md +0 -231
- delegate_agent_cli-0.29.0/docs/development.md +0 -70
- delegate_agent_cli-0.29.0/docs/live-runtime.md +0 -64
- delegate_agent_cli-0.29.0/src/delegate_agent/harness_events.py +0 -1188
- delegate_agent_cli-0.29.0/src/delegate_agent/workflows/commands.py +0 -731
- delegate_agent_cli-0.29.0/src/delegate_agent/workflows/registry.py +0 -252
- delegate_agent_cli-0.29.0/src/delegate_agent/workflows/runtime.py +0 -1664
- delegate_agent_cli-0.29.0/src/delegate_agent/workflows/schema.py +0 -177
- delegate_agent_cli-0.29.0/tests/test_omp_read_only_behavior.py +0 -88
- delegate_agent_cli-0.29.0/tests/test_resume_parser.py +0 -54
- delegate_agent_cli-0.29.0/tests/test_tracked_output_bounds.py +0 -167
- delegate_agent_cli-0.29.0/tests/test_workflow_commands.py +0 -2738
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/LICENSE +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/SECURITY.md +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/bin/delegate.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/docs/assets/delegate-agent-header.png +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.claude.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.codex.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.cursor.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.droid.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.grok.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.judge.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/examples/task.kimi.json +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/setup.cfg +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/archived_logs.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/command_errors.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/config_commands.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/failover_state.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/git_utils.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/json_types.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/log_output.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/personas.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/profile_commands.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/prompt_instructions.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/seatbelt.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/setup_commands.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent/wsl.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_call_text_fixtures.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_child_root_env.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_delegate_isolation.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_failover_state.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_launch_error_hints.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_delivery.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_framing.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_io.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_prune.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push_batch.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_mail_push_cursor.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_packaging.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_persona_validation.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_snapshot_rendering.py +0 -0
- {delegate_agent_cli-0.29.0 → delegate_agent_cli-0.31.0}/tests/test_structured_output.py +0 -0
|
@@ -5,6 +5,412 @@ 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.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.
|
|
224
|
+
|
|
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.
|
|
268
|
+
|
|
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.
|
|
308
|
+
|
|
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
|
|
341
|
+
|
|
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
|
|
390
|
+
execution under the same workflow ID. Simulated agent and budget events stay
|
|
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.
|
|
413
|
+
|
|
8
414
|
## [0.29.0] - 2026-08-11
|
|
9
415
|
|
|
10
416
|
### Added
|
|
@@ -981,6 +1387,10 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
|
|
|
981
1387
|
|
|
982
1388
|
- Releases before 0.1.3 predate this changelog.
|
|
983
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
|
|
1393
|
+
[0.29.1]: https://github.com/treygoff24/delegate-agent/compare/v0.29.0...v0.29.1
|
|
984
1394
|
[0.29.0]: https://github.com/treygoff24/delegate-agent/compare/v0.28.0...v0.29.0
|
|
985
1395
|
[0.28.0]: https://github.com/treygoff24/delegate-agent/compare/v0.27.0...v0.28.0
|
|
986
1396
|
[0.27.0]: https://github.com/treygoff24/delegate-agent/compare/v0.26.0...v0.27.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
|
|
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
|
|
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
|
|
38
|
+
python3 -m pytest -q
|
|
39
39
|
ruff check .
|
|
40
40
|
ruff format --check .
|
|
41
41
|
```
|