phase-loop-runtime 0.6.0__tar.gz → 0.6.2__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.2}/PKG-INFO +2 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/pyproject.toml +7 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/__init__.py +1 -1
- phase_loop_runtime-0.6.2/src/phase_loop_runtime/_proc_cpu.py +57 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/cli.py +38 -0
- phase_loop_runtime-0.6.2/src/phase_loop_runtime/doctor.py +466 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/panel_invoker.py +277 -30
- phase_loop_runtime-0.6.2/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +79 -0
- phase_loop_runtime-0.6.2/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +95 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/SOURCES.txt +9 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/requires.txt +1 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backing_homebrew.py +26 -37
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_golden.py +18 -22
- phase_loop_runtime-0.6.2/tests/test_conformance_golden.py +387 -0
- phase_loop_runtime-0.6.2/tests/test_doctor_bom.py +198 -0
- phase_loop_runtime-0.6.2/tests/test_leg_liveness_monitor.py +180 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_advisory_mode_63.py +1 -1
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_context_refs_114.py +8 -4
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker_spawn.py +49 -34
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker_timeout_argv.py +50 -18
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_leg_auth_preflight_64.py +23 -18
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_per_leg_model_66.py +13 -8
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_decouple.py +34 -0
- phase_loop_runtime-0.6.2/tests/test_proc_cpu.py +45 -0
- phase_loop_runtime-0.6.2/tests/test_release_pin_autotrack.py +123 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/setup.cfg +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/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.2}/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.2}/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.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.2}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_worktree_index.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phase-loop-runtime
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.2
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author: ViperJuice
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -20,6 +20,7 @@ Requires-Dist: pydantic<3,>=2
|
|
|
20
20
|
Requires-Dist: PyYAML<7,>=6
|
|
21
21
|
Requires-Dist: consiliency-contract<0.7,>=0.6.5
|
|
22
22
|
Requires-Dist: jsonschema<5,>=4
|
|
23
|
+
Requires-Dist: packaging>=21
|
|
23
24
|
Requires-Dist: tomli<3,>=2; python_version < "3.11"
|
|
24
25
|
|
|
25
26
|
# phase-loop-runtime
|
|
@@ -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.2"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -44,6 +44,12 @@ dependencies = [
|
|
|
44
44
|
# guarantees the contract-owned vocabulary (incl. governance_contracts) is live.
|
|
45
45
|
"consiliency-contract>=0.6.5,<0.7",
|
|
46
46
|
"jsonschema>=4,<5",
|
|
47
|
+
# `phase-loop doctor` (IF-0-AHADOPT-2) compares consumer pins to registry
|
|
48
|
+
# latest with PEP 440 version ordering. Declared so the BOM produces real
|
|
49
|
+
# stale|current verdicts on the isolated `uv tool install` path (where pip —
|
|
50
|
+
# and its transitive packaging — is not present); the doctor still degrades to
|
|
51
|
+
# `unknown` rather than crash if it is somehow absent.
|
|
52
|
+
"packaging>=21",
|
|
47
53
|
# Advisor Board config loader (ABDREG) parses advisor-boards.toml. tomllib is
|
|
48
54
|
# stdlib on 3.11+; on the 3.10 requires-python floor it is absent, so pull in
|
|
49
55
|
# the tomli backport there (import shim in advisor_board/config.py).
|
|
@@ -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
|
|
@@ -640,6 +640,31 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
640
640
|
choices=repo_validation.ALL_TARGET_TOKENS,
|
|
641
641
|
help="One of: fast, gate, full, fix, affected, doctor (check == doctor).",
|
|
642
642
|
)
|
|
643
|
+
# doctor: the front-door adoptability report (IF-0-AHADOPT-2). A NEW top-level
|
|
644
|
+
# command and strict SUPERSET of `repo-validate doctor` — it adds the two
|
|
645
|
+
# install surfaces and the multi-registry BOM, emitting the checked-in
|
|
646
|
+
# `phase-loop-doctor.v1` schema. Own --json/--fail-on-stale/--bom-fixture so
|
|
647
|
+
# they can follow the subcommand (`phase-loop doctor --json`); reuses the
|
|
648
|
+
# top-level --repo.
|
|
649
|
+
doctor_sub = subparsers.add_parser(
|
|
650
|
+
"doctor",
|
|
651
|
+
help=(
|
|
652
|
+
"Adoptability report: which tools/CLIs are installed+authed and what "
|
|
653
|
+
"each unlocks, across BOTH install surfaces, plus a pin-vs-registry "
|
|
654
|
+
"BOM (npm+PyPI) with stale|current|unknown verdicts."
|
|
655
|
+
),
|
|
656
|
+
)
|
|
657
|
+
doctor_sub.add_argument("--json", action="store_true", help="Emit the phase-loop-doctor.v1 payload as JSON.")
|
|
658
|
+
doctor_sub.add_argument(
|
|
659
|
+
"--fail-on-stale",
|
|
660
|
+
action="store_true",
|
|
661
|
+
help="Exit non-zero if any GATING (repo-owned) BOM target is stale.",
|
|
662
|
+
)
|
|
663
|
+
doctor_sub.add_argument(
|
|
664
|
+
"--bom-fixture",
|
|
665
|
+
metavar="PATH",
|
|
666
|
+
help="Load the BOM from a fixture JSON instead of live registries (CI/test wiring).",
|
|
667
|
+
)
|
|
643
668
|
# train-status: non-mutating inspection of the cross-repo train ledger (#45).
|
|
644
669
|
# Reads the SAME default ledger path as run-train; opens no PRs, writes nothing.
|
|
645
670
|
train_status_sub = subparsers.add_parser(
|
|
@@ -756,6 +781,19 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
756
781
|
cwd=args.repo or ".",
|
|
757
782
|
as_json=bool(getattr(args, "json", False)),
|
|
758
783
|
)
|
|
784
|
+
if command == "doctor":
|
|
785
|
+
# DECOUPLE SL-1: lazy import keeps the doctor module (and its reuse of
|
|
786
|
+
# repo_validation / install_status) off the bare `import cli` graph, and
|
|
787
|
+
# the doctor graph itself pulls NO dotfiles-domain module.
|
|
788
|
+
from . import doctor as _doctor
|
|
789
|
+
|
|
790
|
+
fixture = getattr(args, "bom_fixture", None)
|
|
791
|
+
return _doctor.run_doctor(
|
|
792
|
+
repo=Path(args.repo or "."),
|
|
793
|
+
as_json=bool(getattr(args, "json", False)),
|
|
794
|
+
fail_on_stale=bool(getattr(args, "fail_on_stale", False)),
|
|
795
|
+
bom_fixture=Path(fixture) if fixture else None,
|
|
796
|
+
)
|
|
759
797
|
if command == "export-schema":
|
|
760
798
|
return _export_schema_command(args=args)
|
|
761
799
|
if command == "validate-roadmap":
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
"""``phase-loop doctor`` — front-door adoptability report (IF-0-AHADOPT-2).
|
|
2
|
+
|
|
3
|
+
A NEW top-level command and a strict SUPERSET of ``repo-validate doctor``. It
|
|
4
|
+
REUSES the seed *patterns* — ``repo_validation.doctor_report()`` (tool/stack
|
|
5
|
+
probe) and ``install_status.build_install_status()`` (per-harness skill surface)
|
|
6
|
+
— and adds two things they lack:
|
|
7
|
+
|
|
8
|
+
1. **Install surfaces**, both of them: the wheel-bundled-skills path
|
|
9
|
+
(``phase-loop run`` with no dotfiles) and the interactive-harness path
|
|
10
|
+
(skills copied into ``~/.claude/skills`` &c.).
|
|
11
|
+
2. A **multi-registry BOM** (Bill of Materials): named consumer pins compared to
|
|
12
|
+
the *live* npm + PyPI registry latest, each with a ``stale|current|unknown``
|
|
13
|
+
verdict. The BOM degrades to ``unknown`` — never fails — when a registry is
|
|
14
|
+
unreachable, and ``--fail-on-stale`` exits non-zero only on a ``stale`` verdict
|
|
15
|
+
among the **gating** (repo-owned) targets.
|
|
16
|
+
|
|
17
|
+
DECOUPLE SL-1: this module pulls NO dotfiles-domain module
|
|
18
|
+
(``adoption_bundle`` / ``build_bundle`` / ``sync-skills``). It emits the checked-in
|
|
19
|
+
``phase-loop-doctor.v1`` schema and is metadata-only (no absolute paths).
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import re
|
|
25
|
+
import shutil
|
|
26
|
+
import sys
|
|
27
|
+
import urllib.request
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any, Callable, Optional
|
|
30
|
+
|
|
31
|
+
from . import repo_validation
|
|
32
|
+
from .install_status import _assert_redacted, build_install_status
|
|
33
|
+
|
|
34
|
+
SCHEMA_ID = "phase-loop-doctor.v1"
|
|
35
|
+
|
|
36
|
+
# A fetcher maps a URL to the response body (str) or None on ANY failure — the
|
|
37
|
+
# offline-degrade seam and the injection point for the offline mock-registry test.
|
|
38
|
+
Fetcher = Callable[[str], Optional[str]]
|
|
39
|
+
|
|
40
|
+
# `phase-loop doctor` is a strict SUPERSET of `repo-validate doctor`: it probes
|
|
41
|
+
# every tool `repo_validation.doctor_report()` does (unlocks labels below) and
|
|
42
|
+
# ADDS the executor CLIs, and it folds doctor_report's `stack_hints` +
|
|
43
|
+
# `declared_contracts` into the payload. `_CORE_TOOL_UNLOCKS` labels the
|
|
44
|
+
# doctor_report tool set; unknown names fall back to the bare name.
|
|
45
|
+
_CORE_TOOL_UNLOCKS: dict[str, str] = {
|
|
46
|
+
"git": "version control",
|
|
47
|
+
"just": "just task runner (repo agent:* contracts)",
|
|
48
|
+
"dagger": "dagger CI pipelines",
|
|
49
|
+
"docker": "docker compose self-host (DEPLOY)",
|
|
50
|
+
"node": "node / npx (governed-pipeline, DEPLOY)",
|
|
51
|
+
"pnpm": "pnpm package install",
|
|
52
|
+
"npm": "npm / npx package install",
|
|
53
|
+
"yarn": "yarn package install",
|
|
54
|
+
"bun": "bun runtime / package install",
|
|
55
|
+
"uv": "uv tool install (primitive install path)",
|
|
56
|
+
"python3": "python runtime",
|
|
57
|
+
"cargo": "cargo (rust builds)",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# Executor CLIs added on top of the repo-validate tool set; `authed` is meaningful.
|
|
61
|
+
_EXECUTORS: tuple[tuple[str, str], ...] = (
|
|
62
|
+
("codex", "codex executor leg"),
|
|
63
|
+
("claude", "claude executor leg"),
|
|
64
|
+
("gemini", "gemini executor leg"),
|
|
65
|
+
("opencode", "opencode executor leg"),
|
|
66
|
+
("pi", "pi executor leg"),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Best-effort auth heuristics: credential-file presence per executor CLI. Only a
|
|
70
|
+
# BOOLEAN is emitted (never a path), so the payload stays metadata-only.
|
|
71
|
+
_AUTH_HINTS: dict[str, tuple[str, ...]] = {
|
|
72
|
+
"codex": ("~/.codex/auth.json",),
|
|
73
|
+
"claude": ("~/.claude/.credentials.json", "~/.claude.json"),
|
|
74
|
+
"gemini": ("~/.gemini/oauth_creds.json", "~/.gemini/antigravity/auth.json"),
|
|
75
|
+
"opencode": ("~/.local/share/opencode/auth.json",),
|
|
76
|
+
"pi": ("~/.pi/agent/auth.json",),
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# --------------------------------------------------------------------------- #
|
|
81
|
+
# registry access (offline-degrading)
|
|
82
|
+
# --------------------------------------------------------------------------- #
|
|
83
|
+
def _default_fetch(url: str, timeout: float = 10.0) -> Optional[str]:
|
|
84
|
+
try:
|
|
85
|
+
with urllib.request.urlopen(url, timeout=timeout) as resp: # noqa: S310 (fixed hosts)
|
|
86
|
+
return resp.read().decode("utf-8")
|
|
87
|
+
except Exception:
|
|
88
|
+
# Any failure (network down, 404, timeout) => None => verdict "unknown".
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _pypi_latest(name: str, fetch: Fetcher) -> Optional[str]:
|
|
93
|
+
body = fetch(f"https://pypi.org/pypi/{name}/json")
|
|
94
|
+
if not body:
|
|
95
|
+
return None
|
|
96
|
+
try:
|
|
97
|
+
return str(json.loads(body)["info"]["version"])
|
|
98
|
+
except Exception:
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _npm_latest(name: str, fetch: Fetcher) -> Optional[str]:
|
|
103
|
+
body = fetch(f"https://registry.npmjs.org/{name.replace('/', '%2f')}")
|
|
104
|
+
if not body:
|
|
105
|
+
return None
|
|
106
|
+
try:
|
|
107
|
+
return str(json.loads(body)["dist-tags"]["latest"])
|
|
108
|
+
except Exception:
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _verdict(pinned: Optional[str], latest: Optional[str]) -> str:
|
|
113
|
+
if not pinned or not latest:
|
|
114
|
+
return "unknown"
|
|
115
|
+
try:
|
|
116
|
+
from packaging.version import Version
|
|
117
|
+
|
|
118
|
+
return "stale" if Version(latest) > Version(pinned) else "current"
|
|
119
|
+
except Exception:
|
|
120
|
+
return "unknown"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _entry(
|
|
124
|
+
target: str,
|
|
125
|
+
ecosystem: str,
|
|
126
|
+
pinned: Optional[str],
|
|
127
|
+
latest: Optional[str],
|
|
128
|
+
*,
|
|
129
|
+
gating: bool,
|
|
130
|
+
note: str,
|
|
131
|
+
) -> dict[str, Any]:
|
|
132
|
+
return {
|
|
133
|
+
"target": target,
|
|
134
|
+
"ecosystem": ecosystem,
|
|
135
|
+
"pinned": pinned,
|
|
136
|
+
"latest": latest,
|
|
137
|
+
"verdict": _verdict(pinned, latest),
|
|
138
|
+
"gating": gating,
|
|
139
|
+
"note": note,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# --------------------------------------------------------------------------- #
|
|
144
|
+
# local pin resolution (all degrade to None when the source is not reachable)
|
|
145
|
+
# --------------------------------------------------------------------------- #
|
|
146
|
+
def _find_up(start: Path, name: str) -> Optional[Path]:
|
|
147
|
+
start = start.resolve()
|
|
148
|
+
for parent in (start, *start.parents):
|
|
149
|
+
candidate = parent / name
|
|
150
|
+
if candidate.exists():
|
|
151
|
+
return candidate
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
# Version-shape guard: local pin sources feed the payload, so validate they look
|
|
156
|
+
# like a version (v?X.Y[.Z...]) and drop anything else to None — keeps arbitrary
|
|
157
|
+
# file content out of the metadata-only BOM (defense beyond the redactor prefixes).
|
|
158
|
+
_VERSION_RE = re.compile(r"v?\d+(?:\.\d+)+[0-9A-Za-z.\-]*")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _as_version(raw: Optional[str]) -> Optional[str]:
|
|
162
|
+
if not raw:
|
|
163
|
+
return None
|
|
164
|
+
raw = raw.strip()
|
|
165
|
+
if not _VERSION_RE.fullmatch(raw):
|
|
166
|
+
return None
|
|
167
|
+
return raw[1:] if raw.startswith("v") else raw
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _release_pin(repo: Path) -> Optional[str]:
|
|
171
|
+
pin_file = _find_up(repo, "RELEASE_PIN")
|
|
172
|
+
if pin_file is None:
|
|
173
|
+
return None
|
|
174
|
+
return _as_version(pin_file.read_text(encoding="utf-8"))
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _contract_floor(repo: Path) -> Optional[str]:
|
|
178
|
+
"""The `consiliency-contract>=X` floor from phase-loop-runtime/pyproject.toml."""
|
|
179
|
+
for rel in ("pyproject.toml", "phase-loop-runtime/pyproject.toml"):
|
|
180
|
+
pyproj = _find_up(repo, rel) if "/" not in rel else (repo / rel)
|
|
181
|
+
if pyproj is None or not pyproj.is_file():
|
|
182
|
+
continue
|
|
183
|
+
try:
|
|
184
|
+
try:
|
|
185
|
+
import tomllib
|
|
186
|
+
except ModuleNotFoundError: # py<3.11
|
|
187
|
+
import tomli as tomllib # type: ignore[no-redef]
|
|
188
|
+
deps = tomllib.loads(pyproj.read_text(encoding="utf-8"))["project"]["dependencies"]
|
|
189
|
+
except Exception:
|
|
190
|
+
continue
|
|
191
|
+
for dep in deps:
|
|
192
|
+
if dep.replace(" ", "").startswith("consiliency-contract>="):
|
|
193
|
+
floor = dep.split(">=", 1)[1]
|
|
194
|
+
return floor.split(",", 1)[0].strip()
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _vendored_contract_version(repo: Path) -> Optional[str]:
|
|
199
|
+
"""The vendored `@consiliency/contract` version from .consiliency/manifest.json."""
|
|
200
|
+
manifest = _find_up(repo, ".consiliency/manifest.json")
|
|
201
|
+
if manifest is None:
|
|
202
|
+
return None
|
|
203
|
+
try:
|
|
204
|
+
data = json.loads(manifest.read_text(encoding="utf-8"))
|
|
205
|
+
except Exception:
|
|
206
|
+
return None
|
|
207
|
+
version = data.get("contract_version") or data.get("adoption", {}).get("contract_version")
|
|
208
|
+
return _as_version(str(version)) if version else None
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
# --------------------------------------------------------------------------- #
|
|
212
|
+
# BOM
|
|
213
|
+
# --------------------------------------------------------------------------- #
|
|
214
|
+
def build_bom(repo: Path, *, fetch: Optional[Fetcher] = None) -> list[dict[str, Any]]:
|
|
215
|
+
"""The named multi-registry BOM inventory v1.
|
|
216
|
+
|
|
217
|
+
GATING (repo-owned, `--fail-on-stale` acts on these): the PyPI
|
|
218
|
+
``consiliency-contract`` floor and the install-script auto-track pin. The
|
|
219
|
+
vendored npm mirrors and the mac-skills ref are REPORTED but not gated — their
|
|
220
|
+
currency is owned by other repos'/vendoring processes, so failing this repo's
|
|
221
|
+
doctor on their drift would be noise (it is surfaced, not enforced here).
|
|
222
|
+
"""
|
|
223
|
+
fetch = fetch or _default_fetch
|
|
224
|
+
return [
|
|
225
|
+
_entry(
|
|
226
|
+
"consiliency-contract",
|
|
227
|
+
"pypi",
|
|
228
|
+
_contract_floor(repo),
|
|
229
|
+
_pypi_latest("consiliency-contract", fetch),
|
|
230
|
+
gating=True,
|
|
231
|
+
note="phase-loop-runtime dependency floor",
|
|
232
|
+
),
|
|
233
|
+
_entry(
|
|
234
|
+
"install-agent-harness.sh ref",
|
|
235
|
+
"pypi(phase-loop-runtime)",
|
|
236
|
+
_release_pin(repo),
|
|
237
|
+
_pypi_latest("phase-loop-runtime", fetch),
|
|
238
|
+
gating=True,
|
|
239
|
+
note="auto-track install pin (RELEASE_PIN vs published runtime)",
|
|
240
|
+
),
|
|
241
|
+
_entry(
|
|
242
|
+
"@consiliency/contract",
|
|
243
|
+
"npm",
|
|
244
|
+
_vendored_contract_version(repo),
|
|
245
|
+
_npm_latest("@consiliency/contract", fetch),
|
|
246
|
+
gating=False,
|
|
247
|
+
note="vendored contract (owned by consiliency-ingest; reported, not gated)",
|
|
248
|
+
),
|
|
249
|
+
_entry(
|
|
250
|
+
"@consiliency/canon-core",
|
|
251
|
+
"npm",
|
|
252
|
+
None,
|
|
253
|
+
_npm_latest("@consiliency/canon-core", fetch),
|
|
254
|
+
gating=False,
|
|
255
|
+
note="no local pin in the primitive; reported for visibility",
|
|
256
|
+
),
|
|
257
|
+
_entry(
|
|
258
|
+
"mac-skills ref",
|
|
259
|
+
"dotfiles",
|
|
260
|
+
None,
|
|
261
|
+
None,
|
|
262
|
+
gating=False,
|
|
263
|
+
note="owned by dotfiles; not resolvable from the decoupled primitive",
|
|
264
|
+
),
|
|
265
|
+
]
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def stale_gating_targets(bom: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
269
|
+
return [e for e in bom if e.get("gating") and e.get("verdict") == "stale"]
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
# --------------------------------------------------------------------------- #
|
|
273
|
+
# tools + install surfaces
|
|
274
|
+
# --------------------------------------------------------------------------- #
|
|
275
|
+
def _cli_authed(name: str, present: bool) -> Optional[bool]:
|
|
276
|
+
if not present:
|
|
277
|
+
return None
|
|
278
|
+
for hint in _AUTH_HINTS.get(name, ()): # boolean only — never the path
|
|
279
|
+
if Path(hint).expanduser().exists():
|
|
280
|
+
return True
|
|
281
|
+
return False
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def _tools_report(core_tools: dict[str, Optional[str]]) -> list[dict[str, Any]]:
|
|
285
|
+
"""Union of the repo-validate tool probe (converted to booleans — the raw
|
|
286
|
+
values are absolute `shutil.which` paths, forbidden by the metadata-only
|
|
287
|
+
redactor) and the executor CLIs."""
|
|
288
|
+
out: list[dict[str, Any]] = []
|
|
289
|
+
for name, path in core_tools.items():
|
|
290
|
+
out.append(
|
|
291
|
+
{
|
|
292
|
+
"name": name,
|
|
293
|
+
"present": path is not None,
|
|
294
|
+
"authed": None,
|
|
295
|
+
"unlocks": _CORE_TOOL_UNLOCKS.get(name, name),
|
|
296
|
+
}
|
|
297
|
+
)
|
|
298
|
+
for name, unlocks in _EXECUTORS:
|
|
299
|
+
present = shutil.which(name) is not None
|
|
300
|
+
out.append(
|
|
301
|
+
{
|
|
302
|
+
"name": name,
|
|
303
|
+
"present": present,
|
|
304
|
+
"authed": _cli_authed(name, present),
|
|
305
|
+
"unlocks": unlocks,
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
return out
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def _wheel_bundled_surface() -> dict[str, Any]:
|
|
312
|
+
try:
|
|
313
|
+
from importlib.resources import files
|
|
314
|
+
|
|
315
|
+
bundle = files("phase_loop_runtime") / "skills_bundle"
|
|
316
|
+
status = "present" if bundle.is_dir() else "missing"
|
|
317
|
+
except Exception:
|
|
318
|
+
status = "unknown"
|
|
319
|
+
return {
|
|
320
|
+
"surface": "wheel-bundled-skills",
|
|
321
|
+
"status": status,
|
|
322
|
+
"unlocks": "phase-loop run / dry-run with no dotfiles",
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _interactive_surfaces(repo: Path) -> list[dict[str, Any]]:
|
|
327
|
+
surfaces: list[dict[str, Any]] = []
|
|
328
|
+
try:
|
|
329
|
+
status = build_install_status(repo)
|
|
330
|
+
except Exception:
|
|
331
|
+
return surfaces
|
|
332
|
+
for record in status.get("harnesses", ()):
|
|
333
|
+
root = record.get("root_status")
|
|
334
|
+
parity = record.get("skill_parity")
|
|
335
|
+
if root == "missing":
|
|
336
|
+
verdict = "missing"
|
|
337
|
+
elif parity == "complete":
|
|
338
|
+
verdict = "present"
|
|
339
|
+
else:
|
|
340
|
+
verdict = "partial"
|
|
341
|
+
surfaces.append(
|
|
342
|
+
{
|
|
343
|
+
"surface": "interactive-harness-skills",
|
|
344
|
+
"harness": record.get("harness"),
|
|
345
|
+
"status": verdict,
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
return surfaces
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# --------------------------------------------------------------------------- #
|
|
352
|
+
# assembly
|
|
353
|
+
# --------------------------------------------------------------------------- #
|
|
354
|
+
def _summary(tools: list[dict[str, Any]], bom: list[dict[str, Any]]) -> str:
|
|
355
|
+
present = sum(1 for t in tools if t["present"])
|
|
356
|
+
current = sum(1 for e in bom if e["verdict"] == "current")
|
|
357
|
+
stale = sum(1 for e in bom if e["verdict"] == "stale")
|
|
358
|
+
unknown = sum(1 for e in bom if e["verdict"] == "unknown")
|
|
359
|
+
gating_stale = len(stale_gating_targets(bom))
|
|
360
|
+
return (
|
|
361
|
+
f"{present}/{len(tools)} tools present; "
|
|
362
|
+
f"BOM {current} current / {stale} stale / {unknown} unknown "
|
|
363
|
+
f"({gating_stale} gating-stale)"
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def build_doctor_report(
|
|
368
|
+
repo: Path,
|
|
369
|
+
*,
|
|
370
|
+
fetch: Optional[Fetcher] = None,
|
|
371
|
+
bom_fixture: Optional[Path] = None,
|
|
372
|
+
) -> dict[str, Any]:
|
|
373
|
+
# Strict superset of `repo-validate doctor`: resolve the same root and reuse
|
|
374
|
+
# its probe. `repo_validation` pulls no dotfiles-domain module (asserted by the
|
|
375
|
+
# decouple test), so this stays on the decoupled import graph.
|
|
376
|
+
root = repo_validation.find_repo_root(repo) or repo
|
|
377
|
+
rv = repo_validation.doctor_report(root)
|
|
378
|
+
tools = _tools_report(rv["tools"]) # type: ignore[arg-type]
|
|
379
|
+
surfaces = [_wheel_bundled_surface(), *_interactive_surfaces(repo)]
|
|
380
|
+
if bom_fixture is not None:
|
|
381
|
+
bom = _load_bom_fixture(bom_fixture)
|
|
382
|
+
else:
|
|
383
|
+
bom = build_bom(root, fetch=fetch)
|
|
384
|
+
report = {
|
|
385
|
+
"schema": SCHEMA_ID,
|
|
386
|
+
"summary": _summary(tools, bom),
|
|
387
|
+
"tools": tools,
|
|
388
|
+
# From repo_validation.doctor_report (superset). Metadata-only: filenames
|
|
389
|
+
# and target/runner strings. `repo_root` is intentionally OMITTED — it is
|
|
390
|
+
# an absolute path, which the metadata-only redactor forbids.
|
|
391
|
+
"stack_hints": list(rv["stack_hints"]), # type: ignore[arg-type]
|
|
392
|
+
"declared_contracts": list(rv["declared_contracts"]), # type: ignore[arg-type]
|
|
393
|
+
"install_surfaces": surfaces,
|
|
394
|
+
"bom": bom,
|
|
395
|
+
}
|
|
396
|
+
# Metadata-only guarantee: no absolute paths, no secrets. Reuses the same
|
|
397
|
+
# redaction contract as phase-loop-install-status.v1.
|
|
398
|
+
_assert_redacted(report)
|
|
399
|
+
return report
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def _load_bom_fixture(path: Path) -> list[dict[str, Any]]:
|
|
403
|
+
data = json.loads(Path(path).read_text(encoding="utf-8"))
|
|
404
|
+
if isinstance(data, dict) and "bom" in data:
|
|
405
|
+
data = data["bom"]
|
|
406
|
+
if not isinstance(data, list):
|
|
407
|
+
raise ValueError(f"BOM fixture {path} must be a list or {{'bom': [...]}}")
|
|
408
|
+
return data
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def _print_doctor(report: dict[str, Any]) -> None:
|
|
412
|
+
print("phase-loop doctor")
|
|
413
|
+
print(f" {report['summary']}")
|
|
414
|
+
print("")
|
|
415
|
+
print("Tools:")
|
|
416
|
+
for tool in report["tools"]:
|
|
417
|
+
authed = tool["authed"]
|
|
418
|
+
auth_str = "" if authed is None else (" authed" if authed else " NOT authed")
|
|
419
|
+
state = "present" if tool["present"] else "missing"
|
|
420
|
+
print(f" {tool['name']:<10} {state}{auth_str} → {tool['unlocks']}")
|
|
421
|
+
print("")
|
|
422
|
+
print("Repo stack hints:")
|
|
423
|
+
for hint in report.get("stack_hints", []):
|
|
424
|
+
print(f" {hint}")
|
|
425
|
+
print("Declared agent contracts:")
|
|
426
|
+
contracts = report.get("declared_contracts", [])
|
|
427
|
+
if contracts:
|
|
428
|
+
for entry in contracts:
|
|
429
|
+
print(f" {entry['target']:<12} {entry['runner']}")
|
|
430
|
+
else:
|
|
431
|
+
print(" none")
|
|
432
|
+
print("")
|
|
433
|
+
print("Install surfaces:")
|
|
434
|
+
for surface in report["install_surfaces"]:
|
|
435
|
+
harness = f" [{surface['harness']}]" if surface.get("harness") else ""
|
|
436
|
+
print(f" {surface['surface']}{harness}: {surface['status']}")
|
|
437
|
+
print("")
|
|
438
|
+
print("BOM (pin vs registry latest):")
|
|
439
|
+
for entry in report["bom"]:
|
|
440
|
+
gate = "gating" if entry["gating"] else "report"
|
|
441
|
+
print(
|
|
442
|
+
f" [{entry['verdict']:<7}] {entry['target']:<32} "
|
|
443
|
+
f"pinned={entry['pinned']} latest={entry['latest']} ({entry['ecosystem']}, {gate})"
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def run_doctor(
|
|
448
|
+
*,
|
|
449
|
+
repo: Path,
|
|
450
|
+
as_json: bool,
|
|
451
|
+
fail_on_stale: bool,
|
|
452
|
+
bom_fixture: Optional[Path],
|
|
453
|
+
) -> int:
|
|
454
|
+
report = build_doctor_report(repo, bom_fixture=bom_fixture)
|
|
455
|
+
if as_json:
|
|
456
|
+
print(json.dumps(report, indent=2))
|
|
457
|
+
else:
|
|
458
|
+
_print_doctor(report)
|
|
459
|
+
if fail_on_stale:
|
|
460
|
+
stale = stale_gating_targets(report["bom"])
|
|
461
|
+
if stale:
|
|
462
|
+
names = ", ".join(e["target"] for e in stale)
|
|
463
|
+
# To stderr so `--json` stdout stays pure, machine-parseable JSON.
|
|
464
|
+
print(f"FAIL: stale gating BOM target(s): {names}", file=sys.stderr, flush=True)
|
|
465
|
+
return 1
|
|
466
|
+
return 0
|