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