phase-loop-runtime 0.7.22__tar.gz → 0.7.23__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.22/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.23}/PKG-INFO +4 -3
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/README.md +1 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/pyproject.toml +3 -2
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/__init__.py +1 -1
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/_baml_worker.py +202 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/adoption_bundle.py +3 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +150 -3
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/config.py +48 -1
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_modular.py +2204 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +37 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +14 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +50 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +16 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +20 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +111 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +30 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/phase_loop_bridge.baml +43 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/verification_evidence.baml +40 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/claude_agent_view.py +11 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/base.py +16 -4
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/credential_redaction.py +1 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/evidence_audit.py +17 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/executor_availability.py +10 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/falsifier.py +2 -3
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/gemini_heartbeat.py +3 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/harness_env_signatures.py +5 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/injection.py +4 -5
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/launcher.py +36 -7
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/panel_invoker.py +499 -91
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/president_adapter.py +28 -14
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/review_stage.py +15 -2
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runner.py +127 -58
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/sandbox_egress.py +16 -13
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_placement.py +529 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_policy.py +1037 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_retention.py +384 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23/src/phase_loop_runtime.egg-info}/PKG-INFO +4 -3
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/SOURCES.txt +21 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/requires.txt +2 -1
- phase_loop_runtime-0.7.23/tests/test_agent_cli_scratch_inventory_1147.py +815 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_agy_canary_evidence.py +5 -1
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_executor_exited_without_closeout_785.py +13 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_harden_evidence_verifier.py +135 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_legible_roadmap_contract.py +6 -6
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_dependency.py +31 -5
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_modular.py +0 -19
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_schema_export.py +15 -4
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_schema_source.py +1 -1
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_callers.py +637 -0
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_runtime.py +5321 -0
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_supervisor_slot.py +280 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F001.py +45 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F002.py +31 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F003.py +21 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F004.py +29 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F001.py +17 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F002.py +23 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F003.py +9 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r5_F001.py +16 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r6_F001.py +24 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r7_F001.py +77 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r9_F002.py +26 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_qualified_agy_image_set.py +4 -2
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_stage_binding.py +3 -2
- phase_loop_runtime-0.7.23/tests/test_sandbox_placement.py +1408 -0
- phase_loop_runtime-0.7.23/tests/test_sandbox_staging_1147.py +1410 -0
- phase_loop_runtime-0.7.23/tests/test_scratch_runtime_audit_1147.py +354 -0
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_modular.py +0 -662
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -37
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -14
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -50
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -16
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -20
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -121
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -36
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -40
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/sandbox_policy.py +0 -343
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/sandbox_retention.py +0 -182
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/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.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/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.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/advisory_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_qualification.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_watch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/generated_outputs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lease_supervisor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/president_operation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/seat_preflight.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_advisory_cli_802.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_static_import_862.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_agy_self_qualification.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_agy_single_event_transport_1175.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_broker_command_builders.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_broker_staged_tree_delivery.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_chronology_scope.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_offload_lock.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_quarantine.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_xdist_adoption.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ci_xdist_witness.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_generated_outputs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_conform_timing_instrumentation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_credential_redaction_shapes.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execfind_falsifier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execfind_governed_promotion.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_activation_promotion.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_delta_consumer.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_bootstrap_writer_lock_1115.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabpub_zero_history_bootstrap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_finding_F001.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_frozen_blob_batch_parse.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gemini_heartbeat_bootstrap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_gemini_heartbeat_filesystem_view.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_panel_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_grok_narrow_reject_231.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_launcher_exec_supervisor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_legible_review_repairs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_local_check.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_model_tier_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_native_claude_seat_fill.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_native_fill_refusal_cause.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_redaction_separation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_owned_command_procfs_1003.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_claude_review_output.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_doc_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_lanes.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_status_detail_1096.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_lens_delivery.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_workspace_trust_223.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_dispatch_409.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_plan_manifest_append_order_1174.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pr_readback_789.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_president_heartbeat_1001.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_president_ladder_config.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_president_wiring.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_presroute_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_presroute_hardening.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_presroute_landed.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_public_installer.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_qualify_network_owner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_redaction_channel_control_isolation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_redaction_main_coverage_cases.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_monitor_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_policy_govlean_repairs.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_seat_stall_1176.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_seat_host_uid_1098.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_seat_preflight_1204.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skill_liveness_contract.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_subscription_scrub_xai_864.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_review_authorization.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_review_monitoring_policy.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_verify_qualified_agy_route_core.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/tests/test_worktree_index.py +0 -0
{phase_loop_runtime-0.7.22/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.23}/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.23
|
|
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
|
|
@@ -16,7 +16,8 @@ Classifier: Topic :: Software Development :: Build Tools
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: detect-secrets==1.5.0
|
|
19
|
-
Requires-Dist: baml-
|
|
19
|
+
Requires-Dist: baml-bridge==0.20.1
|
|
20
|
+
Requires-Dist: protobuf<8,>=6.31.1
|
|
20
21
|
Requires-Dist: pydantic<3,>=2
|
|
21
22
|
Requires-Dist: PyYAML<7,>=6
|
|
22
23
|
Requires-Dist: consiliency-contract<0.7,>=0.6.5
|
|
@@ -49,7 +50,7 @@ To install just this runtime package directly:
|
|
|
49
50
|
|
|
50
51
|
```sh
|
|
51
52
|
pip install phase-loop-runtime # latest compatible release
|
|
52
|
-
pip install phase-loop-runtime==0.7.
|
|
53
|
+
pip install phase-loop-runtime==0.7.23 # …or pin an exact version
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
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.23 # …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.23"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -20,7 +20,8 @@ classifiers = [
|
|
|
20
20
|
]
|
|
21
21
|
dependencies = [
|
|
22
22
|
"detect-secrets==1.5.0",
|
|
23
|
-
"baml-
|
|
23
|
+
"baml-bridge==0.20.1",
|
|
24
|
+
"protobuf>=6.31.1,<8",
|
|
24
25
|
"pydantic>=2,<3",
|
|
25
26
|
"PyYAML>=6,<7",
|
|
26
27
|
# PIN (spec-integration v0.3.0): floor at 0.6.3 -- ships the `gate_posture_registry`
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"""BAML v1 worker process for ``phase_loop_runtime.baml_modular`` (agent-harness#1135).
|
|
2
|
+
|
|
3
|
+
This file runs as a standalone script (``python -I -S _baml_worker.py ...``).
|
|
4
|
+
It imports only the standard library and, after ``init``, ``baml_bridge``; it
|
|
5
|
+
never imports ``phase_loop_runtime``. Importing this module has no side
|
|
6
|
+
effects: everything below runs under ``if __name__ == "__main__":``.
|
|
7
|
+
|
|
8
|
+
argv: ``<owner pid> <comma-separated env allowlist keys> [--no-pdeathsig]``.
|
|
9
|
+
|
|
10
|
+
Protocol: one JSON object per line, UTF-8 with ``ensure_ascii=True``. Requests
|
|
11
|
+
arrive on fd 0; responses leave on a dup of fd 1 taken before fd 1 is pointed
|
|
12
|
+
at stderr, so nothing the native runtime prints can corrupt the protocol.
|
|
13
|
+
Every request carries an ``id`` that the response echoes. A response has
|
|
14
|
+
exactly the keys ``{id, fingerprint, <one of ok|error|request|fault>}``.
|
|
15
|
+
|
|
16
|
+
Op table (fixed): ``init``, ``parse_closeout``, ``closeout_request``,
|
|
17
|
+
``evidence_request``, plus ``env`` when ``init`` carried ``test_mode``. An op
|
|
18
|
+
before ``init`` or a second ``init`` is answered with a ``fault``. Any
|
|
19
|
+
exception raised by an op (``BaseException``, including ``BamlPanic``) is
|
|
20
|
+
returned as a ``fault``; the client then discards and kills the worker.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import sys
|
|
28
|
+
|
|
29
|
+
_OP_FUNCTIONS = {
|
|
30
|
+
"parse_closeout": ("user.phase_loop_parse_closeout", ("raw",), ("ok", "error")),
|
|
31
|
+
"closeout_request": (
|
|
32
|
+
"user.phase_loop_closeout_request",
|
|
33
|
+
("phase_alias", "plan_produces", "plan_owned_files", "closeout_commit_sha"),
|
|
34
|
+
("request",),
|
|
35
|
+
),
|
|
36
|
+
"evidence_request": (
|
|
37
|
+
"user.phase_loop_evidence_request",
|
|
38
|
+
("tier2_signal_summary", "sample_artifact_content", "expected_artifact_characteristics"),
|
|
39
|
+
("request",),
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
# The client caps a request frame at 4 MiB + 1 KiB; anything larger here is a
|
|
43
|
+
# client bug or a hostile writer, and is refused rather than buffered forever.
|
|
44
|
+
_MAX_REQUEST_LINE = 4 * 1024 * 1024 + 1024 + 4096
|
|
45
|
+
_WATCHDOG_INTERVAL_S = 0.5
|
|
46
|
+
_PR_SET_PDEATHSIG = 1
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def fingerprint(files: dict[str, str]) -> str:
|
|
50
|
+
canonical = json.dumps(files, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
|
|
51
|
+
return hashlib.sha256(canonical.encode("ascii")).hexdigest()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _set_pdeathsig(owner_pid: int) -> None:
|
|
55
|
+
import ctypes
|
|
56
|
+
import signal
|
|
57
|
+
|
|
58
|
+
# ctypes.CDLL(None) resolves prctl on glibc and musl alike; find_library("c")
|
|
59
|
+
# and "libc.so.6" do not work on musl.
|
|
60
|
+
libc = ctypes.CDLL(None, use_errno=True)
|
|
61
|
+
if libc.prctl(_PR_SET_PDEATHSIG, int(signal.SIGKILL), 0, 0, 0) != 0:
|
|
62
|
+
os._exit(70)
|
|
63
|
+
# The owner may have died between our fork and the prctl.
|
|
64
|
+
if os.getppid() != owner_pid:
|
|
65
|
+
os._exit(0)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _start_watchdog(owner_pid: int) -> None:
|
|
69
|
+
import threading
|
|
70
|
+
import time
|
|
71
|
+
|
|
72
|
+
def watch() -> None:
|
|
73
|
+
while True:
|
|
74
|
+
if os.getppid() != owner_pid:
|
|
75
|
+
os._exit(0)
|
|
76
|
+
time.sleep(_WATCHDOG_INTERVAL_S)
|
|
77
|
+
|
|
78
|
+
threading.Thread(target=watch, name="baml-worker-watchdog", daemon=True).start()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class _Worker:
|
|
82
|
+
def __init__(self, out_fd: int, no_pdeathsig: bool) -> None:
|
|
83
|
+
self.out_fd = out_fd
|
|
84
|
+
self.no_pdeathsig = no_pdeathsig
|
|
85
|
+
self.fp: str | None = None
|
|
86
|
+
self.fns: dict[str, object] | None = None
|
|
87
|
+
self.test_mode = False
|
|
88
|
+
|
|
89
|
+
def send(self, obj: dict) -> None:
|
|
90
|
+
data = (json.dumps(obj, separators=(",", ":"), ensure_ascii=True) + "\n").encode("ascii")
|
|
91
|
+
view = memoryview(data)
|
|
92
|
+
while view:
|
|
93
|
+
written = os.write(self.out_fd, view)
|
|
94
|
+
view = view[written:]
|
|
95
|
+
|
|
96
|
+
def handle(self, line: bytes) -> None:
|
|
97
|
+
req_id = None
|
|
98
|
+
try:
|
|
99
|
+
req = json.loads(line.decode("ascii"))
|
|
100
|
+
if not isinstance(req, dict):
|
|
101
|
+
raise ValueError("request is not a JSON object")
|
|
102
|
+
req_id = req.get("id")
|
|
103
|
+
op = req.get("op")
|
|
104
|
+
if op == "init":
|
|
105
|
+
result = self.init(req)
|
|
106
|
+
self.send({"id": req_id, "fingerprint": self.fp, "ok": result})
|
|
107
|
+
return
|
|
108
|
+
if self.fns is None:
|
|
109
|
+
raise RuntimeError(f"op before init: {op!r}")
|
|
110
|
+
if op == "env" and self.test_mode:
|
|
111
|
+
self.send({"id": req_id, "fingerprint": self.fp, "ok": {"env": sorted(os.environ), "cwd": os.getcwd(), "pid": os.getpid()}})
|
|
112
|
+
return
|
|
113
|
+
if op not in _OP_FUNCTIONS:
|
|
114
|
+
raise RuntimeError(f"unknown op: {op!r}")
|
|
115
|
+
_name, params, keys = _OP_FUNCTIONS[op]
|
|
116
|
+
args = req.get("args")
|
|
117
|
+
if not isinstance(args, dict) or set(args) != set(params):
|
|
118
|
+
raise RuntimeError(f"bad args for {op}")
|
|
119
|
+
out = self.fns[op](**args)
|
|
120
|
+
if not isinstance(out, dict) or len(out) != 1:
|
|
121
|
+
raise RuntimeError(f"bridge {op} returned an unexpected shape")
|
|
122
|
+
((key, value),) = out.items()
|
|
123
|
+
if key not in keys or not isinstance(value, str):
|
|
124
|
+
raise RuntimeError(f"bridge {op} returned key {key!r}")
|
|
125
|
+
self.send({"id": req_id, "fingerprint": self.fp, key: value})
|
|
126
|
+
except BaseException as exc: # noqa: BLE001 - every op failure is a typed fault
|
|
127
|
+
message = f"{type(exc).__module__}.{type(exc).__qualname__}: {str(exc)[:500]}"
|
|
128
|
+
self.send({"id": req_id, "fingerprint": self.fp, "fault": message})
|
|
129
|
+
|
|
130
|
+
def init(self, req: dict) -> dict:
|
|
131
|
+
if self.fns is not None:
|
|
132
|
+
raise RuntimeError("second init")
|
|
133
|
+
self.test_mode = req.get("test_mode") is True
|
|
134
|
+
if self.no_pdeathsig and not self.test_mode:
|
|
135
|
+
raise RuntimeError("--no-pdeathsig requires test_mode")
|
|
136
|
+
for entry in req.get("sys_path") or []:
|
|
137
|
+
if isinstance(entry, str) and os.path.isabs(entry) and entry not in sys.path:
|
|
138
|
+
sys.path.append(entry)
|
|
139
|
+
files = req.get("files")
|
|
140
|
+
if not isinstance(files, dict) or not all(isinstance(k, str) and isinstance(v, str) for k, v in files.items()):
|
|
141
|
+
raise RuntimeError("init files must be a map of strings")
|
|
142
|
+
import baml_bridge
|
|
143
|
+
|
|
144
|
+
baml_bridge.BamlRuntime.initialize_runtime("baml_src", files)
|
|
145
|
+
fns = {op: baml_bridge.define_function(name, "sync", list(params)) for op, (name, params, _keys) in _OP_FUNCTIONS.items()}
|
|
146
|
+
self.fp = fingerprint(files)
|
|
147
|
+
self.fns = fns
|
|
148
|
+
return {"version": baml_bridge.get_version(), "pid": os.getpid()}
|
|
149
|
+
|
|
150
|
+
def serve(self) -> None:
|
|
151
|
+
buf = b""
|
|
152
|
+
while True:
|
|
153
|
+
chunk = os.read(0, 1 << 16)
|
|
154
|
+
if not chunk:
|
|
155
|
+
return # stdin EOF: the graceful shutdown path
|
|
156
|
+
buf += chunk
|
|
157
|
+
while True:
|
|
158
|
+
newline = buf.find(b"\n")
|
|
159
|
+
if newline < 0:
|
|
160
|
+
break
|
|
161
|
+
line, buf = buf[:newline], buf[newline + 1 :]
|
|
162
|
+
self.handle(line)
|
|
163
|
+
if len(buf) > _MAX_REQUEST_LINE:
|
|
164
|
+
self.send({"id": None, "fingerprint": self.fp, "fault": "request line over cap"})
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def main(argv: list[str]) -> int:
|
|
169
|
+
owner_pid = int(argv[1])
|
|
170
|
+
allowlist = {key for key in argv[2].split(",") if key} if len(argv) > 2 else set()
|
|
171
|
+
no_pdeathsig = "--no-pdeathsig" in argv[3:]
|
|
172
|
+
|
|
173
|
+
out_fd = os.dup(1)
|
|
174
|
+
os.dup2(2, 1)
|
|
175
|
+
sys.stdout = sys.stderr
|
|
176
|
+
|
|
177
|
+
# Normalize the environment before baml_bridge is ever imported: this drops
|
|
178
|
+
# interpreter-injected keys (C-locale coercion's LC_CTYPE,
|
|
179
|
+
# __PYVENV_LAUNCHER__) that the parent's allowlist never passed.
|
|
180
|
+
for key in list(os.environ):
|
|
181
|
+
if key not in allowlist:
|
|
182
|
+
del os.environ[key]
|
|
183
|
+
# The v1 runtime keeps a profile store of call data under the working
|
|
184
|
+
# directory (``.baml/profiles-v1``) unless profiling is off. Forced, not
|
|
185
|
+
# defaulted: no call data is ever written to disk, whatever was passed in.
|
|
186
|
+
os.environ["BAML_PROFILE"] = "0"
|
|
187
|
+
os.environ.pop("BAML_PROFILE_DIR", None)
|
|
188
|
+
|
|
189
|
+
if os.name == "posix":
|
|
190
|
+
if sys.platform.startswith("linux") and not no_pdeathsig:
|
|
191
|
+
_set_pdeathsig(owner_pid)
|
|
192
|
+
elif os.getppid() != owner_pid:
|
|
193
|
+
os._exit(0)
|
|
194
|
+
_start_watchdog(owner_pid)
|
|
195
|
+
# Windows: the parent's Job Object (KILL_ON_JOB_CLOSE) enforces owner death.
|
|
196
|
+
|
|
197
|
+
_Worker(out_fd, no_pdeathsig).serve()
|
|
198
|
+
return 0
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
if __name__ == "__main__":
|
|
202
|
+
sys.exit(main(sys.argv))
|
{phase_loop_runtime-0.7.22 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/adoption_bundle.py
RENAMED
|
@@ -16,6 +16,7 @@ C4_DOCUMENT = Path("docs/c4/phase-loop-runtime-c4-document.md")
|
|
|
16
16
|
TASK_CATALOG = Path("docs/tasks/dotfiles-task-catalog.md")
|
|
17
17
|
RUNTIME_PROJECTION_SURFACE = "phase-loop status --runtime-projection --json"
|
|
18
18
|
BAML_SCHEMA_ROOT = Path("vendor/phase-loop-runtime/src/phase_loop_runtime/baml_src")
|
|
19
|
+
BAML_BRIDGE_SOURCE = "phase_loop_bridge.baml"
|
|
19
20
|
ADOPTION_BUNDLE_PATH = Path("docs/adoption/dotfiles-adoption-bundle.json")
|
|
20
21
|
|
|
21
22
|
|
|
@@ -143,6 +144,8 @@ def _source_roots(repo: Path) -> list[dict[str, str]]:
|
|
|
143
144
|
def _schema_refs(repo: Path) -> list[dict[str, str]]:
|
|
144
145
|
refs: list[dict[str, str]] = []
|
|
145
146
|
for path in sorted((repo / BAML_SCHEMA_ROOT).glob("*.baml")):
|
|
147
|
+
if path.name == BAML_BRIDGE_SOURCE:
|
|
148
|
+
continue # host glue with no classes, not a schema (agent-harness#1135 #26)
|
|
146
149
|
source_path = _repo_relative(repo, path)
|
|
147
150
|
refs.append(
|
|
148
151
|
{
|
|
@@ -337,7 +337,153 @@ the caller passes a PATH and the runtime reads it.
|
|
|
337
337
|
(`max_age_s = 24h`) sweep of `pl-panel-*` dirs, called at the top of
|
|
338
338
|
`_default_spawn`. Reclaims dirs leaked when a run is KILLED before the per-run
|
|
339
339
|
`finally: rmtree` (timeout/crash); a concurrent run's fresh dir is never touched,
|
|
340
|
-
and a GC failure can NEVER affect the run (fully swallowed).
|
|
340
|
+
and a GC failure can NEVER affect the run (fully swallowed). It sweeps both the
|
|
341
|
+
current staging root and the system temp dir, where releases before
|
|
342
|
+
agent-harness#1147 staged.
|
|
343
|
+
- **Staging root and retention (agent-harness#1147, `sandbox_policy`).**
|
|
344
|
+
- **Invariant.** Sandbox staging and spawned-CLI scratch are never RAM-backed while a
|
|
345
|
+
disk-backed candidate is usable. Otherwise they run in a typed DEGRADED mode
|
|
346
|
+
(`ScratchLocation.degraded`): one warning and hard-clamped retention, and the round is
|
|
347
|
+
never crashed. `PHASE_LOOP_SANDBOX_REFUSE_RAM=1` refuses instead (leg detail
|
|
348
|
+
`env_failure: no disk-backed scratch and RAM fallback refused`).
|
|
349
|
+
- **RAM-backed** means a Linux tmpfs or ramfs, identified by the device serving the path
|
|
350
|
+
(`st_dev` matched against `/proc/self/mountinfo`), so overmounts and moved mounts are
|
|
351
|
+
judged correctly. macOS and Windows temp dirs count as disk.
|
|
352
|
+
- **Named exceptions**, each a typed scratch decision (`child_scratch_env`): the agy
|
|
353
|
+
qualification and capture jails keep a tmpfs `/tmp` and their frozen env, because they
|
|
354
|
+
are qualification evidence (follow-up agent-harness#1179); and the Gemini HEARTBEAT
|
|
355
|
+
seat's jail mounts its own private `/tmp` (agent-harness#1181). Neither covers a
|
|
356
|
+
bounded Gemini leg or the bounded Gemini president, which run on the host.
|
|
357
|
+
- **Staging root.** Each round's `pl-panel-*` scratch, and the sandbox clone inside it,
|
|
358
|
+
is created under `staging_root()`. That is `PHASE_LOOP_SANDBOX_STAGING_DIR` when set;
|
|
359
|
+
otherwise `phase-loop/sandboxes` in the platform's per-user cache dir (`$XDG_CACHE_HOME`
|
|
360
|
+
or `~/.cache` on Linux, `~/Library/Caches` on macOS, `%LOCALAPPDATA%` on Windows); else
|
|
361
|
+
the system temp dir when it is not RAM-backed. `TMPDIR` is not the override. The
|
|
362
|
+
launcher's agy review copy (without a run log) and the falsifier's stage and
|
|
363
|
+
dependency snapshot use the same root. Every directory the runtime creates below the
|
|
364
|
+
cache dir is created 0700 and must be a real directory owned by this account.
|
|
365
|
+
- **Capacity.** Filesystem size comes from `shutil.disk_usage`, which works on every
|
|
366
|
+
platform.
|
|
367
|
+
- Retention ceiling: `min(PHASE_LOOP_SANDBOX_MAX_TOTAL_BYTES (40 GiB), 25% of the
|
|
368
|
+
filesystem)`, or 10% on a RAM-backed one.
|
|
369
|
+
- Default floor: 2 GiB capped at 25% of the filesystem, or 25% of a RAM-backed one.
|
|
370
|
+
- A floor that is configured (by the setting's presence) is used verbatim.
|
|
371
|
+
- **Reaping.** Before a round is refused for space, retained sandboxes are reaped
|
|
372
|
+
oldest-first. The TTL, footprint and free-space reaps all skip a sandbox whose owning
|
|
373
|
+
process is still running. The owner marker is published atomically (temp file, fsync,
|
|
374
|
+
rename).
|
|
375
|
+
- **Other knobs:** `PHASE_LOOP_SANDBOX_ROOT` (the selected root, recorded in the
|
|
376
|
+
evidence; see the placement seam below), `PHASE_LOOP_SANDBOX_REMOTE_REQUIRED`,
|
|
377
|
+
`PHASE_LOOP_SANDBOX_TTL_S` (24 h), `PHASE_LOOP_SANDBOX_PROBE_TIMEOUT_S`,
|
|
378
|
+
`PHASE_LOOP_SANDBOX_ARCHIVE_DEST`, `PHASE_LOOP_SANDBOX_DISABLE`.
|
|
379
|
+
- **Sandbox placement seam (agent-harness#896, `sandbox_placement`).** One vendor-neutral
|
|
380
|
+
seam, several backends. The built-in `LocalBackend` is today's path; a remote host or a
|
|
381
|
+
cloud sandbox registers a backend under a URL scheme, directly or through the
|
|
382
|
+
`phase_loop_runtime.placement_backends` entry-point group, which is loaded only when a
|
|
383
|
+
configured root names that scheme. Core names no vendor.
|
|
384
|
+
- **Phases, in order, for every backend.** `prepare` is runtime code
|
|
385
|
+
(`prepare_local_stage`: stage locally, owning the partial stage until it returns), never
|
|
386
|
+
a backend method. The runtime's revalidations then run against that local stage,
|
|
387
|
+
unchanged. `commit` transfers the revalidated stage (a no-op locally); it owns any
|
|
388
|
+
partial remote state until it returns and the backend recomputes the digest. `execute` /
|
|
389
|
+
`wait` / `cancel` / `renew` are the runtime's own launch branches locally. `release`
|
|
390
|
+
removes the stage. Code never leaves the operator's custody before revalidation.
|
|
391
|
+
- **Launch is final.** Once `execute` is called, even if it raised, the attempt is
|
|
392
|
+
launched: it never falls back to local, and a retry in the same round reuses the same
|
|
393
|
+
backend or refuses.
|
|
394
|
+
- **Receipts.** Backends return `BackendReceipt`s only. Only the runtime builds a
|
|
395
|
+
`PlacementReceipt(attested_by="runtime")`, for a step it performed and observed
|
|
396
|
+
(`prepared`, `committed`, `launched` -- `execute` called, or a local provider process
|
|
397
|
+
the runtime started, counted once `Popen` returned; a launch that fails to exec is not
|
|
398
|
+
one, and infrastructure launches such as the egress namespace holder and its uplink are
|
|
399
|
+
never counted -- and `completed`). A backend's claim is recorded as `attested_by="backend"`. Every
|
|
400
|
+
receipt carries `sandbox_ref` (`[A-Za-z0-9._:-]{1,128}`, anything else refuses the
|
|
401
|
+
placement) and `snapshot_sha256`, which the runtime computes from the local stage.
|
|
402
|
+
- **`sandbox_root_applied`.** Local: the built-in backend, no host, and the root is the
|
|
403
|
+
stage's parent. Non-local: runtime-attested `committed` and `completed` share one
|
|
404
|
+
`sandbox_ref`, both carry the authorization's staged-tree digest, the leg spawned no
|
|
405
|
+
local provider, and any backend receipts agree. Backend receipts alone never make it
|
|
406
|
+
true. `sandbox_staged_at` is the path locally and `<scheme>:<sandbox_ref>` otherwise.
|
|
407
|
+
- **Capabilities and declarations.** `capabilities()` is what a backend can enforce, from
|
|
408
|
+
a closed set (`private_ranges_unreachable`, `public_egress`, `private_allowlist`,
|
|
409
|
+
`inbound_closed`, `filesystem_confined`, `uid_isolated`, `bounding_set_empty`,
|
|
410
|
+
`seccomp_filtered`, `resource_bounded`, `one_shot_secret_channel`, `operator_custody`).
|
|
411
|
+
`verified` maps a capability verified for this placement to `runtime_end_to_end` (only
|
|
412
|
+
the runtime writes it) or `backend_attested`, and is a subset of `capabilities()`.
|
|
413
|
+
`LocalBackend.capabilities()` is empty: local egress and uid facts stay in their own
|
|
414
|
+
fields. `declaration()` names the backend's egress residuals (closed kinds, each with
|
|
415
|
+
`closed_in_guest`), the control-plane variables it injects into the guest (values
|
|
416
|
+
redacted), and `max_lifetime_s`.
|
|
417
|
+
- **Roots.** `PHASE_LOOP_SANDBOX_ROOT` is the single-root form. Otherwise the user
|
|
418
|
+
config's `[sandbox]` table in `advisor-boards.toml` names one root per remote backend
|
|
419
|
+
(`roots.self-hosted = "https://…"`, `roots.e2b = "e2b://…"`) and the order to try them
|
|
420
|
+
(`order`, default `["self-hosted", "e2b"]`; named roots it omits follow in file order).
|
|
421
|
+
The single root is an alias for one backend and, when set, the only candidate. A
|
|
422
|
+
malformed table or unknown key raises `sandbox_config_invalid`; a repository file cannot
|
|
423
|
+
carry `[sandbox]`. Candidates are tried in order and the first usable one is chosen;
|
|
424
|
+
each one passed over adds `<name>: <reason>` to `sandbox_root_reason`.
|
|
425
|
+
- **Root parsing.** A value is stripped; anything containing `://` is a URL and keeps only
|
|
426
|
+
scheme, host, port and path. A malformed scheme (`sandbox_root_scheme_invalid`), a
|
|
427
|
+
built-in scheme written as a URL (`sandbox_root_scheme_builtin`), and a non-URL value
|
|
428
|
+
with `user:…@` or a query (`sandbox_root_unrecognised`) are refused without a probe and
|
|
429
|
+
rendered as a placeholder. No warning, reason, recorded path or probe argument is built
|
|
430
|
+
from the configured text; all use the parsed form.
|
|
431
|
+
- **Execution gate.** A build calls a non-local backend's methods only if its own driver
|
|
432
|
+
executes on that backend (`panel_invoker._NONLOCAL_EXECUTION_DRIVER`). This release has
|
|
433
|
+
no such driver: root selection passes over every non-local backend before `prepare` and
|
|
434
|
+
before any of its methods, and the leg falls back to local with
|
|
435
|
+
`sandbox_root_fell_back=true` and a reason naming the root and
|
|
436
|
+
`sandbox_placement_driver_unavailable`.
|
|
437
|
+
- **Fail-closed knob.** `PHASE_LOOP_SANDBOX_REMOTE_REQUIRED` (`1`/`true`/`yes`/`on`; any
|
|
438
|
+
unrecognised value is on) refuses a seat leg -- every review-mode leg `_default_spawn`
|
|
439
|
+
launches for a board seat, tree or no tree -- unless the runtime ran it through a remote
|
|
440
|
+
backend's `execute`. Exemption is by execution, never by where placement came from, so
|
|
441
|
+
in this release it refuses every seat leg, before any root is probed or anything is
|
|
442
|
+
staged, with detail `sandbox_placement_required_unavailable`. Advisory-mode boards are
|
|
443
|
+
not seat legs and are not governed by it.
|
|
444
|
+
- **Evidence.** The leg's placement record (`sandbox_placement_backend`,
|
|
445
|
+
`sandbox_placement_receipts`, `sandbox_placement_verified`,
|
|
446
|
+
`sandbox_local_provider_spawns`, `sandbox_snapshot_sha256` -- the authorization's
|
|
447
|
+
digest) is recorded right after `prepare` and travels on
|
|
448
|
+
`PanelLegResult.sandbox_placement_evidence` on every exit, failures included; the
|
|
449
|
+
runner persists it in the leg's `implementation-panel-<leg>.json`. The local spawn count
|
|
450
|
+
is read when the record is serialized. Every exit, including egress teardown raising,
|
|
451
|
+
releases the stage and resets the leg's facts and spawn counter. A brokered leg's broker evidence
|
|
452
|
+
carries the same keys, and `scripts/verify_harden_evidence.py` enumerates them and
|
|
453
|
+
checks the `applied` rule for the recorded backend.
|
|
454
|
+
- **Spawned CLI scratch (agent-harness#1147, `fill_child_tmp_env`).** Agent CLIs write
|
|
455
|
+
large scratch of their own; Claude Code uses `$CLAUDE_CODE_TMPDIR`, else the temp dir
|
|
456
|
+
(`/tmp/claude-<uid>`).
|
|
457
|
+
- **What is filled.** Each of `TMPDIR` and `CLAUDE_CODE_TMPDIR` that the child env does
|
|
458
|
+
not already set is judged against its own default destination. If that destination is
|
|
459
|
+
RAM-backed, the variable is set to a private (0700, ours) disk-backed per-user dir that
|
|
460
|
+
is above its free-space floor: `phase-loop/tmp` in the cache dir, else
|
|
461
|
+
`phase-loop-<uid>/tmp` under the temp dir.
|
|
462
|
+
- **Where it applies.** Every review-provider launch: `panel_invoker.launch_provider` /
|
|
463
|
+
`run_provider` apply `child_scratch_env` to the env they launch with, and only the
|
|
464
|
+
named exceptions can opt out (`child_scratch=`). The env builders fill too, so the
|
|
465
|
+
recorded provider evidence matches the launch: board legs and advisory seats
|
|
466
|
+
(`_subscription_env`, the `_exec_leg` explicit-env route), brokered legs including
|
|
467
|
+
bounded Gemini, and both presidents (`_broker_leg_env`). Outside the provider
|
|
468
|
+
interface: executors (`child_executor_env`) and convergence adapters
|
|
469
|
+
(`_child_environment`). The Agent View executor's `claude --bg` goes through the
|
|
470
|
+
interface: `ClaudeAgentViewAdapter`'s default runner calls `run_provider` with an
|
|
471
|
+
explicit env. A bounded brokered agy leg's owned HOME is created in the
|
|
472
|
+
relocated dir as well. A decision returns a `DecidedEnv` labelled
|
|
473
|
+
`PHASE_LOOP_SCRATCH_DECIDED=<decision>` and recorded by object identity
|
|
474
|
+
(`sandbox_policy.decided_scratch`). The test suite's audit hook
|
|
475
|
+
(`tests/_scratch_audit_hook.py`) -- a regression tripwire, not an adversarial boundary
|
|
476
|
+
-- fails any test in which the runtime spawns an agent CLI, named from the runtime's own
|
|
477
|
+
harness registries, with an env object that is not one a decision returned, whatever
|
|
478
|
+
API spawns it. That is the completeness check. `tests/test_agent_cli_scratch_inventory_1147.py` is a static early
|
|
479
|
+
warning: it enumerates every process launch in the package and fails on one with no
|
|
480
|
+
stated decision. It is conservative: an unresolvable use of a launch-capable module (a computed `getattr`,
|
|
481
|
+
`__dict__`, the module as a value, a dynamic import, `exec`/`eval`) needs a stated
|
|
482
|
+
decision too. Env builders (`_broker_subscription_env`, `scrub_subscription_env`)
|
|
483
|
+
take no decision; each route decides after building, so a named exception is never
|
|
484
|
+
refused by a relocation it is exempt from.
|
|
485
|
+
- **Overrides.** A value the caller set is never overridden. The brokered allowlist
|
|
486
|
+
still drops ambient values, so there only the runtime's own dir can appear.
|
|
341
487
|
- **Golden byte-identity preserved.** No ref ⇒ identical staged bytes ⇒ identical
|
|
342
488
|
per-leg argv / env / timeout. `tests/test_advisor_board_golden.py` (Proof A hits
|
|
343
489
|
`_exec_leg`; Proof B injects `spawn=`) is untouched;
|
|
@@ -742,8 +888,9 @@ The Linux x64 subscription `agy` entry image must match one member of the closed
|
|
|
742
888
|
set `gemini_heartbeat.QUALIFIED_IMAGES`: 1.2.11 SHA256
|
|
743
889
|
`ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56`, 1.2.12 SHA256
|
|
744
890
|
`ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca`, 1.2.14 SHA256
|
|
745
|
-
`0d0d3eba22daf29504dd290151c7ed9a4d33b0c6aa0acfc5da27bc3b01d2f029
|
|
746
|
-
`5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164
|
|
891
|
+
`0d0d3eba22daf29504dd290151c7ed9a4d33b0c6aa0acfc5da27bc3b01d2f029`, 1.2.15 SHA256
|
|
892
|
+
`5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164` or 1.2.16 SHA256
|
|
893
|
+
`a759ce7c7a235d9b6c281a25ead97cbbf2e92314a3ffd224e2f9144f3fae7a86`. Each member
|
|
747
894
|
carries its measured help digest and has its own qualification record; the
|
|
748
895
|
evidence catalog and the runtime set must name exactly the same members.
|
|
749
896
|
The running Python/kernel must support sealed memfds, pidfds and pidfd signaling;
|
|
@@ -30,6 +30,7 @@ from __future__ import annotations
|
|
|
30
30
|
from collections.abc import Mapping
|
|
31
31
|
from dataclasses import dataclass
|
|
32
32
|
from pathlib import Path
|
|
33
|
+
import re
|
|
33
34
|
from typing import Any, Callable
|
|
34
35
|
|
|
35
36
|
try: # Python 3.11+
|
|
@@ -51,7 +52,7 @@ from .schema import (
|
|
|
51
52
|
)
|
|
52
53
|
|
|
53
54
|
# Recognised keys — anything else is a hard error (no silent drop).
|
|
54
|
-
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president", "agy"})
|
|
55
|
+
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president", "agy", "sandbox"})
|
|
55
56
|
# A repository file configures the president ladder only: repo-level boards are not a
|
|
56
57
|
# feature, so a ``[[boards]]`` there is refused rather than silently ignored.
|
|
57
58
|
_KNOWN_REPO_TOP_KEYS: frozenset[str] = frozenset({"president"})
|
|
@@ -59,6 +60,11 @@ _KNOWN_PRESIDENT_KEYS: frozenset[str] = frozenset({"ladder"})
|
|
|
59
60
|
# agent-harness#1076 D3: the USER file's ``[agy] self_qualification = false`` restores the
|
|
60
61
|
# hard refusal of a non-release agy image. A repository file cannot carry it.
|
|
61
62
|
_KNOWN_AGY_KEYS: frozenset[str] = frozenset({"self_qualification"})
|
|
63
|
+
# agent-harness#896: the USER file's ``[sandbox]`` names one root per remote placement
|
|
64
|
+
# backend and the order to try them in. A repository file cannot carry it: roots name hosts.
|
|
65
|
+
_KNOWN_SANDBOX_KEYS: frozenset[str] = frozenset({"roots", "order"})
|
|
66
|
+
DEFAULT_SANDBOX_BACKEND_ORDER: tuple[str, ...] = ("self-hosted", "e2b")
|
|
67
|
+
_SANDBOX_BACKEND_NAME = re.compile(r"[a-z0-9][a-z0-9-]{0,62}")
|
|
62
68
|
# Repository-level config, relative to the repository root.
|
|
63
69
|
REPO_CONFIG_RELATIVE_PATH = ".agent-harness/advisor-boards.toml"
|
|
64
70
|
_KNOWN_BOARD_KEYS: frozenset[str] = frozenset(
|
|
@@ -226,6 +232,46 @@ def _parse_agy(data: Mapping[str, Any], where: str) -> bool:
|
|
|
226
232
|
return _require_bool(raw, "self_qualification", True, f"{where} [agy]")
|
|
227
233
|
|
|
228
234
|
|
|
235
|
+
def _parse_sandbox(data: Mapping[str, Any], where: str) -> tuple[tuple[str, str], ...]:
|
|
236
|
+
"""The user file's ``[sandbox]``, validated: ``(name, root)`` in the order to try them."""
|
|
237
|
+
raw = data.get("sandbox")
|
|
238
|
+
if raw is None:
|
|
239
|
+
return ()
|
|
240
|
+
if not isinstance(raw, Mapping):
|
|
241
|
+
raise BoardConfigError(f"{where}: 'sandbox' must be a table")
|
|
242
|
+
_reject_unknown(raw.keys(), _KNOWN_SANDBOX_KEYS, f"{where} [sandbox]")
|
|
243
|
+
roots = raw.get("roots", {})
|
|
244
|
+
if not isinstance(roots, Mapping):
|
|
245
|
+
raise BoardConfigError(f"{where} [sandbox]: 'roots' must be a table")
|
|
246
|
+
for name, root in roots.items():
|
|
247
|
+
# The root is never echoed: it may carry a credential.
|
|
248
|
+
if not isinstance(name, str) or not _SANDBOX_BACKEND_NAME.fullmatch(name):
|
|
249
|
+
raise BoardConfigError(f"{where} [sandbox] roots: invalid backend name")
|
|
250
|
+
if not isinstance(root, str) or not root.strip():
|
|
251
|
+
raise BoardConfigError(f"{where} [sandbox] roots.{name}: must be a non-empty string")
|
|
252
|
+
order = raw.get("order", list(DEFAULT_SANDBOX_BACKEND_ORDER))
|
|
253
|
+
if (
|
|
254
|
+
not isinstance(order, list)
|
|
255
|
+
or any(not isinstance(n, str) or not _SANDBOX_BACKEND_NAME.fullmatch(n) for n in order)
|
|
256
|
+
or len(set(order)) != len(order)
|
|
257
|
+
):
|
|
258
|
+
raise BoardConfigError(f"{where} [sandbox] order: must be a list of distinct backend names")
|
|
259
|
+
ranked = [n for n in order if n in roots] + [n for n in roots if n not in order]
|
|
260
|
+
return tuple((name, str(roots[name]).strip()) for name in ranked)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def load_sandbox_roots(*, path: Path | None = None) -> tuple[tuple[str, str], ...]:
|
|
264
|
+
"""agent-harness#896: the configured remote placement roots, ``(backend name, root)``,
|
|
265
|
+
first to try first. Named roots the ``order`` omits follow, in file order. Reads the
|
|
266
|
+
user file only. A malformed table or an unknown key is a ``BoardConfigError``."""
|
|
267
|
+
user_path = path if path is not None else board_config_path(None)
|
|
268
|
+
user = _load_toml(user_path)
|
|
269
|
+
if user is None:
|
|
270
|
+
return ()
|
|
271
|
+
_reject_unknown(user.keys(), _KNOWN_TOP_KEYS, str(user_path))
|
|
272
|
+
return _parse_sandbox(user, str(user_path))
|
|
273
|
+
|
|
274
|
+
|
|
229
275
|
def load_agy_self_qualification(*, path: Path | None = None) -> bool:
|
|
230
276
|
"""D3 (agent-harness#1076): whether first-use self-qualification is enabled.
|
|
231
277
|
|
|
@@ -372,6 +418,7 @@ def load_boards(
|
|
|
372
418
|
_reject_unknown(data.keys(), _KNOWN_TOP_KEYS, str(cfg_path))
|
|
373
419
|
_parse_president(data, str(cfg_path)) # a bad [president] fails at load too
|
|
374
420
|
_parse_agy(data, str(cfg_path)) # and a bad [agy] (agent-harness#1076)
|
|
421
|
+
_parse_sandbox(data, str(cfg_path)) # and a bad [sandbox] (agent-harness#896)
|
|
375
422
|
raw_boards = data.get("boards", [])
|
|
376
423
|
if not isinstance(raw_boards, list):
|
|
377
424
|
raise BoardConfigError(f"{cfg_path}: 'boards' must be an array of tables")
|