phase-loop-runtime 0.7.10__tar.gz → 0.7.11__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.10 → phase_loop_runtime-0.7.11}/PKG-INFO +3 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/protocol/protocol.md +1 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/pyproject.toml +12 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +19 -1
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +72 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +19 -13
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/__init__.py +56 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/backing.py +53 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/composition.py +2 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/config.py +18 -6
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/fixtures.py +20 -14
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/advisor_board/harness_mapping.py +219 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/observability.py +31 -7
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/presets.py +6 -6
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/registries.py +7 -1
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/advisor_board/research.py +528 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/schema.py +87 -4
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_modular.py +6 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +35 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/build_bundle.py +7 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/capability_registry.py +36 -3
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/cli.py +429 -3
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/closeout.py +15 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/closeout_validators.py +56 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/convergence/broker/credsep.py +316 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/fab_canonical.py +908 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/fab_delta.py +1443 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/fab_gate.py +2026 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/fab_producer.py +746 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/fab_provenance.py +1828 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/governed_bundle.py +60 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/governed_premerge.py +393 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/launcher.py +114 -15
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/models.py +762 -9
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/observability.py +31 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/panel_invoker.py +993 -195
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/profiles.py +935 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/reconcile.py +127 -11
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/redaction.py +666 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/runner.py +1092 -108
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/runtime_paths.py +9 -3
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +80 -0
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +80 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +12 -8
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +2 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +20 -20
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +20 -20
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +1 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +16 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +16 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +16 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +16 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/train_ledger.py +89 -5
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/train_runner.py +3208 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/verification_evidence.py +222 -7
- phase_loop_runtime-0.7.11/src/phase_loop_runtime/visual_avatar_evidence_validator.py +220 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/PKG-INFO +3 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/SOURCES.txt +26 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/requires.txt +3 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_backcompat.py +24 -11
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_backing_homebrew.py +24 -23
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_backing_omnigent.py +2 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_config.py +30 -3
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_golden.py +38 -37
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_integration.py +24 -3
- phase_loop_runtime-0.7.11/tests/test_advisor_board_live_research.py +145 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_observability.py +35 -5
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_presets.py +15 -9
- phase_loop_runtime-0.7.11/tests/test_advisor_board_research.py +627 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_resolver.py +5 -7
- phase_loop_runtime-0.7.11/tests/test_closeout_verification_gate.py +418 -0
- phase_loop_runtime-0.7.11/tests/test_committed_range_diff.py +73 -0
- phase_loop_runtime-0.7.11/tests/test_convergence_broker_credsep.py +721 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_live_enable.py +11 -11
- phase_loop_runtime-0.7.11/tests/test_delegated_visual_evidence_91.py +351 -0
- phase_loop_runtime-0.7.11/tests/test_fab_activation_promotion.py +1468 -0
- phase_loop_runtime-0.7.11/tests/test_fab_canonical_b.py +873 -0
- phase_loop_runtime-0.7.11/tests/test_fab_closeout_crash_safety.py +689 -0
- phase_loop_runtime-0.7.11/tests/test_fab_closeout_wiring.py +198 -0
- phase_loop_runtime-0.7.11/tests/test_fab_delta_c.py +1782 -0
- phase_loop_runtime-0.7.11/tests/test_fab_delta_consumer.py +937 -0
- phase_loop_runtime-0.7.11/tests/test_fab_gate_d.py +1886 -0
- phase_loop_runtime-0.7.11/tests/test_fab_producer.py +299 -0
- phase_loop_runtime-0.7.11/tests/test_fab_provenance_a.py +833 -0
- phase_loop_runtime-0.7.11/tests/test_gate_parity_244_245.py +511 -0
- phase_loop_runtime-0.7.11/tests/test_grok_narrow_reject_231.py +243 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_hotfix_lane.py +63 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_leg_liveness_monitor.py +1 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_model_class_policy.py +84 -13
- phase_loop_runtime-0.7.11/tests/test_model_tier_taxonomy.py +431 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_invoker_spawn.py +52 -15
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_leg_auth_preflight_64.py +85 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_native_fill_183.py +33 -38
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_per_leg_model_66.py +1 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_streaming_verdicts.py +2 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_tui_liveness_188.py +99 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_tui_workspace_trust_223.py +5 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_modular.py +14 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_execution_policy.py +32 -2
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_launcher.py +51 -7
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_models.py +7 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_protocol_contract.py +14 -1
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_reconcile.py +32 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runner.py +279 -9
- phase_loop_runtime-0.7.11/tests/test_reconcile_portability_85c.py +1112 -0
- phase_loop_runtime-0.7.11/tests/test_reconcile_visual_avatar_evidence_91.py +885 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_routing_invariants.py +3 -1
- phase_loop_runtime-0.7.11/tests/test_runner_visual_evidence_authoritative_91.py +306 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skills_canon_parity.py +3 -3
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_e2e.py +14 -14
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_invariants.py +14 -14
- phase_loop_runtime-0.7.11/tests/test_train_merge.py +3005 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_prebuilt.py +157 -0
- phase_loop_runtime-0.7.11/tests/test_verification_evidence.py +2524 -0
- phase_loop_runtime-0.7.11/tests/test_visual_avatar_evidence_validator.py +979 -0
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -60
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -144
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/convergence/broker/credsep.py +0 -211
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/governed_premerge.py +0 -219
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/profiles.py +0 -479
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/redaction.py +0 -184
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -69
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -69
- phase_loop_runtime-0.7.10/src/phase_loop_runtime/train_runner.py +0 -1526
- phase_loop_runtime-0.7.10/tests/test_closeout_verification_gate.py +0 -167
- phase_loop_runtime-0.7.10/tests/test_convergence_broker_credsep.py +0 -349
- phase_loop_runtime-0.7.10/tests/test_reconcile_portability_85c.py +0 -251
- phase_loop_runtime-0.7.10/tests/test_train_merge.py +0 -1615
- phase_loop_runtime-0.7.10/tests/test_verification_evidence.py +0 -618
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/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.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/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.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.10 → phase_loop_runtime-0.7.11}/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.11
|
|
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
|
|
@@ -24,6 +24,8 @@ Requires-Dist: packaging>=21
|
|
|
24
24
|
Requires-Dist: websockets<16,>=12
|
|
25
25
|
Requires-Dist: rfc8785<0.2,>=0.1.4
|
|
26
26
|
Requires-Dist: tomli<3,>=2; python_version < "3.11"
|
|
27
|
+
Provides-Extra: visual
|
|
28
|
+
Requires-Dist: Pillow<13,>=10; extra == "visual"
|
|
27
29
|
|
|
28
30
|
# phase-loop-runtime
|
|
29
31
|
|
|
@@ -588,7 +588,7 @@ The accepted syntax is line-oriented markdown:
|
|
|
588
588
|
## Execution Policy
|
|
589
589
|
- work-unit defaults: work-unit=`lane_execute`, effort=`medium`, unsupported=`inherit_default`, inherit-default=`true`
|
|
590
590
|
- execute: executor=`pi`, model=`auto`, effort=`medium`, work-unit=`lane_execute`, reason=`simple bounded lane default`
|
|
591
|
-
- repair: executor=`claude`, model=`claude-
|
|
591
|
+
- repair: executor=`claude`, model=`claude-sonnet-5`, effort=`medium`, work-unit=`repair`
|
|
592
592
|
- SL-2: executor=`gemini`, model=`phase-loop-execute-medium`, effort=`medium`, work-unit=`lane_execute`, unsupported=`fallback`, fallback=`phase-loop-execute-medium`
|
|
593
593
|
```
|
|
594
594
|
|
|
@@ -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.11"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -60,6 +60,17 @@ dependencies = [
|
|
|
60
60
|
"tomli>=2,<3; python_version < '3.11'",
|
|
61
61
|
]
|
|
62
62
|
|
|
63
|
+
[project.optional-dependencies]
|
|
64
|
+
# FAV visual-evidence gate (agent-harness#91, round-3 CR): the runner-side
|
|
65
|
+
# `derive_visual_observation` decodes the referenced image artifact and
|
|
66
|
+
# computes pixel stats FROM THE ACTUAL PIXELS, so self-reported
|
|
67
|
+
# non_black_pixels/pixel_min/pixel_max can never override a real decode.
|
|
68
|
+
# Pillow is imported LAZILY inside the derivation (models.py) -- it is NOT a
|
|
69
|
+
# hard core dependency; an install without the `visual` extra still runs
|
|
70
|
+
# every other command, and the visual-evidence gate itself fails CLOSED
|
|
71
|
+
# (never silently passes on self-reported numbers) when Pillow is absent.
|
|
72
|
+
visual = ["Pillow>=10,<13"]
|
|
73
|
+
|
|
63
74
|
[project.urls]
|
|
64
75
|
Homepage = "https://github.com/ViperJuice/agent-harness"
|
|
65
76
|
Repository = "https://github.com/ViperJuice/agent-harness"
|
|
@@ -588,7 +588,7 @@ The accepted syntax is line-oriented markdown:
|
|
|
588
588
|
## Execution Policy
|
|
589
589
|
- work-unit defaults: work-unit=`lane_execute`, effort=`medium`, unsupported=`inherit_default`, inherit-default=`true`
|
|
590
590
|
- execute: executor=`pi`, model=`auto`, effort=`medium`, work-unit=`lane_execute`, reason=`simple bounded lane default`
|
|
591
|
-
- repair: executor=`claude`, model=`claude-
|
|
591
|
+
- repair: executor=`claude`, model=`claude-sonnet-5`, effort=`medium`, work-unit=`repair`
|
|
592
592
|
- SL-2: executor=`gemini`, model=`phase-loop-execute-medium`, effort=`medium`, work-unit=`lane_execute`, unsupported=`fallback`, fallback=`phase-loop-execute-medium`
|
|
593
593
|
```
|
|
594
594
|
|
|
@@ -1862,6 +1862,24 @@ These fields are the shared child-exit reduction contract. Adapters may add
|
|
|
1862
1862
|
transport-specific metadata elsewhere, but they must not rename or omit these
|
|
1863
1863
|
summary fields.
|
|
1864
1864
|
|
|
1865
|
+
The following visual-avatar-evidence fields (FAV, issue #91) are OPTIONAL — they
|
|
1866
|
+
are emitted only when the native closeout carried them (an avatar/browser-media
|
|
1867
|
+
phase that attached runner-owned visual evidence or a typed opt-out). Ordinary
|
|
1868
|
+
phases omit them entirely, but when present they are part of the reduction
|
|
1869
|
+
contract the closeout validator inspects, so they must not be silently dropped:
|
|
1870
|
+
|
|
1871
|
+
- `visual_evidence_path`
|
|
1872
|
+
- `visual_evidence_observed`
|
|
1873
|
+
- `visual_evidence_opt_out`
|
|
1874
|
+
|
|
1875
|
+
`visual_render_declared` (FAV, issue #272) is likewise OPTIONAL and emitted
|
|
1876
|
+
only when carried by the native closeout. It is the DECLARED signal: the
|
|
1877
|
+
visual-evidence gate's BLOCK decision reads this bool (plus evidence
|
|
1878
|
+
validity once declared) and NOTHING else -- an owned avatar/browser-media
|
|
1879
|
+
surface or an explicit visible-render claim in the plan text never blocks on
|
|
1880
|
+
their own; they only raise a non-blocking `visual_render_undeclared_surface`
|
|
1881
|
+
advisory when the phase never declared.
|
|
1882
|
+
|
|
1865
1883
|
## Monitor Payloads
|
|
1866
1884
|
|
|
1867
1885
|
`build_notification_payload(...)` must emit exactly these top-level fields:
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Verification Evidence Contract
|
|
2
|
+
|
|
3
|
+
VC freezes the additive verification evidence artifact for future runner wiring. Until a later phase consumes it, the only producer is `phase_loop_runtime.verification_evidence.run_verification`.
|
|
4
|
+
|
|
5
|
+
`run_verification(repo, run_dir, commands, suite_command, env_refresh, timeout_s, operational_exemptions=None, python_pin=None, phase_alias=None) -> VerificationResult` writes two sibling files under the supplied run directory. The optional `phase_alias` is the LIVE run alias (ah#85). `verification.json`'s `phase_alias` resolves in strict precedence order: the operator env override (`PHASE_LOOP_PHASE_ALIAS` / `PHASE_ALIAS`) wins if set, else the supplied `phase_alias` (the live run alias) if provided, else `.phase-loop/state.json:current_phase`, else `"unknown"`. Threading the live alias on the execute path keeps the artifact from mis-attributing the phase after a mid-run roadmap amendment changes `current_phase`; the env override remains the highest-priority operator escape-hatch.
|
|
6
|
+
|
|
7
|
+
- `verification.json`
|
|
8
|
+
- `verification.log`
|
|
9
|
+
|
|
10
|
+
`verification.json` uses schema version 2 and contains exactly these top-level fields:
|
|
11
|
+
|
|
12
|
+
- `schema_version`
|
|
13
|
+
- `run_id`
|
|
14
|
+
- `phase_alias`
|
|
15
|
+
- `commands`
|
|
16
|
+
- `env_refresh`
|
|
17
|
+
- `suite`
|
|
18
|
+
- `started_at`
|
|
19
|
+
- `finished_at`
|
|
20
|
+
- `log_sha256`
|
|
21
|
+
|
|
22
|
+
Each `commands[]` item contains `argv`, `cwd`, `exit_code`, `duration_s`, and `log_offset`. `env_refresh`, when present, contains `triggered`, `manifests`, `install_argv`, and `exit_code`. `suite`, when present, contains `argv`, `exit_code`, and `duration_s`.
|
|
23
|
+
|
|
24
|
+
**Schema v2 (agent-harness#209), additive.** Every stage (`commands[]`, `env_refresh`, `suite`) may additionally carry `log_end_offset` (the exclusive byte end of that stage's output in `verification.log`) and `failure_kind` (the runner-OBSERVED failure origin, one of `timeout` / `error` / `nonzero_exit`), and `env_refresh`/`suite` additionally carry their own `log_offset` (start). These fields are captured at execution time and omitted when null; `failure_kind` is never re-derived from `exit_code` downstream (a child that itself returns 124/127 stays `nonzero_exit`, not `timeout`/`error`). **v1 back-compat:** a v1 artifact (without these fields) still loads — the missing fields default to `None`. `load_verification_artifact` accepts `schema_version` in `{1, 2}`.
|
|
25
|
+
|
|
26
|
+
`verification.log` stores raw combined stdout and stderr from the recorded subprocesses, followed (agent-harness#243) by a single trailing seal line `verification-artifact-sha256:<hex>` — a canonical digest of `verification.json` (see the whole-artifact integrity paragraph). `log_offset` is the start byte offset for each stage's output and `log_end_offset` (v2) is its exclusive end (both point strictly before the seal trailer, so a stage's `raw_tail` never includes it). `log_sha256` is the SHA-256 digest of the final log bytes (seal trailer included).
|
|
27
|
+
|
|
28
|
+
**Failure diagnostics (verdict layer, non-frozen).** `validate_verification_artifact` returns `VerificationArtifactValidation`; its `to_json()` includes a `diagnostics` list. On the `nonzero_exit` verdict (where the log is already sha-authenticated), it carries one entry per failing stage — in declared order `commands` → `env_refresh` → `suite` — each `{role, index, argv, exit_code, failure_kind, raw_tail, truncated, diagnostic_status}`. `raw_tail` is a bounded (`DIAGNOSTIC_TAIL_BYTES`) tail sliced from the stage's exact `[log_offset, log_end_offset)` region; `diagnostic_status` is `missing_output` when a failing stage produced no captured bytes (still emitted, with typed context — a failed verdict is never diagnostic-empty). Diagnostics are NOT built on the `log_sha256_mismatch` / `missing_log` integrity branches (an unauthenticated log's tail could be forged); those block on the integrity failure, which is the more severe reason.
|
|
29
|
+
|
|
30
|
+
**Diagnostic offset-integrity (threat model).** Each failing stage's `raw_tail` is sliced from its recorded `[log_offset, log_end_offset)` region, validated fail-closed against its execution-order neighbours' recorded offsets (`prev.log_end_offset <= log_offset <= log_end_offset <= next.log_offset`, bounded by `[0, len(log)]`); any violation yields an empty tail, never a slice into an adjacent stage. This makes a **single-field** offset tamper (which produces an inconsistent chain) fail closed. This neighbour-bounds check is the offset-integrity guard for an **unsealed** artifact (see below); on a **sealed** artifact it remains in place as defense-in-depth, but the whole-artifact seal (which covers offsets — see next paragraph) now catches offset tampers first, including a **coordinated** multi-field tamper across two stages that stays internally consistent with the neighbour-bounds check (e.g. extending one stage's `log_end_offset` and moving the next stage's `log_offset` to the same value).
|
|
31
|
+
|
|
32
|
+
**Whole-artifact integrity (agent-harness#243).** Beyond the per-stage offset table (which `log_sha256` does not cover), the ENTIRE `verification.json` is sealed. At write time a canonical digest of the artifact payload — **all fields except the derived `log_sha256`**, including the per-stage `log_offset`/`log_end_offset` fields — is embedded as the `verification-artifact-sha256:<hex>` trailer line in `verification.log`, and then `log_sha256` is computed over the whole log — so the log's SHA also seals the artifact digest. At validate time, the digest is recomputed from `verification.json` and compared to the sealed trailer BEFORE the pass/fail branch (after `log_sha256_mismatch` / the load-time malformed/oversized guards, so the log is already authenticated) — a FAILING artifact is seal-protected too, not just a would-be-PASS one. A mismatch yields `artifact_seal_mismatch` and fails closed. This catches a **multi-field / structural** edit the per-stage checks miss — most importantly a verdict-flipping edit such as deleting a failed `commands[]` entry to forge a pass, and (since offsets are covered) a coordinated per-stage offset tamper that would otherwise pass the neighbour-bounds check. The seal is keyless (an editor who can rewrite the artifact, the log trailer, AND recompute `log_sha256` can still re-seal — the same trust level #209 assumed), so this raises the bar to a coordinated multi-file edit rather than being cryptographically unforgeable; it is defense-in-depth. **Back-compat / sealed-vs-unsealed split:** an artifact whose log carries no seal trailer (a v1/older run, or an externally-built log) skips the seal check entirely and still validates — for that unsealed case, the per-stage neighbour-bounds check above remains the sole offset-integrity guard, exactly as under #209. Separately, an artifact larger than `MAX_ARTIFACT_BYTES` is rejected `oversized_artifact` before it is parsed.
|
|
33
|
+
|
|
34
|
+
**Redaction posture (agent-harness#243, agent-harness#266).** `raw_tail` is a bounded excerpt of `verification.log` bytes surfaced into every PERSISTED copy of a validation payload — the real egress widening this redaction narrows (the `DIAGNOSTIC_TAIL_BYTES` cap bounds record size, not disclosure — a secret is tiny). A prior round redacted only the rebuilt closeout record, on the premise that the other persisted copies (`launch.json`, the `child_automation` copy, the `events.jsonl` ledger event, the hotfix `artifact_validation`) were local-artifact-trust-class and not read into any prompt/egress path. That premise was FALSE and is corrected here: `phase-loop state --json` / `inspect_state()` reads the entire `launch.json` back out verbatim as `latest_launch_metadata`, and the harness SKILL directs agents to run `state --json` for exact state; the repair prompt separately directs an agent to inspect `events.jsonl` directly. Both are deterministic egress paths for whatever `runner_verification`/`artifact_validation` carries.
|
|
35
|
+
|
|
36
|
+
Redaction is therefore now applied **at the SOURCE** — the single point each of these code paths first captures a `VerificationArtifactValidation.to_json()` payload into something that will be persisted (`redaction.apply_diagnostics_redaction`, a thin SSOT wrapper around `redact_diagnostics_metadata_only`) — rather than only in the closeout record after the fact. Any diagnostic whose fields carry a secret/PII-shaped value (detected with the same `_FORBIDDEN_METADATA_PATTERNS` the closeout malformed-metadata gate enforces) is redacted to METADATA-ONLY: `raw_tail` and `argv` are dropped, leaving role/index/exit_code/failure_kind/truncated plus byte/arg counts, a `redacted` flag, and a `redaction_reason`. Because redaction happens at the source, every downstream persisted copy inherits the redacted form: the closeout record, `launch.json` (and therefore `state --json` / `inspect_state()`), the `child_automation` copy, the `events.jsonl` ledger event (including the `reconcile --verification-log` manual-repair event), and the hotfix `artifact_validation` (both the ledger event and the printed CLI payload). The on-disk `verification.log` is left FULL — it is the intentional local source of truth and is never redacted; only these persisted, potentially-re-read copies are narrowed. `PHASE_LOOP_VERIFY_REDACT_DIAGNOSTICS=all` forces full `raw_tail`/`argv` suppression on every diagnostic across all of these source-redacted copies.
|
|
37
|
+
|
|
38
|
+
**Whole-summary redaction (agent-harness#243 CR recheck of #266).** The above closed the nested `diagnostics` list, but a cross-vendor CR recheck (codex) found a SIBLING field persisted right beside it still carried the identical secret unredacted: `runner._run_execute_verification`'s persisted summary (`runner_verification`, and therefore `launch.json` / `state --json` / `child_automation` / the ledger event) sets `suite_command` to the raw resolved suite argv — for a FAILING suite, the exact secret-bearing command that produced the now-redacted diagnostic. `apply_diagnostics_redaction` therefore now walks the WHOLE payload it is given, not just a top-level `diagnostics` key: it recurses into every nested dict/list-of-dicts, redacting a `diagnostics` list at ANY depth as above, and separately checks every OTHER field whose name looks command/argv-shaped (a narrow heuristic — `command`, `argv`, or `cmd` as a substring, e.g. `suite_command`, `install_argv`) against the same `_FORBIDDEN_METADATA_PATTERNS` matcher; a match replaces the whole field value with a `"<redacted:<field>>"` placeholder (a command argv has no safe partial-redaction shape, unlike a diagnostic's structured metadata). A non-secret `suite_command` passes through unchanged. The heuristic is deliberately name-scoped rather than a blanket scan of every field, so it never touches legitimate absolute path fields (`artifact_path`, `verification_artifact_path`, `verification_log_path`) that would otherwise spuriously match the `absolute_private_path` pattern under a checkout rooted at `/home/<user>/...`.
|
|
39
|
+
|
|
40
|
+
**Redaction is best-effort, not a guarantee (agent-harness#243).** The scrub is a single shared, pattern-based matcher (`_FORBIDDEN_METADATA_PATTERNS`'s `secret_like_value` entry) over `keyword=value`-shaped text, where `keyword` is one of `api_key` / `secret` / `token` / `password` (case-insensitive) and `value` is a 12+ character alphanumeric run. It recognizes that shape across the common quoting/escaping forms a captured command or log line actually takes — plain (`key=value`), single- or double-quoted (`key='value'` / `key="value"`), backslash-escaped (`key: \"value\"`, from shell/JSON re-quoting), and JSON (`"key":"value"`) — applied at the SOURCE across every persisted egress copy (closeout, `launch.json` / `state --json`, `child_automation`, the ledger event, hotfix `artifact_validation`), while `verification.log` itself is left FULL and unredacted. Coverage also extends to a STRUCTURED argv list: a pre-split `["--token", "<value>"]` pair (e.g. inside a diagnostic's `argv`) is joined into a synthesized `flag=value` composite and matched the same way, because the flag and value are already separate structured elements there — no prose ambiguity to resolve.
|
|
41
|
+
|
|
42
|
+
It is explicitly **not** a guarantee against arbitrary secret encodings: a value that is base64-encoded, otherwise obfuscated, split across separate fields with no adjacent keyword, or paired with a keyword this pattern does not enumerate, will NOT be recognized and will pass through unredacted. Closing those cases is out of scope for a pattern matcher and remains the operator's responsibility (e.g. via `PHASE_LOOP_VERIFY_REDACT_DIAGNOSTICS=all` to force full suppression regardless of pattern match, or by not letting a verification command emit a secret in the first place).
|
|
43
|
+
|
|
44
|
+
**Command-context-scoped flag-aware redaction (agent-harness#269, follow-up to #243, cross-vendor CR).** A space-separated CLI flag embedded in a command STRING — e.g. `"curl --token <value>"`, as `discovery.py` stores an `operational_exemptions[].command` — was previously undetected, and an earlier round documented that as a *permanent* limit: a `--token AKIA...SECRET` string and an ordinary sentence like `"Document the --token configuration behavior."` are both, character-for-character, `-{1,2}keyword` + whitespace + a 12+ character alphanumeric run, so a pattern applied to *every* leaf (including free-text closeout prose) genuinely cannot tell a high-entropy secret from a benign following word using that shape alone — a dash-anchored pattern that tried to close the gap by widening the shared, prose-facing matcher was tried and reverted for exactly that reason (it reintroduced a FATAL false positive on `metadata_redaction_diagnostic`, blocking a legitimate closeout `blocker_summary`/`next_action`/finding that merely mentioned a flag name in prose). A later cross-vendor CR round showed the "inherent" framing was wrong: the ambiguity is inherent to *prose*, not to a command STRING. A field already identified by name as command-context (`suite_command`, `operational_exemptions[].command`, an `argv` element — the same `_looks_like_command_field` heuristic the whole-summary redaction above uses) can never legitimately hold prose; its value IS a command, so `--flag VALUE` there is unambiguously a flag+value pair, never a sentence. A separate flag-aware matcher is therefore applied **only** to command-context field values, in addition to the existing strict `[:=]`-assignment matcher: it recognizes long flags (`--token VALUE`), short flags (`-t VALUE`), `=`-separated (`--token=VALUE`), and quoted flags/values (`'--token' 'VALUE'`, `"--token" "VALUE"`), with whitespace or `=` as the separator. This matcher is **never** added to the generic leaf matcher (`_forbidden_metadata_kind`) that backs prose fields or the fatal `metadata_redaction_diagnostic` gate — those stay permanently prose-safe, matching only the strict `[:=]`-assignment shape, so `"Document the --token configuration behavior."` in a `blocker_summary`/`next_action` is never false-flagged. `verification.log` (local, full, never redacted) remains the debugging source of truth regardless. The genuinely remaining out-of-scope case — base64/obfuscated/split-across-fields encodings a name-and-shape matcher cannot enumerate — is unchanged; see the paragraph above.
|
|
45
|
+
|
|
46
|
+
The JSON artifact is written atomically by creating a same-directory temporary file and replacing `verification.json`. Re-running identical command inputs rewrites the same artifact shape and log content, except for timestamps and durations.
|
|
47
|
+
|
|
48
|
+
Command failures, missing executables, and timeouts are evidence data. They are represented by nonzero `exit_code` values and do not make `run_verification` raise. Programmer errors, such as a missing repo or a run directory outside the repo, raise before evidence is written.
|
|
49
|
+
|
|
50
|
+
The plan-time validator API is `validate_verification_commands(repo, commands) -> list[ValidationFinding]`. It is read-only and returns structured findings for empty argv, unresolved `argv[0]`, explicit repo-relative path references that do not exist, and cwd/path references that resolve outside the repo.
|
|
51
|
+
|
|
52
|
+
`load_verification_artifact(path)` validates the persisted artifact and returns `VerificationResult`.
|
|
53
|
+
|
|
54
|
+
Evidence marked `evidence: operational` can be recorded for operator inspection, but it cannot mark runner-executed verification as passed. A later runner phase must still reduce actual command exit data before claiming verification success.
|
|
55
|
+
|
|
56
|
+
## Hotfix Consumers
|
|
57
|
+
|
|
58
|
+
`phase-loop hotfix --init-stub <path>` writes a minimal stub with `objective`
|
|
59
|
+
and `verification_command` fields without creating a run directory.
|
|
60
|
+
|
|
61
|
+
`phase-loop hotfix --reason <text> --plan <stub-path>` is an emergency
|
|
62
|
+
consumer of the same IF-0-VC-1 evidence path. It creates
|
|
63
|
+
`.phase-loop/runs/<ts>-hotfix-<slug>/`, runs dependency-manifest env refresh,
|
|
64
|
+
the stub verification command, and the effective suite command through
|
|
65
|
+
`run_verification`, then validates the resulting artifact before ledger
|
|
66
|
+
closeout. A passed hotfix event must include `work_unit: hotfix`, the redacted
|
|
67
|
+
reason, plan stub, `verification_artifact_path`, `verification_log_path`, and
|
|
68
|
+
the artifact validation summary. A missing, malformed, tampered, or nonzero
|
|
69
|
+
artifact blocks the hotfix closeout instead of reporting `passed`.
|
|
70
|
+
|
|
71
|
+
Use hotfix for a single bounded change with no interface freeze. Anything that
|
|
72
|
+
changes interfaces, roadmap scope, or downstream work uses a roadmap phase.
|
|
@@ -28,8 +28,9 @@ equivalence is proven by a test (not asserted in prose).
|
|
|
28
28
|
the **agy/gemini leg where effort is embedded in the model-name string**
|
|
29
29
|
(`render_gemini_model`, panel_invoker.py:1016). Built-3 lanes are concrete;
|
|
30
30
|
breadth lanes raise `EffortMappingError` until ABDREG/ABDHOME/ABDOMNI.
|
|
31
|
-
Round-trip (proven): claude→`--effort max
|
|
32
|
-
`-c model_reasoning_effort=xhigh
|
|
31
|
+
Round-trip (proven): claude→`--effort max`, codex→
|
|
32
|
+
`-c model_reasoning_effort=xhigh`, Gemini Flash→`gemini-3.6-flash-high`;
|
|
33
|
+
explicit legacy Pro display names remain compatible.
|
|
33
34
|
- **Seat identity for result re-keying** — `Seat.seat_key` is a stable LABEL over
|
|
34
35
|
every distinguishing field (lane, model, effort, lens), so lens-only-different
|
|
35
36
|
seats get distinct keys. It is not a guaranteed-unique id — a board may hold two
|
|
@@ -74,18 +75,23 @@ equivalence is proven by a test (not asserted in prose).
|
|
|
74
75
|
API-key var; an api-key seat (only behind the board opt-in) scrubs everything
|
|
75
76
|
then injects **only the seat vendor's** key(s). Never silent — an api-key seat
|
|
76
77
|
without the opt-in raises.
|
|
78
|
+
- **Claude Fable/Opus = subscription TUI only** — the shared scrub additionally
|
|
79
|
+
removes Anthropic tokens, alternate base URLs, credential-helper inputs, and
|
|
80
|
+
Bedrock/Vertex/Foundry/Mantle/AWS-provider selectors. Run-isolated settings
|
|
81
|
+
disable `apiKeyHelper`; `claude auth status --json` must prove first-party
|
|
82
|
+
`claude.ai` subscription auth before the exact-model self-PTY launch. The
|
|
83
|
+
homebrew backing is mandatory; alternate backings fail before gateway access.
|
|
84
|
+
API-key fallback and native Task/subagent fulfillment are forbidden.
|
|
77
85
|
- **`VENDOR_API_KEY_VARS`** — the flat `_API_KEY_VARS` tuple re-keyed by vendor
|
|
78
86
|
family; its union equals today's tuple (proven), so scrubbing stays
|
|
79
87
|
byte-equivalent.
|
|
80
88
|
|
|
81
89
|
## IF-0-ABDFREEZE-4 — Back-compat contract · `fixtures.py` + `tests/test_advisor_board_backcompat.py`
|
|
82
90
|
|
|
83
|
-
- The `default` board (`DEFAULT_BOARD`) resolves
|
|
84
|
-
`
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
timeout/retry, result keys, output formatting, failure semantics, `invoke_panel`
|
|
88
|
-
API) land in ABDVERIFY; this ships the **scaffold + the default-board fixture**.
|
|
91
|
+
- The model-first `default` board (`DEFAULT_BOARD`) resolves four vendors in
|
|
92
|
+
`DEFAULT_BOARD_VENDOR_ORDER`: Codex/Sol, Gemini/Flash high, Claude/Fable, and
|
|
93
|
+
Grok 4.5. The separate legacy `PANEL_LEGS` tuple and explicit `invoke_panel`
|
|
94
|
+
API remain the frozen three-leg Codex/Gemini/Claude boundary.
|
|
89
95
|
- `advisor-panel` stays a working alias of `advisor-board` — the rename + alias is
|
|
90
96
|
ABDRESOLVE; this contract only *states* the invariant.
|
|
91
97
|
- **Behavior-neutrality proof:** `git diff` on `panel_invoker.py` is empty and the
|
|
@@ -179,9 +185,9 @@ the real matrix at `load_boards()` time (`tests/test_advisor_board_config.py`,
|
|
|
179
185
|
implementer stays Sonnet. The `default` board (`fixtures.DEFAULT_BOARD`) is
|
|
180
186
|
byte-pinned to this Fable `invoke_panel` panel by the golden proof
|
|
181
187
|
(`tests/test_advisor_board_golden.py`); the sole sanctioned delta stays `seat_key`.
|
|
182
|
-
- **`code-review`
|
|
183
|
-
`
|
|
184
|
-
|
|
188
|
+
- **`default` and `code-review` are four-vendor frontier boards.** Gemini uses
|
|
189
|
+
`gemini-3.6-flash` at its `high` ceiling alongside Sol, Fable, and Grok 4.5;
|
|
190
|
+
`code-review` preserves availability-aware backfill and distinct lenses.
|
|
185
191
|
- **Divergent-thinking boards keep Sonnet.** `brainstorm` / `doc-edit` /
|
|
186
192
|
`legal-brainstorm` deliberately retain `claude-sonnet-5` — a diverse voice, a
|
|
187
193
|
low-stakes copyedit, a cheap aggressive ideation seat — where it is the right tool.
|
|
@@ -190,7 +196,7 @@ the real matrix at `load_boards()` time (`tests/test_advisor_board_config.py`,
|
|
|
190
196
|
(`schema.py`), so the legal lenses/purposes need no enum extension.
|
|
191
197
|
- **Catch-alls for unmodeled tasks (`general`, `solo`).** So the board library is not
|
|
192
198
|
limited to the pre-modeled domains: `general` is the domain-agnostic top-tier PANEL
|
|
193
|
-
(three frontier vendors — gpt-5.6-sol/adversarial,
|
|
199
|
+
(three frontier vendors — gpt-5.6-sol/adversarial, gemini-3.6-flash/alternative,
|
|
194
200
|
claude-fable-5/completeness — hand it any task + brief), and `solo` is the
|
|
195
201
|
single-MEMBER form (one `claude-fable-5` seat) for a quick top-end opinion when a
|
|
196
202
|
panel is overkill. A ONE-seat board validates + resolves through `invoke_board` like
|
|
@@ -200,7 +206,7 @@ the real matrix at `load_boards()` time (`tests/test_advisor_board_config.py`,
|
|
|
200
206
|
(`adversarial`/`alternative`/`completeness`) and purpose (`general`) are free-form
|
|
201
207
|
strings, so no enum extension.
|
|
202
208
|
- **Deep-seat FOLLOW-ON (documented, NOT built here).** The richer legal treatment —
|
|
203
|
-
four lenses per seat, an apex-Opus (`claude-opus-
|
|
209
|
+
four lenses per seat, an apex-Opus (`claude-opus-5`) seat, a verify-round, and
|
|
204
210
|
retrieval-grounded citation-verification — is a deliberate follow-on. The current
|
|
205
211
|
legal boards ship the single-primary-lens-per-seat form; the deep-seat form layers
|
|
206
212
|
onto the same seat/board schema (no schema change) when built.
|
|
@@ -26,6 +26,7 @@ and the ``LedgerWriter`` cross-language transport seam. This is the one place th
|
|
|
26
26
|
package touches ``panel_invoker`` — an OPT-IN ``sink=`` on ``invoke_board``;
|
|
27
27
|
``sink=None`` stays byte-neutral.
|
|
28
28
|
"""
|
|
29
|
+
|
|
29
30
|
from __future__ import annotations
|
|
30
31
|
|
|
31
32
|
from .schema import (
|
|
@@ -37,8 +38,14 @@ from .schema import (
|
|
|
37
38
|
CONFIG_RELATIVE_PATH,
|
|
38
39
|
EFFORT_LEVELS,
|
|
39
40
|
PROVIDER_BACKINGS,
|
|
41
|
+
SCOPED_RESEARCH_CAPABILITY,
|
|
42
|
+
SCOPED_RESEARCH_GATEWAY_TOOLS,
|
|
43
|
+
SCOPED_RESEARCH_PMCP_VERSION,
|
|
44
|
+
SCOPED_RESEARCH_SERVERS,
|
|
45
|
+
SCOPED_RESEARCH_TOOL_PATTERNS,
|
|
40
46
|
Board,
|
|
41
47
|
HostContext,
|
|
48
|
+
ResearchPolicy,
|
|
42
49
|
Seat,
|
|
43
50
|
board_config_path,
|
|
44
51
|
identify_host_leg,
|
|
@@ -101,10 +108,12 @@ from .config import (
|
|
|
101
108
|
load_boards,
|
|
102
109
|
)
|
|
103
110
|
from .backing import (
|
|
111
|
+
CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS,
|
|
104
112
|
VENDOR_API_KEY_VARS,
|
|
105
113
|
BackingDecision,
|
|
106
114
|
all_vendor_key_vars,
|
|
107
115
|
resolve_seat_env,
|
|
116
|
+
scrub_subscription_env,
|
|
108
117
|
select_backing,
|
|
109
118
|
)
|
|
110
119
|
from .backing_omnigent import (
|
|
@@ -127,6 +136,25 @@ from .events import (
|
|
|
127
136
|
NullSink,
|
|
128
137
|
best_effort_forward,
|
|
129
138
|
)
|
|
139
|
+
from .research import (
|
|
140
|
+
MCP_SERVER_NAME,
|
|
141
|
+
RESEARCH_CAPABLE_LANES,
|
|
142
|
+
ResearchAuditError,
|
|
143
|
+
ResearchInvocation,
|
|
144
|
+
ResearchLedger,
|
|
145
|
+
ResearchRunConfig,
|
|
146
|
+
ResearchSeatConfig,
|
|
147
|
+
ResearchUnavailable,
|
|
148
|
+
claude_mcp_config,
|
|
149
|
+
codex_mcp_args,
|
|
150
|
+
materialize_research_run,
|
|
151
|
+
mcp_tool_names,
|
|
152
|
+
probe_research_capability,
|
|
153
|
+
reduce_research_audit,
|
|
154
|
+
research_instructions,
|
|
155
|
+
scrub_research_env,
|
|
156
|
+
unavailable_ledger,
|
|
157
|
+
)
|
|
130
158
|
from .observability import (
|
|
131
159
|
LEDGER_RECORD_KIND,
|
|
132
160
|
LEDGER_RECORD_SCHEMA,
|
|
@@ -149,6 +177,7 @@ from .fixtures import (
|
|
|
149
177
|
CANONICAL_LEG_ORDER,
|
|
150
178
|
CANONICAL_VALID_PAIRS,
|
|
151
179
|
DEFAULT_BOARD,
|
|
180
|
+
DEFAULT_BOARD_VENDOR_ORDER,
|
|
152
181
|
DEFAULT_SEAT_EFFORT_ARGS,
|
|
153
182
|
DEFAULT_SEAT_RENDERED_MODEL,
|
|
154
183
|
DEFAULT_SEATS,
|
|
@@ -178,6 +207,7 @@ __all__ = [
|
|
|
178
207
|
"Seat",
|
|
179
208
|
"Board",
|
|
180
209
|
"HostContext",
|
|
210
|
+
"ResearchPolicy",
|
|
181
211
|
"EFFORT_LEVELS",
|
|
182
212
|
"AUTH_LANES",
|
|
183
213
|
"AUTH_SUBSCRIPTION",
|
|
@@ -186,6 +216,11 @@ __all__ = [
|
|
|
186
216
|
"BACKING_HOMEBREW",
|
|
187
217
|
"BACKING_OMNIGENT",
|
|
188
218
|
"CONFIG_RELATIVE_PATH",
|
|
219
|
+
"SCOPED_RESEARCH_CAPABILITY",
|
|
220
|
+
"SCOPED_RESEARCH_PMCP_VERSION",
|
|
221
|
+
"SCOPED_RESEARCH_SERVERS",
|
|
222
|
+
"SCOPED_RESEARCH_GATEWAY_TOOLS",
|
|
223
|
+
"SCOPED_RESEARCH_TOOL_PATTERNS",
|
|
189
224
|
"board_config_path",
|
|
190
225
|
"identify_host_leg",
|
|
191
226
|
"seat_vendor_family",
|
|
@@ -241,7 +276,9 @@ __all__ = [
|
|
|
241
276
|
"load_boards",
|
|
242
277
|
# backing + auth
|
|
243
278
|
"VENDOR_API_KEY_VARS",
|
|
279
|
+
"CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS",
|
|
244
280
|
"all_vendor_key_vars",
|
|
281
|
+
"scrub_subscription_env",
|
|
245
282
|
"BackingDecision",
|
|
246
283
|
"select_backing",
|
|
247
284
|
"resolve_seat_env",
|
|
@@ -256,6 +293,24 @@ __all__ = [
|
|
|
256
293
|
"OmnigentGatewayUnavailable",
|
|
257
294
|
"SeatRunOutcome",
|
|
258
295
|
"classify_http_failure",
|
|
296
|
+
# governed PMCP research
|
|
297
|
+
"MCP_SERVER_NAME",
|
|
298
|
+
"RESEARCH_CAPABLE_LANES",
|
|
299
|
+
"ResearchUnavailable",
|
|
300
|
+
"ResearchAuditError",
|
|
301
|
+
"ResearchSeatConfig",
|
|
302
|
+
"ResearchRunConfig",
|
|
303
|
+
"ResearchInvocation",
|
|
304
|
+
"ResearchLedger",
|
|
305
|
+
"probe_research_capability",
|
|
306
|
+
"materialize_research_run",
|
|
307
|
+
"research_instructions",
|
|
308
|
+
"claude_mcp_config",
|
|
309
|
+
"codex_mcp_args",
|
|
310
|
+
"mcp_tool_names",
|
|
311
|
+
"scrub_research_env",
|
|
312
|
+
"reduce_research_audit",
|
|
313
|
+
"unavailable_ledger",
|
|
259
314
|
# events
|
|
260
315
|
"AdvisorBoardEvent",
|
|
261
316
|
"EventSink",
|
|
@@ -281,6 +336,7 @@ __all__ = [
|
|
|
281
336
|
"BoardObserver",
|
|
282
337
|
# fixtures
|
|
283
338
|
"DEFAULT_BOARD",
|
|
339
|
+
"DEFAULT_BOARD_VENDOR_ORDER",
|
|
284
340
|
"DEFAULT_SEATS",
|
|
285
341
|
"DEFAULT_SEAT_RENDERED_MODEL",
|
|
286
342
|
"DEFAULT_SEAT_EFFORT_ARGS",
|
|
@@ -48,6 +48,38 @@ VENDOR_API_KEY_VARS: dict[str, tuple[str, ...]] = {
|
|
|
48
48
|
"gemini": ("GEMINI_API_KEY", "GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"),
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
# Credentials and routing selectors that can move a Claude Code process away
|
|
52
|
+
# from the first-party Claude.ai subscription lane. This is deliberately
|
|
53
|
+
# broader than ``VENDOR_API_KEY_VARS``: the latter remains the frozen cross-
|
|
54
|
+
# vendor API-key map, while this set also covers helpers, gateways, and cloud
|
|
55
|
+
# providers that Claude Code gives precedence over subscription OAuth.
|
|
56
|
+
CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS: tuple[str, ...] = (
|
|
57
|
+
"ANTHROPIC_API_KEY",
|
|
58
|
+
"ANTHROPIC_AUTH_TOKEN",
|
|
59
|
+
"ANTHROPIC_BASE_URL",
|
|
60
|
+
"ANTHROPIC_CUSTOM_HEADERS",
|
|
61
|
+
"ANTHROPIC_BEDROCK_BASE_URL",
|
|
62
|
+
"ANTHROPIC_BEDROCK_MANTLE_BASE_URL",
|
|
63
|
+
"ANTHROPIC_VERTEX_BASE_URL",
|
|
64
|
+
"ANTHROPIC_VERTEX_PROJECT_ID",
|
|
65
|
+
"ANTHROPIC_FOUNDRY_API_KEY",
|
|
66
|
+
"ANTHROPIC_FOUNDRY_BASE_URL",
|
|
67
|
+
"ANTHROPIC_FOUNDRY_RESOURCE",
|
|
68
|
+
"ANTHROPIC_AWS_BASE_URL",
|
|
69
|
+
"ANTHROPIC_AWS_WORKSPACE_ID",
|
|
70
|
+
"AWS_BEARER_TOKEN_BEDROCK",
|
|
71
|
+
"CLAUDE_CODE_API_KEY_HELPER_TTL_MS",
|
|
72
|
+
"CLAUDE_CODE_USE_ANTHROPIC_AWS",
|
|
73
|
+
"CLAUDE_CODE_USE_BEDROCK",
|
|
74
|
+
"CLAUDE_CODE_USE_FOUNDRY",
|
|
75
|
+
"CLAUDE_CODE_USE_MANTLE",
|
|
76
|
+
"CLAUDE_CODE_USE_VERTEX",
|
|
77
|
+
"CLAUDE_CODE_SKIP_BEDROCK_AUTH",
|
|
78
|
+
"CLAUDE_CODE_SKIP_FOUNDRY_AUTH",
|
|
79
|
+
"CLAUDE_CODE_SKIP_MANTLE_AUTH",
|
|
80
|
+
"CLAUDE_CODE_SKIP_VERTEX_AUTH",
|
|
81
|
+
)
|
|
82
|
+
|
|
51
83
|
|
|
52
84
|
def all_vendor_key_vars() -> tuple[str, ...]:
|
|
53
85
|
"""Every vendor API-key var (scrub set for a subscription seat)."""
|
|
@@ -59,6 +91,18 @@ def all_vendor_key_vars() -> tuple[str, ...]:
|
|
|
59
91
|
return tuple(seen)
|
|
60
92
|
|
|
61
93
|
|
|
94
|
+
def scrub_subscription_env(base_env: Mapping[str, str]) -> dict[str, str]:
|
|
95
|
+
"""Return a subscription-only child environment.
|
|
96
|
+
|
|
97
|
+
All vendor API keys are removed. Claude-specific credential helpers,
|
|
98
|
+
custom request headers, alternate endpoints, and cloud-provider selectors
|
|
99
|
+
are removed as well so a Claude seat cannot silently escape the first-party
|
|
100
|
+
subscription lane.
|
|
101
|
+
"""
|
|
102
|
+
blocked = set(all_vendor_key_vars()) | set(CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS)
|
|
103
|
+
return {key: value for key, value in base_env.items() if key not in blocked}
|
|
104
|
+
|
|
105
|
+
|
|
62
106
|
# --- backing selector -------------------------------------------------------
|
|
63
107
|
|
|
64
108
|
|
|
@@ -107,16 +151,21 @@ def resolve_seat_env(
|
|
|
107
151
|
silent key can never slip through. Pure and side-effect-free; ABDHOME wires
|
|
108
152
|
it into the subprocess/gateway env.
|
|
109
153
|
"""
|
|
110
|
-
env =
|
|
154
|
+
env = scrub_subscription_env(base_env)
|
|
111
155
|
if seat.auth == AUTH_SUBSCRIPTION:
|
|
112
156
|
return env
|
|
113
157
|
if seat.auth == AUTH_API_KEY:
|
|
158
|
+
vendor = seat_vendor_family(seat)
|
|
159
|
+
if vendor == "claude" and seat.model.lower().startswith(("claude-fable-", "claude-opus-")):
|
|
160
|
+
raise ValueError(
|
|
161
|
+
f"seat {seat.seat_key} requires Claude Code TUI subscription auth; "
|
|
162
|
+
"api_key fallback is forbidden"
|
|
163
|
+
)
|
|
114
164
|
if not allow_api_key_fallback:
|
|
115
165
|
raise ValueError(
|
|
116
166
|
f"seat {seat.seat_key} requests the api_key lane but the board did not "
|
|
117
167
|
"opt in (allow_api_key_fallback=False) — never-silent-key"
|
|
118
168
|
)
|
|
119
|
-
vendor = seat_vendor_family(seat)
|
|
120
169
|
for var in VENDOR_API_KEY_VARS.get(vendor, ()): # ONLY this vendor's key(s)
|
|
121
170
|
if var in base_env:
|
|
122
171
|
env[var] = base_env[var]
|
|
@@ -126,7 +175,9 @@ def resolve_seat_env(
|
|
|
126
175
|
|
|
127
176
|
__all__ = [
|
|
128
177
|
"VENDOR_API_KEY_VARS",
|
|
178
|
+
"CLAUDE_SUBSCRIPTION_BLOCKED_ENV_VARS",
|
|
129
179
|
"all_vendor_key_vars",
|
|
180
|
+
"scrub_subscription_env",
|
|
130
181
|
"BackingDecision",
|
|
131
182
|
"select_backing",
|
|
132
183
|
"resolve_seat_env",
|
|
@@ -6,7 +6,7 @@ its MAX thinking and each carrying a DISTINCT review lens:
|
|
|
6
6
|
grok grok-4.5 max lens=adversarial
|
|
7
7
|
claude claude-fable-5 max lens=correctness
|
|
8
8
|
codex gpt-5.6-sol max lens=red-team
|
|
9
|
-
gemini Gemini 3.
|
|
9
|
+
gemini Gemini 3.6 Flash high lens=alternative-approach (high == its ceiling)
|
|
10
10
|
|
|
11
11
|
The load-bearing behavior is the **availability-aware fallback**: a panel must
|
|
12
12
|
NEVER collapse to one or two reviewers just because one or two vendors are down.
|
|
@@ -47,7 +47,7 @@ _VENDOR_SEAT: dict[str, dict[str, str]] = {
|
|
|
47
47
|
"grok": {"model": "grok-4.5", "harness": "grok", "effort": "max", "lens": "adversarial"},
|
|
48
48
|
"claude": {"model": "claude-fable-5", "harness": "claude", "effort": "max", "lens": "correctness"},
|
|
49
49
|
"codex": {"model": "gpt-5.6-sol", "harness": "codex", "effort": "max", "lens": "red-team"},
|
|
50
|
-
"gemini": {"model": "
|
|
50
|
+
"gemini": {"model": "gemini-3.6-flash", "harness": "gemini", "effort": "high", "lens": "alternative-approach"},
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
# Distinct lenses the backfill cycles through (each vendor's primary lens is drawn
|
|
@@ -18,12 +18,13 @@ built-in ``presets``. Contract:
|
|
|
18
18
|
|
|
19
19
|
A missing config file is not an error: the built-in presets load on their own.
|
|
20
20
|
"""
|
|
21
|
+
|
|
21
22
|
from __future__ import annotations
|
|
22
23
|
|
|
23
24
|
from collections.abc import Mapping
|
|
24
25
|
from dataclasses import dataclass
|
|
25
26
|
from pathlib import Path
|
|
26
|
-
from typing import Any
|
|
27
|
+
from typing import Any, Callable
|
|
27
28
|
|
|
28
29
|
try: # Python 3.11+
|
|
29
30
|
import tomllib # type: ignore[import-not-found]
|
|
@@ -37,6 +38,7 @@ from .schema import (
|
|
|
37
38
|
AUTH_LANES,
|
|
38
39
|
PROVIDER_BACKINGS,
|
|
39
40
|
Board,
|
|
41
|
+
ResearchPolicy,
|
|
40
42
|
Seat,
|
|
41
43
|
board_config_path,
|
|
42
44
|
)
|
|
@@ -44,7 +46,7 @@ from .schema import (
|
|
|
44
46
|
# Recognised keys — anything else is a hard error (no silent drop).
|
|
45
47
|
_KNOWN_TOP_KEYS: frozenset[str] = frozenset({"default_board", "boards"})
|
|
46
48
|
_KNOWN_BOARD_KEYS: frozenset[str] = frozenset(
|
|
47
|
-
{"name", "purpose", "allow_api_key_fallback", "seats"}
|
|
49
|
+
{"name", "purpose", "allow_api_key_fallback", "research_enabled", "seats"}
|
|
48
50
|
)
|
|
49
51
|
_KNOWN_SEAT_KEYS: frozenset[str] = frozenset(
|
|
50
52
|
{"model", "effort", "harness", "lens", "auth", "backing", "host_leg"}
|
|
@@ -114,7 +116,9 @@ def _parse_seat(raw: Mapping[str, Any], where: str) -> Seat:
|
|
|
114
116
|
if "model" not in raw:
|
|
115
117
|
raise BoardConfigError(f"{where} is missing the required 'model' key")
|
|
116
118
|
if "effort" not in raw:
|
|
117
|
-
raise BoardConfigError(
|
|
119
|
+
raise BoardConfigError(
|
|
120
|
+
f"{where} (model={raw['model']!r}) is missing the required 'effort' key"
|
|
121
|
+
)
|
|
118
122
|
auth = raw.get("auth", AUTH_LANES[0])
|
|
119
123
|
backing = raw.get("backing", PROVIDER_BACKINGS[0])
|
|
120
124
|
try:
|
|
@@ -145,7 +149,8 @@ def _parse_board(raw: Mapping[str, Any], index: int) -> Board:
|
|
|
145
149
|
if not isinstance(seats_raw, list):
|
|
146
150
|
raise BoardConfigError(f"board {name!r} 'seats' must be a list of seat tables")
|
|
147
151
|
seats = tuple(
|
|
148
|
-
_parse_seat(seat, f"board {name!r} seats[{i}]")
|
|
152
|
+
_parse_seat(seat, f"board {name!r} seats[{i}]")
|
|
153
|
+
for i, seat in enumerate(seats_raw)
|
|
149
154
|
)
|
|
150
155
|
try:
|
|
151
156
|
return Board(
|
|
@@ -155,6 +160,9 @@ def _parse_board(raw: Mapping[str, Any], index: int) -> Board:
|
|
|
155
160
|
allow_api_key_fallback=_require_bool(
|
|
156
161
|
raw, "allow_api_key_fallback", False, where
|
|
157
162
|
),
|
|
163
|
+
research_policy=ResearchPolicy(
|
|
164
|
+
enabled=_require_bool(raw, "research_enabled", False, where)
|
|
165
|
+
),
|
|
158
166
|
)
|
|
159
167
|
except (ValueError, TypeError) as exc:
|
|
160
168
|
# Board.__post_init__ (e.g. api_key seat without opt-in) -> config error.
|
|
@@ -203,7 +211,9 @@ def load_boards(
|
|
|
203
211
|
# Availability-aware code-review (before the user overlay so a user override wins).
|
|
204
212
|
compose_probe = is_available
|
|
205
213
|
if compose_probe is None and matrix is not None:
|
|
206
|
-
compose_probe = getattr(
|
|
214
|
+
compose_probe = getattr(
|
|
215
|
+
getattr(matrix, "harnesses", None), "is_available", None
|
|
216
|
+
)
|
|
207
217
|
# #151: the LIVE convening path is auth-aware by DEFAULT — a PATH-present but
|
|
208
218
|
# unauthenticated vendor is dropped and backfilled. Pass an explicit ``auth_ok``
|
|
209
219
|
# so the composer never falls through to its is_available-injected pass-through
|
|
@@ -211,7 +221,9 @@ def load_boards(
|
|
|
211
221
|
# gate short-circuits for vendors that fail the availability probe, so a host
|
|
212
222
|
# with no vendor CLI never shells out.
|
|
213
223
|
compose_auth = auth_ok if auth_ok is not None else default_board_auth_ok
|
|
214
|
-
composed_review = compose_review_board(
|
|
224
|
+
composed_review = compose_review_board(
|
|
225
|
+
is_available=compose_probe, auth_ok=compose_auth
|
|
226
|
+
)
|
|
215
227
|
boards[composed_review.name] = composed_review
|
|
216
228
|
|
|
217
229
|
cfg_path = path if path is not None else board_config_path(env)
|