phase-loop-runtime 0.7.21__tar.gz → 0.7.23__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {phase_loop_runtime-0.7.21/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.23}/PKG-INFO +10 -3
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/README.md +7 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/pyproject.toml +3 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/__init__.py +1 -1
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/_baml_worker.py +202 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/adoption_bundle.py +3 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +276 -6
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/backing.py +99 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/config.py +48 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/fixtures.py +3 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/registries.py +2 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_modular.py +2204 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +37 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +14 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +50 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +16 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +20 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +111 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +30 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/phase_loop_bridge.baml +43 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/baml_src/verification_evidence.baml +40 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/claude_agent_view.py +11 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/cli.py +72 -4
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_classifier.py +121 -34
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/base.py +16 -4
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/live.py +136 -48
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/credential_redaction.py +488 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/evidence_audit.py +17 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/executor_availability.py +10 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/falsifier.py +269 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/gemini_heartbeat.py +9 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/generated_outputs.py +843 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_premerge.py +5 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_review.py +276 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/harness_env_signatures.py +5 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/injection.py +4 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/launcher.py +36 -7
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/observability.py +3 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/panel_invoker.py +1245 -248
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +3 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_manifest.py +118 -57
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/president_adapter.py +28 -14
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/prompts.py +84 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/publishing.py +413 -11
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/redaction.py +0 -5
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/review_stage.py +1176 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runner.py +169 -75
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/sandbox_egress.py +16 -13
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_placement.py +529 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_policy.py +1037 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/sandbox_retention.py +384 -0
- phase_loop_runtime-0.7.23/src/phase_loop_runtime/seat_preflight.py +170 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +2 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +2 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +2 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +10 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_runner.py +3 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/verification_evidence.py +52 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23/src/phase_loop_runtime.egg-info}/PKG-INFO +10 -3
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/SOURCES.txt +36 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/requires.txt +2 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_registries.py +51 -0
- phase_loop_runtime-0.7.23/tests/test_agent_cli_scratch_inventory_1147.py +815 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_agy_canary_evidence.py +5 -1
- phase_loop_runtime-0.7.23/tests/test_agy_single_event_transport_1175.py +187 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_classifier.py +16 -6
- phase_loop_runtime-0.7.23/tests/test_closeout_generated_outputs.py +1418 -0
- phase_loop_runtime-0.7.23/tests/test_credential_redaction_shapes.py +502 -0
- phase_loop_runtime-0.7.23/tests/test_execfind_governed_promotion.py +441 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_executor_exited_without_closeout_785.py +55 -2
- phase_loop_runtime-0.7.23/tests/test_fabpub_zero_history_bootstrap.py +1631 -0
- phase_loop_runtime-0.7.23/tests/test_finding_F001.py +28 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_gemini_heartbeat_bootstrap.py +24 -3
- phase_loop_runtime-0.7.23/tests/test_gemini_heartbeat_filesystem_view.py +262 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_review.py +3 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_harden_evidence_verifier.py +135 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_legible_roadmap_contract.py +6 -6
- phase_loop_runtime-0.7.23/tests/test_native_fill_refusal_cause.py +111 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_claude_review_output.py +3 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_liveness_188.py +66 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_dependency.py +31 -5
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_modular.py +0 -19
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_schema_export.py +15 -4
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_schema_source.py +1 -1
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_callers.py +637 -0
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_runtime.py +5321 -0
- phase_loop_runtime-0.7.23/tests/test_phase_loop_baml_v1_supervisor_slot.py +280 -0
- phase_loop_runtime-0.7.23/tests/test_plan_manifest_append_order_1174.py +205 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F001.py +45 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F002.py +31 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F003.py +21 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r2_F004.py +29 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F001.py +17 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F002.py +23 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r4_F003.py +9 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r5_F001.py +16 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r6_F001.py +24 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r7_F001.py +77 -0
- phase_loop_runtime-0.7.23/tests/test_pr1161_r9_F002.py +26 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pr_readback_789.py +4 -2
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_president_heartbeat_1001.py +4 -1
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_publishing.py +511 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_qualified_agy_image_set.py +8 -2
- phase_loop_runtime-0.7.23/tests/test_redaction_main_coverage_cases.py +57 -0
- phase_loop_runtime-0.7.23/tests/test_review_seat_stall_1176.py +1432 -0
- phase_loop_runtime-0.7.23/tests/test_review_stage_binding.py +1914 -0
- phase_loop_runtime-0.7.23/tests/test_sandbox_placement.py +1408 -0
- phase_loop_runtime-0.7.23/tests/test_sandbox_staging_1147.py +1410 -0
- phase_loop_runtime-0.7.23/tests/test_scratch_runtime_audit_1147.py +354 -0
- phase_loop_runtime-0.7.23/tests/test_seat_preflight_1204.py +461 -0
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_modular.py +0 -662
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -37
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -14
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -50
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -16
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -20
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -121
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -36
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -40
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/review_stage.py +0 -456
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/sandbox_policy.py +0 -343
- phase_loop_runtime-0.7.21/src/phase_loop_runtime/sandbox_retention.py +0 -182
- phase_loop_runtime-0.7.21/tests/test_fabpub_zero_history_bootstrap.py +0 -582
- phase_loop_runtime-0.7.21/tests/test_review_stage_binding.py +0 -183
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/advisory_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/research.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_qualification.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/agy_watch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/event_log.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/fencing.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/refresh.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/convergence/status.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/declared_identity.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_canonical.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_delta.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_gate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_producer.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fab_provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabpub_capability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/lease_supervisor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/president_operation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/proof_stages.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_acceptance_falsifier_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_advisory_cli_802.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_live_research.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_research.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_board_static_import_862.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_agy_self_qualification.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_broker_command_builders.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_broker_evidence_schema_drift_789.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_broker_staged_tree_delivery.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_chronology_scope.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_gate_metrics.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_main_red.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_offload_lock.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_quarantine.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_workflow_concurrency.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_xdist_adoption.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ci_xdist_witness.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_claude_json_schema_metaschema_291.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_import_cycle_819.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_committed_range_diff.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_common_directory_leases_807.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_conform_timing_instrumentation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_conftest_isolation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_console_scripts_are_declared.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_contract_floor_guard_378.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_adapters.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_admission.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_api.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_credsep.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_revocation_race.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_broker_verbs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_cli_integration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_coordination_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_dispatch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_event_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_event_log.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_fencing.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_fixture_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_invalidation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_live_enable.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_provider_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_reconcile.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_refresh.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_runtime_imports.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_seat_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_status.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_convergence_train_integration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_cr_fixes_pr220.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_delegated_visual_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dispatch_hold_guard.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_entry_doc_check.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_execfind_falsifier.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_activation_promotion.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_canonical_b.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_closeout_crash_safety.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_closeout_wiring.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_delta_c.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_delta_consumer.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_gate_d.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_producer.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fab_provenance_a.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_admission_compat_789.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_bootstrap_writer_lock_1115.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_partition_rotation_789d.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_recovery_controls_789.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabpub_shared_epoch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fabreadmit_broker.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_frozen_blob_batch_parse.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_gate_fail_open_visibility.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_gate_parity_244_245.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_cross_vendor_floor_358.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_declared_identity.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_panel_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_plan_pin_lint.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_producer_manifest.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_proof_stages.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_roadmap_reseal.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_skill_policy_parity.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_govlean_tdd_receipts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_grok_narrow_reject_231.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_harden_evidence_producer.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_harden_json_depth_825.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_launcher_exec_supervisor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_legible_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_legible_review_repairs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_live_smoke_gate_executes.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_local_check.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_model_tier_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_native_claude_seat_fill.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_native_claude_seat_fill_green.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_canonical_corpus.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_conform_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_redaction_separation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_owned_command_procfs_1003.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_packaged_vector_manifest_pin.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_doc_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_gemini_no_command_preamble.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_invoker_windows_import.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_lanes.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_failure_diagnostic.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_leg_status_detail_1096.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_lens_delivery.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_tui_workspace_trust_223.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_dispatch_409.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_state_disagreement_312.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_president_ladder_config.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_president_wiring.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_presroute_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_presroute_hardening.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_presroute_landed.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_proofgate_attestation_workflow.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_proofgate_cleanup.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_proofgate_isolation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_proofgate_receipts.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_public_installer.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_qualify_network_owner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reconcile_portability_85c.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_redaction_channel_control_isolation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_monitor_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_policy_govlean_repairs.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_stage_board_findings.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_staged_tree_authorization.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_roadmap_authority.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_roadmap_ownership.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_roadmap_representation_consistency.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_runtime_adapter_output_720.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_runtime_event_log_hardening_720.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_runtime_procfs_identity_870.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sandbox_clone.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sandbox_egress.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sandbox_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sandbox_preamble.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sandbox_retention.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_seat_host_uid_1098.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skill_liveness_contract.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_specpkgmin_wheel.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_subscription_scrub_xai_864.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_task_message_broker_cli.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_task_message_resolver.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_tdd_chronology.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_authority_import_811.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_prebuilt.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_review_authorization.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_review_monitoring_policy.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_review_packet.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_fail_closed.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_validate_plan_doc_proofgate.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verification_dotdot_execution_428.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verification_interpreter_guard_221.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verification_venv_identity_428.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_verify_qualified_agy_route_core.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_visual_avatar_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/tests/test_worktree_index.py +0 -0
{phase_loop_runtime-0.7.21/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.23}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phase-loop-runtime
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.23
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author-email: ViperJuice <viperjuice@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -16,7 +16,8 @@ Classifier: Topic :: Software Development :: Build Tools
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: detect-secrets==1.5.0
|
|
19
|
-
Requires-Dist: baml-
|
|
19
|
+
Requires-Dist: baml-bridge==0.20.1
|
|
20
|
+
Requires-Dist: protobuf<8,>=6.31.1
|
|
20
21
|
Requires-Dist: pydantic<3,>=2
|
|
21
22
|
Requires-Dist: PyYAML<7,>=6
|
|
22
23
|
Requires-Dist: consiliency-contract<0.7,>=0.6.5
|
|
@@ -49,7 +50,7 @@ To install just this runtime package directly:
|
|
|
49
50
|
|
|
50
51
|
```sh
|
|
51
52
|
pip install phase-loop-runtime # latest compatible release
|
|
52
|
-
pip install phase-loop-runtime==0.7.
|
|
53
|
+
pip install phase-loop-runtime==0.7.23 # …or pin an exact version
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -288,6 +289,12 @@ closeout, the persisted `terminal-summary.json` reflects the runner's blocking v
|
|
|
288
289
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
289
290
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
290
291
|
|
|
292
|
+
The `phase-loop-closeout-audit --repo .` command grades **ignored** paths by producer. It
|
|
293
|
+
accepts harness handoffs that carry the handoff contract, and a project's declared build
|
|
294
|
+
outputs backed by a recorded producer run. Declare those outputs in a committed
|
|
295
|
+
`.phase-loop-generated-outputs.json`; anything else still blocks. See
|
|
296
|
+
`docs/phase-loop/closeout-generated-outputs.md` (agent-harness#1139).
|
|
297
|
+
|
|
291
298
|
## Conformance library (one library, two roles)
|
|
292
299
|
|
|
293
300
|
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
@@ -19,7 +19,7 @@ To install just this runtime package directly:
|
|
|
19
19
|
|
|
20
20
|
```sh
|
|
21
21
|
pip install phase-loop-runtime # latest compatible release
|
|
22
|
-
pip install phase-loop-runtime==0.7.
|
|
22
|
+
pip install phase-loop-runtime==0.7.23 # …or pin an exact version
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
To pin a specific tag from source instead, substitute a tag from
|
|
@@ -258,6 +258,12 @@ closeout, the persisted `terminal-summary.json` reflects the runner's blocking v
|
|
|
258
258
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
259
259
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
260
260
|
|
|
261
|
+
The `phase-loop-closeout-audit --repo .` command grades **ignored** paths by producer. It
|
|
262
|
+
accepts harness handoffs that carry the handoff contract, and a project's declared build
|
|
263
|
+
outputs backed by a recorded producer run. Declare those outputs in a committed
|
|
264
|
+
`.phase-loop-generated-outputs.json`; anything else still blocks. See
|
|
265
|
+
`docs/phase-loop/closeout-generated-outputs.md` (agent-harness#1139).
|
|
266
|
+
|
|
261
267
|
## Conformance library (one library, two roles)
|
|
262
268
|
|
|
263
269
|
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.23"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -20,7 +20,8 @@ classifiers = [
|
|
|
20
20
|
]
|
|
21
21
|
dependencies = [
|
|
22
22
|
"detect-secrets==1.5.0",
|
|
23
|
-
"baml-
|
|
23
|
+
"baml-bridge==0.20.1",
|
|
24
|
+
"protobuf>=6.31.1,<8",
|
|
24
25
|
"pydantic>=2,<3",
|
|
25
26
|
"PyYAML>=6,<7",
|
|
26
27
|
# PIN (spec-integration v0.3.0): floor at 0.6.3 -- ships the `gate_posture_registry`
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"""BAML v1 worker process for ``phase_loop_runtime.baml_modular`` (agent-harness#1135).
|
|
2
|
+
|
|
3
|
+
This file runs as a standalone script (``python -I -S _baml_worker.py ...``).
|
|
4
|
+
It imports only the standard library and, after ``init``, ``baml_bridge``; it
|
|
5
|
+
never imports ``phase_loop_runtime``. Importing this module has no side
|
|
6
|
+
effects: everything below runs under ``if __name__ == "__main__":``.
|
|
7
|
+
|
|
8
|
+
argv: ``<owner pid> <comma-separated env allowlist keys> [--no-pdeathsig]``.
|
|
9
|
+
|
|
10
|
+
Protocol: one JSON object per line, UTF-8 with ``ensure_ascii=True``. Requests
|
|
11
|
+
arrive on fd 0; responses leave on a dup of fd 1 taken before fd 1 is pointed
|
|
12
|
+
at stderr, so nothing the native runtime prints can corrupt the protocol.
|
|
13
|
+
Every request carries an ``id`` that the response echoes. A response has
|
|
14
|
+
exactly the keys ``{id, fingerprint, <one of ok|error|request|fault>}``.
|
|
15
|
+
|
|
16
|
+
Op table (fixed): ``init``, ``parse_closeout``, ``closeout_request``,
|
|
17
|
+
``evidence_request``, plus ``env`` when ``init`` carried ``test_mode``. An op
|
|
18
|
+
before ``init`` or a second ``init`` is answered with a ``fault``. Any
|
|
19
|
+
exception raised by an op (``BaseException``, including ``BamlPanic``) is
|
|
20
|
+
returned as a ``fault``; the client then discards and kills the worker.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import sys
|
|
28
|
+
|
|
29
|
+
_OP_FUNCTIONS = {
|
|
30
|
+
"parse_closeout": ("user.phase_loop_parse_closeout", ("raw",), ("ok", "error")),
|
|
31
|
+
"closeout_request": (
|
|
32
|
+
"user.phase_loop_closeout_request",
|
|
33
|
+
("phase_alias", "plan_produces", "plan_owned_files", "closeout_commit_sha"),
|
|
34
|
+
("request",),
|
|
35
|
+
),
|
|
36
|
+
"evidence_request": (
|
|
37
|
+
"user.phase_loop_evidence_request",
|
|
38
|
+
("tier2_signal_summary", "sample_artifact_content", "expected_artifact_characteristics"),
|
|
39
|
+
("request",),
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
# The client caps a request frame at 4 MiB + 1 KiB; anything larger here is a
|
|
43
|
+
# client bug or a hostile writer, and is refused rather than buffered forever.
|
|
44
|
+
_MAX_REQUEST_LINE = 4 * 1024 * 1024 + 1024 + 4096
|
|
45
|
+
_WATCHDOG_INTERVAL_S = 0.5
|
|
46
|
+
_PR_SET_PDEATHSIG = 1
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def fingerprint(files: dict[str, str]) -> str:
|
|
50
|
+
canonical = json.dumps(files, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
|
|
51
|
+
return hashlib.sha256(canonical.encode("ascii")).hexdigest()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _set_pdeathsig(owner_pid: int) -> None:
|
|
55
|
+
import ctypes
|
|
56
|
+
import signal
|
|
57
|
+
|
|
58
|
+
# ctypes.CDLL(None) resolves prctl on glibc and musl alike; find_library("c")
|
|
59
|
+
# and "libc.so.6" do not work on musl.
|
|
60
|
+
libc = ctypes.CDLL(None, use_errno=True)
|
|
61
|
+
if libc.prctl(_PR_SET_PDEATHSIG, int(signal.SIGKILL), 0, 0, 0) != 0:
|
|
62
|
+
os._exit(70)
|
|
63
|
+
# The owner may have died between our fork and the prctl.
|
|
64
|
+
if os.getppid() != owner_pid:
|
|
65
|
+
os._exit(0)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _start_watchdog(owner_pid: int) -> None:
|
|
69
|
+
import threading
|
|
70
|
+
import time
|
|
71
|
+
|
|
72
|
+
def watch() -> None:
|
|
73
|
+
while True:
|
|
74
|
+
if os.getppid() != owner_pid:
|
|
75
|
+
os._exit(0)
|
|
76
|
+
time.sleep(_WATCHDOG_INTERVAL_S)
|
|
77
|
+
|
|
78
|
+
threading.Thread(target=watch, name="baml-worker-watchdog", daemon=True).start()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class _Worker:
|
|
82
|
+
def __init__(self, out_fd: int, no_pdeathsig: bool) -> None:
|
|
83
|
+
self.out_fd = out_fd
|
|
84
|
+
self.no_pdeathsig = no_pdeathsig
|
|
85
|
+
self.fp: str | None = None
|
|
86
|
+
self.fns: dict[str, object] | None = None
|
|
87
|
+
self.test_mode = False
|
|
88
|
+
|
|
89
|
+
def send(self, obj: dict) -> None:
|
|
90
|
+
data = (json.dumps(obj, separators=(",", ":"), ensure_ascii=True) + "\n").encode("ascii")
|
|
91
|
+
view = memoryview(data)
|
|
92
|
+
while view:
|
|
93
|
+
written = os.write(self.out_fd, view)
|
|
94
|
+
view = view[written:]
|
|
95
|
+
|
|
96
|
+
def handle(self, line: bytes) -> None:
|
|
97
|
+
req_id = None
|
|
98
|
+
try:
|
|
99
|
+
req = json.loads(line.decode("ascii"))
|
|
100
|
+
if not isinstance(req, dict):
|
|
101
|
+
raise ValueError("request is not a JSON object")
|
|
102
|
+
req_id = req.get("id")
|
|
103
|
+
op = req.get("op")
|
|
104
|
+
if op == "init":
|
|
105
|
+
result = self.init(req)
|
|
106
|
+
self.send({"id": req_id, "fingerprint": self.fp, "ok": result})
|
|
107
|
+
return
|
|
108
|
+
if self.fns is None:
|
|
109
|
+
raise RuntimeError(f"op before init: {op!r}")
|
|
110
|
+
if op == "env" and self.test_mode:
|
|
111
|
+
self.send({"id": req_id, "fingerprint": self.fp, "ok": {"env": sorted(os.environ), "cwd": os.getcwd(), "pid": os.getpid()}})
|
|
112
|
+
return
|
|
113
|
+
if op not in _OP_FUNCTIONS:
|
|
114
|
+
raise RuntimeError(f"unknown op: {op!r}")
|
|
115
|
+
_name, params, keys = _OP_FUNCTIONS[op]
|
|
116
|
+
args = req.get("args")
|
|
117
|
+
if not isinstance(args, dict) or set(args) != set(params):
|
|
118
|
+
raise RuntimeError(f"bad args for {op}")
|
|
119
|
+
out = self.fns[op](**args)
|
|
120
|
+
if not isinstance(out, dict) or len(out) != 1:
|
|
121
|
+
raise RuntimeError(f"bridge {op} returned an unexpected shape")
|
|
122
|
+
((key, value),) = out.items()
|
|
123
|
+
if key not in keys or not isinstance(value, str):
|
|
124
|
+
raise RuntimeError(f"bridge {op} returned key {key!r}")
|
|
125
|
+
self.send({"id": req_id, "fingerprint": self.fp, key: value})
|
|
126
|
+
except BaseException as exc: # noqa: BLE001 - every op failure is a typed fault
|
|
127
|
+
message = f"{type(exc).__module__}.{type(exc).__qualname__}: {str(exc)[:500]}"
|
|
128
|
+
self.send({"id": req_id, "fingerprint": self.fp, "fault": message})
|
|
129
|
+
|
|
130
|
+
def init(self, req: dict) -> dict:
|
|
131
|
+
if self.fns is not None:
|
|
132
|
+
raise RuntimeError("second init")
|
|
133
|
+
self.test_mode = req.get("test_mode") is True
|
|
134
|
+
if self.no_pdeathsig and not self.test_mode:
|
|
135
|
+
raise RuntimeError("--no-pdeathsig requires test_mode")
|
|
136
|
+
for entry in req.get("sys_path") or []:
|
|
137
|
+
if isinstance(entry, str) and os.path.isabs(entry) and entry not in sys.path:
|
|
138
|
+
sys.path.append(entry)
|
|
139
|
+
files = req.get("files")
|
|
140
|
+
if not isinstance(files, dict) or not all(isinstance(k, str) and isinstance(v, str) for k, v in files.items()):
|
|
141
|
+
raise RuntimeError("init files must be a map of strings")
|
|
142
|
+
import baml_bridge
|
|
143
|
+
|
|
144
|
+
baml_bridge.BamlRuntime.initialize_runtime("baml_src", files)
|
|
145
|
+
fns = {op: baml_bridge.define_function(name, "sync", list(params)) for op, (name, params, _keys) in _OP_FUNCTIONS.items()}
|
|
146
|
+
self.fp = fingerprint(files)
|
|
147
|
+
self.fns = fns
|
|
148
|
+
return {"version": baml_bridge.get_version(), "pid": os.getpid()}
|
|
149
|
+
|
|
150
|
+
def serve(self) -> None:
|
|
151
|
+
buf = b""
|
|
152
|
+
while True:
|
|
153
|
+
chunk = os.read(0, 1 << 16)
|
|
154
|
+
if not chunk:
|
|
155
|
+
return # stdin EOF: the graceful shutdown path
|
|
156
|
+
buf += chunk
|
|
157
|
+
while True:
|
|
158
|
+
newline = buf.find(b"\n")
|
|
159
|
+
if newline < 0:
|
|
160
|
+
break
|
|
161
|
+
line, buf = buf[:newline], buf[newline + 1 :]
|
|
162
|
+
self.handle(line)
|
|
163
|
+
if len(buf) > _MAX_REQUEST_LINE:
|
|
164
|
+
self.send({"id": None, "fingerprint": self.fp, "fault": "request line over cap"})
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def main(argv: list[str]) -> int:
|
|
169
|
+
owner_pid = int(argv[1])
|
|
170
|
+
allowlist = {key for key in argv[2].split(",") if key} if len(argv) > 2 else set()
|
|
171
|
+
no_pdeathsig = "--no-pdeathsig" in argv[3:]
|
|
172
|
+
|
|
173
|
+
out_fd = os.dup(1)
|
|
174
|
+
os.dup2(2, 1)
|
|
175
|
+
sys.stdout = sys.stderr
|
|
176
|
+
|
|
177
|
+
# Normalize the environment before baml_bridge is ever imported: this drops
|
|
178
|
+
# interpreter-injected keys (C-locale coercion's LC_CTYPE,
|
|
179
|
+
# __PYVENV_LAUNCHER__) that the parent's allowlist never passed.
|
|
180
|
+
for key in list(os.environ):
|
|
181
|
+
if key not in allowlist:
|
|
182
|
+
del os.environ[key]
|
|
183
|
+
# The v1 runtime keeps a profile store of call data under the working
|
|
184
|
+
# directory (``.baml/profiles-v1``) unless profiling is off. Forced, not
|
|
185
|
+
# defaulted: no call data is ever written to disk, whatever was passed in.
|
|
186
|
+
os.environ["BAML_PROFILE"] = "0"
|
|
187
|
+
os.environ.pop("BAML_PROFILE_DIR", None)
|
|
188
|
+
|
|
189
|
+
if os.name == "posix":
|
|
190
|
+
if sys.platform.startswith("linux") and not no_pdeathsig:
|
|
191
|
+
_set_pdeathsig(owner_pid)
|
|
192
|
+
elif os.getppid() != owner_pid:
|
|
193
|
+
os._exit(0)
|
|
194
|
+
_start_watchdog(owner_pid)
|
|
195
|
+
# Windows: the parent's Job Object (KILL_ON_JOB_CLOSE) enforces owner death.
|
|
196
|
+
|
|
197
|
+
_Worker(out_fd, no_pdeathsig).serve()
|
|
198
|
+
return 0
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
if __name__ == "__main__":
|
|
202
|
+
sys.exit(main(sys.argv))
|
{phase_loop_runtime-0.7.21 → phase_loop_runtime-0.7.23}/src/phase_loop_runtime/adoption_bundle.py
RENAMED
|
@@ -16,6 +16,7 @@ C4_DOCUMENT = Path("docs/c4/phase-loop-runtime-c4-document.md")
|
|
|
16
16
|
TASK_CATALOG = Path("docs/tasks/dotfiles-task-catalog.md")
|
|
17
17
|
RUNTIME_PROJECTION_SURFACE = "phase-loop status --runtime-projection --json"
|
|
18
18
|
BAML_SCHEMA_ROOT = Path("vendor/phase-loop-runtime/src/phase_loop_runtime/baml_src")
|
|
19
|
+
BAML_BRIDGE_SOURCE = "phase_loop_bridge.baml"
|
|
19
20
|
ADOPTION_BUNDLE_PATH = Path("docs/adoption/dotfiles-adoption-bundle.json")
|
|
20
21
|
|
|
21
22
|
|
|
@@ -143,6 +144,8 @@ def _source_roots(repo: Path) -> list[dict[str, str]]:
|
|
|
143
144
|
def _schema_refs(repo: Path) -> list[dict[str, str]]:
|
|
144
145
|
refs: list[dict[str, str]] = []
|
|
145
146
|
for path in sorted((repo / BAML_SCHEMA_ROOT).glob("*.baml")):
|
|
147
|
+
if path.name == BAML_BRIDGE_SOURCE:
|
|
148
|
+
continue # host glue with no classes, not a schema (agent-harness#1135 #26)
|
|
146
149
|
source_path = _repo_relative(repo, path)
|
|
147
150
|
refs.append(
|
|
148
151
|
{
|
|
@@ -337,7 +337,153 @@ the caller passes a PATH and the runtime reads it.
|
|
|
337
337
|
(`max_age_s = 24h`) sweep of `pl-panel-*` dirs, called at the top of
|
|
338
338
|
`_default_spawn`. Reclaims dirs leaked when a run is KILLED before the per-run
|
|
339
339
|
`finally: rmtree` (timeout/crash); a concurrent run's fresh dir is never touched,
|
|
340
|
-
and a GC failure can NEVER affect the run (fully swallowed).
|
|
340
|
+
and a GC failure can NEVER affect the run (fully swallowed). It sweeps both the
|
|
341
|
+
current staging root and the system temp dir, where releases before
|
|
342
|
+
agent-harness#1147 staged.
|
|
343
|
+
- **Staging root and retention (agent-harness#1147, `sandbox_policy`).**
|
|
344
|
+
- **Invariant.** Sandbox staging and spawned-CLI scratch are never RAM-backed while a
|
|
345
|
+
disk-backed candidate is usable. Otherwise they run in a typed DEGRADED mode
|
|
346
|
+
(`ScratchLocation.degraded`): one warning and hard-clamped retention, and the round is
|
|
347
|
+
never crashed. `PHASE_LOOP_SANDBOX_REFUSE_RAM=1` refuses instead (leg detail
|
|
348
|
+
`env_failure: no disk-backed scratch and RAM fallback refused`).
|
|
349
|
+
- **RAM-backed** means a Linux tmpfs or ramfs, identified by the device serving the path
|
|
350
|
+
(`st_dev` matched against `/proc/self/mountinfo`), so overmounts and moved mounts are
|
|
351
|
+
judged correctly. macOS and Windows temp dirs count as disk.
|
|
352
|
+
- **Named exceptions**, each a typed scratch decision (`child_scratch_env`): the agy
|
|
353
|
+
qualification and capture jails keep a tmpfs `/tmp` and their frozen env, because they
|
|
354
|
+
are qualification evidence (follow-up agent-harness#1179); and the Gemini HEARTBEAT
|
|
355
|
+
seat's jail mounts its own private `/tmp` (agent-harness#1181). Neither covers a
|
|
356
|
+
bounded Gemini leg or the bounded Gemini president, which run on the host.
|
|
357
|
+
- **Staging root.** Each round's `pl-panel-*` scratch, and the sandbox clone inside it,
|
|
358
|
+
is created under `staging_root()`. That is `PHASE_LOOP_SANDBOX_STAGING_DIR` when set;
|
|
359
|
+
otherwise `phase-loop/sandboxes` in the platform's per-user cache dir (`$XDG_CACHE_HOME`
|
|
360
|
+
or `~/.cache` on Linux, `~/Library/Caches` on macOS, `%LOCALAPPDATA%` on Windows); else
|
|
361
|
+
the system temp dir when it is not RAM-backed. `TMPDIR` is not the override. The
|
|
362
|
+
launcher's agy review copy (without a run log) and the falsifier's stage and
|
|
363
|
+
dependency snapshot use the same root. Every directory the runtime creates below the
|
|
364
|
+
cache dir is created 0700 and must be a real directory owned by this account.
|
|
365
|
+
- **Capacity.** Filesystem size comes from `shutil.disk_usage`, which works on every
|
|
366
|
+
platform.
|
|
367
|
+
- Retention ceiling: `min(PHASE_LOOP_SANDBOX_MAX_TOTAL_BYTES (40 GiB), 25% of the
|
|
368
|
+
filesystem)`, or 10% on a RAM-backed one.
|
|
369
|
+
- Default floor: 2 GiB capped at 25% of the filesystem, or 25% of a RAM-backed one.
|
|
370
|
+
- A floor that is configured (by the setting's presence) is used verbatim.
|
|
371
|
+
- **Reaping.** Before a round is refused for space, retained sandboxes are reaped
|
|
372
|
+
oldest-first. The TTL, footprint and free-space reaps all skip a sandbox whose owning
|
|
373
|
+
process is still running. The owner marker is published atomically (temp file, fsync,
|
|
374
|
+
rename).
|
|
375
|
+
- **Other knobs:** `PHASE_LOOP_SANDBOX_ROOT` (the selected root, recorded in the
|
|
376
|
+
evidence; see the placement seam below), `PHASE_LOOP_SANDBOX_REMOTE_REQUIRED`,
|
|
377
|
+
`PHASE_LOOP_SANDBOX_TTL_S` (24 h), `PHASE_LOOP_SANDBOX_PROBE_TIMEOUT_S`,
|
|
378
|
+
`PHASE_LOOP_SANDBOX_ARCHIVE_DEST`, `PHASE_LOOP_SANDBOX_DISABLE`.
|
|
379
|
+
- **Sandbox placement seam (agent-harness#896, `sandbox_placement`).** One vendor-neutral
|
|
380
|
+
seam, several backends. The built-in `LocalBackend` is today's path; a remote host or a
|
|
381
|
+
cloud sandbox registers a backend under a URL scheme, directly or through the
|
|
382
|
+
`phase_loop_runtime.placement_backends` entry-point group, which is loaded only when a
|
|
383
|
+
configured root names that scheme. Core names no vendor.
|
|
384
|
+
- **Phases, in order, for every backend.** `prepare` is runtime code
|
|
385
|
+
(`prepare_local_stage`: stage locally, owning the partial stage until it returns), never
|
|
386
|
+
a backend method. The runtime's revalidations then run against that local stage,
|
|
387
|
+
unchanged. `commit` transfers the revalidated stage (a no-op locally); it owns any
|
|
388
|
+
partial remote state until it returns and the backend recomputes the digest. `execute` /
|
|
389
|
+
`wait` / `cancel` / `renew` are the runtime's own launch branches locally. `release`
|
|
390
|
+
removes the stage. Code never leaves the operator's custody before revalidation.
|
|
391
|
+
- **Launch is final.** Once `execute` is called, even if it raised, the attempt is
|
|
392
|
+
launched: it never falls back to local, and a retry in the same round reuses the same
|
|
393
|
+
backend or refuses.
|
|
394
|
+
- **Receipts.** Backends return `BackendReceipt`s only. Only the runtime builds a
|
|
395
|
+
`PlacementReceipt(attested_by="runtime")`, for a step it performed and observed
|
|
396
|
+
(`prepared`, `committed`, `launched` -- `execute` called, or a local provider process
|
|
397
|
+
the runtime started, counted once `Popen` returned; a launch that fails to exec is not
|
|
398
|
+
one, and infrastructure launches such as the egress namespace holder and its uplink are
|
|
399
|
+
never counted -- and `completed`). A backend's claim is recorded as `attested_by="backend"`. Every
|
|
400
|
+
receipt carries `sandbox_ref` (`[A-Za-z0-9._:-]{1,128}`, anything else refuses the
|
|
401
|
+
placement) and `snapshot_sha256`, which the runtime computes from the local stage.
|
|
402
|
+
- **`sandbox_root_applied`.** Local: the built-in backend, no host, and the root is the
|
|
403
|
+
stage's parent. Non-local: runtime-attested `committed` and `completed` share one
|
|
404
|
+
`sandbox_ref`, both carry the authorization's staged-tree digest, the leg spawned no
|
|
405
|
+
local provider, and any backend receipts agree. Backend receipts alone never make it
|
|
406
|
+
true. `sandbox_staged_at` is the path locally and `<scheme>:<sandbox_ref>` otherwise.
|
|
407
|
+
- **Capabilities and declarations.** `capabilities()` is what a backend can enforce, from
|
|
408
|
+
a closed set (`private_ranges_unreachable`, `public_egress`, `private_allowlist`,
|
|
409
|
+
`inbound_closed`, `filesystem_confined`, `uid_isolated`, `bounding_set_empty`,
|
|
410
|
+
`seccomp_filtered`, `resource_bounded`, `one_shot_secret_channel`, `operator_custody`).
|
|
411
|
+
`verified` maps a capability verified for this placement to `runtime_end_to_end` (only
|
|
412
|
+
the runtime writes it) or `backend_attested`, and is a subset of `capabilities()`.
|
|
413
|
+
`LocalBackend.capabilities()` is empty: local egress and uid facts stay in their own
|
|
414
|
+
fields. `declaration()` names the backend's egress residuals (closed kinds, each with
|
|
415
|
+
`closed_in_guest`), the control-plane variables it injects into the guest (values
|
|
416
|
+
redacted), and `max_lifetime_s`.
|
|
417
|
+
- **Roots.** `PHASE_LOOP_SANDBOX_ROOT` is the single-root form. Otherwise the user
|
|
418
|
+
config's `[sandbox]` table in `advisor-boards.toml` names one root per remote backend
|
|
419
|
+
(`roots.self-hosted = "https://…"`, `roots.e2b = "e2b://…"`) and the order to try them
|
|
420
|
+
(`order`, default `["self-hosted", "e2b"]`; named roots it omits follow in file order).
|
|
421
|
+
The single root is an alias for one backend and, when set, the only candidate. A
|
|
422
|
+
malformed table or unknown key raises `sandbox_config_invalid`; a repository file cannot
|
|
423
|
+
carry `[sandbox]`. Candidates are tried in order and the first usable one is chosen;
|
|
424
|
+
each one passed over adds `<name>: <reason>` to `sandbox_root_reason`.
|
|
425
|
+
- **Root parsing.** A value is stripped; anything containing `://` is a URL and keeps only
|
|
426
|
+
scheme, host, port and path. A malformed scheme (`sandbox_root_scheme_invalid`), a
|
|
427
|
+
built-in scheme written as a URL (`sandbox_root_scheme_builtin`), and a non-URL value
|
|
428
|
+
with `user:…@` or a query (`sandbox_root_unrecognised`) are refused without a probe and
|
|
429
|
+
rendered as a placeholder. No warning, reason, recorded path or probe argument is built
|
|
430
|
+
from the configured text; all use the parsed form.
|
|
431
|
+
- **Execution gate.** A build calls a non-local backend's methods only if its own driver
|
|
432
|
+
executes on that backend (`panel_invoker._NONLOCAL_EXECUTION_DRIVER`). This release has
|
|
433
|
+
no such driver: root selection passes over every non-local backend before `prepare` and
|
|
434
|
+
before any of its methods, and the leg falls back to local with
|
|
435
|
+
`sandbox_root_fell_back=true` and a reason naming the root and
|
|
436
|
+
`sandbox_placement_driver_unavailable`.
|
|
437
|
+
- **Fail-closed knob.** `PHASE_LOOP_SANDBOX_REMOTE_REQUIRED` (`1`/`true`/`yes`/`on`; any
|
|
438
|
+
unrecognised value is on) refuses a seat leg -- every review-mode leg `_default_spawn`
|
|
439
|
+
launches for a board seat, tree or no tree -- unless the runtime ran it through a remote
|
|
440
|
+
backend's `execute`. Exemption is by execution, never by where placement came from, so
|
|
441
|
+
in this release it refuses every seat leg, before any root is probed or anything is
|
|
442
|
+
staged, with detail `sandbox_placement_required_unavailable`. Advisory-mode boards are
|
|
443
|
+
not seat legs and are not governed by it.
|
|
444
|
+
- **Evidence.** The leg's placement record (`sandbox_placement_backend`,
|
|
445
|
+
`sandbox_placement_receipts`, `sandbox_placement_verified`,
|
|
446
|
+
`sandbox_local_provider_spawns`, `sandbox_snapshot_sha256` -- the authorization's
|
|
447
|
+
digest) is recorded right after `prepare` and travels on
|
|
448
|
+
`PanelLegResult.sandbox_placement_evidence` on every exit, failures included; the
|
|
449
|
+
runner persists it in the leg's `implementation-panel-<leg>.json`. The local spawn count
|
|
450
|
+
is read when the record is serialized. Every exit, including egress teardown raising,
|
|
451
|
+
releases the stage and resets the leg's facts and spawn counter. A brokered leg's broker evidence
|
|
452
|
+
carries the same keys, and `scripts/verify_harden_evidence.py` enumerates them and
|
|
453
|
+
checks the `applied` rule for the recorded backend.
|
|
454
|
+
- **Spawned CLI scratch (agent-harness#1147, `fill_child_tmp_env`).** Agent CLIs write
|
|
455
|
+
large scratch of their own; Claude Code uses `$CLAUDE_CODE_TMPDIR`, else the temp dir
|
|
456
|
+
(`/tmp/claude-<uid>`).
|
|
457
|
+
- **What is filled.** Each of `TMPDIR` and `CLAUDE_CODE_TMPDIR` that the child env does
|
|
458
|
+
not already set is judged against its own default destination. If that destination is
|
|
459
|
+
RAM-backed, the variable is set to a private (0700, ours) disk-backed per-user dir that
|
|
460
|
+
is above its free-space floor: `phase-loop/tmp` in the cache dir, else
|
|
461
|
+
`phase-loop-<uid>/tmp` under the temp dir.
|
|
462
|
+
- **Where it applies.** Every review-provider launch: `panel_invoker.launch_provider` /
|
|
463
|
+
`run_provider` apply `child_scratch_env` to the env they launch with, and only the
|
|
464
|
+
named exceptions can opt out (`child_scratch=`). The env builders fill too, so the
|
|
465
|
+
recorded provider evidence matches the launch: board legs and advisory seats
|
|
466
|
+
(`_subscription_env`, the `_exec_leg` explicit-env route), brokered legs including
|
|
467
|
+
bounded Gemini, and both presidents (`_broker_leg_env`). Outside the provider
|
|
468
|
+
interface: executors (`child_executor_env`) and convergence adapters
|
|
469
|
+
(`_child_environment`). The Agent View executor's `claude --bg` goes through the
|
|
470
|
+
interface: `ClaudeAgentViewAdapter`'s default runner calls `run_provider` with an
|
|
471
|
+
explicit env. A bounded brokered agy leg's owned HOME is created in the
|
|
472
|
+
relocated dir as well. A decision returns a `DecidedEnv` labelled
|
|
473
|
+
`PHASE_LOOP_SCRATCH_DECIDED=<decision>` and recorded by object identity
|
|
474
|
+
(`sandbox_policy.decided_scratch`). The test suite's audit hook
|
|
475
|
+
(`tests/_scratch_audit_hook.py`) -- a regression tripwire, not an adversarial boundary
|
|
476
|
+
-- fails any test in which the runtime spawns an agent CLI, named from the runtime's own
|
|
477
|
+
harness registries, with an env object that is not one a decision returned, whatever
|
|
478
|
+
API spawns it. That is the completeness check. `tests/test_agent_cli_scratch_inventory_1147.py` is a static early
|
|
479
|
+
warning: it enumerates every process launch in the package and fails on one with no
|
|
480
|
+
stated decision. It is conservative: an unresolvable use of a launch-capable module (a computed `getattr`,
|
|
481
|
+
`__dict__`, the module as a value, a dynamic import, `exec`/`eval`) needs a stated
|
|
482
|
+
decision too. Env builders (`_broker_subscription_env`, `scrub_subscription_env`)
|
|
483
|
+
take no decision; each route decides after building, so a named exception is never
|
|
484
|
+
refused by a relocation it is exempt from.
|
|
485
|
+
- **Overrides.** A value the caller set is never overridden. The brokered allowlist
|
|
486
|
+
still drops ambient values, so there only the runtime's own dir can appear.
|
|
341
487
|
- **Golden byte-identity preserved.** No ref ⇒ identical staged bytes ⇒ identical
|
|
342
488
|
per-leg argv / env / timeout. `tests/test_advisor_board_golden.py` (Proof A hits
|
|
343
489
|
`_exec_leg`; Proof B injects `spawn=`) is untouched;
|
|
@@ -551,7 +697,7 @@ never through — the review operation `public_board_review.v1`. Frozen falsifie
|
|
|
551
697
|
- **Rung routes** (`president_adapter.build_president_invoke(..., monitoring_policy=)`).
|
|
552
698
|
Unseated rung → typed `president_unavailable` (descend). `sol` / `grok` → the brokered
|
|
553
699
|
`_exec_leg` in a throwaway directory, whose only launch is `launch_provider`. `gemini` →
|
|
554
|
-
the broker's
|
|
700
|
+
the broker's agy stream with the PRESIDENT's own final instruction (a ruling,
|
|
555
701
|
not a review verdict), launched through `_run_leg_with_liveness` → `launch_provider` and
|
|
556
702
|
decoded by `_broker_gemini_stream_result`; with the agy subscription credential it runs in
|
|
557
703
|
the broker's agy profile, without one in an empty private HOME (no credential of any kind),
|
|
@@ -672,7 +818,60 @@ The TUI timestamp is refreshed by novel output lines, review-file growth and
|
|
|
672
818
|
transcript growth — a startup banner is novel output and refreshes it; only
|
|
673
819
|
repeated cosmetic repaints do not, once the existing novelty detector has seen
|
|
674
820
|
their text. The CPU-tick heartbeat never refreshes it.
|
|
675
|
-
Neither state is a health attestation or permission to terminate.
|
|
821
|
+
Neither state is a health attestation or permission to terminate.
|
|
822
|
+
The record also carries a progress notice (agent-harness#1176). When no genuine
|
|
823
|
+
progress has been seen for `stall_notice_s` (default 3600 s; override with
|
|
824
|
+
`PHASE_LOOP_REVIEW_STALL_NOTICE_S`), and no progress at all counts from seat
|
|
825
|
+
start, `progress_notice` is `seat_progress_stalled`, `progress_notice_count`
|
|
826
|
+
counts crossings, and one operator warning with only that code and numbers is
|
|
827
|
+
logged. Resumed progress and a terminal observation clear the active notice;
|
|
828
|
+
`last_progress_notice` and the count stay as history. The notice never ends the
|
|
829
|
+
seat. The record reaches the board: `advisor-board --json` legs carry it as
|
|
830
|
+
`review_monitoring`, the text summary prints a `[seat_progress_stalled]` line
|
|
831
|
+
per affected seat on stderr, each streamed per-leg verdict file carries it, and
|
|
832
|
+
the governed record adds a `seat_progress_stalled` warn finding per seat.
|
|
833
|
+
The exact brokered Claude transcript is classified once per change, by
|
|
834
|
+
`_claude_transcript_outcome`, into one outcome; the answer parser and the
|
|
835
|
+
give-up detector are views of it, so they cannot disagree:
|
|
836
|
+
- `answer`: the route's answer parser (the agent-harness#1002/#1077/#1017
|
|
837
|
+
rules; the president route fails closed on any error record in the turn)
|
|
838
|
+
returns text. An accepted answer always wins, whatever follows it. An
|
|
839
|
+
`isApiErrorMessage` record is never answer text. Every record of the answer
|
|
840
|
+
must be a member of the current request (defined below; a sidechain sighting
|
|
841
|
+
counts), so a record that is not evidence for the request never answers it
|
|
842
|
+
either. If the text is not an
|
|
843
|
+
accepted verdict, the leg is handed it back as
|
|
844
|
+
`claude_tui_broker_terminal_nonconforming` instead of waiting.
|
|
845
|
+
- `gave_up`: no answer, and the last live record after the current request is
|
|
846
|
+
an `isApiErrorMessage` give-up. The leg ends at once as DEGRADED with
|
|
847
|
+
`claude_seat_output_budget_exhausted` (`error: max_output_tokens`),
|
|
848
|
+
`claude_seat_usage_limited` (`error: rate_limit` with
|
|
849
|
+
`quotaLimits.status: rejected`, a subscription cap, followed by
|
|
850
|
+
`: usage_limit (resets HH:MM, Mon D YYYY)` rendered in UTC from
|
|
851
|
+
`quotaLimits.resetsAt` when present), `claude_seat_rate_limited` (any other
|
|
852
|
+
`rate_limit`) or `claude_seat_provider_api_error`.
|
|
853
|
+
- `rejected`: no answer, and the turn ended in a completed (`end_turn` /
|
|
854
|
+
`stop_sequence`) answer carrying a text block that the route's parser refuses.
|
|
855
|
+
The leg ends at once as DEGRADED with `claude_seat_transcript_rejected`.
|
|
856
|
+
- `pending`: anything else (an open or capped message, the CLI's resume prompt,
|
|
857
|
+
a newer request, a writer mid-append). A `max_tokens` stop is never terminal.
|
|
858
|
+
The "last live record" is decided in APPEND order among the current request's
|
|
859
|
+
records, chosen by membership, not position. The current request is the last
|
|
860
|
+
user record that is not `isMeta`, carries no tool_result and is not a replay (its
|
|
861
|
+
uuid and content recurring, whatever its completion metadata, as in the answer
|
|
862
|
+
parser). A record is evidence for it only when it is a new version first seen in
|
|
863
|
+
it: its uuid was first seen after the request (a record of an earlier request is
|
|
864
|
+
never evidence, wherever it is appended, except an `isApiErrorMessage` record
|
|
865
|
+
appended in the current request, which always is); it is not an exact replay of a
|
|
866
|
+
version already seen (same uuid, content, `stop_reason` presence and value, and
|
|
867
|
+
error flag) nor a stale open copy of a stopped record whose content is unchanged;
|
|
868
|
+
and it is not a sidechain record (`isSidechain`), which the answer parser drops
|
|
869
|
+
too. An open record first seen in the current request, even a changed version
|
|
870
|
+
after its own stop, is still streaming and reads `pending`. An `isApiErrorMessage`
|
|
871
|
+
record is terminal event evidence and is never collapsed into an earlier
|
|
872
|
+
version of its uuid. Replays and rewritten metadata are not progress. `provider_terminal_state` records the code that
|
|
873
|
+
ended the leg. `isApiErrorMessage` matches JSON `true` or the string `"true"`,
|
|
874
|
+
on the record or the message. Frozen
|
|
676
875
|
broker request/response keys, status literals, and observer envelopes are unchanged.
|
|
677
876
|
|
|
678
877
|
When staging requires egress isolation, acquisition follows staged-tree and operation
|
|
@@ -687,8 +886,11 @@ review text and the exception in detail; sandbox facts describe actual enforceme
|
|
|
687
886
|
|
|
688
887
|
The Linux x64 subscription `agy` entry image must match one member of the closed
|
|
689
888
|
set `gemini_heartbeat.QUALIFIED_IMAGES`: 1.2.11 SHA256
|
|
690
|
-
`ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56
|
|
691
|
-
`ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca
|
|
889
|
+
`ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56`, 1.2.12 SHA256
|
|
890
|
+
`ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca`, 1.2.14 SHA256
|
|
891
|
+
`0d0d3eba22daf29504dd290151c7ed9a4d33b0c6aa0acfc5da27bc3b01d2f029`, 1.2.15 SHA256
|
|
892
|
+
`5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164` or 1.2.16 SHA256
|
|
893
|
+
`a759ce7c7a235d9b6c281a25ead97cbbf2e92314a3ffd224e2f9144f3fae7a86`. Each member
|
|
692
894
|
carries its measured help digest and has its own qualification record; the
|
|
693
895
|
evidence catalog and the runtime set must name exactly the same members.
|
|
694
896
|
The running Python/kernel must support sealed memfds, pidfds and pidfd signaling;
|
|
@@ -710,7 +912,8 @@ HOME fallback truthfully if HOME is absent. Legitimate refresh writes survive.
|
|
|
710
912
|
The real qualification driver requires an explicit HOME and checks target
|
|
711
913
|
presence before and after, without reading its contents.
|
|
712
914
|
|
|
713
|
-
The broker transports same-session
|
|
915
|
+
The broker transports same-session input over stdin (one event when the sealed prompt fits
|
|
916
|
+
one chunk, acknowledged chunks otherwise; agent-harness#1175), with no tree
|
|
714
917
|
attachment, `--add-dir`, permission bypass, retry or native thinking timer. Empty,
|
|
715
918
|
rejected and nonzero-exit streams remain non-votes with fixed diagnostics;
|
|
716
919
|
provider stdout/stderr and arbitrary exception strings are not substituted for
|
|
@@ -839,3 +1042,70 @@ A non-release `agy` image is admitted only by verifying it, never by trusting it
|
|
|
839
1042
|
verified pushed oid in its own `watch_push` entry, and reads both the record and the
|
|
840
1043
|
created PR back (the PR body's copy is display-only). "Up to date" requires that local record, `headRefOid` and `ls-remote` to
|
|
841
1044
|
agree. It refuses when it cannot prove its open-PR listing complete.
|
|
1045
|
+
|
|
1046
|
+
## ABDFALSIFY — Executable review findings (IF-0-EXECFIND-1)
|
|
1047
|
+
|
|
1048
|
+
An optional `falsifier` attachment names one `FindingFalsifier` with
|
|
1049
|
+
`finding_id`, `new_test_path`, `expected_nodeid`, and a unified `diff` creating
|
|
1050
|
+
only `phase-loop-runtime/tests/test_finding_<finding_id>.py`. A
|
|
1051
|
+
`FindingFalsifierAttachment` contains a tuple of these entries with unique
|
|
1052
|
+
finding IDs. The attachment is a non-field property on `PanelLegResult`; it
|
|
1053
|
+
does not change the serialized leg or board schema. The seat supplies text,
|
|
1054
|
+
never an executable command or a claimed test outcome.
|
|
1055
|
+
|
|
1056
|
+
`run_finding_falsifier` accepts one attached falsifier, board `seat_key`, canonical
|
|
1057
|
+
repository, positive wall-clock/output bounds, and a single-use
|
|
1058
|
+
`FalsifierIsolationAuthorization` bound to the exact 40-character `reviewed_sha`.
|
|
1059
|
+
Its identity is `public_board_falsifier.v1`; its child has no credentials,
|
|
1060
|
+
network egress, or live-tree mount. The source must be clean at that SHA.
|
|
1061
|
+
Before applying the diff, the staged materialized path set, bytes, symlink
|
|
1062
|
+
targets, and executable bits must equal the reviewed Git tree, including no
|
|
1063
|
+
ignored extra files. Only the named pytest node runs in the staged clone.
|
|
1064
|
+
|
|
1065
|
+
Each run stages its own tree from the canonical repository at the head under
|
|
1066
|
+
test, never from a seat's tree, and copies installed dependency files into a
|
|
1067
|
+
per-run import root (copies, never links; uv's `--link-mode=copy` equivalent).
|
|
1068
|
+
Those two trees are the run's protected objects: every regular file in them,
|
|
1069
|
+
`.git` included, must have a link count of exactly one before the node starts
|
|
1070
|
+
and after it exits, or the run is `error` (agent-harness#1134). The shared system
|
|
1071
|
+
interpreter is read-only to the run and is not a protected object. The runner
|
|
1072
|
+
resolves `/usr/bin/python3` once and launches exactly that file. Falsifier runs
|
|
1073
|
+
execute without site processing (`-S`): no `.pth`, `sitecustomize` or
|
|
1074
|
+
`usercustomize` runs and no host site directory is on `sys.path`, so the
|
|
1075
|
+
interpreter's inputs are its standard-library entries plus the run's explicit
|
|
1076
|
+
staged paths. Every dependency, pytest included, comes from the per-run staged
|
|
1077
|
+
dependency root (a distribution without a RECORD is staged from its declared
|
|
1078
|
+
top-level modules); a host site directory on the falsifier path is refused as
|
|
1079
|
+
`falsifier_host_site_packages_refused`. The measured set is the launched
|
|
1080
|
+
interpreter's own `sys.path` under the same flags and environment, so the
|
|
1081
|
+
inventory and the launch are identical by construction. Every entry is
|
|
1082
|
+
digested before and after the run: archive entries and `.pth`, archive and
|
|
1083
|
+
customize files by content, directories by an lstat manifest (mode, size,
|
|
1084
|
+
device, inode, mtime, ctime), and every symlink target outside the set followed
|
|
1085
|
+
and hashed by content. An entry the runner cannot digest fails closed, and a
|
|
1086
|
+
changed scope or digest is `error`.
|
|
1087
|
+
Before staging, the canonical repository must not be reachable through any
|
|
1088
|
+
system-root mount (compared by device and in-filesystem path, not by pathname),
|
|
1089
|
+
and a repository that contains any mount point is refused as
|
|
1090
|
+
`falsifier_repository_submount_refused`. The record schema is unchanged; the reason
|
|
1091
|
+
stays in the result's `detail`.
|
|
1092
|
+
|
|
1093
|
+
The frozen outcome tuple is `red_on_head`, `green_on_head`, `apply_failed`,
|
|
1094
|
+
`node_missing`, `error`. Pytest emits JUnit, but the recorded outcome comes from
|
|
1095
|
+
the wrapper's reported call-phase result; the test-writable XML is not read as
|
|
1096
|
+
authority. Seat-authored and reviewed-tree Python (including conftest) run
|
|
1097
|
+
in the wrapper's process and can forge
|
|
1098
|
+
the reported status, including a parent-keyed frame. RED and GREEN are therefore
|
|
1099
|
+
observed, untrusted results: neither binds nor dismisses a finding. Drift,
|
|
1100
|
+
expiry, unavailable isolation, and incomplete evidence are `error`; every
|
|
1101
|
+
valid attached result remains a blocking `finding_receipt` pending a president
|
|
1102
|
+
ruling. The metadata-only
|
|
1103
|
+
`finding_falsifier.v1` record has exactly `schema`,
|
|
1104
|
+
`authorization_identity`, `seat_key`, `reviewed_sha`, `finding_id`, `nodeid`,
|
|
1105
|
+
`outcome`, `red_output_digest`, `diff_digest`, `wall_clock_bound_s`, and
|
|
1106
|
+
`output_cap_bytes`. `diff_digest` hashes the offered UTF-8 diff bytes;
|
|
1107
|
+
`red_output_digest` hashes separately captured stdout followed by stderr
|
|
1108
|
+
and is null unless RED. The caller binds the record with SHA-256 over
|
|
1109
|
+
canonical JSON (`sort_keys=True`, compact separators, `ensure_ascii=False`).
|
|
1110
|
+
The full freeze and golden values live in
|
|
1111
|
+
`tests/data/execfind_falsifier_attachment_v1.golden.json`.
|