cli-agent-runner 0.2.19__tar.gz → 0.2.20__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 (369) hide show
  1. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/CHANGELOG.md +10 -0
  2. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/PKG-INFO +1 -1
  3. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_emit/__init__.py +2 -0
  4. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_emit/rounds.py +36 -0
  5. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_version.py +2 -2
  6. cli_agent_runner-0.2.20/agent_runner/agent_runtime.py +789 -0
  7. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/api.py +2 -1
  8. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/_serve_round.py +16 -1
  9. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/events.py +1 -0
  10. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/runner.py +26 -0
  11. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/architecture.md +1 -0
  12. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/plugins.md +1 -1
  13. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/contract/test_public_api_surface.py +19 -10
  14. cli_agent_runner-0.2.20/tests/e2e/test_e2e_graceful_stop.py +48 -0
  15. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/e2e/test_e2e_install_systemd.py +5 -2
  16. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/e2e/test_e2e_monitor_remote.py +3 -1
  17. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/e2e/test_e2e_round_lifecycle.py +36 -7
  18. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_auto_stop_e2e.py +2 -2
  19. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_bounded_run.py +9 -4
  20. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_context_enricher_namespacing.py +2 -2
  21. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_dirty_handler_seam.py +2 -2
  22. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_fresh_eyes_signal.py +8 -4
  23. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_grace_kill_emission.py +8 -3
  24. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_install_dry_run.py +3 -1
  25. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_monitor_seeded.py +15 -7
  26. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_plugin_detector_loaded.py +6 -3
  27. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_plugin_owned_paths.py +15 -10
  28. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_plugin_real_flow.py +5 -6
  29. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_prompt_delivery_stdin.py +16 -4
  30. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_run_one_round_with_fake_agent.py +17 -7
  31. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_scaffold_presets.py +17 -7
  32. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_serve_loop.py +5 -2
  33. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_spawn_round_mem_floor.py +45 -47
  34. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_spawn_round_wedged.py +7 -2
  35. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_substrate_fingerprint.py +23 -40
  36. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/test_transient_error_backoff.py +4 -4
  37. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_architecture.py +24 -20
  38. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_atomic_write_enforced.py +2 -1
  39. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_authored_facts_declared.py +2 -1
  40. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_auto_stop_policy_ssot.py +3 -2
  41. cli_agent_runner-0.2.20/tests/invariants/test_bdd_test_conventions.py +116 -0
  42. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_catalogs.py +14 -4
  43. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_classification_ssot.py +2 -2
  44. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_config_error_consistency.py +7 -4
  45. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_config_value_set_ssot.py +4 -2
  46. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_dataclass_fields_have_producers.py +36 -11
  47. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_builtin_plugins.py +1 -2
  48. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_claims_match_ssot.py +7 -6
  49. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_cli_claims.py +12 -9
  50. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_operator_surface.py +7 -3
  51. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_test_pointers_exist.py +2 -1
  52. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_transient_error_claims.py +5 -2
  53. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_doc_usage_event_fields.py +3 -1
  54. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_docs_generated.py +2 -1
  55. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_docs_index_complete.py +3 -1
  56. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_entry_points_resolve.py +8 -5
  57. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_event_int_coercion.py +5 -2
  58. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_event_kind_registry.py +9 -8
  59. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_event_kinds_ssot.py +24 -19
  60. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_events_doc_contract.py +3 -2
  61. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_gen_blocks_name_their_source.py +1 -1
  62. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_hook_contract_docs.py +9 -4
  63. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_import_footprint.py +6 -3
  64. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_layer_2_loop_size.py +3 -1
  65. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_migrations_registry_ssot.py +2 -1
  66. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_module_boundaries.py +11 -12
  67. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_module_sizes.py +1 -1
  68. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_monitor_self_exclusion.py +2 -1
  69. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_ai_signatures.py +6 -6
  70. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_internal_refs.py +2 -1
  71. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_price_logic.py +2 -1
  72. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +2 -1
  73. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_raw_time.py +7 -3
  74. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_vacuous_invariants.py +6 -2
  75. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_no_version_refs.py +9 -5
  76. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_peek_schema_version.py +1 -3
  77. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_phase_select_stateless.py +4 -2
  78. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_plugins_config_stable.py +4 -2
  79. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_readme_zh_is_pointer.py +4 -2
  80. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_repo_constants_patched_in_tests.py +2 -2
  81. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_round_alloc_growth.py +3 -1
  82. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_round_log_decode_boundary.py +5 -4
  83. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_round_num_single_source.py +11 -4
  84. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_round_result_stable.py +8 -4
  85. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_set_diff_for_auto_tool_classification.py +7 -2
  86. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_stash_uses_sha_not_index.py +3 -2
  87. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_timeout_budget_invariant.py +8 -5
  88. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_upstream_schema_canary.py +11 -8
  89. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/test_vulture_whitelist_generated.py +2 -1
  90. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/literate/test_parser.py +27 -9
  91. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/literate/test_quickstart.py +1 -1
  92. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime.py +42 -16
  93. cli_agent_runner-0.2.20/tests/unit/test_agent_runtime_container.py +416 -0
  94. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime_grace.py +50 -27
  95. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime_marker_scan.py +4 -2
  96. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime_progress.py +11 -8
  97. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime_reap.py +138 -3
  98. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_agent_runtime_signal_name.py +4 -4
  99. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_assemble_prompt.py +29 -15
  100. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_events_stream.py +15 -21
  101. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_install.py +33 -27
  102. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_observation.py +49 -51
  103. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_read_round_num.py +4 -4
  104. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_resolve_phase.py +22 -20
  105. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_service.py +108 -66
  106. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_api_types.py +60 -32
  107. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_auto_stop_gating.py +19 -7
  108. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_catalogs.py +1 -1
  109. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cgroup_probe.py +108 -111
  110. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_claude_error_detector.py +115 -104
  111. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_claude_foreign_schema.py +22 -6
  112. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli.py +21 -12
  113. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_common.py +21 -9
  114. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_init_install.py +17 -8
  115. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_main_boundary.py +11 -5
  116. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_monitor_http.py +4 -3
  117. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_service_peek_monitor.py +32 -27
  118. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_cli_upgrade.py +65 -37
  119. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_codewhale_code_precedence.py +4 -3
  120. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_codewhale_plugin.py +13 -5
  121. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_coerce_int_poison.py +19 -5
  122. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config.py +276 -294
  123. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_fresh_eyes.py +9 -9
  124. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_max_rounds.py +9 -9
  125. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_nested_strictness.py +18 -5
  126. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_prompt_delivery.py +6 -4
  127. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_schedule.py +12 -7
  128. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_stop_file.py +10 -9
  129. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_strictness.py +19 -9
  130. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_substrate_fingerprint_paths.py +8 -2
  131. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_config_transient_error_action.py +9 -9
  132. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_context_store.py +18 -7
  133. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_control_char_config.py +14 -6
  134. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_default_dirty_handler.py +28 -13
  135. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_defenses.py +32 -14
  136. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_detect_hung_latch.py +10 -4
  137. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_detector_isolation.py +4 -2
  138. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_detector_protocol.py +8 -6
  139. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_dirty_handlers.py +9 -3
  140. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_docgen.py +48 -22
  141. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_effective_throttle_view.py +12 -3
  142. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_emit_config_migrated.py +4 -2
  143. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_emit_schedule.py +4 -2
  144. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_emit_schedule_phase_skipped.py +5 -3
  145. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_events.py +85 -65
  146. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_events_cmd.py +39 -65
  147. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_events_cmd_rollover.py +4 -1
  148. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_events_cmd_tail.py +3 -3
  149. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_events_jsonl_decode.py +32 -10
  150. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_example_dirty_handler.py +1 -1
  151. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_example_plugin.py +1 -2
  152. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_exit_cause.py +13 -1
  153. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_exit_classifier.py +12 -11
  154. cli_agent_runner-0.2.20/tests/unit/test_fresh_eyes_trigger.py +23 -0
  155. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_gemini_plugin.py +32 -28
  156. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_git_timeout.py +18 -8
  157. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_hook_failure_isolation.py +1 -1
  158. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_hook_redact_order.py +7 -3
  159. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_hooks.py +27 -17
  160. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_host_health.py +52 -21
  161. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_http_progress.py +19 -14
  162. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_http_progress_epoch.py +5 -1
  163. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_init_entry_points.py +23 -17
  164. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_interruptible_sleep_should_stop.py +5 -2
  165. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_kimi_plugin.py +16 -7
  166. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_lifecycle.py +36 -22
  167. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_metrics.py +18 -9
  168. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_metrics_cgroup_usage.py +17 -11
  169. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_metrics_swap.py +3 -2
  170. cli_agent_runner-0.2.20/tests/unit/test_migrate_cmd.py +282 -0
  171. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_migrations.py +157 -113
  172. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_assembly.py +15 -5
  173. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_cmd_severity.py +3 -1
  174. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_dedup_identity.py +22 -7
  175. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_dedup_rearm.py +9 -3
  176. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_detect_anomaly_repetitive.py +10 -11
  177. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_detect_rate_limit.py +14 -7
  178. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_detect_supervisor_stale.py +8 -4
  179. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_detectors.py +82 -46
  180. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_event_tail.py +5 -1
  181. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_loop.py +5 -4
  182. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_on_alert.py +3 -3
  183. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_remote.py +39 -24
  184. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_round_deferred_stale.py +8 -3
  185. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_monitor_schedule_pause.py +17 -7
  186. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_network_blip_signal_guard.py +6 -2
  187. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_open_round_log.py +5 -2
  188. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_orphan_chain_single_pass.py +5 -2
  189. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_outer_round_ceiling.py +6 -2
  190. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_peek_argparse.py +4 -3
  191. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_peek_project_isolation.py +5 -2
  192. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_peek_schedule.py +8 -4
  193. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_peek_select.py +7 -7
  194. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_phase_agent_launch.py +5 -3
  195. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_phase_profiles.py +25 -13
  196. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_phase_select.py +52 -19
  197. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_pi_plugin.py +30 -12
  198. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_plugin_constants.py +7 -4
  199. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_plugin_scan_parity.py +28 -12
  200. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_presets.py +56 -22
  201. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_primary_prompt_file_home.py +8 -2
  202. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_prompt_loader.py +33 -14
  203. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_read_json_hardening.py +22 -14
  204. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_redact.py +69 -39
  205. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_resolve.py +67 -15
  206. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_cmd.py +18 -10
  207. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_cmd_sigterm.py +6 -2
  208. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_log_helpers.py +31 -49
  209. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_outcome.py +46 -24
  210. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_outcome_agent_axis.py +8 -4
  211. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_round_view.py +16 -9
  212. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_runner.py +123 -217
  213. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_runner_sidecar_ordering.py +2 -2
  214. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_runner_throttle.py +117 -89
  215. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_scaffold.py +22 -19
  216. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_schedule.py +59 -23
  217. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_cmd_bounded.py +9 -19
  218. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_config_broken.py +9 -14
  219. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_crash_loop.py +41 -29
  220. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_mem_gate.py +17 -8
  221. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_phase_schedule.py +87 -29
  222. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_policy.py +43 -10
  223. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_round.py +2 -2
  224. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_round_cgroup_spine.py +26 -12
  225. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_round_log.py +7 -12
  226. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_round_oom_killed.py +12 -7
  227. cli_agent_runner-0.2.20/tests/unit/test_serve_round_terminate.py +123 -0
  228. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_schedule_gate.py +17 -7
  229. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_sentinel.py +16 -21
  230. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_serve_startup_hooks.py +14 -10
  231. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_service_mode.py +38 -14
  232. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_service_unit.py +58 -25
  233. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_startup_battery_exit.py +12 -7
  234. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_startup_check.py +46 -22
  235. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_substrate.py +21 -6
  236. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_supervisor_stale_self_blind.py +3 -1
  237. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_throttle_back_off_ladder.py +27 -6
  238. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_throttle_epoch_bound.py +24 -4
  239. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_throttle_plugin_classification.py +3 -1
  240. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_upgrade_migrate.py +28 -18
  241. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/test_vcs_state.py +55 -26
  242. cli_agent_runner-0.2.19/agent_runner/agent_runtime.py +0 -367
  243. cli_agent_runner-0.2.19/tests/e2e/test_e2e_graceful_stop.py +0 -28
  244. cli_agent_runner-0.2.19/tests/unit/test_fresh_eyes_trigger.py +0 -29
  245. cli_agent_runner-0.2.19/tests/unit/test_migrate_cmd.py +0 -390
  246. cli_agent_runner-0.2.19/tests/unit/test_serve_round_terminate.py +0 -32
  247. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.codecov.yml +0 -0
  248. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  249. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  250. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  251. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  252. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/workflows/ci.yml +0 -0
  253. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.github/workflows/release.yml +0 -0
  254. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.gitignore +0 -0
  255. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/.vulture-whitelist.py +0 -0
  256. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/BACKLOG.md +0 -0
  257. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/CODE_OF_CONDUCT.md +0 -0
  258. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/CONTRIBUTING.md +0 -0
  259. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/LICENSE +0 -0
  260. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/README.md +0 -0
  261. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/README.zh.md +0 -0
  262. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/SECURITY.md +0 -0
  263. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/__init__.py +0 -0
  264. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_docgen.py +0 -0
  265. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_emit/agent.py +0 -0
  266. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_emit/memory.py +0 -0
  267. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_emit/serve.py +0 -0
  268. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_monitor_detectors.py +0 -0
  269. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_monitor_registry.py +0 -0
  270. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_monitor_state.py +0 -0
  271. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_plugin_scan.py +0 -0
  272. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_redact.py +0 -0
  273. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_registry.py +0 -0
  274. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_resolve.py +0 -0
  275. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_round_outcome.py +0 -0
  276. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_round_support.py +0 -0
  277. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_serve_policy.py +0 -0
  278. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_substrate.py +0 -0
  279. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/_throttle.py +0 -0
  280. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/api_types.py +0 -0
  281. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/__init__.py +0 -0
  282. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/_constants.py +0 -0
  283. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/claude_rate_limit.py +0 -0
  284. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/codewhale.py +0 -0
  285. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/default_dirty_handler.py +0 -0
  286. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/gemini.py +0 -0
  287. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/kimi.py +0 -0
  288. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/builtin_plugins/pi.py +0 -0
  289. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/__init__.py +0 -0
  290. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/__main__.py +0 -0
  291. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/_serve_cgroup.py +0 -0
  292. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/common.py +0 -0
  293. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/events_cmd.py +0 -0
  294. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/init_cmd.py +0 -0
  295. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/install_cmd.py +0 -0
  296. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/migrate_cmd.py +0 -0
  297. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/monitor_cmd.py +0 -0
  298. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/peek_cmd.py +0 -0
  299. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/round_cmd.py +0 -0
  300. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/serve_cmd.py +0 -0
  301. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/service_cmd.py +0 -0
  302. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/cli/upgrade_cmd.py +0 -0
  303. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/clock.py +0 -0
  304. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/__init__.py +0 -0
  305. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/errors.py +0 -0
  306. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/loader.py +0 -0
  307. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/models.py +0 -0
  308. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/parsers.py +0 -0
  309. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/config/validators.py +0 -0
  310. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/context_store.py +0 -0
  311. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/defenses.py +0 -0
  312. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/hooks.py +0 -0
  313. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/host_health.py +0 -0
  314. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/http_progress.py +0 -0
  315. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/lifecycle.py +0 -0
  316. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/metrics.py +0 -0
  317. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/migrations.py +0 -0
  318. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/monitor.py +0 -0
  319. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/phase_select.py +0 -0
  320. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/__init__.py +0 -0
  321. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/aider.toml +0 -0
  322. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/claude.toml +0 -0
  323. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/codewhale.toml +0 -0
  324. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/gemini.toml +0 -0
  325. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/kimi.toml +0 -0
  326. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/presets/pi.toml +0 -0
  327. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/prompt_loader.py +0 -0
  328. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/remote_relay.py +0 -0
  329. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/round_log.py +0 -0
  330. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/round_view.py +0 -0
  331. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/scaffold.py +0 -0
  332. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/schedule.py +0 -0
  333. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/service_unit.py +0 -0
  334. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/startup_check.py +0 -0
  335. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/agent_runner/vcs_state.py +0 -0
  336. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/build.sh +0 -0
  337. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/README.md +0 -0
  338. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/commands.md +0 -0
  339. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/configuration.md +0 -0
  340. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/events.md +0 -0
  341. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/long-running-agents.md +0 -0
  342. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/memory-efficiency.md +0 -0
  343. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/migrations/0.2.md +0 -0
  344. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/quickstart.md +0 -0
  345. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/recipes/aider.md +0 -0
  346. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/recipes/codewhale.md +0 -0
  347. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/recipes/kimi.md +0 -0
  348. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/recipes/pi.md +0 -0
  349. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/runbook.md +0 -0
  350. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/docs/thesis.md +0 -0
  351. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/pyproject.toml +0 -0
  352. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/__init__.py +0 -0
  353. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/_clock.py +0 -0
  354. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/_test_helpers.py +0 -0
  355. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/conftest.py +0 -0
  356. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/contract/__init__.py +0 -0
  357. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/e2e/__init__.py +0 -0
  358. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/e2e/conftest.py +0 -0
  359. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
  360. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
  361. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
  362. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/generate_vulture_whitelist.py +0 -0
  363. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/integration/__init__.py +0 -0
  364. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/__init__.py +0 -0
  365. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/_docs.py +0 -0
  366. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/invariants/_event_scan.py +0 -0
  367. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/literate/__init__.py +0 -0
  368. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/literate/parser.py +0 -0
  369. {cli_agent_runner-0.2.19 → cli_agent_runner-0.2.20}/tests/unit/__init__.py +0 -0
@@ -5,6 +5,16 @@ 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.20] - 2026-09-09
9
+
10
+ ### Fixed
11
+ - 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.
12
+ - 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.
13
+
14
+ ### Notes
15
+ - Not breaking: no `agent-runner migrate` step, no systemd unit change.
16
+ - `peek --json` gains the new `round_container_orphan_risk` event kind; existing kinds unchanged.
17
+
8
18
  ## [0.2.19] - 2026-09-09
9
19
 
10
20
  ### 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.20
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
@@ -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.20'
22
+ __version_tuple__ = version_tuple = (0, 2, 20)
23
23
 
24
24
  __commit_id__ = commit_id = None