cli-agent-runner 0.2.17__tar.gz → 0.2.19__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 (366) hide show
  1. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/workflows/ci.yml +8 -1
  2. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.vulture-whitelist.py +5 -1
  3. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/BACKLOG.md +35 -0
  4. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CHANGELOG.md +37 -0
  5. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CONTRIBUTING.md +4 -1
  6. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/PKG-INFO +4 -1
  7. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/README.md +1 -0
  8. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/README.zh.md +1 -1
  9. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/__init__.py +25 -5
  10. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_docgen.py +97 -1
  11. cli_agent_runner-0.2.19/agent_runner/_emit/__init__.py +103 -0
  12. cli_agent_runner-0.2.19/agent_runner/_emit/agent.py +231 -0
  13. cli_agent_runner-0.2.19/agent_runner/_emit/memory.py +236 -0
  14. cli_agent_runner-0.2.19/agent_runner/_emit/rounds.py +189 -0
  15. cli_agent_runner-0.2.19/agent_runner/_emit/serve.py +193 -0
  16. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_detectors.py +18 -12
  17. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_state.py +44 -32
  18. cli_agent_runner-0.2.19/agent_runner/_plugin_scan.py +128 -0
  19. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_resolve.py +1 -1
  20. cli_agent_runner-0.2.19/agent_runner/_round_outcome.py +255 -0
  21. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_round_support.py +1 -1
  22. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_serve_policy.py +44 -20
  23. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_substrate.py +2 -1
  24. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_throttle.py +60 -194
  25. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_version.py +2 -2
  26. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/agent_runtime.py +23 -7
  27. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/api.py +96 -80
  28. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/api_types.py +1 -1
  29. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/claude_rate_limit.py +5 -5
  30. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/default_dirty_handler.py +1 -1
  31. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/gemini.py +1 -1
  32. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/kimi.py +1 -1
  33. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/pi.py +3 -3
  34. cli_agent_runner-0.2.19/agent_runner/cli/_serve_cgroup.py +273 -0
  35. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/_serve_round.py +107 -61
  36. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/common.py +23 -0
  37. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/events_cmd.py +29 -7
  38. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/monitor_cmd.py +16 -1
  39. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/round_cmd.py +7 -10
  40. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/serve_cmd.py +48 -25
  41. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/clock.py +2 -1
  42. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/errors.py +1 -1
  43. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/models.py +10 -10
  44. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/validators.py +1 -1
  45. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/defenses.py +2 -1
  46. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/events.py +49 -1
  47. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/hooks.py +6 -7
  48. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/http_progress.py +7 -5
  49. cli_agent_runner-0.2.19/agent_runner/metrics.py +458 -0
  50. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/migrations.py +3 -3
  51. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/monitor.py +28 -11
  52. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/remote_relay.py +18 -2
  53. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/runner.py +10 -5
  54. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/schedule.py +2 -1
  55. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/service_unit.py +7 -9
  56. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/startup_check.py +1 -1
  57. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/vcs_state.py +3 -3
  58. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/build.sh +21 -4
  59. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/README.md +1 -0
  60. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/architecture.md +7 -1
  61. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/configuration.md +3 -2
  62. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/long-running-agents.md +9 -4
  63. cli_agent_runner-0.2.19/docs/memory-efficiency.md +244 -0
  64. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/migrations/0.2.md +28 -0
  65. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/runbook.md +82 -18
  66. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/pyproject.toml +12 -2
  67. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/_test_helpers.py +64 -0
  68. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/contract/test_public_api_surface.py +2 -0
  69. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_auto_stop_e2e.py +58 -16
  70. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_bounded_run.py +18 -3
  71. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_dirty_handler_seam.py +13 -1
  72. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_grace_kill_emission.py +25 -8
  73. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_run_one_round_with_fake_agent.py +31 -7
  74. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_serve_loop.py +10 -2
  75. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_spawn_round_mem_floor.py +115 -26
  76. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/_event_scan.py +5 -1
  77. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_architecture.py +108 -7
  78. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_claims_match_ssot.py +20 -0
  79. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_docs_generated.py +2 -0
  80. cli_agent_runner-0.2.19/tests/invariants/test_import_footprint.py +214 -0
  81. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_internal_refs.py +13 -2
  82. cli_agent_runner-0.2.19/tests/invariants/test_no_price_logic.py +51 -0
  83. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_vacuous_invariants.py +3 -0
  84. cli_agent_runner-0.2.19/tests/invariants/test_no_version_refs.py +173 -0
  85. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_peek_schema_version.py +5 -2
  86. cli_agent_runner-0.2.19/tests/invariants/test_round_alloc_growth.py +127 -0
  87. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_timeout_budget_invariant.py +24 -4
  88. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime.py +37 -10
  89. cli_agent_runner-0.2.19/tests/unit/test_agent_runtime_grace.py +505 -0
  90. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_marker_scan.py +10 -4
  91. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_progress.py +19 -6
  92. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_reap.py +55 -5
  93. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_observation.py +2 -2
  94. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_service.py +51 -0
  95. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_auto_stop_gating.py +13 -2
  96. cli_agent_runner-0.2.19/tests/unit/test_cgroup_probe.py +451 -0
  97. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_service_peek_monitor.py +16 -10
  98. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_docgen.py +87 -0
  99. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events.py +38 -1
  100. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd.py +9 -1
  101. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_jsonl_decode.py +1 -1
  102. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_git_timeout.py +6 -2
  103. cli_agent_runner-0.2.19/tests/unit/test_http_progress_epoch.py +20 -0
  104. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_init_entry_points.py +50 -31
  105. cli_agent_runner-0.2.19/tests/unit/test_metrics_cgroup_usage.py +83 -0
  106. cli_agent_runner-0.2.19/tests/unit/test_metrics_swap.py +21 -0
  107. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_rate_limit.py +42 -0
  108. cli_agent_runner-0.2.19/tests/unit/test_monitor_loop.py +155 -0
  109. cli_agent_runner-0.2.19/tests/unit/test_monitor_on_alert.py +104 -0
  110. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_remote.py +159 -6
  111. cli_agent_runner-0.2.19/tests/unit/test_plugin_scan_parity.py +188 -0
  112. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_outcome.py +11 -5
  113. cli_agent_runner-0.2.19/tests/unit/test_round_outcome_agent_axis.py +116 -0
  114. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner.py +1 -1
  115. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_mem_gate.py +1 -1
  116. cli_agent_runner-0.2.19/tests/unit/test_serve_round_cgroup_spine.py +187 -0
  117. cli_agent_runner-0.2.19/tests/unit/test_serve_round_oom_killed.py +198 -0
  118. cli_agent_runner-0.2.19/tests/unit/test_serve_round_terminate.py +32 -0
  119. cli_agent_runner-0.2.19/tests/unit/test_throttle_epoch_bound.py +77 -0
  120. cli_agent_runner-0.2.17/agent_runner/_emit.py +0 -757
  121. cli_agent_runner-0.2.17/agent_runner/metrics.py +0 -268
  122. cli_agent_runner-0.2.17/tests/unit/test_agent_runtime_grace.py +0 -359
  123. cli_agent_runner-0.2.17/tests/unit/test_cgroup_probe.py +0 -233
  124. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.codecov.yml +0 -0
  125. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  126. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  127. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  128. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  129. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/workflows/release.yml +0 -0
  130. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.gitignore +0 -0
  131. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CODE_OF_CONDUCT.md +0 -0
  132. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/LICENSE +0 -0
  133. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/SECURITY.md +0 -0
  134. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_registry.py +0 -0
  135. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_redact.py +0 -0
  136. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_registry.py +0 -0
  137. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/__init__.py +0 -0
  138. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/_constants.py +0 -0
  139. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/codewhale.py +0 -0
  140. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/__init__.py +0 -0
  141. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/__main__.py +0 -0
  142. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/init_cmd.py +0 -0
  143. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/install_cmd.py +0 -0
  144. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/migrate_cmd.py +0 -0
  145. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/peek_cmd.py +0 -0
  146. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/service_cmd.py +0 -0
  147. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/upgrade_cmd.py +0 -0
  148. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/__init__.py +0 -0
  149. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/loader.py +0 -0
  150. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/parsers.py +0 -0
  151. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/context_store.py +0 -0
  152. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/host_health.py +0 -0
  153. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/lifecycle.py +0 -0
  154. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/phase_select.py +0 -0
  155. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/__init__.py +0 -0
  156. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/aider.toml +0 -0
  157. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/claude.toml +0 -0
  158. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/codewhale.toml +0 -0
  159. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/gemini.toml +0 -0
  160. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/kimi.toml +0 -0
  161. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/pi.toml +0 -0
  162. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/prompt_loader.py +0 -0
  163. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/round_log.py +0 -0
  164. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/round_view.py +0 -0
  165. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/scaffold.py +0 -0
  166. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/commands.md +0 -0
  167. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/events.md +0 -0
  168. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/plugins.md +0 -0
  169. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/quickstart.md +0 -0
  170. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/aider.md +0 -0
  171. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/codewhale.md +0 -0
  172. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/kimi.md +0 -0
  173. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/pi.md +0 -0
  174. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/thesis.md +0 -0
  175. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/__init__.py +0 -0
  176. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/_clock.py +0 -0
  177. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/conftest.py +0 -0
  178. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/contract/__init__.py +0 -0
  179. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/__init__.py +0 -0
  180. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/conftest.py +0 -0
  181. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_graceful_stop.py +0 -0
  182. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_install_systemd.py +0 -0
  183. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_monitor_remote.py +0 -0
  184. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_round_lifecycle.py +0 -0
  185. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
  186. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
  187. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
  188. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/generate_vulture_whitelist.py +0 -0
  189. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/__init__.py +0 -0
  190. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_context_enricher_namespacing.py +0 -0
  191. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_fresh_eyes_signal.py +0 -0
  192. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_install_dry_run.py +0 -0
  193. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_monitor_seeded.py +0 -0
  194. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_detector_loaded.py +0 -0
  195. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_owned_paths.py +0 -0
  196. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_real_flow.py +0 -0
  197. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_prompt_delivery_stdin.py +0 -0
  198. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_scaffold_presets.py +0 -0
  199. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_spawn_round_wedged.py +0 -0
  200. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_substrate_fingerprint.py +0 -0
  201. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_transient_error_backoff.py +0 -0
  202. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/__init__.py +0 -0
  203. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/_docs.py +0 -0
  204. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_atomic_write_enforced.py +0 -0
  205. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_authored_facts_declared.py +0 -0
  206. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_auto_stop_policy_ssot.py +0 -0
  207. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_catalogs.py +0 -0
  208. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_classification_ssot.py +0 -0
  209. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_config_error_consistency.py +0 -0
  210. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_config_value_set_ssot.py +0 -0
  211. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_dataclass_fields_have_producers.py +0 -0
  212. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_builtin_plugins.py +0 -0
  213. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_cli_claims.py +0 -0
  214. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_operator_surface.py +0 -0
  215. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_test_pointers_exist.py +0 -0
  216. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_transient_error_claims.py +0 -0
  217. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_usage_event_fields.py +0 -0
  218. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_docs_index_complete.py +0 -0
  219. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_entry_points_resolve.py +0 -0
  220. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_int_coercion.py +0 -0
  221. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_kind_registry.py +0 -0
  222. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_kinds_ssot.py +0 -0
  223. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_events_doc_contract.py +0 -0
  224. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_gen_blocks_name_their_source.py +0 -0
  225. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_hook_contract_docs.py +0 -0
  226. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_layer_2_loop_size.py +0 -0
  227. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_migrations_registry_ssot.py +0 -0
  228. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_module_boundaries.py +0 -0
  229. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_module_sizes.py +0 -0
  230. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_monitor_self_exclusion.py +0 -0
  231. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_ai_signatures.py +0 -0
  232. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +0 -0
  233. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_raw_time.py +0 -0
  234. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_phase_select_stateless.py +0 -0
  235. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_plugins_config_stable.py +0 -0
  236. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_readme_zh_is_pointer.py +0 -0
  237. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_repo_constants_patched_in_tests.py +0 -0
  238. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_log_decode_boundary.py +0 -0
  239. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_num_single_source.py +0 -0
  240. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_result_stable.py +0 -0
  241. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_set_diff_for_auto_tool_classification.py +0 -0
  242. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_stash_uses_sha_not_index.py +0 -0
  243. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_upstream_schema_canary.py +0 -0
  244. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_vulture_whitelist_generated.py +0 -0
  245. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/__init__.py +0 -0
  246. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/parser.py +0 -0
  247. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/test_parser.py +0 -0
  248. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/test_quickstart.py +0 -0
  249. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/__init__.py +0 -0
  250. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_signal_name.py +0 -0
  251. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_assemble_prompt.py +0 -0
  252. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_events_stream.py +0 -0
  253. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_install.py +0 -0
  254. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_read_round_num.py +0 -0
  255. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_resolve_phase.py +0 -0
  256. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_types.py +0 -0
  257. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_catalogs.py +0 -0
  258. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_claude_error_detector.py +0 -0
  259. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_claude_foreign_schema.py +0 -0
  260. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli.py +0 -0
  261. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_common.py +0 -0
  262. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_init_install.py +0 -0
  263. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_main_boundary.py +0 -0
  264. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_monitor_http.py +0 -0
  265. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_upgrade.py +0 -0
  266. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_codewhale_code_precedence.py +0 -0
  267. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_codewhale_plugin.py +0 -0
  268. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_coerce_int_poison.py +0 -0
  269. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config.py +0 -0
  270. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_fresh_eyes.py +0 -0
  271. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_max_rounds.py +0 -0
  272. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_nested_strictness.py +0 -0
  273. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_prompt_delivery.py +0 -0
  274. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_schedule.py +0 -0
  275. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_stop_file.py +0 -0
  276. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_strictness.py +0 -0
  277. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_substrate_fingerprint_paths.py +0 -0
  278. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_transient_error_action.py +0 -0
  279. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_context_store.py +0 -0
  280. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_control_char_config.py +0 -0
  281. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_default_dirty_handler.py +0 -0
  282. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_defenses.py +0 -0
  283. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detect_hung_latch.py +0 -0
  284. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detector_isolation.py +0 -0
  285. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detector_protocol.py +0 -0
  286. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_dirty_handlers.py +0 -0
  287. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_effective_throttle_view.py +0 -0
  288. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_config_migrated.py +0 -0
  289. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_schedule.py +0 -0
  290. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_schedule_phase_skipped.py +0 -0
  291. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd_rollover.py +0 -0
  292. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd_tail.py +0 -0
  293. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_example_dirty_handler.py +0 -0
  294. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_example_plugin.py +0 -0
  295. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_exit_cause.py +0 -0
  296. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_exit_classifier.py +0 -0
  297. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_fresh_eyes_trigger.py +0 -0
  298. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_gemini_plugin.py +0 -0
  299. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hook_failure_isolation.py +0 -0
  300. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hook_redact_order.py +0 -0
  301. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hooks.py +0 -0
  302. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_host_health.py +0 -0
  303. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_http_progress.py +0 -0
  304. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_interruptible_sleep_should_stop.py +0 -0
  305. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_kimi_plugin.py +0 -0
  306. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_lifecycle.py +0 -0
  307. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_metrics.py +0 -0
  308. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_migrate_cmd.py +0 -0
  309. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_migrations.py +0 -0
  310. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_assembly.py +0 -0
  311. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_cmd_severity.py +0 -0
  312. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_dedup_identity.py +0 -0
  313. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_dedup_rearm.py +0 -0
  314. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_anomaly_repetitive.py +0 -0
  315. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_supervisor_stale.py +0 -0
  316. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detectors.py +0 -0
  317. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_event_tail.py +0 -0
  318. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_round_deferred_stale.py +0 -0
  319. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_schedule_pause.py +0 -0
  320. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_network_blip_signal_guard.py +0 -0
  321. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_open_round_log.py +0 -0
  322. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_orphan_chain_single_pass.py +0 -0
  323. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_outer_round_ceiling.py +0 -0
  324. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_argparse.py +0 -0
  325. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_project_isolation.py +0 -0
  326. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_schedule.py +0 -0
  327. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_select.py +0 -0
  328. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_agent_launch.py +0 -0
  329. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_profiles.py +0 -0
  330. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_select.py +0 -0
  331. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_pi_plugin.py +0 -0
  332. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_plugin_constants.py +0 -0
  333. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_presets.py +0 -0
  334. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_primary_prompt_file_home.py +0 -0
  335. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_prompt_loader.py +0 -0
  336. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_read_json_hardening.py +0 -0
  337. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_redact.py +0 -0
  338. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_resolve.py +0 -0
  339. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_cmd.py +0 -0
  340. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_cmd_sigterm.py +0 -0
  341. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_log_helpers.py +0 -0
  342. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_view.py +0 -0
  343. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner_sidecar_ordering.py +0 -0
  344. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner_throttle.py +0 -0
  345. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_scaffold.py +0 -0
  346. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_schedule.py +0 -0
  347. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_cmd_bounded.py +0 -0
  348. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_config_broken.py +0 -0
  349. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_crash_loop.py +0 -0
  350. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_phase_schedule.py +0 -0
  351. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_policy.py +0 -0
  352. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_round.py +0 -0
  353. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_round_log.py +0 -0
  354. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_schedule_gate.py +0 -0
  355. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_sentinel.py +0 -0
  356. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_startup_hooks.py +0 -0
  357. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_service_mode.py +0 -0
  358. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_service_unit.py +0 -0
  359. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_startup_battery_exit.py +0 -0
  360. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_startup_check.py +0 -0
  361. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_substrate.py +0 -0
  362. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_supervisor_stale_self_blind.py +0 -0
  363. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_throttle_back_off_ladder.py +0 -0
  364. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_throttle_plugin_classification.py +0 -0
  365. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_upgrade_migrate.py +0 -0
  366. {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_vcs_state.py +0 -0
@@ -92,7 +92,14 @@ jobs:
92
92
  # `| tail` would swallow the exit code and let dead code through.
93
93
  run: vulture
94
94
  - name: tests with coverage
95
- run: pytest -q --ignore=tests/e2e --ignore=tests/literate --cov --cov-report=xml --cov-report=term
95
+ # Two passes so `serial` tests (install process-wide signal handlers /
96
+ # self-signals -- unsafe to share an xdist worker process) still run
97
+ # every time: parallel set + serial set == the full suite, mirroring
98
+ # ./build.sh test. pytest-cov 7.x auto-combines worker coverage data.
99
+ run: |
100
+ pytest -q --ignore=tests/e2e --ignore=tests/literate \
101
+ -n auto --dist worksteal -m "not serial" --cov --cov-report=xml --cov-report=term
102
+ pytest -q --ignore=tests/e2e --ignore=tests/literate -m serial --cov --cov-append --cov-report=xml --cov-report=term
96
103
  - name: docs CI gate
97
104
  run: |
98
105
  python -m agent_runner._docgen
@@ -13,12 +13,16 @@ log_dir
13
13
  offsets
14
14
  buffer
15
15
 
16
- # agent_runner._throttle.RoundOutcome
16
+ # agent_runner._round_outcome.RoundOutcome
17
17
  mem_terminated
18
18
  usage_capable
19
19
  newest_usage_ts
20
20
  newest_substrate_before_ts
21
21
  latest_transient_per_agent
22
+ ran_agent
23
+ usage_capable_by_agent
24
+ newest_usage_ts_by_agent
25
+ backoff_exponent_by_agent
22
26
 
23
27
  # agent_runner.agent_runtime.RunResult
24
28
  exit_code
@@ -88,3 +88,38 @@ just succeeded in the same repo).
88
88
  Deferred because closing it is a naming decision, not cleanup: no event kind
89
89
  carries the meaning "stashed but ref lost" (`orphan_stash_failed` would be wrong
90
90
  — the stash exists). Left as-is until that kind is designed.
91
+
92
+ ## `_monitor_loop_iter`'s three fail-open guards are hand-duplicated
93
+
94
+ `api._monitor_loop_iter` wraps the startup `monitor_started` emit, the
95
+ per-tick poll, and `on_alert`'s per-alert dispatch each in its own
96
+ `try/except Exception: warnings.warn(...)` block so a crash in any one of the
97
+ three never ends monitor supervision. The three guards are structurally
98
+ identical (catch, format a `type(e).__name__: {e}` warning, keep the loop
99
+ alive) but hand-copied rather than sharing one implementation; `on_alert`'s
100
+ own `emit()` closure already shows the pattern for factoring a shared guard.
101
+
102
+ Collapsing them to one shared guard is behavior-preserving — it must not
103
+ change which failures warn vs which propagate, nor the specific fallback
104
+ each site takes on failure (sleep-and-retry after a poll failure,
105
+ `verdict = "failed"` after an `on_alert` failure). Slated for 0.2.19.
106
+
107
+ ## `oom_kill_delta` is named differently on its two events — NEEDS_DESIGN, DEFERRED to 0.3
108
+
109
+ The same cgroup `memory.events.oom_kill` delta is emitted under two
110
+ different field names depending on which event carries it: `round_cgroup_memory`
111
+ reports it as `events_oom_kill_delta` (matching its sibling counters
112
+ `events_high_delta`/`events_max_delta`/`events_oom_delta`), while
113
+ `round_oom_killed` — folded from the same scan, no second sysfs read —
114
+ reports the identical value as bare `oom_kill_delta`. A reader correlating
115
+ the two events for the same round has to know the same quantity carries two
116
+ names.
117
+
118
+ Renaming either side is a change to a published event field name — part of
119
+ the peek/event JSON contract — so which name becomes canonical (and whether
120
+ it lands as a rename or an additive alias) needs a decision, not a silent
121
+ swap. Tagged NEEDS_DESIGN. Deferred to 0.3's event-model canonicalization
122
+ (see [[project-03-direction]]) rather than reconciled standalone in 0.2.19 —
123
+ 0.3 is already renaming/unifying event fields wholesale, and settling this
124
+ name now risks a double-rename (once here, again when 0.3's canonical model
125
+ lands). No field name changes in code until that decision is made.
@@ -5,6 +5,43 @@ 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.19] - 2026-09-09
9
+
10
+ ### Changed
11
+ - `monitor --host` relay now drains cleanly on SIGTERM — tears down its ssh child group and exits 0 — instead of dying immediately, matching `serve`'s stop-signal behavior.
12
+ - Internal structure, behavior-identical: `_emit.py` split into an `_emit/` package (domain submodules behind a facade); the cgroup-pressure spine carved out of `cli/_serve_round.py` into `cli/_serve_cgroup.py`.
13
+ - The give-up exit-code table in the runbook is now generated from code instead of hand-copied; detector/defense counts and the `peek` schema version are now invariant-pinned against the same source.
14
+ - Internal hardening: the monitor's fail-open guards are unified into one implementation; `kill`'s systemd-user SIGKILL escalation shares the same bounded poll `serve` uses; the cgroup pressure spine resolves its bounding ancestor once per round instead of on every tick; a single-implementation `Protocol` was collapsed to its concrete type; a process's stored child-name no longer passes an attacker-rewritable `argv[0]` through unbounded; plugin discovery now scans legacy egg-info installs and handles entry points with an extras suffix.
15
+
16
+ ### Fixed
17
+ - Docs: the `agent_usage_recorded` plugin list corrected to claude/gemini/codewhale/pi (kimi's built-in plugin emits no token counters).
18
+
19
+ ### Notes
20
+ - Not breaking: no `agent-runner migrate` step, no systemd unit change. The relay's SIGTERM-drain above is the one behavior change in this release — anyone relying on the relay's old immediate-exit-on-SIGTERM will now see it drain instead.
21
+ - `oom_kill_delta`'s two-different-field-names inconsistency is deferred to 0.3's event-model work rather than reconciled here, to avoid a double-rename.
22
+
23
+ ## [0.2.18] - 2026-09-08
24
+
25
+ ### Added
26
+ - Cgroup pressure spine: `round_cgroup_memory` emits once per round (when this process's cgroup has a finite `memory.max`) with peak `memory.current`/`memory.swap.current` and `memory.events` counter deltas over the round — pressure becomes visible before it trips a give-up verdict.
27
+ - `round_oom_killed`: a pointer-only event (never round-log content) when the kernel cgroup-OOM-kills a round; the round still exits 137 and counts toward the crash streak exactly as before — this only names the cause.
28
+ - `host_cgroup_memory_limit` gains four advisory fields (`swap_total_bytes`, `swap_cap_pct`, `memory_high`, `advisory`) computed once at serve startup, plus a swap-plausibility guard on the cgroup-defer decision.
29
+ - Docs: a real-RAM ledger, a zram worked example, and a commented `# MemoryHigh` hint (with the PSI-floor interaction warning).
30
+
31
+ ### Fixed
32
+ - Per-agent no-progress verdict: a usageless round on a never-emits-usage CLI is no longer misread as stalled in a mixed `[phases]` config.
33
+ - Fail-open hardening: the monitor no longer crashes on the stop/classify path (an emit error, a poisoned epoch field, or an unreapable round now degrade instead of raising).
34
+ - `kill` now escalates SIGTERM to SIGKILL under systemd-user after the grace window, matching the docs.
35
+
36
+ ### Changed
37
+ - Plugin discovery scans `entry_points.txt` directly with a metadata parity fallback, ahead of 0.3's group growth.
38
+ - Internal cleanup: `RoundOutcome` carved into `_round_outcome`, constants single-sourced, lazy `hashlib`/`zoneinfo` behind an import-footprint gate, a tenet-3 price-blind invariant, plus test-speed work (parallel gate + faster inner loop).
39
+
40
+ ### Notes
41
+ - Not breaking: no `agent-runner migrate` step, no systemd unit change; `peek --json` gains the two new event kinds above, existing kinds unchanged.
42
+
43
+ See `docs/migrations/0.2.md`.
44
+
8
45
  ## [0.2.17] - 2026-09-05
9
46
 
10
47
  ### Changed
@@ -105,7 +105,10 @@ drifts.
105
105
 
106
106
  ## Tests
107
107
 
108
- - Unit + integration: `pytest -q --ignore=tests/e2e --ignore=tests/literate`
108
+ - Unit + integration (parallel gate): `./build.sh test`pytest-xdist
109
+ (`-n $AR_TEST_JOBS`, default `auto`) plus a serial pass for tests that
110
+ install process-wide signal handlers. Never set `AR_TEST_JOBS` above 2 on a
111
+ constrained host (e.g. a 462MB Pi).
109
112
  - Literate quickstart: `./build.sh literate`
110
113
  - Pi e2e (opt-in): `AGENT_RUNNER_E2E_PI=1 pytest tests/e2e/` (needs a `pi`
111
114
  ssh alias; not run in CI).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cli-agent-runner
3
- Version: 0.2.17
3
+ Version: 0.2.19
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
@@ -27,6 +27,8 @@ Requires-Python: >=3.11
27
27
  Requires-Dist: psutil>=5.9
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: pytest-cov>=5; extra == 'dev'
30
+ Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
31
+ Requires-Dist: pytest-xdist>=3.8; extra == 'dev'
30
32
  Requires-Dist: pytest>=8; extra == 'dev'
31
33
  Requires-Dist: ruff<0.17,>=0.16; extra == 'dev'
32
34
  Requires-Dist: vulture>=2.13; extra == 'dev'
@@ -150,6 +152,7 @@ your laptop closed. Full relay + SSH-trust mechanics:
150
152
  - [`docs/configuration.md`](docs/configuration.md) — `agent-runner.toml` schema
151
153
  - [`docs/runbook.md`](docs/runbook.md) — operator troubleshooting (OAuth, disk, orphan)
152
154
  - [`docs/architecture.md`](docs/architecture.md) — 3-layer model, defenses-as-data
155
+ - [`docs/memory-efficiency.md`](docs/memory-efficiency.md) — supervisor memory footprint, measured release over release
153
156
 
154
157
  ## Development
155
158
 
@@ -114,6 +114,7 @@ your laptop closed. Full relay + SSH-trust mechanics:
114
114
  - [`docs/configuration.md`](docs/configuration.md) — `agent-runner.toml` schema
115
115
  - [`docs/runbook.md`](docs/runbook.md) — operator troubleshooting (OAuth, disk, orphan)
116
116
  - [`docs/architecture.md`](docs/architecture.md) — 3-layer model, defenses-as-data
117
+ - [`docs/memory-efficiency.md`](docs/memory-efficiency.md) — supervisor memory footprint, measured release over release
117
118
 
118
119
  ## Development
119
120
 
@@ -10,7 +10,7 @@ supervisor 重启 —— 这是核心模式。中间穿插一组防御,避开
10
10
 
11
11
  三层,每层都能独立运行,上层都是可选的:`round` 跑一次 agent 跑完即退;
12
12
  `serve` 捕获信号循环拉起 round;`monitor` 检测器 + 告警,critical 时自动停服
13
- (本机或 ssh 远程)。
13
+ (本机)。
14
14
 
15
15
  ## 安装
16
16
 
@@ -27,16 +27,36 @@ def _load_plugins_from_group(group: str) -> None:
27
27
 
28
28
  Called at package import. A broken plugin must not crash the supervisor;
29
29
  each failure surfaces as a ``UserWarning``.
30
+
31
+ Discovery goes through the ``entry_points.txt`` scanner (cheaper than a
32
+ fresh ``importlib.metadata.entry_points()`` scan per group per process;
33
+ see ``_plugin_scan``), with a hard fallback to ``importlib.metadata`` on
34
+ any parse failure. Loading a plugin means only importing its module and
35
+ resolving its attribute — same as ``EntryPoint.load()`` — since every
36
+ built-in plugin registers itself as a module-top side effect (documented
37
+ in docs/plugins.md); this loader never instantiates or calls the target.
30
38
  """
39
+ import importlib
40
+ import sys
31
41
  import warnings
32
- from importlib.metadata import entry_points
33
42
 
34
- for ep in entry_points(group=group):
43
+ from agent_runner._plugin_scan import scan_entry_points
44
+
45
+ for name, value in scan_entry_points(sys.path, group):
35
46
  try:
36
- ep.load()
47
+ # An entry-point value may carry a trailing extras marker
48
+ # (``module:attr [extra1,extra2]``); importlib.metadata.EntryPoint's
49
+ # own module/attr grammar excludes "[", so anything from the first
50
+ # "[" onward is always extras, never part of the path — strip it
51
+ # before resolving, or it glues onto attr_path and breaks getattr().
52
+ module_path, _, attr_path = value.partition("[")[0].rstrip().partition(":")
53
+ mod = importlib.import_module(module_path)
54
+ target = mod
55
+ for attr in filter(None, attr_path.split(".")):
56
+ target = getattr(target, attr)
37
57
  except Exception as e:
38
58
  warnings.warn(
39
- f"failed to load {group} plugin {ep.name!r}: {e}",
59
+ f"failed to load {group} plugin {name!r}: {e}",
40
60
  stacklevel=3,
41
61
  )
42
62
 
@@ -80,7 +100,7 @@ def apply_plugin_disable(names: list[str]) -> None:
80
100
  registered plugin (typo catcher; tolerates cross-env config drift).
81
101
 
82
102
  Plugin packages still load at import time — this removes from the registries
83
- that the runner and peek consult. Side effects from ep.load() (module-level
103
+ that the runner and peek consult. Side effects from loading (module-level
84
104
  imports, etc.) have already happened by the time this runs.
85
105
 
86
106
  Known limitation: vcs_state._PLUGIN_OWNED_PATHS lacks per-plugin name
@@ -16,6 +16,7 @@ import typing
16
16
  from collections.abc import Callable
17
17
  from pathlib import Path
18
18
 
19
+ from agent_runner import _serve_policy
19
20
  from agent_runner.cli.init_cmd import _preset_names
20
21
  from agent_runner.config import (
21
22
  AgentConfig,
@@ -30,7 +31,14 @@ from agent_runner.config import (
30
31
  VcsConfig,
31
32
  )
32
33
  from agent_runner.defenses import catalog
33
- from agent_runner.events import KNOWN_EVENT_KINDS
34
+ from agent_runner.events import (
35
+ CONFIG_BROKEN,
36
+ CRASH_LOOP,
37
+ KNOWN_EVENT_KINDS,
38
+ MEM_LOOP,
39
+ MEM_LOOP_PERSISTENT,
40
+ STALLED_NO_PROGRESS,
41
+ )
34
42
  from agent_runner.monitor import AUTO_STOP_ALERTS, KNOWN_ALERT_KINDS
35
43
 
36
44
  # (toml_section_name, dataclass, nested_sub_sections). Nesting is an EXPLICIT
@@ -156,6 +164,84 @@ def render_event_kinds_list() -> str:
156
164
  return "\n".join(f"- `{k}`" for k in sorted(KNOWN_EVENT_KINDS))
157
165
 
158
166
 
167
+ def _giveup_verdict_rows() -> list[tuple[str, int, bool]]:
168
+ """``(verdict, exit_code, in_restart_prevent)`` rows for serve's five
169
+ give-up verdicts, in the order the runbook's Symptom section lists them.
170
+
171
+ The verdict->code mapping itself is CONTROL FLOW in
172
+ ``cli/_serve_round.post_round_verdicts`` (a chain of ``if``/``return``,
173
+ not a dict), so it is mirrored here by hand rather than imported — the
174
+ four exit-code integers are imported from ``_serve_policy``, the actual
175
+ code SSOT, so a constant change here is caught by ``./build.sh docs``
176
+ producing a diff. The third column is DERIVED from
177
+ ``_serve_policy.RESTART_PREVENT_EXIT_CODES`` (the same single source
178
+ ``service_unit.py`` renders from) rather than hand-typed per row.
179
+ """
180
+ verdict_codes = [
181
+ (CONFIG_BROKEN, _serve_policy.PERMANENT_CONFIG_EXIT),
182
+ (CRASH_LOOP, _serve_policy.CRASH_LOOP_EXIT),
183
+ (STALLED_NO_PROGRESS, _serve_policy.CRASH_LOOP_EXIT),
184
+ (MEM_LOOP_PERSISTENT, _serve_policy.MEM_LOOP_PERSISTENT_EXIT),
185
+ (MEM_LOOP, _serve_policy.MEM_LOOP_EXIT),
186
+ ]
187
+ return [
188
+ (verdict, code, code in _serve_policy.RESTART_PREVENT_EXIT_CODES)
189
+ for verdict, code in verdict_codes
190
+ ]
191
+
192
+
193
+ def render_giveup_exit_codes_table() -> str:
194
+ """Verdict -> exit-code -> ``RestartPreventExitStatus`` membership table
195
+ for serve's give-up breakers. 5 verdicts map to only 4 distinct codes:
196
+ ``stalled_no_progress`` reuses ``crash_loop``'s 75 rather than minting its
197
+ own (same give-up verdict — "an unknown failure kept recurring, stop for
198
+ real" — reached via a different signal)."""
199
+ lines = ["| Verdict | Exit code | `RestartPreventExitStatus`? |", "|---|---|---|"]
200
+ seen_codes: dict[int, str] = {}
201
+ for verdict, code, stays_stopped in _giveup_verdict_rows():
202
+ shares = f" (shares `{seen_codes[code]}`'s exit code)" if code in seen_codes else ""
203
+ seen_codes.setdefault(code, verdict)
204
+ behavior = "yes — stays stopped" if stays_stopped else "no — restarts (break-then-restart)"
205
+ lines.append(f"| `{verdict}` | `{code}`{shares} | {behavior} |")
206
+ return "\n".join(lines)
207
+
208
+
209
+ def render_giveup_systemd_example() -> str:
210
+ """The ``systemd unit pattern recommendations`` fenced example.
211
+
212
+ ``RestartPreventExitStatus`` lists the three DELIBERATE give-up codes
213
+ (config_broken/crash_loop/mem_loop_persistent), derived from
214
+ ``_serve_policy.RESTART_PREVENT_EXIT_CODES`` — the same single source
215
+ ``service_unit.py`` renders from; ``mem_loop``'s 71 is deliberately
216
+ excluded so systemd respawns to retry. The second comment line's
217
+ leading padding is derived from the first line's own length (not
218
+ hand-counted) so the two ``#`` columns always line up even if a future
219
+ exit code changes ``prevent``'s width."""
220
+ prevent = " ".join(str(c) for c in _serve_policy.RESTART_PREVENT_EXIT_CODES)
221
+ header = f"RestartPreventExitStatus={prevent} "
222
+ return (
223
+ "```ini\n"
224
+ "# Prod (infinite supervisor) — current default\n"
225
+ "[Service]\n"
226
+ "ExecStart=... serve --config /etc/agent-runner.toml\n"
227
+ "Restart=on-failure\n"
228
+ f"{header}"
229
+ f"# config_broken ({_serve_policy.PERMANENT_CONFIG_EXIT}) / "
230
+ f"crash_loop ({_serve_policy.CRASH_LOOP_EXIT}) / "
231
+ f"mem_loop_persistent ({_serve_policy.MEM_LOOP_PERSISTENT_EXIT}) stay stopped\n"
232
+ f"{' ' * len(header)}"
233
+ f"# mem_loop ({_serve_policy.MEM_LOOP_EXIT}) is NOT listed here — it restarts\n"
234
+ "RestartSec=3\n"
235
+ "\n"
236
+ "# Bounded job\n"
237
+ "[Service]\n"
238
+ "ExecStart=... serve --config /etc/test.toml --max-rounds 10\n"
239
+ "Restart=on-failure\n"
240
+ "RestartSec=5\n"
241
+ "```"
242
+ )
243
+
244
+
159
245
  def _render_migrate_transforms() -> str:
160
246
  """Bullet list of the transforms `agent-runner migrate` applies, from the registry.
161
247
  A few entries carry a `parsed -> str` describe (so the manual report can name the
@@ -265,6 +351,16 @@ RENDERERS: dict[str, Renderer] = {
265
351
  "migrate-transforms": Renderer(
266
352
  _render_migrate_transforms, "agent_runner/migrations.py MIGRATIONS"
267
353
  ),
354
+ "giveup-exit-codes": Renderer(
355
+ render_giveup_exit_codes_table,
356
+ "agent_runner/_serve_policy.py exit-code constants + "
357
+ "cli/_serve_round.py post_round_verdicts's verdict->code map",
358
+ ),
359
+ "giveup-systemd-example": Renderer(
360
+ render_giveup_systemd_example,
361
+ "agent_runner/_serve_policy.py exit-code constants "
362
+ "(service_unit.py's RestartPreventExitStatus mirrors these same three)",
363
+ ),
268
364
  }
269
365
  RENDERERS.update(
270
366
  {
@@ -0,0 +1,103 @@
1
+ """Event emission wrappers — extracted from api.py for module-size hygiene.
2
+
3
+ Public facade over the ``_emit`` package: every sibling module in
4
+ ``agent_runner`` (and every test) imports from ``agent_runner._emit``
5
+ directly, never from ``agent_runner._emit.<submodule>`` — this file is the
6
+ one place a name crosses that boundary. All wrappers are re-exported from
7
+ agent_runner.api for backward compatibility; plugins and supervisor should
8
+ continue importing from agent_runner.api (e.g.
9
+ ``from agent_runner.api import emit_transient_error_detected``).
10
+
11
+ Each wrapper exists to keep cli/serve_cmd.py from importing agent_runner.events
12
+ directly — preserves the module-boundary architecture invariant. Local-import pattern
13
+ inside each wrapper body keeps agent_runner.api import-cheap.
14
+
15
+ Submodules are organised by domain: ``serve`` (supervisor control plane +
16
+ config/schedule lifecycle), ``rounds`` (one round's own lifecycle),
17
+ ``memory`` (host/cgroup memory pressure), ``agent`` (the agent axis — plugin
18
+ reports + throttle response).
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from agent_runner._emit.agent import ( # noqa: F401 — public re-export
24
+ emit_agent_auth_error_detected,
25
+ emit_agent_usage_recorded,
26
+ emit_anomaly_repetitive_tool,
27
+ emit_transient_error_backoff_capped,
28
+ emit_transient_error_detected,
29
+ emit_transient_error_recovered,
30
+ )
31
+ from agent_runner._emit.memory import ( # noqa: F401 — public re-export
32
+ emit_host_cgroup_memory_limit,
33
+ emit_mem_pressure_deferred_to_cgroup,
34
+ emit_round_cgroup_memory,
35
+ emit_round_deferred,
36
+ emit_round_mem_critical_sample,
37
+ emit_round_mem_terminated,
38
+ emit_round_oom_killed,
39
+ emit_round_resumed,
40
+ )
41
+ from agent_runner._emit.rounds import ( # noqa: F401 — public re-export
42
+ emit_fresh_eyes_round_triggered,
43
+ emit_round_grace_extended,
44
+ emit_round_grace_kill,
45
+ emit_round_logs_prune_deferred,
46
+ emit_round_progress,
47
+ emit_round_substrate_after,
48
+ emit_round_substrate_before,
49
+ emit_round_supervisor_wedged,
50
+ emit_stale_index_lock_cleared,
51
+ )
52
+ from agent_runner._emit.serve import ( # noqa: F401 — public re-export
53
+ emit_config_broken,
54
+ emit_config_migrated,
55
+ emit_crash_loop,
56
+ emit_max_rounds_reached,
57
+ emit_mem_loop,
58
+ emit_mem_loop_persistent,
59
+ emit_rate_limit_stop,
60
+ emit_schedule_paused,
61
+ emit_schedule_phase_skipped,
62
+ emit_schedule_resumed,
63
+ emit_stalled_no_progress,
64
+ emit_stop_file_detected,
65
+ )
66
+
67
+ __all__ = [
68
+ "emit_agent_auth_error_detected",
69
+ "emit_agent_usage_recorded",
70
+ "emit_anomaly_repetitive_tool",
71
+ "emit_config_broken",
72
+ "emit_config_migrated",
73
+ "emit_crash_loop",
74
+ "emit_fresh_eyes_round_triggered",
75
+ "emit_host_cgroup_memory_limit",
76
+ "emit_max_rounds_reached",
77
+ "emit_mem_loop",
78
+ "emit_mem_loop_persistent",
79
+ "emit_mem_pressure_deferred_to_cgroup",
80
+ "emit_rate_limit_stop",
81
+ "emit_round_cgroup_memory",
82
+ "emit_round_deferred",
83
+ "emit_round_grace_extended",
84
+ "emit_round_grace_kill",
85
+ "emit_round_logs_prune_deferred",
86
+ "emit_round_mem_critical_sample",
87
+ "emit_round_mem_terminated",
88
+ "emit_round_oom_killed",
89
+ "emit_round_progress",
90
+ "emit_round_resumed",
91
+ "emit_round_substrate_after",
92
+ "emit_round_substrate_before",
93
+ "emit_round_supervisor_wedged",
94
+ "emit_schedule_paused",
95
+ "emit_schedule_phase_skipped",
96
+ "emit_schedule_resumed",
97
+ "emit_stale_index_lock_cleared",
98
+ "emit_stalled_no_progress",
99
+ "emit_stop_file_detected",
100
+ "emit_transient_error_backoff_capped",
101
+ "emit_transient_error_detected",
102
+ "emit_transient_error_recovered",
103
+ ]