phase-loop-runtime 0.7.16__tar.gz → 0.7.17__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.16 → phase_loop_runtime-0.7.17}/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/README.md +1 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +203 -20
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/backing.py +290 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/composition.py +4 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/config.py +99 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/fixtures.py +14 -11
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/harness_mapping.py +25 -12
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/presets.py +10 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/registries.py +2 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/schema.py +1 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/agy_canary_evidence.py +237 -15
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/build_bundle.py +10 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/capability_registry.py +11 -7
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/cli.py +98 -5
- phase_loop_runtime-0.7.17/src/phase_loop_runtime/gemini_heartbeat.py +292 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/launcher.py +21 -12
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/panel_invoker.py +781 -110
- phase_loop_runtime-0.7.17/src/phase_loop_runtime/president_adapter.py +572 -0
- phase_loop_runtime-0.7.17/src/phase_loop_runtime/president_operation.py +173 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/profiles.py +9 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_lint.py +57 -15
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/runner.py +10 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/sandbox_egress.py +34 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +3 -3
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +5 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +12 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/SOURCES.txt +15 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_composition.py +1 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_golden.py +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_presets.py +10 -10
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_registries.py +10 -3
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_static_import_862.py +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_agy_canary_evidence.py +1391 -28
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_autosel.py +2 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_broker_command_builders.py +5 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_broker_staged_tree_delivery.py +51 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ci_offload_lock.py +75 -0
- phase_loop_runtime-0.7.17/tests/test_ci_xdist_adoption.py +416 -0
- phase_loop_runtime-0.7.17/tests/test_ci_xdist_witness.py +142 -0
- phase_loop_runtime-0.7.17/tests/test_conform_timing_instrumentation.py +809 -0
- phase_loop_runtime-0.7.17/tests/test_frozen_blob_batch_parse.py +127 -0
- phase_loop_runtime-0.7.17/tests/test_gemini_heartbeat_bootstrap.py +1288 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_premerge.py +65 -1
- phase_loop_runtime-0.7.17/tests/test_govlean_panel_policy.py +288 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_grok_narrow_reject_231.py +39 -21
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_grokexec.py +17 -8
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_harden_evidence_verifier.py +54 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_launcher_liveness.py +4 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_legible_review_repairs.py +2 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_legible_roadmap_contract.py +21 -21
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_model_class_policy.py +3 -3
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_model_tier_taxonomy.py +4 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_conform_evidence.py +97 -3
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_redaction_separation.py +59 -20
- phase_loop_runtime-0.7.17/tests/test_owned_command_procfs_1003.py +77 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_invoker_spawn.py +4 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_invoker_timeout_argv.py +19 -5
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_native_fill_183.py +18 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_per_leg_model_66.py +6 -6
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_execution_policy.py +6 -2
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_launcher.py +9 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_roadmap_validate.py +213 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v45_schedharden.py +4 -1
- phase_loop_runtime-0.7.17/tests/test_president_heartbeat_1001.py +338 -0
- phase_loop_runtime-0.7.17/tests/test_president_ladder_config.py +585 -0
- phase_loop_runtime-0.7.17/tests/test_president_wiring.py +1232 -0
- phase_loop_runtime-0.7.17/tests/test_presroute_cli.py +100 -0
- phase_loop_runtime-0.7.17/tests/test_presroute_hardening.py +341 -0
- phase_loop_runtime-0.7.17/tests/test_presroute_landed.py +35 -0
- phase_loop_runtime-0.7.17/tests/test_proc_cpu.py +99 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_public_installer.py +185 -9
- phase_loop_runtime-0.7.17/tests/test_redaction_channel_control_isolation.py +115 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_monitor_policy.py +80 -23
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_policy_govlean_repairs.py +9 -4
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sandbox_egress.py +76 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skill_liveness_contract.py +4 -1
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skills_canon_parity.py +5 -4
- phase_loop_runtime-0.7.17/tests/test_subscription_scrub_xai_864.py +74 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_tdd_chronology.py +220 -0
- phase_loop_runtime-0.7.16/src/phase_loop_runtime/president_adapter.py +0 -143
- phase_loop_runtime-0.7.16/tests/test_govlean_panel_policy.py +0 -157
- phase_loop_runtime-0.7.16/tests/test_president_wiring.py +0 -689
- phase_loop_runtime-0.7.16/tests/test_proc_cpu.py +0 -45
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/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.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/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.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/review_stage.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ci_chronology_scope.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_executor_exited_without_closeout_785.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_activation_promotion.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_delta_consumer.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabpub_zero_history_bootstrap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_native_claude_seat_fill.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_tui_workspace_trust_223.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pr_readback_789.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_stage_binding.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_review_authorization.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.16 → phase_loop_runtime-0.7.17}/tests/test_worktree_index.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phase-loop-runtime
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.17
|
|
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.17 # …or pin an exact version
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -19,7 +19,7 @@ To install just this runtime package directly:
|
|
|
19
19
|
|
|
20
20
|
```sh
|
|
21
21
|
pip install phase-loop-runtime # latest compatible release
|
|
22
|
-
pip install phase-loop-runtime==0.7.
|
|
22
|
+
pip install phase-loop-runtime==0.7.17 # …or pin an exact version
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.17"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -95,14 +95,17 @@ equivalence is proven by a test (not asserted in prose).
|
|
|
95
95
|
deferred seat natively and the fill counts only once bound (EC-REVIEWTRUTH-14,
|
|
96
96
|
agent-harness#921) — the host×seat routing rule above.
|
|
97
97
|
- **`VENDOR_API_KEY_VARS`** — the flat `_API_KEY_VARS` tuple re-keyed by vendor
|
|
98
|
-
family; its union equals today's tuple (proven)
|
|
99
|
-
|
|
98
|
+
family; its union equals today's tuple (proven). It is also the api-key INJECTION map.
|
|
99
|
+
`scrub_subscription_env` additionally removes `SUBSCRIPTION_SCRUB_ONLY_VARS`
|
|
100
|
+
(`XAI_API_KEY`, `GROK_CODE_XAI_API_KEY`; agent-harness#864): the api-key variables of the
|
|
101
|
+
subscription-only grok harness, scrubbed but never injectable -- and
|
|
102
|
+
`GROK_SUBSCRIPTION_BLOCKED_ENV_VARS`, grok's endpoint redirects.
|
|
100
103
|
|
|
101
104
|
## IF-0-ABDFREEZE-4 — Back-compat contract · `fixtures.py` + `tests/test_advisor_board_backcompat.py`
|
|
102
105
|
|
|
103
106
|
- The model-first `default` board (`DEFAULT_BOARD`) resolves four vendors in
|
|
104
|
-
`DEFAULT_BOARD_VENDOR_ORDER`: Codex/Sol, Gemini/Flash high, Claude/
|
|
105
|
-
Grok 4.
|
|
107
|
+
`DEFAULT_BOARD_VENDOR_ORDER`: Codex/Sol, Gemini/Flash high, Claude/Opus 5.5, and
|
|
108
|
+
Grok 4.7. The separate legacy `PANEL_LEGS` tuple and explicit `invoke_panel`
|
|
106
109
|
API remain the frozen three-leg Codex/Gemini/Claude boundary.
|
|
107
110
|
- `advisor-panel` stays a working alias of `advisor-board` — the rename + alias is
|
|
108
111
|
ABDRESOLVE; this contract only *states* the invariant.
|
|
@@ -184,24 +187,27 @@ The seven built-in presets (`presets.PRESETS`). Every preset self-validates agai
|
|
|
184
187
|
the real matrix at `load_boards()` time (`tests/test_advisor_board_config.py`,
|
|
185
188
|
`tests/test_advisor_board_integration.py`).
|
|
186
189
|
|
|
187
|
-
- **Review-class =
|
|
188
|
-
review are mid-tier decisions where being wrong is expensive, so the
|
|
189
|
-
boards (`default`, `code-review`, `legal-review`,
|
|
190
|
-
|
|
190
|
+
- **Review-class = Opus 5.5 (for now), decoupled from the implementer.** Pre-merge
|
|
191
|
+
and legal review are mid-tier decisions where being wrong is expensive, so the
|
|
192
|
+
review-class boards (`default`, `code-review`, `legal-review`,
|
|
193
|
+
`legal-strategy-review`) seat Opus 5.5 (`claude-opus-5-5`) on the claude lane — the
|
|
194
|
+
maintainer's review default "for now" (2026-09-23), Fable (`claude-fable-5-1`)
|
|
195
|
+
before that and still selectable — NOT the implementer model
|
|
191
196
|
`profiles.CLAUDE_IMPLEMENTER_MODEL` (`claude-sonnet-5`). `panel_invoker.DEFAULT_LEG_MODELS["claude"]`
|
|
192
197
|
is the SINGLE source of truth for the panel's default claude model: the claude
|
|
193
198
|
leg builder (`_claude_tui_command`) and the Agent-View attempt both read it, so
|
|
194
199
|
the *legacy* `invoke_panel` path AND the live governed gates
|
|
195
200
|
(`governed_review` / `governed_premerge`, which call `invoke_panel` with no model
|
|
196
|
-
override) review on
|
|
201
|
+
override) review on Opus 5.5. `CLAUDE_IMPLEMENTER_MODEL` is untouched — the
|
|
197
202
|
implementer stays Sonnet. The `default` board (`fixtures.DEFAULT_BOARD`) is
|
|
198
|
-
byte-pinned to this
|
|
203
|
+
byte-pinned to this `invoke_panel` panel by the golden proof
|
|
199
204
|
(`tests/test_advisor_board_golden.py`); the sole sanctioned delta stays `seat_key`.
|
|
200
205
|
- **`default` and `code-review` are four-vendor frontier boards.** Gemini uses
|
|
201
|
-
`gemini-3.8-flash` at its `high` ceiling alongside Sol,
|
|
206
|
+
`gemini-3.8-flash` at its `high` ceiling alongside Sol, Opus 5.5, and Grok 4.7;
|
|
202
207
|
`code-review` preserves availability-aware backfill and distinct lenses.
|
|
203
|
-
- **President availability ladder.** Review findings go first to
|
|
204
|
-
|
|
208
|
+
- **President availability ladder.** Review findings go first to the `fable` seat
|
|
209
|
+
(Opus 5.5 by default — the rung names the seat, not the model), then
|
|
210
|
+
Sol, Grok 4.7, and Gemini 3.8 Flash. Descent occurs only for a typed
|
|
205
211
|
`president_unavailable` result, never because a president dissents. The ladder
|
|
206
212
|
is EXECUTED (not merely declared) by every `requires_president` landing policy —
|
|
207
213
|
see ABDPRES below.
|
|
@@ -214,8 +220,8 @@ the real matrix at `load_boards()` time (`tests/test_advisor_board_config.py`,
|
|
|
214
220
|
- **Catch-alls for unmodeled tasks (`general`, `solo`).** So the board library is not
|
|
215
221
|
limited to the pre-modeled domains: `general` is the domain-agnostic top-tier PANEL
|
|
216
222
|
(three frontier vendors — gpt-6-astra/adversarial, gemini-3.8-flash/alternative,
|
|
217
|
-
claude-
|
|
218
|
-
single-MEMBER form (one `claude-
|
|
223
|
+
claude-opus-5-5/completeness — hand it any task + brief), and `solo` is the
|
|
224
|
+
single-MEMBER form (one `claude-opus-5-5` seat) for a quick top-end opinion when a
|
|
219
225
|
panel is overkill. A ONE-seat board validates + resolves through `invoke_board` like
|
|
220
226
|
any other (bare/single seats are supported). Both default to TOP-END models: an
|
|
221
227
|
unanticipated task cannot be assumed low-stakes, so the safe default is frontier —
|
|
@@ -450,7 +456,9 @@ a landing decision. `tests/test_president_wiring.py`.
|
|
|
450
456
|
seated rung with it: the governed caller must receive that as a board result it
|
|
451
457
|
persists, not as an error it never records. Only a caller-contract error
|
|
452
458
|
(`president_round_limit`) propagates as `PresidentPolicyError`.
|
|
453
|
-
- **Execution route
|
|
459
|
+
- **Execution route — SUPERSEDED by ABDPRESROUTE below** (agent-harness#952): a seated
|
|
460
|
+
rung now runs through `public_board_president.v1`. The text of this bullet records the
|
|
461
|
+
pre-PRESROUTE route. `president_adapter.build_president_invoke`
|
|
454
462
|
binds the ladder to a board's seats (`seat_for_rung`: rung alias → seat model →
|
|
455
463
|
harness). An UNSEATED rung answers typed `president_unavailable` (the ladder
|
|
456
464
|
descends). A SEATED rung answers `failed` / `president_execution_route_unavailable`
|
|
@@ -486,13 +494,139 @@ a landing decision. `tests/test_president_wiring.py`.
|
|
|
486
494
|
president passes an explicit `review_policy=ReviewLandingPolicy(required_seats=...,
|
|
487
495
|
requires_president=False)` rather than a president-requiring tier.
|
|
488
496
|
|
|
497
|
+
## ABDPRESROUTE — The president operation · `president_operation.py`, `president_adapter.py`, `advisor_board/backing.py`, `panel_invoker.invoke_board` (IF-0-PRESROUTE-1, Consiliency/agent-harness#952)
|
|
498
|
+
|
|
499
|
+
The president's OWN HARDEN-authorized operation, `public_board_president.v1`, beside —
|
|
500
|
+
never through — the review operation `public_board_review.v1`. Frozen falsifiers:
|
|
501
|
+
`tests/test_president_wiring.py`, `tests/test_govlean_panel_policy.py` (SL-0,
|
|
502
|
+
`content_tdd_receipt.v1`), golden `tests/data/president_ruling_v1.golden.json`.
|
|
503
|
+
|
|
504
|
+
- **Callable.** `president_operation.run_president_operation(*, brief, findings,
|
|
505
|
+
authorization, invoke, max_substantive_rounds) -> PresidentOperationResult(ruling,
|
|
506
|
+
authorization_identity, rung_index, brief_digest, findings_digest)`. It refuses an
|
|
507
|
+
authorization whose `operation` is not exactly `public_board_president.v1`
|
|
508
|
+
(`PresidentPolicyError("president_operation_authorization_mismatch")`) BEFORE any rung
|
|
509
|
+
is invoked, then walks `PRESIDENT_LADDER` through `invoke` with the president prompt
|
|
510
|
+
built from the findings; the brief is digested, not sent.
|
|
511
|
+
- **Digests.** `brief_digest = sha256(brief)`; `findings_digest =
|
|
512
|
+
sha256("\n".join(findings))` in prompt order; lowercase hex. On a board, the brief is
|
|
513
|
+
the composed president prompt `_president_prompt(findings)`.
|
|
514
|
+
- **Completion grammar.** Per-finding `FINDING <id>: BLOCKING|DEFERRED — <reason>`,
|
|
515
|
+
terminal `FORCING DECISION: <decision>` (`_valid_president_grammar`); a launched rung's
|
|
516
|
+
turn is complete when its last line is a non-empty `FORCING DECISION:`
|
|
517
|
+
(`_completion_ok(text, "president")`), never a review verdict.
|
|
518
|
+
- **Authorization.** `backing.prepare_president_isolation_authorization(board, brief)`
|
|
519
|
+
mints `PresidentIsolationAuthorization` (same seal as review isolation;
|
|
520
|
+
`child_credentialless=True`, `child_network_egress=False`, `live_tree_exposed=False`,
|
|
521
|
+
`api_fallback=False`; subscription routes; brief digest; repository identity when the
|
|
522
|
+
launch has one — the operation reads no tree). The adapter revalidates it
|
|
523
|
+
(`revalidate_president_isolation_authorization`) immediately before a rung launches and
|
|
524
|
+
launches that authorization's route; a seat the authorization does not route (Claude
|
|
525
|
+
included) is refused without launching.
|
|
526
|
+
- **Rung routes** (`president_adapter.build_president_invoke(..., monitoring_policy=)`).
|
|
527
|
+
Unseated rung → typed `president_unavailable` (descend). `sol` / `grok` → the brokered
|
|
528
|
+
`_exec_leg` in a throwaway directory, whose only launch is `launch_provider`. `gemini` →
|
|
529
|
+
the broker's acknowledged agy stream with the PRESIDENT's own final instruction (a ruling,
|
|
530
|
+
not a review verdict), launched through `_run_leg_with_liveness` → `launch_provider` and
|
|
531
|
+
decoded by `_broker_gemini_stream_result`; with the agy subscription credential it runs in
|
|
532
|
+
the broker's agy profile, without one in an empty private HOME (no credential of any kind),
|
|
533
|
+
so the provider itself refuses and the failure is typed. `fable` under Claude Code (from the passed `base_env`; the adapter
|
|
534
|
+
falls back to the process environment only when none is passed, so it never spawns a
|
|
535
|
+
second TUI) → a deferred native fill `{"status": "native_fill_deferred", rung,
|
|
536
|
+
brief_digest, findings_digest}`, refused with `president_fill_heartbeat_refused` under
|
|
537
|
+
`heartbeat_only`. `fable` elsewhere → the brokered self-PTY session
|
|
538
|
+
(`_run_claude_tui_session`, tools off, no directory grant). A failed launch is a typed
|
|
539
|
+
`failed` (`president_invocation_failed`, no descent).
|
|
540
|
+
- **Ladder** (EC-PRESROUTE-3). `PRESIDENT_LADDER` is the seat-alias tuple; each alias
|
|
541
|
+
resolves to its vendor's registry PIN through `DEFAULT_REVIEW_SEAT_ALIASES` (where the
|
|
542
|
+
`model-id-source:` markers live). No model id is spelled in the ladder.
|
|
543
|
+
- **Brokered, monitored launch** (agent-harness#1001). Every non-native rung launch runs
|
|
544
|
+
under the isolation a review seat gets: `isolated_network` egress (no retained
|
|
545
|
+
capabilities), a single-use broker capability minted by
|
|
546
|
+
`backing.derive_president_leg_authorization` from the operation's lease
|
|
547
|
+
(`prepare_president_isolation_authorization(..., monitoring_policy=)` registers it;
|
|
548
|
+
`activate_/close_president_isolation_authorization` bracket each launch) carrying the
|
|
549
|
+
PRESIDENT operation identity, and the `ParentUnixBroker` over read-only staged bytes (the
|
|
550
|
+
brief and a fixed president instruction marker). Under `heartbeat_only` the transport runs
|
|
551
|
+
with a `_ReviewMonitor` -- no model-thinking deadline, no silence kill; cancellation (the
|
|
552
|
+
board's `cancel_event`) and owner loss are the only stops -- and the gemini rung uses the
|
|
553
|
+
owned heartbeat agy profile, and the Claude rung hands the broker's quiescence latch to its
|
|
554
|
+
TUI session. A missing canonical repository, an empty egress prefix (always -- the
|
|
555
|
+
authorization declares no network egress) or a cancelled operation
|
|
556
|
+
(`president_operation_cancelled`, which stops the walk) is a typed refusal before any provider
|
|
557
|
+
starts. Under BOUNDED monitoring only, a patched transport or launch site is the in-process
|
|
558
|
+
control seam and is not brokered (never evidence), as for review seats; `heartbeat_only` is
|
|
559
|
+
always brokered.
|
|
560
|
+
- **Configured ladder** (agent-harness#998 follow-up). `PRESIDENT_LADDER` is the BUILT-IN
|
|
561
|
+
order; the effective order is `advisor_board.config.load_president_ladder(repo_dir, *,
|
|
562
|
+
env, path)`: built-in < the user file's `[president] ladder`
|
|
563
|
+
(`$XDG_CONFIG_HOME/agent-harness/advisor-boards.toml`) < the repository's
|
|
564
|
+
`<repo>/.agent-harness/advisor-boards.toml` (`[president]` only; `[[boards]]` there is
|
|
565
|
+
refused). A ladder is a non-empty list of distinct seat aliases or alias-table model ids
|
|
566
|
+
(`validate_president_ladder`); a malformed one or an unknown key is `BoardConfigError`,
|
|
567
|
+
never a silent fall-back. The seam carries it (`build_president_invoke(..., ladder=)`,
|
|
568
|
+
`PresidentInvoke.ladder`); `invoke_president` walks `effective_president_ladder(invoke)`
|
|
569
|
+
(the seam's ladder, else the built-in), and `rung_index` is the rung's position in THAT
|
|
570
|
+
ladder. The phase-loop runner (`_run_legible_panel`), `advisor-board --landing-tier` and
|
|
571
|
+
`invoke_board`'s auto-wired seam load it; a malformed ladder is refused before any seat
|
|
572
|
+
(`president_ladder_invalid` / CLI exit 2). The user layer follows the environment it is
|
|
573
|
+
given: the auto-wired seam reads it from the passed `base_env` (its `XDG_CONFIG_HOME`,
|
|
574
|
+
else its `HOME`; neither ⇒ no user layer), never from the process HOME.
|
|
575
|
+
- **Defer → resume** (EC-PRESROUTE-2). A deferred Fable rung makes `invoke_board` return
|
|
576
|
+
the seats with `PanelResult.needs_native_president` = `{rung, brief_digest,
|
|
577
|
+
findings_digest, prompt}` and no ruling, persisting `president.pending.json`
|
|
578
|
+
(`president.pending.v1`: the request plus the findings and seat verdicts it was built
|
|
579
|
+
from) to `stream_dir`; a deferral without `stream_dir` is refused
|
|
580
|
+
(`president_native_fill_stream_required`). `invoke_board(..., native_president_fill=
|
|
581
|
+
{rung, brief_digest, findings_digest, text})` RESUMES after the same factory /
|
|
582
|
+
revalidation gate and before any seat launches -- no seat is re-run, so seats that would
|
|
583
|
+
word things differently cannot strand the route. The pending request is BOUND to its run
|
|
584
|
+
(resolved-artifact digest, the review-brief digest captured ONCE before any seat runs,
|
|
585
|
+
the board's ordered seat keys, mode, landing policy, president ladder and the seat each
|
|
586
|
+
rung resolves to under the run's `review_seat_aliases`) and the resume
|
|
587
|
+
refuses any difference. A new deferral removes any `president.ruling.json` an earlier
|
|
588
|
+
run left in the stream (after its pending request is written); every persisted ruling
|
|
589
|
+
removes any pending request (so an older request cannot later resume over it). The
|
|
590
|
+
resume and the ruling record resolve the rung through the run's `review_seat_aliases`. The fill is accepted only when that binding matches, the
|
|
591
|
+
stored verdicts are this board's seats in order and re-derive the stored findings, the
|
|
592
|
+
pending rung is this board's natively filled (Claude) rung, the persisted digests
|
|
593
|
+
recompute from the stored findings, the fill's rung and BOTH digests equal them, and the
|
|
594
|
+
text passes the ruling grammar for those findings. An accepted request is CONSUMED (it
|
|
595
|
+
answers once). This guards against a stale or mismatched stream, not a caller who forges
|
|
596
|
+
its own stream directory (the stream is the caller's durable context); otherwise `president_fill_digest_mismatch` (or
|
|
597
|
+
`president_ruling_format_missing` / `president_native_fill_stream_required`) and nothing
|
|
598
|
+
is persisted. The resumed result carries the deferred seats' verdicts (republished to the
|
|
599
|
+
stream) and the ruling. Under Claude Code, `invoke_board` wires the adapter itself when no
|
|
600
|
+
seam is passed -- keyed on the PASSED `base_env` only, never the process environment.
|
|
601
|
+
- **Ruling record** (EC-PRESROUTE-5). Every president ruling a board obtains on a call that
|
|
602
|
+
has a review stream (`stream_dir`; the runner and the CLI always pass one, and the native
|
|
603
|
+
path refuses without one) is written atomically to `<stream_dir>/president.ruling.json`.
|
|
604
|
+
A stream-less call -- which the frozen SL-0 corpus exercises on several president nodes --
|
|
605
|
+
returns its ruling unrecorded, since there is no stream to record it in. Schema
|
|
606
|
+
`president.ruling.v1`:
|
|
607
|
+
`schema`, `authorization_identity` (`public_board_president.v1`), `rung_index`,
|
|
608
|
+
`model_id` (the ruling rung's registry PIN on the board), `format_reask_count`,
|
|
609
|
+
`brief_digest`, `findings_digest`, `forcing_decision`, `finding_rulings`
|
|
610
|
+
(`[{id, disposition, reason}]`). `president_operation.president_ruling_record(result)`
|
|
611
|
+
builds the same shape from a `PresidentOperationResult`.
|
|
612
|
+
- **Override expiry** (EC-PRESROUTE-4). `panel_invoker.enforce_requires_president(tier,
|
|
613
|
+
*, requires_president)` refuses a `plan`/`production_code` landing carrying
|
|
614
|
+
`requires_president=False` (`requires_president_override_refused`); `invoke_board`
|
|
615
|
+
calls it whenever a `landing_tier` is given. The interim ratification note is EXPIRED.
|
|
616
|
+
- **CLI.** `advisor-board --landing-tier <tier>` runs the board under a tier (a president
|
|
617
|
+
tier binds the seam to the driving process's environment);
|
|
618
|
+
`--native-president FILL.json` resumes a deferred rung against the pending request
|
|
619
|
+
under `--native-fill-dir`/`native-fill/president/`.
|
|
620
|
+
|
|
489
621
|
## Review monitoring policy v1 (agent-harness#892)
|
|
490
622
|
|
|
491
623
|
The opt-in policy vocabulary is `bounded | heartbeat_only`; omission is bounded.
|
|
492
|
-
Heartbeat-only permits
|
|
493
|
-
|
|
494
|
-
or native host seat. Whole-board
|
|
495
|
-
auth, session creation
|
|
624
|
+
Heartbeat-only permits brokered subscription/homebrew Claude TUI, Codex and
|
|
625
|
+
Grok, plus the qualified Gemini extension below. It permits no timeout overrides,
|
|
626
|
+
capture, research, API fallback, gateway or native host seat. Whole-board
|
|
627
|
+
capability preflight precedes availability, auth, session creation and provider
|
|
628
|
+
dispatch. Missing or changed Gemini capability refuses the requested whole board;
|
|
629
|
+
its membership is never reduced or backfilled to satisfy this policy.
|
|
496
630
|
|
|
497
631
|
The requested/effective policy is bound to the operation lease and minted leg.
|
|
498
632
|
Heartbeat-only admission expires 10 seconds after minting and is single-use;
|
|
@@ -523,3 +657,52 @@ PID ownership is established after network entry but before the capability bound
|
|
|
523
657
|
set is emptied. Every launch retains the common provider launch seam and broker
|
|
524
658
|
threads inherit its ContextVar prefix. EgressUnavailable stays DEGRADED with empty
|
|
525
659
|
review text and the exception in detail; sandbox facts describe actual enforcement.
|
|
660
|
+
|
|
661
|
+
### Qualified Gemini extension (agent-harness#905)
|
|
662
|
+
|
|
663
|
+
The Linux x64 subscription `agy` 1.2.10 entry image must match SHA256
|
|
664
|
+
`aea7ed8df1e79b716c0ccd14c7d8086db75b14da535ffb7febdec9a488deff67`.
|
|
665
|
+
The running Python/kernel must support sealed memfds, pidfds and pidfd signaling;
|
|
666
|
+
Python version alone is not a capability check. Unknown images or missing
|
|
667
|
+
capabilities refuse before availability/auth effects. Required bwrap mount/gate
|
|
668
|
+
flags are checked at admission, before inference. Measure help through the
|
|
669
|
+
admitted `agy` filename: the usage line includes that name, while the same
|
|
670
|
+
archive member invoked as `antigravity` produces different help bytes. The
|
|
671
|
+
measured help defines literal `--print-timeout 0` as waiting for completion.
|
|
672
|
+
A quick real completion establishes compatibility; clock controls establish
|
|
673
|
+
that old runtime deadlines and silence cannot terminate a healthy heartbeat-only
|
|
674
|
+
operation.
|
|
675
|
+
|
|
676
|
+
The sealed image and deny-all settings are read-only mounts inside a private
|
|
677
|
+
HOME owned by the existing PID/mount namespace. A private symlink references the
|
|
678
|
+
subscription credential; no credential payload is copied, logged or restored.
|
|
679
|
+
Heartbeat credential lookup uses the supplied scrubbed HOME, recording a process
|
|
680
|
+
HOME fallback truthfully if HOME is absent. Legitimate refresh writes survive.
|
|
681
|
+
The real qualification driver requires an explicit HOME and checks target
|
|
682
|
+
presence before and after, without reading its contents.
|
|
683
|
+
|
|
684
|
+
The broker transports same-session acknowledged input over stdin, with no tree
|
|
685
|
+
attachment, `--add-dir`, permission bypass, retry or native thinking timer. Empty,
|
|
686
|
+
rejected and nonzero-exit streams remain non-votes with fixed diagnostics;
|
|
687
|
+
provider stdout/stderr and arbitrary exception strings are not substituted for
|
|
688
|
+
review prose. Native timeout under zero has a distinct diagnostic. Bounded
|
|
689
|
+
retry timing and supported positive deadline argv remain unchanged; accepted
|
|
690
|
+
Gemini review prose excludes stderr.
|
|
691
|
+
|
|
692
|
+
Namespace init identity is held before execution is released. Cancellation
|
|
693
|
+
reaps before closing a blocked execution gate; abrupt owner death can release
|
|
694
|
+
its EOF gate shortly before the parent-death signal takes effect. There is no
|
|
695
|
+
strict zero-exec claim for abrupt loss. Cleanup requires namespace-init exit
|
|
696
|
+
and corroborating observations, including detached/nested descendants. Failed
|
|
697
|
+
quiescence cannot yield a usable vote. No receipt proves remote billing settlement.
|
|
698
|
+
|
|
699
|
+
`phase-loop-runtime/scripts/qualify_gemini_heartbeat.py` separately qualifies
|
|
700
|
+
completion, cancellation after observed progress, and abrupt owner loss. Its
|
|
701
|
+
receipts bind package source, image/help/profile/helper hashes, inputs, argv,
|
|
702
|
+
monitoring, broker records and local cleanup observations. Helper evidence is
|
|
703
|
+
sampled, not a complete exec audit; the entry image pin does not freeze helper
|
|
704
|
+
images. Directory validation accounts for every attempt in the declared series
|
|
705
|
+
root, rejecting failures, omissions and terminal/admission mismatches. Preserve
|
|
706
|
+
failed series; diagnose a changed candidate before another attempt. Validation
|
|
707
|
+
uses that host's measured helper images. These receipts do not replace the
|
|
708
|
+
historical bounded-success evidence verifier.
|
|
@@ -225,7 +225,7 @@ def resolve_review_monitoring_policy(
|
|
|
225
225
|
raise ValueError("review_monitoring_unsupported_api_fallback")
|
|
226
226
|
for seat in getattr(board, "seats", ()):
|
|
227
227
|
lane = str(seat.harness or "").lower()
|
|
228
|
-
if (lane not in ("claude", "codex", "grok")
|
|
228
|
+
if (lane not in ("claude", "codex", "grok", "gemini")
|
|
229
229
|
or seat.auth != AUTH_SUBSCRIPTION or seat.backing != BACKING_HOMEBREW
|
|
230
230
|
or seat.host_leg):
|
|
231
231
|
raise ValueError(f"review_monitoring_unsupported_route:{lane or 'unresolved'}")
|
|
@@ -1292,8 +1292,38 @@ CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS: tuple[str, ...] = (
|
|
|
1292
1292
|
)
|
|
1293
1293
|
|
|
1294
1294
|
|
|
1295
|
+
# API-key variables of a SUBSCRIPTION-ONLY harness (agent-harness#864). They are removed
|
|
1296
|
+
# from every subscription child environment but are deliberately NOT in
|
|
1297
|
+
# ``VENDOR_API_KEY_VARS``: that map is also the api-key INJECTION map, and grok has no
|
|
1298
|
+
# api-key lane (``registries``), so no opt-in may ever inject one. Names from the grok
|
|
1299
|
+
# CLI's own documentation: ``XAI_API_KEY`` (Bearer API key) and ``GROK_CODE_XAI_API_KEY``
|
|
1300
|
+
# (its backward-compatible alias).
|
|
1301
|
+
SUBSCRIPTION_SCRUB_ONLY_VARS: tuple[str, ...] = ("XAI_API_KEY", "GROK_CODE_XAI_API_KEY")
|
|
1302
|
+
|
|
1303
|
+
# Endpoint selectors that redirect a grok child's inference traffic away from the
|
|
1304
|
+
# subscription service -- the grok counterpart of ``ANTHROPIC_BASE_URL`` in
|
|
1305
|
+
# ``CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS``. Documented by the grok CLI (1.0.41):
|
|
1306
|
+
# ``GROK_CLI_CHAT_PROXY_BASE_URL`` (override the cli-chat-proxy URL),
|
|
1307
|
+
# ``GROK_XAI_API_BASE_URL`` (public xAI API base) and ``GROK_MODELS_BASE_URL`` (custom
|
|
1308
|
+
# inference base URL). ``XAI_API_BASE_URL`` is NOT shown to be read by the CLI; it is
|
|
1309
|
+
# removed defensively (an xAI SDK-style endpoint name; removing it is harmless).
|
|
1310
|
+
# Not exhaustive: other grok configuration (e.g. its config-file endpoints) is out of
|
|
1311
|
+
# an environment scrub's reach.
|
|
1312
|
+
GROK_SUBSCRIPTION_BLOCKED_ENV_VARS: tuple[str, ...] = (
|
|
1313
|
+
"GROK_CLI_CHAT_PROXY_BASE_URL",
|
|
1314
|
+
"GROK_XAI_API_BASE_URL",
|
|
1315
|
+
"GROK_MODELS_BASE_URL",
|
|
1316
|
+
"XAI_API_BASE_URL",
|
|
1317
|
+
)
|
|
1318
|
+
|
|
1319
|
+
|
|
1295
1320
|
def all_vendor_key_vars() -> tuple[str, ...]:
|
|
1296
|
-
"""Every vendor API-key var (
|
|
1321
|
+
"""Every INJECTABLE vendor API-key var (``VENDOR_API_KEY_VARS``).
|
|
1322
|
+
|
|
1323
|
+
A subset of what a subscription seat loses: ``scrub_subscription_env`` also removes
|
|
1324
|
+
``SUBSCRIPTION_SCRUB_ONLY_VARS`` and the per-harness blocked selectors. Filter with
|
|
1325
|
+
``scrub_subscription_env``, never with this alone.
|
|
1326
|
+
"""
|
|
1297
1327
|
seen: list[str] = []
|
|
1298
1328
|
for vars_ in VENDOR_API_KEY_VARS.values():
|
|
1299
1329
|
for var in vars_:
|
|
@@ -1305,12 +1335,19 @@ def all_vendor_key_vars() -> tuple[str, ...]:
|
|
|
1305
1335
|
def scrub_subscription_env(base_env: Mapping[str, str]) -> dict[str, str]:
|
|
1306
1336
|
"""Return a subscription-only child environment.
|
|
1307
1337
|
|
|
1308
|
-
All vendor API keys are removed
|
|
1338
|
+
All vendor API keys are removed -- including the api-key variables of the
|
|
1339
|
+
subscription-only grok harness (``SUBSCRIPTION_SCRUB_ONLY_VARS``) and grok's
|
|
1340
|
+
endpoint redirects (``GROK_SUBSCRIPTION_BLOCKED_ENV_VARS``). Claude-specific credential helpers,
|
|
1309
1341
|
custom request headers, alternate endpoints, and cloud-provider selectors
|
|
1310
1342
|
are removed as well so a Claude seat cannot silently escape the first-party
|
|
1311
1343
|
subscription lane.
|
|
1312
1344
|
"""
|
|
1313
|
-
blocked =
|
|
1345
|
+
blocked = (
|
|
1346
|
+
set(all_vendor_key_vars())
|
|
1347
|
+
| set(SUBSCRIPTION_SCRUB_ONLY_VARS)
|
|
1348
|
+
| set(CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS)
|
|
1349
|
+
| set(GROK_SUBSCRIPTION_BLOCKED_ENV_VARS)
|
|
1350
|
+
)
|
|
1314
1351
|
return {key: value for key, value in base_env.items() if key not in blocked}
|
|
1315
1352
|
|
|
1316
1353
|
|
|
@@ -1384,6 +1421,246 @@ def resolve_seat_env(
|
|
|
1384
1421
|
raise ValueError(f"unknown seat.auth {seat.auth!r}")
|
|
1385
1422
|
|
|
1386
1423
|
|
|
1424
|
+
# --- PRESROUTE (v10 Phase 14): the president operation's authorization ---------------
|
|
1425
|
+
#
|
|
1426
|
+
# ADDITIVE beside ``public_board_review.v1``; the review authorization above is not
|
|
1427
|
+
# touched. The president operation rules on a board's findings; it never reads a
|
|
1428
|
+
# tree, so no tree is staged and none is exposed. Minted like review isolation (the
|
|
1429
|
+
# same seal, subscription routes and repository-identity digest) and revalidated
|
|
1430
|
+
# immediately before a rung launches, exactly as ``spawn`` revalidates the review
|
|
1431
|
+
# authorization before it launches.
|
|
1432
|
+
|
|
1433
|
+
PRESIDENT_OPERATION_V1 = "public_board_president.v1"
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
@dataclass(frozen=True)
|
|
1437
|
+
class PresidentIsolationAuthorization:
|
|
1438
|
+
"""Capability for one brokered president operation over one brief.
|
|
1439
|
+
|
|
1440
|
+
Metadata and digests only, like :class:`ReviewIsolationAuthorization`: no child
|
|
1441
|
+
credential, provider method, host command or live-tree path crosses it, and
|
|
1442
|
+
``_seal`` is identity-checked here and never serialized.
|
|
1443
|
+
"""
|
|
1444
|
+
|
|
1445
|
+
operation: str
|
|
1446
|
+
purpose: str
|
|
1447
|
+
brief_sha256: str
|
|
1448
|
+
broker_contract: str
|
|
1449
|
+
routes: tuple[tuple[str, str], ...]
|
|
1450
|
+
child_credentialless: bool
|
|
1451
|
+
child_network_egress: bool
|
|
1452
|
+
live_tree_exposed: bool
|
|
1453
|
+
api_fallback: bool
|
|
1454
|
+
canonical_repo_sha256: str
|
|
1455
|
+
issued_monotonic_ns: int
|
|
1456
|
+
_seal: object
|
|
1457
|
+
# agent-harness#1001: the policy every rung launch of this operation runs under.
|
|
1458
|
+
# ``heartbeat_only`` = no model-thinking deadline and no silence kill; the leg's
|
|
1459
|
+
# admission window is the only clock. Bound to the operation's lease.
|
|
1460
|
+
monitoring_policy: str = "bounded"
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
def _president_repo_digest(canonical_repo_authority: Path | str | None) -> str:
|
|
1464
|
+
"""Repository identity when there is one, else ``""``.
|
|
1465
|
+
|
|
1466
|
+
Unlike review isolation, the president operation reads no tree -- only the findings
|
|
1467
|
+
text in its brief -- so a missing repository is not a reason to refuse it. Where a
|
|
1468
|
+
repository exists its identity is still bound, and revalidation recomputes the same
|
|
1469
|
+
value, so an authorization carried to a different repository is refused.
|
|
1470
|
+
"""
|
|
1471
|
+
try:
|
|
1472
|
+
return _canonical_repo_digest(canonical_repo_authority)
|
|
1473
|
+
except ValueError:
|
|
1474
|
+
return ""
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
def _president_routes(board: object) -> tuple[tuple[str, str], ...]:
|
|
1478
|
+
routes: list[tuple[str, str]] = []
|
|
1479
|
+
for seat in getattr(board, "seats", ()):
|
|
1480
|
+
harness = str(getattr(seat, "harness", "") or "").lower()
|
|
1481
|
+
model = str(getattr(seat, "model", ""))
|
|
1482
|
+
if not harness:
|
|
1483
|
+
continue
|
|
1484
|
+
if getattr(seat, "auth", None) != AUTH_SUBSCRIPTION or getattr(seat, "backing", None) != BACKING_HOMEBREW:
|
|
1485
|
+
continue
|
|
1486
|
+
try:
|
|
1487
|
+
routes.append((harness, harden_subscription_model(harness, model, getattr(seat, "effort", None))))
|
|
1488
|
+
except ValueError:
|
|
1489
|
+
# Same rule as review isolation: a non-policy Claude seat is a native-host
|
|
1490
|
+
# fill, never a brokered provider route.
|
|
1491
|
+
if harness != "claude":
|
|
1492
|
+
raise
|
|
1493
|
+
return tuple(routes)
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
def prepare_president_isolation_authorization(
|
|
1497
|
+
board: object,
|
|
1498
|
+
brief: str,
|
|
1499
|
+
*,
|
|
1500
|
+
canonical_repo_authority: Path | str | None = None,
|
|
1501
|
+
monitoring_policy: str = "bounded",
|
|
1502
|
+
) -> PresidentIsolationAuthorization:
|
|
1503
|
+
"""Authorize one president operation over ``brief`` before any provider effect.
|
|
1504
|
+
|
|
1505
|
+
Registers the operation's single-use lease (as review isolation does): a brokered
|
|
1506
|
+
rung launch activates it, derives one leg capability per launch from it, and closes it.
|
|
1507
|
+
"""
|
|
1508
|
+
if platform.system() != "Linux":
|
|
1509
|
+
raise ValueError("HARDEN president isolation requires Linux")
|
|
1510
|
+
if monitoring_policy not in ("bounded", "heartbeat_only"):
|
|
1511
|
+
raise ValueError("review_monitoring_policy_invalid")
|
|
1512
|
+
authorization = PresidentIsolationAuthorization(
|
|
1513
|
+
operation=PRESIDENT_OPERATION_V1,
|
|
1514
|
+
purpose=str(getattr(board, "purpose", "")),
|
|
1515
|
+
brief_sha256=sha256(brief.encode("utf-8")).hexdigest(),
|
|
1516
|
+
broker_contract=PARENT_UNIX_BROKER_V1,
|
|
1517
|
+
routes=_president_routes(board),
|
|
1518
|
+
child_credentialless=True,
|
|
1519
|
+
child_network_egress=False,
|
|
1520
|
+
live_tree_exposed=False,
|
|
1521
|
+
api_fallback=False,
|
|
1522
|
+
canonical_repo_sha256=_president_repo_digest(canonical_repo_authority),
|
|
1523
|
+
issued_monotonic_ns=time.monotonic_ns(),
|
|
1524
|
+
_seal=_AUTHORIZATION_SEAL,
|
|
1525
|
+
monitoring_policy=monitoring_policy,
|
|
1526
|
+
)
|
|
1527
|
+
_remember_lease(authorization) # type: ignore[arg-type]
|
|
1528
|
+
return authorization
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
def revalidate_president_isolation_authorization(
|
|
1532
|
+
authorization: PresidentIsolationAuthorization | None,
|
|
1533
|
+
board: object,
|
|
1534
|
+
brief: str,
|
|
1535
|
+
*,
|
|
1536
|
+
canonical_repo_authority: Path | str | None = None,
|
|
1537
|
+
) -> None:
|
|
1538
|
+
"""Independently revalidate a president authorization immediately before use.
|
|
1539
|
+
|
|
1540
|
+
Refuses a missing, forged or foreign authorization, one minted for another
|
|
1541
|
+
brief or board, and one whose isolation posture was altered.
|
|
1542
|
+
"""
|
|
1543
|
+
if (
|
|
1544
|
+
not isinstance(authorization, PresidentIsolationAuthorization)
|
|
1545
|
+
or authorization._seal is not _AUTHORIZATION_SEAL
|
|
1546
|
+
):
|
|
1547
|
+
raise ValueError("missing or forged HARDEN president authorization")
|
|
1548
|
+
if (
|
|
1549
|
+
authorization.operation != PRESIDENT_OPERATION_V1
|
|
1550
|
+
or authorization.brief_sha256 != sha256(brief.encode("utf-8")).hexdigest()
|
|
1551
|
+
or authorization.broker_contract != PARENT_UNIX_BROKER_V1
|
|
1552
|
+
or authorization.routes != _president_routes(board)
|
|
1553
|
+
or not authorization.child_credentialless
|
|
1554
|
+
or authorization.child_network_egress
|
|
1555
|
+
or authorization.live_tree_exposed
|
|
1556
|
+
or authorization.api_fallback
|
|
1557
|
+
or authorization.canonical_repo_sha256 != _president_repo_digest(canonical_repo_authority)
|
|
1558
|
+
):
|
|
1559
|
+
raise ValueError("HARDEN president authorization does not match this operation")
|
|
1560
|
+
try:
|
|
1561
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1562
|
+
except ValueError:
|
|
1563
|
+
lease = None
|
|
1564
|
+
if lease is not None and lease.monitoring_policy != authorization.monitoring_policy:
|
|
1565
|
+
raise ValueError("review_monitoring_policy_mismatch")
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
def activate_president_isolation_authorization(
|
|
1569
|
+
authorization: PresidentIsolationAuthorization | None,
|
|
1570
|
+
board: object,
|
|
1571
|
+
brief: str,
|
|
1572
|
+
*,
|
|
1573
|
+
canonical_repo_authority: Path | str | None = None,
|
|
1574
|
+
) -> None:
|
|
1575
|
+
"""Claim the operation's single-use lease before its first host effect (agent-harness#1001)."""
|
|
1576
|
+
revalidate_president_isolation_authorization(
|
|
1577
|
+
authorization, board, brief, canonical_repo_authority=canonical_repo_authority
|
|
1578
|
+
)
|
|
1579
|
+
assert authorization is not None
|
|
1580
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1581
|
+
with lease.lock:
|
|
1582
|
+
if lease.closed or lease.active:
|
|
1583
|
+
raise ValueError("HARDEN president authorization is not available for activation")
|
|
1584
|
+
if time.monotonic_ns() - lease.prepared_monotonic_ns > _PRE_ACTIVATION_FRESHNESS_NS:
|
|
1585
|
+
raise ValueError("HARDEN president authorization expired before activation")
|
|
1586
|
+
lease.active = True
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
def close_president_isolation_authorization(
|
|
1590
|
+
authorization: PresidentIsolationAuthorization | None,
|
|
1591
|
+
) -> None:
|
|
1592
|
+
"""Close the operation's lease on every path; a closed lease can never be revived."""
|
|
1593
|
+
if not isinstance(authorization, PresidentIsolationAuthorization):
|
|
1594
|
+
return
|
|
1595
|
+
try:
|
|
1596
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1597
|
+
except ValueError:
|
|
1598
|
+
return
|
|
1599
|
+
with lease.lock:
|
|
1600
|
+
lease.active = False
|
|
1601
|
+
lease.closed = True
|
|
1602
|
+
lease.cancel_event.set()
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
def derive_president_leg_authorization(
|
|
1606
|
+
authorization: PresidentIsolationAuthorization | None,
|
|
1607
|
+
board: object,
|
|
1608
|
+
brief: str,
|
|
1609
|
+
*,
|
|
1610
|
+
harness: str,
|
|
1611
|
+
model: str,
|
|
1612
|
+
deadline_s: float | None,
|
|
1613
|
+
instructions_sha256: str,
|
|
1614
|
+
canonical_repo_authority: Path | str | None,
|
|
1615
|
+
) -> ReviewLegAuthorization:
|
|
1616
|
+
"""Mint the single-route broker capability for ONE president rung launch.
|
|
1617
|
+
|
|
1618
|
+
The capability carries the PRESIDENT operation identity (never the review one),
|
|
1619
|
+
the brief as its bound input, and the operation's monitoring policy. A brokered
|
|
1620
|
+
launch needs a probeable canonical repository; without one it is refused here,
|
|
1621
|
+
before any host effect, with that reason.
|
|
1622
|
+
"""
|
|
1623
|
+
revalidate_president_isolation_authorization(
|
|
1624
|
+
authorization, board, brief, canonical_repo_authority=canonical_repo_authority
|
|
1625
|
+
)
|
|
1626
|
+
assert authorization is not None
|
|
1627
|
+
if not authorization.canonical_repo_sha256:
|
|
1628
|
+
raise ValueError("president broker isolation requires a canonical repository")
|
|
1629
|
+
policy = authorization.monitoring_policy
|
|
1630
|
+
if (
|
|
1631
|
+
(harness, model) not in authorization.routes
|
|
1632
|
+
or (policy == "bounded" and (
|
|
1633
|
+
deadline_s is None or not math.isfinite(deadline_s) or deadline_s <= 0))
|
|
1634
|
+
or (policy == "heartbeat_only" and deadline_s is not None)
|
|
1635
|
+
):
|
|
1636
|
+
raise ValueError("invalid HARDEN president leg authority")
|
|
1637
|
+
lease = _lease_for(authorization) # type: ignore[arg-type]
|
|
1638
|
+
route = (harness, model)
|
|
1639
|
+
with lease.lock:
|
|
1640
|
+
if lease.closed or not lease.active:
|
|
1641
|
+
raise ValueError("HARDEN president authorization is not active")
|
|
1642
|
+
if lease.route_counts[route] <= 0:
|
|
1643
|
+
raise ValueError("HARDEN president route occurrence already consumed")
|
|
1644
|
+
lease.route_counts[route] -= 1
|
|
1645
|
+
issued = time.monotonic_ns()
|
|
1646
|
+
leg = ReviewLegAuthorization(
|
|
1647
|
+
operation=authorization.operation, purpose=authorization.purpose,
|
|
1648
|
+
input_sha256=authorization.brief_sha256,
|
|
1649
|
+
instructions_sha256=instructions_sha256,
|
|
1650
|
+
canonical_repo_sha256=authorization.canonical_repo_sha256,
|
|
1651
|
+
broker_contract=PARENT_UNIX_BROKER_V1, harness=harness, model=model,
|
|
1652
|
+
issued_monotonic_ns=issued,
|
|
1653
|
+
expires_monotonic_ns=issued + (
|
|
1654
|
+
10_000_000_000 if policy == "heartbeat_only"
|
|
1655
|
+
else int(float(deadline_s) * 1_000_000_000) + _BROKER_TRANSPORT_ALLOWANCE_NS # type: ignore[arg-type]
|
|
1656
|
+
),
|
|
1657
|
+
_seal=_AUTHORIZATION_SEAL,
|
|
1658
|
+
monitoring_policy=policy,
|
|
1659
|
+
)
|
|
1660
|
+
_remember_leg_claim(leg, lease)
|
|
1661
|
+
return leg
|
|
1662
|
+
|
|
1663
|
+
|
|
1387
1664
|
__all__ = [
|
|
1388
1665
|
"PARENT_UNIX_BROKER_V1",
|
|
1389
1666
|
"HARDEN_SUPPORTED_SUBSCRIPTION_ROUTES",
|
|
@@ -1402,6 +1679,15 @@ __all__ = [
|
|
|
1402
1679
|
"derive_review_leg_authorization",
|
|
1403
1680
|
"revalidate_review_isolation_authorization",
|
|
1404
1681
|
"revalidate_review_composition_authorization",
|
|
1682
|
+
"PRESIDENT_OPERATION_V1",
|
|
1683
|
+
"PresidentIsolationAuthorization",
|
|
1684
|
+
"activate_president_isolation_authorization",
|
|
1685
|
+
"close_president_isolation_authorization",
|
|
1686
|
+
"derive_president_leg_authorization",
|
|
1687
|
+
"prepare_president_isolation_authorization",
|
|
1688
|
+
"revalidate_president_isolation_authorization",
|
|
1689
|
+
"GROK_SUBSCRIPTION_BLOCKED_ENV_VARS",
|
|
1690
|
+
"SUBSCRIPTION_SCRUB_ONLY_VARS",
|
|
1405
1691
|
"VENDOR_API_KEY_VARS",
|
|
1406
1692
|
"CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS",
|
|
1407
1693
|
"all_vendor_key_vars",
|