phase-loop-runtime 0.7.17__tar.gz → 0.7.18__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.17 → phase_loop_runtime-0.7.18}/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/README.md +1 -1
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/pyproject.toml +2 -1
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +67 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/cli.py +101 -8
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/governed_review.py +57 -1
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/panel_invoker.py +158 -9
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +50 -18
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +48 -16
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +48 -16
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +48 -16
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/train_ledger.py +4 -1
- phase_loop_runtime-0.7.18/src/phase_loop_runtime/train_review_packet.py +862 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/train_runner.py +387 -268
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/SOURCES.txt +8 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_golden.py +17 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_chronology_scope.py +168 -24
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_offload_lock.py +21 -6
- phase_loop_runtime-0.7.18/tests/test_ci_quarantine.py +299 -0
- phase_loop_runtime-0.7.18/tests/test_execfind_falsifier.py +777 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_activation_promotion.py +35 -13
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_delta_consumer.py +73 -54
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_flag_off_recovery_leak_299.py +15 -10
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_gemini_heartbeat_bootstrap.py +187 -10
- phase_loop_runtime-0.7.18/tests/test_governed_review.py +642 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_legible_roadmap_contract.py +6 -6
- phase_loop_runtime-0.7.18/tests/test_local_check.py +210 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_model_tier_taxonomy.py +7 -2
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_native_claude_seat_fill.py +5 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_tui_workspace_trust_223.py +59 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_roadmap_validate.py +213 -2
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_president_ladder_config.py +2 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_presroute_hardening.py +162 -0
- phase_loop_runtime-0.7.18/tests/test_qualify_network_owner.py +135 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_monitor_policy.py +198 -12
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_e2e.py +7 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_invariants.py +6 -1
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_merge.py +24 -21
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_prebuilt.py +79 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_review_authorization.py +9 -1
- phase_loop_runtime-0.7.18/tests/test_train_review_monitoring_policy.py +325 -0
- phase_loop_runtime-0.7.18/tests/test_train_review_packet.py +2532 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_runner.py +14 -6
- phase_loop_runtime-0.7.18/tests/test_verify_qualified_agy_route_core.py +218 -0
- phase_loop_runtime-0.7.17/tests/test_governed_review.py +0 -212
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/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.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/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.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/gemini_heartbeat.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/president_adapter.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/president_operation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/review_stage.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_board_static_import_862.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_broker_command_builders.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_broker_staged_tree_delivery.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_xdist_adoption.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ci_xdist_witness.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_conform_timing_instrumentation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_executor_exited_without_closeout_785.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabpub_zero_history_bootstrap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_frozen_blob_batch_parse.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_panel_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_grok_narrow_reject_231.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_harden_evidence_verifier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_legible_review_repairs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_redaction_separation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_owned_command_procfs_1003.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_tui_liveness_188.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pr_readback_789.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_president_heartbeat_1001.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_president_wiring.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_presroute_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_presroute_landed.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_public_installer.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_redaction_channel_control_isolation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_policy_govlean_repairs.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_stage_binding.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skill_liveness_contract.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_subscription_scrub_xai_864.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/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.18
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author-email: ViperJuice <viperjuice@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -49,7 +49,7 @@ To install just this runtime package directly:
|
|
|
49
49
|
|
|
50
50
|
```sh
|
|
51
51
|
pip install phase-loop-runtime # latest compatible release
|
|
52
|
-
pip install phase-loop-runtime==0.7.
|
|
52
|
+
pip install phase-loop-runtime==0.7.18 # …or pin an exact version
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -19,7 +19,7 @@ To install just this runtime package directly:
|
|
|
19
19
|
|
|
20
20
|
```sh
|
|
21
21
|
pip install phase-loop-runtime # latest compatible release
|
|
22
|
-
pip install phase-loop-runtime==0.7.
|
|
22
|
+
pip install phase-loop-runtime==0.7.18 # …or pin an exact version
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.18"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -154,6 +154,7 @@ phase_loop_runtime = [
|
|
|
154
154
|
[tool.pytest.ini_options]
|
|
155
155
|
markers = [
|
|
156
156
|
"dotfiles_integration: test requires a dotfiles fleet tree (skipped standalone)",
|
|
157
|
+
"quarantine(reason): known flake tracked by an OPEN issue; deselected on pull-request CI only (agent-harness#1029)",
|
|
157
158
|
]
|
|
158
159
|
|
|
159
160
|
[tool.setuptools.data-files]
|
|
@@ -2659,6 +2659,73 @@ Fields:
|
|
|
2659
2659
|
A synthetic `_train_review_` record (`node_id="_train_review_"`) is appended
|
|
2660
2660
|
when the train-level review panel approves. Its `status` is `"approved"`.
|
|
2661
2661
|
|
|
2662
|
+
An approval with usable-reviewer evidence may also carry the optional
|
|
2663
|
+
`review_packet_sha256` field, omitted on historical and non-review records.
|
|
2664
|
+
Reuse requires its exact immutable packet bytes and the current usable-reviewer
|
|
2665
|
+
floor; a legacy approval without the digest cannot authorize pending merges.
|
|
2666
|
+
|
|
2667
|
+
The version-1 train review packet binds train order/edges, full admitted heads,
|
|
2668
|
+
PR identities, live base tips, unique merge bases, tree IDs, changed-path/mode/blob
|
|
2669
|
+
inventory, full substantive patches, acceptance and head-bound evidence.
|
|
2670
|
+
`--review-material FILE` declares supporting material for every exact node ID;
|
|
2671
|
+
local command/disposal evidence is labelled operator-supplied attestation.
|
|
2672
|
+
GitHub check runs are fetched by identity and checked against the admitted head.
|
|
2673
|
+
Optional explicit whole-subtree disposal certificates bind full inventories and
|
|
2674
|
+
unabridged diff hashes; they certify deletion mechanics, not generatedness.
|
|
2675
|
+
Operator-only removal sidecars never enter reviewer scratch.
|
|
2676
|
+
|
|
2677
|
+
`run-train --governed --review-only --review-material FILE --preview-review DIR`
|
|
2678
|
+
prepares identical review material before broker construction, leases, recovery,
|
|
2679
|
+
admission or models. A ready receipt is not approval. The rendered prompt,
|
|
2680
|
+
including framing and instructions, must fit 512 KiB; the separate 1 MiB packet
|
|
2681
|
+
parser limit does not establish readiness. There is no truncation fallback.
|
|
2682
|
+
|
|
2683
|
+
`run-train --governed --monitoring-policy heartbeat_only` runs the train-level review
|
|
2684
|
+
under review monitoring policy v1 heartbeat-only: the frozen four-vendor default board
|
|
2685
|
+
(any other composition is refused), no model deadline, no native host seat. The policy
|
|
2686
|
+
is bound into the review authorization and passed to the invoker, which refuses a
|
|
2687
|
+
mismatch. Native emission/fill, a non-governed run or an unqualified Gemini route is
|
|
2688
|
+
refused before ledger, broker, publish or packet effects (CLI and direct callers), and
|
|
2689
|
+
re-checked before any seat launches. The bounded review path is unchanged.
|
|
2690
|
+
|
|
2691
|
+
Trusted-opt-in FAB readmission during ordinary governed merging first freezes
|
|
2692
|
+
the entire prospective packet against proposed-head evidence without granting
|
|
2693
|
+
authority. Existing broker readmission and fresh complete durable bindings must
|
|
2694
|
+
then match before those identical bytes enter review/cache/native sinks. Current
|
|
2695
|
+
readmission eligibility is checked immediately before recovery. While FAB promotion
|
|
2696
|
+
is active, real repository revocation is replayed before recovery, sinks, approval
|
|
2697
|
+
and each merge. Review-only/native emission perform no recovery/readmission; preview
|
|
2698
|
+
does not consult broker evidence. No late head advancement follows train review.
|
|
2699
|
+
Transport readiness does not attest actual provider consumption of all content.
|
|
2700
|
+
|
|
2701
|
+
Production stores read-back packets under `review-packets/<sha256>/` beside the
|
|
2702
|
+
ledger. Missing/corrupt packet storage holds. Explicit fresh material invalidates
|
|
2703
|
+
changed approvals; omitted material retains stored snapshots without asserting
|
|
2704
|
+
checks were refreshed. Native fills retain artifact/brief/composition validation.
|
|
2705
|
+
Partial resumes keep original merged-node sections only after validating their
|
|
2706
|
+
complete admission bindings (node, branch, PR, head and FAB run) and live merge
|
|
2707
|
+
outcomes; unavailable history holds rather than
|
|
2708
|
+
reconstructing scope from current main. Observed pending base/head drift before
|
|
2709
|
+
approval and each merge requires a fresh packet. GitHub's existing head pin
|
|
2710
|
+
remains independent; these reads do not atomically pin the base.
|
|
2711
|
+
|
|
2712
|
+
Direct patch text preserves LF/TAB and reversibly escapes backslashes, CR and
|
|
2713
|
+
disallowed Unicode. JSON sections decode as outer escapes, JSON, then nested
|
|
2714
|
+
`content.text` escapes, including four-digit `\u` and supplementary eight-digit
|
|
2715
|
+
`\U` escapes (the latter are not standard JSON escapes).
|
|
2716
|
+
`raw_sha256` hashes original bytes; `escaped_sha256`
|
|
2717
|
+
hashes intermediate escaped text; preview `presentation_sha256` hashes the
|
|
2718
|
+
final rendered section. Readback integrity is not a power-loss durability
|
|
2719
|
+
guarantee; that recovery work is tracked in agent-harness#977.
|
|
2720
|
+
Packet identity, material and revocation checkpoints, including finalization,
|
|
2721
|
+
storage and checks immediately before review and approval, use `review_halted`
|
|
2722
|
+
before recovery/readmission begins and `merge_halted` afterward. The per-node
|
|
2723
|
+
recovery/readmission handler alone appends a blocked row, and only after that
|
|
2724
|
+
node's helper began; later packet holds retain the latest durable binding.
|
|
2725
|
+
Panel rejections and native-fill refusals remain `review_halted`; merge-loop
|
|
2726
|
+
refusals remain `merge_halted`. All retain the typed reason and prior merges. Malformed
|
|
2727
|
+
stored metadata and excessive JSON nesting yield a typed hold and preview receipt.
|
|
2728
|
+
|
|
2662
2729
|
Idempotent resume: re-running `run_train` reads the ledger to skip nodes that
|
|
2663
2730
|
are already `pr_open` (confirmed via a live `_pr_is_open` check) or already
|
|
2664
2731
|
`merged`. A `blocked` node in the ledger is retried on resume.
|
|
@@ -915,6 +915,14 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
915
915
|
"(per-repo governed panel review before merge)."
|
|
916
916
|
),
|
|
917
917
|
)
|
|
918
|
+
run_train_sub.add_argument("--review-material", metavar="FILE", help="Version-1 head-bound train review evidence manifest.")
|
|
919
|
+
run_train_sub.add_argument("--preview-review", metavar="DIR", help="With --governed --review-only: prepare a packet without broker, lease, ledger mutation or models.")
|
|
920
|
+
run_train_sub.add_argument(
|
|
921
|
+
"--monitoring-policy", choices=("bounded", "heartbeat_only"), default="bounded",
|
|
922
|
+
help=("With --governed: how the train review watches its seats. heartbeat_only runs the "
|
|
923
|
+
"frozen four-vendor default board with no model deadline and no native seat, as "
|
|
924
|
+
"advisor-board --monitoring-policy heartbeat_only does. Default: bounded."),
|
|
925
|
+
)
|
|
918
926
|
run_train_sub.add_argument(
|
|
919
927
|
"--emit-native-request", dest="emit_native_request", action="store_true", default=False,
|
|
920
928
|
help=("With --governed --review-only: stage the train bundle and the claude seat's native-fill "
|
|
@@ -1174,6 +1182,31 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1174
1182
|
return parser
|
|
1175
1183
|
|
|
1176
1184
|
|
|
1185
|
+
|
|
1186
|
+
def _confirmed_outside_git_work_tree(path: Path | str) -> bool:
|
|
1187
|
+
"""True ONLY when no ``.git`` entry exists at ``path`` or any ancestor.
|
|
1188
|
+
|
|
1189
|
+
Structural: git's output is never parsed. Any ``.git`` entry (directory, ``gitdir:``
|
|
1190
|
+
file -- reachable or not -- or symlink) means "maybe a repository", and so does ANY
|
|
1191
|
+
error: ``os.lstat`` is called directly because ``Path.exists``/``is_symlink`` swallow
|
|
1192
|
+
OSError on newer Pythons (EACCES/EIO would read as "absent"), and a symlink loop in
|
|
1193
|
+
``resolve`` raises RuntimeError on Python <= 3.12 (agent-harness#1054/#1055 r2/r3).
|
|
1194
|
+
"""
|
|
1195
|
+
try:
|
|
1196
|
+
# strict=True: non-strict resolve() swallows lookup errors and returns the
|
|
1197
|
+
# unresolved alias, whose lexical ancestors can miss the real repository
|
|
1198
|
+
# (#1054 r4 / #1055 r3, codex). Any error -- incl. a missing path -- fails closed.
|
|
1199
|
+
resolved = Path(path).resolve(strict=True)
|
|
1200
|
+
for directory in (resolved, *resolved.parents):
|
|
1201
|
+
try:
|
|
1202
|
+
os.lstat(directory / ".git")
|
|
1203
|
+
except (FileNotFoundError, NotADirectoryError):
|
|
1204
|
+
continue
|
|
1205
|
+
return False
|
|
1206
|
+
except (OSError, RuntimeError, ValueError): # ValueError: an embedded NUL byte
|
|
1207
|
+
return False
|
|
1208
|
+
return True
|
|
1209
|
+
|
|
1177
1210
|
def main(argv: list[str] | None = None) -> int:
|
|
1178
1211
|
parser = build_parser()
|
|
1179
1212
|
args = parser.parse_args(argv)
|
|
@@ -1401,11 +1434,24 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
1401
1434
|
# specs/roadmap-status.json at all) is a silent no-op.
|
|
1402
1435
|
candidate_path = Path(candidate)
|
|
1403
1436
|
status_repo = candidate_path.resolve().parent.parent
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1437
|
+
# The repository is inferred as the roadmap's grandparent
|
|
1438
|
+
# (<repo>/specs/<roadmap>.md). Outside a git work tree that guess is
|
|
1439
|
+
# not a repository at all -- a roadmap loose in a tempdir made it
|
|
1440
|
+
# ``/tmp`` itself -- so there is no canonical repository to check:
|
|
1441
|
+
# skip with a note rather than validate a shared system directory
|
|
1442
|
+
# (agent-harness#987 / #1053, maintainer decision 2026-09-25).
|
|
1443
|
+
if _confirmed_outside_git_work_tree(status_repo):
|
|
1444
|
+
print(
|
|
1445
|
+
f"validate-roadmap: note: {status_repo} is not inside a git work tree; "
|
|
1446
|
+
"skipping the repository roadmap-status coherence check",
|
|
1447
|
+
file=sys.stderr,
|
|
1448
|
+
)
|
|
1449
|
+
else:
|
|
1450
|
+
try:
|
|
1451
|
+
roadmap_lint.validate_roadmap_status_coherence(status_repo, required=True)
|
|
1452
|
+
except roadmap_lint.RoadmapStatusError as exc:
|
|
1453
|
+
print(f"validate-roadmap: roadmap-status coherence error: {exc}", file=sys.stderr)
|
|
1454
|
+
return 1
|
|
1409
1455
|
if getattr(args, "check_assumptions", False):
|
|
1410
1456
|
from . import roadmap_assumptions
|
|
1411
1457
|
|
|
@@ -4474,9 +4520,37 @@ def _run_train_command(*, parser: argparse.ArgumentParser, args: argparse.Namesp
|
|
|
4474
4520
|
return 1 # unreachable
|
|
4475
4521
|
emit_native_request = bool(getattr(args, "emit_native_request", False))
|
|
4476
4522
|
native_leg_specs = list(getattr(args, "native_legs", []) or [])
|
|
4523
|
+
preview_output = getattr(args, "preview_review", None)
|
|
4524
|
+
review_material = getattr(args, "review_material", None)
|
|
4525
|
+
if preview_output == "":
|
|
4526
|
+
parser.error("--preview-review requires a non-empty directory")
|
|
4527
|
+
if preview_output is not None and (not review_only or run_mode != "governed" or emit_native_request or native_leg_specs):
|
|
4528
|
+
parser.error("--preview-review requires --governed --review-only and cannot combine with native emission/fill")
|
|
4477
4529
|
if (emit_native_request or native_leg_specs) and not review_only:
|
|
4478
4530
|
parser.error("--emit-native-request / --native-leg require --governed --review-only")
|
|
4479
4531
|
return 1 # unreachable
|
|
4532
|
+
monitoring_policy = getattr(args, "monitoring_policy", "bounded")
|
|
4533
|
+
review_board_preview = None
|
|
4534
|
+
if monitoring_policy == "heartbeat_only":
|
|
4535
|
+
if run_mode != "governed":
|
|
4536
|
+
parser.error("--monitoring-policy heartbeat_only requires --governed")
|
|
4537
|
+
if emit_native_request:
|
|
4538
|
+
parser.error("--monitoring-policy heartbeat_only cannot combine with --emit-native-request "
|
|
4539
|
+
"(heartbeat-only review has no native seat)")
|
|
4540
|
+
# Refuse an unsupported board before any ledger, broker or packet effect, exactly
|
|
4541
|
+
# as advisor-board does (a native fill is one such route).
|
|
4542
|
+
from .advisor_board.backing import resolve_review_monitoring_policy
|
|
4543
|
+
from .advisor_board.fixtures import DEFAULT_BOARD
|
|
4544
|
+
from .panel_invoker import _preflight_gemini_heartbeat
|
|
4545
|
+
try:
|
|
4546
|
+
resolve_review_monitoring_policy(monitoring_policy, DEFAULT_BOARD,
|
|
4547
|
+
native_fill_requested=bool(native_leg_specs))
|
|
4548
|
+
_preflight_gemini_heartbeat(DEFAULT_BOARD, monitoring_policy)
|
|
4549
|
+
except (OSError, ValueError) as exc:
|
|
4550
|
+
print(f"run-train: review monitoring policy refused: {exc}", file=sys.stderr)
|
|
4551
|
+
return 2
|
|
4552
|
+
review_board_preview = [{"harness": seat.harness, "model": seat.model, "effort": seat.effort}
|
|
4553
|
+
for seat in DEFAULT_BOARD.seats]
|
|
4480
4554
|
native_leg_fills = None
|
|
4481
4555
|
if native_leg_specs:
|
|
4482
4556
|
from .panel_invoker import load_native_leg_fills as _load_fill
|
|
@@ -4521,6 +4595,22 @@ def _run_train_command(*, parser: argparse.ArgumentParser, args: argparse.Namesp
|
|
|
4521
4595
|
|
|
4522
4596
|
as_json = bool(getattr(args, "json", False))
|
|
4523
4597
|
|
|
4598
|
+
if preview_output is not None:
|
|
4599
|
+
import hashlib
|
|
4600
|
+
from .train_review_packet import preview_review_packet
|
|
4601
|
+
receipt = preview_review_packet(
|
|
4602
|
+
roadmap, ledger_path, _resolve_workspace, review_material, Path(preview_output),
|
|
4603
|
+
train_digest=hashlib.sha256(train_path.read_bytes()).hexdigest(),
|
|
4604
|
+
)
|
|
4605
|
+
result = {"status": "review_packet_ready" if receipt["ready"] else "review_halted", **receipt,
|
|
4606
|
+
# The review this packet would get. A bounded board is composed at review
|
|
4607
|
+
# time (availability- and auth-aware), so it has no fixed seats to show.
|
|
4608
|
+
"review_monitoring_policy": monitoring_policy, "review_board": review_board_preview}
|
|
4609
|
+
print(json.dumps(result, sort_keys=True) if as_json else
|
|
4610
|
+
(f"Review packet prepared at {preview_output}; no review approval recorded." if receipt["ready"] else
|
|
4611
|
+
"Review packet held: " + "; ".join(receipt["errors"])))
|
|
4612
|
+
return 0 if receipt["ready"] else 1
|
|
4613
|
+
|
|
4524
4614
|
# Build a broker-authoritative coordinator runtime so publish actually opens PRs.
|
|
4525
4615
|
# Without a broker_client, publish_from_worktree fail-closes `broker_required` and
|
|
4526
4616
|
# the train opens ZERO PRs. The routing broker binds per BrokerRequest.repo (the
|
|
@@ -4593,6 +4683,8 @@ def _run_train_command(*, parser: argparse.ArgumentParser, args: argparse.Namesp
|
|
|
4593
4683
|
review_only=review_only,
|
|
4594
4684
|
emit_native_request=emit_native_request,
|
|
4595
4685
|
native_leg_fills=native_leg_fills,
|
|
4686
|
+
review_material=review_material,
|
|
4687
|
+
review_monitoring_policy=monitoring_policy,
|
|
4596
4688
|
)
|
|
4597
4689
|
finally:
|
|
4598
4690
|
try:
|
|
@@ -4640,17 +4732,18 @@ def _run_train_command(*, parser: argparse.ArgumentParser, args: argparse.Namesp
|
|
|
4640
4732
|
if result["status"] == "native_fill_requested":
|
|
4641
4733
|
# REVIEWTRUTH early slice: the emit arm staged the bundle + request; nothing was spent.
|
|
4642
4734
|
if not as_json:
|
|
4735
|
+
native_leg = shlex.quote(f"claude={Path(result['request_path']).parent}")
|
|
4736
|
+
material_arg = f" --review-material {shlex.quote(str(review_material))}" if review_material is not None else ""
|
|
4737
|
+
print("Keep the original --train, --workspace-root/--workspace and --ledger-dir arguments.")
|
|
4643
4738
|
print(
|
|
4644
4739
|
f"run-train: native fill requested for seat {result.get('seat_key')} — write the review to "
|
|
4645
4740
|
f"{Path(result['request_path']).parent / 'review.md'} and re-run with "
|
|
4646
|
-
f"--governed --review-only --native-leg
|
|
4741
|
+
f"--governed --review-only --native-leg {native_leg}{material_arg}"
|
|
4647
4742
|
)
|
|
4648
4743
|
return 0
|
|
4649
4744
|
if result["status"] == "review_approved":
|
|
4650
4745
|
# agent-harness#906: --review-only terminal — approval recorded, ZERO merges.
|
|
4651
4746
|
nodes = result.get("nodes", {})
|
|
4652
|
-
if not as_json and emit_native_request:
|
|
4653
|
-
print("run-train: the train review is already approved on the ledger; no native fill request was emitted.")
|
|
4654
4747
|
if not as_json:
|
|
4655
4748
|
print(
|
|
4656
4749
|
f"run-train: train-level review APPROVED — {len(nodes)} admitted PR(s), "
|
{phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/governed_review.py
RENAMED
|
@@ -329,9 +329,17 @@ def governed_board_gate(
|
|
|
329
329
|
native_leg_fills: Sequence[object] | None = None,
|
|
330
330
|
emit_native_request: bool = False,
|
|
331
331
|
native_fill_dir: "Path | str | None" = None,
|
|
332
|
+
monitoring_policy: str = "bounded",
|
|
332
333
|
) -> "GateResult | dict[str, object]":
|
|
333
334
|
"""A governed gate backed by the broker-AUTHORIZED review board (agent-harness#906).
|
|
334
335
|
|
|
336
|
+
``monitoring_policy="heartbeat_only"`` (agent-harness#906, ``run-train
|
|
337
|
+
--monitoring-policy``) runs the review the way ``advisor-board --monitoring-policy
|
|
338
|
+
heartbeat_only`` does: the frozen default four-vendor board (any other composition is
|
|
339
|
+
refused, even from an injected ``compose``), no model deadline, and no native host seat.
|
|
340
|
+
It is checked here, before minting or any launch, and forwarded to both the
|
|
341
|
+
authorization and ``invoke_board``, which refuse a mismatch between the two.
|
|
342
|
+
|
|
335
343
|
REVIEWTRUTH early slice (EC-REVIEWTRUTH-14, plan agent-harness#918): ``emit_native_request``
|
|
336
344
|
performs the same composition, author exclusion, floor and staging the invoke arm will
|
|
337
345
|
redo, writes ``request.json`` / ``artifact.md`` / ``instructions.md`` under
|
|
@@ -391,11 +399,29 @@ def governed_board_gate(
|
|
|
391
399
|
"(the coordinator's git toplevel or the first node's workspace); none was "
|
|
392
400
|
"resolved; holding (non-human)",
|
|
393
401
|
)
|
|
402
|
+
heartbeat_only = monitoring_policy == "heartbeat_only"
|
|
403
|
+
if monitoring_policy not in ("bounded", "heartbeat_only"):
|
|
404
|
+
return _block_result(
|
|
405
|
+
"review_isolation_unavailable", "governed_board_monitoring_policy_refused",
|
|
406
|
+
f"review monitoring policy {monitoring_policy!r} is not supported; holding (non-human)",
|
|
407
|
+
)
|
|
408
|
+
if heartbeat_only and (native_leg_fills or emit_native_request):
|
|
409
|
+
# CONTRACTS.md, review monitoring policy v1: heartbeat-only has no native host seat.
|
|
410
|
+
return _block_result(
|
|
411
|
+
"review_isolation_unavailable", "governed_board_monitoring_policy_refused",
|
|
412
|
+
"review_monitoring_unsupported_route:native_fill: heartbeat_only review has no "
|
|
413
|
+
"native host seat; holding (non-human)",
|
|
414
|
+
)
|
|
394
415
|
from . import panel_invoker as _pi
|
|
395
416
|
from .advisor_board import backing as _backing
|
|
396
417
|
from .advisor_board.composition import FLOOR_SEATS, compose_review_board
|
|
418
|
+
from .advisor_board.fixtures import DEFAULT_BOARD
|
|
397
419
|
|
|
398
|
-
|
|
420
|
+
# heartbeat_only seats the frozen default board, as the advisor-board CLI does: an
|
|
421
|
+
# unavailable vendor then fails its own seat instead of being silently backfilled.
|
|
422
|
+
compose_fn = compose if compose is not None else (
|
|
423
|
+
(lambda: DEFAULT_BOARD) if heartbeat_only else compose_review_board
|
|
424
|
+
)
|
|
399
425
|
try:
|
|
400
426
|
_backing.prepare_review_composition_authorization()
|
|
401
427
|
try:
|
|
@@ -425,9 +451,37 @@ def governed_board_gate(
|
|
|
425
451
|
)
|
|
426
452
|
if dropped:
|
|
427
453
|
board = _replace(board, seats=seats)
|
|
454
|
+
if heartbeat_only:
|
|
455
|
+
if board != DEFAULT_BOARD:
|
|
456
|
+
# Frozen composition, whatever produced it: an injected composer or author
|
|
457
|
+
# exclusion that changes the seats is refused, never reviewed (agent-harness#1061 r1).
|
|
458
|
+
return _block_result(
|
|
459
|
+
"review_isolation_unavailable", "governed_board_monitoring_policy_refused",
|
|
460
|
+
"heartbeat_only review requires the frozen four-vendor default board; "
|
|
461
|
+
f"composed {sorted(getattr(s, 'harness', '?') for s in board.seats)}; holding (non-human)",
|
|
462
|
+
)
|
|
463
|
+
try:
|
|
464
|
+
_backing.resolve_review_monitoring_policy(monitoring_policy, board)
|
|
465
|
+
_pi._preflight_gemini_heartbeat(board, monitoring_policy)
|
|
466
|
+
except (OSError, ValueError) as exc:
|
|
467
|
+
return _block_result(
|
|
468
|
+
"review_isolation_unavailable", "governed_board_monitoring_policy_refused",
|
|
469
|
+
f"review monitoring policy refused before any launch: {exc}; holding (non-human)",
|
|
470
|
+
)
|
|
471
|
+
policy_kwargs: dict[str, object] = {"monitoring_policy": monitoring_policy} if heartbeat_only else {}
|
|
428
472
|
invoke_fn = invoke if invoke is not None else _pi.invoke_board
|
|
429
473
|
from .advisor_board.composition import composition_digest
|
|
430
474
|
|
|
475
|
+
if artifact.startswith("# Train review packet v1\n"):
|
|
476
|
+
try:
|
|
477
|
+
from .train_review_packet import preflight_packet
|
|
478
|
+
preflight_packet(artifact, instructions=_pi._resolve_brief("review", brief_ref), board=board)
|
|
479
|
+
except (OSError, UnicodeError, ValueError) as exc:
|
|
480
|
+
return _block_result(
|
|
481
|
+
"review_isolation_unavailable", "governed_board_packet_preflight_failed",
|
|
482
|
+
f"review packet transport preflight failed: {exc}; holding (non-human)",
|
|
483
|
+
)
|
|
484
|
+
|
|
431
485
|
if emit_native_request:
|
|
432
486
|
# Emit arm: no authorization, no seat, no digest binding beyond the read-back bytes.
|
|
433
487
|
try:
|
|
@@ -497,6 +551,7 @@ def governed_board_gate(
|
|
|
497
551
|
staged_artifact,
|
|
498
552
|
mode="review",
|
|
499
553
|
canonical_repo_authority=canonical_repo_authority,
|
|
554
|
+
**policy_kwargs,
|
|
500
555
|
)
|
|
501
556
|
invoke_kwargs: dict[str, object] = {
|
|
502
557
|
"repo_dir": provider_scratch,
|
|
@@ -504,6 +559,7 @@ def governed_board_gate(
|
|
|
504
559
|
"review_authorization": authorization,
|
|
505
560
|
"canonical_repo_authority": canonical_repo_authority,
|
|
506
561
|
"spawn": spawn,
|
|
562
|
+
**policy_kwargs,
|
|
507
563
|
}
|
|
508
564
|
if brief_ref is not None:
|
|
509
565
|
invoke_kwargs["brief_ref"] = brief_ref
|
{phase_loop_runtime-0.7.17 → phase_loop_runtime-0.7.18}/src/phase_loop_runtime/panel_invoker.py
RENAMED
|
@@ -1728,6 +1728,57 @@ def _canonical_review_repo_authority(repo_dir: Path | str | None) -> Path:
|
|
|
1728
1728
|
return Path(root).resolve()
|
|
1729
1729
|
|
|
1730
1730
|
|
|
1731
|
+
def _outside_any_git_work_tree(path: Path | str) -> bool:
|
|
1732
|
+
"""True ONLY when no ``.git`` entry exists at ``path`` or any ancestor.
|
|
1733
|
+
|
|
1734
|
+
Structural: git's output is never parsed. Any ``.git`` entry (directory, ``gitdir:``
|
|
1735
|
+
file -- reachable or not -- or symlink) means "maybe a repository", and so does ANY
|
|
1736
|
+
error: ``os.lstat`` is called directly because ``Path.exists``/``is_symlink`` swallow
|
|
1737
|
+
OSError on newer Pythons (EACCES/EIO would read as "absent"), and a symlink loop in
|
|
1738
|
+
``resolve`` raises RuntimeError on Python <= 3.12 (agent-harness#1054/#1055 r2/r3).
|
|
1739
|
+
"""
|
|
1740
|
+
try:
|
|
1741
|
+
# strict=True: non-strict resolve() swallows lookup errors and returns the
|
|
1742
|
+
# unresolved alias, whose lexical ancestors can miss the real repository
|
|
1743
|
+
# (#1054 r4 / #1055 r3, codex). Any error -- incl. a missing path -- fails closed.
|
|
1744
|
+
resolved = Path(path).resolve(strict=True)
|
|
1745
|
+
for directory in (resolved, *resolved.parents):
|
|
1746
|
+
try:
|
|
1747
|
+
os.lstat(directory / ".git")
|
|
1748
|
+
except (FileNotFoundError, NotADirectoryError):
|
|
1749
|
+
continue
|
|
1750
|
+
return False
|
|
1751
|
+
except (OSError, RuntimeError, ValueError): # ValueError: an embedded NUL byte
|
|
1752
|
+
return False
|
|
1753
|
+
return True
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
def _resolve_review_authority(
|
|
1757
|
+
canonical_repo_authority: Path | str | None,
|
|
1758
|
+
repo_dir: Path | str | None,
|
|
1759
|
+
*,
|
|
1760
|
+
governed: bool,
|
|
1761
|
+
resolve: Callable[[Path | str | None], Path] | None = None,
|
|
1762
|
+
) -> Path:
|
|
1763
|
+
"""The HARDEN review authority -- the tree fingerprinted AND staged -- resolved once.
|
|
1764
|
+
|
|
1765
|
+
Order (agent-harness#1053, maintainer decision 2026-09-25): an explicit
|
|
1766
|
+
``canonical_repo_authority``; else ``repo_dir``, the repository under review; else the
|
|
1767
|
+
process cwd. ``repo_dir`` is not consulted for a GOVERNED request (a pre-minted
|
|
1768
|
+
authorization is bound to its own authority). A ``repo_dir`` falls back to the cwd only
|
|
1769
|
+
when it is structurally outside any git work tree -- it cannot be fingerprinted as a
|
|
1770
|
+
repository -- so a real repository whose resolution FAILS (git missing, refused, timed
|
|
1771
|
+
out) reaches the typed refusal instead of silently reviewing the cwd. Each call makes
|
|
1772
|
+
exactly one resolution (a frozen static-import probe pins that single ``git`` call).
|
|
1773
|
+
"""
|
|
1774
|
+
resolve = resolve or _canonical_review_repo_authority
|
|
1775
|
+
if canonical_repo_authority is not None or repo_dir is None or governed:
|
|
1776
|
+
return resolve(canonical_repo_authority)
|
|
1777
|
+
if _outside_any_git_work_tree(repo_dir):
|
|
1778
|
+
return resolve(None)
|
|
1779
|
+
return resolve(repo_dir)
|
|
1780
|
+
|
|
1781
|
+
|
|
1731
1782
|
def _completion_ok(text: str, mode: str = "review") -> bool:
|
|
1732
1783
|
"""Is a leg's output a COMPLETE response for this mode?
|
|
1733
1784
|
|
|
@@ -2335,7 +2386,7 @@ def _provider_launch_prefix(cwd, retain_caps=()):
|
|
|
2335
2386
|
# its cwd -- codex's own sandbox does -- then fails with ENOENT before any inference
|
|
2336
2387
|
# (agent-harness#908 board round 4, finding (f); reproduced with the real codex CLI:
|
|
2337
2388
|
# `--wd` -> exit 1 "No such file or directory (os error 2)", path-based chdir -> OK).
|
|
2338
|
-
# `env --chdir` runs after nsenter and
|
|
2389
|
+
# `env --chdir` runs after nsenter and capability setup, so the chdir is a plain path lookup in
|
|
2339
2390
|
# the namespace the provider will live in; the cwd attested as ``provider_cwd_sha256``
|
|
2340
2391
|
# is unchanged. A plain nested user+mount namespace does NOT reproduce the failure --
|
|
2341
2392
|
# the fchdir()ed cwd stays reachable there -- so the class needs the provider's own
|
|
@@ -2369,10 +2420,28 @@ def launch_provider(argv, *, process_owner=(), retain_caps=(), **kwargs) -> "sub
|
|
|
2369
2420
|
"""
|
|
2370
2421
|
prefix = _provider_launch_prefix(kwargs.get("cwd"), retain_caps)
|
|
2371
2422
|
if process_owner:
|
|
2372
|
-
# Enter the network namespace before creating the ownership PID namespace,
|
|
2373
|
-
# but drop capabilities only AFTER both namespaces exist.
|
|
2374
2423
|
position = prefix.index("setpriv") if "setpriv" in prefix else len(prefix)
|
|
2375
|
-
|
|
2424
|
+
if tuple(retain_caps) not in ((), ("setfcap",)):
|
|
2425
|
+
raise ValueError("unsupported owned provider capability policy")
|
|
2426
|
+
if retain_caps:
|
|
2427
|
+
# Keep Codex in the holder's user namespace so its own sandbox can
|
|
2428
|
+
# create another one. The unshare supervisor owns the PID namespace;
|
|
2429
|
+
# the inner setpriv still drops every capability except SETFCAP.
|
|
2430
|
+
prefix[position:position] = ["setpriv", "--pdeathsig", "SIGKILL", "--",
|
|
2431
|
+
"/usr/bin/unshare", "--pid", "--fork",
|
|
2432
|
+
"--kill-child=SIGKILL", "--mount-proc"]
|
|
2433
|
+
inner_setpriv = prefix.index("setpriv", position + 1)
|
|
2434
|
+
prefix[inner_setpriv + 1:inner_setpriv + 1] = ["--pdeathsig", "keep"]
|
|
2435
|
+
else:
|
|
2436
|
+
# Bubblewrap drops CAP_SETPCAP before a later setpriv can use it.
|
|
2437
|
+
owner = list(process_owner)
|
|
2438
|
+
if owner[0] != "/usr/bin/bwrap":
|
|
2439
|
+
raise ValueError("unsupported owned provider")
|
|
2440
|
+
owner[1:1] = ["--unshare-user", "--uid", str(os.getuid()),
|
|
2441
|
+
"--gid", str(os.getgid()), "--cap-drop", "ALL"]
|
|
2442
|
+
if position < len(prefix):
|
|
2443
|
+
del prefix[position:prefix.index("--", position) + 1]
|
|
2444
|
+
prefix[position:position] = owner
|
|
2376
2445
|
return subprocess.Popen([*prefix, *argv], **kwargs)
|
|
2377
2446
|
|
|
2378
2447
|
|
|
@@ -3017,6 +3086,21 @@ def _render_broker_inline_prompt(
|
|
|
3017
3086
|
verdict,
|
|
3018
3087
|
))
|
|
3019
3088
|
)
|
|
3089
|
+
return _assemble_broker_inline_prompt(
|
|
3090
|
+
artifact, instructions, preamble,
|
|
3091
|
+
(instructions_begin, instructions_end), (artifact_begin, artifact_end),
|
|
3092
|
+
)
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
def _assemble_broker_inline_prompt(
|
|
3096
|
+
artifact: str, instructions: str, preamble: str,
|
|
3097
|
+
instruction_frames: tuple[str, str], artifact_frames: tuple[str, str],
|
|
3098
|
+
) -> str:
|
|
3099
|
+
"""Pure assembly shared by validated launches and non-authorizing preflight."""
|
|
3100
|
+
artifact_bytes = artifact.encode("utf-8", errors="strict")
|
|
3101
|
+
instruction_bytes = instructions.encode("utf-8", errors="strict")
|
|
3102
|
+
instructions_begin, instructions_end = instruction_frames
|
|
3103
|
+
artifact_begin, artifact_end = artifact_frames
|
|
3020
3104
|
prompt = "\n".join((
|
|
3021
3105
|
preamble,
|
|
3022
3106
|
f"AUTHORITATIVE-INSTRUCTIONS sha256={sha256(instruction_bytes).hexdigest()} bytes={len(instruction_bytes)}",
|
|
@@ -4486,7 +4570,9 @@ def _normalize_tui_line(line: str) -> str:
|
|
|
4486
4570
|
return " ".join(line.split()).strip().lower()
|
|
4487
4571
|
|
|
4488
4572
|
|
|
4489
|
-
def _tui_chunk_has_novel_content(
|
|
4573
|
+
def _tui_chunk_has_novel_content(
|
|
4574
|
+
chunk: bytes, seen: set[str], ignore: Callable[[str], bool] | None = None
|
|
4575
|
+
) -> bool:
|
|
4490
4576
|
"""True iff a PTY chunk carries SUBSTANTIVE new (non-cosmetic) terminal text.
|
|
4491
4577
|
|
|
4492
4578
|
Strips ANSI escapes, splits on newline AND carriage-return (spinner overwrite),
|
|
@@ -4503,10 +4589,50 @@ def _tui_chunk_has_novel_content(chunk: bytes, seen: set[str]) -> bool:
|
|
|
4503
4589
|
norm = _normalize_tui_line(raw)
|
|
4504
4590
|
if len(norm) >= _TUI_PROGRESS_MIN_CHARS and norm not in seen:
|
|
4505
4591
|
seen.add(norm)
|
|
4506
|
-
|
|
4592
|
+
# ``ignore`` lines are recorded as seen but are never progress (#992).
|
|
4593
|
+
if ignore is None or not ignore(norm):
|
|
4594
|
+
novel = True
|
|
4507
4595
|
return novel
|
|
4508
4596
|
|
|
4509
4597
|
|
|
4598
|
+
# The workspace-trust modal's own vocabulary, normalized like any TUI line. After the
|
|
4599
|
+
# modal is answered, lines of the modal that were still rendering (it can arrive in
|
|
4600
|
+
# pieces) must not arm editor readiness (agent-harness#992).
|
|
4601
|
+
_TUI_TRUST_MODAL_NORMS = tuple(
|
|
4602
|
+
_normalize_tui_line(text)
|
|
4603
|
+
for text in (
|
|
4604
|
+
_CLAUDE_TUI_TRUST_HEADER,
|
|
4605
|
+
_CLAUDE_TUI_TRUST_HEADER_CURRENT,
|
|
4606
|
+
_CLAUDE_TUI_TRUST_QUESTION,
|
|
4607
|
+
_CLAUDE_TUI_TRUST_CHOICE,
|
|
4608
|
+
_CLAUDE_TUI_TRUST_PROMPT,
|
|
4609
|
+
"no, exit",
|
|
4610
|
+
# The rest of the live Claude Code 2.1.282 selector modal (captured 2026-09-25,
|
|
4611
|
+
# agent-harness#1053): its explanation, link and footer can also arrive after the
|
|
4612
|
+
# answer and are not editor output either.
|
|
4613
|
+
# Short fragments, so a paragraph WRAPPED at the terminal width still matches line by
|
|
4614
|
+
# line (#1060 r1, claude): e.g. at 80 columns the explanation breaks mid-sentence.
|
|
4615
|
+
"your own code",
|
|
4616
|
+
"well-known open source",
|
|
4617
|
+
"work from your team",
|
|
4618
|
+
"take a moment to review",
|
|
4619
|
+
"folder first",
|
|
4620
|
+
"read, edit, and execute",
|
|
4621
|
+
"execute files here",
|
|
4622
|
+
"security guide",
|
|
4623
|
+
"enter to confirm",
|
|
4624
|
+
"esc to cancel",
|
|
4625
|
+
)
|
|
4626
|
+
)
|
|
4627
|
+
|
|
4628
|
+
|
|
4629
|
+
def _tui_trust_modal_line(norm: str, cwd_norms: Sequence[str]) -> bool:
|
|
4630
|
+
"""Is this normalized line part of the workspace-trust modal (incl. its cwd line)?"""
|
|
4631
|
+
return any(token in norm for token in _TUI_TRUST_MODAL_NORMS) or any(
|
|
4632
|
+
token and token in norm for token in cwd_norms
|
|
4633
|
+
)
|
|
4634
|
+
|
|
4635
|
+
|
|
4510
4636
|
# A single ``os.read(8192)`` can split a novel review line across two chunks; each
|
|
4511
4637
|
# fragment normalizes differently (or collides with a seen/too-short form), so the
|
|
4512
4638
|
# whole-line progress signal is lost. Carry the trailing PARTIAL line (bytes after
|
|
@@ -4677,6 +4803,10 @@ def _run_claude_tui_session(
|
|
|
4677
4803
|
cwd_tokens = _cwd_trust_tokens(
|
|
4678
4804
|
cwd
|
|
4679
4805
|
) # run-unique FULL-path tokens (not the bare basename)
|
|
4806
|
+
cwd_norms = tuple(
|
|
4807
|
+
norm for norm in (_normalize_tui_line(token) for token in cwd_tokens)
|
|
4808
|
+
if len(norm) >= _TUI_PROGRESS_MIN_CHARS
|
|
4809
|
+
)
|
|
4680
4810
|
|
|
4681
4811
|
def _current_output() -> str:
|
|
4682
4812
|
return (
|
|
@@ -4804,8 +4934,16 @@ def _run_claude_tui_session(
|
|
|
4804
4934
|
# boundaries so a novel line split by ``os.read`` is scanned
|
|
4805
4935
|
# WHOLE (only complete lines are evaluated).
|
|
4806
4936
|
complete = _tui_take_complete_lines(tui_carry, chunk)
|
|
4937
|
+
# Between answering the trust modal and submitting, the
|
|
4938
|
+
# modal's own late-rendering lines are not editor output
|
|
4939
|
+
# (agent-harness#992): they must not arm readiness.
|
|
4940
|
+
modal_ignore = (
|
|
4941
|
+
(lambda norm: _tui_trust_modal_line(norm, cwd_norms))
|
|
4942
|
+
if trust_answered and not prompt_sent
|
|
4943
|
+
else None
|
|
4944
|
+
)
|
|
4807
4945
|
if complete and _tui_chunk_has_novel_content(
|
|
4808
|
-
complete, seen_tui_lines
|
|
4946
|
+
complete, seen_tui_lines, modal_ignore
|
|
4809
4947
|
):
|
|
4810
4948
|
now_novel = time.monotonic()
|
|
4811
4949
|
last_heartbeat = now_novel
|
|
@@ -8466,8 +8604,19 @@ def invoke_board(
|
|
|
8466
8604
|
review_instruction_token = set_review_instruction_digest(
|
|
8467
8605
|
_resolve_brief(mode, brief_ref)
|
|
8468
8606
|
)
|
|
8469
|
-
|
|
8470
|
-
|
|
8607
|
+
# The repository under review is the authority: an explicit
|
|
8608
|
+
# ``canonical_repo_authority`` first, then ``repo_dir`` when it IS a
|
|
8609
|
+
# git repository, and only then the process cwd -- so the fingerprinted
|
|
8610
|
+
# and staged tree is the one the caller named (agent-harness#1053,
|
|
8611
|
+
# maintainer decision 2026-09-25). A non-git ``repo_dir`` cannot be
|
|
8612
|
+
# fingerprinted as a repository and keeps the historical cwd authority,
|
|
8613
|
+
# so every later typed refusal is unchanged. Falling back to
|
|
8614
|
+
# ``repo_dir`` does NOT make this a governed request:
|
|
8615
|
+
# ``governed_review_request`` above keys on the caller's explicit
|
|
8616
|
+
# authority / authorization only.
|
|
8617
|
+
canonical_repo_authority = _resolve_review_authority(
|
|
8618
|
+
canonical_repo_authority, repo_dir,
|
|
8619
|
+
governed=governed_review_request,
|
|
8471
8620
|
)
|
|
8472
8621
|
except (OSError, UnicodeError, ValueError) as exc:
|
|
8473
8622
|
return review_refusal(str(exc))
|
|
@@ -28,8 +28,8 @@ from typing import Any, Mapping, Sequence
|
|
|
28
28
|
PROBE_SIDECAR_REL = "specs/roadmap-assumption-probes-v10.json"
|
|
29
29
|
PROBE_SCHEMA = "roadmap_assumption_probe.v1"
|
|
30
30
|
CANONICAL_ROADMAP_REL = "specs/phase-plans-v10.md"
|
|
31
|
-
CANONICAL_ROADMAP_SHA256 = "
|
|
32
|
-
CANONICAL_PROBES_SHA256 = "
|
|
31
|
+
CANONICAL_ROADMAP_SHA256 = "ae5b814a9be561ca78fdcf976e77bcc582a4e0a09c775563a8bbaf4daf740ff4"
|
|
32
|
+
CANONICAL_PROBES_SHA256 = "42d473e2396df4c9dd2a9f98f9c330fa0362bfc51d3e1c99580ed48e3619ebf1"
|
|
33
33
|
CANONICAL_PROBE_IDS = (
|
|
34
34
|
"LEGIBLE-A1-CONFORM-UNGATED", "LEGIBLE-A1-I118", "LEGIBLE-A1-PIN-SHA",
|
|
35
35
|
"LEGIBLE-A1-PIN-TAG", "LEGIBLE-A1-PR102", "LEGIBLE-A1-PR377",
|