phase-loop-runtime 0.7.3__tar.gz → 0.7.5__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.7.3 → phase_loop_runtime-0.7.5}/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/cli.py +20 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/__init__.py +110 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/adapters/__init__.py +6 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/adapters/base.py +52 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/adapters/claude.py +5 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/adapters/codex.py +5 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/adapters/outside_agent.py +9 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/__init__.py +6 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/admission.py +56 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/credsep.py +54 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/evidence.py +53 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/verbs.py +72 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/contracts.py +129 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/dispatch.py +100 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/event_log.py +140 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/fencing.py +68 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/provider_contracts.py +121 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/reconcile.py +92 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/refresh.py +67 -0
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/status.py +33 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/panel_invoker.py +166 -13
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/publishing.py +22 -108
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/train_ledger.py +108 -1
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/train_roadmap.py +54 -8
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/train_runner.py +76 -2
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/SOURCES.txt +41 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_cli_train_status_45.py +14 -1
- phase_loop_runtime-0.7.5/tests/test_convergence_adapters.py +10 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_admission.py +8 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_api.py +4 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_credsep.py +88 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_evidence.py +35 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_verbs.py +82 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_cli_integration.py +7 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_coordination_contracts.py +38 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_dispatch.py +14 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_event_contracts.py +52 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_event_log.py +43 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_fencing.py +13 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_fixture_contracts.py +40 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_invalidation.py +9 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_provider_contracts.py +32 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_reconcile.py +15 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_refresh.py +13 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_runtime_imports.py +14 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_seat_lifecycle.py +11 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_status.py +10 -0
- phase_loop_runtime-0.7.5/tests/test_convergence_train_integration.py +74 -0
- phase_loop_runtime-0.7.5/tests/test_panel_tui_liveness_188.py +191 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_publishing.py +26 -49
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_invariants.py +46 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_roadmap.py +79 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.3 → phase_loop_runtime-0.7.5}/tests/test_worktree_index.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.5"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -728,6 +728,11 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
728
728
|
metavar="FILE",
|
|
729
729
|
help="Path to the cross-repo release-train roadmap (same file as run-train).",
|
|
730
730
|
)
|
|
731
|
+
train_status_sub.add_argument(
|
|
732
|
+
"--event-log",
|
|
733
|
+
metavar="PATH",
|
|
734
|
+
help="Read a coordinator-owned convergence event log instead of a legacy train ledger.",
|
|
735
|
+
)
|
|
731
736
|
train_status_sub.add_argument(
|
|
732
737
|
"--ledger-dir",
|
|
733
738
|
default=None,
|
|
@@ -3059,6 +3064,21 @@ def _run_train_status_command(*, parser: argparse.ArgumentParser, args: argparse
|
|
|
3059
3064
|
"""
|
|
3060
3065
|
import json as _json
|
|
3061
3066
|
|
|
3067
|
+
event_log = getattr(args, "event_log", None)
|
|
3068
|
+
if event_log:
|
|
3069
|
+
if getattr(args, "train_file", None) or getattr(args, "ledger_dir", None):
|
|
3070
|
+
parser.error("train-status --event-log is mutually exclusive with --train and --ledger-dir")
|
|
3071
|
+
return 2
|
|
3072
|
+
from .convergence import build_train_status, read_convergence_events, recover_train_state, render_train_status
|
|
3073
|
+
path = Path(event_log)
|
|
3074
|
+
try:
|
|
3075
|
+
snapshot = build_train_status(recover_train_state(read_convergence_events(path)), path)
|
|
3076
|
+
except Exception as exc:
|
|
3077
|
+
print(f"train-status: failed to read event log at {path}: {exc}", file=sys.stderr)
|
|
3078
|
+
return 1
|
|
3079
|
+
print(render_train_status(snapshot, as_json=bool(getattr(args, "json", False))))
|
|
3080
|
+
return 0
|
|
3081
|
+
|
|
3062
3082
|
from .train_ledger import default_ledger_path, read_ledger
|
|
3063
3083
|
|
|
3064
3084
|
train_file = getattr(args, "train_file", None)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Frozen convergence contracts only; runtime and broker behavior are intentionally absent."""
|
|
2
|
+
|
|
3
|
+
from phase_loop_runtime.convergence.contracts import (
|
|
4
|
+
AdmissionRequest,
|
|
5
|
+
AuthoritySource,
|
|
6
|
+
BrokerRequest,
|
|
7
|
+
BrokerTerminalEvidence,
|
|
8
|
+
BrokerVerb,
|
|
9
|
+
InvalidationTrigger,
|
|
10
|
+
PublishCommittedBranchResult,
|
|
11
|
+
ReconciliationBinding,
|
|
12
|
+
ResourceIsolationDecision,
|
|
13
|
+
evaluate_resource_isolation,
|
|
14
|
+
)
|
|
15
|
+
from phase_loop_runtime.convergence.provider_contracts import (
|
|
16
|
+
PROVIDER_COMPLETION_CLASSIFICATIONS,
|
|
17
|
+
ProviderAutomationDisposition,
|
|
18
|
+
ProviderCompletionClassification,
|
|
19
|
+
ProviderCompletionContract,
|
|
20
|
+
TerminalOutcomeState,
|
|
21
|
+
validate_terminal_transition,
|
|
22
|
+
)
|
|
23
|
+
from phase_loop_runtime.train_ledger import (
|
|
24
|
+
CoordinatorEvent,
|
|
25
|
+
CoordinatorEventKind,
|
|
26
|
+
ConvergenceResultEnvelope,
|
|
27
|
+
ConvergenceResultStatus,
|
|
28
|
+
normalize_legacy_ledger_record,
|
|
29
|
+
)
|
|
30
|
+
from phase_loop_runtime.convergence.event_log import (
|
|
31
|
+
RecoveredTrainState,
|
|
32
|
+
default_convergence_event_log_path,
|
|
33
|
+
read_convergence_events,
|
|
34
|
+
record_intent,
|
|
35
|
+
record_outcome,
|
|
36
|
+
recover_train_state,
|
|
37
|
+
)
|
|
38
|
+
from phase_loop_runtime.convergence.reconcile import ActionReconciliation, ExactStateProbes, ReconciliationVerdict, SupportedConvergenceVersions, invalidate_action_evidence, reconcile_before_action, reconcile_train_state
|
|
39
|
+
from phase_loop_runtime.convergence.dispatch import DispatchDecision, RepositoryDispatchRequest, RepositoryLockKey, dispatch_ready_nodes
|
|
40
|
+
from phase_loop_runtime.convergence.fencing import ApprovalBinding, AttemptLease, FencedAdmissionFactory, compute_approval_digest, validate_attempt_lease
|
|
41
|
+
from phase_loop_runtime.convergence.refresh import DownstreamRefreshRequest, DownstreamRefreshResult, DownstreamRefreshStatus, refresh_downstream_after_merge
|
|
42
|
+
from phase_loop_runtime.convergence.status import TrainStatusSnapshot, build_train_status, render_train_status
|
|
43
|
+
from phase_loop_runtime.convergence.adapters import AdapterExecutionRequest, run_claude_adapter, run_codex_adapter, run_outside_agent_adapter
|
|
44
|
+
from phase_loop_runtime.convergence.broker import (
|
|
45
|
+
AdmissionRecord, BrokerAdmissionPolicy, BrokerClient, BrokerEnvironmentBoundary,
|
|
46
|
+
BrokerEvidenceStore, BrokerExecutionResult, BrokerProviderAdapter, BrokerService,
|
|
47
|
+
EvidenceRecord, GitHubBrokerAdapter, LinearizableAdmissionStore,
|
|
48
|
+
publish_committed_branch_idempotency_key,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
__all__ = [
|
|
52
|
+
"AdmissionRequest",
|
|
53
|
+
"AuthoritySource",
|
|
54
|
+
"BrokerRequest",
|
|
55
|
+
"BrokerTerminalEvidence",
|
|
56
|
+
"BrokerVerb",
|
|
57
|
+
"CoordinatorEvent",
|
|
58
|
+
"CoordinatorEventKind",
|
|
59
|
+
"ConvergenceResultEnvelope",
|
|
60
|
+
"ConvergenceResultStatus",
|
|
61
|
+
"InvalidationTrigger",
|
|
62
|
+
"PROVIDER_COMPLETION_CLASSIFICATIONS",
|
|
63
|
+
"ProviderAutomationDisposition",
|
|
64
|
+
"ProviderCompletionClassification",
|
|
65
|
+
"ProviderCompletionContract",
|
|
66
|
+
"PublishCommittedBranchResult",
|
|
67
|
+
"ReconciliationBinding",
|
|
68
|
+
"ResourceIsolationDecision",
|
|
69
|
+
"TerminalOutcomeState",
|
|
70
|
+
"evaluate_resource_isolation",
|
|
71
|
+
"normalize_legacy_ledger_record",
|
|
72
|
+
"validate_terminal_transition",
|
|
73
|
+
"AdapterExecutionRequest",
|
|
74
|
+
"ExactStateProbes",
|
|
75
|
+
"ActionReconciliation",
|
|
76
|
+
"ApprovalBinding",
|
|
77
|
+
"AttemptLease",
|
|
78
|
+
"DispatchDecision",
|
|
79
|
+
"DownstreamRefreshRequest",
|
|
80
|
+
"DownstreamRefreshResult",
|
|
81
|
+
"DownstreamRefreshStatus",
|
|
82
|
+
"FencedAdmissionFactory",
|
|
83
|
+
"RecoveredTrainState",
|
|
84
|
+
"ReconciliationVerdict",
|
|
85
|
+
"RepositoryDispatchRequest",
|
|
86
|
+
"RepositoryLockKey",
|
|
87
|
+
"SupportedConvergenceVersions",
|
|
88
|
+
"TrainStatusSnapshot",
|
|
89
|
+
"build_train_status",
|
|
90
|
+
"default_convergence_event_log_path",
|
|
91
|
+
"compute_approval_digest",
|
|
92
|
+
"dispatch_ready_nodes",
|
|
93
|
+
"invalidate_action_evidence",
|
|
94
|
+
"read_convergence_events",
|
|
95
|
+
"reconcile_train_state",
|
|
96
|
+
"reconcile_before_action",
|
|
97
|
+
"record_intent",
|
|
98
|
+
"record_outcome",
|
|
99
|
+
"recover_train_state",
|
|
100
|
+
"render_train_status",
|
|
101
|
+
"run_claude_adapter",
|
|
102
|
+
"run_codex_adapter",
|
|
103
|
+
"run_outside_agent_adapter",
|
|
104
|
+
"refresh_downstream_after_merge",
|
|
105
|
+
"validate_attempt_lease",
|
|
106
|
+
"AdmissionRecord", "BrokerAdmissionPolicy", "BrokerClient", "BrokerEnvironmentBoundary",
|
|
107
|
+
"BrokerEvidenceStore", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService",
|
|
108
|
+
"EvidenceRecord", "GitHubBrokerAdapter", "LinearizableAdmissionStore",
|
|
109
|
+
"publish_committed_branch_idempotency_key",
|
|
110
|
+
]
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from .base import AdapterExecutionRequest
|
|
2
|
+
from .codex import run_codex_adapter
|
|
3
|
+
from .claude import run_claude_adapter
|
|
4
|
+
from .outside_agent import run_outside_agent_adapter
|
|
5
|
+
|
|
6
|
+
__all__ = ["AdapterExecutionRequest", "run_codex_adapter", "run_claude_adapter", "run_outside_agent_adapter"]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Bounded, credential-stripped adapter execution primitives."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import subprocess
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Mapping
|
|
10
|
+
|
|
11
|
+
from phase_loop_runtime.convergence.contracts import AdmissionRequest
|
|
12
|
+
from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope, ConvergenceResultStatus
|
|
13
|
+
|
|
14
|
+
_DENIED_ENV = ("OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GOOGLE_API_KEY", "GEMINI_API_KEY")
|
|
15
|
+
_ALLOWED_ACTIONS = frozenset({"execute", "repair", "review"})
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class AdapterExecutionRequest:
|
|
19
|
+
attempt_id: str
|
|
20
|
+
admission: AdmissionRequest
|
|
21
|
+
argv: tuple[str, ...]
|
|
22
|
+
cwd: Path
|
|
23
|
+
timeout_seconds: float
|
|
24
|
+
allowed_action: str
|
|
25
|
+
evidence_references: tuple[str, ...] = ()
|
|
26
|
+
|
|
27
|
+
def __post_init__(self) -> None:
|
|
28
|
+
if not self.argv or self.timeout_seconds <= 0 or self.allowed_action not in _ALLOWED_ACTIONS:
|
|
29
|
+
raise ValueError("adapter request is outside bounded execution contract")
|
|
30
|
+
if self.admission.attempt_id != self.attempt_id:
|
|
31
|
+
raise ValueError("adapter request must preserve admission attempt id")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def run_bounded(request: AdapterExecutionRequest, *, expected_prefix: str) -> ConvergenceResultEnvelope:
|
|
35
|
+
if not request.argv[0].startswith(expected_prefix):
|
|
36
|
+
return ConvergenceResultEnvelope(ConvergenceResultStatus.BLOCKED, request.attempt_id, "adapter command outside provider bounds")
|
|
37
|
+
env = {key: value for key, value in os.environ.items() if key not in _DENIED_ENV}
|
|
38
|
+
try:
|
|
39
|
+
result = subprocess.run(request.argv, cwd=request.cwd, env=env, text=True, capture_output=True, timeout=request.timeout_seconds, start_new_session=True, check=False)
|
|
40
|
+
except subprocess.TimeoutExpired:
|
|
41
|
+
return ConvergenceResultEnvelope(ConvergenceResultStatus.DEGRADED, request.attempt_id, "adapter timed out")
|
|
42
|
+
except OSError as exc:
|
|
43
|
+
return ConvergenceResultEnvelope(ConvergenceResultStatus.FAILED, request.attempt_id, str(exc)[:256])
|
|
44
|
+
detail = (result.stdout or result.stderr or "")[:1024]
|
|
45
|
+
if result.returncode:
|
|
46
|
+
return ConvergenceResultEnvelope(ConvergenceResultStatus.FAILED, request.attempt_id, detail)
|
|
47
|
+
try:
|
|
48
|
+
payload = json.loads(result.stdout)
|
|
49
|
+
status = ConvergenceResultStatus(payload.get("status", "completed"))
|
|
50
|
+
except (ValueError, json.JSONDecodeError):
|
|
51
|
+
status = ConvergenceResultStatus.COMPLETED
|
|
52
|
+
return ConvergenceResultEnvelope(status, request.attempt_id, detail)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from .base import AdapterExecutionRequest, run_bounded
|
|
2
|
+
from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope
|
|
3
|
+
|
|
4
|
+
def run_claude_adapter(request: AdapterExecutionRequest) -> ConvergenceResultEnvelope:
|
|
5
|
+
return run_bounded(request, expected_prefix="claude")
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from .base import AdapterExecutionRequest, run_bounded
|
|
2
|
+
from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope, ConvergenceResultStatus
|
|
3
|
+
|
|
4
|
+
def run_outside_agent_adapter(request: AdapterExecutionRequest, submission: dict | None = None) -> ConvergenceResultEnvelope:
|
|
5
|
+
if submission is not None:
|
|
6
|
+
from phase_loop_runtime.conformance import validate_outside_agent_submission
|
|
7
|
+
if validate_outside_agent_submission(submission).status.value != "pass":
|
|
8
|
+
return ConvergenceResultEnvelope(ConvergenceResultStatus.BLOCKED, request.attempt_id, "outside-agent submission failed conformance")
|
|
9
|
+
return run_bounded(request, expected_prefix="outside-agent")
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Credential-capable, fail-closed broker epoch."""
|
|
2
|
+
from .admission import AdmissionRecord, BrokerAdmissionPolicy, LinearizableAdmissionStore
|
|
3
|
+
from .credsep import BrokerEnvironmentBoundary, GitHubBrokerAdapter
|
|
4
|
+
from .evidence import BrokerEvidenceStore, EvidenceRecord
|
|
5
|
+
from .verbs import BrokerClient, BrokerExecutionResult, BrokerProviderAdapter, BrokerService, publish_committed_branch_idempotency_key
|
|
6
|
+
__all__ = ["AdmissionRecord", "BrokerAdmissionPolicy", "LinearizableAdmissionStore", "BrokerEnvironmentBoundary", "GitHubBrokerAdapter", "BrokerEvidenceStore", "EvidenceRecord", "BrokerClient", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService", "publish_committed_branch_idempotency_key"]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Durable, metadata-only broker admission ordering."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
from dataclasses import asdict, dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Callable
|
|
9
|
+
|
|
10
|
+
from phase_loop_runtime.convergence.contracts import AdmissionRequest
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class AdmissionRecord:
|
|
15
|
+
sequence: int
|
|
16
|
+
epoch: int
|
|
17
|
+
request: AdmissionRequest
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
BrokerAdmissionPolicy = Callable[[AdmissionRequest], bool]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class LinearizableAdmissionStore:
|
|
24
|
+
"""Append-only admission log guarded by an OS advisory lock."""
|
|
25
|
+
def __init__(self, root: Path, policy: BrokerAdmissionPolicy | None = None, epoch_blocked: Callable[[], bool] | None = None) -> None:
|
|
26
|
+
self.root, self.policy, self.epoch_blocked = root, policy, epoch_blocked or (lambda: False)
|
|
27
|
+
self.root.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
self.path, self.lock_path = root / "admissions.jsonl", root / "admissions.lock"
|
|
29
|
+
|
|
30
|
+
def _records(self) -> list[AdmissionRecord]:
|
|
31
|
+
if not self.path.exists(): return []
|
|
32
|
+
records = []
|
|
33
|
+
for line in self.path.read_text(encoding="utf-8").splitlines():
|
|
34
|
+
raw = json.loads(line); raw["request"] = AdmissionRequest(**raw["request"]); records.append(AdmissionRecord(**raw))
|
|
35
|
+
return records
|
|
36
|
+
|
|
37
|
+
def admit(self, request: AdmissionRequest) -> AdmissionRecord:
|
|
38
|
+
import fcntl
|
|
39
|
+
with self.lock_path.open("a+", encoding="utf-8") as lock:
|
|
40
|
+
fcntl.flock(lock, fcntl.LOCK_EX)
|
|
41
|
+
try:
|
|
42
|
+
if self.epoch_blocked() or self.policy is None or not self.policy(request):
|
|
43
|
+
raise PermissionError("broker admission denied")
|
|
44
|
+
records = self._records()
|
|
45
|
+
for record in records:
|
|
46
|
+
if record.request.idempotency_key == request.idempotency_key:
|
|
47
|
+
if record.request != request: raise ValueError("conflicting idempotency key")
|
|
48
|
+
return record
|
|
49
|
+
if records and request.lease_epoch < max(r.epoch for r in records): raise PermissionError("stale epoch")
|
|
50
|
+
record = AdmissionRecord(len(records) + 1, request.lease_epoch, request)
|
|
51
|
+
with self.path.open("a", encoding="utf-8") as stream:
|
|
52
|
+
stream.write(json.dumps(asdict(record), sort_keys=True) + "\n"); stream.flush(); os.fsync(stream.fileno())
|
|
53
|
+
return record
|
|
54
|
+
finally: fcntl.flock(lock, fcntl.LOCK_UN)
|
|
55
|
+
|
|
56
|
+
def replay(self) -> tuple[AdmissionRecord, ...]: return tuple(self._records())
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Credential boundary and GitHub publish adapter."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import subprocess
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Mapping
|
|
9
|
+
|
|
10
|
+
from phase_loop_runtime.convergence.contracts import BrokerRequest, BrokerTerminalEvidence, PublishCommittedBranchResult
|
|
11
|
+
|
|
12
|
+
MUTATION_CREDENTIAL_KEYS = frozenset({"GH_TOKEN", "GITHUB_TOKEN"})
|
|
13
|
+
def strip_mutation_credentials(environment: Mapping[str, str]) -> dict[str, str]: return {k: v for k, v in environment.items() if k not in MUTATION_CREDENTIAL_KEYS}
|
|
14
|
+
class BrokerEnvironmentBoundary:
|
|
15
|
+
def environment_for(self, role: str, environment: Mapping[str, str] | None = None) -> dict[str, str]:
|
|
16
|
+
env = dict(os.environ if environment is None else environment)
|
|
17
|
+
return env if role == "broker" else strip_mutation_credentials(env)
|
|
18
|
+
def build_non_force_branch_ref(branch: str) -> str:
|
|
19
|
+
if not branch or branch.startswith("-") or branch in {"main", "master", "develop", "release"}: raise ValueError("unsafe branch")
|
|
20
|
+
return f"refs/heads/{branch}"
|
|
21
|
+
class GitHubBrokerAdapter:
|
|
22
|
+
def __init__(self, repo_path: Path, run=subprocess.run) -> None: self.repo_path, self.run = repo_path, run
|
|
23
|
+
def _output(self, *args: str) -> str:
|
|
24
|
+
return self.run(["git", "-C", str(self.repo_path), *args], capture_output=True, text=True, check=True).stdout.strip()
|
|
25
|
+
def _ambiguous(self, request: BrokerRequest, reference: str):
|
|
26
|
+
# v5 rule: a failed/empty remote read is NEVER inferred as no_effect and
|
|
27
|
+
# NEVER fabricated as success — it is a permanent ambiguous block.
|
|
28
|
+
return None, BrokerTerminalEvidence(request.admission.idempotency_key, "outcome_ambiguous_blocked", reference)
|
|
29
|
+
|
|
30
|
+
def execute(self, request: BrokerRequest):
|
|
31
|
+
if self._output("branch", "--show-current") != request.branch or self._output("rev-parse", "HEAD") != request.head_sha: raise ValueError("branch/head mismatch")
|
|
32
|
+
ref = build_non_force_branch_ref(request.branch)
|
|
33
|
+
pushed = self.run(["git", "-C", str(self.repo_path), "push", "origin", ref], capture_output=True, text=True)
|
|
34
|
+
if pushed.returncode: return self._ambiguous(request, "push-unconfirmed")
|
|
35
|
+
args = ["gh", "pr", "create", "--draft"] if request.draft else ["gh", "pr", "create", "--fill"]
|
|
36
|
+
created = self.run(args, cwd=self.repo_path, capture_output=True, text=True)
|
|
37
|
+
if created.returncode: return self._ambiguous(request, "pr-unconfirmed")
|
|
38
|
+
# Exact-published-head verification: READ the remote and confirm the branch
|
|
39
|
+
# head on origin equals the pushed sha, then resolve the REAL PR url and
|
|
40
|
+
# confirm its headRefOid matches. Only then is the effect terminally observed.
|
|
41
|
+
remote = self.run(["git", "-C", str(self.repo_path), "ls-remote", "origin", ref], capture_output=True, text=True)
|
|
42
|
+
if remote.returncode: return self._ambiguous(request, "remote-read-failed")
|
|
43
|
+
remote_sha = remote.stdout.split("\t", 1)[0].strip() if remote.stdout.strip() else ""
|
|
44
|
+
if not remote_sha: return self._ambiguous(request, "remote-branch-absent")
|
|
45
|
+
if remote_sha != request.head_sha: return self._ambiguous(request, "remote-head-mismatch")
|
|
46
|
+
listed = self.run(["gh", "pr", "list", "--head", request.branch, "--json", "url,headRefOid"], cwd=self.repo_path, capture_output=True, text=True)
|
|
47
|
+
if listed.returncode: return self._ambiguous(request, "pr-read-failed")
|
|
48
|
+
try:
|
|
49
|
+
prs = json.loads(listed.stdout or "[]")
|
|
50
|
+
except json.JSONDecodeError:
|
|
51
|
+
return self._ambiguous(request, "pr-read-unparsable")
|
|
52
|
+
match = next((p for p in prs if p.get("headRefOid") == request.head_sha and p.get("url")), None)
|
|
53
|
+
if match is None: return self._ambiguous(request, "pr-head-unconfirmed")
|
|
54
|
+
return PublishCommittedBranchResult(request.branch, request.head_sha, match["url"]), BrokerTerminalEvidence(request.admission.idempotency_key, "effect_terminal_observed", match["url"])
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Append-only terminal evidence for broker operations."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
from dataclasses import asdict, dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from phase_loop_runtime.convergence.provider_contracts import TerminalOutcomeState, validate_terminal_transition
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class EvidenceRecord:
|
|
14
|
+
idempotency_key: str
|
|
15
|
+
state: TerminalOutcomeState
|
|
16
|
+
evidence_reference: str = ""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BrokerEvidenceStore:
|
|
20
|
+
def __init__(self, root: Path) -> None:
|
|
21
|
+
self.root = root; root.mkdir(parents=True, exist_ok=True); self.path = root / "evidence.jsonl"
|
|
22
|
+
def replay(self) -> dict[str, EvidenceRecord]:
|
|
23
|
+
result: dict[str, EvidenceRecord] = {}
|
|
24
|
+
if self.path.exists():
|
|
25
|
+
for line in self.path.read_text(encoding="utf-8").splitlines():
|
|
26
|
+
raw = json.loads(line); raw["state"] = TerminalOutcomeState(raw["state"]); result[raw["idempotency_key"]] = EvidenceRecord(**raw)
|
|
27
|
+
return result
|
|
28
|
+
@property
|
|
29
|
+
def epoch_blocked(self) -> bool:
|
|
30
|
+
return any(r.state is TerminalOutcomeState.OUTCOME_AMBIGUOUS_BLOCKED for r in self.replay().values())
|
|
31
|
+
def record_intent(self, key: str) -> EvidenceRecord:
|
|
32
|
+
current = self.replay().get(key)
|
|
33
|
+
if current: return current
|
|
34
|
+
return self._append(EvidenceRecord(key, TerminalOutcomeState.PROVIDER_CALL_IN_FLIGHT))
|
|
35
|
+
def record_terminal(self, record: EvidenceRecord, *, pre_linearization_proven: bool = False) -> EvidenceRecord:
|
|
36
|
+
current = self.replay().get(record.idempotency_key)
|
|
37
|
+
if current is None: raise ValueError("intent must precede evidence")
|
|
38
|
+
if current == record: return current
|
|
39
|
+
if not validate_terminal_transition(current.state, record.state, pre_linearization_proven=pre_linearization_proven): raise ValueError("invalid terminal transition")
|
|
40
|
+
return self._append(record)
|
|
41
|
+
def rejected_before_start(self, key: str, evidence_reference: str) -> EvidenceRecord:
|
|
42
|
+
return self._append(EvidenceRecord(key, TerminalOutcomeState.REJECTED_BEFORE_START, evidence_reference))
|
|
43
|
+
def _append(self, record: EvidenceRecord) -> EvidenceRecord:
|
|
44
|
+
# Storage-layer permanence: no write may transition OUT of a terminal
|
|
45
|
+
# outcome_ambiguous_blocked record. This is self-enforcing regardless of
|
|
46
|
+
# caller path (record_terminal, rejected_before_start, record_intent), so a
|
|
47
|
+
# buggy caller cannot escape the block by writing a fresh terminal record.
|
|
48
|
+
current = self.replay().get(record.idempotency_key)
|
|
49
|
+
if current is not None and current.state is TerminalOutcomeState.OUTCOME_AMBIGUOUS_BLOCKED and record != current:
|
|
50
|
+
raise ValueError("outcome_ambiguous_blocked is permanent; no transition out")
|
|
51
|
+
with self.path.open("a", encoding="utf-8") as stream:
|
|
52
|
+
stream.write(json.dumps(asdict(record), sort_keys=True) + "\n"); stream.flush(); os.fsync(stream.fileno())
|
|
53
|
+
return record
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""The sole provider-agnostic mutation boundary."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from phase_loop_runtime.convergence.contracts import BrokerRequest, BrokerTerminalEvidence, BrokerVerb, PublishCommittedBranchResult
|
|
9
|
+
from phase_loop_runtime.convergence.provider_contracts import PROVIDER_COMPLETION_CLASSIFICATIONS, ProviderCompletionClassification, TerminalOutcomeState
|
|
10
|
+
from .evidence import BrokerEvidenceStore, EvidenceRecord
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BrokerProviderAdapter(Protocol):
|
|
14
|
+
def execute(self, request: BrokerRequest) -> tuple[PublishCommittedBranchResult | None, BrokerTerminalEvidence]: ...
|
|
15
|
+
class BrokerClient(Protocol):
|
|
16
|
+
def execute(self, request: BrokerRequest) -> "BrokerExecutionResult": ...
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class BrokerExecutionResult:
|
|
20
|
+
accepted: bool
|
|
21
|
+
evidence: BrokerTerminalEvidence
|
|
22
|
+
publish_result: PublishCommittedBranchResult | None = None
|
|
23
|
+
reason: str = ""
|
|
24
|
+
|
|
25
|
+
def publish_committed_branch_idempotency_key(repo: str, branch: str, head_sha: str) -> str:
|
|
26
|
+
return hashlib.sha256(f"{repo}\0{branch}\0{head_sha}".encode()).hexdigest()
|
|
27
|
+
|
|
28
|
+
class BrokerService:
|
|
29
|
+
def __init__(self, admission_store, evidence_store: BrokerEvidenceStore, adapter: BrokerProviderAdapter, contracts=PROVIDER_COMPLETION_CLASSIFICATIONS) -> None:
|
|
30
|
+
self.admission_store, self.evidence_store, self.adapter, self.contracts = admission_store, evidence_store, adapter, contracts
|
|
31
|
+
def _dedup_key(self, request: BrokerRequest) -> str:
|
|
32
|
+
# publish_committed_branch de-dups on the canonical (repo, branch, head_sha)
|
|
33
|
+
# triple so a repeat under a fresh admission key is a no-op that returns the
|
|
34
|
+
# SAME prior result. Other verbs remain keyed by the admission key.
|
|
35
|
+
if request.verb is BrokerVerb.PUBLISH_COMMITTED_BRANCH:
|
|
36
|
+
return publish_committed_branch_idempotency_key(request.repo, request.branch, request.head_sha)
|
|
37
|
+
return request.admission.idempotency_key
|
|
38
|
+
|
|
39
|
+
def _replay(self, request: BrokerRequest, key: str, current: EvidenceRecord) -> BrokerExecutionResult:
|
|
40
|
+
observed = current.state is TerminalOutcomeState.EFFECT_TERMINAL_OBSERVED
|
|
41
|
+
# Idempotent recovery: a replay of a COMPLETED publish_committed_branch must
|
|
42
|
+
# return the prior PublishCommittedBranchResult (pr_url persisted in the
|
|
43
|
+
# evidence reference), NOT None — otherwise the caller reports it blocked.
|
|
44
|
+
result = (
|
|
45
|
+
PublishCommittedBranchResult(request.branch, request.head_sha, current.evidence_reference)
|
|
46
|
+
if observed and request.verb is BrokerVerb.PUBLISH_COMMITTED_BRANCH
|
|
47
|
+
else None
|
|
48
|
+
)
|
|
49
|
+
return BrokerExecutionResult(observed, BrokerTerminalEvidence(key, current.state.value, current.evidence_reference), result)
|
|
50
|
+
|
|
51
|
+
def execute(self, request: BrokerRequest) -> BrokerExecutionResult:
|
|
52
|
+
key = self._dedup_key(request)
|
|
53
|
+
current = self.evidence_store.replay().get(key)
|
|
54
|
+
if current and current.state is not TerminalOutcomeState.PROVIDER_CALL_IN_FLIGHT:
|
|
55
|
+
return self._replay(request, key, current)
|
|
56
|
+
contract = next((c for c in self.contracts if c.verb == request.verb.value and c.provider == "github"), None)
|
|
57
|
+
if contract is None or contract.classification is not ProviderCompletionClassification.SUPPORTED:
|
|
58
|
+
evidence = self.evidence_store.rejected_before_start(key, "provider-classification")
|
|
59
|
+
return BrokerExecutionResult(False, BrokerTerminalEvidence(key, evidence.state.value, evidence.evidence_reference), reason="provider_not_supported")
|
|
60
|
+
if self.evidence_store.epoch_blocked: raise PermissionError("epoch permanently blocked")
|
|
61
|
+
self.admission_store.admit(request.admission); self.evidence_store.record_intent(key)
|
|
62
|
+
try:
|
|
63
|
+
result, evidence = self.adapter.execute(request)
|
|
64
|
+
state = TerminalOutcomeState(evidence.terminal_state)
|
|
65
|
+
# Persist the real pr_url as the evidence reference so a later replay can
|
|
66
|
+
# reconstruct the identical PublishCommittedBranchResult.
|
|
67
|
+
reference = result.pr_url if result is not None else evidence.evidence_reference
|
|
68
|
+
recorded = self.evidence_store.record_terminal(EvidenceRecord(key, state, reference))
|
|
69
|
+
return BrokerExecutionResult(state is TerminalOutcomeState.EFFECT_TERMINAL_OBSERVED, BrokerTerminalEvidence(key, recorded.state.value, recorded.evidence_reference), result)
|
|
70
|
+
except Exception:
|
|
71
|
+
recorded = self.evidence_store.record_terminal(EvidenceRecord(key, TerminalOutcomeState.OUTCOME_AMBIGUOUS_BLOCKED, "adapter-exception"))
|
|
72
|
+
return BrokerExecutionResult(False, BrokerTerminalEvidence(key, recorded.state.value, recorded.evidence_reference), reason="outcome_ambiguous")
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Behavior-neutral coordination contracts shared by future runtime and broker phases."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Tuple
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BrokerVerb(str, Enum):
|
|
11
|
+
PUBLISH = "publish"
|
|
12
|
+
MERGE = "merge"
|
|
13
|
+
RELEASE = "release"
|
|
14
|
+
PACKAGE = "package"
|
|
15
|
+
PUBLISH_COMMITTED_BRANCH = "publish_committed_branch"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class AdmissionRequest:
|
|
20
|
+
"""The sole fencing shape shared by RUNTIME and BROKER."""
|
|
21
|
+
|
|
22
|
+
attempt_id: str
|
|
23
|
+
lease_epoch: int
|
|
24
|
+
fence_token: str
|
|
25
|
+
approval_digest: str
|
|
26
|
+
expected_version_predicate: str
|
|
27
|
+
authority_domain_scope: str
|
|
28
|
+
idempotency_key: str
|
|
29
|
+
|
|
30
|
+
def __post_init__(self) -> None:
|
|
31
|
+
if not all((self.attempt_id, self.fence_token, self.approval_digest, self.expected_version_predicate, self.authority_domain_scope, self.idempotency_key)):
|
|
32
|
+
raise ValueError("admission requests require every fencing field")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class BrokerRequest:
|
|
37
|
+
"""A future broker request bound to one shared admission request."""
|
|
38
|
+
|
|
39
|
+
verb: BrokerVerb
|
|
40
|
+
admission: AdmissionRequest
|
|
41
|
+
repo: str
|
|
42
|
+
branch: str
|
|
43
|
+
head_sha: str
|
|
44
|
+
owned_paths: Tuple[str, ...]
|
|
45
|
+
draft: bool = True
|
|
46
|
+
pr_body: str = ""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass(frozen=True)
|
|
50
|
+
class BrokerTerminalEvidence:
|
|
51
|
+
"""Effect or no-effect evidence keyed by the admission idempotency key."""
|
|
52
|
+
|
|
53
|
+
idempotency_key: str
|
|
54
|
+
terminal_state: str
|
|
55
|
+
evidence_reference: str
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True)
|
|
59
|
+
class PublishCommittedBranchResult:
|
|
60
|
+
"""Frozen result shape for publish_committed_branch."""
|
|
61
|
+
|
|
62
|
+
branch: str
|
|
63
|
+
head_sha: str
|
|
64
|
+
pr_url: str
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class AuthoritySource(str, Enum):
|
|
68
|
+
ROADMAP = "roadmap_intent"
|
|
69
|
+
EVENT_LOG = "event_log_active_operation"
|
|
70
|
+
GIT_HEAD = "git_commit_or_pr_head_implementation"
|
|
71
|
+
MERGED_SHA = "merged_sha_merged_state"
|
|
72
|
+
REGISTRY_MANIFEST = "registry_or_manifest_released_state"
|
|
73
|
+
RECOVERY_EVIDENCE = "transcripts_or_phase_loop_recovery_evidence"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class InvalidationTrigger(str, Enum):
|
|
77
|
+
EFFECTIVE_CODE_CHANGED = "effective_code_changed"
|
|
78
|
+
ROADMAP_CHANGED = "roadmap_changed"
|
|
79
|
+
BASE_SHA_CHANGED = "base_sha_changed"
|
|
80
|
+
DEPENDENCY_SHA_CHANGED = "dependency_sha_changed"
|
|
81
|
+
VERIFICATION_PLAN_DIGEST_CHANGED = "verification_plan_digest_changed"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class ReconciliationBinding:
|
|
86
|
+
"""Versioned authority decision and the invalidations that require recomputation."""
|
|
87
|
+
|
|
88
|
+
authority: AuthoritySource
|
|
89
|
+
authority_version: str
|
|
90
|
+
invalidation_model_version: str
|
|
91
|
+
invalidation_triggers: Tuple[InvalidationTrigger, ...] = ()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass(frozen=True)
|
|
95
|
+
class ResourceIsolationDecision:
|
|
96
|
+
"""Fail-closed decision explaining whether two future units may run concurrently."""
|
|
97
|
+
|
|
98
|
+
parallel_safe: bool
|
|
99
|
+
reason: str
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def evaluate_resource_isolation(
|
|
103
|
+
*,
|
|
104
|
+
left_repo: str,
|
|
105
|
+
right_repo: str,
|
|
106
|
+
left_owned_paths: Tuple[str, ...],
|
|
107
|
+
right_owned_paths: Tuple[str, ...],
|
|
108
|
+
frozen_shared_interfaces: bool,
|
|
109
|
+
same_repo_mutation: bool = False,
|
|
110
|
+
topological_merge: bool = False,
|
|
111
|
+
release_publication: bool = False,
|
|
112
|
+
evidence_known: bool = True,
|
|
113
|
+
) -> ResourceIsolationDecision:
|
|
114
|
+
"""Apply the FREEZE fail-closed concurrency predicate without scheduling work."""
|
|
115
|
+
if not evidence_known:
|
|
116
|
+
return ResourceIsolationDecision(False, "unknown evidence")
|
|
117
|
+
if same_repo_mutation or left_repo == right_repo:
|
|
118
|
+
return ResourceIsolationDecision(False, "same-repo mutation serializes")
|
|
119
|
+
if topological_merge:
|
|
120
|
+
return ResourceIsolationDecision(False, "topological merges serialize")
|
|
121
|
+
if release_publication:
|
|
122
|
+
return ResourceIsolationDecision(False, "release publication serializes")
|
|
123
|
+
if not frozen_shared_interfaces:
|
|
124
|
+
return ResourceIsolationDecision(False, "shared interfaces are not frozen")
|
|
125
|
+
if not left_owned_paths or not right_owned_paths:
|
|
126
|
+
return ResourceIsolationDecision(False, "owned-path evidence is incomplete")
|
|
127
|
+
if set(left_owned_paths) & set(right_owned_paths):
|
|
128
|
+
return ResourceIsolationDecision(False, "owned paths overlap")
|
|
129
|
+
return ResourceIsolationDecision(True, "disjoint paths with frozen interfaces")
|