cli-agent-runner 0.2.19__tar.gz → 0.2.21__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 (375) hide show
  1. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.vulture-whitelist.py +1 -0
  2. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/CHANGELOG.md +23 -0
  3. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/PKG-INFO +1 -1
  4. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/SECURITY.md +20 -0
  5. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_emit/__init__.py +2 -0
  6. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_emit/rounds.py +36 -0
  7. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_version.py +2 -2
  8. cli_agent_runner-0.2.21/agent_runner/agent_runtime.py +814 -0
  9. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/api.py +2 -1
  10. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/_serve_round.py +16 -1
  11. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/serve_cmd.py +13 -1
  12. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/models.py +11 -0
  13. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/parsers.py +9 -0
  14. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/events.py +1 -0
  15. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/runner.py +27 -1
  16. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/startup_check.py +41 -2
  17. cli_agent_runner-0.2.21/deploy/Dockerfile +24 -0
  18. cli_agent_runner-0.2.21/deploy/docker-compose.yml +18 -0
  19. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/README.md +2 -0
  20. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/architecture.md +1 -0
  21. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/commands.md +1 -1
  22. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/configuration.md +5 -1
  23. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/plugins.md +1 -1
  24. cli_agent_runner-0.2.21/docs/recipes/container-pi.md +179 -0
  25. cli_agent_runner-0.2.21/docs/recipes/deploy-all-in-one.md +49 -0
  26. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/contract/test_public_api_surface.py +19 -10
  27. cli_agent_runner-0.2.21/tests/e2e/test_e2e_graceful_stop.py +48 -0
  28. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/e2e/test_e2e_install_systemd.py +5 -2
  29. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/e2e/test_e2e_monitor_remote.py +3 -1
  30. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/e2e/test_e2e_round_lifecycle.py +36 -7
  31. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_auto_stop_e2e.py +2 -2
  32. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_bounded_run.py +9 -4
  33. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_context_enricher_namespacing.py +2 -2
  34. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_dirty_handler_seam.py +2 -2
  35. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_fresh_eyes_signal.py +8 -4
  36. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_grace_kill_emission.py +8 -3
  37. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_install_dry_run.py +3 -1
  38. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_monitor_seeded.py +15 -7
  39. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_plugin_detector_loaded.py +6 -3
  40. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_plugin_owned_paths.py +15 -10
  41. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_plugin_real_flow.py +5 -6
  42. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_prompt_delivery_stdin.py +16 -4
  43. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_run_one_round_with_fake_agent.py +17 -7
  44. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_scaffold_presets.py +17 -7
  45. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_serve_loop.py +5 -2
  46. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_spawn_round_mem_floor.py +45 -47
  47. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_spawn_round_wedged.py +7 -2
  48. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_substrate_fingerprint.py +23 -40
  49. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/test_transient_error_backoff.py +4 -4
  50. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_architecture.py +25 -20
  51. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_atomic_write_enforced.py +2 -1
  52. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_authored_facts_declared.py +2 -1
  53. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_auto_stop_policy_ssot.py +3 -2
  54. cli_agent_runner-0.2.21/tests/invariants/test_bdd_test_conventions.py +116 -0
  55. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_catalogs.py +14 -4
  56. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_classification_ssot.py +2 -2
  57. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_config_error_consistency.py +7 -4
  58. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_config_value_set_ssot.py +4 -2
  59. cli_agent_runner-0.2.21/tests/invariants/test_container_stop_bound.py +18 -0
  60. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_dataclass_fields_have_producers.py +36 -11
  61. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_builtin_plugins.py +1 -2
  62. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_claims_match_ssot.py +7 -6
  63. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_cli_claims.py +12 -9
  64. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_operator_surface.py +7 -3
  65. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_test_pointers_exist.py +2 -1
  66. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_transient_error_claims.py +5 -2
  67. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_doc_usage_event_fields.py +3 -1
  68. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_docs_generated.py +2 -1
  69. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_docs_index_complete.py +3 -1
  70. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_entry_points_resolve.py +8 -5
  71. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_event_int_coercion.py +5 -2
  72. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_event_kind_registry.py +9 -8
  73. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_event_kinds_ssot.py +24 -19
  74. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_events_doc_contract.py +3 -2
  75. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_gen_blocks_name_their_source.py +1 -1
  76. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_hook_contract_docs.py +9 -4
  77. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_import_footprint.py +6 -3
  78. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_layer_2_loop_size.py +3 -1
  79. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_migrations_registry_ssot.py +2 -1
  80. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_module_boundaries.py +11 -12
  81. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_module_sizes.py +1 -1
  82. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_monitor_self_exclusion.py +2 -1
  83. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_ai_signatures.py +6 -6
  84. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_internal_refs.py +2 -1
  85. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_price_logic.py +2 -1
  86. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +2 -1
  87. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_raw_time.py +7 -3
  88. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_vacuous_invariants.py +6 -2
  89. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_no_version_refs.py +9 -5
  90. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_peek_schema_version.py +1 -3
  91. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_phase_select_stateless.py +4 -2
  92. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_plugins_config_stable.py +4 -2
  93. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_readme_zh_is_pointer.py +4 -2
  94. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_repo_constants_patched_in_tests.py +2 -2
  95. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_round_alloc_growth.py +3 -1
  96. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_round_log_decode_boundary.py +5 -4
  97. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_round_num_single_source.py +11 -4
  98. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_round_result_stable.py +8 -4
  99. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_set_diff_for_auto_tool_classification.py +7 -2
  100. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_stash_uses_sha_not_index.py +3 -2
  101. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_timeout_budget_invariant.py +8 -5
  102. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_upstream_schema_canary.py +11 -8
  103. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/test_vulture_whitelist_generated.py +2 -1
  104. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/literate/test_parser.py +27 -9
  105. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/literate/test_quickstart.py +1 -1
  106. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime.py +42 -16
  107. cli_agent_runner-0.2.21/tests/unit/test_agent_runtime_container.py +459 -0
  108. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime_grace.py +50 -27
  109. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime_marker_scan.py +4 -2
  110. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime_progress.py +11 -8
  111. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime_reap.py +138 -3
  112. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_agent_runtime_signal_name.py +4 -4
  113. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_assemble_prompt.py +29 -15
  114. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_events_stream.py +15 -21
  115. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_install.py +33 -27
  116. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_observation.py +49 -51
  117. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_read_round_num.py +4 -4
  118. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_resolve_phase.py +22 -20
  119. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_service.py +108 -66
  120. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_api_types.py +60 -32
  121. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_auto_stop_gating.py +19 -7
  122. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_catalogs.py +1 -1
  123. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cgroup_probe.py +108 -111
  124. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_claude_error_detector.py +115 -104
  125. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_claude_foreign_schema.py +22 -6
  126. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli.py +21 -12
  127. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_common.py +21 -9
  128. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_init_install.py +17 -8
  129. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_main_boundary.py +11 -5
  130. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_monitor_http.py +4 -3
  131. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_service_peek_monitor.py +32 -27
  132. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_cli_upgrade.py +65 -37
  133. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_codewhale_code_precedence.py +4 -3
  134. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_codewhale_plugin.py +13 -5
  135. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_coerce_int_poison.py +19 -5
  136. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config.py +317 -294
  137. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_fresh_eyes.py +9 -9
  138. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_max_rounds.py +9 -9
  139. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_nested_strictness.py +18 -5
  140. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_prompt_delivery.py +6 -4
  141. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_schedule.py +12 -7
  142. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_stop_file.py +10 -9
  143. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_strictness.py +19 -9
  144. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_substrate_fingerprint_paths.py +8 -2
  145. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_config_transient_error_action.py +9 -9
  146. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_context_store.py +18 -7
  147. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_control_char_config.py +14 -6
  148. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_default_dirty_handler.py +28 -13
  149. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_defenses.py +32 -14
  150. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_detect_hung_latch.py +10 -4
  151. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_detector_isolation.py +4 -2
  152. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_detector_protocol.py +8 -6
  153. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_dirty_handlers.py +9 -3
  154. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_docgen.py +48 -22
  155. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_effective_throttle_view.py +12 -3
  156. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_emit_config_migrated.py +4 -2
  157. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_emit_schedule.py +4 -2
  158. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_emit_schedule_phase_skipped.py +5 -3
  159. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_events.py +85 -65
  160. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_events_cmd.py +39 -65
  161. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_events_cmd_rollover.py +4 -1
  162. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_events_cmd_tail.py +3 -3
  163. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_events_jsonl_decode.py +32 -10
  164. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_example_dirty_handler.py +1 -1
  165. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_example_plugin.py +1 -2
  166. cli_agent_runner-0.2.21/tests/unit/test_exec_prefix.py +150 -0
  167. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_exit_cause.py +13 -1
  168. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_exit_classifier.py +12 -11
  169. cli_agent_runner-0.2.21/tests/unit/test_fresh_eyes_trigger.py +23 -0
  170. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_gemini_plugin.py +32 -28
  171. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_git_timeout.py +18 -8
  172. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_hook_failure_isolation.py +1 -1
  173. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_hook_redact_order.py +7 -3
  174. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_hooks.py +27 -17
  175. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_host_health.py +52 -21
  176. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_http_progress.py +19 -14
  177. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_http_progress_epoch.py +5 -1
  178. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_init_entry_points.py +23 -17
  179. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_interruptible_sleep_should_stop.py +5 -2
  180. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_kimi_plugin.py +16 -7
  181. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_lifecycle.py +36 -22
  182. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_metrics.py +18 -9
  183. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_metrics_cgroup_usage.py +17 -11
  184. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_metrics_swap.py +3 -2
  185. cli_agent_runner-0.2.21/tests/unit/test_migrate_cmd.py +282 -0
  186. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_migrations.py +157 -113
  187. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_assembly.py +15 -5
  188. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_cmd_severity.py +3 -1
  189. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_dedup_identity.py +22 -7
  190. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_dedup_rearm.py +9 -3
  191. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_detect_anomaly_repetitive.py +10 -11
  192. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_detect_rate_limit.py +14 -7
  193. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_detect_supervisor_stale.py +8 -4
  194. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_detectors.py +82 -46
  195. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_event_tail.py +5 -1
  196. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_loop.py +5 -4
  197. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_on_alert.py +3 -3
  198. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_remote.py +39 -24
  199. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_round_deferred_stale.py +8 -3
  200. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_monitor_schedule_pause.py +17 -7
  201. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_network_blip_signal_guard.py +6 -2
  202. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_open_round_log.py +5 -2
  203. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_orphan_chain_single_pass.py +5 -2
  204. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_outer_round_ceiling.py +6 -2
  205. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_peek_argparse.py +4 -3
  206. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_peek_project_isolation.py +5 -2
  207. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_peek_schedule.py +8 -4
  208. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_peek_select.py +7 -7
  209. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_phase_agent_launch.py +5 -3
  210. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_phase_profiles.py +25 -13
  211. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_phase_select.py +52 -19
  212. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_pi_plugin.py +30 -12
  213. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_plugin_constants.py +7 -4
  214. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_plugin_scan_parity.py +28 -12
  215. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_presets.py +56 -22
  216. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_primary_prompt_file_home.py +8 -2
  217. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_prompt_loader.py +33 -14
  218. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_read_json_hardening.py +22 -14
  219. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_redact.py +69 -39
  220. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_resolve.py +67 -15
  221. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_cmd.py +18 -10
  222. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_cmd_sigterm.py +6 -2
  223. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_log_helpers.py +31 -49
  224. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_outcome.py +46 -24
  225. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_outcome_agent_axis.py +8 -4
  226. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_round_view.py +16 -9
  227. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_runner.py +123 -217
  228. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_runner_sidecar_ordering.py +2 -2
  229. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_runner_throttle.py +117 -89
  230. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_scaffold.py +22 -19
  231. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_schedule.py +59 -23
  232. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_cmd_bounded.py +9 -19
  233. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_config_broken.py +9 -14
  234. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_crash_loop.py +41 -29
  235. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_mem_gate.py +17 -8
  236. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_phase_schedule.py +87 -29
  237. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_policy.py +43 -10
  238. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_round.py +2 -2
  239. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_round_cgroup_spine.py +26 -12
  240. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_round_log.py +7 -12
  241. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_round_oom_killed.py +12 -7
  242. cli_agent_runner-0.2.21/tests/unit/test_serve_round_terminate.py +123 -0
  243. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_schedule_gate.py +17 -7
  244. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_sentinel.py +16 -21
  245. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_serve_startup_hooks.py +14 -10
  246. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_service_mode.py +38 -14
  247. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_service_unit.py +58 -25
  248. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_startup_battery_exit.py +12 -7
  249. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_startup_check.py +97 -22
  250. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_substrate.py +21 -6
  251. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_supervisor_stale_self_blind.py +3 -1
  252. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_throttle_back_off_ladder.py +27 -6
  253. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_throttle_epoch_bound.py +24 -4
  254. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_throttle_plugin_classification.py +3 -1
  255. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_upgrade_migrate.py +28 -18
  256. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/test_vcs_state.py +55 -26
  257. cli_agent_runner-0.2.19/agent_runner/agent_runtime.py +0 -367
  258. cli_agent_runner-0.2.19/tests/e2e/test_e2e_graceful_stop.py +0 -28
  259. cli_agent_runner-0.2.19/tests/unit/test_fresh_eyes_trigger.py +0 -29
  260. cli_agent_runner-0.2.19/tests/unit/test_migrate_cmd.py +0 -390
  261. cli_agent_runner-0.2.19/tests/unit/test_serve_round_terminate.py +0 -32
  262. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.codecov.yml +0 -0
  263. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  264. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  265. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  266. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  267. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/workflows/ci.yml +0 -0
  268. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.github/workflows/release.yml +0 -0
  269. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/.gitignore +0 -0
  270. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/BACKLOG.md +0 -0
  271. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/CODE_OF_CONDUCT.md +0 -0
  272. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/CONTRIBUTING.md +0 -0
  273. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/LICENSE +0 -0
  274. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/README.md +0 -0
  275. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/README.zh.md +0 -0
  276. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/__init__.py +0 -0
  277. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_docgen.py +0 -0
  278. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_emit/agent.py +0 -0
  279. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_emit/memory.py +0 -0
  280. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_emit/serve.py +0 -0
  281. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_monitor_detectors.py +0 -0
  282. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_monitor_registry.py +0 -0
  283. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_monitor_state.py +0 -0
  284. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_plugin_scan.py +0 -0
  285. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_redact.py +0 -0
  286. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_registry.py +0 -0
  287. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_resolve.py +0 -0
  288. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_round_outcome.py +0 -0
  289. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_round_support.py +0 -0
  290. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_serve_policy.py +0 -0
  291. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_substrate.py +0 -0
  292. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/_throttle.py +0 -0
  293. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/api_types.py +0 -0
  294. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/__init__.py +0 -0
  295. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/_constants.py +0 -0
  296. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/claude_rate_limit.py +0 -0
  297. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/codewhale.py +0 -0
  298. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/default_dirty_handler.py +0 -0
  299. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/gemini.py +0 -0
  300. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/kimi.py +0 -0
  301. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/builtin_plugins/pi.py +0 -0
  302. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/__init__.py +0 -0
  303. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/__main__.py +0 -0
  304. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/_serve_cgroup.py +0 -0
  305. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/common.py +0 -0
  306. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/events_cmd.py +0 -0
  307. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/init_cmd.py +0 -0
  308. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/install_cmd.py +0 -0
  309. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/migrate_cmd.py +0 -0
  310. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/monitor_cmd.py +0 -0
  311. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/peek_cmd.py +0 -0
  312. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/round_cmd.py +0 -0
  313. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/service_cmd.py +0 -0
  314. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/cli/upgrade_cmd.py +0 -0
  315. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/clock.py +0 -0
  316. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/__init__.py +0 -0
  317. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/errors.py +0 -0
  318. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/loader.py +0 -0
  319. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/config/validators.py +0 -0
  320. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/context_store.py +0 -0
  321. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/defenses.py +0 -0
  322. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/hooks.py +0 -0
  323. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/host_health.py +0 -0
  324. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/http_progress.py +0 -0
  325. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/lifecycle.py +0 -0
  326. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/metrics.py +0 -0
  327. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/migrations.py +0 -0
  328. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/monitor.py +0 -0
  329. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/phase_select.py +0 -0
  330. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/__init__.py +0 -0
  331. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/aider.toml +0 -0
  332. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/claude.toml +0 -0
  333. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/codewhale.toml +0 -0
  334. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/gemini.toml +0 -0
  335. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/kimi.toml +0 -0
  336. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/presets/pi.toml +0 -0
  337. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/prompt_loader.py +0 -0
  338. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/remote_relay.py +0 -0
  339. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/round_log.py +0 -0
  340. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/round_view.py +0 -0
  341. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/scaffold.py +0 -0
  342. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/schedule.py +0 -0
  343. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/service_unit.py +0 -0
  344. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/agent_runner/vcs_state.py +0 -0
  345. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/build.sh +0 -0
  346. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/events.md +0 -0
  347. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/long-running-agents.md +0 -0
  348. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/memory-efficiency.md +0 -0
  349. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/migrations/0.2.md +0 -0
  350. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/quickstart.md +0 -0
  351. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/recipes/aider.md +0 -0
  352. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/recipes/codewhale.md +0 -0
  353. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/recipes/kimi.md +0 -0
  354. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/recipes/pi.md +0 -0
  355. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/runbook.md +0 -0
  356. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/docs/thesis.md +0 -0
  357. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/pyproject.toml +0 -0
  358. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/__init__.py +0 -0
  359. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/_clock.py +0 -0
  360. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/_test_helpers.py +0 -0
  361. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/conftest.py +0 -0
  362. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/contract/__init__.py +0 -0
  363. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/e2e/__init__.py +0 -0
  364. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/e2e/conftest.py +0 -0
  365. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
  366. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
  367. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
  368. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/generate_vulture_whitelist.py +0 -0
  369. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/integration/__init__.py +0 -0
  370. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/__init__.py +0 -0
  371. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/_docs.py +0 -0
  372. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/invariants/_event_scan.py +0 -0
  373. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/literate/__init__.py +0 -0
  374. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/literate/parser.py +0 -0
  375. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.21}/tests/unit/__init__.py +0 -0
@@ -133,6 +133,7 @@ prompt_arg_template
133
133
  name
134
134
  env
135
135
  prompt_delivery
136
+ exec_prefix
136
137
 
137
138
  # agent_runner.config.models.Config
138
139
  agent
@@ -5,6 +5,29 @@ All notable changes to this project will be 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.2.21] - 2026-09-11
9
+
10
+ ### Added
11
+ - `[agent] exec_prefix`: an optional token list prepended to the agent command at spawn (with `{work_dir}` substituted), so the agent can run inside a container you supply (`docker`/`podman run …`) while agent-runner supervises the resulting process from outside. The agent's identity — throttle, crash-loop, usage plugins — still keys on `command`, unchanged.
12
+ - Startup check: a stdin-delivery agent whose container `exec_prefix` omits `-i`/`--interactive` now fails loudly at boot instead of silently hanging until the round-timeout kill.
13
+ - Docs: container recipes (`docs/recipes/container-pi.md`, with Kimi/Claude/rootless-podman deltas), an all-in-one deploy recipe (`deploy/` + `docs/recipes/deploy-all-in-one.md`), and a `SECURITY.md` containment section.
14
+
15
+ ### Fixed
16
+ - The best-effort container stop no longer reports a false "stop failed" when a `--rm` container has already exited on its own; an already-removed container now counts as a successful stop.
17
+
18
+ ### Notes
19
+ - Not breaking: no `agent-runner migrate` step, no systemd unit change.
20
+
21
+ ## [0.2.20] - 2026-09-09
22
+
23
+ ### Fixed
24
+ - A supervised CLI's `setsid()`-detached descendant — outside the round leader's process group — is now killed at the hard-kill fallthrough instead of being left running, orphaned, after the round is torn down.
25
+ - A configured `docker run`/`podman run` command (including `sudo`/`env`-wrapped and global-flag forms) escapes killpg-based termination and could previously outlive the round silently. It's now detected, agent-runner warns loudly and emits a `round_container_orphan_risk` event that the hard-wall can't guarantee stopping it, and best-effort-stops the container via an injected `--cidfile` for the plain (unwrapped, unflagged) form. Full container lifecycle management remains a later-release item.
26
+
27
+ ### Notes
28
+ - Not breaking: no `agent-runner migrate` step, no systemd unit change.
29
+ - `peek --json` gains the new `round_container_orphan_risk` event kind; existing kinds unchanged.
30
+
8
31
  ## [0.2.19] - 2026-09-09
9
32
 
10
33
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cli-agent-runner
3
- Version: 0.2.19
3
+ Version: 0.2.21
4
4
  Summary: Restart-on-exit supervisor for autonomous CLI agents
5
5
  Project-URL: Homepage, https://github.com/wan9yu/cli-agent-runner
6
6
  Project-URL: Documentation, https://github.com/wan9yu/cli-agent-runner#readme
@@ -37,6 +37,26 @@ unprivileged user, inside a container or VM, without passwordless sudo, and
37
37
  with egress limits. The supervisor's defenses bound the blast radius of a
38
38
  *misbehaving* agent, not a *hostile* one.
39
39
 
40
+ ## Containment
41
+
42
+ If you need to bound what the agent can reach, run it inside a container (or
43
+ VM) you supply, via `[agent] exec_prefix` — see
44
+ [docs/recipes/container-pi.md](docs/recipes/container-pi.md). The container
45
+ (or VM) enforces the isolation; agent-runner still just watches the
46
+ resulting process from outside, the same way it watches a bare agent
47
+ process.
48
+
49
+ One limit worth knowing: agent-runner's own process-tree defenses (reaping a
50
+ hung round's descendants) only see processes in its own subtree, and a
51
+ container-runtime-managed process usually isn't one of them. On a stuck
52
+ round, the one remaining lever is stopping the container by the id
53
+ agent-runner captured at spawn, which only works for a plain `docker
54
+ run …`/`podman run …` invocation — not one wrapped in `sudo` or other global
55
+ flags (see container-pi.md's footguns). Using a container this way gives you
56
+ a narrower safety net than the host-level reaping a bare agent process gets,
57
+ not a wider one — keep running it as a dedicated unprivileged user with no
58
+ passwordless sudo and tight egress limits regardless.
59
+
40
60
  ## Scope
41
61
 
42
62
  In scope: the `agent_runner` Python package, its CLI, its bundled systemd
@@ -40,6 +40,7 @@ from agent_runner._emit.memory import ( # noqa: F401 — public re-export
40
40
  )
41
41
  from agent_runner._emit.rounds import ( # noqa: F401 — public re-export
42
42
  emit_fresh_eyes_round_triggered,
43
+ emit_round_container_orphan_risk,
43
44
  emit_round_grace_extended,
44
45
  emit_round_grace_kill,
45
46
  emit_round_logs_prune_deferred,
@@ -79,6 +80,7 @@ __all__ = [
79
80
  "emit_mem_pressure_deferred_to_cgroup",
80
81
  "emit_rate_limit_stop",
81
82
  "emit_round_cgroup_memory",
83
+ "emit_round_container_orphan_risk",
82
84
  "emit_round_deferred",
83
85
  "emit_round_grace_extended",
84
86
  "emit_round_grace_kill",
@@ -47,6 +47,42 @@ def emit_round_substrate_after(
47
47
  )
48
48
 
49
49
 
50
+ def emit_round_container_orphan_risk(
51
+ log_dir: Path,
52
+ *,
53
+ round_num: int,
54
+ runtime: str,
55
+ container_id: str | None,
56
+ stop_ok: bool | None,
57
+ ) -> None:
58
+ """Emit when a round's configured command launches a container (`docker run`
59
+ / `podman run`) and the round had to be terminated: killpg-based
60
+ termination reaches the launcher process, not conmon/containerd's
61
+ double-fork-detached container itself, so the R1128 hard-wall cannot
62
+ guarantee the container stops. This event is the actual floor -- it must
63
+ never fire silently, regardless of whether the best-effort stop below
64
+ lands.
65
+
66
+ `container_id`/`stop_ok` describe the best-effort `<runtime> stop`
67
+ attempt made when an id was recoverable (an injected or pre-existing
68
+ `--cidfile`): `container_id` is None when no id could be recovered (no
69
+ stop was attempted, so `stop_ok` is also None); otherwise `stop_ok` is
70
+ whether that `stop` call exited zero. Full container lifecycle
71
+ management (cgroup delegation, a containment ladder) is out of scope
72
+ here -- left for a future release.
73
+ """
74
+ from agent_runner.events import ROUND_CONTAINER_ORPHAN_RISK, emit
75
+
76
+ emit(
77
+ log_dir,
78
+ ROUND_CONTAINER_ORPHAN_RISK,
79
+ round_num=round_num,
80
+ runtime=runtime,
81
+ container_id=container_id,
82
+ stop_ok=stop_ok,
83
+ )
84
+
85
+
50
86
  def emit_round_supervisor_wedged(
51
87
  log_dir: Path, *, pid: int, timeout_s: int, log_path: Path
52
88
  ) -> None:
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.2.19'
22
- __version_tuple__ = version_tuple = (0, 2, 19)
21
+ __version__ = version = '0.2.21'
22
+ __version_tuple__ = version_tuple = (0, 2, 21)
23
23
 
24
24
  __commit_id__ = commit_id = None