phase-loop-runtime 0.6.0__tar.gz → 0.6.1__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.
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/PKG-INFO +1 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/pyproject.toml +1 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/__init__.py +1 -1
- phase_loop_runtime-0.6.1/src/phase_loop_runtime/_proc_cpu.py +57 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/panel_invoker.py +277 -30
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/SOURCES.txt +3 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_backing_homebrew.py +26 -37
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_golden.py +18 -22
- phase_loop_runtime-0.6.1/tests/test_leg_liveness_monitor.py +180 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_advisory_mode_63.py +1 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_context_refs_114.py +8 -4
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_invoker_spawn.py +49 -34
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_invoker_timeout_argv.py +50 -18
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_leg_auth_preflight_64.py +23 -18
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_per_leg_model_66.py +13 -8
- phase_loop_runtime-0.6.1/tests/test_proc_cpu.py +45 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/setup.cfg +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/tests/test_worktree_index.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.1"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Process-group CPU sampling for the leg-liveness monitor.
|
|
2
|
+
|
|
3
|
+
A panel leg is launched with ``start_new_session=True``, so its process-group id
|
|
4
|
+
(pgid) equals the leader pid and every descendant it spawns inherits that pgid.
|
|
5
|
+
``group_cpu_ticks(leader_pid)`` therefore sums CPU (utime+stime) across the whole
|
|
6
|
+
leg — leader and all children — which is the heartbeat signal for a leg that is
|
|
7
|
+
*thinking silently* (codex/grok in print mode emit no incremental stdout, then
|
|
8
|
+
write their ``--output-last-message`` file at the end; a thinking process burns
|
|
9
|
+
CPU, a wedged one does not).
|
|
10
|
+
|
|
11
|
+
Linux-only via ``/proc``. On any other platform (or a missing ``/proc``) it
|
|
12
|
+
returns 0, so the runner degrades to a stdout-only heartbeat — still correct: a
|
|
13
|
+
streaming leg heartbeats on stdout, and a silent-AND-idle leg is genuinely dead.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _pgrp_and_ticks(pid: int) -> tuple[int, int]:
|
|
21
|
+
"""Return ``(process_group_id, utime+stime)`` for ``pid`` from /proc/<pid>/stat.
|
|
22
|
+
|
|
23
|
+
The ``comm`` field (2nd) is wrapped in parens and may itself contain spaces or
|
|
24
|
+
parens, so parse the fixed fields AFTER the last ``)``: from there field 3
|
|
25
|
+
(state) is index 0, so pgrp (field 5) = index 2, utime (14) = index 11, and
|
|
26
|
+
stime (15) = index 12.
|
|
27
|
+
"""
|
|
28
|
+
with open(f"/proc/{pid}/stat", encoding="ascii", errors="replace") as fh:
|
|
29
|
+
data = fh.read()
|
|
30
|
+
after = data[data.rfind(")") + 2 :].split()
|
|
31
|
+
pgrp = int(after[2])
|
|
32
|
+
return pgrp, int(after[11]) + int(after[12])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def group_cpu_ticks(leader_pid: int) -> int:
|
|
36
|
+
"""Sum CPU ticks (utime+stime) across every process in ``leader_pid``'s group.
|
|
37
|
+
|
|
38
|
+
Returns 0 when ``/proc`` is unavailable (non-Linux) or nothing matches — the
|
|
39
|
+
caller treats 0-delta as "no CPU heartbeat", which combined with the stdout
|
|
40
|
+
heartbeat still catches a genuinely wedged leg and never false-kills a
|
|
41
|
+
streaming one.
|
|
42
|
+
"""
|
|
43
|
+
total = 0
|
|
44
|
+
try:
|
|
45
|
+
entries = os.listdir("/proc")
|
|
46
|
+
except OSError:
|
|
47
|
+
return 0
|
|
48
|
+
for entry in entries:
|
|
49
|
+
if not entry.isdigit():
|
|
50
|
+
continue
|
|
51
|
+
try:
|
|
52
|
+
pgrp, ticks = _pgrp_and_ticks(int(entry))
|
|
53
|
+
except (OSError, ValueError, IndexError):
|
|
54
|
+
continue # process exited mid-scan, or an unreadable/odd stat line
|
|
55
|
+
if pgrp == leader_pid:
|
|
56
|
+
total += ticks
|
|
57
|
+
return total
|
{phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime/panel_invoker.py
RENAMED
|
@@ -24,6 +24,7 @@ import sys
|
|
|
24
24
|
import tempfile
|
|
25
25
|
import time
|
|
26
26
|
import json
|
|
27
|
+
import threading
|
|
27
28
|
from concurrent.futures import ThreadPoolExecutor
|
|
28
29
|
from dataclasses import dataclass, field, replace
|
|
29
30
|
from hashlib import sha256
|
|
@@ -55,6 +56,7 @@ from .advisor_board.schema import (
|
|
|
55
56
|
Seat,
|
|
56
57
|
identify_host_leg,
|
|
57
58
|
)
|
|
59
|
+
from ._proc_cpu import group_cpu_ticks
|
|
58
60
|
from .advisor_board.validation import validate_seat
|
|
59
61
|
|
|
60
62
|
# Panel legs are vendor identities (one model class per vendor for the panel).
|
|
@@ -106,6 +108,20 @@ _DEFAULT_LEG_TIMEOUT_S = _LEG_TIMEOUT_BASE_S
|
|
|
106
108
|
_HASH_CHUNK_BYTES = 1 << 20
|
|
107
109
|
_PDF_SCAN_PREFIX_BYTES = 1 << 21
|
|
108
110
|
_MAX_LEG_TIMEOUT_S = _LEG_TIMEOUT_MAX_S
|
|
111
|
+
# Leg-liveness monitor: a leg is killed on HEARTBEAT EXTINCTION (no stdout/stderr byte
|
|
112
|
+
# AND no process-group CPU advance for _LEG_STALL_THRESHOLD_S), not on a blind wall-clock.
|
|
113
|
+
# 180s = 2.5x the empirically-measured worst-case healthy silence gap (codex xhigh
|
|
114
|
+
# streams its transcript to stderr with gaps up to ~73s). The wall-clock DEADLINE is a
|
|
115
|
+
# rarely-hit backstop raised to _MAX_LEG_TIMEOUT_S (decoupled from the input-scaled base)
|
|
116
|
+
# — reliable stall detection is exactly what makes that generous backstop safe.
|
|
117
|
+
_LEG_STALL_THRESHOLD_S = 180
|
|
118
|
+
_LEG_LIVENESS_READ_INTERVAL_S = 0.5 # select() slice; also the idle-sleep granularity
|
|
119
|
+
_LEG_LIVENESS_CPU_SAMPLE_S = 5.0 # /proc CPU sampling cadence (secondary reset only)
|
|
120
|
+
# Once the leg LEADER exits but a descendant still holds the stdout/stderr pipe open
|
|
121
|
+
# (an inherited-fd outliver), the leg's real work is done — reclaim the group after a
|
|
122
|
+
# short idle grace instead of burning the full wall-clock backstop. Reset by any late
|
|
123
|
+
# flush, so a still-streaming descendant is never truncated.
|
|
124
|
+
_LEG_POST_EXIT_GRACE_S = 15.0
|
|
109
125
|
_CLAUDE_CODE_MIN_VERSION = (2, 1, 197)
|
|
110
126
|
_CLAUDE_CODE_MIN_VERSION_TEXT = "2.1.197"
|
|
111
127
|
_CLAUDE_AGENT_NAME = "advisor-panel-claude"
|
|
@@ -1010,23 +1026,178 @@ def _read_review_output(path: Path) -> str:
|
|
|
1010
1026
|
return ""
|
|
1011
1027
|
|
|
1012
1028
|
|
|
1013
|
-
def _terminate_process_group(proc: subprocess.Popen[bytes]) -> None:
|
|
1014
|
-
|
|
1029
|
+
def _terminate_process_group(proc: subprocess.Popen[bytes], *, force_group: bool = False) -> None:
|
|
1030
|
+
"""Terminate the leg's process group (pgid == proc.pid, launched start_new_session).
|
|
1031
|
+
|
|
1032
|
+
Default: no-op once the leader is reaped — the group is presumed empty and its pgid
|
|
1033
|
+
could be reused, so we must NOT ``killpg`` a possibly-recycled group id.
|
|
1034
|
+
|
|
1035
|
+
``force_group=True``: the CALLER has just proven a descendant OUTLIVES the reaped
|
|
1036
|
+
leader (an inherited stdout/stderr pipe is still open), so the group is provably
|
|
1037
|
+
alive — reap it directly. Without this, a leader that exits while a child holds the
|
|
1038
|
+
pipe would never be killed and the leg would burn the full wall-clock backstop.
|
|
1039
|
+
"""
|
|
1040
|
+
leader_running = proc.poll() is None
|
|
1041
|
+
if not leader_running and not force_group:
|
|
1015
1042
|
return
|
|
1016
1043
|
try:
|
|
1017
1044
|
os.killpg(proc.pid, signal.SIGTERM)
|
|
1045
|
+
except ProcessLookupError:
|
|
1046
|
+
return # group already gone
|
|
1018
1047
|
except Exception:
|
|
1019
1048
|
try:
|
|
1020
1049
|
proc.terminate()
|
|
1021
1050
|
except Exception:
|
|
1022
1051
|
pass
|
|
1052
|
+
if leader_running:
|
|
1053
|
+
try:
|
|
1054
|
+
proc.wait(timeout=5)
|
|
1055
|
+
return
|
|
1056
|
+
except subprocess.TimeoutExpired:
|
|
1057
|
+
pass
|
|
1058
|
+
else:
|
|
1059
|
+
time.sleep(0.2) # brief grace for the outliving descendant to handle SIGTERM
|
|
1023
1060
|
try:
|
|
1024
|
-
proc.
|
|
1025
|
-
except
|
|
1061
|
+
os.killpg(proc.pid, signal.SIGKILL)
|
|
1062
|
+
except Exception:
|
|
1026
1063
|
try:
|
|
1027
|
-
os.killpg(proc.pid, signal.SIGKILL)
|
|
1028
|
-
except Exception:
|
|
1029
1064
|
proc.kill()
|
|
1065
|
+
except Exception:
|
|
1066
|
+
pass
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
@dataclass
|
|
1070
|
+
class _LegRun:
|
|
1071
|
+
"""Result of :func:`_run_leg_with_liveness` — the subset of
|
|
1072
|
+
``subprocess.CompletedProcess`` (``returncode``/``stdout``/``stderr``) the
|
|
1073
|
+
print-mode leg branches read, so they consume it with no other change."""
|
|
1074
|
+
|
|
1075
|
+
returncode: int
|
|
1076
|
+
stdout: str
|
|
1077
|
+
stderr: str
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
def _run_leg_with_liveness(
|
|
1081
|
+
cmd: "Sequence[str]",
|
|
1082
|
+
*,
|
|
1083
|
+
cwd: "Path | str",
|
|
1084
|
+
env: Mapping[str, str],
|
|
1085
|
+
deadline_s: float,
|
|
1086
|
+
stall_threshold_s: float = _LEG_STALL_THRESHOLD_S,
|
|
1087
|
+
input_text: str | None = None,
|
|
1088
|
+
) -> "_LegRun":
|
|
1089
|
+
"""Run a print-mode CLI leg, killing it on HEARTBEAT EXTINCTION, not a blind clock.
|
|
1090
|
+
|
|
1091
|
+
Drop-in for the codex/gemini/grok legs' ``subprocess.run(..., timeout=deadline_s)``:
|
|
1092
|
+
returns a :class:`_LegRun` with ``.returncode/.stdout/.stderr`` and RAISES
|
|
1093
|
+
``subprocess.TimeoutExpired`` when the wall-clock ``deadline_s`` backstop fires, so
|
|
1094
|
+
each caller's existing ``except subprocess.TimeoutExpired -> 124`` path is preserved.
|
|
1095
|
+
|
|
1096
|
+
Heartbeat = any new stdout OR stderr byte (primary; codex streams its transcript to
|
|
1097
|
+
STDERR, grok/agy to STDOUT — so BOTH are watched) OR advancing process-group CPU
|
|
1098
|
+
(secondary, NON-killing reset: it can only extend a leg's life, never false-kill).
|
|
1099
|
+
Silent AND CPU-flat for ``stall_threshold_s`` while still running -> terminate the
|
|
1100
|
+
whole process group + return ``rc or 1`` with a ``[leg-liveness]`` stall marker on
|
|
1101
|
+
stderr (fail-closed; a silent+idle print-mode leg has nothing to nudge). stdin is
|
|
1102
|
+
fed by a daemon writer thread so a large prompt can't deadlock against the child
|
|
1103
|
+
filling its own stdout/stderr pipe buffers.
|
|
1104
|
+
"""
|
|
1105
|
+
proc = subprocess.Popen(
|
|
1106
|
+
list(cmd),
|
|
1107
|
+
cwd=str(cwd),
|
|
1108
|
+
env=dict(env),
|
|
1109
|
+
stdin=subprocess.PIPE if input_text is not None else subprocess.DEVNULL,
|
|
1110
|
+
stdout=subprocess.PIPE,
|
|
1111
|
+
stderr=subprocess.PIPE,
|
|
1112
|
+
start_new_session=True, # pgid == proc.pid: group CPU sampling + group kill
|
|
1113
|
+
)
|
|
1114
|
+
if input_text is not None and proc.stdin is not None:
|
|
1115
|
+
def _feed() -> None:
|
|
1116
|
+
try:
|
|
1117
|
+
proc.stdin.write(input_text.encode("utf-8", errors="replace"))
|
|
1118
|
+
proc.stdin.close()
|
|
1119
|
+
except (BrokenPipeError, OSError, ValueError):
|
|
1120
|
+
pass # child exited before consuming stdin — nothing to do
|
|
1121
|
+
|
|
1122
|
+
threading.Thread(target=_feed, daemon=True).start()
|
|
1123
|
+
|
|
1124
|
+
out_buf = bytearray()
|
|
1125
|
+
err_buf = bytearray()
|
|
1126
|
+
fd_map = {proc.stdout.fileno(): out_buf, proc.stderr.fileno(): err_buf}
|
|
1127
|
+
open_fds = set(fd_map)
|
|
1128
|
+
start = time.monotonic()
|
|
1129
|
+
last_heartbeat = start
|
|
1130
|
+
last_cpu_sample = start
|
|
1131
|
+
last_ticks = group_cpu_ticks(proc.pid)
|
|
1132
|
+
|
|
1133
|
+
def _decode() -> tuple[str, str]:
|
|
1134
|
+
return (
|
|
1135
|
+
out_buf.decode("utf-8", errors="replace"),
|
|
1136
|
+
err_buf.decode("utf-8", errors="replace"),
|
|
1137
|
+
)
|
|
1138
|
+
|
|
1139
|
+
try:
|
|
1140
|
+
while True:
|
|
1141
|
+
# (1) wall-clock backstop — should rarely fire once stall detection works.
|
|
1142
|
+
if time.monotonic() - start >= deadline_s:
|
|
1143
|
+
_terminate_process_group(proc)
|
|
1144
|
+
raise subprocess.TimeoutExpired(list(cmd), deadline_s)
|
|
1145
|
+
# (2) drain available output; any byte is a heartbeat.
|
|
1146
|
+
if open_fds:
|
|
1147
|
+
readable, _, _ = select.select(
|
|
1148
|
+
list(open_fds), [], [], _LEG_LIVENESS_READ_INTERVAL_S
|
|
1149
|
+
)
|
|
1150
|
+
else:
|
|
1151
|
+
readable = []
|
|
1152
|
+
time.sleep(_LEG_LIVENESS_READ_INTERVAL_S) # avoid busy-spin when both EOF
|
|
1153
|
+
for fd in readable:
|
|
1154
|
+
try:
|
|
1155
|
+
chunk = os.read(fd, 65536)
|
|
1156
|
+
except OSError:
|
|
1157
|
+
chunk = b""
|
|
1158
|
+
if chunk:
|
|
1159
|
+
fd_map[fd].extend(chunk)
|
|
1160
|
+
last_heartbeat = time.monotonic()
|
|
1161
|
+
else:
|
|
1162
|
+
open_fds.discard(fd) # EOF on this pipe
|
|
1163
|
+
# (3) secondary CPU heartbeat — reset only, never a kill trigger.
|
|
1164
|
+
now = time.monotonic()
|
|
1165
|
+
if now - last_cpu_sample >= _LEG_LIVENESS_CPU_SAMPLE_S:
|
|
1166
|
+
last_cpu_sample = now
|
|
1167
|
+
ticks = group_cpu_ticks(proc.pid)
|
|
1168
|
+
if ticks > last_ticks:
|
|
1169
|
+
last_heartbeat = now
|
|
1170
|
+
last_ticks = ticks
|
|
1171
|
+
# (4) exit handling.
|
|
1172
|
+
exited = proc.poll() is not None
|
|
1173
|
+
if exited:
|
|
1174
|
+
if not open_fds:
|
|
1175
|
+
# clean exit — both pipes drained to EOF.
|
|
1176
|
+
out_s, err_s = _decode()
|
|
1177
|
+
return _LegRun(proc.returncode if proc.returncode is not None else 0, out_s, err_s)
|
|
1178
|
+
# Leader exited but a descendant still holds stdout/stderr open. The leg's
|
|
1179
|
+
# real work is done; reclaim after a short IDLE grace (reset by any late
|
|
1180
|
+
# flush or descendant CPU) instead of burning the wall-clock backstop.
|
|
1181
|
+
# ``open_fds`` non-empty proves the group is still alive, so force the
|
|
1182
|
+
# group kill even though the leader is already reaped.
|
|
1183
|
+
if time.monotonic() - last_heartbeat >= _LEG_POST_EXIT_GRACE_S:
|
|
1184
|
+
_terminate_process_group(proc, force_group=True)
|
|
1185
|
+
out_s, err_s = _decode()
|
|
1186
|
+
return _LegRun(proc.returncode if proc.returncode is not None else 0, out_s, err_s)
|
|
1187
|
+
# (5) stall: silent AND CPU-flat past the threshold while still running.
|
|
1188
|
+
elif time.monotonic() - last_heartbeat >= stall_threshold_s:
|
|
1189
|
+
_terminate_process_group(proc)
|
|
1190
|
+
out_s, err_s = _decode()
|
|
1191
|
+
marker = f"\n[leg-liveness] stalled: no output/CPU for {int(stall_threshold_s)}s"
|
|
1192
|
+
return _LegRun(proc.returncode or 1, out_s, err_s + marker)
|
|
1193
|
+
finally:
|
|
1194
|
+
_terminate_process_group(proc)
|
|
1195
|
+
for pipe in (proc.stdout, proc.stderr):
|
|
1196
|
+
try:
|
|
1197
|
+
if pipe is not None:
|
|
1198
|
+
pipe.close()
|
|
1199
|
+
except OSError:
|
|
1200
|
+
pass
|
|
1030
1201
|
|
|
1031
1202
|
|
|
1032
1203
|
def _run_claude_tui_session(
|
|
@@ -1038,16 +1209,30 @@ def _run_claude_tui_session(
|
|
|
1038
1209
|
timeout_s: int,
|
|
1039
1210
|
env: Mapping[str, str],
|
|
1040
1211
|
mode: str = "review",
|
|
1212
|
+
backstop_s: int | None = None,
|
|
1041
1213
|
) -> tuple[int, str, str]:
|
|
1042
1214
|
start_monotonic = time.monotonic()
|
|
1043
1215
|
start_wall = time.time()
|
|
1044
|
-
|
|
1216
|
+
# Leg-liveness: like the print-mode legs, the claude TUI leg is bounded by heartbeat
|
|
1217
|
+
# extinction, not the input-scaled base. The wall-clock DEADLINE honors an EXPLICIT
|
|
1218
|
+
# caller override (``backstop_s`` supplied by ``_default_spawn``, which knows whether
|
|
1219
|
+
# the per-leg timeout was an explicit override) and otherwise raises the input-scaled
|
|
1220
|
+
# default to the ``_MAX_LEG_TIMEOUT_S`` backstop so a long, actively-streaming review
|
|
1221
|
+
# isn't killed mid-flight; a genuinely wedged TUI is reclaimed by the stall timer.
|
|
1222
|
+
if backstop_s is None:
|
|
1223
|
+
backstop_s = max(1, int(timeout_s), _MAX_LEG_TIMEOUT_S)
|
|
1224
|
+
else:
|
|
1225
|
+
backstop_s = max(1, int(backstop_s))
|
|
1226
|
+
deadline = start_monotonic + backstop_s
|
|
1045
1227
|
master_fd: int | None = None
|
|
1046
1228
|
proc: subprocess.Popen[bytes] | None = None
|
|
1047
1229
|
terminal_bytes = bytearray()
|
|
1048
1230
|
prompt_sent = False
|
|
1049
1231
|
next_transcript_check = start_monotonic + _CLAUDE_TUI_TRANSCRIPT_INTERVAL_S
|
|
1050
1232
|
transcript_salvage = ""
|
|
1233
|
+
last_heartbeat = start_monotonic
|
|
1234
|
+
last_cpu_sample = start_monotonic
|
|
1235
|
+
last_ticks = 0
|
|
1051
1236
|
try:
|
|
1052
1237
|
master_fd, slave_fd = pty.openpty()
|
|
1053
1238
|
try:
|
|
@@ -1073,6 +1258,7 @@ def _run_claude_tui_session(
|
|
|
1073
1258
|
os.close(master_fd)
|
|
1074
1259
|
return 1, "", f"claude_tui_launch_error:{type(exc).__name__}"
|
|
1075
1260
|
|
|
1261
|
+
last_ticks = group_cpu_ticks(proc.pid)
|
|
1076
1262
|
try:
|
|
1077
1263
|
while time.monotonic() < deadline:
|
|
1078
1264
|
if master_fd is not None:
|
|
@@ -1084,6 +1270,7 @@ def _run_claude_tui_session(
|
|
|
1084
1270
|
chunk = b""
|
|
1085
1271
|
if chunk:
|
|
1086
1272
|
terminal_bytes.extend(chunk)
|
|
1273
|
+
last_heartbeat = time.monotonic() # PTY output = liveness
|
|
1087
1274
|
else:
|
|
1088
1275
|
# #48: PTY EOF — the child CLI and ALL its descendants closed
|
|
1089
1276
|
# the slave side, so no further output can arrive. Without this
|
|
@@ -1133,9 +1320,27 @@ def _run_claude_tui_session(
|
|
|
1133
1320
|
return 0, review_text, "claude_tui_file_output"
|
|
1134
1321
|
detail = "claude_tui_missing_canonical_output"
|
|
1135
1322
|
return proc.returncode or 1, review_text or transcript_text, detail
|
|
1323
|
+
# secondary CPU heartbeat (never a kill; only extends life) + stall reclaim.
|
|
1324
|
+
if now - last_cpu_sample >= _LEG_LIVENESS_CPU_SAMPLE_S:
|
|
1325
|
+
last_cpu_sample = now
|
|
1326
|
+
ticks = group_cpu_ticks(proc.pid)
|
|
1327
|
+
if ticks > last_ticks:
|
|
1328
|
+
last_heartbeat = now
|
|
1329
|
+
last_ticks = ticks
|
|
1330
|
+
# stall: PTY silent AND CPU-flat past the threshold while still running. The
|
|
1331
|
+
# canonical verdict is the review FILE (checked above); nothing to nudge for a
|
|
1332
|
+
# wedged TUI, so fail closed (rc forced non-zero, like the #48/deadline paths).
|
|
1333
|
+
if now - last_heartbeat >= _LEG_STALL_THRESHOLD_S:
|
|
1334
|
+
review_text = _read_review_output(output_file)
|
|
1335
|
+
if _completion_ok(review_text, mode):
|
|
1336
|
+
return 0, review_text, "claude_tui_file_output"
|
|
1337
|
+
transcript_text = transcript_salvage or _latest_claude_transcript_text(
|
|
1338
|
+
str(cwd), since=start_wall
|
|
1339
|
+
)
|
|
1340
|
+
return proc.poll() or 1, review_text or transcript_text, "claude_tui_stalled"
|
|
1136
1341
|
review_text = _read_review_output(output_file)
|
|
1137
1342
|
transcript_text = transcript_salvage or _latest_claude_transcript_text(str(cwd), since=start_wall)
|
|
1138
|
-
return 124, review_text or transcript_text, f"timeout after {
|
|
1343
|
+
return 124, review_text or transcript_text, f"timeout after {backstop_s}s"
|
|
1139
1344
|
finally:
|
|
1140
1345
|
if proc is not None:
|
|
1141
1346
|
_terminate_process_group(proc)
|
|
@@ -1226,6 +1431,7 @@ def _exec_claude_tui_leg(
|
|
|
1226
1431
|
model: str | None = None,
|
|
1227
1432
|
effort: str | None = None,
|
|
1228
1433
|
env: Mapping[str, str] | None = None,
|
|
1434
|
+
backstop_s: int | None = None,
|
|
1229
1435
|
) -> tuple[str, str]:
|
|
1230
1436
|
"""Run the Claude panel leg through the local Claude Code TUI.
|
|
1231
1437
|
|
|
@@ -1268,6 +1474,7 @@ def _exec_claude_tui_leg(
|
|
|
1268
1474
|
timeout_s=timeout_s,
|
|
1269
1475
|
env=env,
|
|
1270
1476
|
mode=mode,
|
|
1477
|
+
backstop_s=backstop_s,
|
|
1271
1478
|
)
|
|
1272
1479
|
return _classify_leg(rc, review_text, log_text, mode), review_text or log_text
|
|
1273
1480
|
|
|
@@ -1394,6 +1601,22 @@ def _leg_timeout_for(review_dir: Path) -> int:
|
|
|
1394
1601
|
return min(_LEG_TIMEOUT_MAX_S, _LEG_TIMEOUT_BASE_S + kb * _LEG_TIMEOUT_PER_KB_S)
|
|
1395
1602
|
|
|
1396
1603
|
|
|
1604
|
+
def _leg_deadline_from(timeout_s: int | None, review_dir: Path) -> tuple[int, int]:
|
|
1605
|
+
"""Return ``(retry_reference_s, hard_deadline_s)`` for a leg.
|
|
1606
|
+
|
|
1607
|
+
An **explicit** caller override (``timeouts_by_leg`` / ``timeout_seconds_by_leg``,
|
|
1608
|
+
surfaced here as a non-``None`` ``timeout_s``) is the HARD deadline, honored as-is —
|
|
1609
|
+
a frozen-contract per-leg bound a governed caller relies on (``{"gemini": 300}`` must
|
|
1610
|
+
kill at 300s, not 1800s). Only the input-scaled DEFAULT (``timeout_s is None``) is
|
|
1611
|
+
raised to the ``_MAX_LEG_TIMEOUT_S`` backstop, so a slow-but-STREAMING leg isn't
|
|
1612
|
+
killed at the 600s floor while stall detection reclaims dead legs long before 1800s.
|
|
1613
|
+
"""
|
|
1614
|
+
if timeout_s is None:
|
|
1615
|
+
ref = _leg_timeout_for(review_dir)
|
|
1616
|
+
return ref, max(int(ref), _MAX_LEG_TIMEOUT_S)
|
|
1617
|
+
return int(timeout_s), int(timeout_s)
|
|
1618
|
+
|
|
1619
|
+
|
|
1397
1620
|
def _exec_leg(
|
|
1398
1621
|
leg: str,
|
|
1399
1622
|
review_dir: Path,
|
|
@@ -1404,6 +1627,8 @@ def _exec_leg(
|
|
|
1404
1627
|
model: str | None = None,
|
|
1405
1628
|
effort: str | None = None,
|
|
1406
1629
|
env: Mapping[str, str] | None = None,
|
|
1630
|
+
*,
|
|
1631
|
+
deadline_s: int | None = None,
|
|
1407
1632
|
) -> tuple[int, str, str]:
|
|
1408
1633
|
"""Run one CLI leg against the staged review dir; return (rc, review_text, log_text).
|
|
1409
1634
|
|
|
@@ -1425,7 +1650,17 @@ def _exec_leg(
|
|
|
1425
1650
|
authed, auth_detail = _leg_auth_ok(leg, env)
|
|
1426
1651
|
if not authed:
|
|
1427
1652
|
return 1, "", auth_detail
|
|
1428
|
-
|
|
1653
|
+
# Leg-liveness: ``timeout_s`` stays the fast-vs-slow retry-fraction reference; the
|
|
1654
|
+
# real kill is stall detection inside ``_run_leg_with_liveness``. The wall-clock
|
|
1655
|
+
# DEADLINE honors an EXPLICIT caller override as-is and only raises the input-scaled
|
|
1656
|
+
# DEFAULT to the ``_MAX_LEG_TIMEOUT_S`` backstop (so a slow-but-STREAMING leg isn't
|
|
1657
|
+
# killed at the 600s floor). ``deadline_s`` may be supplied by ``_default_spawn`` —
|
|
1658
|
+
# which alone knows whether the override was explicit; when absent (direct callers /
|
|
1659
|
+
# tests) it is derived here from this call's own ``timeout_s`` None-ness.
|
|
1660
|
+
if deadline_s is None:
|
|
1661
|
+
timeout_s, deadline_s = _leg_deadline_from(timeout_s, review_dir)
|
|
1662
|
+
else:
|
|
1663
|
+
timeout_s = _leg_timeout_for(review_dir) if timeout_s is None else int(timeout_s)
|
|
1429
1664
|
artifact = _read_review_output(review_dir / "review-bundle.md") if artifact is None else artifact
|
|
1430
1665
|
prompt = _render_leg_prompt(artifact, review_dir, mode)
|
|
1431
1666
|
if leg == "codex":
|
|
@@ -1454,12 +1689,14 @@ def _exec_leg(
|
|
|
1454
1689
|
for _attempt in range(2):
|
|
1455
1690
|
_t0 = time.monotonic()
|
|
1456
1691
|
try:
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1692
|
+
# codex streams its transcript to STDERR (stdout is empty until the
|
|
1693
|
+
# final message), so the liveness heartbeat rides stderr. Prompt on
|
|
1694
|
+
# stdin ("-").
|
|
1695
|
+
proc = _run_leg_with_liveness(
|
|
1696
|
+
cmd, cwd=review_dir, env=env, deadline_s=deadline_s, input_text=prompt,
|
|
1460
1697
|
)
|
|
1461
1698
|
except subprocess.TimeoutExpired:
|
|
1462
|
-
return 124, "", f"timeout after {
|
|
1699
|
+
return 124, "", f"timeout after {deadline_s}s"
|
|
1463
1700
|
_elapsed = time.monotonic() - _t0
|
|
1464
1701
|
review_text = out_file.read_text(encoding="utf-8") if out_file.exists() else ""
|
|
1465
1702
|
rc = proc.returncode
|
|
@@ -1480,9 +1717,16 @@ def _exec_leg(
|
|
|
1480
1717
|
if effort is None
|
|
1481
1718
|
else render_seat_invocation("gemini", model or "Gemini 3.1 Pro", effort).model
|
|
1482
1719
|
)
|
|
1720
|
+
# BUGFIX: the prompt MUST be passed inline as the ``-p`` argv value, NOT via
|
|
1721
|
+
# ``-p -`` + ``input=prompt`` on stdin. Empirically ``agy -p -`` IGNORES stdin
|
|
1722
|
+
# and runs an EMPTY prompt (agy prints its "How can I help you today?" greeting,
|
|
1723
|
+
# ~26 bytes), so the gemini leg silently returned a non-review and degraded on
|
|
1724
|
+
# every run. Inline it exactly like the grok leg (`-p prompt`); the prompt is
|
|
1725
|
+
# the small staged-bundle POINTER (files live under --add-dir), so argv length
|
|
1726
|
+
# is bounded.
|
|
1483
1727
|
cmd = [
|
|
1484
1728
|
"agy", "--model", gemini_model, "--add-dir", str(review_dir),
|
|
1485
|
-
"--print-timeout", f"{timeout_s}s", "-p",
|
|
1729
|
+
"--print-timeout", f"{timeout_s}s", "-p", prompt,
|
|
1486
1730
|
]
|
|
1487
1731
|
# #114: retry ONCE on a transient agy stall, mirroring the codex leg. The
|
|
1488
1732
|
# single ``subprocess.run`` gave the gemini leg NO retry, so one transient
|
|
@@ -1496,17 +1740,14 @@ def _exec_leg(
|
|
|
1496
1740
|
for _attempt in range(2):
|
|
1497
1741
|
_t0 = time.monotonic()
|
|
1498
1742
|
try:
|
|
1499
|
-
#
|
|
1500
|
-
#
|
|
1501
|
-
#
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
proc = subprocess.run(
|
|
1505
|
-
cmd, cwd=str(review_dir), env=env, capture_output=True, text=True,
|
|
1506
|
-
timeout=timeout_s + 60, check=False, input=prompt,
|
|
1743
|
+
# agy streams its review to STDOUT; the liveness heartbeat rides stdout
|
|
1744
|
+
# (with a secondary CPU reset covering the ~20s silent "thinking" phase).
|
|
1745
|
+
# Prompt is inline on argv (see the gemini cmd BUGFIX) — no stdin.
|
|
1746
|
+
proc = _run_leg_with_liveness(
|
|
1747
|
+
cmd, cwd=review_dir, env=env, deadline_s=deadline_s,
|
|
1507
1748
|
)
|
|
1508
1749
|
except subprocess.TimeoutExpired:
|
|
1509
|
-
return 124, "", f"timeout after {
|
|
1750
|
+
return 124, "", f"timeout after {deadline_s}s"
|
|
1510
1751
|
_elapsed = time.monotonic() - _t0
|
|
1511
1752
|
review_text = proc.stdout or ""
|
|
1512
1753
|
rc = proc.returncode
|
|
@@ -1555,12 +1796,13 @@ def _exec_leg(
|
|
|
1555
1796
|
for _attempt in range(2):
|
|
1556
1797
|
_t0 = time.monotonic()
|
|
1557
1798
|
try:
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1799
|
+
# grok streams its plain review to STDOUT; heartbeat rides stdout.
|
|
1800
|
+
# Prompt is inline on argv (-p) — no stdin.
|
|
1801
|
+
proc = _run_leg_with_liveness(
|
|
1802
|
+
cmd, cwd=review_dir, env=env, deadline_s=deadline_s,
|
|
1561
1803
|
)
|
|
1562
1804
|
except subprocess.TimeoutExpired:
|
|
1563
|
-
return 124, "", f"timeout after {
|
|
1805
|
+
return 124, "", f"timeout after {deadline_s}s"
|
|
1564
1806
|
_elapsed = time.monotonic() - _t0
|
|
1565
1807
|
review_text = proc.stdout or ""
|
|
1566
1808
|
rc = proc.returncode
|
|
@@ -1624,8 +1866,11 @@ def _default_spawn(
|
|
|
1624
1866
|
_resolve_brief(mode, brief_ref), encoding="utf-8"
|
|
1625
1867
|
)
|
|
1626
1868
|
# ``timeout_s is None`` ⇒ today's input-scaled timeout (golden-neutral); an
|
|
1627
|
-
# explicit override bounds the leg.
|
|
1628
|
-
|
|
1869
|
+
# explicit override bounds the leg. This is the ONE place that knows whether the
|
|
1870
|
+
# override was explicit, so resolve BOTH the retry reference and the hard deadline
|
|
1871
|
+
# here and thread the deadline down (an explicit override is honored as-is; only
|
|
1872
|
+
# the input-scaled default is raised to the _MAX backstop).
|
|
1873
|
+
leg_timeout, leg_deadline = _leg_deadline_from(timeout_s, review_dir)
|
|
1629
1874
|
# ABDHOME: forward effort/env ONLY when set so the legacy (effort/env-absent)
|
|
1630
1875
|
# path calls the leg execs with their exact prior signatures — existing
|
|
1631
1876
|
# tests monkeypatch ``_exec_leg`` with a fixed arg list and must keep passing.
|
|
@@ -1643,10 +1888,12 @@ def _default_spawn(
|
|
|
1643
1888
|
repo_dir=resolved_repo_dir,
|
|
1644
1889
|
mode=mode,
|
|
1645
1890
|
model=model,
|
|
1891
|
+
backstop_s=leg_deadline,
|
|
1646
1892
|
**extra,
|
|
1647
1893
|
)
|
|
1648
1894
|
rc, review_text, log_text = _exec_leg(
|
|
1649
|
-
leg, review_dir, out_dir, leg_timeout, artifact, mode, model,
|
|
1895
|
+
leg, review_dir, out_dir, leg_timeout, artifact, mode, model,
|
|
1896
|
+
deadline_s=leg_deadline, **extra,
|
|
1650
1897
|
)
|
|
1651
1898
|
return _classify_leg(rc, review_text, log_text, mode), review_text
|
|
1652
1899
|
except Exception as exc: # fail-closed
|
{phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.1}/src/phase_loop_runtime.egg-info/SOURCES.txt
RENAMED
|
@@ -3,6 +3,7 @@ README.md
|
|
|
3
3
|
pyproject.toml
|
|
4
4
|
protocol/protocol.md
|
|
5
5
|
src/phase_loop_runtime/__init__.py
|
|
6
|
+
src/phase_loop_runtime/_proc_cpu.py
|
|
6
7
|
src/phase_loop_runtime/adoption_bundle.py
|
|
7
8
|
src/phase_loop_runtime/agent_runtime_provider.py
|
|
8
9
|
src/phase_loop_runtime/baml_modular.py
|
|
@@ -455,6 +456,7 @@ tests/test_launcher_liveness.py
|
|
|
455
456
|
tests/test_lease_store.py
|
|
456
457
|
tests/test_lease_store_conformance.py
|
|
457
458
|
tests/test_ledger_serialization.py
|
|
459
|
+
tests/test_leg_liveness_monitor.py
|
|
458
460
|
tests/test_model_class_policy.py
|
|
459
461
|
tests/test_model_id_source_guard.py
|
|
460
462
|
tests/test_observability_alerting.py
|
|
@@ -638,6 +640,7 @@ tests/test_pipeline_adapter_standalone_regression.py
|
|
|
638
640
|
tests/test_pkg_layout_freeze.py
|
|
639
641
|
tests/test_plan_ir_iter_waves.py
|
|
640
642
|
tests/test_preflight_verification.py
|
|
643
|
+
tests/test_proc_cpu.py
|
|
641
644
|
tests/test_prune_merged_worktrees_script.py
|
|
642
645
|
tests/test_publishing.py
|
|
643
646
|
tests/test_reconcile_manifest_dedup_46.py
|