phase-loop-runtime 0.7.20__tar.gz → 0.7.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {phase_loop_runtime-0.7.20/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.22}/PKG-INFO +8 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/README.md +7 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +232 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/backing.py +99 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/config.py +30 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +6 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/fixtures.py +5 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/registries.py +3 -0
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/agy_provenance.py +313 -0
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/agy_qualification.py +1565 -0
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/agy_watch.py +518 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/cli.py +87 -4
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/closeout_classifier.py +121 -34
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/live.py +136 -48
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/credential_redaction.py +488 -0
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/falsifier.py +270 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/gemini_heartbeat.py +166 -36
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/generated_outputs.py +843 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/governed_premerge.py +5 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/governed_review.py +280 -6
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/launcher.py +116 -124
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/lease_supervisor.py +439 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/observability.py +3 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/panel_invoker.py +763 -161
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +3 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/plan_manifest.py +118 -57
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/prompts.py +84 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/publishing.py +413 -11
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/redaction.py +0 -5
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/review_stage.py +1163 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/runner.py +42 -17
- phase_loop_runtime-0.7.22/src/phase_loop_runtime/seat_preflight.py +170 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +2 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +2 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/train_runner.py +3 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/verification_evidence.py +52 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22/src/phase_loop_runtime.egg-info}/PKG-INFO +8 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime.egg-info/SOURCES.txt +21 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_config.py +47 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_registries.py +65 -0
- phase_loop_runtime-0.7.22/tests/test_agy_self_qualification.py +2741 -0
- phase_loop_runtime-0.7.22/tests/test_agy_single_event_transport_1175.py +187 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_classifier.py +16 -6
- phase_loop_runtime-0.7.22/tests/test_closeout_generated_outputs.py +1418 -0
- phase_loop_runtime-0.7.22/tests/test_credential_redaction_shapes.py +502 -0
- phase_loop_runtime-0.7.22/tests/test_execfind_governed_promotion.py +441 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_executor_exited_without_closeout_785.py +42 -2
- phase_loop_runtime-0.7.22/tests/test_fabpub_zero_history_bootstrap.py +1631 -0
- phase_loop_runtime-0.7.22/tests/test_finding_F001.py +28 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_gemini_heartbeat_bootstrap.py +26 -8
- phase_loop_runtime-0.7.22/tests/test_gemini_heartbeat_filesystem_view.py +262 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_review.py +3 -2
- phase_loop_runtime-0.7.22/tests/test_launcher_exec_supervisor.py +1076 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_legible_roadmap_contract.py +6 -6
- phase_loop_runtime-0.7.22/tests/test_native_fill_refusal_cause.py +111 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_claude_review_output.py +3 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_tui_liveness_188.py +66 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_launcher.py +5 -3
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v45_schedharden.py +23 -7
- phase_loop_runtime-0.7.22/tests/test_plan_manifest_append_order_1174.py +205 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pr_readback_789.py +4 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_president_heartbeat_1001.py +4 -1
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_publishing.py +511 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_qualified_agy_image_set.py +6 -2
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_qualify_network_owner.py +3 -10
- phase_loop_runtime-0.7.22/tests/test_redaction_main_coverage_cases.py +57 -0
- phase_loop_runtime-0.7.22/tests/test_review_seat_stall_1176.py +1432 -0
- phase_loop_runtime-0.7.22/tests/test_review_stage_binding.py +1913 -0
- phase_loop_runtime-0.7.22/tests/test_seat_preflight_1204.py +461 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verify_qualified_agy_route_core.py +2 -1
- phase_loop_runtime-0.7.20/src/phase_loop_runtime/review_stage.py +0 -456
- phase_loop_runtime-0.7.20/tests/test_fabpub_zero_history_bootstrap.py +0 -582
- phase_loop_runtime-0.7.20/tests/test_review_stage_binding.py +0 -183
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/advisory_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/president_adapter.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/president_operation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_advisory_cli_802.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_board_static_import_862.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_broker_command_builders.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_broker_staged_tree_delivery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_chronology_scope.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_offload_lock.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_quarantine.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_xdist_adoption.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ci_xdist_witness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_conform_timing_instrumentation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_execfind_falsifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_activation_promotion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_delta_consumer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_bootstrap_writer_lock_1115.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_frozen_blob_batch_parse.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_panel_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_grok_narrow_reject_231.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_harden_evidence_verifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_legible_review_repairs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_local_check.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_model_tier_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_native_claude_seat_fill.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_redaction_separation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_owned_command_procfs_1003.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_doc_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_lanes.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_leg_status_detail_1096.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_lens_delivery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_tui_workspace_trust_223.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_agent_view_dispatch_409.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_president_ladder_config.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_president_wiring.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_presroute_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_presroute_hardening.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_presroute_landed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_public_installer.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_redaction_channel_control_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_monitor_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_policy_govlean_repairs.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_seat_host_uid_1098.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skill_liveness_contract.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_subscription_scrub_xai_864.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_review_authorization.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_review_monitoring_policy.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.20 → phase_loop_runtime-0.7.22}/tests/test_worktree_index.py +0 -0
{phase_loop_runtime-0.7.20/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.22}/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.22
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author-email: ViperJuice <viperjuice@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -49,7 +49,7 @@ To install just this runtime package directly:
|
|
|
49
49
|
|
|
50
50
|
```sh
|
|
51
51
|
pip install phase-loop-runtime # latest compatible release
|
|
52
|
-
pip install phase-loop-runtime==0.7.
|
|
52
|
+
pip install phase-loop-runtime==0.7.22 # …or pin an exact version
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -288,6 +288,12 @@ closeout, the persisted `terminal-summary.json` reflects the runner's blocking v
|
|
|
288
288
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
289
289
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
290
290
|
|
|
291
|
+
The `phase-loop-closeout-audit --repo .` command grades **ignored** paths by producer. It
|
|
292
|
+
accepts harness handoffs that carry the handoff contract, and a project's declared build
|
|
293
|
+
outputs backed by a recorded producer run. Declare those outputs in a committed
|
|
294
|
+
`.phase-loop-generated-outputs.json`; anything else still blocks. See
|
|
295
|
+
`docs/phase-loop/closeout-generated-outputs.md` (agent-harness#1139).
|
|
296
|
+
|
|
291
297
|
## Conformance library (one library, two roles)
|
|
292
298
|
|
|
293
299
|
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
@@ -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.22 # …or pin an exact version
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -258,6 +258,12 @@ closeout, the persisted `terminal-summary.json` reflects the runner's blocking v
|
|
|
258
258
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
259
259
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
260
260
|
|
|
261
|
+
The `phase-loop-closeout-audit --repo .` command grades **ignored** paths by producer. It
|
|
262
|
+
accepts harness handoffs that carry the handoff contract, and a project's declared build
|
|
263
|
+
outputs backed by a recorded producer run. Declare those outputs in a committed
|
|
264
|
+
`.phase-loop-generated-outputs.json`; anything else still blocks. See
|
|
265
|
+
`docs/phase-loop/closeout-generated-outputs.md` (agent-harness#1139).
|
|
266
|
+
|
|
261
267
|
## Conformance library (one library, two roles)
|
|
262
268
|
|
|
263
269
|
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
@@ -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.22"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -551,7 +551,7 @@ never through — the review operation `public_board_review.v1`. Frozen falsifie
|
|
|
551
551
|
- **Rung routes** (`president_adapter.build_president_invoke(..., monitoring_policy=)`).
|
|
552
552
|
Unseated rung → typed `president_unavailable` (descend). `sol` / `grok` → the brokered
|
|
553
553
|
`_exec_leg` in a throwaway directory, whose only launch is `launch_provider`. `gemini` →
|
|
554
|
-
the broker's
|
|
554
|
+
the broker's agy stream with the PRESIDENT's own final instruction (a ruling,
|
|
555
555
|
not a review verdict), launched through `_run_leg_with_liveness` → `launch_provider` and
|
|
556
556
|
decoded by `_broker_gemini_stream_result`; with the agy subscription credential it runs in
|
|
557
557
|
the broker's agy profile, without one in an empty private HOME (no credential of any kind),
|
|
@@ -672,7 +672,60 @@ The TUI timestamp is refreshed by novel output lines, review-file growth and
|
|
|
672
672
|
transcript growth — a startup banner is novel output and refreshes it; only
|
|
673
673
|
repeated cosmetic repaints do not, once the existing novelty detector has seen
|
|
674
674
|
their text. The CPU-tick heartbeat never refreshes it.
|
|
675
|
-
Neither state is a health attestation or permission to terminate.
|
|
675
|
+
Neither state is a health attestation or permission to terminate.
|
|
676
|
+
The record also carries a progress notice (agent-harness#1176). When no genuine
|
|
677
|
+
progress has been seen for `stall_notice_s` (default 3600 s; override with
|
|
678
|
+
`PHASE_LOOP_REVIEW_STALL_NOTICE_S`), and no progress at all counts from seat
|
|
679
|
+
start, `progress_notice` is `seat_progress_stalled`, `progress_notice_count`
|
|
680
|
+
counts crossings, and one operator warning with only that code and numbers is
|
|
681
|
+
logged. Resumed progress and a terminal observation clear the active notice;
|
|
682
|
+
`last_progress_notice` and the count stay as history. The notice never ends the
|
|
683
|
+
seat. The record reaches the board: `advisor-board --json` legs carry it as
|
|
684
|
+
`review_monitoring`, the text summary prints a `[seat_progress_stalled]` line
|
|
685
|
+
per affected seat on stderr, each streamed per-leg verdict file carries it, and
|
|
686
|
+
the governed record adds a `seat_progress_stalled` warn finding per seat.
|
|
687
|
+
The exact brokered Claude transcript is classified once per change, by
|
|
688
|
+
`_claude_transcript_outcome`, into one outcome; the answer parser and the
|
|
689
|
+
give-up detector are views of it, so they cannot disagree:
|
|
690
|
+
- `answer`: the route's answer parser (the agent-harness#1002/#1077/#1017
|
|
691
|
+
rules; the president route fails closed on any error record in the turn)
|
|
692
|
+
returns text. An accepted answer always wins, whatever follows it. An
|
|
693
|
+
`isApiErrorMessage` record is never answer text. Every record of the answer
|
|
694
|
+
must be a member of the current request (defined below; a sidechain sighting
|
|
695
|
+
counts), so a record that is not evidence for the request never answers it
|
|
696
|
+
either. If the text is not an
|
|
697
|
+
accepted verdict, the leg is handed it back as
|
|
698
|
+
`claude_tui_broker_terminal_nonconforming` instead of waiting.
|
|
699
|
+
- `gave_up`: no answer, and the last live record after the current request is
|
|
700
|
+
an `isApiErrorMessage` give-up. The leg ends at once as DEGRADED with
|
|
701
|
+
`claude_seat_output_budget_exhausted` (`error: max_output_tokens`),
|
|
702
|
+
`claude_seat_usage_limited` (`error: rate_limit` with
|
|
703
|
+
`quotaLimits.status: rejected`, a subscription cap, followed by
|
|
704
|
+
`: usage_limit (resets HH:MM, Mon D YYYY)` rendered in UTC from
|
|
705
|
+
`quotaLimits.resetsAt` when present), `claude_seat_rate_limited` (any other
|
|
706
|
+
`rate_limit`) or `claude_seat_provider_api_error`.
|
|
707
|
+
- `rejected`: no answer, and the turn ended in a completed (`end_turn` /
|
|
708
|
+
`stop_sequence`) answer carrying a text block that the route's parser refuses.
|
|
709
|
+
The leg ends at once as DEGRADED with `claude_seat_transcript_rejected`.
|
|
710
|
+
- `pending`: anything else (an open or capped message, the CLI's resume prompt,
|
|
711
|
+
a newer request, a writer mid-append). A `max_tokens` stop is never terminal.
|
|
712
|
+
The "last live record" is decided in APPEND order among the current request's
|
|
713
|
+
records, chosen by membership, not position. The current request is the last
|
|
714
|
+
user record that is not `isMeta`, carries no tool_result and is not a replay (its
|
|
715
|
+
uuid and content recurring, whatever its completion metadata, as in the answer
|
|
716
|
+
parser). A record is evidence for it only when it is a new version first seen in
|
|
717
|
+
it: its uuid was first seen after the request (a record of an earlier request is
|
|
718
|
+
never evidence, wherever it is appended, except an `isApiErrorMessage` record
|
|
719
|
+
appended in the current request, which always is); it is not an exact replay of a
|
|
720
|
+
version already seen (same uuid, content, `stop_reason` presence and value, and
|
|
721
|
+
error flag) nor a stale open copy of a stopped record whose content is unchanged;
|
|
722
|
+
and it is not a sidechain record (`isSidechain`), which the answer parser drops
|
|
723
|
+
too. An open record first seen in the current request, even a changed version
|
|
724
|
+
after its own stop, is still streaming and reads `pending`. An `isApiErrorMessage`
|
|
725
|
+
record is terminal event evidence and is never collapsed into an earlier
|
|
726
|
+
version of its uuid. Replays and rewritten metadata are not progress. `provider_terminal_state` records the code that
|
|
727
|
+
ended the leg. `isApiErrorMessage` matches JSON `true` or the string `"true"`,
|
|
728
|
+
on the record or the message. Frozen
|
|
676
729
|
broker request/response keys, status literals, and observer envelopes are unchanged.
|
|
677
730
|
|
|
678
731
|
When staging requires egress isolation, acquisition follows staged-tree and operation
|
|
@@ -687,8 +740,10 @@ review text and the exception in detail; sandbox facts describe actual enforceme
|
|
|
687
740
|
|
|
688
741
|
The Linux x64 subscription `agy` entry image must match one member of the closed
|
|
689
742
|
set `gemini_heartbeat.QUALIFIED_IMAGES`: 1.2.11 SHA256
|
|
690
|
-
`ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56
|
|
691
|
-
`ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca
|
|
743
|
+
`ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56`, 1.2.12 SHA256
|
|
744
|
+
`ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca`, 1.2.14 SHA256
|
|
745
|
+
`0d0d3eba22daf29504dd290151c7ed9a4d33b0c6aa0acfc5da27bc3b01d2f029` or 1.2.15 SHA256
|
|
746
|
+
`5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164`. Each member
|
|
692
747
|
carries its measured help digest and has its own qualification record; the
|
|
693
748
|
evidence catalog and the runtime set must name exactly the same members.
|
|
694
749
|
The running Python/kernel must support sealed memfds, pidfds and pidfd signaling;
|
|
@@ -710,7 +765,8 @@ HOME fallback truthfully if HOME is absent. Legitimate refresh writes survive.
|
|
|
710
765
|
The real qualification driver requires an explicit HOME and checks target
|
|
711
766
|
presence before and after, without reading its contents.
|
|
712
767
|
|
|
713
|
-
The broker transports same-session
|
|
768
|
+
The broker transports same-session input over stdin (one event when the sealed prompt fits
|
|
769
|
+
one chunk, acknowledged chunks otherwise; agent-harness#1175), with no tree
|
|
714
770
|
attachment, `--add-dir`, permission bypass, retry or native thinking timer. Empty,
|
|
715
771
|
rejected and nonzero-exit streams remain non-votes with fixed diagnostics;
|
|
716
772
|
provider stdout/stderr and arbitrary exception strings are not substituted for
|
|
@@ -735,3 +791,174 @@ root, rejecting failures, omissions and terminal/admission mismatches. Preserve
|
|
|
735
791
|
failed series; diagnose a changed candidate before another attempt. Validation
|
|
736
792
|
uses that host's measured helper images. These receipts do not replace the
|
|
737
793
|
historical bounded-success evidence verifier.
|
|
794
|
+
|
|
795
|
+
The driver lives in the package, `phase_loop_runtime.agy_qualification`; the script
|
|
796
|
+
is a shim over it, so an installed runtime can run it too (agent-harness#1076).
|
|
797
|
+
|
|
798
|
+
### First-use self-qualification (agent-harness#1076)
|
|
799
|
+
|
|
800
|
+
A non-release `agy` image is admitted only by verifying it, never by trusting it.
|
|
801
|
+
|
|
802
|
+
- **Admission classes.** Every Gemini heartbeat leg carries exactly one class in
|
|
803
|
+
its profile evidence (`provider_admission_class`): `release_qualified` (digest in
|
|
804
|
+
`QUALIFIED_IMAGES`), `locally_qualified` (a verified local record), or
|
|
805
|
+
`qualification_candidate` (only inside a qualification run; never counted, never
|
|
806
|
+
persisted). The evidence's `provider_image_sha256` is the admitted image's own digest.
|
|
807
|
+
- **VerifiedImage.** `PATH` is resolved once (a versioned-install symlink to its final
|
|
808
|
+
target), the target is opened once (`O_NOFOLLOW`, regular file, size cap) and read
|
|
809
|
+
into memory; that buffer is hashed and fills a sealed memfd, which is re-hashed.
|
|
810
|
+
Help measurement, the three live operations, board legs and the president execute
|
|
811
|
+
that memfd (an independent, re-hashed read of it per profile) and never open the path
|
|
812
|
+
again.
|
|
813
|
+
- **Admission order.** (1) A release-qualified digest is admitted before any config,
|
|
814
|
+
store or network access. (2) If the user config sets `[agy] self_qualification = false`
|
|
815
|
+
(the repository config cannot), today's `gemini_heartbeat_capability_unavailable`
|
|
816
|
+
refusal is returned and nothing else is read. (3) A `failed` entry refuses
|
|
817
|
+
(`gemini_heartbeat_self_qualification_failed`) with no execution. (4) Help is measured
|
|
818
|
+
from the memfd only after a `provenance` entry verifies against the live key; the
|
|
819
|
+
`qualified` entry is then verified against the full live key, including that help
|
|
820
|
+
digest. (5) Otherwise the image is absent: legs and the president refuse; only the
|
|
821
|
+
whole-board preflight (`_preflight_gemini_heartbeat`) and `phase-loop
|
|
822
|
+
agy-qualification run` go on to first use. Legs re-admit by lookup rather than
|
|
823
|
+
receiving the preflight's Admission object; any future cross-process hand-off of an
|
|
824
|
+
image memfd must reuse the worker's seal check.
|
|
825
|
+
- **Provenance** (coordinator process, nothing executes). Host platform from the running
|
|
826
|
+
host (D4: `linux-{x64,arm64}[-musl]`); the newest `agy_provenance.RECENCY_WINDOW`
|
|
827
|
+
stable releases (no prerelease, no draft); the exact platform asset; its URL equal to
|
|
828
|
+
`https://github.com/google-antigravity/antigravity-cli/releases/download/<tag>/<asset>`;
|
|
829
|
+
a strict `sha256:<hex>` asset digest equal to the streamed archive digest; exactly one
|
|
830
|
+
regular-file `antigravity` member (duplicates and links refuse), stream-hashed and
|
|
831
|
+
never extracted, equal to the image digest. The transport sends no credentials, has
|
|
832
|
+
no proxy support, uses the interpreter's compiled-in OpenSSL trust store (not
|
|
833
|
+
`SSL_CERT_FILE`/`SSL_CERT_DIR`), and follows at most three https redirects within
|
|
834
|
+
GitHub's download hosts. Fetch failure refuses `gemini_heartbeat_provenance_unavailable`;
|
|
835
|
+
no match refuses `gemini_heartbeat_provenance_unverified`.
|
|
836
|
+
- **Behaviour.** Only after the provenance entry is written: help, then the three live
|
|
837
|
+
operations through the packaged driver and the release path's own validators. All
|
|
838
|
+
passing writes the `qualified` entry. Any observed isolation or identity violation (an
|
|
839
|
+
executable outside the helper policy, an unqualified provider image, a writable image
|
|
840
|
+
mount, an unverified network policy, a surviving process, a rejected record) writes a
|
|
841
|
+
`failed` entry at whatever stage it was seen (until `agy-qualification clear`). Only a
|
|
842
|
+
provider that was never observed running, a completion the provider did not answer
|
|
843
|
+
(HTTP 5xx, quota, auth), and our own local failure are transient, and cancellation writes
|
|
844
|
+
nothing. Transients are counted per key; the third consecutive one writes a `failed`
|
|
845
|
+
entry, success resets the count, and `agy-qualification clear` removes it. A lock waiter
|
|
846
|
+
that finds a transient recorded while it waited refuses without running or counting.
|
|
847
|
+
- **Worker gate.** The qualification worker receives the image as an inherited fd and,
|
|
848
|
+
before hashing, requires a regular-file memfd with `F_SEAL_WRITE`, `F_SEAL_GROW`,
|
|
849
|
+
`F_SEAL_SHRINK` and `F_SEAL_SEAL` (`F_SEAL_FUTURE_WRITE` alone is refused). It admits
|
|
850
|
+
the fd as a candidate only if its digest is a release constant (the manual shim and the
|
|
851
|
+
upstream watch's prepared tree) or has a provenance entry for the current runtime
|
|
852
|
+
identity. It sets `PR_SET_PDEATHSIG`, so a killed coordinator leaves no worker.
|
|
853
|
+
- **Store.** `$XDG_STATE_HOME/phase-loop/agy-qualification/hosts/<machine>/`, per user,
|
|
854
|
+
namespaced by machine-id. Directories 0700 and files 0600, owned by the euid, opened
|
|
855
|
+
`O_NOFOLLOW`; otherwise the store is absent to lookups and first use refuses
|
|
856
|
+
(`gemini_heartbeat_self_qualification_store_unsafe`). Every entry is HMAC-SHA256'd under
|
|
857
|
+
a per-host key over its type, the euid, the machine-id and a context recomputed from the
|
|
858
|
+
live key. The qualification entries (`provenance`, `qualified`, `failed`, `member_cache`,
|
|
859
|
+
`transient`) bind the image digest, platform and runtime identity, plus the asset name,
|
|
860
|
+
profile id or help digest as the type requires. The watch's `watch_push` entry binds the
|
|
861
|
+
branch, the version and the route-core base.
|
|
862
|
+
Without a readable machine-id, self-qualification refuses; the release path is unaffected.
|
|
863
|
+
- **Lock.** One `flock` per host namespace; waiters are cancellable and heartbeat (the board
|
|
864
|
+
preflight writes a content-free `agy-qualification.json` progress record into the
|
|
865
|
+
board's stream directory and a line on stderr, throttled per phase), and re-check the
|
|
866
|
+
store after acquiring. Qualification happens once per key per user per host.
|
|
867
|
+
- **Runtime identity (D2).** `__version__` plus the digests of the installed
|
|
868
|
+
`agy_qualification.ROUTE_CORE` files (`gemini_heartbeat.py`, `agy_qualification.py`,
|
|
869
|
+
`agy_provenance.py`), the same tuple `verify_qualified_agy_image.py --route-core` checks.
|
|
870
|
+
- **Counting (D1).** At `governed_review`'s gate (the rule itself is
|
|
871
|
+
`agy_qualification.counts_toward_landing`), a usable heartbeat Gemini leg is a vote at every
|
|
872
|
+
tier only if its recorded class is `release_qualified` or `locally_qualified`. A
|
|
873
|
+
candidate leg, or a leg with no class (including legs from boards run before the class
|
|
874
|
+
existed: re-run the board), cannot approve; a blocking verdict from it still blocks. The
|
|
875
|
+
president's input builder applies the same rule (`agy_qualification.president_input_items`):
|
|
876
|
+
an uncounted non-blocking leg contributes a `not counted` item instead of its review, and an
|
|
877
|
+
uncounted `DISAGREE` keeps its objections. A leg is an agy leg by name or by the
|
|
878
|
+
coordinator's profile evidence. A
|
|
879
|
+
Gemini leg whose admitted digest appears in the reviewed artifact is flagged
|
|
880
|
+
(`gemini_seat_reviews_its_own_pin`, non-gating). Boards admit with the installed base
|
|
881
|
+
runtime, never the reviewed tree.
|
|
882
|
+
- **Upstream watch.** `phase-loop agy-qualification watch` (a host timer on a subscribed
|
|
883
|
+
host; see `docs/ops/agy-upstream-watch.md`) proposes only the Linux x64 glibc release
|
|
884
|
+
route, from a fresh checkout of `main`, and opens a draft PR; it never merges. Each tick
|
|
885
|
+
makes exactly one ref write (a fresh `agy-watch/<version>-<utc>-<random>` branch, pushed
|
|
886
|
+
with an empty-expected-value lease and accepted only when `--porcelain` reports that exact
|
|
887
|
+
ref as newly created) and one object create (the PR). It never updates, force-pushes,
|
|
888
|
+
adopts, closes, edits or deletes anything that existed before the tick; the new PR body
|
|
889
|
+
names the own older PRs it supersedes for a maintainer to close. It requires `origin` to
|
|
890
|
+
have exactly one push URL, pushes to the remote NAME `origin` (never to the printed URL,
|
|
891
|
+
which git would resolve again). It compares no URL strings; a `--dry-run` pre-flight
|
|
892
|
+
must print exactly one `To` block, and the real push exactly one `To` block and one `*` row
|
|
893
|
+
for exactly the new ref. Both pushes carry `--no-verify`; the bot host's git/ssh
|
|
894
|
+
configuration is trusted. It pre-flights its store, records the
|
|
895
|
+
verified pushed oid in its own `watch_push` entry, and reads both the record and the
|
|
896
|
+
created PR back (the PR body's copy is display-only). "Up to date" requires that local record, `headRefOid` and `ls-remote` to
|
|
897
|
+
agree. It refuses when it cannot prove its open-PR listing complete.
|
|
898
|
+
|
|
899
|
+
## ABDFALSIFY — Executable review findings (IF-0-EXECFIND-1)
|
|
900
|
+
|
|
901
|
+
An optional `falsifier` attachment names one `FindingFalsifier` with
|
|
902
|
+
`finding_id`, `new_test_path`, `expected_nodeid`, and a unified `diff` creating
|
|
903
|
+
only `phase-loop-runtime/tests/test_finding_<finding_id>.py`. A
|
|
904
|
+
`FindingFalsifierAttachment` contains a tuple of these entries with unique
|
|
905
|
+
finding IDs. The attachment is a non-field property on `PanelLegResult`; it
|
|
906
|
+
does not change the serialized leg or board schema. The seat supplies text,
|
|
907
|
+
never an executable command or a claimed test outcome.
|
|
908
|
+
|
|
909
|
+
`run_finding_falsifier` accepts one attached falsifier, board `seat_key`, canonical
|
|
910
|
+
repository, positive wall-clock/output bounds, and a single-use
|
|
911
|
+
`FalsifierIsolationAuthorization` bound to the exact 40-character `reviewed_sha`.
|
|
912
|
+
Its identity is `public_board_falsifier.v1`; its child has no credentials,
|
|
913
|
+
network egress, or live-tree mount. The source must be clean at that SHA.
|
|
914
|
+
Before applying the diff, the staged materialized path set, bytes, symlink
|
|
915
|
+
targets, and executable bits must equal the reviewed Git tree, including no
|
|
916
|
+
ignored extra files. Only the named pytest node runs in the staged clone.
|
|
917
|
+
|
|
918
|
+
Each run stages its own tree from the canonical repository at the head under
|
|
919
|
+
test, never from a seat's tree, and copies installed dependency files into a
|
|
920
|
+
per-run import root (copies, never links; uv's `--link-mode=copy` equivalent).
|
|
921
|
+
Those two trees are the run's protected objects: every regular file in them,
|
|
922
|
+
`.git` included, must have a link count of exactly one before the node starts
|
|
923
|
+
and after it exits, or the run is `error` (agent-harness#1134). The shared system
|
|
924
|
+
interpreter is read-only to the run and is not a protected object. The runner
|
|
925
|
+
resolves `/usr/bin/python3` once and launches exactly that file. Falsifier runs
|
|
926
|
+
execute without site processing (`-S`): no `.pth`, `sitecustomize` or
|
|
927
|
+
`usercustomize` runs and no host site directory is on `sys.path`, so the
|
|
928
|
+
interpreter's inputs are its standard-library entries plus the run's explicit
|
|
929
|
+
staged paths. Every dependency, pytest included, comes from the per-run staged
|
|
930
|
+
dependency root (a distribution without a RECORD is staged from its declared
|
|
931
|
+
top-level modules); a host site directory on the falsifier path is refused as
|
|
932
|
+
`falsifier_host_site_packages_refused`. The measured set is the launched
|
|
933
|
+
interpreter's own `sys.path` under the same flags and environment, so the
|
|
934
|
+
inventory and the launch are identical by construction. Every entry is
|
|
935
|
+
digested before and after the run: archive entries and `.pth`, archive and
|
|
936
|
+
customize files by content, directories by an lstat manifest (mode, size,
|
|
937
|
+
device, inode, mtime, ctime), and every symlink target outside the set followed
|
|
938
|
+
and hashed by content. An entry the runner cannot digest fails closed, and a
|
|
939
|
+
changed scope or digest is `error`.
|
|
940
|
+
Before staging, the canonical repository must not be reachable through any
|
|
941
|
+
system-root mount (compared by device and in-filesystem path, not by pathname),
|
|
942
|
+
and a repository that contains any mount point is refused as
|
|
943
|
+
`falsifier_repository_submount_refused`. The record schema is unchanged; the reason
|
|
944
|
+
stays in the result's `detail`.
|
|
945
|
+
|
|
946
|
+
The frozen outcome tuple is `red_on_head`, `green_on_head`, `apply_failed`,
|
|
947
|
+
`node_missing`, `error`. Pytest emits JUnit, but the recorded outcome comes from
|
|
948
|
+
the wrapper's reported call-phase result; the test-writable XML is not read as
|
|
949
|
+
authority. Seat-authored and reviewed-tree Python (including conftest) run
|
|
950
|
+
in the wrapper's process and can forge
|
|
951
|
+
the reported status, including a parent-keyed frame. RED and GREEN are therefore
|
|
952
|
+
observed, untrusted results: neither binds nor dismisses a finding. Drift,
|
|
953
|
+
expiry, unavailable isolation, and incomplete evidence are `error`; every
|
|
954
|
+
valid attached result remains a blocking `finding_receipt` pending a president
|
|
955
|
+
ruling. The metadata-only
|
|
956
|
+
`finding_falsifier.v1` record has exactly `schema`,
|
|
957
|
+
`authorization_identity`, `seat_key`, `reviewed_sha`, `finding_id`, `nodeid`,
|
|
958
|
+
`outcome`, `red_output_digest`, `diff_digest`, `wall_clock_bound_s`, and
|
|
959
|
+
`output_cap_bytes`. `diff_digest` hashes the offered UTF-8 diff bytes;
|
|
960
|
+
`red_output_digest` hashes separately captured stdout followed by stderr
|
|
961
|
+
and is null unless RED. The caller binds the record with SHA-256 over
|
|
962
|
+
canonical JSON (`sort_keys=True`, compact separators, `ensure_ascii=False`).
|
|
963
|
+
The full freeze and golden values live in
|
|
964
|
+
`tests/data/execfind_falsifier_attachment_v1.golden.json`.
|
|
@@ -857,6 +857,22 @@ class ReviewIsolationAuthorization:
|
|
|
857
857
|
staged_tree_sha256: str | None = None
|
|
858
858
|
|
|
859
859
|
|
|
860
|
+
@dataclass(frozen=True)
|
|
861
|
+
class FalsifierIsolationAuthorization:
|
|
862
|
+
"""Single-use authority to run one attached test against a reviewed commit."""
|
|
863
|
+
|
|
864
|
+
operation: str
|
|
865
|
+
reviewed_sha: str
|
|
866
|
+
canonical_repo_sha256: str
|
|
867
|
+
child_credentialless: bool
|
|
868
|
+
child_network_egress: bool
|
|
869
|
+
live_tree_exposed: bool
|
|
870
|
+
issued_monotonic_ns: int
|
|
871
|
+
_seal: object
|
|
872
|
+
routes: tuple[tuple[str, str], ...] = ()
|
|
873
|
+
monitoring_policy: str = "bounded"
|
|
874
|
+
|
|
875
|
+
|
|
860
876
|
def _staged_tree_digest(canonical_repo_authority: Path | str | None) -> str | None:
|
|
861
877
|
"""Digest of the reviewed tree a seat will be allowed to read.
|
|
862
878
|
|
|
@@ -903,6 +919,7 @@ def _canonical_repo_digest(canonical_repo_authority: Path | str | None) -> str:
|
|
|
903
919
|
text=True,
|
|
904
920
|
stderr=subprocess.DEVNULL,
|
|
905
921
|
timeout=3,
|
|
922
|
+
env={key: value for key, value in os.environ.items() if not key.startswith("GIT_")},
|
|
906
923
|
).strip()
|
|
907
924
|
except (OSError, subprocess.SubprocessError):
|
|
908
925
|
raise ValueError("HARDEN review has no canonical repository authority") from None
|
|
@@ -1211,6 +1228,83 @@ def close_review_isolation_authorization(
|
|
|
1211
1228
|
lease.cancel_event.set()
|
|
1212
1229
|
|
|
1213
1230
|
|
|
1231
|
+
def prepare_falsifier_isolation_authorization(
|
|
1232
|
+
*, repo: Path, reviewed_sha: str,
|
|
1233
|
+
) -> FalsifierIsolationAuthorization:
|
|
1234
|
+
"""Mint one credentialless, no-egress staged-test operation."""
|
|
1235
|
+
if platform.system() != "Linux" or len(reviewed_sha) != 40 or any(
|
|
1236
|
+
character not in "0123456789abcdef" for character in reviewed_sha
|
|
1237
|
+
):
|
|
1238
|
+
raise ValueError("invalid falsifier repository or reviewed SHA")
|
|
1239
|
+
authorization = FalsifierIsolationAuthorization(
|
|
1240
|
+
operation="public_board_falsifier.v1",
|
|
1241
|
+
reviewed_sha=reviewed_sha,
|
|
1242
|
+
canonical_repo_sha256=_canonical_repo_digest(repo),
|
|
1243
|
+
child_credentialless=True,
|
|
1244
|
+
child_network_egress=False,
|
|
1245
|
+
live_tree_exposed=False,
|
|
1246
|
+
issued_monotonic_ns=time.monotonic_ns(),
|
|
1247
|
+
_seal=_AUTHORIZATION_SEAL,
|
|
1248
|
+
)
|
|
1249
|
+
_remember_lease(authorization) # type: ignore[arg-type]
|
|
1250
|
+
return authorization
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
def _falsifier_authorization_lease(
|
|
1254
|
+
authorization: FalsifierIsolationAuthorization | None,
|
|
1255
|
+
) -> _ReviewInvocationLease:
|
|
1256
|
+
if (
|
|
1257
|
+
not isinstance(authorization, FalsifierIsolationAuthorization)
|
|
1258
|
+
or authorization._seal is not _AUTHORIZATION_SEAL
|
|
1259
|
+
or authorization.operation != "public_board_falsifier.v1"
|
|
1260
|
+
or not authorization.child_credentialless
|
|
1261
|
+
or authorization.child_network_egress
|
|
1262
|
+
or authorization.live_tree_exposed
|
|
1263
|
+
):
|
|
1264
|
+
raise ValueError("missing, forged, or mismatched falsifier authorization")
|
|
1265
|
+
return _lease_for(authorization) # type: ignore[arg-type]
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
def revalidate_falsifier_isolation_authorization(
|
|
1269
|
+
authorization: FalsifierIsolationAuthorization | None, *, repo: Path,
|
|
1270
|
+
) -> None:
|
|
1271
|
+
lease = _falsifier_authorization_lease(authorization)
|
|
1272
|
+
if authorization.canonical_repo_sha256 != _canonical_repo_digest(repo):
|
|
1273
|
+
raise ValueError("falsifier authorization repository drifted")
|
|
1274
|
+
with lease.lock:
|
|
1275
|
+
if lease.closed or (
|
|
1276
|
+
not lease.active
|
|
1277
|
+
and time.monotonic_ns() - lease.prepared_monotonic_ns > _PRE_ACTIVATION_FRESHNESS_NS
|
|
1278
|
+
):
|
|
1279
|
+
raise ValueError("falsifier authorization is closed or expired")
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
def activate_falsifier_isolation_authorization(
|
|
1283
|
+
authorization: FalsifierIsolationAuthorization, *, repo: Path,
|
|
1284
|
+
) -> None:
|
|
1285
|
+
revalidate_falsifier_isolation_authorization(authorization, repo=repo)
|
|
1286
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1287
|
+
with lease.lock:
|
|
1288
|
+
if lease.closed or lease.active:
|
|
1289
|
+
raise ValueError("falsifier authorization already consumed")
|
|
1290
|
+
lease.active = True
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
def close_falsifier_isolation_authorization(
|
|
1294
|
+
authorization: FalsifierIsolationAuthorization | None,
|
|
1295
|
+
) -> None:
|
|
1296
|
+
if not isinstance(authorization, FalsifierIsolationAuthorization):
|
|
1297
|
+
return
|
|
1298
|
+
try:
|
|
1299
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1300
|
+
except ValueError:
|
|
1301
|
+
return
|
|
1302
|
+
with lease.lock:
|
|
1303
|
+
lease.active = False
|
|
1304
|
+
lease.closed = True
|
|
1305
|
+
lease.cancel_event.set()
|
|
1306
|
+
|
|
1307
|
+
|
|
1214
1308
|
def derive_review_leg_authorization(
|
|
1215
1309
|
authorization: ReviewIsolationAuthorization | None,
|
|
1216
1310
|
artifact: str,
|
|
@@ -1667,10 +1761,15 @@ __all__ = [
|
|
|
1667
1761
|
"harden_subscription_model",
|
|
1668
1762
|
"harden_subscription_review_board",
|
|
1669
1763
|
"ReviewIsolationAuthorization",
|
|
1764
|
+
"FalsifierIsolationAuthorization",
|
|
1670
1765
|
"ReviewCompositionAuthorization",
|
|
1671
1766
|
"ReviewLegAuthorization",
|
|
1672
1767
|
"ParentUnixBroker",
|
|
1673
1768
|
"prepare_review_isolation_authorization",
|
|
1769
|
+
"prepare_falsifier_isolation_authorization",
|
|
1770
|
+
"revalidate_falsifier_isolation_authorization",
|
|
1771
|
+
"activate_falsifier_isolation_authorization",
|
|
1772
|
+
"close_falsifier_isolation_authorization",
|
|
1674
1773
|
"prepare_review_composition_authorization",
|
|
1675
1774
|
"current_review_composition_authorization",
|
|
1676
1775
|
"clear_review_composition_authorization",
|
|
@@ -51,11 +51,14 @@ from .schema import (
|
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
# Recognised keys — anything else is a hard error (no silent drop).
|
|
54
|
-
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president"})
|
|
54
|
+
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards", "president", "agy"})
|
|
55
55
|
# A repository file configures the president ladder only: repo-level boards are not a
|
|
56
56
|
# feature, so a ``[[boards]]`` there is refused rather than silently ignored.
|
|
57
57
|
_KNOWN_REPO_TOP_KEYS: frozenset[str] = frozenset({"president"})
|
|
58
58
|
_KNOWN_PRESIDENT_KEYS: frozenset[str] = frozenset({"ladder"})
|
|
59
|
+
# agent-harness#1076 D3: the USER file's ``[agy] self_qualification = false`` restores the
|
|
60
|
+
# hard refusal of a non-release agy image. A repository file cannot carry it.
|
|
61
|
+
_KNOWN_AGY_KEYS: frozenset[str] = frozenset({"self_qualification"})
|
|
59
62
|
# Repository-level config, relative to the repository root.
|
|
60
63
|
REPO_CONFIG_RELATIVE_PATH = ".agent-harness/advisor-boards.toml"
|
|
61
64
|
_KNOWN_BOARD_KEYS: frozenset[str] = frozenset(
|
|
@@ -212,6 +215,31 @@ def _parse_president(data: Mapping[str, Any], where: str) -> tuple[str, ...] | N
|
|
|
212
215
|
raise BoardConfigError(f"{where} [president] ladder: {exc}") from exc
|
|
213
216
|
|
|
214
217
|
|
|
218
|
+
def _parse_agy(data: Mapping[str, Any], where: str) -> bool:
|
|
219
|
+
"""The user file's ``[agy] self_qualification`` (default ``True``), validated."""
|
|
220
|
+
raw = data.get("agy")
|
|
221
|
+
if raw is None:
|
|
222
|
+
return True
|
|
223
|
+
if not isinstance(raw, Mapping):
|
|
224
|
+
raise BoardConfigError(f"{where}: 'agy' must be a table")
|
|
225
|
+
_reject_unknown(raw.keys(), _KNOWN_AGY_KEYS, f"{where} [agy]")
|
|
226
|
+
return _require_bool(raw, "self_qualification", True, f"{where} [agy]")
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def load_agy_self_qualification(*, path: Path | None = None) -> bool:
|
|
230
|
+
"""D3 (agent-harness#1076): whether first-use self-qualification is enabled.
|
|
231
|
+
|
|
232
|
+
Reads the user file only (this process's ``board_config_path()``). A malformed file
|
|
233
|
+
raises; the admission caller treats any error as opted out (today's refusal).
|
|
234
|
+
"""
|
|
235
|
+
user_path = path if path is not None else board_config_path(None)
|
|
236
|
+
user = _load_toml(user_path)
|
|
237
|
+
if user is None:
|
|
238
|
+
return True
|
|
239
|
+
_reject_unknown(user.keys(), _KNOWN_TOP_KEYS, str(user_path))
|
|
240
|
+
return _parse_agy(user, str(user_path))
|
|
241
|
+
|
|
242
|
+
|
|
215
243
|
def _user_config_path(env: Mapping[str, str] | None) -> Path | None:
|
|
216
244
|
"""The user file for ``env``: resolved from the GIVEN environment only.
|
|
217
245
|
|
|
@@ -343,6 +371,7 @@ def load_boards(
|
|
|
343
371
|
raise BoardConfigError(f"{cfg_path} is not valid TOML: {exc}") from exc
|
|
344
372
|
_reject_unknown(data.keys(), _KNOWN_TOP_KEYS, str(cfg_path))
|
|
345
373
|
_parse_president(data, str(cfg_path)) # a bad [president] fails at load too
|
|
374
|
+
_parse_agy(data, str(cfg_path)) # and a bad [agy] (agent-harness#1076)
|
|
346
375
|
raw_boards = data.get("boards", [])
|
|
347
376
|
if not isinstance(raw_boards, list):
|
|
348
377
|
raise BoardConfigError(f"{cfg_path}: 'boards' must be an array of tables")
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
# Optional: the board a bare `advisor-board` invocation resolves to.
|
|
13
13
|
default_board = "default"
|
|
14
14
|
|
|
15
|
+
# Optional (agent-harness#1076, user file only): first-use self-qualification of a genuine
|
|
16
|
+
# upstream agy release whose digest is not release-qualified. On by default; `false`
|
|
17
|
+
# restores the hard refusal (`gemini_heartbeat_capability_unavailable`).
|
|
18
|
+
# [agy]
|
|
19
|
+
# self_qualification = false
|
|
20
|
+
|
|
15
21
|
# The default board reproduces today's 3-leg panel (byte-for-byte back-compat).
|
|
16
22
|
# Its three seats, in panel-leg order, render to today's exact CLI invocations:
|
|
17
23
|
# codex gpt-6-astra effort=max -> -c model_reasoning_effort=xhigh
|
|
@@ -76,7 +76,12 @@ CANONICAL_VALID_PAIRS: tuple[tuple[str, str], ...] = (
|
|
|
76
76
|
("gpt-6-astra", "codex"),
|
|
77
77
|
("gpt-6-astra", "opencode"),
|
|
78
78
|
("gpt-5.6-sol", "codex"), # legacy default id remains expressible
|
|
79
|
+
("gpt-6-sol", "codex"), # explicit seat on user/ad-hoc boards (not a governed grok stand-in)
|
|
80
|
+
("gpt-6-sol", "opencode"), # same family; matches the production registry's runnable_by
|
|
81
|
+
("gpt-6.1-sol", "codex"), # explicit seat, selected by board config (not a default)
|
|
82
|
+
("gpt-6.1-sol", "opencode"), # same family; registered by vendor family, not launch-verified
|
|
79
83
|
("claude-sonnet-5", "claude"),
|
|
84
|
+
("claude-sonnet-5-5", "claude"), # explicit seat, selected by board config (not a default)
|
|
80
85
|
("claude-opus-5-5", "claude"),
|
|
81
86
|
("claude-fable-5-1", "claude"),
|
|
82
87
|
("Gemini 3.1 Pro", "gemini"),
|
|
@@ -256,7 +256,10 @@ class DefaultHarnessRegistry:
|
|
|
256
256
|
_MODEL_DEFS: tuple[tuple[str, str, str], ...] = (
|
|
257
257
|
("gpt-6-astra", "codex", "max"),
|
|
258
258
|
("gpt-5.6-sol", "codex", "max"), # explicit legacy seat (fleet default before 2026-09-04)
|
|
259
|
+
("gpt-6-sol", "codex", "max"), # explicit seat (codex's own default model); not a board default
|
|
260
|
+
("gpt-6.1-sol", "codex", "max"), # explicit seat, selected by board config; not a board default
|
|
259
261
|
("claude-sonnet-5", "claude", "max"),
|
|
262
|
+
("claude-sonnet-5-5", "claude", "max"), # explicit seat, selected by board config; not a board default
|
|
260
263
|
("claude-opus-4-8", "claude", "max"),
|
|
261
264
|
# design-model-tier-taxonomy.md: claude-opus-5 is the new Claude heavy model.
|
|
262
265
|
# opus-4-8 is retained above — still referenced by tests (advisor_board_schema) —
|