phase-loop-runtime 0.7.20__tar.gz → 0.7.21__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.20/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.21}/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/README.md +1 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +104 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/config.py +30 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +6 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/fixtures.py +2 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/registries.py +1 -0
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/agy_provenance.py +313 -0
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/agy_qualification.py +1565 -0
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/agy_watch.py +518 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/cli.py +15 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/gemini_heartbeat.py +160 -36
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/governed_review.py +7 -4
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/launcher.py +116 -124
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/lease_supervisor.py +439 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/panel_invoker.py +17 -4
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21/src/phase_loop_runtime.egg-info}/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime.egg-info/SOURCES.txt +6 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_config.py +47 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_registries.py +14 -0
- phase_loop_runtime-0.7.21/tests/test_agy_self_qualification.py +2741 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_gemini_heartbeat_bootstrap.py +2 -5
- phase_loop_runtime-0.7.21/tests/test_launcher_exec_supervisor.py +1076 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_legible_roadmap_contract.py +6 -6
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_launcher.py +5 -3
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v45_schedharden.py +23 -7
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_qualify_network_owner.py +3 -10
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verify_qualified_agy_route_core.py +2 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/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.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/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.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/advisory_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/president_adapter.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/president_operation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/review_stage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_advisory_cli_802.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_board_static_import_862.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_broker_command_builders.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_broker_staged_tree_delivery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_chronology_scope.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_offload_lock.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_quarantine.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_xdist_adoption.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ci_xdist_witness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_conform_timing_instrumentation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_execfind_falsifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_executor_exited_without_closeout_785.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_activation_promotion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_delta_consumer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_bootstrap_writer_lock_1115.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabpub_zero_history_bootstrap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_frozen_blob_batch_parse.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_panel_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_grok_narrow_reject_231.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_harden_evidence_verifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_legible_review_repairs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_local_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_model_tier_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_native_claude_seat_fill.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_redaction_separation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_owned_command_procfs_1003.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_claude_review_output.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_doc_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_lanes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_leg_status_detail_1096.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_lens_delivery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_tui_workspace_trust_223.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_agent_view_dispatch_409.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pr_readback_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_president_heartbeat_1001.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_president_ladder_config.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_president_wiring.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_presroute_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_presroute_hardening.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_presroute_landed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_public_installer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_qualified_agy_image_set.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_redaction_channel_control_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_monitor_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_policy_govlean_repairs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_stage_binding.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_seat_host_uid_1098.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skill_liveness_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_subscription_scrub_xai_864.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_review_authorization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_review_monitoring_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.21}/tests/test_worktree_index.py +0 -0
{phase_loop_runtime-0.7.20/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.21}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phase-loop-runtime
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.21
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author-email: ViperJuice <viperjuice@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -49,7 +49,7 @@ To install just this runtime package directly:
|
|
|
49
49
|
|
|
50
50
|
```sh
|
|
51
51
|
pip install phase-loop-runtime # latest compatible release
|
|
52
|
-
pip install phase-loop-runtime==0.7.
|
|
52
|
+
pip install phase-loop-runtime==0.7.21 # …or pin an exact version
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -19,7 +19,7 @@ To install just this runtime package directly:
|
|
|
19
19
|
|
|
20
20
|
```sh
|
|
21
21
|
pip install phase-loop-runtime # latest compatible release
|
|
22
|
-
pip install phase-loop-runtime==0.7.
|
|
22
|
+
pip install phase-loop-runtime==0.7.21 # …or pin an exact version
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -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.21"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -735,3 +735,107 @@ root, rejecting failures, omissions and terminal/admission mismatches. Preserve
|
|
|
735
735
|
failed series; diagnose a changed candidate before another attempt. Validation
|
|
736
736
|
uses that host's measured helper images. These receipts do not replace the
|
|
737
737
|
historical bounded-success evidence verifier.
|
|
738
|
+
|
|
739
|
+
The driver lives in the package, `phase_loop_runtime.agy_qualification`; the script
|
|
740
|
+
is a shim over it, so an installed runtime can run it too (agent-harness#1076).
|
|
741
|
+
|
|
742
|
+
### First-use self-qualification (agent-harness#1076)
|
|
743
|
+
|
|
744
|
+
A non-release `agy` image is admitted only by verifying it, never by trusting it.
|
|
745
|
+
|
|
746
|
+
- **Admission classes.** Every Gemini heartbeat leg carries exactly one class in
|
|
747
|
+
its profile evidence (`provider_admission_class`): `release_qualified` (digest in
|
|
748
|
+
`QUALIFIED_IMAGES`), `locally_qualified` (a verified local record), or
|
|
749
|
+
`qualification_candidate` (only inside a qualification run; never counted, never
|
|
750
|
+
persisted). The evidence's `provider_image_sha256` is the admitted image's own digest.
|
|
751
|
+
- **VerifiedImage.** `PATH` is resolved once (a versioned-install symlink to its final
|
|
752
|
+
target), the target is opened once (`O_NOFOLLOW`, regular file, size cap) and read
|
|
753
|
+
into memory; that buffer is hashed and fills a sealed memfd, which is re-hashed.
|
|
754
|
+
Help measurement, the three live operations, board legs and the president execute
|
|
755
|
+
that memfd (an independent, re-hashed read of it per profile) and never open the path
|
|
756
|
+
again.
|
|
757
|
+
- **Admission order.** (1) A release-qualified digest is admitted before any config,
|
|
758
|
+
store or network access. (2) If the user config sets `[agy] self_qualification = false`
|
|
759
|
+
(the repository config cannot), today's `gemini_heartbeat_capability_unavailable`
|
|
760
|
+
refusal is returned and nothing else is read. (3) A `failed` entry refuses
|
|
761
|
+
(`gemini_heartbeat_self_qualification_failed`) with no execution. (4) Help is measured
|
|
762
|
+
from the memfd only after a `provenance` entry verifies against the live key; the
|
|
763
|
+
`qualified` entry is then verified against the full live key, including that help
|
|
764
|
+
digest. (5) Otherwise the image is absent: legs and the president refuse; only the
|
|
765
|
+
whole-board preflight (`_preflight_gemini_heartbeat`) and `phase-loop
|
|
766
|
+
agy-qualification run` go on to first use. Legs re-admit by lookup rather than
|
|
767
|
+
receiving the preflight's Admission object; any future cross-process hand-off of an
|
|
768
|
+
image memfd must reuse the worker's seal check.
|
|
769
|
+
- **Provenance** (coordinator process, nothing executes). Host platform from the running
|
|
770
|
+
host (D4: `linux-{x64,arm64}[-musl]`); the newest `agy_provenance.RECENCY_WINDOW`
|
|
771
|
+
stable releases (no prerelease, no draft); the exact platform asset; its URL equal to
|
|
772
|
+
`https://github.com/google-antigravity/antigravity-cli/releases/download/<tag>/<asset>`;
|
|
773
|
+
a strict `sha256:<hex>` asset digest equal to the streamed archive digest; exactly one
|
|
774
|
+
regular-file `antigravity` member (duplicates and links refuse), stream-hashed and
|
|
775
|
+
never extracted, equal to the image digest. The transport sends no credentials, has
|
|
776
|
+
no proxy support, uses the interpreter's compiled-in OpenSSL trust store (not
|
|
777
|
+
`SSL_CERT_FILE`/`SSL_CERT_DIR`), and follows at most three https redirects within
|
|
778
|
+
GitHub's download hosts. Fetch failure refuses `gemini_heartbeat_provenance_unavailable`;
|
|
779
|
+
no match refuses `gemini_heartbeat_provenance_unverified`.
|
|
780
|
+
- **Behaviour.** Only after the provenance entry is written: help, then the three live
|
|
781
|
+
operations through the packaged driver and the release path's own validators. All
|
|
782
|
+
passing writes the `qualified` entry. Any observed isolation or identity violation (an
|
|
783
|
+
executable outside the helper policy, an unqualified provider image, a writable image
|
|
784
|
+
mount, an unverified network policy, a surviving process, a rejected record) writes a
|
|
785
|
+
`failed` entry at whatever stage it was seen (until `agy-qualification clear`). Only a
|
|
786
|
+
provider that was never observed running, a completion the provider did not answer
|
|
787
|
+
(HTTP 5xx, quota, auth), and our own local failure are transient, and cancellation writes
|
|
788
|
+
nothing. Transients are counted per key; the third consecutive one writes a `failed`
|
|
789
|
+
entry, success resets the count, and `agy-qualification clear` removes it. A lock waiter
|
|
790
|
+
that finds a transient recorded while it waited refuses without running or counting.
|
|
791
|
+
- **Worker gate.** The qualification worker receives the image as an inherited fd and,
|
|
792
|
+
before hashing, requires a regular-file memfd with `F_SEAL_WRITE`, `F_SEAL_GROW`,
|
|
793
|
+
`F_SEAL_SHRINK` and `F_SEAL_SEAL` (`F_SEAL_FUTURE_WRITE` alone is refused). It admits
|
|
794
|
+
the fd as a candidate only if its digest is a release constant (the manual shim and the
|
|
795
|
+
upstream watch's prepared tree) or has a provenance entry for the current runtime
|
|
796
|
+
identity. It sets `PR_SET_PDEATHSIG`, so a killed coordinator leaves no worker.
|
|
797
|
+
- **Store.** `$XDG_STATE_HOME/phase-loop/agy-qualification/hosts/<machine>/`, per user,
|
|
798
|
+
namespaced by machine-id. Directories 0700 and files 0600, owned by the euid, opened
|
|
799
|
+
`O_NOFOLLOW`; otherwise the store is absent to lookups and first use refuses
|
|
800
|
+
(`gemini_heartbeat_self_qualification_store_unsafe`). Every entry is HMAC-SHA256'd under
|
|
801
|
+
a per-host key over its type, the euid, the machine-id and a context recomputed from the
|
|
802
|
+
live key. The qualification entries (`provenance`, `qualified`, `failed`, `member_cache`,
|
|
803
|
+
`transient`) bind the image digest, platform and runtime identity, plus the asset name,
|
|
804
|
+
profile id or help digest as the type requires. The watch's `watch_push` entry binds the
|
|
805
|
+
branch, the version and the route-core base.
|
|
806
|
+
Without a readable machine-id, self-qualification refuses; the release path is unaffected.
|
|
807
|
+
- **Lock.** One `flock` per host namespace; waiters are cancellable and heartbeat (the board
|
|
808
|
+
preflight writes a content-free `agy-qualification.json` progress record into the
|
|
809
|
+
board's stream directory and a line on stderr, throttled per phase), and re-check the
|
|
810
|
+
store after acquiring. Qualification happens once per key per user per host.
|
|
811
|
+
- **Runtime identity (D2).** `__version__` plus the digests of the installed
|
|
812
|
+
`agy_qualification.ROUTE_CORE` files (`gemini_heartbeat.py`, `agy_qualification.py`,
|
|
813
|
+
`agy_provenance.py`), the same tuple `verify_qualified_agy_image.py --route-core` checks.
|
|
814
|
+
- **Counting (D1).** At `governed_review`'s gate (the rule itself is
|
|
815
|
+
`agy_qualification.counts_toward_landing`), a usable heartbeat Gemini leg is a vote at every
|
|
816
|
+
tier only if its recorded class is `release_qualified` or `locally_qualified`. A
|
|
817
|
+
candidate leg, or a leg with no class (including legs from boards run before the class
|
|
818
|
+
existed: re-run the board), cannot approve; a blocking verdict from it still blocks. The
|
|
819
|
+
president's input builder applies the same rule (`agy_qualification.president_input_items`):
|
|
820
|
+
an uncounted non-blocking leg contributes a `not counted` item instead of its review, and an
|
|
821
|
+
uncounted `DISAGREE` keeps its objections. A leg is an agy leg by name or by the
|
|
822
|
+
coordinator's profile evidence. A
|
|
823
|
+
Gemini leg whose admitted digest appears in the reviewed artifact is flagged
|
|
824
|
+
(`gemini_seat_reviews_its_own_pin`, non-gating). Boards admit with the installed base
|
|
825
|
+
runtime, never the reviewed tree.
|
|
826
|
+
- **Upstream watch.** `phase-loop agy-qualification watch` (a host timer on a subscribed
|
|
827
|
+
host; see `docs/ops/agy-upstream-watch.md`) proposes only the Linux x64 glibc release
|
|
828
|
+
route, from a fresh checkout of `main`, and opens a draft PR; it never merges. Each tick
|
|
829
|
+
makes exactly one ref write (a fresh `agy-watch/<version>-<utc>-<random>` branch, pushed
|
|
830
|
+
with an empty-expected-value lease and accepted only when `--porcelain` reports that exact
|
|
831
|
+
ref as newly created) and one object create (the PR). It never updates, force-pushes,
|
|
832
|
+
adopts, closes, edits or deletes anything that existed before the tick; the new PR body
|
|
833
|
+
names the own older PRs it supersedes for a maintainer to close. It requires `origin` to
|
|
834
|
+
have exactly one push URL, pushes to the remote NAME `origin` (never to the printed URL,
|
|
835
|
+
which git would resolve again). It compares no URL strings; a `--dry-run` pre-flight
|
|
836
|
+
must print exactly one `To` block, and the real push exactly one `To` block and one `*` row
|
|
837
|
+
for exactly the new ref. Both pushes carry `--no-verify`; the bot host's git/ssh
|
|
838
|
+
configuration is trusted. It pre-flights its store, records the
|
|
839
|
+
verified pushed oid in its own `watch_push` entry, and reads both the record and the
|
|
840
|
+
created PR back (the PR body's copy is display-only). "Up to date" requires that local record, `headRefOid` and `ls-remote` to
|
|
841
|
+
agree. It refuses when it cannot prove its open-PR listing complete.
|
|
@@ -51,11 +51,14 @@ from .schema import (
|
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
# Recognised keys — anything else is a hard error (no silent drop).
|
|
54
|
-
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president"})
|
|
54
|
+
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president", "agy"})
|
|
55
55
|
# A repository file configures the president ladder only: repo-level boards are not a
|
|
56
56
|
# feature, so a ``[[boards]]`` there is refused rather than silently ignored.
|
|
57
57
|
_KNOWN_REPO_TOP_KEYS: frozenset[str] = frozenset({"president"})
|
|
58
58
|
_KNOWN_PRESIDENT_KEYS: frozenset[str] = frozenset({"ladder"})
|
|
59
|
+
# agent-harness#1076 D3: the USER file's ``[agy] self_qualification = false`` restores the
|
|
60
|
+
# hard refusal of a non-release agy image. A repository file cannot carry it.
|
|
61
|
+
_KNOWN_AGY_KEYS: frozenset[str] = frozenset({"self_qualification"})
|
|
59
62
|
# Repository-level config, relative to the repository root.
|
|
60
63
|
REPO_CONFIG_RELATIVE_PATH = ".agent-harness/advisor-boards.toml"
|
|
61
64
|
_KNOWN_BOARD_KEYS: frozenset[str] = frozenset(
|
|
@@ -212,6 +215,31 @@ def _parse_president(data: Mapping[str, Any], where: str) -> tuple[str, ...] | N
|
|
|
212
215
|
raise BoardConfigError(f"{where} [president] ladder: {exc}") from exc
|
|
213
216
|
|
|
214
217
|
|
|
218
|
+
def _parse_agy(data: Mapping[str, Any], where: str) -> bool:
|
|
219
|
+
"""The user file's ``[agy] self_qualification`` (default ``True``), validated."""
|
|
220
|
+
raw = data.get("agy")
|
|
221
|
+
if raw is None:
|
|
222
|
+
return True
|
|
223
|
+
if not isinstance(raw, Mapping):
|
|
224
|
+
raise BoardConfigError(f"{where}: 'agy' must be a table")
|
|
225
|
+
_reject_unknown(raw.keys(), _KNOWN_AGY_KEYS, f"{where} [agy]")
|
|
226
|
+
return _require_bool(raw, "self_qualification", True, f"{where} [agy]")
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def load_agy_self_qualification(*, path: Path | None = None) -> bool:
|
|
230
|
+
"""D3 (agent-harness#1076): whether first-use self-qualification is enabled.
|
|
231
|
+
|
|
232
|
+
Reads the user file only (this process's ``board_config_path()``). A malformed file
|
|
233
|
+
raises; the admission caller treats any error as opted out (today's refusal).
|
|
234
|
+
"""
|
|
235
|
+
user_path = path if path is not None else board_config_path(None)
|
|
236
|
+
user = _load_toml(user_path)
|
|
237
|
+
if user is None:
|
|
238
|
+
return True
|
|
239
|
+
_reject_unknown(user.keys(), _KNOWN_TOP_KEYS, str(user_path))
|
|
240
|
+
return _parse_agy(user, str(user_path))
|
|
241
|
+
|
|
242
|
+
|
|
215
243
|
def _user_config_path(env: Mapping[str, str] | None) -> Path | None:
|
|
216
244
|
"""The user file for ``env``: resolved from the GIVEN environment only.
|
|
217
245
|
|
|
@@ -343,6 +371,7 @@ def load_boards(
|
|
|
343
371
|
raise BoardConfigError(f"{cfg_path} is not valid TOML: {exc}") from exc
|
|
344
372
|
_reject_unknown(data.keys(), _KNOWN_TOP_KEYS, str(cfg_path))
|
|
345
373
|
_parse_president(data, str(cfg_path)) # a bad [president] fails at load too
|
|
374
|
+
_parse_agy(data, str(cfg_path)) # and a bad [agy] (agent-harness#1076)
|
|
346
375
|
raw_boards = data.get("boards", [])
|
|
347
376
|
if not isinstance(raw_boards, list):
|
|
348
377
|
raise BoardConfigError(f"{cfg_path}: 'boards' must be an array of tables")
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
# Optional: the board a bare `advisor-board` invocation resolves to.
|
|
13
13
|
default_board = "default"
|
|
14
14
|
|
|
15
|
+
# Optional (agent-harness#1076, user file only): first-use self-qualification of a genuine
|
|
16
|
+
# upstream agy release whose digest is not release-qualified. On by default; `false`
|
|
17
|
+
# restores the hard refusal (`gemini_heartbeat_capability_unavailable`).
|
|
18
|
+
# [agy]
|
|
19
|
+
# self_qualification = false
|
|
20
|
+
|
|
15
21
|
# The default board reproduces today's 3-leg panel (byte-for-byte back-compat).
|
|
16
22
|
# Its three seats, in panel-leg order, render to today's exact CLI invocations:
|
|
17
23
|
# codex gpt-6-astra effort=max -> -c model_reasoning_effort=xhigh
|
|
@@ -76,6 +76,8 @@ CANONICAL_VALID_PAIRS: tuple[tuple[str, str], ...] = (
|
|
|
76
76
|
("gpt-6-astra", "codex"),
|
|
77
77
|
("gpt-6-astra", "opencode"),
|
|
78
78
|
("gpt-5.6-sol", "codex"), # legacy default id remains expressible
|
|
79
|
+
("gpt-6-sol", "codex"), # explicit seat on user/ad-hoc boards (not a governed grok stand-in)
|
|
80
|
+
("gpt-6-sol", "opencode"), # same family; matches the production registry's runnable_by
|
|
79
81
|
("claude-sonnet-5", "claude"),
|
|
80
82
|
("claude-opus-5-5", "claude"),
|
|
81
83
|
("claude-fable-5-1", "claude"),
|
|
@@ -256,6 +256,7 @@ class DefaultHarnessRegistry:
|
|
|
256
256
|
_MODEL_DEFS: tuple[tuple[str, str, str], ...] = (
|
|
257
257
|
("gpt-6-astra", "codex", "max"),
|
|
258
258
|
("gpt-5.6-sol", "codex", "max"), # explicit legacy seat (fleet default before 2026-09-04)
|
|
259
|
+
("gpt-6-sol", "codex", "max"), # explicit seat (codex's own default model); not a board default
|
|
259
260
|
("claude-sonnet-5", "claude", "max"),
|
|
260
261
|
("claude-opus-4-8", "claude", "max"),
|
|
261
262
|
# design-model-tier-taxonomy.md: claude-opus-5 is the new Claude heavy model.
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"""Provenance of an upstream agy release asset (agent-harness#1076).
|
|
2
|
+
|
|
3
|
+
Nothing here executes anything. It answers one question in the coordinator process:
|
|
4
|
+
is this exact image digest the ``antigravity`` member of a stable upstream release
|
|
5
|
+
asset for THIS host's platform, whose archive digest equals the digest GitHub
|
|
6
|
+
publishes for that asset?
|
|
7
|
+
|
|
8
|
+
The transport is pinned. It uses ``http.client`` (which has no proxy support), sends no
|
|
9
|
+
``Authorization`` header, never reads ``.netrc``, credential helpers, token or proxy
|
|
10
|
+
variables, and verifies TLS against the interpreter's compiled-in OpenSSL trust store
|
|
11
|
+
(``ssl.get_default_verify_paths().openssl_*``), not ``SSL_CERT_FILE``/``SSL_CERT_DIR``.
|
|
12
|
+
Integrity rests on the published digest, not the URL; redirects are followed over https
|
|
13
|
+
only, to a fixed host allowlist, a bounded number of times.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from hashlib import sha256
|
|
19
|
+
import glob
|
|
20
|
+
import http.client
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import platform as _platform
|
|
24
|
+
import posixpath
|
|
25
|
+
import re
|
|
26
|
+
import ssl
|
|
27
|
+
import sys
|
|
28
|
+
import tarfile
|
|
29
|
+
from urllib.parse import urlsplit
|
|
30
|
+
|
|
31
|
+
REPO = "google-antigravity/antigravity-cli"
|
|
32
|
+
API_HOST = "api.github.com"
|
|
33
|
+
RELEASES_PATH = f"/repos/{REPO}/releases?per_page=30"
|
|
34
|
+
DOWNLOAD_PREFIX = f"https://github.com/{REPO}/releases/download/"
|
|
35
|
+
# GitHub serves release downloads by a 302 from github.com to its asset CDN.
|
|
36
|
+
REDIRECT_HOSTS = frozenset({"github.com", "release-assets.githubusercontent.com",
|
|
37
|
+
"objects.githubusercontent.com"})
|
|
38
|
+
MAX_REDIRECTS = 3
|
|
39
|
+
# The member digest is only knowable by downloading each archive, so a tampered image
|
|
40
|
+
# (which matches nothing) would otherwise download every release on every first use.
|
|
41
|
+
# At least 2, so that a non-pinned in-window build can exercise the path live.
|
|
42
|
+
RECENCY_WINDOW = 4
|
|
43
|
+
MAX_LISTING_BYTES = 4_000_000
|
|
44
|
+
MAX_ARCHIVE_BYTES = 128_000_000
|
|
45
|
+
MAX_MEMBER_BYTES = 250_000_000
|
|
46
|
+
MEMBER_NAME = "antigravity"
|
|
47
|
+
USER_AGENT = "agent-harness-agy-provenance"
|
|
48
|
+
|
|
49
|
+
UNAVAILABLE = "gemini_heartbeat_provenance_unavailable"
|
|
50
|
+
UNVERIFIED = "gemini_heartbeat_provenance_unverified"
|
|
51
|
+
UNSUPPORTED = "gemini_heartbeat_platform_unsupported"
|
|
52
|
+
|
|
53
|
+
_TAG = re.compile(r"[0-9]+\.[0-9]+\.[0-9]+")
|
|
54
|
+
_DIGEST = re.compile(r"sha256:([0-9a-f]{64})")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ProvenanceError(ValueError):
|
|
58
|
+
"""A fixed, content-free provenance diagnostic."""
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass(frozen=True)
|
|
62
|
+
class HostPlatform:
|
|
63
|
+
os: str
|
|
64
|
+
arch: str
|
|
65
|
+
libc: str
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def name(self) -> str:
|
|
69
|
+
return f"{self.os}-{self.arch}" + ("-musl" if self.libc == "musl" else "")
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def asset(self) -> str:
|
|
73
|
+
return f"agy_cli_{self.os}_{self.arch}" + ("_musl" if self.libc == "musl" else "") + ".tar.gz"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass(frozen=True)
|
|
77
|
+
class ReleaseAsset:
|
|
78
|
+
version: str
|
|
79
|
+
name: str
|
|
80
|
+
url: str
|
|
81
|
+
digest: str # the archive's hex sha256, from GitHub's per-asset ``digest``
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class Provenance:
|
|
86
|
+
"""A verified match: ``image_sha256`` is the member of ``asset``."""
|
|
87
|
+
image_sha256: str
|
|
88
|
+
platform: str
|
|
89
|
+
asset: ReleaseAsset
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
_ARCH = {"x86_64": "x64", "amd64": "x64", "aarch64": "arm64", "arm64": "arm64"}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def detect_platform(*, uname=os.uname, libc_ver=_platform.libc_ver,
|
|
96
|
+
musl_loaders=lambda: glob.glob("/lib/ld-musl-*.so.1")) -> HostPlatform:
|
|
97
|
+
"""The RUNNING host's platform (D4). Reads no config and no environment."""
|
|
98
|
+
info = uname()
|
|
99
|
+
if info.sysname != "Linux" or info.machine not in _ARCH:
|
|
100
|
+
raise ProvenanceError(UNSUPPORTED)
|
|
101
|
+
libc = libc_ver(sys.executable)[0]
|
|
102
|
+
if libc == "glibc":
|
|
103
|
+
kind = "glibc"
|
|
104
|
+
elif musl_loaders():
|
|
105
|
+
kind = "musl"
|
|
106
|
+
else:
|
|
107
|
+
raise ProvenanceError(UNSUPPORTED)
|
|
108
|
+
return HostPlatform("linux", _ARCH[info.machine], kind)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _trust_context() -> ssl.SSLContext:
|
|
112
|
+
paths = ssl.get_default_verify_paths()
|
|
113
|
+
cafile = paths.openssl_cafile if paths.openssl_cafile and os.path.isfile(paths.openssl_cafile) else None
|
|
114
|
+
capath = paths.openssl_capath if paths.openssl_capath and os.path.isdir(paths.openssl_capath) else None
|
|
115
|
+
if cafile is None and capath is None:
|
|
116
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
117
|
+
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
|
118
|
+
context.load_verify_locations(cafile=cafile, capath=capath)
|
|
119
|
+
return context
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class _Transport:
|
|
123
|
+
"""https GET with no credentials, no proxy and the compiled-in trust store."""
|
|
124
|
+
|
|
125
|
+
def __init__(self, *, connection=http.client.HTTPSConnection, context_factory=_trust_context,
|
|
126
|
+
timeout: float = 60):
|
|
127
|
+
self.connection, self.context_factory, self.timeout = connection, context_factory, timeout
|
|
128
|
+
|
|
129
|
+
def open(self, url: str, *, accept: str):
|
|
130
|
+
context = self.context_factory()
|
|
131
|
+
for _hop in range(MAX_REDIRECTS + 1):
|
|
132
|
+
parts = urlsplit(url)
|
|
133
|
+
if parts.scheme != "https" or parts.hostname not in REDIRECT_HOSTS | {API_HOST} \
|
|
134
|
+
or parts.port not in (None, 443) or parts.username or parts.password:
|
|
135
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
136
|
+
conn = self.connection(parts.hostname, 443, context=context, timeout=self.timeout)
|
|
137
|
+
target = parts.path + (f"?{parts.query}" if parts.query else "")
|
|
138
|
+
conn.request("GET", target, headers={"Accept": accept, "User-Agent": USER_AGENT})
|
|
139
|
+
response = conn.getresponse()
|
|
140
|
+
if response.status in (301, 302, 303, 307, 308):
|
|
141
|
+
# The Location of an asset download is a signed URL: never logged.
|
|
142
|
+
url = response.getheader("Location") or ""
|
|
143
|
+
response.close()
|
|
144
|
+
conn.close()
|
|
145
|
+
continue
|
|
146
|
+
if response.status != 200:
|
|
147
|
+
response.close()
|
|
148
|
+
conn.close()
|
|
149
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
150
|
+
return response
|
|
151
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def stable_releases(transport: _Transport, *, window: int = RECENCY_WINDOW) -> list[dict]:
|
|
155
|
+
"""The newest ``window`` stable releases (no prerelease, no draft), newest first."""
|
|
156
|
+
try:
|
|
157
|
+
response = transport.open(f"https://{API_HOST}{RELEASES_PATH}", accept="application/vnd.github+json")
|
|
158
|
+
body = response.read(MAX_LISTING_BYTES + 1)
|
|
159
|
+
response.close()
|
|
160
|
+
if len(body) > MAX_LISTING_BYTES:
|
|
161
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
162
|
+
releases = json.loads(body)
|
|
163
|
+
except (OSError, ValueError, http.client.HTTPException) as exc:
|
|
164
|
+
if isinstance(exc, ProvenanceError):
|
|
165
|
+
raise
|
|
166
|
+
raise ProvenanceError(UNAVAILABLE) from exc
|
|
167
|
+
if not isinstance(releases, list):
|
|
168
|
+
raise ProvenanceError(UNAVAILABLE)
|
|
169
|
+
stable = [r for r in releases if isinstance(r, dict) and r.get("draft") is False
|
|
170
|
+
and r.get("prerelease") is False and isinstance(r.get("tag_name"), str)
|
|
171
|
+
and _TAG.fullmatch(r["tag_name"])]
|
|
172
|
+
return stable[:window]
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def release_by_tag(transport: _Transport, tag: str) -> dict:
|
|
176
|
+
"""One stable release by tag (the upstream watch re-fetches already-pinned members)."""
|
|
177
|
+
if not _TAG.fullmatch(tag):
|
|
178
|
+
raise ProvenanceError(UNVERIFIED)
|
|
179
|
+
try:
|
|
180
|
+
response = transport.open(f"https://{API_HOST}/repos/{REPO}/releases/tags/{tag}",
|
|
181
|
+
accept="application/vnd.github+json")
|
|
182
|
+
body = response.read(MAX_LISTING_BYTES + 1)
|
|
183
|
+
response.close()
|
|
184
|
+
release = json.loads(body)
|
|
185
|
+
except (OSError, ValueError, http.client.HTTPException) as exc:
|
|
186
|
+
if isinstance(exc, ProvenanceError):
|
|
187
|
+
raise
|
|
188
|
+
raise ProvenanceError(UNAVAILABLE) from exc
|
|
189
|
+
if (not isinstance(release, dict) or release.get("draft") is not False
|
|
190
|
+
or release.get("prerelease") is not False or release.get("tag_name") != tag):
|
|
191
|
+
raise ProvenanceError(UNVERIFIED)
|
|
192
|
+
return release
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def release_asset(release: dict, host: HostPlatform) -> ReleaseAsset:
|
|
196
|
+
"""The exact platform asset of one release, with its URL and digest checked."""
|
|
197
|
+
tag = release.get("tag_name")
|
|
198
|
+
if not isinstance(tag, str) or not _TAG.fullmatch(tag):
|
|
199
|
+
raise ProvenanceError(UNVERIFIED)
|
|
200
|
+
matches = [a for a in release.get("assets") or () if isinstance(a, dict) and a.get("name") == host.asset]
|
|
201
|
+
if len(matches) != 1:
|
|
202
|
+
raise ProvenanceError(UNVERIFIED)
|
|
203
|
+
asset, = matches
|
|
204
|
+
url, digest = asset.get("browser_download_url"), asset.get("digest")
|
|
205
|
+
if url != f"{DOWNLOAD_PREFIX}{tag}/{host.asset}":
|
|
206
|
+
raise ProvenanceError(UNVERIFIED)
|
|
207
|
+
match = _DIGEST.fullmatch(digest) if isinstance(digest, str) else None
|
|
208
|
+
if match is None:
|
|
209
|
+
raise ProvenanceError(UNVERIFIED)
|
|
210
|
+
return ReleaseAsset(tag, host.asset, url, match.group(1))
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class _HashingReader:
|
|
214
|
+
"""Feed every byte read by the tar reader through the archive digest, with a cap."""
|
|
215
|
+
|
|
216
|
+
def __init__(self, stream):
|
|
217
|
+
self.stream, self.digest, self.size = stream, sha256(), 0
|
|
218
|
+
|
|
219
|
+
def read(self, n=-1):
|
|
220
|
+
chunk = self.stream.read(1024 * 1024 if n is None or n < 0 else n)
|
|
221
|
+
self.size += len(chunk)
|
|
222
|
+
if self.size > MAX_ARCHIVE_BYTES:
|
|
223
|
+
raise ProvenanceError(UNVERIFIED)
|
|
224
|
+
self.digest.update(chunk)
|
|
225
|
+
return chunk
|
|
226
|
+
|
|
227
|
+
def drain(self):
|
|
228
|
+
while self.read(1024 * 1024):
|
|
229
|
+
pass
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _normalized(name: str) -> str:
|
|
233
|
+
return posixpath.normpath(name.lstrip("/"))
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def read_member(stream, asset: ReleaseAsset, *, keep_bytes: bool = False) -> tuple[str, bytes | None]:
|
|
237
|
+
"""Stream-hash the archive and its one ``antigravity`` member; never extract to disk.
|
|
238
|
+
|
|
239
|
+
Exactly one member may normalize to ``antigravity`` and it must be a regular file;
|
|
240
|
+
a duplicate, a link or a device of that name refuses. The archive digest must equal
|
|
241
|
+
the asset's published digest before the member digest is returned.
|
|
242
|
+
"""
|
|
243
|
+
reader = _HashingReader(stream)
|
|
244
|
+
member_digest, member_bytes, seen = None, None, 0
|
|
245
|
+
try:
|
|
246
|
+
with tarfile.open(fileobj=reader, mode="r|gz") as bundle:
|
|
247
|
+
for member in bundle:
|
|
248
|
+
if _normalized(member.name) != MEMBER_NAME:
|
|
249
|
+
continue
|
|
250
|
+
seen += 1
|
|
251
|
+
if seen > 1 or not member.isreg() or member.size > MAX_MEMBER_BYTES:
|
|
252
|
+
raise ProvenanceError(UNVERIFIED)
|
|
253
|
+
handle = bundle.extractfile(member)
|
|
254
|
+
if handle is None:
|
|
255
|
+
raise ProvenanceError(UNVERIFIED)
|
|
256
|
+
h, parts, size = sha256(), [], 0
|
|
257
|
+
while chunk := handle.read(1024 * 1024):
|
|
258
|
+
size += len(chunk)
|
|
259
|
+
if size > MAX_MEMBER_BYTES:
|
|
260
|
+
raise ProvenanceError(UNVERIFIED)
|
|
261
|
+
h.update(chunk)
|
|
262
|
+
if keep_bytes:
|
|
263
|
+
parts.append(chunk)
|
|
264
|
+
member_digest = h.hexdigest()
|
|
265
|
+
member_bytes = b"".join(parts) if keep_bytes else None
|
|
266
|
+
reader.drain()
|
|
267
|
+
except (tarfile.TarError, EOFError, OSError, http.client.HTTPException) as exc:
|
|
268
|
+
raise ProvenanceError(UNAVAILABLE if isinstance(exc, (OSError, http.client.HTTPException)) else UNVERIFIED) from exc
|
|
269
|
+
if seen != 1 or member_digest is None:
|
|
270
|
+
raise ProvenanceError(UNVERIFIED)
|
|
271
|
+
if reader.digest.hexdigest() != asset.digest:
|
|
272
|
+
raise ProvenanceError(UNVERIFIED)
|
|
273
|
+
return member_digest, member_bytes
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def fetch_member(transport: _Transport, asset: ReleaseAsset, *, keep_bytes: bool = False):
|
|
277
|
+
try:
|
|
278
|
+
response = transport.open(asset.url, accept="application/octet-stream")
|
|
279
|
+
except (OSError, http.client.HTTPException) as exc:
|
|
280
|
+
raise ProvenanceError(UNAVAILABLE) from exc
|
|
281
|
+
try:
|
|
282
|
+
return read_member(response, asset, keep_bytes=keep_bytes)
|
|
283
|
+
finally:
|
|
284
|
+
response.close()
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def find_provenance(image_sha256: str, *, host: HostPlatform, transport: _Transport | None = None,
|
|
288
|
+
cached_member=lambda asset: None, remember_member=lambda asset, member: None,
|
|
289
|
+
window: int = RECENCY_WINDOW) -> Provenance:
|
|
290
|
+
"""Match ``image_sha256`` against the in-window stable releases for ``host``.
|
|
291
|
+
|
|
292
|
+
``cached_member``/``remember_member`` are the store's authenticated member-digest
|
|
293
|
+
cache (keyed on the asset digest and runtime identity), so a repeat miss does not
|
|
294
|
+
download again. Any fetch failure refuses UNAVAILABLE; no match refuses UNVERIFIED.
|
|
295
|
+
"""
|
|
296
|
+
transport = transport or _Transport()
|
|
297
|
+
for release in stable_releases(transport, window=window):
|
|
298
|
+
try:
|
|
299
|
+
asset = release_asset(release, host)
|
|
300
|
+
except ProvenanceError:
|
|
301
|
+
continue
|
|
302
|
+
member = cached_member(asset)
|
|
303
|
+
if member is None:
|
|
304
|
+
try:
|
|
305
|
+
member, _ = fetch_member(transport, asset)
|
|
306
|
+
except ProvenanceError as exc:
|
|
307
|
+
if str(exc) == UNAVAILABLE:
|
|
308
|
+
raise
|
|
309
|
+
continue # one malformed asset does not hide older in-window releases
|
|
310
|
+
remember_member(asset, member)
|
|
311
|
+
if member == image_sha256:
|
|
312
|
+
return Provenance(image_sha256, host.name, asset)
|
|
313
|
+
raise ProvenanceError(UNVERIFIED)
|