cli-agent-runner 0.2.7__tar.gz → 0.2.9__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 (303) hide show
  1. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.vulture-whitelist.py +28 -0
  2. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/CHANGELOG.md +35 -47
  3. cli_agent_runner-0.2.9/CONTRIBUTING.md +120 -0
  4. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/PKG-INFO +15 -17
  5. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/README.md +14 -16
  6. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_docgen.py +112 -13
  7. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_emit.py +34 -5
  8. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_version.py +2 -2
  9. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/api.py +10 -21
  10. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/__init__.py +2 -0
  11. cli_agent_runner-0.2.9/agent_runner/cli/migrate_cmd.py +51 -0
  12. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/serve_cmd.py +132 -32
  13. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/upgrade_cmd.py +56 -3
  14. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/config.py +170 -37
  15. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/events.py +2 -0
  16. cli_agent_runner-0.2.9/agent_runner/migrations.py +115 -0
  17. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/monitor.py +1 -0
  18. cli_agent_runner-0.2.9/agent_runner/phase_select.py +106 -0
  19. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/codewhale.toml +1 -0
  20. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/runner.py +11 -9
  21. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/startup_check.py +34 -13
  22. cli_agent_runner-0.2.9/docs/README.md +45 -0
  23. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/architecture.md +9 -17
  24. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/commands.md +75 -39
  25. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/configuration.md +132 -37
  26. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/long-running-agents.md +27 -90
  27. cli_agent_runner-0.2.9/docs/migrations/0.2.md +135 -0
  28. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/plugins.md +69 -230
  29. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/aider.md +14 -2
  30. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/codewhale.md +13 -1
  31. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/runbook.md +80 -11
  32. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/thesis.md +1 -1
  33. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/pyproject.toml +5 -0
  34. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_context_enricher_namespacing.py +9 -1
  35. cli_agent_runner-0.2.9/tests/invariants/_docs.py +18 -0
  36. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_architecture.py +5 -2
  37. cli_agent_runner-0.2.9/tests/invariants/test_authored_facts_declared.py +77 -0
  38. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_config_error_consistency.py +4 -3
  39. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_claims_match_ssot.py +14 -0
  40. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_cli_claims.py +6 -2
  41. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_operator_surface.py +14 -2
  42. cli_agent_runner-0.2.9/tests/invariants/test_doc_test_pointers_exist.py +22 -0
  43. cli_agent_runner-0.2.9/tests/invariants/test_doc_usage_event_fields.py +32 -0
  44. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_entry_points_resolve.py +1 -3
  45. cli_agent_runner-0.2.9/tests/invariants/test_gen_blocks_name_their_source.py +28 -0
  46. cli_agent_runner-0.2.9/tests/invariants/test_phase_select_stateless.py +50 -0
  47. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config.py +23 -1
  48. cli_agent_runner-0.2.9/tests/unit/test_emit_config_migrated.py +24 -0
  49. cli_agent_runner-0.2.9/tests/unit/test_emit_schedule_phase_skipped.py +39 -0
  50. cli_agent_runner-0.2.9/tests/unit/test_example_dirty_handler.py +46 -0
  51. cli_agent_runner-0.2.9/tests/unit/test_example_plugin.py +65 -0
  52. cli_agent_runner-0.2.9/tests/unit/test_migrate_cmd.py +85 -0
  53. cli_agent_runner-0.2.9/tests/unit/test_migrations.py +83 -0
  54. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_schedule.py +14 -0
  55. cli_agent_runner-0.2.9/tests/unit/test_phase_agent_launch.py +110 -0
  56. cli_agent_runner-0.2.9/tests/unit/test_phase_profiles.py +120 -0
  57. cli_agent_runner-0.2.9/tests/unit/test_phase_select.py +140 -0
  58. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_presets.py +24 -2
  59. cli_agent_runner-0.2.9/tests/unit/test_serve_phase_schedule.py +193 -0
  60. cli_agent_runner-0.2.9/tests/unit/test_upgrade_migrate.py +91 -0
  61. cli_agent_runner-0.2.7/CONTRIBUTING.md +0 -83
  62. cli_agent_runner-0.2.7/docs/README.md +0 -40
  63. cli_agent_runner-0.2.7/docs/migrations/0.1.16.md +0 -97
  64. cli_agent_runner-0.2.7/docs/migrations/0.1.17.md +0 -80
  65. cli_agent_runner-0.2.7/docs/migrations/0.1.19.md +0 -61
  66. cli_agent_runner-0.2.7/docs/migrations/0.1.20.md +0 -80
  67. cli_agent_runner-0.2.7/docs/migrations/0.1.21.md +0 -126
  68. cli_agent_runner-0.2.7/docs/migrations/0.1.22.md +0 -93
  69. cli_agent_runner-0.2.7/docs/migrations/0.1.23.md +0 -132
  70. cli_agent_runner-0.2.7/docs/migrations/0.1.24.md +0 -124
  71. cli_agent_runner-0.2.7/docs/migrations/0.1.25.md +0 -96
  72. cli_agent_runner-0.2.7/docs/migrations/0.1.26.md +0 -135
  73. cli_agent_runner-0.2.7/docs/migrations/0.1.27.md +0 -176
  74. cli_agent_runner-0.2.7/docs/migrations/0.1.28.md +0 -176
  75. cli_agent_runner-0.2.7/docs/migrations/0.1.29.md +0 -90
  76. cli_agent_runner-0.2.7/docs/migrations/0.1.30.md +0 -73
  77. cli_agent_runner-0.2.7/docs/migrations/0.1.31.md +0 -89
  78. cli_agent_runner-0.2.7/docs/migrations/0.1.32.md +0 -113
  79. cli_agent_runner-0.2.7/docs/migrations/0.1.33.md +0 -88
  80. cli_agent_runner-0.2.7/docs/migrations/0.1.34.md +0 -110
  81. cli_agent_runner-0.2.7/docs/migrations/0.1.35.md +0 -98
  82. cli_agent_runner-0.2.7/docs/migrations/0.1.36.md +0 -73
  83. cli_agent_runner-0.2.7/docs/migrations/0.1.37.md +0 -65
  84. cli_agent_runner-0.2.7/docs/migrations/0.1.38.md +0 -53
  85. cli_agent_runner-0.2.7/docs/migrations/0.1.39.md +0 -74
  86. cli_agent_runner-0.2.7/docs/migrations/0.1.40.md +0 -42
  87. cli_agent_runner-0.2.7/docs/migrations/0.1.42.md +0 -58
  88. cli_agent_runner-0.2.7/docs/migrations/0.2.0.md +0 -165
  89. cli_agent_runner-0.2.7/docs/migrations/0.2.1.md +0 -77
  90. cli_agent_runner-0.2.7/docs/migrations/0.2.2.md +0 -242
  91. cli_agent_runner-0.2.7/docs/migrations/0.2.3.md +0 -44
  92. cli_agent_runner-0.2.7/docs/migrations/0.2.4.md +0 -66
  93. cli_agent_runner-0.2.7/docs/migrations/0.2.5.md +0 -99
  94. cli_agent_runner-0.2.7/docs/migrations/0.2.6.md +0 -127
  95. cli_agent_runner-0.2.7/docs/migrations/0.2.7.md +0 -121
  96. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.codecov.yml +0 -0
  97. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  98. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  99. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  100. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  101. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/workflows/ci.yml +0 -0
  102. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/workflows/release.yml +0 -0
  103. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.gitignore +0 -0
  104. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/BACKLOG.md +0 -0
  105. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/CODE_OF_CONDUCT.md +0 -0
  106. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/LICENSE +0 -0
  107. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/README.zh.md +0 -0
  108. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/SECURITY.md +0 -0
  109. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/__init__.py +0 -0
  110. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_redact.py +0 -0
  111. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_registry.py +0 -0
  112. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_substrate.py +0 -0
  113. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_throttle.py +0 -0
  114. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/agent_runtime.py +0 -0
  115. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/api_types.py +0 -0
  116. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/__init__.py +0 -0
  117. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/_constants.py +0 -0
  118. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/claude_rate_limit.py +0 -0
  119. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/codewhale.py +0 -0
  120. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/default_dirty_handler.py +0 -0
  121. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/gemini.py +0 -0
  122. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/kimi.py +0 -0
  123. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/pi.py +0 -0
  124. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/__main__.py +0 -0
  125. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/common.py +0 -0
  126. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/events_cmd.py +0 -0
  127. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/init_cmd.py +0 -0
  128. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/install_cmd.py +0 -0
  129. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/monitor_cmd.py +0 -0
  130. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/peek_cmd.py +0 -0
  131. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/round_cmd.py +0 -0
  132. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/service_cmd.py +0 -0
  133. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/context_store.py +0 -0
  134. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/defenses.py +0 -0
  135. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/hooks.py +0 -0
  136. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/http_progress.py +0 -0
  137. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/lifecycle.py +0 -0
  138. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/metrics.py +0 -0
  139. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/__init__.py +0 -0
  140. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/aider.toml +0 -0
  141. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/claude.toml +0 -0
  142. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/gemini.toml +0 -0
  143. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/kimi.toml +0 -0
  144. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/pi.toml +0 -0
  145. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/prompt_loader.py +0 -0
  146. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/remote_relay.py +0 -0
  147. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/round_log.py +0 -0
  148. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/round_view.py +0 -0
  149. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/scaffold.py +0 -0
  150. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/schedule.py +0 -0
  151. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/service_unit.py +0 -0
  152. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/vcs_state.py +0 -0
  153. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/build.sh +0 -0
  154. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/events.md +0 -0
  155. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/quickstart.md +0 -0
  156. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/kimi.md +0 -0
  157. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/pi.md +0 -0
  158. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/__init__.py +0 -0
  159. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/_test_helpers.py +0 -0
  160. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/conftest.py +0 -0
  161. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/contract/__init__.py +0 -0
  162. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/contract/test_public_api_surface.py +0 -0
  163. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/__init__.py +0 -0
  164. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/conftest.py +0 -0
  165. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_graceful_stop.py +0 -0
  166. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_install_systemd.py +0 -0
  167. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_monitor_remote.py +0 -0
  168. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_round_lifecycle.py +0 -0
  169. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
  170. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
  171. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
  172. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/generate_vulture_whitelist.py +0 -0
  173. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/__init__.py +0 -0
  174. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_bounded_run.py +0 -0
  175. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_dirty_handler_seam.py +0 -0
  176. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_fresh_eyes_signal.py +0 -0
  177. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_grace_kill_emission.py +0 -0
  178. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_install_dry_run.py +0 -0
  179. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_monitor_seeded.py +0 -0
  180. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_detector_loaded.py +0 -0
  181. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_owned_paths.py +0 -0
  182. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_real_flow.py +0 -0
  183. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_prompt_delivery_stdin.py +0 -0
  184. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_run_one_round_with_fake_agent.py +0 -0
  185. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_scaffold_presets.py +0 -0
  186. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_serve_loop.py +0 -0
  187. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_substrate_fingerprint.py +0 -0
  188. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_transient_error_backoff.py +0 -0
  189. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/__init__.py +0 -0
  190. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/_event_scan.py +0 -0
  191. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_atomic_write_enforced.py +0 -0
  192. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_auto_stop_policy_ssot.py +0 -0
  193. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_catalogs.py +0 -0
  194. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_classification_ssot.py +0 -0
  195. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_config_value_set_ssot.py +0 -0
  196. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_builtin_plugins.py +0 -0
  197. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_transient_error_claims.py +0 -0
  198. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_docs_generated.py +0 -0
  199. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_docs_index_complete.py +0 -0
  200. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_event_kind_registry.py +0 -0
  201. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_event_kinds_ssot.py +0 -0
  202. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_events_doc_contract.py +0 -0
  203. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_hook_contract_docs.py +0 -0
  204. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_layer_2_loop_size.py +0 -0
  205. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_module_boundaries.py +0 -0
  206. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_module_sizes.py +0 -0
  207. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_no_ai_signatures.py +0 -0
  208. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +0 -0
  209. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_peek_schema_version.py +0 -0
  210. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_plugins_config_stable.py +0 -0
  211. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_readme_zh_is_pointer.py +0 -0
  212. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_repo_constants_patched_in_tests.py +0 -0
  213. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_round_result_stable.py +0 -0
  214. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_set_diff_for_auto_tool_classification.py +0 -0
  215. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_stash_uses_sha_not_index.py +0 -0
  216. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_upstream_schema_canary.py +0 -0
  217. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_vulture_whitelist_generated.py +0 -0
  218. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/__init__.py +0 -0
  219. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/parser.py +0 -0
  220. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/test_parser.py +0 -0
  221. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/test_quickstart.py +0 -0
  222. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/__init__.py +0 -0
  223. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime.py +0 -0
  224. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_grace.py +0 -0
  225. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_progress.py +0 -0
  226. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_signal_name.py +0 -0
  227. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_assemble_prompt.py +0 -0
  228. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_events_stream.py +0 -0
  229. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_install.py +0 -0
  230. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_observation.py +0 -0
  231. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_read_round_num.py +0 -0
  232. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_resolve_phase.py +0 -0
  233. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_service.py +0 -0
  234. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_types.py +0 -0
  235. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_auto_stop_gating.py +0 -0
  236. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_catalogs.py +0 -0
  237. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_claude_error_detector.py +0 -0
  238. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli.py +0 -0
  239. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_common.py +0 -0
  240. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_init_install.py +0 -0
  241. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_monitor_http.py +0 -0
  242. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_service_peek_monitor.py +0 -0
  243. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_upgrade.py +0 -0
  244. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_codewhale_plugin.py +0 -0
  245. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_fresh_eyes.py +0 -0
  246. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_max_rounds.py +0 -0
  247. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_prompt_delivery.py +0 -0
  248. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_schedule.py +0 -0
  249. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_stop_file.py +0 -0
  250. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_substrate_fingerprint_paths.py +0 -0
  251. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_transient_error_action.py +0 -0
  252. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_context_store.py +0 -0
  253. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_default_dirty_handler.py +0 -0
  254. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_defenses.py +0 -0
  255. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_detector_protocol.py +0 -0
  256. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_dirty_handlers.py +0 -0
  257. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_docgen.py +0 -0
  258. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_emit_schedule.py +0 -0
  259. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events.py +0 -0
  260. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events_cmd.py +0 -0
  261. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events_cmd_tail.py +0 -0
  262. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_exit_cause.py +0 -0
  263. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_fresh_eyes_trigger.py +0 -0
  264. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_gemini_plugin.py +0 -0
  265. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_hook_failure_isolation.py +0 -0
  266. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_hooks.py +0 -0
  267. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_http_progress.py +0 -0
  268. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_init_entry_points.py +0 -0
  269. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_kimi_plugin.py +0 -0
  270. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_lifecycle.py +0 -0
  271. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_metrics.py +0 -0
  272. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_assembly.py +0 -0
  273. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_anomaly_repetitive.py +0 -0
  274. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_rate_limit.py +0 -0
  275. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_supervisor_stale.py +0 -0
  276. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detectors.py +0 -0
  277. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_remote.py +0 -0
  278. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_schedule_pause.py +0 -0
  279. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_network_blip_signal_guard.py +0 -0
  280. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_argparse.py +0 -0
  281. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_select.py +0 -0
  282. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_pi_plugin.py +0 -0
  283. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_plugin_constants.py +0 -0
  284. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_prompt_loader.py +0 -0
  285. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_redact.py +0 -0
  286. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_round_log_helpers.py +0 -0
  287. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_round_view.py +0 -0
  288. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_runner.py +0 -0
  289. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_runner_throttle.py +0 -0
  290. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_scaffold.py +0 -0
  291. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_schedule.py +0 -0
  292. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_cmd_bounded.py +0 -0
  293. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_config_broken.py +0 -0
  294. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_crash_loop.py +0 -0
  295. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_round_log.py +0 -0
  296. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_schedule_gate.py +0 -0
  297. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_sentinel.py +0 -0
  298. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_startup_hooks.py +0 -0
  299. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_service_unit.py +0 -0
  300. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_startup_check.py +0 -0
  301. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_substrate.py +0 -0
  302. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_throttle_plugin_classification.py +0 -0
  303. {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_vcs_state.py +0 -0
@@ -144,15 +144,24 @@ disk_critical_pct
144
144
  round_timeout_s
145
145
  disable_pre_round_hooks
146
146
  prompt_files
147
+ agent
148
+ schedule
147
149
 
148
150
  # agent_runner.config.PhasesConfig
149
151
  list
150
152
  overrides
153
+ phase_policy
151
154
 
152
155
  # agent_runner.config.PluginsConfig
153
156
  disable
154
157
  raw
155
158
 
159
+ # agent_runner.config.Profile
160
+ agent
161
+ runtime
162
+ schedule
163
+ prompt_files
164
+
156
165
  # agent_runner.config.PromptConfig
157
166
  file
158
167
  files
@@ -232,9 +241,28 @@ stash_idempotency_s
232
241
  # agent_runner.lifecycle.PIDFile
233
242
  path
234
243
 
244
+ # agent_runner.migrations.Migration
245
+ detect
246
+ apply
247
+ describe
248
+
249
+ # agent_runner.migrations.MigrationResult
250
+ new_text
251
+ applied
252
+ manual
253
+
235
254
  # agent_runner.monitor.LocalSource
236
255
  log_dir
237
256
 
257
+ # agent_runner.phase_select.Selection
258
+ phase
259
+ paused
260
+ resume_at
261
+ resume_phase
262
+ resume_timezone
263
+ skipped
264
+ active_window
265
+
238
266
  # agent_runner.round_log.PruneOutcome
239
267
  deleted
240
268
  deferred
@@ -5,6 +5,27 @@ 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.9] - 2026-08-28
9
+
10
+ ### Added
11
+ - Per-phase profiles: `[phases.<name>.agent]` and `[phases.<name>.schedule]` join the existing runtime/prompt overrides, so each phase resolves its own `(agent, runtime, schedule, prompt files)`. A phase's `[...agent]` field-merges onto the base `[agent]` (swap just `command`, inherit the rest); its `[...schedule]` replaces the global windows wholesale. Runs each phase under its own model — see the mixed-model rotation recipe.
12
+ - `[phases.<name>.runtime]` nested sub-table for `round_timeout_s` / `disable_pre_round_hooks`; the flat `[phases.<name>]` form stays as a permanent alias. Setting both twins is a config error.
13
+ - `[phases] phase_policy` (`wait` | `skip`): on a per-phase schedule, `wait` idle-sleeps until this round's phase opens; `skip` steps the rotation forward to the first open phase and runs it. `schedule_phase_skipped` event (`round_num`, `skipped`, `chosen`, `active_window`) records the stepped-over phases.
14
+ - `agent-runner migrate` reports (does not rewrite) flat per-phase runtime overrides that can move under `[phases.<name>.runtime]`.
15
+
16
+ See `docs/migrations/0.2.md`.
17
+
18
+ ## [0.2.8] - 2026-08-25
19
+
20
+ ### Added
21
+ - `agent-runner migrate [--dry-run]` rewrites removed/renamed fields in `agent-runner.toml` to their current form, keeping a `.bak`; reports fields needing a manual change.
22
+ - `upgrade` auto-migrates the config before the package/service step and emits a `config_migrated` event; a config needing a manual change aborts the run before it stops the service. `--no-migrate` skips it.
23
+
24
+ ### Changed
25
+ - Removed-field `ConfigError` messages now point to `agent-runner migrate`.
26
+
27
+ See `docs/migrations/0.2.md`.
28
+
8
29
  ## [0.2.7] - 2026-08-25
9
30
 
10
31
  ### Added
@@ -15,7 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
36
  ### Fixed
16
37
  - Monitor no longer raises `supervisor_stale` during an intentional schedule pause (suppressed until `resume_at` plus one staleness window).
17
38
 
18
- See `docs/migrations/0.2.7.md`.
39
+ See `docs/migrations/0.2.md`.
19
40
 
20
41
  ## [0.2.6] - 2026-07-28
21
42
 
@@ -28,7 +49,7 @@ See `docs/migrations/0.2.7.md`.
28
49
  ### Added
29
50
  - `round_logs_prune_deferred` event — emitted on every prune attempt the bulk guard defers, carrying `directory`, `existing`, `keep`, `would_delete` and a hint naming `runtime.round_log_retention`. Resolve by raising retention above the backlog or deleting the files yourself; the guard never blocks a round. Retention `0` emits nothing.
30
51
 
31
- See `docs/migrations/0.2.6.md`.
52
+ See `docs/migrations/0.2.md`.
32
53
 
33
54
  ## [0.2.5] - 2026-07-27
34
55
 
@@ -39,7 +60,7 @@ See `docs/migrations/0.2.6.md`.
39
60
  ### Removed
40
61
  - The polling remote monitor (`RemoteSource`, `run_remote_command`, `MonitorRemoteError`, auto-stop over ssh) — it read remote paths on the local filesystem and was already failing loud since 0.2.4. Detection is on-host by design; remote observation is the relay above. `monitor.on_alert` lost its `host` parameter and `monitor_auto_stop_triggered` its `host` field; `monitor_auto_stop_failed` now reports a failed *local* stop (previously a failed ssh stop) instead of crashing the monitor loop.
41
62
 
42
- See `docs/migrations/0.2.5.md`.
63
+ See `docs/migrations/0.2.md`.
43
64
 
44
65
  ## [0.2.4] - 2026-07-27
45
66
 
@@ -56,7 +77,7 @@ See `docs/migrations/0.2.5.md`.
56
77
  - Startup validation resolves the agent command exactly as the spawn does (child's PATH — `[agent.env]` may override it — and `work_dir` base); `PWD` now stays pinned to `work_dir` even if `[agent.env]` sets it. The stdout+stderr merge is now pinned by a behavioral test, not just prose.
57
78
  - Generated serve systemd units now set `KillMode=mixed`: with systemd's default `control-group`, `systemctl stop` SIGTERMed the whole cgroup — agent child included — making the graceful round drain structurally ineffective. Existing installs: re-run `agent-runner install` (or add a drop-in) to pick this up.
58
79
 
59
- See `docs/migrations/0.2.4.md`.
80
+ See `docs/migrations/0.2.md`.
60
81
 
61
82
  ## [0.2.3] - 2026-07-26
62
83
 
@@ -68,7 +89,7 @@ See `docs/migrations/0.2.4.md`.
68
89
  - The agent subprocess now runs in `runtime.work_dir` (`cwd=` on spawn). Previously it inherited the supervisor's cwd and only launch conventions (systemd `WorkingDirectory=`, relative `--config`) kept the two aligned — fatal for agent CLIs with no working-directory flag of their own (e.g. `pi`). The startup check now also validates a relative `agent.command[0]` against `work_dir`, matching where it executes.
69
90
  - Plugin round-log tail window widened 50 → 200 lines: a stderr burst after the agent's terminal JSONL event could evict it from the scan window, silently dropping usage/transient classification. The round log's merged stdout+stderr contract is now documented (`HookContext.agent_log_path`, `docs/long-running-agents.md`) — the merge is deliberate; auth/network detection reads stderr text from it.
70
91
 
71
- See `docs/migrations/0.2.3.md`.
92
+ See `docs/migrations/0.2.md`.
72
93
 
73
94
  ## [0.2.2] - 2026-07-18
74
95
 
@@ -91,7 +112,7 @@ See `docs/migrations/0.2.3.md`.
91
112
  ### Added
92
113
  - Housekeeping: the build gate runs `vulture` (dead-code scan, whitelist auto-generated from `@dataclass` fields); `AGENT_RUNNER_FRESH_EYES` is now a documented, tested round-subprocess env-var contract; `SECURITY.md` gains a threat model (agent-runner is a supervisor, not a sandbox).
93
114
 
94
- See `docs/migrations/0.2.2.md`.
115
+ See `docs/migrations/0.2.md`.
95
116
 
96
117
  ## [0.2.1] - 2026-07-16
97
118
 
@@ -102,7 +123,7 @@ See `docs/migrations/0.2.2.md`.
102
123
  ### Fixed
103
124
  - A signal-killed round is no longer misclassified as `agent_network_blip` when its log happens to contain a network-error string; signal deaths are terminations, not network blips.
104
125
 
105
- See `docs/migrations/0.2.1.md`.
126
+ See `docs/migrations/0.2.md`.
106
127
 
107
128
  ## [0.2.0] - 2026-07-02
108
129
 
@@ -110,7 +131,7 @@ See `docs/migrations/0.2.1.md`.
110
131
  - Dirty-tree handling is now pluggable. The clean-exit-dirty policy moved out of core into a `dirty_handler` hook; `stash` / `ignore` / `auto_commit` now ship as the bundled, default-on `default_dirty_handler` plugin. **No behavior or config change for existing users** — `[vcs] dirty_action` works exactly as before.
111
132
 
112
133
  ### Added
113
- - `dirty_handler` plugin seam (4th lifecycle hook) + `DirtyOutcome` on `RoundResult`; `stash_orphan` / `try_auto_commit` are now public `api` primitives. Consumers can fully own dirty-tree policy — see `docs/migrations/0.2.0.md`.
134
+ - `dirty_handler` plugin seam (4th lifecycle hook) + `DirtyOutcome` on `RoundResult`; `stash_orphan` / `try_auto_commit` are now public `api` primitives. Consumers can fully own dirty-tree policy — see `docs/migrations/0.2.md`.
114
135
  - `dirty_auto_committed` event (emitted when a handler auto-commits).
115
136
 
116
137
  ## [0.1.42] - 2026-06-25
@@ -139,7 +160,7 @@ See `docs/migrations/0.2.1.md`.
139
160
  ### Security
140
161
  - Grace-kill child-process fields (`live_children` / `ignored_children` in `round_grace_extended` / `round_grace_kill`) no longer store raw command lines — only the executable basename + pid (and, for ignored children, which ignore-pattern matched). This structurally prevents secrets passed in a child's arguments from reaching `events-*.jsonl`. The field shape changed from a list of strings to a list of objects.
141
162
  - Free-text event excerpts that can carry agent output — `transient_error_detected.raw`, `hook_failed.error_message`/`traceback`, `serve_startup_hook_failed.exc_msg` — are now best-effort redacted (auth headers, tokens, credential URLs, `KEY=value` secrets, known key-prefixes, JWT, PEM).
142
- - Pre-0.1.40 `events-*.jsonl` may contain unredacted argv/excerpts — see `docs/migrations/0.1.40.md`.
163
+ - Pre-0.1.40 `events-*.jsonl` may contain unredacted argv/excerpts.
143
164
 
144
165
  ### Changed
145
166
  - Docs: `configuration.md` `[monitor.host_health]` example points to the generated schema table instead of restating default values.
@@ -195,7 +216,7 @@ See `docs/migrations/0.2.1.md`.
195
216
  ## [0.1.35] - 2026-05-20
196
217
 
197
218
  ### Removed
198
- - `claude_rate_limit_detector` plugin alias (0.1.20-era back-compat layer after the 0.1.23 rename to `claude_error_detector`). Hard-cut at both entry-point and config-mapping layers. See `docs/migrations/0.1.35.md` for the 1-line TOML migration.
219
+ - `claude_rate_limit_detector` plugin alias (0.1.20-era back-compat layer after the 0.1.23 rename to `claude_error_detector`). Hard-cut at both entry-point and config-mapping layers.
199
220
 
200
221
  ## [0.1.34] - 2026-05-20
201
222
 
@@ -207,8 +228,6 @@ See `docs/migrations/0.2.1.md`.
207
228
  ### Removed
208
229
  - `peek --select events.<kind>` selector (mis-placed in state-snapshot verb). Use `events --kind <kind>` instead. 1-line `s///` migration.
209
230
 
210
- See `docs/migrations/0.1.34.md`.
211
-
212
231
  ## [0.1.33] - 2026-05-19
213
232
 
214
233
  ### Added
@@ -217,8 +236,6 @@ See `docs/migrations/0.1.34.md`.
217
236
  - `transient_error_backoff_capped` event gains `original_reset_at_epoch`, `applied_reset_at_epoch`, `consecutive_count`, `capped_by_absolute_max` fields for backoff-curve observability.
218
237
  - `docs/thesis.md` names the server-authoritative vs estimated reset principle.
219
238
 
220
- See `docs/migrations/0.1.33.md`.
221
-
222
239
  ## [0.1.32] - 2026-05-18
223
240
 
224
241
  ### Added
@@ -227,8 +244,6 @@ See `docs/migrations/0.1.33.md`.
227
244
  - `[monitor.host_health]` config section — `mem_avail_min_mb` / `disk_warning_pct` / `disk_critical_pct` thresholds for `mem_pressure` / `disk_warning` / `disk_critical` detectors. Defaults preserve prior behavior.
228
245
  - New monitor detector `anomaly_repetitive_active` (notify) — alerts when `anomaly_repetitive_tool` events fire in recent rounds. Detector count 10 → 11.
229
246
 
230
- See `docs/migrations/0.1.32.md`.
231
-
232
247
  ## [0.1.31] - 2026-05-18
233
248
 
234
249
  ### Added
@@ -237,8 +252,6 @@ See `docs/migrations/0.1.32.md`.
237
252
  - `[runtime] dry_run` boolean exposed via `HookContext.dry_run` for plugin authors to skip side-effect actions when set.
238
253
  - Documentation: TOML changes require daemon restart (no hot-reload); phase rotation indexing clarification.
239
254
 
240
- See `docs/migrations/0.1.31.md`.
241
-
242
255
  ## [0.1.30] - 2026-05-18
243
256
 
244
257
  ### Fixed
@@ -251,8 +264,6 @@ See `docs/migrations/0.1.31.md`.
251
264
  - `docs/thesis.md` — project non-goals SSOT for feature-request evaluation.
252
265
  - README + runbook callouts for SSH trust boundary of `monitor --host`.
253
266
 
254
- See `docs/migrations/0.1.30.md`.
255
-
256
267
  ## [0.1.29] - 2026-05-17
257
268
 
258
269
  ### Added
@@ -267,8 +278,6 @@ See `docs/migrations/0.1.30.md`.
267
278
  - Legacy API exports: `emit_rate_limit_rejected`, `emit_rate_limit_recovered`, `emit_rate_limit_backoff_capped`.
268
279
  - Config alias `runtime.rate_limit_action` — use `runtime.transient_error_action`. Removed configs now error with migration hint.
269
280
 
270
- See `docs/migrations/0.1.29.md`.
271
-
272
281
  ## [0.1.28] - 2026-05-17
273
282
 
274
283
  ### Added
@@ -284,7 +293,7 @@ See `docs/migrations/0.1.29.md`.
284
293
  - `agent_runner.api_types.ThrottleState` dead alias (0.1.23 back-compat; deprecation window
285
294
  passed; switch to `TransientErrorState`).
286
295
 
287
- See `docs/migrations/0.1.28.md`.
296
+ See `docs/plugins.md` under `claude_error_detector` for the `agent_usage_recorded` payload schema.
288
297
 
289
298
  ## [0.1.27] - 2026-05-17
290
299
 
@@ -294,11 +303,9 @@ See `docs/migrations/0.1.28.md`.
294
303
  Affects supervisors consuming transient_error_detected.
295
304
 
296
305
  ### Added
297
- - docs/migrations/0.1.27.md: supervisor usage guide for transient_error_detected event
306
+ - Supervisor usage guide for transient_error_detected event
298
307
  (4-bucket dispatch table + back-off recipe).
299
308
 
300
- See `docs/migrations/0.1.27.md`.
301
-
302
309
  ## [0.1.26] - 2026-05-17
303
310
 
304
311
  - Fix claude `agent_usage_recorded` `model` field (was always
@@ -311,8 +318,6 @@ See `docs/migrations/0.1.27.md`.
311
318
  `gemini_error_detector` plugin can parse output. Existing scaffolds
312
319
  need manual TOML edit; round log format changes (text → JSONL).
313
320
 
314
- See `docs/migrations/0.1.26.md`.
315
-
316
321
  ## [0.1.25] - 2026-05-17
317
322
 
318
323
  - **Hotfix**: built-in `claude_error_detector` and `gemini_error_detector`
@@ -323,8 +328,6 @@ See `docs/migrations/0.1.26.md`.
323
328
  - `HookContext.agent_log_path: Path | None = None` (additive). 3rd-party
324
329
  plugin authors reading `ctx.log_dir / "round-{N}.log"` should migrate.
325
330
 
326
- See `docs/migrations/0.1.25.md`.
327
-
328
331
  ## [0.1.24] - 2026-05-17
329
332
 
330
333
  - New `agent_usage_recorded` event: per-round token + cost data, emitted
@@ -337,8 +340,6 @@ See `docs/migrations/0.1.25.md`.
337
340
  unattended operation (gemini CLI refuses headless runs in untrusted
338
341
  dirs). Existing scaffolds need manual edit.
339
342
 
340
- See `docs/migrations/0.1.24.md`.
341
-
342
343
  ## [0.1.23] - 2026-05-17
343
344
 
344
345
  - Generalized claude error handling: new `transient_error_*` event family
@@ -351,8 +352,6 @@ See `docs/migrations/0.1.24.md`.
351
352
  - Plugin `claude_rate_limit_detector` renamed to `claude_error_detector`
352
353
  (entry-point alias preserved).
353
354
 
354
- See `docs/migrations/0.1.23.md`.
355
-
356
355
  ## [0.1.22] - 2026-05-16
357
356
 
358
357
  - `[runtime] substrate_fingerprint_paths` + `round_substrate_before` /
@@ -365,8 +364,6 @@ See `docs/migrations/0.1.23.md`.
365
364
  - New `docs/long-running-agents.md`: hazards + 4 primitives + framework
366
365
  abstraction boundary.
367
366
 
368
- See `docs/migrations/0.1.22.md`.
369
-
370
367
  ## [0.1.21] - 2026-05-16
371
368
 
372
369
  - `[runtime] max_rounds = N` + `--max-rounds N` CLI flag: supervisor
@@ -377,8 +374,6 @@ See `docs/migrations/0.1.22.md`.
377
374
  `systemctl start` to resume.
378
375
  - 2 new events: `max_rounds_reached`, `stop_file_detected`.
379
376
 
380
- See `docs/migrations/0.1.21.md`.
381
-
382
377
  ## [0.1.20] - 2026-05-16
383
378
 
384
379
  - Built-in detection of claude rate-limit rejections (5h OAuth quota).
@@ -391,8 +386,6 @@ See `docs/migrations/0.1.21.md`.
391
386
  - `peek --json` schema bumped 1.8 → 1.9 (additive `rate_limit` field).
392
387
  - New monitor detector `rate_limit_active` (warning, no auto-stop).
393
388
 
394
- See `docs/migrations/0.1.20.md`.
395
-
396
389
  ## [0.1.19] - 2026-05-15
397
390
 
398
391
  - `agent-runner install` derives `ExecStart` via `shutil.which`; fixes
@@ -404,15 +397,12 @@ See `docs/migrations/0.1.20.md`.
404
397
  - New `gemini` preset: `agent-runner init --preset gemini` scaffolds
405
398
  for Gemini CLI (uses `--yolo` for unattended operation).
406
399
 
407
- See `docs/migrations/0.1.19.md`.
408
-
409
400
  ## [0.1.18] - 2026-05-15
410
401
 
411
402
  ### ⚠️ Breaking
412
403
 
413
404
  - `vcs.orphan_action` removed (deprecated in 0.1.17). TOML using the
414
405
  old key raises `ValueError` with migration hint. Use `vcs.dirty_action`.
415
- See `docs/migrations/0.1.17.md`.
416
406
 
417
407
  ## [0.1.17] - 2026-05-15
418
408
 
@@ -425,13 +415,11 @@ See `docs/migrations/0.1.19.md`.
425
415
  - New round subprocess env vars `AGENT_RUNNER_ROUND_NUM` and
426
416
  `AGENT_RUNNER_PHASE`.
427
417
 
428
- See `docs/migrations/0.1.17.md`.
429
-
430
418
  ## [0.1.16] - 2026-05-14
431
419
 
432
420
  ### ⚠️ Breaking changes
433
421
 
434
- - **`runtime.round_timeout_per_phase` dict syntax removed**. Use `[phases.<name>] round_timeout_s = X` sub-table instead. Migration recipe in `docs/migrations/0.1.16.md`. Rationale: the dict syntax scaled poorly (N² as more per-phase fields would land); the sub-table is a one-time generalization that accommodates any per-phase field including the new `prompt.files`.
422
+ - **`runtime.round_timeout_per_phase` dict syntax removed**. Use `[phases.<name>] round_timeout_s = X` sub-table instead. Rationale: the dict syntax scaled poorly (N² as more per-phase fields would land); the sub-table is a one-time generalization that accommodates any per-phase field including the new `prompt.files`.
435
423
  - **`Config.phases` type changed** from `list[str] | None` to `PhasesConfig` dataclass with `.list: list[str] | None` and `.overrides: dict[str, PhaseOverride]`. Code reading `cfg.phases` as a list directly must update to `cfg.phases.list`. Internal callers and plugins are advised to check this access pattern.
436
424
 
437
425
  ### Added
@@ -445,7 +433,7 @@ See `docs/migrations/0.1.17.md`.
445
433
 
446
434
  ### Migration notes
447
435
 
448
- - Replace `runtime.round_timeout_per_phase = { dev = 3600, qa = 900 }` with `[phases.dev] round_timeout_s = 3600` + `[phases.qa] round_timeout_s = 900` sub-tables. See `docs/migrations/0.1.16.md` for full recipe.
436
+ - Replace `runtime.round_timeout_per_phase = { dev = 3600, qa = 900 }` with `[phases.dev] round_timeout_s = 3600` + `[phases.qa] round_timeout_s = 900` sub-tables.
449
437
  - Code reading `cfg.phases` (e.g. iterating phase names) must update to `cfg.phases.list`.
450
438
  - `prompt.file = "x.md"` continues to work unchanged; no migration required unless adopting multi-file concat.
451
439
 
@@ -0,0 +1,120 @@
1
+ # Contributing to agent-runner
2
+
3
+ Thanks for your interest in contributing!
4
+
5
+ ## Development setup
6
+
7
+ ```bash
8
+ git clone https://github.com/wan9yu/cli-agent-runner.git
9
+ cd cli-agent-runner
10
+ python3 -m venv .venv && source .venv/bin/activate
11
+ pip install -e ".[dev]"
12
+ ./build.sh check
13
+ ```
14
+
15
+ `./build.sh check` runs the full local-CI sweep: ruff (lint + format), unit
16
+ + integration tests, the literate quickstart, and the docs CI gate. It's
17
+ what GitHub Actions runs on every push and PR.
18
+
19
+ ## Workflow
20
+
21
+ 1. Open an issue first for non-trivial changes — saves wasted work on both sides.
22
+ 2. Branch off `main`. Keep PRs focused; one logical change per PR.
23
+ 3. **TDD encouraged**: write the failing test first, then the implementation.
24
+ 4. Every public API change needs a home for each new fact — see
25
+ [Where does this fact go?](#where-does-this-fact-go) below.
26
+ 5. Run `./build.sh check` locally before pushing.
27
+ 6. Conventional Commits: `feat:` / `fix:` / `docs:` / `refactor:` / `test:` /
28
+ `chore:` / `ci:` / `build:` / `perf:`. Subjects in English, imperative mood.
29
+ CI (`lint-commits` job) and `tests/invariants/test_no_ai_signatures.py`
30
+ reject auto-generated trailers and robot signatures — keep messages
31
+ human-authored.
32
+
33
+ ## Where does this fact go?
34
+
35
+ Before you write a sentence into a doc, run it through these four questions in
36
+ order. The first one that matches is the fact's home — put it there and nowhere
37
+ else. This is mechanical: a contributor (or an AI) should reach the same answer
38
+ without judgment.
39
+
40
+ 1. **Is it enumerable/mechanical?** A default, enum, flag, count, schema,
41
+ transform, or preset. → It lives in **code as data**. The doc gets a
42
+ `gen:` block that renders it (see the generated regions in `docs/*.md`,
43
+ filled by `./build.sh docs`) or it gets nothing. Never hand-copy the value
44
+ into prose.
45
+
46
+ 2. **Is it a behavioral claim?** "X happens when Y." → It lives in a **test**.
47
+ The doc may name that test — the path is data, and a named test that goes
48
+ red is a self-correcting reference. Prose that asserts behavior no test
49
+ pins is a claim waiting to rot.
50
+
51
+ 3. **Is it judgment, rationale, or narrative?** Why a design is the way it is,
52
+ a trade-off, a walkthrough. → It's **authored prose**; write it. If that
53
+ prose must name an owned fact (e.g. a config default) to make its point,
54
+ declare it inline with `<!-- authored: reason; SSOT <source> -->` so the
55
+ mention is a reviewed choice, not silent drift.
56
+
57
+ 4. **None of the above?** → **Delete it.** A fact with no home is upkeep with
58
+ no reader.
59
+
60
+ The corollary: **a fact stated twice is a bug with a delay timer.** The two
61
+ copies will diverge; the only question is when. Derive one from the other, or
62
+ delete one.
63
+
64
+ This isn't only convention. `tests/invariants/test_authored_facts_declared.py`
65
+ enforces (1) and (3) for config defaults today: a known config field named
66
+ alongside a default literal in prose fails the gate unless it carries an
67
+ `<!-- authored: reason -->` declaration. The linter's scope grows over time —
68
+ more owned facts, more of this procedure, mechanically enforced.
69
+
70
+ ## Migration docs
71
+
72
+ Migration guidance is primarily the executable `agent-runner migrate` command
73
+ (which rewrites removed/renamed config fields — its transform list is generated
74
+ into `docs/commands.md` from the registry) plus `CHANGELOG.md`. Between them
75
+ they carry a config rewrite and per-version notes; a doc that only restates the
76
+ changelog is upkeep with no reader.
77
+
78
+ `docs/migrations/0.2.md` is the one surviving guide: it collects the few manual
79
+ steps a config rewrite can't do (recovery procedures, a systemd regen, a mode
80
+ switch). Keep the relevant CHANGELOG entries terse and link it
81
+ (`See docs/migrations/0.2.md.`).
82
+
83
+ Migration guides are **not** append-only. A per-version guide is pruned once its
84
+ content becomes executable (`migrate`), generated (the transform list),
85
+ consolidated (into `0.2.md`), or purely archival — its live referrers retargeted
86
+ in the same change so no dead pointer remains. When you consolidate, correct a
87
+ carried-over step in place rather than preserving the original wording.
88
+
89
+ ## Architecture / docs
90
+
91
+ - [`docs/architecture.md`](docs/architecture.md) — 3-layer model, defenses-as-data.
92
+ - [`docs/commands.md`](docs/commands.md) — verb reference.
93
+ - [`docs/configuration.md`](docs/configuration.md) — TOML schema.
94
+
95
+ The defenses table, detector list, event kinds, config schema, and verb
96
+ table in `docs/*.md` are auto-generated by `./build.sh docs`. The CI gate
97
+ fails if those regions drift from the code's source of truth. Don't edit
98
+ them manually — edit the generator or the data source.
99
+
100
+ `.vulture-whitelist.py` is likewise generated — from every `@dataclass` field
101
+ in `agent_runner/`. If you add or rename a dataclass field, run
102
+ `./build.sh vulture-whitelist` and commit the regenerated file;
103
+ `tests/invariants/test_vulture_whitelist_generated.py` fails the gate if it
104
+ drifts.
105
+
106
+ ## Tests
107
+
108
+ - Unit + integration: `pytest -q --ignore=tests/e2e --ignore=tests/literate`
109
+ - Literate quickstart: `./build.sh literate`
110
+ - Pi e2e (opt-in): `AGENT_RUNNER_E2E_PI=1 pytest tests/e2e/` (needs a `pi`
111
+ ssh alias; not run in CI).
112
+
113
+ ## Code of conduct
114
+
115
+ Project follows the [Contributor Covenant v2.1](CODE_OF_CONDUCT.md). Be kind.
116
+
117
+ ## Reporting security issues
118
+
119
+ Please **don't** open public issues for security problems — see
120
+ [SECURITY.md](SECURITY.md).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cli-agent-runner
3
- Version: 0.2.7
3
+ Version: 0.2.9
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
@@ -51,7 +51,7 @@ full disks, runaway memory.
51
51
  ┌──────────────────────────────────────────┐
52
52
  │ Layer 3: The Witness (monitor) │ 11 detectors + auto-stop
53
53
  ├──────────────────────────────────────────┤
54
- │ Layer 2: The Loop (serve, ~120 LOC) │ signal-trapping restart loop
54
+ │ Layer 2: The Loop (serve) │ signal-trapping restart loop
55
55
  ├──────────────────────────────────────────┤
56
56
  │ Layer 1: The Round (round) │ one agent invocation
57
57
  └──────────────────────────────────────────┘
@@ -80,14 +80,15 @@ agent-runner monitor # live anomaly detection
80
80
 
81
81
  Full walkthrough: [`docs/quickstart.md`](docs/quickstart.md).
82
82
 
83
- ## 15 verbs
83
+ ## 16 verbs
84
84
 
85
85
  | Lifecycle | Observation |
86
86
  |---|---|
87
87
  | `init` / `install` / `uninstall` | `peek` — state snapshot |
88
88
  | `start` / `stop` / `kill` | `watch` — peek in a refresh loop |
89
89
  | `restart` / `status` | `monitor` — 11 detectors, alerts, auto-stop |
90
- | `round` / `serve` / `upgrade` | `events` — query / stream events.jsonl |
90
+ | `round` / `serve` | `events` — query / stream events.jsonl |
91
+ | `upgrade` / `migrate` | |
91
92
 
92
93
  Verb reference: [`docs/commands.md`](docs/commands.md).
93
94
 
@@ -106,6 +107,10 @@ guards it. Highlights:
106
107
 
107
108
  Full list and rationale: [`docs/architecture.md`](docs/architecture.md).
108
109
 
110
+ Optionally pause the loop during off-hours: `[schedule]` run/pause windows gate
111
+ `serve` (override with `serve --ignore-schedule`) — see the `[schedule]` section
112
+ of [`docs/configuration.md`](docs/configuration.md).
113
+
109
114
  ## Monitor: 11 detectors
110
115
 
111
116
  Notify only: `timeout_rate`, `hung`, `orphan_chain`, `disk_warning`,
@@ -123,24 +128,17 @@ agent-runner monitor # 30s poll
123
128
  agent-runner monitor --json | jq -c # pipe to downstream consumers
124
129
  ```
125
130
 
126
- Watch a remote host's event stream from your laptop one command instead of a
127
- hand-rolled `ssh … ; sleep` loop:
131
+ Watch a remote host's event stream from your laptop with a managed ssh relay
132
+ one command instead of a hand-rolled `ssh … ; sleep` loop:
128
133
 
129
134
  ```bash
130
135
  agent-runner monitor --host pi --mode events # managed ssh relay, JSONL stdout
131
136
  ```
132
137
 
133
- The relay reconnects with `--since <last ts>` so a dropped link replays its gap,
134
- gives up (exit 1) once the outage passes `remote_failure_tolerance_s`, and kills
135
- the ssh process group on exit so no orphan tree is left behind.
136
-
137
- > **Detection stays on the host.** `--host` with `--mode anomaly | narrate |
138
- > http` exits with an error: the detectors read the supervised host's logs and
139
- > auto-stop its service, which must keep working with your laptop closed. Run
140
- > the monitor there (`ssh <alias>`, then `agent-runner monitor`) and relay its
141
- > events here. See [`docs/runbook.md`](docs/runbook.md) § "Remote event relay &
142
- > SSH trust" — the SSH trust boundary applies to any agent-runner command you
143
- > drive over ssh.
138
+ Detection stays on the host: `--host` with `--mode anomaly | narrate | http`
139
+ exits with an error, since the detectors and auto-stop must keep working with
140
+ your laptop closed. Full relay + SSH-trust mechanics:
141
+ [`docs/runbook.md`](docs/runbook.md) § "Remote event relay & SSH trust".
144
142
 
145
143
  ## Documentation
146
144
 
@@ -15,7 +15,7 @@ full disks, runaway memory.
15
15
  ┌──────────────────────────────────────────┐
16
16
  │ Layer 3: The Witness (monitor) │ 11 detectors + auto-stop
17
17
  ├──────────────────────────────────────────┤
18
- │ Layer 2: The Loop (serve, ~120 LOC) │ signal-trapping restart loop
18
+ │ Layer 2: The Loop (serve) │ signal-trapping restart loop
19
19
  ├──────────────────────────────────────────┤
20
20
  │ Layer 1: The Round (round) │ one agent invocation
21
21
  └──────────────────────────────────────────┘
@@ -44,14 +44,15 @@ agent-runner monitor # live anomaly detection
44
44
 
45
45
  Full walkthrough: [`docs/quickstart.md`](docs/quickstart.md).
46
46
 
47
- ## 15 verbs
47
+ ## 16 verbs
48
48
 
49
49
  | Lifecycle | Observation |
50
50
  |---|---|
51
51
  | `init` / `install` / `uninstall` | `peek` — state snapshot |
52
52
  | `start` / `stop` / `kill` | `watch` — peek in a refresh loop |
53
53
  | `restart` / `status` | `monitor` — 11 detectors, alerts, auto-stop |
54
- | `round` / `serve` / `upgrade` | `events` — query / stream events.jsonl |
54
+ | `round` / `serve` | `events` — query / stream events.jsonl |
55
+ | `upgrade` / `migrate` | |
55
56
 
56
57
  Verb reference: [`docs/commands.md`](docs/commands.md).
57
58
 
@@ -70,6 +71,10 @@ guards it. Highlights:
70
71
 
71
72
  Full list and rationale: [`docs/architecture.md`](docs/architecture.md).
72
73
 
74
+ Optionally pause the loop during off-hours: `[schedule]` run/pause windows gate
75
+ `serve` (override with `serve --ignore-schedule`) — see the `[schedule]` section
76
+ of [`docs/configuration.md`](docs/configuration.md).
77
+
73
78
  ## Monitor: 11 detectors
74
79
 
75
80
  Notify only: `timeout_rate`, `hung`, `orphan_chain`, `disk_warning`,
@@ -87,24 +92,17 @@ agent-runner monitor # 30s poll
87
92
  agent-runner monitor --json | jq -c # pipe to downstream consumers
88
93
  ```
89
94
 
90
- Watch a remote host's event stream from your laptop one command instead of a
91
- hand-rolled `ssh … ; sleep` loop:
95
+ Watch a remote host's event stream from your laptop with a managed ssh relay
96
+ one command instead of a hand-rolled `ssh … ; sleep` loop:
92
97
 
93
98
  ```bash
94
99
  agent-runner monitor --host pi --mode events # managed ssh relay, JSONL stdout
95
100
  ```
96
101
 
97
- The relay reconnects with `--since <last ts>` so a dropped link replays its gap,
98
- gives up (exit 1) once the outage passes `remote_failure_tolerance_s`, and kills
99
- the ssh process group on exit so no orphan tree is left behind.
100
-
101
- > **Detection stays on the host.** `--host` with `--mode anomaly | narrate |
102
- > http` exits with an error: the detectors read the supervised host's logs and
103
- > auto-stop its service, which must keep working with your laptop closed. Run
104
- > the monitor there (`ssh <alias>`, then `agent-runner monitor`) and relay its
105
- > events here. See [`docs/runbook.md`](docs/runbook.md) § "Remote event relay &
106
- > SSH trust" — the SSH trust boundary applies to any agent-runner command you
107
- > drive over ssh.
102
+ Detection stays on the host: `--host` with `--mode anomaly | narrate | http`
103
+ exits with an error, since the detectors and auto-stop must keep working with
104
+ your laptop closed. Full relay + SSH-trust mechanics:
105
+ [`docs/runbook.md`](docs/runbook.md) § "Remote event relay & SSH trust".
108
106
 
109
107
  ## Documentation
110
108