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.
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.vulture-whitelist.py +28 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/CHANGELOG.md +35 -47
- cli_agent_runner-0.2.9/CONTRIBUTING.md +120 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/PKG-INFO +15 -17
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/README.md +14 -16
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_docgen.py +112 -13
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_emit.py +34 -5
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_version.py +2 -2
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/api.py +10 -21
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/__init__.py +2 -0
- cli_agent_runner-0.2.9/agent_runner/cli/migrate_cmd.py +51 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/serve_cmd.py +132 -32
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/upgrade_cmd.py +56 -3
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/config.py +170 -37
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/events.py +2 -0
- cli_agent_runner-0.2.9/agent_runner/migrations.py +115 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/monitor.py +1 -0
- cli_agent_runner-0.2.9/agent_runner/phase_select.py +106 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/codewhale.toml +1 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/runner.py +11 -9
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/startup_check.py +34 -13
- cli_agent_runner-0.2.9/docs/README.md +45 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/architecture.md +9 -17
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/commands.md +75 -39
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/configuration.md +132 -37
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/long-running-agents.md +27 -90
- cli_agent_runner-0.2.9/docs/migrations/0.2.md +135 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/plugins.md +69 -230
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/aider.md +14 -2
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/codewhale.md +13 -1
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/runbook.md +80 -11
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/thesis.md +1 -1
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/pyproject.toml +5 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_context_enricher_namespacing.py +9 -1
- cli_agent_runner-0.2.9/tests/invariants/_docs.py +18 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_architecture.py +5 -2
- cli_agent_runner-0.2.9/tests/invariants/test_authored_facts_declared.py +77 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_config_error_consistency.py +4 -3
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_claims_match_ssot.py +14 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_cli_claims.py +6 -2
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_operator_surface.py +14 -2
- cli_agent_runner-0.2.9/tests/invariants/test_doc_test_pointers_exist.py +22 -0
- cli_agent_runner-0.2.9/tests/invariants/test_doc_usage_event_fields.py +32 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_entry_points_resolve.py +1 -3
- cli_agent_runner-0.2.9/tests/invariants/test_gen_blocks_name_their_source.py +28 -0
- cli_agent_runner-0.2.9/tests/invariants/test_phase_select_stateless.py +50 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config.py +23 -1
- cli_agent_runner-0.2.9/tests/unit/test_emit_config_migrated.py +24 -0
- cli_agent_runner-0.2.9/tests/unit/test_emit_schedule_phase_skipped.py +39 -0
- cli_agent_runner-0.2.9/tests/unit/test_example_dirty_handler.py +46 -0
- cli_agent_runner-0.2.9/tests/unit/test_example_plugin.py +65 -0
- cli_agent_runner-0.2.9/tests/unit/test_migrate_cmd.py +85 -0
- cli_agent_runner-0.2.9/tests/unit/test_migrations.py +83 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_schedule.py +14 -0
- cli_agent_runner-0.2.9/tests/unit/test_phase_agent_launch.py +110 -0
- cli_agent_runner-0.2.9/tests/unit/test_phase_profiles.py +120 -0
- cli_agent_runner-0.2.9/tests/unit/test_phase_select.py +140 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_presets.py +24 -2
- cli_agent_runner-0.2.9/tests/unit/test_serve_phase_schedule.py +193 -0
- cli_agent_runner-0.2.9/tests/unit/test_upgrade_migrate.py +91 -0
- cli_agent_runner-0.2.7/CONTRIBUTING.md +0 -83
- cli_agent_runner-0.2.7/docs/README.md +0 -40
- cli_agent_runner-0.2.7/docs/migrations/0.1.16.md +0 -97
- cli_agent_runner-0.2.7/docs/migrations/0.1.17.md +0 -80
- cli_agent_runner-0.2.7/docs/migrations/0.1.19.md +0 -61
- cli_agent_runner-0.2.7/docs/migrations/0.1.20.md +0 -80
- cli_agent_runner-0.2.7/docs/migrations/0.1.21.md +0 -126
- cli_agent_runner-0.2.7/docs/migrations/0.1.22.md +0 -93
- cli_agent_runner-0.2.7/docs/migrations/0.1.23.md +0 -132
- cli_agent_runner-0.2.7/docs/migrations/0.1.24.md +0 -124
- cli_agent_runner-0.2.7/docs/migrations/0.1.25.md +0 -96
- cli_agent_runner-0.2.7/docs/migrations/0.1.26.md +0 -135
- cli_agent_runner-0.2.7/docs/migrations/0.1.27.md +0 -176
- cli_agent_runner-0.2.7/docs/migrations/0.1.28.md +0 -176
- cli_agent_runner-0.2.7/docs/migrations/0.1.29.md +0 -90
- cli_agent_runner-0.2.7/docs/migrations/0.1.30.md +0 -73
- cli_agent_runner-0.2.7/docs/migrations/0.1.31.md +0 -89
- cli_agent_runner-0.2.7/docs/migrations/0.1.32.md +0 -113
- cli_agent_runner-0.2.7/docs/migrations/0.1.33.md +0 -88
- cli_agent_runner-0.2.7/docs/migrations/0.1.34.md +0 -110
- cli_agent_runner-0.2.7/docs/migrations/0.1.35.md +0 -98
- cli_agent_runner-0.2.7/docs/migrations/0.1.36.md +0 -73
- cli_agent_runner-0.2.7/docs/migrations/0.1.37.md +0 -65
- cli_agent_runner-0.2.7/docs/migrations/0.1.38.md +0 -53
- cli_agent_runner-0.2.7/docs/migrations/0.1.39.md +0 -74
- cli_agent_runner-0.2.7/docs/migrations/0.1.40.md +0 -42
- cli_agent_runner-0.2.7/docs/migrations/0.1.42.md +0 -58
- cli_agent_runner-0.2.7/docs/migrations/0.2.0.md +0 -165
- cli_agent_runner-0.2.7/docs/migrations/0.2.1.md +0 -77
- cli_agent_runner-0.2.7/docs/migrations/0.2.2.md +0 -242
- cli_agent_runner-0.2.7/docs/migrations/0.2.3.md +0 -44
- cli_agent_runner-0.2.7/docs/migrations/0.2.4.md +0 -66
- cli_agent_runner-0.2.7/docs/migrations/0.2.5.md +0 -99
- cli_agent_runner-0.2.7/docs/migrations/0.2.6.md +0 -127
- cli_agent_runner-0.2.7/docs/migrations/0.2.7.md +0 -121
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.codecov.yml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/workflows/ci.yml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.github/workflows/release.yml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/.gitignore +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/BACKLOG.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/CODE_OF_CONDUCT.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/LICENSE +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/README.zh.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/SECURITY.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_redact.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_registry.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_substrate.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/_throttle.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/agent_runtime.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/api_types.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/_constants.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/claude_rate_limit.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/codewhale.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/default_dirty_handler.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/gemini.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/kimi.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/builtin_plugins/pi.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/__main__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/common.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/events_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/init_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/install_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/monitor_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/peek_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/round_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/cli/service_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/context_store.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/defenses.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/hooks.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/http_progress.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/lifecycle.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/metrics.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/aider.toml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/claude.toml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/gemini.toml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/kimi.toml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/presets/pi.toml +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/prompt_loader.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/remote_relay.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/round_log.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/round_view.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/scaffold.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/schedule.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/service_unit.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/agent_runner/vcs_state.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/build.sh +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/events.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/quickstart.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/kimi.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/docs/recipes/pi.md +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/_test_helpers.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/conftest.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/contract/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/contract/test_public_api_surface.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/conftest.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_graceful_stop.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_install_systemd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_monitor_remote.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/e2e/test_e2e_round_lifecycle.py +0 -0
- {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
- {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
- {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
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/generate_vulture_whitelist.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_bounded_run.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_dirty_handler_seam.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_fresh_eyes_signal.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_grace_kill_emission.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_install_dry_run.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_monitor_seeded.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_detector_loaded.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_owned_paths.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_plugin_real_flow.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_prompt_delivery_stdin.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_run_one_round_with_fake_agent.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_scaffold_presets.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_serve_loop.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_substrate_fingerprint.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/integration/test_transient_error_backoff.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/_event_scan.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_atomic_write_enforced.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_auto_stop_policy_ssot.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_catalogs.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_classification_ssot.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_config_value_set_ssot.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_builtin_plugins.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_doc_transient_error_claims.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_docs_generated.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_docs_index_complete.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_event_kind_registry.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_event_kinds_ssot.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_events_doc_contract.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_hook_contract_docs.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_layer_2_loop_size.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_module_boundaries.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_module_sizes.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_no_ai_signatures.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_peek_schema_version.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_plugins_config_stable.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_readme_zh_is_pointer.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_repo_constants_patched_in_tests.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_round_result_stable.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_set_diff_for_auto_tool_classification.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_stash_uses_sha_not_index.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_upstream_schema_canary.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/invariants/test_vulture_whitelist_generated.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/parser.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/test_parser.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/literate/test_quickstart.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/__init__.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_grace.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_progress.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_agent_runtime_signal_name.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_assemble_prompt.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_events_stream.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_install.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_observation.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_read_round_num.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_resolve_phase.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_service.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_api_types.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_auto_stop_gating.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_catalogs.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_claude_error_detector.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_common.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_init_install.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_monitor_http.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_service_peek_monitor.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_cli_upgrade.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_codewhale_plugin.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_fresh_eyes.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_max_rounds.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_prompt_delivery.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_schedule.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_stop_file.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_substrate_fingerprint_paths.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_config_transient_error_action.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_context_store.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_default_dirty_handler.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_defenses.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_detector_protocol.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_dirty_handlers.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_docgen.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_emit_schedule.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events_cmd.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_events_cmd_tail.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_exit_cause.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_fresh_eyes_trigger.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_gemini_plugin.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_hook_failure_isolation.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_hooks.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_http_progress.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_init_entry_points.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_kimi_plugin.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_lifecycle.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_metrics.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_assembly.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_anomaly_repetitive.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_rate_limit.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detect_supervisor_stale.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_detectors.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_remote.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_monitor_schedule_pause.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_network_blip_signal_guard.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_argparse.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_peek_select.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_pi_plugin.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_plugin_constants.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_prompt_loader.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_redact.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_round_log_helpers.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_round_view.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_runner.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_runner_throttle.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_scaffold.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_schedule.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_cmd_bounded.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_config_broken.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_crash_loop.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_round_log.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_schedule_gate.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_sentinel.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_serve_startup_hooks.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_service_unit.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_startup_check.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_substrate.py +0 -0
- {cli_agent_runner-0.2.7 → cli_agent_runner-0.2.9}/tests/unit/test_throttle_plugin_classification.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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/
|
|
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
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
##
|
|
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`
|
|
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
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
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
|
-
##
|
|
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`
|
|
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
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|