phase-loop-runtime 0.7.5__tar.gz → 0.7.6__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.5 → phase_loop_runtime-0.7.6}/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/broker/__init__.py +2 -1
- phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/credsep.py +120 -0
- phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/live.py +82 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/broker/verbs.py +6 -2
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/provider_contracts.py +33 -3
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_runner.py +6 -3
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/SOURCES.txt +2 -0
- phase_loop_runtime-0.7.6/tests/test_convergence_broker_credsep.py +184 -0
- phase_loop_runtime-0.7.6/tests/test_convergence_live_enable.py +168 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_provider_contracts.py +13 -3
- phase_loop_runtime-0.7.5/src/phase_loop_runtime/convergence/broker/credsep.py +0 -54
- phase_loop_runtime-0.7.5/tests/test_convergence_broker_credsep.py +0 -88
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/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.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/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.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/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.6"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
from .admission import AdmissionRecord, BrokerAdmissionPolicy, LinearizableAdmissionStore
|
|
3
3
|
from .credsep import BrokerEnvironmentBoundary, GitHubBrokerAdapter
|
|
4
4
|
from .evidence import BrokerEvidenceStore, EvidenceRecord
|
|
5
|
+
from .live import build_github_broker_client
|
|
5
6
|
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"]
|
|
7
|
+
__all__ = ["AdmissionRecord", "BrokerAdmissionPolicy", "LinearizableAdmissionStore", "BrokerEnvironmentBoundary", "GitHubBrokerAdapter", "BrokerEvidenceStore", "EvidenceRecord", "BrokerClient", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService", "build_github_broker_client", "publish_committed_branch_idempotency_key"]
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Credential boundary and GitHub publish adapter."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
import subprocess
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Mapping
|
|
10
|
+
|
|
11
|
+
from phase_loop_runtime.convergence.contracts import BrokerRequest, BrokerTerminalEvidence, PublishCommittedBranchResult
|
|
12
|
+
|
|
13
|
+
MUTATION_CREDENTIAL_KEYS = frozenset({"GH_TOKEN", "GITHUB_TOKEN"})
|
|
14
|
+
# Repo-redirect env var: gh resolves its target repo from GH_REPO over cwd's origin,
|
|
15
|
+
# so a stray GH_REPO could send a `gh pr create` to a DIFFERENT repo while the
|
|
16
|
+
# push+ls-remote (bound to origin) still match — an undetected wrong-repo PR. The
|
|
17
|
+
# host is instead pinned by the host-qualified `--repo host/owner/repo` (which beats
|
|
18
|
+
# GH_HOST/gh-config), so GH_HOST is left intact to preserve GHE config routing.
|
|
19
|
+
REPO_REDIRECT_KEYS = frozenset({"GH_REPO"})
|
|
20
|
+
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}
|
|
21
|
+
class BrokerEnvironmentBoundary:
|
|
22
|
+
def environment_for(self, role: str, environment: Mapping[str, str] | None = None) -> dict[str, str]:
|
|
23
|
+
env = dict(os.environ if environment is None else environment)
|
|
24
|
+
# The broker keeps its mutation credential (to push) but NEVER the repo-redirect
|
|
25
|
+
# vars; every other role is stripped of credentials.
|
|
26
|
+
return {k: v for k, v in env.items() if k not in REPO_REDIRECT_KEYS} if role == "broker" else strip_mutation_credentials(env)
|
|
27
|
+
def build_non_force_branch_ref(branch: str) -> str:
|
|
28
|
+
if not branch or branch.startswith("-") or branch in {"main", "master", "develop", "release"}: raise ValueError("unsafe branch")
|
|
29
|
+
return f"refs/heads/{branch}"
|
|
30
|
+
# Origin-host invariant (fail-closed): the broker only publishes to an allow-listed
|
|
31
|
+
# host, so a `gh --repo host/owner/repo` derived from the origin url can NEVER be
|
|
32
|
+
# mis-bound to a look-alike host by any URL-text edge (custom port, IPv6, ssh alias,
|
|
33
|
+
# twin instance). Default is github.com-only; a self-hosted/GHE fleet passes its own
|
|
34
|
+
# allow-list explicitly. This retires the whole host-parse edge class at the boundary.
|
|
35
|
+
ALLOWED_ORIGIN_HOSTS = frozenset({"github.com"})
|
|
36
|
+
class GitHubBrokerAdapter:
|
|
37
|
+
def __init__(self, repo_path: Path, run=subprocess.run, allowed_hosts: frozenset[str] = ALLOWED_ORIGIN_HOSTS) -> None:
|
|
38
|
+
self.repo_path, self.run, self.allowed_hosts = repo_path, run, allowed_hosts
|
|
39
|
+
def _output(self, *args: str) -> str:
|
|
40
|
+
return self.run(["git", "-C", str(self.repo_path), *args], capture_output=True, text=True, check=True).stdout.strip()
|
|
41
|
+
def _origin_url(self) -> str:
|
|
42
|
+
# The single canonical origin URL the broker validates AND operates through
|
|
43
|
+
# explicitly (push + ls-remote), so the mutation can never be redirected by the
|
|
44
|
+
# `origin` alias (remote.origin.pushurl / url.*.pushInsteadOf) to an unvalidated
|
|
45
|
+
# target. This is git's FETCH url; the broker deliberately publishes to the
|
|
46
|
+
# canonical repo it validated, not a local triangular pushurl.
|
|
47
|
+
return self._output("remote", "get-url", "origin")
|
|
48
|
+
def _origin_repo(self) -> str:
|
|
49
|
+
return self._slug_for(self._origin_url())
|
|
50
|
+
def _slug_for(self, url: str) -> str:
|
|
51
|
+
# Resolve a git URL to a HOST-QUALIFIED `host/owner/repo` slug so `gh` is bound
|
|
52
|
+
# with `--repo host/owner/repo` (highest precedence — beats a stray
|
|
53
|
+
# GH_REPO/GH_HOST/cwd/gh-config), pinning the PR to the SAME host AND repo the
|
|
54
|
+
# push targets. Fail-closed if the URL cannot be resolved or is not allow-listed.
|
|
55
|
+
if "://" in url: # scheme://[user@]host[:port]/owner/repo(.git)
|
|
56
|
+
scheme = url.split("://", 1)[0].lower()
|
|
57
|
+
rest = url.split("://", 1)[1].split("@", 1)[-1]
|
|
58
|
+
authority, _, path = rest.partition("/")
|
|
59
|
+
# Fail-closed on authorities --repo cannot faithfully pin: an IPv6 literal
|
|
60
|
+
# (mis-split below) or a non-default http(s) API port (silently dropped →
|
|
61
|
+
# gh would hit the default-port host, a twin-host risk). ssh transport
|
|
62
|
+
# ports are irrelevant to the gh API host, so they are allowed.
|
|
63
|
+
if authority.startswith("[") or authority.count(":") > 1:
|
|
64
|
+
raise ValueError(f"unsupported IPv6/authority in origin {url!r}")
|
|
65
|
+
host, _, port = authority.partition(":")
|
|
66
|
+
default_port = {"https": "443", "http": "80"}.get(scheme)
|
|
67
|
+
if scheme in ("http", "https") and port and port != default_port:
|
|
68
|
+
raise ValueError(f"non-default {scheme} port in origin {url!r} cannot be pinned by --repo")
|
|
69
|
+
else: # scp-like: [user@]host:owner/repo(.git)
|
|
70
|
+
hostpart, sep, path = url.partition(":")
|
|
71
|
+
host = hostpart.split("@", 1)[-1]
|
|
72
|
+
if not sep:
|
|
73
|
+
raise ValueError(f"cannot resolve origin host/owner/repo from {url!r}")
|
|
74
|
+
if path.endswith(".git"):
|
|
75
|
+
path = path[:-4]
|
|
76
|
+
path = path.strip("/")
|
|
77
|
+
parts = path.split("/")
|
|
78
|
+
if not host or len(parts) != 2 or not all(parts):
|
|
79
|
+
raise ValueError(f"cannot resolve origin host/owner/repo from {url!r}")
|
|
80
|
+
if host not in self.allowed_hosts:
|
|
81
|
+
# Origin-host invariant: refuse to publish to a host outside the allow-list.
|
|
82
|
+
# This is the class-closing gate — no URL-text edge (port/IPv6/alias/twin)
|
|
83
|
+
# can mis-bind a gh call to a look-alike host, because a non-allow-listed
|
|
84
|
+
# host fails closed here (-> outcome_ambiguous_blocked), never a live PR.
|
|
85
|
+
raise ValueError(f"origin host {host!r} not in allowed broker hosts {sorted(self.allowed_hosts)}")
|
|
86
|
+
return f"{host}/{path}"
|
|
87
|
+
def _ambiguous(self, request: BrokerRequest, reference: str):
|
|
88
|
+
# v5 rule: a failed/empty remote read is NEVER inferred as no_effect and
|
|
89
|
+
# NEVER fabricated as success — it is a permanent ambiguous block.
|
|
90
|
+
return None, BrokerTerminalEvidence(request.admission.idempotency_key, "outcome_ambiguous_blocked", reference)
|
|
91
|
+
|
|
92
|
+
def execute(self, request: BrokerRequest):
|
|
93
|
+
if self._output("branch", "--show-current") != request.branch or self._output("rev-parse", "HEAD") != request.head_sha: raise ValueError("branch/head mismatch")
|
|
94
|
+
origin_url = self._origin_url() # ONE canonical url, used explicitly everywhere
|
|
95
|
+
origin_repo = self._slug_for(origin_url) # validate allow-list + derive the gh slug from the SAME url
|
|
96
|
+
ref = build_non_force_branch_ref(request.branch)
|
|
97
|
+
# Push + ls-remote target the EXPLICIT validated url, never the `origin` alias,
|
|
98
|
+
# so remote.origin.pushurl / url.*.pushInsteadOf cannot redirect the mutation.
|
|
99
|
+
pushed = self.run(["git", "-C", str(self.repo_path), "push", origin_url, ref], capture_output=True, text=True)
|
|
100
|
+
if pushed.returncode: return self._ambiguous(request, "push-unconfirmed")
|
|
101
|
+
args = ["gh", "pr", "create", "--repo", origin_repo, "--draft"] if request.draft else ["gh", "pr", "create", "--repo", origin_repo, "--fill"]
|
|
102
|
+
created = self.run(args, cwd=self.repo_path, capture_output=True, text=True)
|
|
103
|
+
if created.returncode: return self._ambiguous(request, "pr-unconfirmed")
|
|
104
|
+
# Exact-published-head verification: READ the remote and confirm the branch
|
|
105
|
+
# head on origin equals the pushed sha, then resolve the REAL PR url and
|
|
106
|
+
# confirm its headRefOid matches. Only then is the effect terminally observed.
|
|
107
|
+
remote = self.run(["git", "-C", str(self.repo_path), "ls-remote", origin_url, ref], capture_output=True, text=True)
|
|
108
|
+
if remote.returncode: return self._ambiguous(request, "remote-read-failed")
|
|
109
|
+
remote_sha = remote.stdout.split("\t", 1)[0].strip() if remote.stdout.strip() else ""
|
|
110
|
+
if not remote_sha: return self._ambiguous(request, "remote-branch-absent")
|
|
111
|
+
if remote_sha != request.head_sha: return self._ambiguous(request, "remote-head-mismatch")
|
|
112
|
+
listed = self.run(["gh", "pr", "list", "--repo", origin_repo, "--head", request.branch, "--json", "url,headRefOid"], cwd=self.repo_path, capture_output=True, text=True)
|
|
113
|
+
if listed.returncode: return self._ambiguous(request, "pr-read-failed")
|
|
114
|
+
try:
|
|
115
|
+
prs = json.loads(listed.stdout or "[]")
|
|
116
|
+
except json.JSONDecodeError:
|
|
117
|
+
return self._ambiguous(request, "pr-read-unparsable")
|
|
118
|
+
match = next((p for p in prs if p.get("headRefOid") == request.head_sha and p.get("url")), None)
|
|
119
|
+
if match is None: return self._ambiguous(request, "pr-head-unconfirmed")
|
|
120
|
+
return PublishCommittedBranchResult(request.branch, request.head_sha, match["url"]), BrokerTerminalEvidence(request.admission.idempotency_key, "effect_terminal_observed", match["url"])
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Opt-in construction of a live, credential-capable GitHub broker client.
|
|
2
|
+
|
|
3
|
+
This is the *only* helper that assembles a broker able to perform a real GitHub
|
|
4
|
+
mutation. It is never auto-instantiated: legacy ``run_train`` callers that pass
|
|
5
|
+
no ``coordinator_runtime`` (or a runtime with ``broker_client=None``) publish
|
|
6
|
+
exactly as before. A caller wanting broker-mediated publication builds a client
|
|
7
|
+
here and attaches it to :class:`CoordinatorRuntime.broker_client`.
|
|
8
|
+
|
|
9
|
+
The wired client enforces every already-merged safety property: linearizable
|
|
10
|
+
admission, permanent fail-closed ``outcome_ambiguous_blocked`` evidence, canonical
|
|
11
|
+
``(repo, branch, head_sha)`` idempotency, and the adapter's exact-published-head
|
|
12
|
+
verification. Only the ``publish_committed_branch``/``github`` verb is SUPPORTED
|
|
13
|
+
(see ``provider_contracts``); the service refuses every other verb.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import subprocess
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Callable
|
|
20
|
+
|
|
21
|
+
from phase_loop_runtime.convergence.contracts import AdmissionRequest
|
|
22
|
+
from phase_loop_runtime.convergence.provider_contracts import PROVIDER_COMPLETION_CLASSIFICATIONS
|
|
23
|
+
|
|
24
|
+
from .admission import BrokerAdmissionPolicy, LinearizableAdmissionStore
|
|
25
|
+
from .credsep import GitHubBrokerAdapter
|
|
26
|
+
from .evidence import BrokerEvidenceStore
|
|
27
|
+
from .verbs import BrokerClient, BrokerService
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _default_admission_policy(_request: AdmissionRequest) -> bool:
|
|
31
|
+
"""Admit any structurally-valid admission request.
|
|
32
|
+
|
|
33
|
+
``AdmissionRequest.__post_init__`` already rejects a request missing any
|
|
34
|
+
fencing field, so a request that reaches the policy is well-formed. Epoch
|
|
35
|
+
staleness and idempotency-key conflicts are enforced inside
|
|
36
|
+
``LinearizableAdmissionStore.admit`` regardless of this policy.
|
|
37
|
+
"""
|
|
38
|
+
return True
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def build_github_broker_client(
|
|
42
|
+
repo_path: Path,
|
|
43
|
+
*,
|
|
44
|
+
broker_root: Path,
|
|
45
|
+
admission_policy: BrokerAdmissionPolicy | None = None,
|
|
46
|
+
run: Callable[..., subprocess.CompletedProcess] = subprocess.run,
|
|
47
|
+
) -> BrokerClient:
|
|
48
|
+
"""Wire a live GitHub broker client.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
repo_path:
|
|
53
|
+
Worktree the :class:`GitHubBrokerAdapter` runs git/gh against.
|
|
54
|
+
broker_root:
|
|
55
|
+
Durable directory for the admission log + terminal-evidence log. MUST
|
|
56
|
+
live OUTSIDE ``repo_path`` (e.g. ``CoordinatorRuntime.coordinator_root``)
|
|
57
|
+
so broker state never dirties the worktree being published — a dirty
|
|
58
|
+
worktree trips the publish staged-diff audit and the train clean-worktree
|
|
59
|
+
preflight.
|
|
60
|
+
admission_policy:
|
|
61
|
+
Optional admission gate; defaults to admitting any well-formed request.
|
|
62
|
+
run:
|
|
63
|
+
Injectable subprocess runner (tests pass a fake to mock the git/gh seam).
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
BrokerClient
|
|
68
|
+
A :class:`BrokerService` bound to the global (verb-gated) contracts, so
|
|
69
|
+
only ``publish_committed_branch``/``github`` can execute.
|
|
70
|
+
"""
|
|
71
|
+
admission_store = LinearizableAdmissionStore(
|
|
72
|
+
Path(broker_root),
|
|
73
|
+
admission_policy or _default_admission_policy,
|
|
74
|
+
)
|
|
75
|
+
evidence_store = BrokerEvidenceStore(Path(broker_root))
|
|
76
|
+
adapter = GitHubBrokerAdapter(Path(repo_path), run=run)
|
|
77
|
+
return BrokerService(
|
|
78
|
+
admission_store,
|
|
79
|
+
evidence_store,
|
|
80
|
+
adapter,
|
|
81
|
+
contracts=PROVIDER_COMPLETION_CLASSIFICATIONS,
|
|
82
|
+
)
|
|
@@ -32,9 +32,13 @@ class BrokerService:
|
|
|
32
32
|
# publish_committed_branch de-dups on the canonical (repo, branch, head_sha)
|
|
33
33
|
# triple so a repeat under a fresh admission key is a no-op that returns the
|
|
34
34
|
# SAME prior result. Other verbs remain keyed by the admission key.
|
|
35
|
+
# Every key is namespaced by verb so a cross-verb key collision can never
|
|
36
|
+
# replay one verb's terminal record for a different verb (defense-in-depth).
|
|
35
37
|
if request.verb is BrokerVerb.PUBLISH_COMMITTED_BRANCH:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
base = publish_committed_branch_idempotency_key(request.repo, request.branch, request.head_sha)
|
|
39
|
+
else:
|
|
40
|
+
base = request.admission.idempotency_key
|
|
41
|
+
return f"{request.verb.value}\0{base}"
|
|
38
42
|
|
|
39
43
|
def _replay(self, request: BrokerRequest, key: str, current: EvidenceRecord) -> BrokerExecutionResult:
|
|
40
44
|
observed = current.state is TerminalOutcomeState.EFFECT_TERMINAL_OBSERVED
|
|
@@ -74,14 +74,41 @@ class ProviderCompletionContract:
|
|
|
74
74
|
raise ValueError("supported operations require terminal evidence")
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
# Repository-derived mutation inventory
|
|
78
|
-
#
|
|
77
|
+
# Repository-derived mutation inventory. The full pair-space stays enumerated so
|
|
78
|
+
# inventory-completeness tests keep every verb×provider explicitly classified.
|
|
79
79
|
AUTOMATED_PROVIDER_VERBS = frozenset(
|
|
80
80
|
(verb, "github")
|
|
81
81
|
for verb in ("publish", "merge", "release", "package", "publish_committed_branch")
|
|
82
82
|
)
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
# The ONE live-enabled verb. ``publish_committed_branch``/``github`` is SUPPORTED
|
|
85
|
+
# because ``GitHubBrokerAdapter`` supplies contractually-sufficient terminal
|
|
86
|
+
# evidence: after a by-name (non-force) push it READS the remote and only reports
|
|
87
|
+
# the effect terminally observed when the remote branch head equals the pushed
|
|
88
|
+
# head_sha AND the PR's ``headRefOid`` equals it — resolving the real PR url. Any
|
|
89
|
+
# read-failure / mismatch / ambiguous push fails closed to
|
|
90
|
+
# ``outcome_ambiguous_blocked`` (never inferred as no-effect, never fabricated as
|
|
91
|
+
# success — v5 rule). ``BrokerService`` de-dups on the canonical
|
|
92
|
+
# ``(repo, branch, head_sha)`` triple with idempotent replay recovery.
|
|
93
|
+
_SUPPORTED_GITHUB_PUBLISH = ProviderCompletionContract(
|
|
94
|
+
verb="publish_committed_branch",
|
|
95
|
+
provider="github",
|
|
96
|
+
classification=ProviderCompletionClassification.SUPPORTED,
|
|
97
|
+
disposition=ProviderAutomationDisposition.AUTOMATED,
|
|
98
|
+
status_endpoint="gh pr list --head <branch> --json headRefOid,url (+ git ls-remote origin refs/heads/<branch>)",
|
|
99
|
+
idempotency_key_supported="canonical (repo, branch, head_sha) triple; repeat under a fresh admission key replays the prior result",
|
|
100
|
+
terminal_success_evidence="remote branch head == pushed head_sha AND PR headRefOid == pushed head_sha -> effect_terminal_observed with the real PR url",
|
|
101
|
+
terminal_no_effect_evidence="ONLY a provider-confirmed rejection is no-effect; a failed/ambiguous push is NOT no-effect and fails closed to outcome_ambiguous_blocked (v5)",
|
|
102
|
+
non_late_commit_guarantee="by-name non-force push linearizes onto origin/<branch> or is rejected; there is no delayed/late apply after the ls-remote read",
|
|
103
|
+
guaranteed_processing_horizon="N/A — synchronous git push + gh reads; no asynchronous provider processing queue to drain",
|
|
104
|
+
expected_version_predicate="origin/<branch> head == pushed head_sha (exact-published-head match)",
|
|
105
|
+
revocation_affects_accepted="no — an accepted (linearized) push observed at head_sha is not revoked by the broker; only ambiguity fails closed",
|
|
106
|
+
stabilization_drain_interval="N/A — verification is synchronous; no stabilization/drain window",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Every OTHER verb×provider stays HUMAN_EXECUTED (merge, release, package, publish
|
|
110
|
+
# on github, and — by absence — all non-github providers) so the broker refuses it.
|
|
111
|
+
_HUMAN_EXECUTED_VERBS = tuple(
|
|
85
112
|
ProviderCompletionContract(
|
|
86
113
|
verb=verb,
|
|
87
114
|
provider=provider,
|
|
@@ -98,8 +125,11 @@ PROVIDER_COMPLETION_CLASSIFICATIONS = tuple(
|
|
|
98
125
|
stabilization_drain_interval="N/A",
|
|
99
126
|
)
|
|
100
127
|
for verb, provider in sorted(AUTOMATED_PROVIDER_VERBS)
|
|
128
|
+
if (verb, provider) != ("publish_committed_branch", "github")
|
|
101
129
|
)
|
|
102
130
|
|
|
131
|
+
PROVIDER_COMPLETION_CLASSIFICATIONS = (_SUPPORTED_GITHUB_PUBLISH, *_HUMAN_EXECUTED_VERBS)
|
|
132
|
+
|
|
103
133
|
|
|
104
134
|
def validate_terminal_transition(
|
|
105
135
|
current: TerminalOutcomeState,
|
{phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_runner.py
RENAMED
|
@@ -93,9 +93,12 @@ def _default_build_admission(runtime: "CoordinatorRuntime", node, workspace: Pat
|
|
|
93
93
|
"""Build a per-node AdmissionRequest from the coordinator runtime's authority.
|
|
94
94
|
|
|
95
95
|
Mirrors the fencing construction used by ``refresh.refresh_downstream_after_merge``.
|
|
96
|
-
The publish_committed_branch verb
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
The publish_committed_branch/github verb is now SUPPORTED, so a broker-authoritative
|
|
97
|
+
runtime carrying a live ``broker_client`` (see
|
|
98
|
+
``convergence.broker.build_github_broker_client``) will admit this request and
|
|
99
|
+
perform the real, exact-head-verified publish. Every OTHER verb stays
|
|
100
|
+
HUMAN_EXECUTED and is refused before start. This is the default seam; tests
|
|
101
|
+
inject ``_admission_fn`` to avoid a live git read.
|
|
99
102
|
"""
|
|
100
103
|
import hashlib
|
|
101
104
|
|
{phase_loop_runtime-0.7.5 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/SOURCES.txt
RENAMED
|
@@ -221,6 +221,7 @@ src/phase_loop_runtime/convergence/broker/__init__.py
|
|
|
221
221
|
src/phase_loop_runtime/convergence/broker/admission.py
|
|
222
222
|
src/phase_loop_runtime/convergence/broker/credsep.py
|
|
223
223
|
src/phase_loop_runtime/convergence/broker/evidence.py
|
|
224
|
+
src/phase_loop_runtime/convergence/broker/live.py
|
|
224
225
|
src/phase_loop_runtime/convergence/broker/verbs.py
|
|
225
226
|
src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service
|
|
226
227
|
src/phase_loop_runtime/pipeline_adapter/__init__.py
|
|
@@ -473,6 +474,7 @@ tests/test_convergence_event_log.py
|
|
|
473
474
|
tests/test_convergence_fencing.py
|
|
474
475
|
tests/test_convergence_fixture_contracts.py
|
|
475
476
|
tests/test_convergence_invalidation.py
|
|
477
|
+
tests/test_convergence_live_enable.py
|
|
476
478
|
tests/test_convergence_provider_contracts.py
|
|
477
479
|
tests/test_convergence_reconcile.py
|
|
478
480
|
tests/test_convergence_refresh.py
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from types import SimpleNamespace
|
|
3
|
+
|
|
4
|
+
from phase_loop_runtime.convergence.broker.credsep import BrokerEnvironmentBoundary, GitHubBrokerAdapter, build_non_force_branch_ref
|
|
5
|
+
from phase_loop_runtime.convergence.contracts import AdmissionRequest, BrokerRequest, BrokerVerb
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_only_broker_role_receives_mutation_credentials():
|
|
9
|
+
env = {"GH_TOKEN": "value", "NORMAL": "yes"}
|
|
10
|
+
assert "GH_TOKEN" in BrokerEnvironmentBoundary().environment_for("broker", env)
|
|
11
|
+
assert "GH_TOKEN" not in BrokerEnvironmentBoundary().environment_for("worker", env)
|
|
12
|
+
assert build_non_force_branch_ref("feature/broker") == "refs/heads/feature/broker"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# --- Blocker 3: exact-published-head verification (injectable git/gh seam) ---
|
|
16
|
+
_HEAD = "abc123def456"
|
|
17
|
+
_BRANCH = "feat/x"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class _FakeRun:
|
|
21
|
+
"""Match a git/gh argv against distinctive tokens; no live GitHub."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, responses):
|
|
24
|
+
self.responses = responses
|
|
25
|
+
self.calls = []
|
|
26
|
+
|
|
27
|
+
def __call__(self, args, **kwargs):
|
|
28
|
+
self.calls.append(list(args))
|
|
29
|
+
for tokens, stdout, rc in self.responses:
|
|
30
|
+
if all(tok in args for tok in tokens):
|
|
31
|
+
return SimpleNamespace(stdout=stdout, stderr="", returncode=rc)
|
|
32
|
+
raise AssertionError(f"unexpected command: {args!r}")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _request():
|
|
36
|
+
admission = AdmissionRequest("attempt", 1, "fence", "digest", "predicate", "scope", "key")
|
|
37
|
+
return BrokerRequest(BrokerVerb.PUBLISH_COMMITTED_BRANCH, admission, "repo", _BRANCH, _HEAD, ("a.py",))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _base_responses():
|
|
41
|
+
return [
|
|
42
|
+
(("branch", "--show-current"), _BRANCH, 0),
|
|
43
|
+
(("rev-parse",), _HEAD, 0),
|
|
44
|
+
(("get-url",), "https://github.com/owner/repo.git", 0),
|
|
45
|
+
(("push",), "", 0),
|
|
46
|
+
(("create",), "", 0),
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_remote_head_match_returns_effect_observed_with_real_url(tmp_path):
|
|
51
|
+
run = _FakeRun(_base_responses() + [
|
|
52
|
+
(("ls-remote",), f"{_HEAD}\trefs/heads/{_BRANCH}", 0),
|
|
53
|
+
(("list",), json.dumps([{"url": "https://gh/pr/9", "headRefOid": _HEAD}]), 0),
|
|
54
|
+
])
|
|
55
|
+
result, evidence = GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
56
|
+
assert evidence.terminal_state == "effect_terminal_observed"
|
|
57
|
+
assert result is not None and result.pr_url == "https://gh/pr/9"
|
|
58
|
+
assert result.head_sha == _HEAD
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_remote_head_mismatch_returns_ambiguous_not_success(tmp_path):
|
|
62
|
+
run = _FakeRun(_base_responses() + [
|
|
63
|
+
(("ls-remote",), f"deadbeef\trefs/heads/{_BRANCH}", 0),
|
|
64
|
+
])
|
|
65
|
+
result, evidence = GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
66
|
+
assert result is None
|
|
67
|
+
assert evidence.terminal_state == "outcome_ambiguous_blocked"
|
|
68
|
+
assert evidence.evidence_reference == "remote-head-mismatch"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_remote_read_failure_returns_ambiguous_not_no_effect(tmp_path):
|
|
72
|
+
run = _FakeRun(_base_responses() + [
|
|
73
|
+
(("ls-remote",), "", 1),
|
|
74
|
+
])
|
|
75
|
+
result, evidence = GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
76
|
+
assert result is None
|
|
77
|
+
# v5 rule: a failed read is ambiguous, never inferred as no_effect nor success.
|
|
78
|
+
assert evidence.terminal_state == "outcome_ambiguous_blocked"
|
|
79
|
+
assert evidence.evidence_reference == "remote-read-failed"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_pr_head_unconfirmed_returns_ambiguous(tmp_path):
|
|
83
|
+
run = _FakeRun(_base_responses() + [
|
|
84
|
+
(("ls-remote",), f"{_HEAD}\trefs/heads/{_BRANCH}", 0),
|
|
85
|
+
(("list",), json.dumps([{"url": "https://gh/pr/9", "headRefOid": "other-sha"}]), 0),
|
|
86
|
+
])
|
|
87
|
+
result, evidence = GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
88
|
+
assert result is None
|
|
89
|
+
assert evidence.terminal_state == "outcome_ambiguous_blocked"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# --- CR hardening: bind every gh call to the origin repo (no GH_REPO redirect) ---
|
|
93
|
+
def test_gh_calls_are_bound_to_origin_repo_slug(tmp_path):
|
|
94
|
+
"""gh pr create + pr list must carry --repo <origin slug> so a stray GH_REPO
|
|
95
|
+
cannot open/read the PR on a different repo while the push+ls-remote match."""
|
|
96
|
+
run = _FakeRun(_base_responses() + [
|
|
97
|
+
(("ls-remote",), f"{_HEAD}\trefs/heads/{_BRANCH}", 0),
|
|
98
|
+
(("list",), json.dumps([{"url": "https://gh/pr/9", "headRefOid": _HEAD}]), 0),
|
|
99
|
+
])
|
|
100
|
+
GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
101
|
+
gh = [c for c in run.calls if c and c[0] == "gh"]
|
|
102
|
+
assert gh, "expected gh calls"
|
|
103
|
+
for c in gh:
|
|
104
|
+
# host-qualified: --repo host/owner/repo pins both host AND repo
|
|
105
|
+
assert "--repo" in c and "github.com/owner/repo" in c, f"gh call not host-bound: {c!r}"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_unresolvable_origin_fails_closed(tmp_path):
|
|
109
|
+
run = _FakeRun([
|
|
110
|
+
(("branch", "--show-current"), _BRANCH, 0),
|
|
111
|
+
(("rev-parse",), _HEAD, 0),
|
|
112
|
+
(("get-url",), "not-a-git-url", 0),
|
|
113
|
+
])
|
|
114
|
+
try:
|
|
115
|
+
GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
116
|
+
except ValueError as e:
|
|
117
|
+
assert "origin" in str(e)
|
|
118
|
+
else:
|
|
119
|
+
raise AssertionError("expected fail-closed on unresolvable origin")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_broker_env_strips_repo_redirect_but_keeps_credential_and_host():
|
|
123
|
+
env = {"GH_TOKEN": "t", "GH_REPO": "evil/repo", "GH_HOST": "ghe.corp", "NORMAL": "y"}
|
|
124
|
+
broker = BrokerEnvironmentBoundary().environment_for("broker", env)
|
|
125
|
+
assert broker.get("GH_TOKEN") == "t" # broker needs its credential
|
|
126
|
+
assert "GH_REPO" not in broker # the repo-redirect var is stripped
|
|
127
|
+
assert broker.get("GH_HOST") == "ghe.corp" # GH_HOST kept (host pinned by --repo; preserves GHE config)
|
|
128
|
+
assert broker.get("NORMAL") == "y"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
import pytest
|
|
132
|
+
@pytest.mark.parametrize("url,slug", [
|
|
133
|
+
("https://github.com/owner/repo.git", "github.com/owner/repo"),
|
|
134
|
+
("https://github.com/owner/repo", "github.com/owner/repo"),
|
|
135
|
+
("git@github.com:owner/repo.git", "github.com/owner/repo"),
|
|
136
|
+
])
|
|
137
|
+
def test_origin_repo_host_qualified_for_github(tmp_path, url, slug):
|
|
138
|
+
run = _FakeRun([(("branch", "--show-current"), _BRANCH, 0), (("rev-parse",), _HEAD, 0), (("get-url",), url, 0)])
|
|
139
|
+
assert GitHubBrokerAdapter(tmp_path, run=run)._origin_repo() == slug
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# Class-closing origin-host invariant: any non-allow-listed host FAILS CLOSED by
|
|
143
|
+
# default; a self-hosted/GHE fleet resolves only when it passes its own allow-list.
|
|
144
|
+
@pytest.mark.parametrize("url", [
|
|
145
|
+
"git@ghe.corp:team/svc.git", "ssh://git@ghe.corp:2222/team/svc.git", "https://ghe.corp/team/svc",
|
|
146
|
+
])
|
|
147
|
+
def test_non_allowlisted_origin_host_fails_closed_by_default(tmp_path, url):
|
|
148
|
+
run = _FakeRun([(("branch", "--show-current"), _BRANCH, 0), (("rev-parse",), _HEAD, 0), (("get-url",), url, 0)])
|
|
149
|
+
with pytest.raises(ValueError, match="allowed broker hosts"):
|
|
150
|
+
GitHubBrokerAdapter(tmp_path, run=run)._origin_repo()
|
|
151
|
+
|
|
152
|
+
def test_ghe_origin_resolves_only_with_explicit_allowlist(tmp_path):
|
|
153
|
+
run = _FakeRun([(("branch", "--show-current"), _BRANCH, 0), (("rev-parse",), _HEAD, 0),
|
|
154
|
+
(("get-url",), "git@ghe.corp:team/svc.git", 0)])
|
|
155
|
+
adapter = GitHubBrokerAdapter(tmp_path, run=run, allowed_hosts=frozenset({"ghe.corp"}))
|
|
156
|
+
assert adapter._origin_repo() == "ghe.corp/team/svc"
|
|
157
|
+
|
|
158
|
+
@pytest.mark.parametrize("bad", [
|
|
159
|
+
"not-a-git-url", "https://github.com/onlyowner", "git@host:", "",
|
|
160
|
+
"https://github.com:8443/o/r.git", # non-default https port -> fail-closed
|
|
161
|
+
"https://github.com:80/o/r", # scheme-mismatched port (https+80) -> fail-closed
|
|
162
|
+
"http://github.com:443/o/r", # scheme-mismatched port (http+443) -> fail-closed
|
|
163
|
+
"https://[::1]/team/svc.git", # IPv6 literal -> fail-closed
|
|
164
|
+
])
|
|
165
|
+
def test_origin_repo_fails_closed_on_garbage_or_unpinnable(tmp_path, bad):
|
|
166
|
+
run = _FakeRun([(("branch", "--show-current"), _BRANCH, 0), (("rev-parse",), _HEAD, 0), (("get-url",), bad, 0)])
|
|
167
|
+
with pytest.raises(ValueError):
|
|
168
|
+
GitHubBrokerAdapter(tmp_path, run=run)._origin_repo()
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# --- Round-5 fix: push + ls-remote use the EXPLICIT validated origin URL, never the
|
|
172
|
+
# `origin` alias (so remote.origin.pushurl / url.*.pushInsteadOf can't redirect the
|
|
173
|
+
# mutation to an unvalidated same-host repo). ---
|
|
174
|
+
def test_push_and_lsremote_bind_to_explicit_origin_url_not_alias(tmp_path):
|
|
175
|
+
origin = "https://github.com/owner/repo.git"
|
|
176
|
+
run = _FakeRun(_base_responses() + [
|
|
177
|
+
(("ls-remote",), f"{_HEAD}\trefs/heads/{_BRANCH}", 0),
|
|
178
|
+
(("list",), json.dumps([{"url": "https://gh/pr/9", "headRefOid": _HEAD}]), 0),
|
|
179
|
+
])
|
|
180
|
+
GitHubBrokerAdapter(tmp_path, run=run).execute(_request())
|
|
181
|
+
push = next(c for c in run.calls if "push" in c)
|
|
182
|
+
lsrem = next(c for c in run.calls if "ls-remote" in c)
|
|
183
|
+
assert origin in push and "origin" not in push[push.index("push") + 1:], f"push not bound to explicit url: {push!r}"
|
|
184
|
+
assert origin in lsrem and "origin" not in lsrem[lsrem.index("ls-remote") + 1:], f"ls-remote not bound to explicit url: {lsrem!r}"
|