phase-loop-runtime 0.7.7__tar.gz → 0.7.8__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.7 → phase_loop_runtime-0.7.8}/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/cli.py +31 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/broker/__init__.py +2 -2
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/broker/credsep.py +8 -1
- phase_loop_runtime-0.7.8/src/phase_loop_runtime/convergence/broker/live.py +187 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/SOURCES.txt +1 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_credsep.py +21 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_live_enable.py +137 -1
- phase_loop_runtime-0.7.8/tests/test_specpkgmin_wheel.py +99 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_runner.py +61 -0
- phase_loop_runtime-0.7.7/src/phase_loop_runtime/convergence/broker/live.py +0 -82
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/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.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/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.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/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.8"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -2934,11 +2934,42 @@ def _run_train_command(*, parser: argparse.ArgumentParser, args: argparse.Namesp
|
|
|
2934
2934
|
|
|
2935
2935
|
as_json = bool(getattr(args, "json", False))
|
|
2936
2936
|
|
|
2937
|
+
# Build a broker-authoritative coordinator runtime so publish actually opens PRs.
|
|
2938
|
+
# Without a broker_client, publish_from_worktree fail-closes `broker_required` and
|
|
2939
|
+
# the train opens ZERO PRs. The routing broker binds per BrokerRequest.repo (the
|
|
2940
|
+
# node's resolved workspace) AND keeps a PER-REPO admission/evidence store, so one
|
|
2941
|
+
# node's ambiguous outcome fail-closes only that repo. The broker root is namespaced
|
|
2942
|
+
# by the roadmap's RESOLVED PATH hash (not the bare filename stem): two distinct
|
|
2943
|
+
# roadmap files — even same-stemmed, even under one explicit `--ledger-dir` — get
|
|
2944
|
+
# distinct broker roots, so an ambiguous outcome in one train can never fail-close a
|
|
2945
|
+
# different train. Keying on the stable path (not the content digest) keeps a
|
|
2946
|
+
# resumed train on its own epoch across roadmap edits. It lives under the ledger dir,
|
|
2947
|
+
# which the roadmap author keeps outside any repo's .phase-loop/ (INV-4); it is NOT
|
|
2948
|
+
# machine-enforced to be outside every node worktree, so keep train roadmaps + their
|
|
2949
|
+
# ledger dir out of the checkouts.
|
|
2950
|
+
import hashlib
|
|
2951
|
+
|
|
2952
|
+
from .convergence.broker import build_routing_broker_client
|
|
2953
|
+
|
|
2954
|
+
train_key = hashlib.sha256(str(train_path.resolve()).encode("utf-8")).hexdigest()[:16]
|
|
2955
|
+
coordinator_root = ledger_dir / "broker" / train_key
|
|
2956
|
+
coordinator_root.mkdir(parents=True, exist_ok=True)
|
|
2957
|
+
roadmap_digest = hashlib.sha256(train_path.read_bytes()).hexdigest()
|
|
2958
|
+
coordinator_runtime = train_runner.CoordinatorRuntime(
|
|
2959
|
+
train_id=train_path.stem,
|
|
2960
|
+
coordinator_root=coordinator_root,
|
|
2961
|
+
roadmap_path=str(train_path),
|
|
2962
|
+
roadmap_digest=roadmap_digest,
|
|
2963
|
+
workspace_id=train_path.stem,
|
|
2964
|
+
broker_client=build_routing_broker_client(broker_root=coordinator_root),
|
|
2965
|
+
)
|
|
2966
|
+
|
|
2937
2967
|
result = train_runner.run_train(
|
|
2938
2968
|
roadmap,
|
|
2939
2969
|
ledger_path,
|
|
2940
2970
|
run_mode=run_mode,
|
|
2941
2971
|
resolve_workspace=_resolve_workspace,
|
|
2972
|
+
coordinator_runtime=coordinator_runtime,
|
|
2942
2973
|
_merge_phase_enabled=True, # P4 gate: autonomous→drafts_open, governed→merge
|
|
2943
2974
|
)
|
|
2944
2975
|
|
|
@@ -2,6 +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
|
+
from .live import build_github_broker_client, build_routing_broker_client
|
|
6
6
|
from .verbs import 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"]
|
|
7
|
+
__all__ = ["AdmissionRecord", "BrokerAdmissionPolicy", "LinearizableAdmissionStore", "BrokerEnvironmentBoundary", "GitHubBrokerAdapter", "BrokerEvidenceStore", "EvidenceRecord", "BrokerClient", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService", "build_github_broker_client", "build_routing_broker_client", "publish_committed_branch_idempotency_key"]
|
|
@@ -98,7 +98,14 @@ class GitHubBrokerAdapter:
|
|
|
98
98
|
# so remote.origin.pushurl / url.*.pushInsteadOf cannot redirect the mutation.
|
|
99
99
|
pushed = self.run(["git", "-C", str(self.repo_path), "push", origin_url, ref], capture_output=True, text=True)
|
|
100
100
|
if pushed.returncode: return self._ambiguous(request, "push-unconfirmed")
|
|
101
|
-
|
|
101
|
+
# `gh pr create` REQUIRES --title (+ --body) when non-interactive; the bare
|
|
102
|
+
# `--draft`/`--fill` form aborts headless ("must provide --title and --body").
|
|
103
|
+
# Derive a deterministic title from the branch HEAD's commit subject and pass
|
|
104
|
+
# the request's pr_body verbatim (empty body is valid once --title is present).
|
|
105
|
+
# --head pins the branch explicitly so gh never infers a wrong head.
|
|
106
|
+
title = self._output("log", "-1", "--format=%s") or request.branch
|
|
107
|
+
args = ["gh", "pr", "create", "--repo", origin_repo, "--head", request.branch, "--title", title, "--body", request.pr_body or title]
|
|
108
|
+
if request.draft: args.append("--draft")
|
|
102
109
|
created = self.run(args, cwd=self.repo_path, capture_output=True, text=True)
|
|
103
110
|
if created.returncode: return self._ambiguous(request, "pr-unconfirmed")
|
|
104
111
|
# Exact-published-head verification: READ the remote and confirm the branch
|
|
@@ -0,0 +1,187 @@
|
|
|
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 hashlib
|
|
18
|
+
import subprocess
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Callable
|
|
21
|
+
|
|
22
|
+
from phase_loop_runtime.convergence.contracts import AdmissionRequest
|
|
23
|
+
from phase_loop_runtime.convergence.provider_contracts import PROVIDER_COMPLETION_CLASSIFICATIONS
|
|
24
|
+
|
|
25
|
+
from .admission import BrokerAdmissionPolicy, LinearizableAdmissionStore
|
|
26
|
+
from .credsep import ALLOWED_ORIGIN_HOSTS, GitHubBrokerAdapter
|
|
27
|
+
from .evidence import BrokerEvidenceStore
|
|
28
|
+
from .verbs import BrokerClient, BrokerService
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _default_admission_policy(_request: AdmissionRequest) -> bool:
|
|
32
|
+
"""Admit any structurally-valid admission request.
|
|
33
|
+
|
|
34
|
+
``AdmissionRequest.__post_init__`` already rejects a request missing any
|
|
35
|
+
fencing field, so a request that reaches the policy is well-formed. Epoch
|
|
36
|
+
staleness and idempotency-key conflicts are enforced inside
|
|
37
|
+
``LinearizableAdmissionStore.admit`` regardless of this policy.
|
|
38
|
+
"""
|
|
39
|
+
return True
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def build_github_broker_client(
|
|
43
|
+
repo_path: Path,
|
|
44
|
+
*,
|
|
45
|
+
broker_root: Path,
|
|
46
|
+
admission_policy: BrokerAdmissionPolicy | None = None,
|
|
47
|
+
run: Callable[..., subprocess.CompletedProcess] = subprocess.run,
|
|
48
|
+
) -> BrokerClient:
|
|
49
|
+
"""Wire a live GitHub broker client.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
repo_path:
|
|
54
|
+
Worktree the :class:`GitHubBrokerAdapter` runs git/gh against.
|
|
55
|
+
broker_root:
|
|
56
|
+
Durable directory for the admission log + terminal-evidence log. MUST
|
|
57
|
+
live OUTSIDE ``repo_path`` (e.g. ``CoordinatorRuntime.coordinator_root``)
|
|
58
|
+
so broker state never dirties the worktree being published — a dirty
|
|
59
|
+
worktree trips the publish staged-diff audit and the train clean-worktree
|
|
60
|
+
preflight.
|
|
61
|
+
admission_policy:
|
|
62
|
+
Optional admission gate; defaults to admitting any well-formed request.
|
|
63
|
+
run:
|
|
64
|
+
Injectable subprocess runner (tests pass a fake to mock the git/gh seam).
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
BrokerClient
|
|
69
|
+
A :class:`BrokerService` bound to the global (verb-gated) contracts, so
|
|
70
|
+
only ``publish_committed_branch``/``github`` can execute.
|
|
71
|
+
"""
|
|
72
|
+
admission_store = LinearizableAdmissionStore(
|
|
73
|
+
Path(broker_root),
|
|
74
|
+
admission_policy or _default_admission_policy,
|
|
75
|
+
)
|
|
76
|
+
evidence_store = BrokerEvidenceStore(Path(broker_root))
|
|
77
|
+
adapter = GitHubBrokerAdapter(Path(repo_path), run=run)
|
|
78
|
+
return BrokerService(
|
|
79
|
+
admission_store,
|
|
80
|
+
evidence_store,
|
|
81
|
+
adapter,
|
|
82
|
+
contracts=PROVIDER_COMPLETION_CLASSIFICATIONS,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _repo_store_slug(repo: str) -> str:
|
|
87
|
+
"""Stable, filesystem-safe subdir name for a repo's per-repo broker store.
|
|
88
|
+
|
|
89
|
+
``BrokerRequest.repo`` is an arbitrary absolute workspace path, so hash it rather
|
|
90
|
+
than embed the path. A short hex prefix is collision-free in practice and keeps
|
|
91
|
+
the on-disk layout readable.
|
|
92
|
+
"""
|
|
93
|
+
return hashlib.sha256(repo.encode("utf-8")).hexdigest()[:16]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class _RoutingBrokerService:
|
|
97
|
+
"""A :class:`BrokerClient` that routes each request to a PER-REPO broker service.
|
|
98
|
+
|
|
99
|
+
``build_github_broker_client`` fixes ONE ``repo_path`` at construction, so a single
|
|
100
|
+
client can only faithfully serve one repo — a multi-repo ``run_train`` threading one
|
|
101
|
+
``coordinator_runtime.broker_client`` across every node would run
|
|
102
|
+
``git -C <wrong-repo>`` and trip the branch/head guard on node 2+.
|
|
103
|
+
|
|
104
|
+
Critically, each repo gets its OWN admission + evidence store under
|
|
105
|
+
``broker_root/<repo-slug>`` — the stores are NOT shared. ``epoch_blocked`` is a
|
|
106
|
+
GLOBAL scan over a store (``any(state is OUTCOME_AMBIGUOUS_BLOCKED)``) and an
|
|
107
|
+
ambiguous terminal is durable + permanent, and it fires on BENIGN transients
|
|
108
|
+
(push-unconfirmed / remote-read-failed / pr-unconfirmed / remote-head-mismatch /
|
|
109
|
+
pr-head-unconfirmed). A shared store would therefore let one repo's transient
|
|
110
|
+
hiccup permanently fail-close every OTHER repo in the train (and, with an
|
|
111
|
+
un-namespaced ``broker_root``, other trains too). Per-repo stores scope the
|
|
112
|
+
fail-closed epoch to exactly the repo whose mutation became ambiguous — the correct
|
|
113
|
+
blast radius: repo A's unknown state says nothing about repo B's independent remote.
|
|
114
|
+
The caller namespaces ``broker_root`` per train (see the ``run-train`` CLI), closing
|
|
115
|
+
the cross-train dimension.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
def __init__(
|
|
119
|
+
self,
|
|
120
|
+
broker_root: Path,
|
|
121
|
+
*,
|
|
122
|
+
admission_policy: BrokerAdmissionPolicy,
|
|
123
|
+
run: Callable[..., subprocess.CompletedProcess],
|
|
124
|
+
allowed_hosts,
|
|
125
|
+
contracts=PROVIDER_COMPLETION_CLASSIFICATIONS,
|
|
126
|
+
) -> None:
|
|
127
|
+
self._broker_root = Path(broker_root)
|
|
128
|
+
self._admission_policy = admission_policy
|
|
129
|
+
self._run = run
|
|
130
|
+
self._allowed_hosts = allowed_hosts
|
|
131
|
+
self._contracts = contracts
|
|
132
|
+
self._services: dict[str, BrokerService] = {}
|
|
133
|
+
|
|
134
|
+
def _service_for(self, repo: str) -> BrokerService:
|
|
135
|
+
service = self._services.get(repo)
|
|
136
|
+
if service is None:
|
|
137
|
+
root = self._broker_root / _repo_store_slug(repo)
|
|
138
|
+
service = BrokerService(
|
|
139
|
+
LinearizableAdmissionStore(root, self._admission_policy),
|
|
140
|
+
BrokerEvidenceStore(root),
|
|
141
|
+
GitHubBrokerAdapter(Path(repo), run=self._run, allowed_hosts=self._allowed_hosts),
|
|
142
|
+
contracts=self._contracts,
|
|
143
|
+
)
|
|
144
|
+
self._services[repo] = service
|
|
145
|
+
return service
|
|
146
|
+
|
|
147
|
+
def execute(self, request):
|
|
148
|
+
return self._service_for(request.repo).execute(request)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def build_routing_broker_client(
|
|
152
|
+
*,
|
|
153
|
+
broker_root: Path,
|
|
154
|
+
admission_policy: BrokerAdmissionPolicy | None = None,
|
|
155
|
+
run: Callable[..., subprocess.CompletedProcess] = subprocess.run,
|
|
156
|
+
allowed_hosts=ALLOWED_ORIGIN_HOSTS,
|
|
157
|
+
) -> BrokerClient:
|
|
158
|
+
"""Wire a live GitHub broker client that serves a MULTI-repo train.
|
|
159
|
+
|
|
160
|
+
Like :func:`build_github_broker_client` but routes per ``BrokerRequest.repo``: the
|
|
161
|
+
git/gh adapter is bound to the request's repo, AND each repo gets its own admission
|
|
162
|
+
+ evidence store under ``broker_root/<repo-slug>``. Per-repo stores are load-bearing
|
|
163
|
+
for safety, not just routing — a shared store's GLOBAL ``epoch_blocked`` would let one
|
|
164
|
+
repo's ambiguous outcome (reachable via a benign transient) permanently fail-close
|
|
165
|
+
every other repo. See :class:`_RoutingBrokerService`.
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
broker_root:
|
|
170
|
+
Durable parent directory for the per-repo admission + evidence stores. MUST
|
|
171
|
+
live OUTSIDE every node's worktree, and the caller SHOULD namespace it per train
|
|
172
|
+
(e.g. ``<ledger-dir>/broker/<train-stem>``) so unrelated trains never share an
|
|
173
|
+
epoch.
|
|
174
|
+
admission_policy:
|
|
175
|
+
Optional admission gate; defaults to admitting any well-formed request.
|
|
176
|
+
run:
|
|
177
|
+
Injectable subprocess runner (tests pass a fake to mock the git/gh seam).
|
|
178
|
+
allowed_hosts:
|
|
179
|
+
Origin-host allow-list applied to every per-request adapter (github.com-only
|
|
180
|
+
by default); a self-hosted/GHE fleet passes its own set.
|
|
181
|
+
"""
|
|
182
|
+
return _RoutingBrokerService(
|
|
183
|
+
Path(broker_root),
|
|
184
|
+
admission_policy=admission_policy or _default_admission_policy,
|
|
185
|
+
run=run,
|
|
186
|
+
allowed_hosts=allowed_hosts,
|
|
187
|
+
)
|
{phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/src/phase_loop_runtime.egg-info/SOURCES.txt
RENAMED
|
@@ -742,6 +742,7 @@ tests/test_skills_bundle_drift.py
|
|
|
742
742
|
tests/test_skills_canon_parity.py
|
|
743
743
|
tests/test_skills_src_claude_literal_lint.py
|
|
744
744
|
tests/test_spec_conformance_gate.py
|
|
745
|
+
tests/test_specpkgmin_wheel.py
|
|
745
746
|
tests/test_status_read_only_62.py
|
|
746
747
|
tests/test_sweep_fleet_worktrees_script.py
|
|
747
748
|
tests/test_sync_skills_apply_failloud.py
|
{phase_loop_runtime-0.7.7 → phase_loop_runtime-0.7.8}/tests/test_convergence_broker_credsep.py
RENAMED
|
@@ -41,6 +41,7 @@ def _base_responses():
|
|
|
41
41
|
return [
|
|
42
42
|
(("branch", "--show-current"), _BRANCH, 0),
|
|
43
43
|
(("rev-parse",), _HEAD, 0),
|
|
44
|
+
(("log",), "commit subject line", 0),
|
|
44
45
|
(("get-url",), "https://github.com/owner/repo.git", 0),
|
|
45
46
|
(("push",), "", 0),
|
|
46
47
|
(("create",), "", 0),
|
|
@@ -105,6 +106,26 @@ def test_gh_calls_are_bound_to_origin_repo_slug(tmp_path):
|
|
|
105
106
|
assert "--repo" in c and "github.com/owner/repo" in c, f"gh call not host-bound: {c!r}"
|
|
106
107
|
|
|
107
108
|
|
|
109
|
+
# --- Live-PILOT regression: `gh pr create` MUST be a complete non-interactive argv.
|
|
110
|
+
# The bare `--draft`/`--fill` form aborts headless ("must provide --title and --body"),
|
|
111
|
+
# so a mocked-run unit test passes while the real broker cannot open ANY PR. Assert the
|
|
112
|
+
# create argv carries --title + --body (+ --draft for a draft request) and pins --head. ---
|
|
113
|
+
def test_pr_create_is_noninteractive_with_title_body_head(tmp_path):
|
|
114
|
+
body = "## Cross-repo release train\n\nbody text"
|
|
115
|
+
admission = AdmissionRequest("attempt", 1, "fence", "digest", "predicate", "scope", "key")
|
|
116
|
+
request = BrokerRequest(BrokerVerb.PUBLISH_COMMITTED_BRANCH, admission, "repo", _BRANCH, _HEAD, ("a.py",), draft=True, pr_body=body)
|
|
117
|
+
run = _FakeRun(_base_responses() + [
|
|
118
|
+
(("ls-remote",), f"{_HEAD}\trefs/heads/{_BRANCH}", 0),
|
|
119
|
+
(("list",), json.dumps([{"url": "https://gh/pr/9", "headRefOid": _HEAD}]), 0),
|
|
120
|
+
])
|
|
121
|
+
GitHubBrokerAdapter(tmp_path, run=run).execute(request)
|
|
122
|
+
create = next(c for c in run.calls if c[:3] == ["gh", "pr", "create"])
|
|
123
|
+
assert "--title" in create and create[create.index("--title") + 1], f"create lacks non-empty --title: {create!r}"
|
|
124
|
+
assert "--body" in create and create[create.index("--body") + 1] == body, f"create lacks pr_body --body: {create!r}"
|
|
125
|
+
assert "--head" in create and _BRANCH in create, f"create lacks explicit --head: {create!r}"
|
|
126
|
+
assert "--draft" in create, f"draft request must carry --draft: {create!r}"
|
|
127
|
+
|
|
128
|
+
|
|
108
129
|
def test_unresolvable_origin_fails_closed(tmp_path):
|
|
109
130
|
run = _FakeRun([
|
|
110
131
|
(("branch", "--show-current"), _BRANCH, 0),
|
|
@@ -15,7 +15,7 @@ from subprocess import CompletedProcess
|
|
|
15
15
|
|
|
16
16
|
import pytest
|
|
17
17
|
|
|
18
|
-
from phase_loop_runtime.convergence.broker import build_github_broker_client
|
|
18
|
+
from phase_loop_runtime.convergence.broker import build_github_broker_client, build_routing_broker_client
|
|
19
19
|
from phase_loop_runtime.convergence.broker.admission import LinearizableAdmissionStore
|
|
20
20
|
from phase_loop_runtime.convergence.broker.credsep import GitHubBrokerAdapter
|
|
21
21
|
from phase_loop_runtime.convergence.broker.evidence import BrokerEvidenceStore
|
|
@@ -54,6 +54,8 @@ def _fake_git_gh(*, remote_sha: str = _HEAD, pr_head: str = _HEAD):
|
|
|
54
54
|
return CompletedProcess(cmd, 0, stdout=_BRANCH + "\n", stderr="")
|
|
55
55
|
if sub[0] == "rev-parse":
|
|
56
56
|
return CompletedProcess(cmd, 0, stdout=_HEAD + "\n", stderr="")
|
|
57
|
+
if sub[0] == "log":
|
|
58
|
+
return CompletedProcess(cmd, 0, stdout="commit subject line\n", stderr="")
|
|
57
59
|
if sub[0] == "push":
|
|
58
60
|
return CompletedProcess(cmd, 0, stdout="", stderr="")
|
|
59
61
|
if sub[0] == "ls-remote":
|
|
@@ -166,3 +168,137 @@ def test_live_broker_builder_constructs_working_client(tmp_path):
|
|
|
166
168
|
# Broker state is durable under broker_root, never inside the published worktree.
|
|
167
169
|
assert (broker_root / "evidence.jsonl").exists()
|
|
168
170
|
assert not (repo_path / "evidence.jsonl").exists()
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# (f) Routing broker: ONE client serves a MULTI-repo train ---------------------
|
|
174
|
+
def _routing_fake(repos, seen_paths):
|
|
175
|
+
"""git/gh fake that responds PER repo path, recording which path git ran under."""
|
|
176
|
+
|
|
177
|
+
def fake_run(cmd, **kwargs):
|
|
178
|
+
if cmd[0] == "git":
|
|
179
|
+
path = cmd[2] # after: git -C <path>
|
|
180
|
+
seen_paths.append(path)
|
|
181
|
+
meta = repos[path]
|
|
182
|
+
sub = cmd[3:]
|
|
183
|
+
if sub[:2] == ["branch", "--show-current"]:
|
|
184
|
+
return CompletedProcess(cmd, 0, stdout=meta["branch"] + "\n", stderr="")
|
|
185
|
+
if sub[0] == "rev-parse":
|
|
186
|
+
return CompletedProcess(cmd, 0, stdout=meta["head"] + "\n", stderr="")
|
|
187
|
+
if sub[0] == "log":
|
|
188
|
+
return CompletedProcess(cmd, 0, stdout=f"{meta['branch']} subject\n", stderr="")
|
|
189
|
+
if sub[0] == "push":
|
|
190
|
+
return CompletedProcess(cmd, 0, stdout="", stderr="")
|
|
191
|
+
if sub[0] == "ls-remote":
|
|
192
|
+
return CompletedProcess(cmd, 0, stdout=f'{meta["head"]}\trefs/heads/{meta["branch"]}\n', stderr="")
|
|
193
|
+
if sub[:2] == ["remote", "get-url"]:
|
|
194
|
+
return CompletedProcess(cmd, 0, stdout="https://github.com/owner/repo.git\n", stderr="")
|
|
195
|
+
if cmd[0] == "gh":
|
|
196
|
+
meta = repos[str(kwargs.get("cwd"))]
|
|
197
|
+
if cmd[1:3] == ["pr", "create"]:
|
|
198
|
+
return CompletedProcess(cmd, 0, stdout="", stderr="")
|
|
199
|
+
if cmd[1:3] == ["pr", "list"]:
|
|
200
|
+
return CompletedProcess(cmd, 0, stdout=json.dumps([{"headRefOid": meta["head"], "url": meta["url"]}]), stderr="")
|
|
201
|
+
raise AssertionError(f"unexpected command: {cmd}")
|
|
202
|
+
|
|
203
|
+
return fake_run
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _routing_request(repo_path, meta, key):
|
|
207
|
+
admission = AdmissionRequest("attempt", 1, "fence", "digest", "head == committed", "scope", key)
|
|
208
|
+
return BrokerRequest(BrokerVerb.PUBLISH_COMMITTED_BRANCH, admission, repo_path, meta["branch"], meta["head"], ("plan.md",))
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def test_routing_broker_binds_each_request_to_its_own_repo(tmp_path):
|
|
212
|
+
repos = {
|
|
213
|
+
"/ws/alpha": {"branch": "feat/alpha", "head": "a" * 40, "url": "https://gh/pr/alpha"},
|
|
214
|
+
"/ws/beta": {"branch": "feat/beta", "head": "b" * 40, "url": "https://gh/pr/beta"},
|
|
215
|
+
}
|
|
216
|
+
seen_paths: list = []
|
|
217
|
+
broker = build_routing_broker_client(broker_root=tmp_path / "coord", run=_routing_fake(repos, seen_paths))
|
|
218
|
+
|
|
219
|
+
for path, meta in repos.items():
|
|
220
|
+
result = broker.execute(_routing_request(path, meta, key=f"k-{path}"))
|
|
221
|
+
assert result.accepted, f"{path} not accepted"
|
|
222
|
+
assert result.publish_result.pr_url == meta["url"], f"{path} routed to the wrong repo's PR"
|
|
223
|
+
assert result.publish_result.head_sha == meta["head"]
|
|
224
|
+
|
|
225
|
+
# Each node's git ran under ITS OWN worktree path — the whole point of routing.
|
|
226
|
+
assert "/ws/alpha" in seen_paths and "/ws/beta" in seen_paths
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def test_routing_broker_dedups_within_a_repo_not_across(tmp_path):
|
|
230
|
+
# Each repo has its OWN store, and within a repo the de-dup key
|
|
231
|
+
# sha256(repo\0branch\0head) makes a replay under a fresh admission key return the
|
|
232
|
+
# prior result; a different repo is a distinct store + triple (a real second effect).
|
|
233
|
+
repos = {
|
|
234
|
+
"/ws/alpha": {"branch": "feat/alpha", "head": "a" * 40, "url": "https://gh/pr/alpha"},
|
|
235
|
+
"/ws/beta": {"branch": "feat/beta", "head": "b" * 40, "url": "https://gh/pr/beta"},
|
|
236
|
+
}
|
|
237
|
+
creates = {"n": 0}
|
|
238
|
+
|
|
239
|
+
def counting(cmd, **kwargs):
|
|
240
|
+
if cmd[0] == "gh" and cmd[1:3] == ["pr", "create"]:
|
|
241
|
+
creates["n"] += 1
|
|
242
|
+
return _routing_fake(repos, [])(cmd, **kwargs)
|
|
243
|
+
|
|
244
|
+
broker = build_routing_broker_client(broker_root=tmp_path / "coord", run=counting)
|
|
245
|
+
first = broker.execute(_routing_request("/ws/alpha", repos["/ws/alpha"], key="k1"))
|
|
246
|
+
replay = broker.execute(_routing_request("/ws/alpha", repos["/ws/alpha"], key="k2-different"))
|
|
247
|
+
other = broker.execute(_routing_request("/ws/beta", repos["/ws/beta"], key="k3"))
|
|
248
|
+
|
|
249
|
+
assert creates["n"] == 2, "alpha's replay must de-dup (1 real effect); beta is a distinct triple"
|
|
250
|
+
assert replay.publish_result == first.publish_result
|
|
251
|
+
assert other.publish_result.pr_url == repos["/ws/beta"]["url"]
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def test_one_repo_ambiguous_outcome_does_not_poison_other_repos(tmp_path):
|
|
255
|
+
"""A benign transient making repo alpha's publish ambiguous must NOT fail-close beta.
|
|
256
|
+
|
|
257
|
+
``epoch_blocked`` is a global scan over a store, an ambiguous terminal is durable +
|
|
258
|
+
permanent, and it fires on benign transients (here: alpha's ls-remote read fails).
|
|
259
|
+
With a SHARED store this would set the global epoch and beta would raise
|
|
260
|
+
``PermissionError('epoch permanently blocked')``. Per-repo stores scope the
|
|
261
|
+
fail-closed epoch to ONLY alpha (agent-harness#208 CR).
|
|
262
|
+
"""
|
|
263
|
+
repos = {
|
|
264
|
+
"/ws/alpha": {"branch": "feat/alpha", "head": "a" * 40, "url": "https://gh/pr/alpha"},
|
|
265
|
+
"/ws/beta": {"branch": "feat/beta", "head": "b" * 40, "url": "https://gh/pr/beta"},
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
def fake_run(cmd, **kwargs):
|
|
269
|
+
if cmd[0] == "git":
|
|
270
|
+
path = cmd[2]
|
|
271
|
+
meta = repos[path]
|
|
272
|
+
sub = cmd[3:]
|
|
273
|
+
if sub[:2] == ["branch", "--show-current"]:
|
|
274
|
+
return CompletedProcess(cmd, 0, stdout=meta["branch"] + "\n", stderr="")
|
|
275
|
+
if sub[0] == "rev-parse":
|
|
276
|
+
return CompletedProcess(cmd, 0, stdout=meta["head"] + "\n", stderr="")
|
|
277
|
+
if sub[0] == "log":
|
|
278
|
+
return CompletedProcess(cmd, 0, stdout="subject\n", stderr="")
|
|
279
|
+
if sub[0] == "push":
|
|
280
|
+
return CompletedProcess(cmd, 0, stdout="", stderr="")
|
|
281
|
+
if sub[0] == "ls-remote":
|
|
282
|
+
if path == "/ws/alpha": # benign transient: remote read fails -> ambiguous
|
|
283
|
+
return CompletedProcess(cmd, 1, stdout="", stderr="network hiccup")
|
|
284
|
+
return CompletedProcess(cmd, 0, stdout=f'{meta["head"]}\trefs/heads/{meta["branch"]}\n', stderr="")
|
|
285
|
+
if sub[:2] == ["remote", "get-url"]:
|
|
286
|
+
return CompletedProcess(cmd, 0, stdout="https://github.com/owner/repo.git\n", stderr="")
|
|
287
|
+
if cmd[0] == "gh":
|
|
288
|
+
meta = repos[str(kwargs.get("cwd"))]
|
|
289
|
+
if cmd[1:3] == ["pr", "create"]:
|
|
290
|
+
return CompletedProcess(cmd, 0, stdout="", stderr="")
|
|
291
|
+
if cmd[1:3] == ["pr", "list"]:
|
|
292
|
+
return CompletedProcess(cmd, 0, stdout=json.dumps([{"headRefOid": meta["head"], "url": meta["url"]}]), stderr="")
|
|
293
|
+
raise AssertionError(f"unexpected command: {cmd}")
|
|
294
|
+
|
|
295
|
+
broker = build_routing_broker_client(broker_root=tmp_path / "coord", run=fake_run)
|
|
296
|
+
|
|
297
|
+
alpha = broker.execute(_routing_request("/ws/alpha", repos["/ws/alpha"], key="ka"))
|
|
298
|
+
assert not alpha.accepted
|
|
299
|
+
assert alpha.evidence.terminal_state == "outcome_ambiguous_blocked"
|
|
300
|
+
|
|
301
|
+
# beta must still publish — alpha's ambiguous epoch is scoped to alpha's store.
|
|
302
|
+
beta = broker.execute(_routing_request("/ws/beta", repos["/ws/beta"], key="kb"))
|
|
303
|
+
assert beta.accepted, "beta was fail-closed by alpha's ambiguous outcome (shared-epoch poison)"
|
|
304
|
+
assert beta.publish_result.pr_url == repos["/ws/beta"]["url"]
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import shutil
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
# Bound every child process so a hung wheel build / pip dependency resolution /
|
|
13
|
+
# node interchange call fails as TimeoutExpired instead of hanging the suite.
|
|
14
|
+
# Generous ceiling: the wheel build + pip install is the slow leg; node calls
|
|
15
|
+
# are sub-second.
|
|
16
|
+
_SUBPROCESS_TIMEOUT = 300
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _required_root(name: str) -> Path:
|
|
20
|
+
value = os.environ.get(name)
|
|
21
|
+
if not value:
|
|
22
|
+
pytest.skip(f"{name} is required for the SPECPKGMIN cross-repo seam")
|
|
23
|
+
root = Path(value).resolve()
|
|
24
|
+
if not root.is_dir():
|
|
25
|
+
pytest.fail(f"{name} is not a directory: {root}")
|
|
26
|
+
return root
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_installed_wheel_dogfoods_frozen_seams_and_gp_interchange(tmp_path: Path):
|
|
30
|
+
spec_root = _required_root("SPEC_ROOT")
|
|
31
|
+
gp_root = _required_root("GP_ROOT")
|
|
32
|
+
harness_root = _required_root("HARNESS_ROOT")
|
|
33
|
+
assert harness_root == Path(__file__).resolve().parents[2]
|
|
34
|
+
|
|
35
|
+
package_root = spec_root / "packages" / "consiliency-spec-ingest"
|
|
36
|
+
dist = tmp_path / "dist"
|
|
37
|
+
venv = tmp_path / "venv"
|
|
38
|
+
build_source = tmp_path / "package-source"
|
|
39
|
+
shutil.copytree(package_root, build_source, ignore=shutil.ignore_patterns("build", "*.egg-info"))
|
|
40
|
+
subprocess.run(
|
|
41
|
+
[sys.executable, "-m", "build", str(build_source), "--wheel", "--outdir", str(dist)],
|
|
42
|
+
check=True,
|
|
43
|
+
timeout=_SUBPROCESS_TIMEOUT,
|
|
44
|
+
cwd=spec_root,
|
|
45
|
+
)
|
|
46
|
+
wheel = next(dist.glob("*.whl"))
|
|
47
|
+
subprocess.run([sys.executable, "-m", "venv", str(venv)], check=True, timeout=_SUBPROCESS_TIMEOUT)
|
|
48
|
+
python = venv / "bin" / "python"
|
|
49
|
+
subprocess.run([python, "-m", "pip", "install", "--disable-pip-version-check", str(wheel)], check=True, timeout=_SUBPROCESS_TIMEOUT)
|
|
50
|
+
|
|
51
|
+
certificate_path = tmp_path / "certificate.json"
|
|
52
|
+
probe = """
|
|
53
|
+
import json
|
|
54
|
+
import sys
|
|
55
|
+
import consiliency_spec_ingest as ingest
|
|
56
|
+
|
|
57
|
+
result = ingest.evaluate({\"nodes\": []}, {\"nodes\": [], \"revision\": \"specpkgmin-empty\"}, {\"entries\": []}, config={})
|
|
58
|
+
try:
|
|
59
|
+
ingest.ingest_repo(\".\", graph_id=\"specpkgmin\")
|
|
60
|
+
except ingest.CapabilityUnavailable as error:
|
|
61
|
+
unavailable = {\"capability\": error.capability, \"required_extra\": error.required_extra, \"available\": error.available}
|
|
62
|
+
else:
|
|
63
|
+
raise AssertionError(\"ingest_repo must remain unavailable in the base wheel\")
|
|
64
|
+
print(json.dumps({\"certificate\": result[\"certificate\"], \"unavailable\": unavailable, \"loaded\": sorted(sys.modules)}))
|
|
65
|
+
"""
|
|
66
|
+
observed = json.loads(subprocess.run([python, "-c", probe], check=True,
|
|
67
|
+
timeout=_SUBPROCESS_TIMEOUT, text=True, capture_output=True).stdout)
|
|
68
|
+
assert observed["certificate"]["overall_result_state"] == "not_applicable"
|
|
69
|
+
assert observed["unavailable"] == {"capability": "ingest_repo", "required_extra": "ingest", "available": False}
|
|
70
|
+
assert not any(token in name for token in ("spec_brownfield", "treesitter", "canon_core", "realized") for name in observed["loaded"])
|
|
71
|
+
certificate_path.write_text(json.dumps(observed["certificate"]), encoding="utf-8")
|
|
72
|
+
|
|
73
|
+
fixtures = gp_root / "packages" / "pipeline-runtime" / "test" / "fixtures" / "specpkgmin"
|
|
74
|
+
helper = fixtures / "specpkgmin-interchange.mjs"
|
|
75
|
+
command = ["node", str(helper), str(certificate_path), str(fixtures / "canonical-spec-registry.json"), str(fixtures / "catalog-schema.v1.json")]
|
|
76
|
+
interchange = json.loads(subprocess.run(command, cwd=gp_root, check=True,
|
|
77
|
+
timeout=_SUBPROCESS_TIMEOUT, text=True, capture_output=True).stdout)
|
|
78
|
+
assert interchange["result"]["ok"] is True
|
|
79
|
+
assert interchange["result"]["verdict"]["overall_result_state"] == "not_applicable"
|
|
80
|
+
assert interchange["result"]["ratifiable"] is False
|
|
81
|
+
assert interchange["registry_bytes_unchanged"] is True
|
|
82
|
+
assert interchange["catalog_bytes_unchanged"] is True
|
|
83
|
+
|
|
84
|
+
malformed_path = tmp_path / "malformed-vacuity.json"
|
|
85
|
+
malformed = dict(observed["certificate"])
|
|
86
|
+
malformed["vacuity"] = "not-an-object"
|
|
87
|
+
malformed_path.write_text(json.dumps(malformed), encoding="utf-8")
|
|
88
|
+
malformed_result = json.loads(
|
|
89
|
+
subprocess.run(
|
|
90
|
+
["node", str(helper), str(malformed_path), str(fixtures / "canonical-spec-registry.json"), str(fixtures / "catalog-schema.v1.json")],
|
|
91
|
+
cwd=gp_root,
|
|
92
|
+
check=True,
|
|
93
|
+
timeout=_SUBPROCESS_TIMEOUT,
|
|
94
|
+
text=True,
|
|
95
|
+
capture_output=True,
|
|
96
|
+
).stdout
|
|
97
|
+
)
|
|
98
|
+
assert malformed_result["result"]["ok"] is False
|
|
99
|
+
assert malformed_result["result"]["blocker"]["blocker_class"] == "malformed_spec_certificate"
|