cli-agent-runner 0.2.13__tar.gz → 0.2.15__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 (342) hide show
  1. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.vulture-whitelist.py +27 -19
  2. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/CHANGELOG.md +30 -0
  3. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/PKG-INFO +10 -7
  4. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/README.md +9 -6
  5. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_docgen.py +4 -2
  6. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_emit.py +70 -7
  7. cli_agent_runner-0.2.15/agent_runner/_monitor_detectors.py +581 -0
  8. cli_agent_runner-0.2.15/agent_runner/_monitor_registry.py +98 -0
  9. cli_agent_runner-0.2.15/agent_runner/_monitor_state.py +170 -0
  10. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_resolve.py +20 -2
  11. cli_agent_runner-0.2.15/agent_runner/_round_support.py +100 -0
  12. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_serve_policy.py +30 -0
  13. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_throttle.py +60 -1
  14. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_version.py +2 -2
  15. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/api.py +23 -85
  16. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/claude_rate_limit.py +5 -1
  17. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/common.py +11 -5
  18. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/events_cmd.py +1 -4
  19. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/migrate_cmd.py +2 -3
  20. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/serve_cmd.py +192 -30
  21. cli_agent_runner-0.2.15/agent_runner/config/__init__.py +64 -0
  22. cli_agent_runner-0.2.15/agent_runner/config/errors.py +12 -0
  23. cli_agent_runner-0.2.15/agent_runner/config/loader.py +107 -0
  24. cli_agent_runner-0.2.15/agent_runner/config/models.py +304 -0
  25. cli_agent_runner-0.2.15/agent_runner/config/parsers.py +535 -0
  26. cli_agent_runner-0.2.15/agent_runner/config/validators.py +173 -0
  27. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/defenses.py +12 -0
  28. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/events.py +4 -0
  29. cli_agent_runner-0.2.15/agent_runner/host_health.py +180 -0
  30. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/http_progress.py +2 -14
  31. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/metrics.py +61 -1
  32. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/migrations.py +47 -0
  33. cli_agent_runner-0.2.15/agent_runner/monitor.py +326 -0
  34. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/service_unit.py +2 -0
  35. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/startup_check.py +15 -2
  36. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/vcs_state.py +11 -3
  37. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/architecture.md +26 -8
  38. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/commands.md +4 -3
  39. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/configuration.md +9 -5
  40. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/migrations/0.2.md +90 -0
  41. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/plugins.md +2 -2
  42. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/runbook.md +41 -21
  43. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/contract/test_public_api_surface.py +6 -1
  44. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_fresh_eyes_signal.py +1 -1
  45. cli_agent_runner-0.2.15/tests/integration/test_monitor_seeded.py +141 -0
  46. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_plugin_owned_paths.py +3 -3
  47. cli_agent_runner-0.2.15/tests/integration/test_spawn_round_mem_floor.py +224 -0
  48. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_architecture.py +15 -4
  49. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_config_error_consistency.py +20 -16
  50. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_config_value_set_ssot.py +12 -7
  51. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_claims_match_ssot.py +11 -0
  52. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_event_int_coercion.py +7 -1
  53. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_event_kinds_ssot.py +5 -0
  54. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_module_boundaries.py +2 -2
  55. cli_agent_runner-0.2.15/tests/invariants/test_no_internal_refs.py +39 -0
  56. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_peek_schema_version.py +1 -1
  57. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_repo_constants_patched_in_tests.py +1 -1
  58. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_round_log_decode_boundary.py +3 -2
  59. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_observation.py +2 -1
  60. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_service.py +30 -0
  61. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_claude_error_detector.py +1 -1
  62. cli_agent_runner-0.2.15/tests/unit/test_cli_common.py +93 -0
  63. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli_main_boundary.py +23 -0
  64. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config.py +97 -11
  65. cli_agent_runner-0.2.15/tests/unit/test_config_nested_strictness.py +83 -0
  66. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_defenses.py +2 -2
  67. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_events_cmd.py +23 -0
  68. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_events_jsonl_decode.py +36 -0
  69. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_gemini_plugin.py +1 -1
  70. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_git_timeout.py +36 -0
  71. cli_agent_runner-0.2.15/tests/unit/test_host_health.py +194 -0
  72. cli_agent_runner-0.2.15/tests/unit/test_metrics.py +103 -0
  73. cli_agent_runner-0.2.15/tests/unit/test_migrate_cmd.py +390 -0
  74. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_migrations.py +9 -0
  75. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_assembly.py +1 -1
  76. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_detectors.py +66 -3
  77. cli_agent_runner-0.2.15/tests/unit/test_monitor_round_deferred_stale.py +59 -0
  78. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_resolve.py +42 -0
  79. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_runner_throttle.py +36 -0
  80. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_config_broken.py +1 -1
  81. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_crash_loop.py +77 -1
  82. cli_agent_runner-0.2.15/tests/unit/test_serve_mem_gate.py +243 -0
  83. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_phase_schedule.py +1 -1
  84. cli_agent_runner-0.2.15/tests/unit/test_serve_policy.py +68 -0
  85. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_round_log.py +41 -2
  86. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_schedule_gate.py +1 -1
  87. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_sentinel.py +6 -6
  88. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_startup_hooks.py +1 -1
  89. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_startup_check.py +20 -0
  90. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_vcs_state.py +2 -2
  91. cli_agent_runner-0.2.13/agent_runner/config.py +0 -960
  92. cli_agent_runner-0.2.13/agent_runner/monitor.py +0 -963
  93. cli_agent_runner-0.2.13/tests/integration/test_monitor_seeded.py +0 -52
  94. cli_agent_runner-0.2.13/tests/unit/test_cli_common.py +0 -37
  95. cli_agent_runner-0.2.13/tests/unit/test_metrics.py +0 -48
  96. cli_agent_runner-0.2.13/tests/unit/test_migrate_cmd.py +0 -186
  97. cli_agent_runner-0.2.13/tests/unit/test_serve_policy.py +0 -29
  98. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.codecov.yml +0 -0
  99. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  100. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  101. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  102. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  103. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/workflows/ci.yml +0 -0
  104. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.github/workflows/release.yml +0 -0
  105. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/.gitignore +0 -0
  106. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/BACKLOG.md +0 -0
  107. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/CODE_OF_CONDUCT.md +0 -0
  108. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/CONTRIBUTING.md +0 -0
  109. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/LICENSE +0 -0
  110. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/README.zh.md +0 -0
  111. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/SECURITY.md +0 -0
  112. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/__init__.py +0 -0
  113. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_redact.py +0 -0
  114. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_registry.py +0 -0
  115. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/_substrate.py +0 -0
  116. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/agent_runtime.py +0 -0
  117. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/api_types.py +0 -0
  118. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/__init__.py +0 -0
  119. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/_constants.py +0 -0
  120. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/codewhale.py +0 -0
  121. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/default_dirty_handler.py +0 -0
  122. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/gemini.py +0 -0
  123. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/kimi.py +0 -0
  124. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/builtin_plugins/pi.py +0 -0
  125. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/__init__.py +0 -0
  126. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/__main__.py +0 -0
  127. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/init_cmd.py +0 -0
  128. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/install_cmd.py +0 -0
  129. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/monitor_cmd.py +0 -0
  130. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/peek_cmd.py +0 -0
  131. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/round_cmd.py +0 -0
  132. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/service_cmd.py +0 -0
  133. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/cli/upgrade_cmd.py +0 -0
  134. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/clock.py +0 -0
  135. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/context_store.py +0 -0
  136. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/hooks.py +0 -0
  137. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/lifecycle.py +0 -0
  138. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/phase_select.py +0 -0
  139. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/__init__.py +0 -0
  140. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/aider.toml +0 -0
  141. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/claude.toml +0 -0
  142. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/codewhale.toml +0 -0
  143. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/gemini.toml +0 -0
  144. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/kimi.toml +0 -0
  145. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/presets/pi.toml +0 -0
  146. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/prompt_loader.py +0 -0
  147. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/remote_relay.py +0 -0
  148. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/round_log.py +0 -0
  149. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/round_view.py +0 -0
  150. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/runner.py +0 -0
  151. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/scaffold.py +0 -0
  152. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/agent_runner/schedule.py +0 -0
  153. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/build.sh +0 -0
  154. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/README.md +0 -0
  155. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/events.md +0 -0
  156. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/long-running-agents.md +0 -0
  157. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/quickstart.md +0 -0
  158. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/recipes/aider.md +0 -0
  159. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/recipes/codewhale.md +0 -0
  160. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/recipes/kimi.md +0 -0
  161. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/recipes/pi.md +0 -0
  162. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/docs/thesis.md +0 -0
  163. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/pyproject.toml +0 -0
  164. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/__init__.py +0 -0
  165. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/_clock.py +0 -0
  166. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/_test_helpers.py +0 -0
  167. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/conftest.py +0 -0
  168. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/contract/__init__.py +0 -0
  169. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/__init__.py +0 -0
  170. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/conftest.py +0 -0
  171. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/test_e2e_graceful_stop.py +0 -0
  172. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/test_e2e_install_systemd.py +0 -0
  173. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/test_e2e_monitor_remote.py +0 -0
  174. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/e2e/test_e2e_round_lifecycle.py +0 -0
  175. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
  176. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
  177. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
  178. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/generate_vulture_whitelist.py +0 -0
  179. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/__init__.py +0 -0
  180. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_auto_stop_e2e.py +0 -0
  181. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_bounded_run.py +0 -0
  182. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_context_enricher_namespacing.py +0 -0
  183. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_dirty_handler_seam.py +0 -0
  184. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_grace_kill_emission.py +0 -0
  185. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_install_dry_run.py +0 -0
  186. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_plugin_detector_loaded.py +0 -0
  187. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_plugin_real_flow.py +0 -0
  188. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_prompt_delivery_stdin.py +0 -0
  189. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_run_one_round_with_fake_agent.py +0 -0
  190. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_scaffold_presets.py +0 -0
  191. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_serve_loop.py +0 -0
  192. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_spawn_round_wedged.py +0 -0
  193. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_substrate_fingerprint.py +0 -0
  194. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/integration/test_transient_error_backoff.py +0 -0
  195. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/__init__.py +0 -0
  196. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/_docs.py +0 -0
  197. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/_event_scan.py +0 -0
  198. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_atomic_write_enforced.py +0 -0
  199. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_authored_facts_declared.py +0 -0
  200. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_auto_stop_policy_ssot.py +0 -0
  201. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_catalogs.py +0 -0
  202. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_classification_ssot.py +0 -0
  203. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_dataclass_fields_have_producers.py +0 -0
  204. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_builtin_plugins.py +0 -0
  205. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_cli_claims.py +0 -0
  206. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_operator_surface.py +0 -0
  207. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_test_pointers_exist.py +0 -0
  208. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_transient_error_claims.py +0 -0
  209. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_doc_usage_event_fields.py +0 -0
  210. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_docs_generated.py +0 -0
  211. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_docs_index_complete.py +0 -0
  212. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_entry_points_resolve.py +0 -0
  213. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_event_kind_registry.py +0 -0
  214. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_events_doc_contract.py +0 -0
  215. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_gen_blocks_name_their_source.py +0 -0
  216. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_hook_contract_docs.py +0 -0
  217. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_layer_2_loop_size.py +0 -0
  218. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_migrations_registry_ssot.py +0 -0
  219. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_module_sizes.py +0 -0
  220. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_monitor_self_exclusion.py +0 -0
  221. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_no_ai_signatures.py +0 -0
  222. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +0 -0
  223. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_no_raw_time.py +0 -0
  224. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_no_vacuous_invariants.py +0 -0
  225. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_phase_select_stateless.py +0 -0
  226. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_plugins_config_stable.py +0 -0
  227. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_readme_zh_is_pointer.py +0 -0
  228. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_round_num_single_source.py +0 -0
  229. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_round_result_stable.py +0 -0
  230. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_set_diff_for_auto_tool_classification.py +0 -0
  231. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_stash_uses_sha_not_index.py +0 -0
  232. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_timeout_budget_invariant.py +0 -0
  233. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_upstream_schema_canary.py +0 -0
  234. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/invariants/test_vulture_whitelist_generated.py +0 -0
  235. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/literate/__init__.py +0 -0
  236. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/literate/parser.py +0 -0
  237. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/literate/test_parser.py +0 -0
  238. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/literate/test_quickstart.py +0 -0
  239. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/__init__.py +0 -0
  240. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime.py +0 -0
  241. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime_grace.py +0 -0
  242. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime_marker_scan.py +0 -0
  243. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime_progress.py +0 -0
  244. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime_reap.py +0 -0
  245. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_agent_runtime_signal_name.py +0 -0
  246. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_assemble_prompt.py +0 -0
  247. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_events_stream.py +0 -0
  248. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_install.py +0 -0
  249. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_read_round_num.py +0 -0
  250. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_resolve_phase.py +0 -0
  251. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_api_types.py +0 -0
  252. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_auto_stop_gating.py +0 -0
  253. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_catalogs.py +0 -0
  254. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_claude_foreign_schema.py +0 -0
  255. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli.py +0 -0
  256. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli_init_install.py +0 -0
  257. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli_monitor_http.py +0 -0
  258. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli_service_peek_monitor.py +0 -0
  259. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_cli_upgrade.py +0 -0
  260. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_codewhale_code_precedence.py +0 -0
  261. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_codewhale_plugin.py +0 -0
  262. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_coerce_int_poison.py +0 -0
  263. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_fresh_eyes.py +0 -0
  264. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_max_rounds.py +0 -0
  265. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_prompt_delivery.py +0 -0
  266. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_schedule.py +0 -0
  267. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_stop_file.py +0 -0
  268. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_strictness.py +0 -0
  269. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_substrate_fingerprint_paths.py +0 -0
  270. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_config_transient_error_action.py +0 -0
  271. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_context_store.py +0 -0
  272. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_control_char_config.py +0 -0
  273. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_default_dirty_handler.py +0 -0
  274. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_detect_hung_latch.py +0 -0
  275. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_detector_isolation.py +0 -0
  276. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_detector_protocol.py +0 -0
  277. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_dirty_handlers.py +0 -0
  278. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_docgen.py +0 -0
  279. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_effective_throttle_view.py +0 -0
  280. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_emit_config_migrated.py +0 -0
  281. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_emit_schedule.py +0 -0
  282. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_emit_schedule_phase_skipped.py +0 -0
  283. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_events.py +0 -0
  284. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_events_cmd_rollover.py +0 -0
  285. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_events_cmd_tail.py +0 -0
  286. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_example_dirty_handler.py +0 -0
  287. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_example_plugin.py +0 -0
  288. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_exit_cause.py +0 -0
  289. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_exit_classifier.py +0 -0
  290. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_fresh_eyes_trigger.py +0 -0
  291. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_hook_failure_isolation.py +0 -0
  292. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_hook_redact_order.py +0 -0
  293. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_hooks.py +0 -0
  294. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_http_progress.py +0 -0
  295. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_init_entry_points.py +0 -0
  296. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_interruptible_sleep_should_stop.py +0 -0
  297. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_kimi_plugin.py +0 -0
  298. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_lifecycle.py +0 -0
  299. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_cmd_severity.py +0 -0
  300. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_dedup_identity.py +0 -0
  301. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_dedup_rearm.py +0 -0
  302. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_detect_anomaly_repetitive.py +0 -0
  303. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_detect_rate_limit.py +0 -0
  304. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_detect_supervisor_stale.py +0 -0
  305. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_event_tail.py +0 -0
  306. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_remote.py +0 -0
  307. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_monitor_schedule_pause.py +0 -0
  308. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_network_blip_signal_guard.py +0 -0
  309. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_open_round_log.py +0 -0
  310. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_orphan_chain_single_pass.py +0 -0
  311. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_outer_round_ceiling.py +0 -0
  312. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_peek_argparse.py +0 -0
  313. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_peek_project_isolation.py +0 -0
  314. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_peek_schedule.py +0 -0
  315. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_peek_select.py +0 -0
  316. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_phase_agent_launch.py +0 -0
  317. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_phase_profiles.py +0 -0
  318. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_phase_select.py +0 -0
  319. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_pi_plugin.py +0 -0
  320. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_plugin_constants.py +0 -0
  321. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_presets.py +0 -0
  322. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_primary_prompt_file_home.py +0 -0
  323. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_prompt_loader.py +0 -0
  324. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_read_json_hardening.py +0 -0
  325. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_redact.py +0 -0
  326. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_round_cmd.py +0 -0
  327. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_round_cmd_sigterm.py +0 -0
  328. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_round_log_helpers.py +0 -0
  329. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_round_view.py +0 -0
  330. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_runner.py +0 -0
  331. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_runner_sidecar_ordering.py +0 -0
  332. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_scaffold.py +0 -0
  333. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_schedule.py +0 -0
  334. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_serve_cmd_bounded.py +0 -0
  335. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_service_mode.py +0 -0
  336. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_service_unit.py +0 -0
  337. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_startup_battery_exit.py +0 -0
  338. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_substrate.py +0 -0
  339. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_supervisor_stale_self_blind.py +0 -0
  340. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_throttle_back_off_ladder.py +0 -0
  341. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_throttle_plugin_classification.py +0 -0
  342. {cli_agent_runner-0.2.13 → cli_agent_runner-0.2.15}/tests/unit/test_upgrade_migrate.py +0 -0
@@ -6,6 +6,13 @@
6
6
  # bare name below marks one field "used". SSOT = the @dataclass definitions in
7
7
  # agent_runner/; a new field is covered by regenerating, never by editing here.
8
8
 
9
+ # agent_runner._monitor_state.LocalSource
10
+ log_dir
11
+
12
+ # agent_runner._monitor_state._EventTail
13
+ offsets
14
+ buffer
15
+
9
16
  # agent_runner.agent_runtime.RunResult
10
17
  exit_code
11
18
  duration_s
@@ -109,14 +116,14 @@ agent
109
116
  since_round
110
117
  phase
111
118
 
112
- # agent_runner.config.AgentConfig
119
+ # agent_runner.config.models.AgentConfig
113
120
  command
114
121
  prompt_arg_template
115
122
  name
116
123
  env
117
124
  prompt_delivery
118
125
 
119
- # agent_runner.config.Config
126
+ # agent_runner.config.models.Config
120
127
  agent
121
128
  runtime
122
129
  prompt
@@ -126,7 +133,7 @@ phases
126
133
  plugins
127
134
  schedule
128
135
 
129
- # agent_runner.config.MonitorConfig
136
+ # agent_runner.config.models.MonitorConfig
130
137
  auth_fail_patterns
131
138
  auth_fail_hint
132
139
  auto_stop_on
@@ -137,34 +144,36 @@ host_health
137
144
  round_progress_interval_s
138
145
  supervisor_stale_threshold_s
139
146
 
140
- # agent_runner.config.MonitorHostHealthConfig
147
+ # agent_runner.config.models.MonitorHostHealthConfig
141
148
  mem_avail_min_mb
142
149
  disk_warning_pct
143
150
  disk_critical_pct
151
+ swap_sout_noise_floor_mb
152
+ mem_free_low_mb
144
153
 
145
- # agent_runner.config.PhaseOverride
154
+ # agent_runner.config.models.PhaseOverride
146
155
  round_timeout_s
147
156
  disable_pre_round_hooks
148
157
  prompt_files
149
158
  agent
150
159
  schedule
151
160
 
152
- # agent_runner.config.PhasesConfig
161
+ # agent_runner.config.models.PhasesConfig
153
162
  list
154
163
  overrides
155
164
  phase_policy
156
165
 
157
- # agent_runner.config.PluginsConfig
166
+ # agent_runner.config.models.PluginsConfig
158
167
  disable
159
168
  raw
160
169
 
161
- # agent_runner.config.Profile
170
+ # agent_runner.config.models.Profile
162
171
  agent
163
172
  runtime
164
173
  schedule
165
174
  prompt_files
166
175
 
167
- # agent_runner.config.PromptConfig
176
+ # agent_runner.config.models.PromptConfig
168
177
  file
169
178
  files
170
179
  inject_context
@@ -172,7 +181,7 @@ context_injection_mode
172
181
  concat_separator
173
182
  strip_yaml_frontmatter
174
183
 
175
- # agent_runner.config.RuntimeConfig
184
+ # agent_runner.config.models.RuntimeConfig
176
185
  work_dir
177
186
  log_dir
178
187
  round_timeout_s
@@ -189,12 +198,12 @@ dry_run
189
198
  max_grace_after_result_s
190
199
  grace_kill_ignore_patterns
191
200
 
192
- # agent_runner.config.ScheduleConfig
201
+ # agent_runner.config.models.ScheduleConfig
193
202
  timezone
194
203
  run_windows
195
204
  pause_windows
196
205
 
197
- # agent_runner.config.VcsConfig
206
+ # agent_runner.config.models.VcsConfig
198
207
  stash_idempotency_s
199
208
  dirty_action
200
209
 
@@ -240,6 +249,12 @@ vcs
240
249
  dirty_action
241
250
  stash_idempotency_s
242
251
 
252
+ # agent_runner.host_health.Pressure
253
+ severity
254
+ signal
255
+ message
256
+ context
257
+
243
258
  # agent_runner.lifecycle.PIDFile
244
259
  path
245
260
 
@@ -255,13 +270,6 @@ applied
255
270
  manual
256
271
  advisory
257
272
 
258
- # agent_runner.monitor.LocalSource
259
- log_dir
260
-
261
- # agent_runner.monitor._EventTail
262
- offsets
263
- buffer
264
-
265
273
  # agent_runner.phase_select.Selection
266
274
  phase
267
275
  paused
@@ -5,6 +5,36 @@ 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.15] - 2026-09-04
9
+
10
+ ### Added
11
+ - `[monitor.host_health]` gains two config floors — `swap_sout_noise_floor_mb` (default 32) and `mem_free_low_mb` (default 16) — making the 0.2.14 mem-pressure ladder's thresholds operator-tunable; defaults are byte-identical to the prior hardcoded behavior.
12
+ - `serve` now gives up after `MEM_LOOP_THRESHOLD` (5) consecutive mem-terminated rounds instead of retrying forever: emits a new `mem_loop` event and exits `71` — deliberately excluded from the systemd unit's `RestartPreventExitStatus` so the service restarts fresh (break-then-restart).
13
+
14
+ ### Fixed
15
+ - The mem-pressure warning no longer claims "active paging" it can't confirm; it now says only that swap-out crossed the configured noise floor.
16
+
17
+ ### Notes
18
+ - New event kind: `mem_loop`. Not breaking: no `agent-runner migrate` needed this release — nothing that used to load is rejected. `peek --json` schema is unchanged.
19
+
20
+ See `docs/migrations/0.2.md`.
21
+
22
+ ## [0.2.14] - 2026-09-03
23
+
24
+ ### Breaking
25
+ - `[monitor.host_health]` unknown keys are now rejected, and a nested table given as a scalar (`[agent] env = "x"`, `[monitor] host_health = 1`) now raises `ConfigError` instead of crashing. **Run `agent-runner migrate` before `upgrade`**, as in 0.2.12/0.2.13.
26
+
27
+ ### Fixed
28
+ - `mem_pressure` now gates on a cache-poor-valid signal (PSI, then swap-out rate, then combined low `MemFree`+`MemAvailable`) instead of the inflated `MemAvailable` alone, and warns once when the configured `mem_avail_min_mb` gate is provably inert on the host; `serve` defers starting a new round while the host reports pressure and terminates a ballooning round mid-flight before it goes unresponsive.
29
+ - An unreadable config (bad permissions, a directory) now fails cleanly with `ConfigError`/exit 78 instead of a raw traceback; a startup git-status timeout no longer crashes the check; a killed stash no longer strands `.git/index.lock`.
30
+ - `transient_error_backoff_capped` reports the raw detector reset time, not the ladder-extended one.
31
+
32
+ ### Notes
33
+ - New event kinds: `round_deferred`, `round_resumed`, `round_mem_terminated`; new alert kinds: `mem_signal_unavailable`, `mem_pressure_gate_inert`. `peek --json` schema is unchanged this release.
34
+ - `config.py`/`monitor.py`/api's round-input helpers were reorganized into internal modules this release — no public API change.
35
+
36
+ See `docs/migrations/0.2.md`.
37
+
8
38
  ## [0.2.13] - 2026-09-02
9
39
 
10
40
  ### Breaking
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cli-agent-runner
3
- Version: 0.2.13
3
+ Version: 0.2.15
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
@@ -49,7 +49,7 @@ full disks, runaway memory.
49
49
 
50
50
  ```
51
51
  ┌──────────────────────────────────────────┐
52
- │ Layer 3: The Witness (monitor) │ 11 detectors + auto-stop
52
+ │ Layer 3: The Witness (monitor) │ 13 detectors + auto-stop
53
53
  ├──────────────────────────────────────────┤
54
54
  │ Layer 2: The Loop (serve) │ signal-trapping restart loop
55
55
  ├──────────────────────────────────────────┤
@@ -86,7 +86,7 @@ Full walkthrough: [`docs/quickstart.md`](docs/quickstart.md).
86
86
  |---|---|
87
87
  | `init` / `install` / `uninstall` | `peek` — state snapshot |
88
88
  | `start` / `stop` / `kill` | `watch` — peek in a refresh loop |
89
- | `restart` / `status` | `monitor` — 11 detectors, alerts, auto-stop |
89
+ | `restart` / `status` | `monitor` — 13 detectors, alerts, auto-stop |
90
90
  | `round` / `serve` | `events` — query / stream events.jsonl |
91
91
  | `upgrade` / `migrate` | |
92
92
 
@@ -94,7 +94,7 @@ Verb reference: [`docs/commands.md`](docs/commands.md).
94
94
 
95
95
  ## Defenses (built in)
96
96
 
97
- 13 named defenses, structured as data — see `agent-runner peek --select defenses`.
97
+ 14 named defenses, structured as data — see `agent-runner peek --select defenses`.
98
98
  Each carries the historical incident it codifies and the invariant test that
99
99
  guards it. Highlights:
100
100
 
@@ -111,11 +111,14 @@ Optionally pause the loop during off-hours: `[schedule]` run/pause windows gate
111
111
  `serve` (override with `serve --ignore-schedule`) — see the `[schedule]` section
112
112
  of [`docs/configuration.md`](docs/configuration.md).
113
113
 
114
- ## Monitor: 11 detectors
114
+ ## Monitor: 13 detectors
115
115
 
116
116
  Notify only: `timeout_rate`, `hung`, `orphan_chain`, `disk_warning`,
117
- `mem_pressure`, `network_fail`, `rate_limit_active`,
118
- `anomaly_repetitive_active`, `supervisor_stale`.
117
+ `mem_pressure`, `mem_pressure_gate_inert`, `mem_signal_unavailable`,
118
+ `network_fail`, `rate_limit_active`, `anomaly_repetitive_active`,
119
+ `supervisor_stale`. `mem_pressure` also drives a separate serve-loop
120
+ admission gate that defers or terminates rounds under real memory pressure —
121
+ see `docs/architecture.md`.
119
122
 
120
123
  **Auto-stop the service** (continuing is harmful):
121
124
  - `oauth_fail` — burning API quota on auth-rejected rounds
@@ -13,7 +13,7 @@ full disks, runaway memory.
13
13
 
14
14
  ```
15
15
  ┌──────────────────────────────────────────┐
16
- │ Layer 3: The Witness (monitor) │ 11 detectors + auto-stop
16
+ │ Layer 3: The Witness (monitor) │ 13 detectors + auto-stop
17
17
  ├──────────────────────────────────────────┤
18
18
  │ Layer 2: The Loop (serve) │ signal-trapping restart loop
19
19
  ├──────────────────────────────────────────┤
@@ -50,7 +50,7 @@ Full walkthrough: [`docs/quickstart.md`](docs/quickstart.md).
50
50
  |---|---|
51
51
  | `init` / `install` / `uninstall` | `peek` — state snapshot |
52
52
  | `start` / `stop` / `kill` | `watch` — peek in a refresh loop |
53
- | `restart` / `status` | `monitor` — 11 detectors, alerts, auto-stop |
53
+ | `restart` / `status` | `monitor` — 13 detectors, alerts, auto-stop |
54
54
  | `round` / `serve` | `events` — query / stream events.jsonl |
55
55
  | `upgrade` / `migrate` | |
56
56
 
@@ -58,7 +58,7 @@ Verb reference: [`docs/commands.md`](docs/commands.md).
58
58
 
59
59
  ## Defenses (built in)
60
60
 
61
- 13 named defenses, structured as data — see `agent-runner peek --select defenses`.
61
+ 14 named defenses, structured as data — see `agent-runner peek --select defenses`.
62
62
  Each carries the historical incident it codifies and the invariant test that
63
63
  guards it. Highlights:
64
64
 
@@ -75,11 +75,14 @@ Optionally pause the loop during off-hours: `[schedule]` run/pause windows gate
75
75
  `serve` (override with `serve --ignore-schedule`) — see the `[schedule]` section
76
76
  of [`docs/configuration.md`](docs/configuration.md).
77
77
 
78
- ## Monitor: 11 detectors
78
+ ## Monitor: 13 detectors
79
79
 
80
80
  Notify only: `timeout_rate`, `hung`, `orphan_chain`, `disk_warning`,
81
- `mem_pressure`, `network_fail`, `rate_limit_active`,
82
- `anomaly_repetitive_active`, `supervisor_stale`.
81
+ `mem_pressure`, `mem_pressure_gate_inert`, `mem_signal_unavailable`,
82
+ `network_fail`, `rate_limit_active`, `anomaly_repetitive_active`,
83
+ `supervisor_stale`. `mem_pressure` also drives a separate serve-loop
84
+ admission gate that defers or terminates rounds under real memory pressure —
85
+ see `docs/architecture.md`.
83
86
 
84
87
  **Auto-stop the service** (continuing is harmful):
85
88
  - `oauth_fail` — burning API quota on auth-rejected rounds
@@ -255,10 +255,12 @@ RENDERERS: dict[str, Renderer] = {
255
255
  "defenses-table": Renderer(render_defenses_table, "agent_runner/defenses.py catalog()"),
256
256
  "detector-list": Renderer(
257
257
  render_detector_list,
258
- "agent_runner/monitor.py KNOWN_ALERT_KINDS / AUTO_STOP_ALERTS",
258
+ "agent_runner/_monitor_registry.py KNOWN_ALERT_KINDS / AUTO_STOP_ALERTS",
259
259
  ),
260
260
  "event-kinds": Renderer(render_event_kinds_list, "agent_runner/events.py KNOWN_EVENT_KINDS"),
261
- "config-schema": Renderer(render_config_schema_table, "agent_runner/config.py dataclasses"),
261
+ "config-schema": Renderer(
262
+ render_config_schema_table, "agent_runner/config/models.py dataclasses"
263
+ ),
262
264
  "verb-table": Renderer(render_verb_table, "agent_runner/cli argparse subparsers"),
263
265
  "migrate-transforms": Renderer(
264
266
  _render_migrate_transforms, "agent_runner/migrations.py MIGRATIONS"
@@ -20,11 +20,15 @@ __all__ = [
20
20
  "emit_config_migrated",
21
21
  "emit_fresh_eyes_round_triggered",
22
22
  "emit_max_rounds_reached",
23
+ "emit_mem_loop",
23
24
  "emit_rate_limit_stop",
25
+ "emit_round_deferred",
24
26
  "emit_round_grace_extended",
25
27
  "emit_round_grace_kill",
26
28
  "emit_round_logs_prune_deferred",
29
+ "emit_round_mem_terminated",
27
30
  "emit_round_progress",
31
+ "emit_round_resumed",
28
32
  "emit_round_substrate_after",
29
33
  "emit_round_substrate_before",
30
34
  "emit_round_supervisor_wedged",
@@ -61,20 +65,49 @@ def emit_config_broken(log_dir: Path, *, reason: str) -> None:
61
65
  emit(log_dir, CONFIG_BROKEN, reason=reason)
62
66
 
63
67
 
64
- def emit_crash_loop(log_dir: Path, *, consecutive: int, exit_code: int, log_path: Path) -> None:
65
- """Emit crash_loop (serve stopped after consecutive unknown short crashes).
66
-
67
- Captures the failure reason a redacted tail of the round log — so a
68
- recurring unknown crash can later be classified into a transient bucket.
68
+ def _emit_giveup(
69
+ log_dir: Path, kind: str, *, consecutive: int, exit_code: int, log_path: Path
70
+ ) -> None:
71
+ """Shared body for the give-up events (serve stopped/broke after consecutive
72
+ failures of one kind): capture a redacted tail of the round log as ``reason``
73
+ so the recurring failure can be inspected (or later classified into a
74
+ transient bucket), and emit ``kind`` with the standard give-up payload.
69
75
  """
70
76
  from agent_runner._redact import redact_secrets
71
- from agent_runner.events import CRASH_LOOP, emit
77
+ from agent_runner.events import emit
72
78
 
73
79
  try:
74
80
  reason = redact_secrets(log_path.read_text(encoding="utf-8", errors="replace")[-2000:])
75
81
  except OSError:
76
82
  reason = ""
77
- emit(log_dir, CRASH_LOOP, consecutive=consecutive, exit_code=exit_code, reason=reason)
83
+ emit(log_dir, kind, consecutive=consecutive, exit_code=exit_code, reason=reason)
84
+
85
+
86
+ def emit_crash_loop(log_dir: Path, *, consecutive: int, exit_code: int, log_path: Path) -> None:
87
+ """Emit crash_loop (serve stopped after consecutive unknown short crashes).
88
+
89
+ Captures the failure reason — a redacted tail of the round log — so a
90
+ recurring unknown crash can later be classified into a transient bucket.
91
+ """
92
+ from agent_runner.events import CRASH_LOOP
93
+
94
+ _emit_giveup(
95
+ log_dir, CRASH_LOOP, consecutive=consecutive, exit_code=exit_code, log_path=log_path
96
+ )
97
+
98
+
99
+ def emit_mem_loop(log_dir: Path, *, consecutive: int, exit_code: int, log_path: Path) -> None:
100
+ """Emit mem_loop (serve gave up after consecutive mid-round memory-pressure
101
+ terminations — the 0.2.15 coma-preventer's give-up cap). Distinct from
102
+ crash_loop: this is a break-then-restart, not a deliberate stop, so it is
103
+ deliberately absent from the unit's RestartPreventExitStatus.
104
+
105
+ Captures the failure reason — a redacted tail of the round log — same as
106
+ crash_loop, so an operator can see what the round was doing when the host
107
+ ran out of memory."""
108
+ from agent_runner.events import MEM_LOOP
109
+
110
+ _emit_giveup(log_dir, MEM_LOOP, consecutive=consecutive, exit_code=exit_code, log_path=log_path)
78
111
 
79
112
 
80
113
  def emit_config_migrated(
@@ -150,6 +183,36 @@ def emit_schedule_resumed(log_dir: Path, *, paused_for_s: int) -> None:
150
183
  emit(log_dir, SCHEDULE_RESUMED, paused_for_s=paused_for_s)
151
184
 
152
185
 
186
+ def emit_round_deferred(log_dir: Path, *, severity: str, signal: str, message: str) -> None:
187
+ """Emit round_deferred when the pre-round admission gate defers the next
188
+ round under host_health memory pressure (Group 3 action half). Paired with
189
+ emit_round_resumed once pressure clears -- like schedule_paused/resumed --
190
+ so a long defer does not trip detect_supervisor_stale (see its suppression
191
+ set in _monitor_detectors.py)."""
192
+ from agent_runner.events import ROUND_DEFERRED, emit
193
+
194
+ emit(log_dir, ROUND_DEFERRED, severity=severity, signal=signal, message=message)
195
+
196
+
197
+ def emit_round_resumed(log_dir: Path, *, deferred_for_s: int) -> None:
198
+ """Emit round_resumed when a memory-pressure round deferral clears."""
199
+ from agent_runner.events import ROUND_RESUMED, emit
200
+
201
+ emit(log_dir, ROUND_RESUMED, deferred_for_s=deferred_for_s)
202
+
203
+
204
+ def emit_round_mem_terminated(
205
+ log_dir: Path, *, pid: int, severity: str, signal: str, message: str
206
+ ) -> None:
207
+ """Emit when _spawn_round's mid-round hard floor terminated a ballooning
208
+ round on critical host_health pressure -- the actual coma-preventer (a
209
+ pre-round-only gate can't stop a single round mid-flight). Distinct from
210
+ round_supervisor_wedged (a wall-clock ceiling breach, unrelated cause)."""
211
+ from agent_runner.events import ROUND_MEM_TERMINATED, emit
212
+
213
+ emit(log_dir, ROUND_MEM_TERMINATED, pid=pid, severity=severity, signal=signal, message=message)
214
+
215
+
153
216
  def emit_round_substrate_before(
154
217
  log_dir: Path, *, round_num: int, git_head: str | None, paths_hash: str | None
155
218
  ) -> None: