phase-loop-runtime 0.7.23__tar.gz → 0.7.24__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.
Files changed (1032) hide show
  1. {phase_loop_runtime-0.7.23/src/phase_loop_runtime.egg-info → phase_loop_runtime-0.7.24}/PKG-INFO +2 -2
  2. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/README.md +1 -1
  3. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/pyproject.toml +2 -1
  4. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/__init__.py +1 -1
  5. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +287 -2
  6. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/cli.py +149 -3
  7. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/gemini_heartbeat.py +3 -0
  8. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/governed_review.py +10 -0
  9. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/panel_invoker.py +1163 -23
  10. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_assumptions.py +2 -2
  11. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/sandbox_egress.py +60 -1
  12. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_credentials.py +765 -0
  13. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_jail.py +1540 -0
  14. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_jail_autoqualify.py +262 -0
  15. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_jail_qualification.py +463 -0
  16. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_keyring_exec.py +55 -0
  17. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/seat_preflight.py +67 -0
  18. phase_loop_runtime-0.7.24/src/phase_loop_runtime/seat_uid.py +570 -0
  19. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24/src/phase_loop_runtime.egg-info}/PKG-INFO +2 -2
  20. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime.egg-info/SOURCES.txt +15 -0
  21. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_advisory_cli_802.py +2 -0
  22. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_agent_cli_scratch_inventory_1147.py +24 -0
  23. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_conftest_isolation.py +12 -0
  24. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_legible_roadmap_contract.py +6 -6
  25. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_qualified_agy_image_set.py +3 -2
  26. phase_loop_runtime-0.7.24/tests/test_seat_credentials.py +830 -0
  27. phase_loop_runtime-0.7.24/tests/test_seat_jail.py +731 -0
  28. phase_loop_runtime-0.7.24/tests/test_seat_jail_autoqualify.py +170 -0
  29. phase_loop_runtime-0.7.24/tests/test_seat_jail_live_d8.py +454 -0
  30. phase_loop_runtime-0.7.24/tests/test_seat_launch_helpers_trusted.py +276 -0
  31. phase_loop_runtime-0.7.24/tests/test_seat_login_wait_a3_1166.py +346 -0
  32. phase_loop_runtime-0.7.24/tests/test_seat_login_wait_board_context_r12.py +172 -0
  33. phase_loop_runtime-0.7.24/tests/test_seat_notices.py +1147 -0
  34. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_seat_preflight_1204.py +123 -5
  35. phase_loop_runtime-0.7.24/tests/test_seat_sandbox_permissions.py +1089 -0
  36. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/MANIFEST.in +0 -0
  37. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/protocol/protocol.md +0 -0
  38. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/setup.cfg +0 -0
  39. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_baml_worker.py +0 -0
  40. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  41. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  42. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  43. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  44. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  45. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  46. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  47. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  48. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  49. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  50. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  51. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  52. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  53. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  54. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_proc_cpu.py +0 -0
  55. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  56. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  57. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  58. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  59. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  60. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  61. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  62. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  63. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  64. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  65. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  66. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  67. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  68. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  69. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  70. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  71. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  72. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  73. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  74. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  75. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  76. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  77. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  78. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  79. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  80. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  81. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  82. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  83. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  84. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  85. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  86. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  87. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  88. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  89. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  90. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  91. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  92. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  93. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  94. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  95. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  96. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/advisory_contract.py +0 -0
  97. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  98. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  99. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
  100. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  101. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  102. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  103. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  104. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  105. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  106. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  107. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  108. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  109. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/research.py +0 -0
  110. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  111. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  112. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  113. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  114. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  115. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/agy_canary_evidence.py +0 -0
  116. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/agy_provenance.py +0 -0
  117. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/agy_qualification.py +0 -0
  118. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/agy_watch.py +0 -0
  119. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_modular.py +0 -0
  120. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  121. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  122. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  123. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  124. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  125. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  126. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  127. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/phase_loop_bridge.baml +0 -0
  128. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  129. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/broker.py +0 -0
  130. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/build_bundle.py +0 -0
  131. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/capability_registry.py +0 -0
  132. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/classifier.py +0 -0
  133. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  134. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  135. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/closeout.py +0 -0
  136. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  137. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  138. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/closeout_validation.py +0 -0
  139. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/closeout_validators.py +0 -0
  140. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/__init__.py +0 -0
  141. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/VENDOR.json +0 -0
  142. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/consiliency_spec/outside_agent_router.py +0 -0
  143. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-route-verdict.schema.json +0 -0
  144. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/schemas/outside-agent-submission.schema.json +0 -0
  145. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-empty-evidence-refs.json +0 -0
  146. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-git-object-id-length.json +0 -0
  147. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-missing-digest.json +0 -0
  148. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-path-traversal.json +0 -0
  149. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-raw-payload.json +0 -0
  150. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-source-bundle-mismatch.json +0 -0
  151. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unknown-producer-identity-posture.json +0 -0
  152. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/invalid-unsupported-verdict.json +0 -0
  153. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/manifest.json +0 -0
  154. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-ambiguity-report.json +0 -0
  155. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-implementation-submission.json +0 -0
  156. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/_contract/test-vectors/outside-agent/valid-work-request.json +0 -0
  157. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
  158. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
  159. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
  160. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_conform_evidence.py +0 -0
  161. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
  162. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
  163. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
  164. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
  165. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
  166. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
  167. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
  168. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
  169. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
  170. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/consiliency_gates.py +0 -0
  171. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  172. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  173. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  174. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/__init__.py +0 -0
  175. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/adapters/__init__.py +0 -0
  176. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/adapters/base.py +0 -0
  177. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/adapters/claude.py +0 -0
  178. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/adapters/codex.py +0 -0
  179. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/adapters/outside_agent.py +0 -0
  180. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/__init__.py +0 -0
  181. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/admission.py +0 -0
  182. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/credsep.py +0 -0
  183. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/evidence.py +0 -0
  184. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/live.py +0 -0
  185. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/broker/verbs.py +0 -0
  186. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/contracts.py +0 -0
  187. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/dispatch.py +0 -0
  188. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/event_log.py +0 -0
  189. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/fencing.py +0 -0
  190. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/provider_contracts.py +0 -0
  191. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/reconcile.py +0 -0
  192. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/refresh.py +0 -0
  193. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/convergence/status.py +0 -0
  194. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/credential_redaction.py +0 -0
  195. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  196. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/declared_identity.py +0 -0
  197. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
  198. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
  199. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/discovery.py +0 -0
  200. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  201. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  202. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/docs_audit.py +0 -0
  203. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/docs_freshness.py +0 -0
  204. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  205. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/doctor.py +0 -0
  206. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  207. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/entry_doc_check.py +0 -0
  208. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/events.py +0 -0
  209. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/events_migration.py +0 -0
  210. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/evidence_audit.py +0 -0
  211. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  212. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/executor_availability.py +0 -0
  213. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fab_canonical.py +0 -0
  214. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fab_delta.py +0 -0
  215. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fab_gate.py +0 -0
  216. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fab_producer.py +0 -0
  217. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fab_provenance.py +0 -0
  218. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fabpub_capability.py +0 -0
  219. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fabpub_tdd_chronology.py +0 -0
  220. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fabreadmit_capability.py +0 -0
  221. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/falsifier.py +0 -0
  222. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fleet_map.py +0 -0
  223. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  224. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  225. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/gate_posture.py +0 -0
  226. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/generated_outputs.py +0 -0
  227. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/git_discipline.py +0 -0
  228. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/git_ops.py +0 -0
  229. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/git_topology.py +0 -0
  230. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/goal_coverage.py +0 -0
  231. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/governed_bundle.py +0 -0
  232. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/governed_premerge.py +0 -0
  233. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/handoff.py +0 -0
  234. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/handoff_path.py +0 -0
  235. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
  236. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/injection.py +0 -0
  237. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/install_status.py +0 -0
  238. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  239. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/launcher.py +0 -0
  240. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/lease_store.py +0 -0
  241. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/lease_supervisor.py +0 -0
  242. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/legible_evidence.py +0 -0
  243. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/maintenance.py +0 -0
  244. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  245. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/models.py +0 -0
  246. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/observability.py +0 -0
  247. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  248. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  249. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  250. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  251. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  252. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  253. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  254. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
  255. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  256. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/plan_ir.py +0 -0
  257. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/plan_manifest.py +0 -0
  258. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/plan_pin_lint.py +0 -0
  259. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/planner_validation.py +0 -0
  260. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/president_adapter.py +0 -0
  261. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/president_operation.py +0 -0
  262. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/producer_manifest.py +0 -0
  263. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/profiles.py +0 -0
  264. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/prompts.py +0 -0
  265. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/proof_stages.py +0 -0
  266. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/provenance.py +0 -0
  267. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/publishing.py +0 -0
  268. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/py.typed +0 -0
  269. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/ratification_policy.py +0 -0
  270. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/reconcile.py +0 -0
  271. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/redaction.py +0 -0
  272. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/reflection_sync.py +0 -0
  273. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/release_guard.py +0 -0
  274. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/render.py +0 -0
  275. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/repo_validation.py +0 -0
  276. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/review_stage.py +0 -0
  277. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/review_summary.py +0 -0
  278. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/reviewtruth_native_fill_capability.py +0 -0
  279. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_authority.py +0 -0
  280. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  281. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_ownership.py +0 -0
  282. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_representation_check.py +0 -0
  283. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/roadmap_reseal.py +0 -0
  284. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/route_log.py +0 -0
  285. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  286. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  287. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/runner.py +0 -0
  288. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/runtime_paths.py +0 -0
  289. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/runtime_projection.py +0 -0
  290. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/runtime_resources.py +0 -0
  291. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/sandbox_placement.py +0 -0
  292. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/sandbox_policy.py +0 -0
  293. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/sandbox_retention.py +0 -0
  294. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/schema_export.py +0 -0
  295. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
  296. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
  297. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  298. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skill_install.py +0 -0
  299. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skill_inventory.py +0 -0
  300. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skill_paths.py +0 -0
  301. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  302. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  303. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  304. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  305. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  306. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  307. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  308. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  309. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  310. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  311. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  312. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  313. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  314. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  315. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  316. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  317. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  318. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  319. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  320. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  321. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  322. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  323. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  324. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  325. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  326. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  327. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  328. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  329. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  330. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  331. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  332. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  333. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  334. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  335. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  336. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  337. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  338. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  339. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  340. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  341. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  342. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  343. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  344. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  345. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  346. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  347. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  348. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  349. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  350. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  351. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  352. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  353. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  354. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  355. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  356. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  357. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  358. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  359. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  360. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  361. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  362. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  363. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  364. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  365. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  366. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  367. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  368. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  369. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  370. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  371. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  372. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  373. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  374. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  375. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  376. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  377. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  378. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  379. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  380. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  381. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  382. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  383. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  384. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  385. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  386. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  387. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  388. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  389. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  390. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  391. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  392. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  393. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  394. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  395. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  396. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  397. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  398. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  399. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  400. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  401. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  402. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  403. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  404. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  405. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  406. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  407. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  408. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  409. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  410. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  411. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  412. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  413. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  414. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  415. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  416. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  417. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  418. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  419. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  420. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  421. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  422. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  423. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  424. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  425. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  426. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  427. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  428. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  429. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  430. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  431. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  432. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  433. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  434. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  435. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  436. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  437. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  438. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  439. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  440. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  441. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  442. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  443. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  444. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  445. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  446. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  447. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  448. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  449. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  450. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  451. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  452. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  453. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  454. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  455. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  456. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  457. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  458. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  459. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  460. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  461. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  462. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  463. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  464. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  465. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  466. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  467. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  468. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  469. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  470. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  471. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  472. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  473. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  474. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  475. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  476. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  477. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  478. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  479. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  480. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  481. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  482. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  483. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  484. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  485. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  486. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  487. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  488. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  489. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  490. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/state.py +0 -0
  491. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/state_degradation.py +0 -0
  492. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/state_ops.py +0 -0
  493. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/task_message_broker.py +0 -0
  494. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
  495. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/task_message_resolver.py +0 -0
  496. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/tdd_receipts.py +0 -0
  497. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/train_ledger.py +0 -0
  498. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/train_review_packet.py +0 -0
  499. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/train_roadmap.py +0 -0
  500. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/train_runner.py +0 -0
  501. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/verification_evidence.py +0 -0
  502. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  503. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/visual_avatar_evidence_validator.py +0 -0
  504. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  505. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/worker_pool.py +0 -0
  506. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime/worktree_index.py +0 -0
  507. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  508. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  509. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
  510. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  511. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_acceptance_falsifier_contract.py +0 -0
  512. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_advisory_mode.py +0 -0
  513. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_alias_install.py +0 -0
  514. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_backcompat.py +0 -0
  515. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_backing_homebrew.py +0 -0
  516. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_backing_omnigent.py +0 -0
  517. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_cli_legacy.py +0 -0
  518. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_composition.py +0 -0
  519. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_concurrency.py +0 -0
  520. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_config.py +0 -0
  521. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_golden.py +0 -0
  522. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_ingestion.py +0 -0
  523. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_integration.py +0 -0
  524. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_live_research.py +0 -0
  525. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_matrix.py +0 -0
  526. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_observability.py +0 -0
  527. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_presets.py +0 -0
  528. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_registries.py +0 -0
  529. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_research.py +0 -0
  530. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_resolver.py +0 -0
  531. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_schema.py +0 -0
  532. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_board_static_import_862.py +0 -0
  533. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_advisor_twin_alias_legacy.py +0 -0
  534. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_agent_runtime_provider_cs08.py +0 -0
  535. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_agy_canary_evidence.py +0 -0
  536. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_agy_self_qualification.py +0 -0
  537. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_agy_single_event_transport_1175.py +0 -0
  538. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_autosel.py +0 -0
  539. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_branchgov_preflight.py +0 -0
  540. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_broker_command_builders.py +0 -0
  541. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_broker_evidence_schema_drift_789.py +0 -0
  542. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_broker_staged_tree_delivery.py +0 -0
  543. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_certificate_tier.py +0 -0
  544. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_chronology_scope.py +0 -0
  545. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_gate_metrics.py +0 -0
  546. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_main_red.py +0 -0
  547. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_offload_lock.py +0 -0
  548. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_quarantine.py +0 -0
  549. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_workflow_concurrency.py +0 -0
  550. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_xdist_adoption.py +0 -0
  551. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ci_xdist_witness.py +0 -0
  552. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_claude_json_schema_metaschema_291.py +0 -0
  553. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_cli_train_status_45.py +0 -0
  554. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_break_glass_cli.py +0 -0
  555. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_classifier.py +0 -0
  556. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_convergence_fixes.py +0 -0
  557. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_exception_vocab.py +0 -0
  558. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_generated_outputs.py +0 -0
  559. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_gitignored_disposable_186b.py +0 -0
  560. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_import_cycle_819.py +0 -0
  561. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_new_owned_directory_closes_clean.py +0 -0
  562. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_validator_hook.py +0 -0
  563. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_closeout_verification_gate.py +0 -0
  564. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_codex_effort_max_clamp_49.py +0 -0
  565. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_committed_range_diff.py +0 -0
  566. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_common_directory_leases_807.py +0 -0
  567. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_conform_timing_instrumentation.py +0 -0
  568. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_conformance_golden.py +0 -0
  569. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_consiliency_dual_layout.py +0 -0
  570. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_consiliency_gates.py +0 -0
  571. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_consiliency_ingest.py +0 -0
  572. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_consiliency_scaffold.py +0 -0
  573. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_console_scripts_are_declared.py +0 -0
  574. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_contract_floor_guard_378.py +0 -0
  575. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_adapters.py +0 -0
  576. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_admission.py +0 -0
  577. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_api.py +0 -0
  578. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_credsep.py +0 -0
  579. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_evidence.py +0 -0
  580. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_revocation_race.py +0 -0
  581. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_broker_verbs.py +0 -0
  582. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_cli_integration.py +0 -0
  583. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_coordination_contracts.py +0 -0
  584. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_dispatch.py +0 -0
  585. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_event_contracts.py +0 -0
  586. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_event_log.py +0 -0
  587. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_fencing.py +0 -0
  588. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_fixture_contracts.py +0 -0
  589. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_invalidation.py +0 -0
  590. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_live_enable.py +0 -0
  591. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_provider_contracts.py +0 -0
  592. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_reconcile.py +0 -0
  593. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_refresh.py +0 -0
  594. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_runtime_imports.py +0 -0
  595. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_seat_lifecycle.py +0 -0
  596. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_status.py +0 -0
  597. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_convergence_train_integration.py +0 -0
  598. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_coordinator_wave_loop.py +0 -0
  599. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_cr_fixes_pr220.py +0 -0
  600. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_credential_redaction_shapes.py +0 -0
  601. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_delegated_visual_evidence_91.py +0 -0
  602. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_discovery_hygiene_legacy.py +0 -0
  603. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dispatch_hold_guard.py +0 -0
  604. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  605. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dispatch_lock_helper.py +0 -0
  606. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dispatch_lock_reentrancy.py +0 -0
  607. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  608. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_doc_delta_validator.py +0 -0
  609. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_docs_audit.py +0 -0
  610. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_docs_freshness.py +0 -0
  611. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_doctor_bom.py +0 -0
  612. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_dotfiles_tree.py +0 -0
  613. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_egress_prefix_crosses_the_broker_thread.py +0 -0
  614. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_entry_doc_check.py +0 -0
  615. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execfind_falsifier.py +0 -0
  616. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execfind_governed_promotion.py +0 -0
  617. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execgov.py +0 -0
  618. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execreg_launch_registry.py +0 -0
  619. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execute_phase_handoff_mode.py +0 -0
  620. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_execution_policy_tiering.py +0 -0
  621. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_executor_availability.py +0 -0
  622. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_executor_exited_without_closeout_785.py +0 -0
  623. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_export_schema.py +0 -0
  624. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_activation_promotion.py +0 -0
  625. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_canonical_b.py +0 -0
  626. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_closeout_crash_safety.py +0 -0
  627. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_closeout_wiring.py +0 -0
  628. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_delta_c.py +0 -0
  629. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_delta_consumer.py +0 -0
  630. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_flag_off_recovery_leak_299.py +0 -0
  631. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_gate_d.py +0 -0
  632. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_producer.py +0 -0
  633. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fab_provenance_a.py +0 -0
  634. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_admission_compat_789.py +0 -0
  635. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_bootstrap_writer_lock_1115.py +0 -0
  636. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_inventory_worktree_lifecycle_789.py +0 -0
  637. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_partition_rotation_789d.py +0 -0
  638. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_recovery_controls_789.py +0 -0
  639. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_rotate_partition_cli_789d.py +0 -0
  640. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_shared_epoch.py +0 -0
  641. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabpub_zero_history_bootstrap.py +0 -0
  642. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabreadmit_authority_digest_v2.py +0 -0
  643. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fabreadmit_broker.py +0 -0
  644. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_finding_F001.py +0 -0
  645. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fleet_map.py +0 -0
  646. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fleet_metrics.py +0 -0
  647. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_fleet_metrics_export.py +0 -0
  648. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_frozen_blob_batch_parse.py +0 -0
  649. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gate_a_wheel_isolation.py +0 -0
  650. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gate_fail_open_visibility.py +0 -0
  651. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gate_parity_244_245.py +0 -0
  652. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gate_posture.py +0 -0
  653. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gemini_heartbeat_bootstrap.py +0 -0
  654. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_gemini_heartbeat_filesystem_view.py +0 -0
  655. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_git_discipline.py +0 -0
  656. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_git_grounded_projection.py +0 -0
  657. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_goal_coverage.py +0 -0
  658. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_cross_vendor_floor_358.py +0 -0
  659. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_disjointness_model_first.py +0 -0
  660. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_e2e.py +0 -0
  661. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_gate_crfixes.py +0 -0
  662. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_planning_gate.py +0 -0
  663. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_premerge.py +0 -0
  664. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_premerge_live.py +0 -0
  665. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_governed_review.py +0 -0
  666. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_declared_identity.py +0 -0
  667. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_panel_policy.py +0 -0
  668. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_plan_manifest_issue_dispositions.py +0 -0
  669. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_plan_pin_lint.py +0 -0
  670. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_producer_manifest.py +0 -0
  671. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_proof_stages.py +0 -0
  672. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_roadmap_reseal.py +0 -0
  673. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_skill_policy_parity.py +0 -0
  674. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_govlean_tdd_receipts.py +0 -0
  675. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_grok_narrow_reject_231.py +0 -0
  676. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_grokexec.py +0 -0
  677. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_harden_evidence_producer.py +0 -0
  678. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_harden_evidence_verifier.py +0 -0
  679. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_harden_json_depth_825.py +0 -0
  680. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_hotfix_lane.py +0 -0
  681. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_injection_skill_failloud.py +0 -0
  682. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_lane_ir_override.py +0 -0
  683. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_launcher_exec_supervisor.py +0 -0
  684. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_launcher_liveness.py +0 -0
  685. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_launchspec_golden.py +0 -0
  686. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_lease_store.py +0 -0
  687. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_lease_store_conformance.py +0 -0
  688. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ledger_serialization.py +0 -0
  689. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_leg_liveness_monitor.py +0 -0
  690. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_legible_evidence.py +0 -0
  691. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_legible_review_repairs.py +0 -0
  692. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_live_smoke_gate_executes.py +0 -0
  693. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_local_check.py +0 -0
  694. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_manifest_per_entry_164.py +0 -0
  695. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_model_class_policy.py +0 -0
  696. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_model_id_source_guard.py +0 -0
  697. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_model_tier_taxonomy.py +0 -0
  698. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_native_claude_seat_fill.py +0 -0
  699. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_native_claude_seat_fill_green.py +0 -0
  700. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_native_fill_refusal_cause.py +0 -0
  701. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_nonzero_suite_command_fails_closed.py +0 -0
  702. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_observability_alerting.py +0 -0
  703. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_advisory.py +0 -0
  704. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_advisory_cli.py +0 -0
  705. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_advisory_fixtures.py +0 -0
  706. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_authority_boundary.py +0 -0
  707. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_canonical_corpus.py +0 -0
  708. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_conform_evidence.py +0 -0
  709. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_contract_drift.py +0 -0
  710. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_contract_imports.py +0 -0
  711. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_contract_pin.py +0 -0
  712. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_core_api.py +0 -0
  713. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_provenance.py +0 -0
  714. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_real_ci.py +0 -0
  715. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_real_cli.py +0 -0
  716. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_real_output.py +0 -0
  717. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_real_runtime.py +0 -0
  718. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_redaction.py +0 -0
  719. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_redaction_separation.py +0 -0
  720. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_release_surface.py +0 -0
  721. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_schema_validation.py +0 -0
  722. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_outside_agent_vectors.py +0 -0
  723. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_owned_command_procfs_1003.py +0 -0
  724. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_packaged_vector_manifest_pin.py +0 -0
  725. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_advisory_mode_63.py +0 -0
  726. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_claude_review_output.py +0 -0
  727. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_codex_auth_signature_body_252.py +0 -0
  728. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_context_refs_114.py +0 -0
  729. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_doc_contract.py +0 -0
  730. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_gemini_no_command_preamble.py +0 -0
  731. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_invoker.py +0 -0
  732. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_invoker_spawn.py +0 -0
  733. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_invoker_timeout_argv.py +0 -0
  734. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_invoker_windows_import.py +0 -0
  735. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_lanes.py +0 -0
  736. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  737. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_leg_failure_diagnostic.py +0 -0
  738. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_leg_status_detail_1096.py +0 -0
  739. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_lens_delivery.py +0 -0
  740. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_native_fill_183.py +0 -0
  741. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_per_leg_model_66.py +0 -0
  742. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_streaming_verdicts.py +0 -0
  743. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_tui_eof_48.py +0 -0
  744. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_tui_liveness_188.py +0 -0
  745. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_tui_workspace_trust_223.py +0 -0
  746. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_panel_verdict_summary.py +0 -0
  747. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_parallel_dispatch_backcompat.py +0 -0
  748. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_parallel_dispatch_cli.py +0 -0
  749. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_adoption_bundle.py +0 -0
  750. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  751. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_dependency.py +0 -0
  752. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  753. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_injection.py +0 -0
  754. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_modular.py +0 -0
  755. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  756. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  757. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_schema_export.py +0 -0
  758. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_schema_source.py +0 -0
  759. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_v1_callers.py +0 -0
  760. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_v1_runtime.py +0 -0
  761. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_baml_v1_supervisor_slot.py +0 -0
  762. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  763. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_break_glass_rerun.py +0 -0
  764. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_build_bundle.py +0 -0
  765. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_classifier.py +0 -0
  766. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  767. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_agent_view_dispatch_409.py +0 -0
  768. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  769. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  770. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  771. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_security.py +0 -0
  772. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  773. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  774. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  775. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_claude_route_selection.py +0 -0
  776. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_cli.py +0 -0
  777. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  778. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_control_only.py +0 -0
  779. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_event.py +0 -0
  780. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  781. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_hardening.py +0 -0
  782. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  783. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_schema.py +0 -0
  784. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_closeout_validation.py +0 -0
  785. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_collaborator_citation.py +0 -0
  786. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_collaborator_docs.py +0 -0
  787. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  788. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
  789. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  790. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  791. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  792. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_discovery.py +0 -0
  793. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_docs.py +0 -0
  794. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  795. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  796. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  797. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  798. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_downstream_portal.py +0 -0
  799. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  800. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_drift_audit.py +0 -0
  801. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
  802. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  803. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_events_migration.py +0 -0
  804. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_evidence_audit.py +0 -0
  805. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  806. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  807. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  808. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  809. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_execution_policy.py +0 -0
  810. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_executor_degradation.py +0 -0
  811. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_full_phase_mode.py +0 -0
  812. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_handoff.py +0 -0
  813. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_handoff_migration.py +0 -0
  814. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_init.py +0 -0
  815. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_injection.py +0 -0
  816. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_install_status.py +0 -0
  817. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
  818. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_lane_harnesses.py +0 -0
  819. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_lane_ir.py +0 -0
  820. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  821. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_lane_scheduler.py +0 -0
  822. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_launcher.py +0 -0
  823. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_ledger_debug.py +0 -0
  824. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_ledger_dedup.py +0 -0
  825. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_live_adapters.py +0 -0
  826. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_maintenance.py +0 -0
  827. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_metrics.py +0 -0
  828. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_migration_regressions.py +0 -0
  829. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  830. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  831. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  832. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_models.py +0 -0
  833. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_native_flags.py +0 -0
  834. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  835. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pi_executor.py +0 -0
  836. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  837. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  838. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  839. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  840. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  841. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_pipeline_mode.py +0 -0
  842. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  843. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_plan_manifest.py +0 -0
  844. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  845. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_planner_validation.py +0 -0
  846. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_policy.py +0 -0
  847. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_protocol_contract.py +0 -0
  848. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_provenance.py +0 -0
  849. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_reconcile.py +0 -0
  850. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  851. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  852. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  853. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_reducers.py +0 -0
  854. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
  855. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  856. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  857. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_roadmap_validate.py +0 -0
  858. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_rotation.py +0 -0
  859. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runner.py +0 -0
  860. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  861. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runtime_boundary.py +0 -0
  862. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runtime_decouple.py +0 -0
  863. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runtime_package_data.py +0 -0
  864. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_runtime_projection.py +0 -0
  865. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_schema_flow.py +0 -0
  866. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  867. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  868. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_contract.py +0 -0
  869. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  870. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_install.py +0 -0
  871. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  872. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_smoke_blockers.py +0 -0
  873. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  874. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_smoke_reentry.py +0 -0
  875. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  876. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  877. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  878. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_state.py +0 -0
  879. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  880. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  881. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  882. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  883. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  884. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v22_e2e.py +0 -0
  885. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v22_principles.py +0 -0
  886. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  887. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v45_reconcile.py +0 -0
  888. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v45_sched.py +0 -0
  889. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_v45_schedharden.py +0 -0
  890. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_wave_runner.py +0 -0
  891. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_work_unit_observability.py +0 -0
  892. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_work_unit_runner.py +0 -0
  893. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_work_unit_state.py +0 -0
  894. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_loop_worktrees.py +0 -0
  895. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  896. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_state_disagreement_312.py +0 -0
  897. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_phase_worktree_executor.py +0 -0
  898. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  899. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  900. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  901. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_flag.py +0 -0
  902. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_markers.py +0 -0
  903. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  904. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  905. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  906. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  907. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  908. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pkg_layout_freeze.py +0 -0
  909. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_plan_ir_iter_waves.py +0 -0
  910. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_plan_manifest_append_order_1174.py +0 -0
  911. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r2_F001.py +0 -0
  912. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r2_F002.py +0 -0
  913. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r2_F003.py +0 -0
  914. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r2_F004.py +0 -0
  915. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r4_F001.py +0 -0
  916. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r4_F002.py +0 -0
  917. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r4_F003.py +0 -0
  918. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r5_F001.py +0 -0
  919. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r6_F001.py +0 -0
  920. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r7_F001.py +0 -0
  921. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr1161_r9_F002.py +0 -0
  922. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pr_readback_789.py +0 -0
  923. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_preflight_verification.py +0 -0
  924. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_president_heartbeat_1001.py +0 -0
  925. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_president_ladder_config.py +0 -0
  926. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_president_wiring.py +0 -0
  927. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_presroute_cli.py +0 -0
  928. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_presroute_hardening.py +0 -0
  929. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_presroute_landed.py +0 -0
  930. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_proc_cpu.py +0 -0
  931. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_proofgate_attestation_workflow.py +0 -0
  932. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_proofgate_cleanup.py +0 -0
  933. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_proofgate_isolation.py +0 -0
  934. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_proofgate_receipts.py +0 -0
  935. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_prune_merged_worktrees_script.py +0 -0
  936. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_public_installer.py +0 -0
  937. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_publishing.py +0 -0
  938. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_pushflow.py +0 -0
  939. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_qualify_network_owner.py +0 -0
  940. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_ratification_policy.py +0 -0
  941. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  942. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reconcile_portability_85c.py +0 -0
  943. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reconcile_tracked_closeout_recovery_90.py +0 -0
  944. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reconcile_verification_log.py +0 -0
  945. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reconcile_visual_avatar_evidence_91.py +0 -0
  946. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_redaction_channel_control_isolation.py +0 -0
  947. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_redaction_main_coverage_cases.py +0 -0
  948. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_reflection_sync.py +0 -0
  949. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_release_dispatch_operator_approval_145.py +0 -0
  950. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_release_pin_autotrack.py +0 -0
  951. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_repo_validation.py +0 -0
  952. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_leg_sandbox.py +0 -0
  953. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_monitor_policy.py +0 -0
  954. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_policy_govlean_repairs.py +0 -0
  955. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_seat_stall_1176.py +0 -0
  956. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_stage_binding.py +0 -0
  957. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_stage_board_findings.py +0 -0
  958. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_staged_tree_authorization.py +0 -0
  959. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_review_summary.py +0 -0
  960. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_roadmap_authority.py +0 -0
  961. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_roadmap_ownership.py +0 -0
  962. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_roadmap_representation_consistency.py +0 -0
  963. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_route_log.py +0 -0
  964. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_route_policy_conformance.py +0 -0
  965. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_routing_invariants.py +0 -0
  966. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_runner_visual_evidence_authoritative_91.py +0 -0
  967. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_runtime_adapter_output_720.py +0 -0
  968. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_runtime_event_log_hardening_720.py +0 -0
  969. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_runtime_procfs_identity_870.py +0 -0
  970. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_runtime_state_mirror_agreement.py +0 -0
  971. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_clone.py +0 -0
  972. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_egress.py +0 -0
  973. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_placement.py +0 -0
  974. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_policy.py +0 -0
  975. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_preamble.py +0 -0
  976. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_retention.py +0 -0
  977. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sandbox_staging_1147.py +0 -0
  978. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_scratch_runtime_audit_1147.py +0 -0
  979. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_seat_host_uid_1098.py +0 -0
  980. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_self_asserted_passed_without_evidence_is_gated.py +0 -0
  981. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sibling_matcher_patterns.py +0 -0
  982. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skill_bundle_pinned.py +0 -0
  983. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skill_install_body_expansion.py +0 -0
  984. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skill_liveness_contract.py +0 -0
  985. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skill_plan_manifest_write.py +0 -0
  986. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skill_sources_seam.py +0 -0
  987. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skills_bundle_drift.py +0 -0
  988. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skills_canon_parity.py +0 -0
  989. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_skills_src_claude_literal_lint.py +0 -0
  990. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_spec_conformance_gate.py +0 -0
  991. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_specpkgmin_wheel.py +0 -0
  992. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_stale_roadmap_dispatch_guard.py +0 -0
  993. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_status_read_only_62.py +0 -0
  994. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_subscription_scrub_xai_864.py +0 -0
  995. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_suite_interpreter_satisfies_requires_python.py +0 -0
  996. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sweep_fleet_worktrees_script.py +0 -0
  997. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_sync_skills_apply_failloud.py +0 -0
  998. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_task_message_broker.py +0 -0
  999. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_task_message_broker_cli.py +0 -0
  1000. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_task_message_resolver.py +0 -0
  1001. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_tdd_chronology.py +0 -0
  1002. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_the_real_launch_carries_the_prefix.py +0 -0
  1003. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_authority_import_811.py +0 -0
  1004. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_e2e.py +0 -0
  1005. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_invariants.py +0 -0
  1006. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_merge.py +0 -0
  1007. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_order_only_deps_47.py +0 -0
  1008. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_prebuilt.py +0 -0
  1009. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_review_authorization.py +0 -0
  1010. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_review_monitoring_policy.py +0 -0
  1011. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_review_packet.py +0 -0
  1012. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_roadmap.py +0 -0
  1013. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_train_runner.py +0 -0
  1014. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_unattended_release.py +0 -0
  1015. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  1016. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  1017. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_validate_plan_doc_fail_closed.py +0 -0
  1018. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_validate_plan_doc_goal_coverage.py +0 -0
  1019. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_validate_plan_doc_producer_dependency.py +0 -0
  1020. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_validate_plan_doc_proofgate.py +0 -0
  1021. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verification_dotdot_execution_428.py +0 -0
  1022. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verification_evidence.py +0 -0
  1023. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verification_evidence_validator.py +0 -0
  1024. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verification_interpreter_guard_221.py +0 -0
  1025. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verification_venv_identity_428.py +0 -0
  1026. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_verify_qualified_agy_route_core.py +0 -0
  1027. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_visual_avatar_evidence_validator.py +0 -0
  1028. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_visual_evidence_validator.py +0 -0
  1029. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_workerpool_failure_isolation.py +0 -0
  1030. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_workerpool_parallel.py +0 -0
  1031. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_workerpool_worktree_alloc.py +0 -0
  1032. {phase_loop_runtime-0.7.23 → phase_loop_runtime-0.7.24}/tests/test_worktree_index.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phase-loop-runtime
3
- Version: 0.7.23
3
+ Version: 0.7.24
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
@@ -50,7 +50,7 @@ To install just this runtime package directly:
50
50
 
51
51
  ```sh
52
52
  pip install phase-loop-runtime # latest compatible release
53
- pip install phase-loop-runtime==0.7.23 # …or pin an exact version
53
+ pip install phase-loop-runtime==0.7.24 # …or pin an exact version
54
54
  ```
55
55
 
56
56
  To pin a specific tag from source instead, substitute a tag from
@@ -19,7 +19,7 @@ To install just this runtime package directly:
19
19
 
20
20
  ```sh
21
21
  pip install phase-loop-runtime # latest compatible release
22
- pip install phase-loop-runtime==0.7.23 # …or pin an exact version
22
+ pip install phase-loop-runtime==0.7.24 # …or pin an exact version
23
23
  ```
24
24
 
25
25
  To pin a specific tag from source instead, substitute a tag from
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
7
- version = "0.7.23"
7
+ version = "0.7.24"
8
8
  description = "Harness-neutral phase-loop orchestration runtime and CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -156,6 +156,7 @@ phase_loop_runtime = [
156
156
  markers = [
157
157
  "dotfiles_integration: test requires a dotfiles fleet tree (skipped standalone)",
158
158
  "quarantine(reason): known flake tracked by an OPEN issue; deselected on pull-request CI only (agent-harness#1029)",
159
+ "host_seat_credentials: live jailed-seat test that reads the host's Claude login and seat-jail state (agent-harness#1132)",
159
160
  ]
160
161
 
161
162
  [tool.setuptools.data-files]
@@ -18,4 +18,4 @@ __all__ = [
18
18
  "state_ops",
19
19
  ]
20
20
 
21
- __version__ = "0.7.23"
21
+ __version__ = "0.7.24"
@@ -563,6 +563,15 @@ only in a private 0600 per-leg file under the run's stream dir (`leg-logs/`, 070
563
563
  reasons or the board summary. Its name carries only closed fields:
564
564
  `leg-logs/<registry harness | leg>-<24 hex>.log`.
565
565
 
566
+ **Seat-jail codes (agent-harness#1132, F030).** Every seat-jail notice code is an exact
567
+ literal of `_HARNESS_DETAIL_CODES`: `seat_sandbox_unavailable_{host,seat_uid,tiocsti}`,
568
+ `seat_sandbox_not_staged`, each `seat_sandbox_refused:<sub>` as its own literal
569
+ (`jail_build`, `namespace`, `identity`, `preseed`, `token_file_unsafe`,
570
+ `gemini_credential_unsafe`, `stage_not_private`, `stage_changed`, `output_unsafe`),
571
+ `seat_sandbox_retained_after_teardown`, and the `claude_seat_*` / `gemini_seat_*` codes. No
572
+ regex template admits a seat code, and there is no parallel vocabulary: `seat_jail.NOTICES`
573
+ only renders each code's literal what/why/fix, and a test holds the two sets equal.
574
+
566
575
  **Threat model.** I3 defends against untrusted TEXT: CLI stdout/stderr, leg bodies, exception messages and PTY output. None of it can choose or enter `detail`. In-process Python code is trusted runtime code and is out of scope: it can do anything (for example `object.__setattr__` on arbitrary objects, or replacing this module's functions). The exact-type checks (`PanelLegResult` refuses any subclass instance; only an exact `_HarnessCode` / `_LegFailure` has provenance; contents are read with `str.__str__` and re-created as a fresh `_HarnessCode`) close the cheap structural bypasses, but they are not a sandbox against hostile in-process code.
567
576
 
568
577
  ## ABDMODE — Purpose-derived default mode + advisory prompt hygiene · `panel_invoker.py` (#107)
@@ -889,8 +898,9 @@ set `gemini_heartbeat.QUALIFIED_IMAGES`: 1.2.11 SHA256
889
898
  `ec7cf797ecb0e1d91ddf3b6d9d6c1d616bb89f78a5b0e43536b72a7fce695f56`, 1.2.12 SHA256
890
899
  `ce6fdd9e7621ee9ac6eedaa337731ca1f235e412ff57cf9eabcd2aa23b3576ca`, 1.2.14 SHA256
891
900
  `0d0d3eba22daf29504dd290151c7ed9a4d33b0c6aa0acfc5da27bc3b01d2f029`, 1.2.15 SHA256
892
- `5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164` or 1.2.16 SHA256
893
- `a759ce7c7a235d9b6c281a25ead97cbbf2e92314a3ffd224e2f9144f3fae7a86`. Each member
901
+ `5f9c16b286895f8f7fdecd423883ca256a85077b8acf9a6bc1111761d34df164`, 1.2.16 SHA256
902
+ `a759ce7c7a235d9b6c281a25ead97cbbf2e92314a3ffd224e2f9144f3fae7a86` or 1.2.17 SHA256
903
+ `c54ef90651a8646ae67334d39212c81f5946feec373ad6aa335f9ef401662bc5`. Each member
894
904
  carries its measured help digest and has its own qualification record; the
895
905
  evidence catalog and the runtime set must name exactly the same members.
896
906
  The running Python/kernel must support sealed memfds, pidfds and pidfd signaling;
@@ -1043,6 +1053,281 @@ A non-release `agy` image is admitted only by verifying it, never by trusting it
1043
1053
  created PR back (the PR body's copy is display-only). "Up to date" requires that local record, `headRefOid` and `ls-remote` to
1044
1054
  agree. It refuses when it cannot prove its open-PR listing complete.
1045
1055
 
1056
+ ## SEATJAIL — Full-permission review seats inside a per-seat jail (agent-harness#1132)
1057
+
1058
+ Plan: `plans/detailed-seat-sandbox-permissions-1132-20260928.md`. Maintainer decisions D1-D8
1059
+ are recorded on agent-harness#1132.
1060
+
1061
+ - **Route (J7).** A production brokered Claude or Gemini leg decides its route once, after
1062
+ the public-entry authorization and before staging, in this order; the first failure wins
1063
+ and yields exactly one code: (0) no staged tree -> `seat_sandbox_not_staged`; (1) a
1064
+ recorded Gemini P4/P3 stop -> its code (today `gemini_seat_egress_unconfined`: the agy
1065
+ token carries `cloud-platform`, and the "prove then enable" containment probe found jail
1066
+ egress not limited to agy's inference hosts; P3 was not run and the tooled profile is not
1067
+ built); (2) host capability -> `seat_sandbox_unavailable_host`,
1068
+ `_tiocsti`, or `_seat_uid`; (3) credential presence -> `claude_seat_token_missing` /
1069
+ `gemini_seat_credential_missing`; (4) Gemini tooled qualification ->
1070
+ `gemini_seat_profile_unqualified`. Steps 0-4 send the seat to the sealed inline route,
1071
+ byte-identical to before, with that notice, except a Claude seat's step 3, which is not
1072
+ run (plan amendment A3b, below). Codex and grok are not jailed
1073
+ (agent-harness#895) and carry `seat_filesystem_unconfined` when given a tree.
1074
+ - **No sealed fallback for a jail-eligible seat (plan amendment A3b).** A Claude seat that
1075
+ would take the jailed route but cannot (no credential, a failed first-use qualification,
1076
+ a login not renewed within the wait, an unqualified or unsafe gate, an unsafe override)
1077
+ is DEGRADED and NOT RUN, typed, with a fix. It is never a toolless substitute.
1078
+ `seat_jail.JAIL_NOT_RUN_CODES` names the route codes this applies to; none of them is in
1079
+ `SEALED_FALLBACK_CODES`. The sealed route stays for hosts without the jail prerequisites,
1080
+ an unstaged review and the Gemini seat (agent-harness#1244).
1081
+ - **The jailed route is Claude-only.** `JAILED_LEGS` is exactly `{"claude"}`. A Gemini
1082
+ seat always takes the sealed route with its typed notice, whatever its credential,
1083
+ qualification or recorded stop; a tooled Gemini seat is agent-harness#1170.
1084
+ - **EC-EXECFIND-2 gate.** A jailed route whose jail profile digest has no EC-EXECFIND-2
1085
+ falsifier pass recorded on THIS host is REFUSED before any effect with
1086
+ `seat_sandbox_refused:jail_unqualified`. The notice names the per-host qualification as
1087
+ the fix.
1088
+ - **Where passes live:** per user and per host, at
1089
+ `$XDG_STATE_HOME/phase-loop/seat-jail-passes/<digest>.json`. A record qualifies only if it
1090
+ binds all of:
1091
+ - the digest;
1092
+ - this host (sha256 of `/etc/machine-id`);
1093
+ - the EC-EXECFIND-2 falsifier-run layout: `seat_jail.falsifier_layout_identity()`, a
1094
+ digest of the EXECFIND staging and run code, so a change to either invalidates every
1095
+ pass;
1096
+ - the run's evidence file, which the gate re-hashes and which must name the same values.
1097
+
1098
+ The record and the evidence must be regular, operator-owned files that are not group- or
1099
+ other-writable and are not links. They are read non-blocking with size caps.
1100
+ - **The directory chain:** every directory up to the state home must be operator-owned,
1101
+ must not be a link, and must not be other-writable. It may be group-writable only when
1102
+ its group is the operator's user-private group, which is the umask-002 default. That
1103
+ means all of the following hold:
1104
+ - it is the operator's primary gid;
1105
+ - the group is named after the operator;
1106
+ - it lists no other member;
1107
+ - no other account has it as its primary group.
1108
+
1109
+ Any other chain is refused with `seat_sandbox_refused:pass_store_unsafe`, whose notice
1110
+ names the chmod. The recorder applies the same rule and never re-permissions an
1111
+ existing directory.
1112
+ - **One fail-closed boundary:** the whole evaluation is inside a single
1113
+ `except Exception`. Any error is the typed refusal `jail_unqualified`, and no provider
1114
+ is launched. The route detail stays the closed code. The verdict's typed reason
1115
+ (`no_record`, `binding_mismatch`, `evidence_mismatch`, `store_unsafe:...` or
1116
+ `error:<ExceptionClass>`) is logged, and is carried in the launch refusal's message.
1117
+ - **Checked at launch:** qualification is re-checked against the jail actually built.
1118
+ - **Threat model:** the operator's own account can forge a record, and is trusted to. The
1119
+ store defends against the seat uid, stale records, other hosts and accidental reuse.
1120
+ - **Why per host:** the digest binds the host's layout (maintainer decision, option A).
1121
+ A shipped host-independent policy digest plus a first-use self-check is
1122
+ agent-harness#1186.
1123
+ - **Recording a pass:** `phase-loop seat-sandbox qualify` runs EC-EXECFIND-2's jail
1124
+ falsifiers (`seat_jail_qualification`) against a real falsifier run, using the EXECFIND
1125
+ staging, the dependency snapshot and the bounded bwrap runner:
1126
+ - the run holds a nonce sentinel in every protected directory, a sentinel process, and
1127
+ TCP, UDP, pathname Unix and abstract Unix listeners;
1128
+ - concurrently, a probe program running as the seat in the production jail tries to
1129
+ create entries, change sentinels, signal and connect, through the host paths and
1130
+ through anything it resolves by device and inode;
1131
+ - the parent judges the result: sentinels intact, no events, single-link protected
1132
+ files, no seat mount or descriptor resolving to a protected object or an ancestor, and
1133
+ the run `green_on_head`.
1134
+
1135
+ Only a pass is recorded.
1136
+ - **`seat_sandbox_refused:identity`** remains the code for a jail that is not the
1137
+ qualified profile at launch, or a failed identity probe.
1138
+ - **Jail profile (`seat_jail_v1`).** bwrap, no `--unshare-user` and no `--unshare-net`:
1139
+ read-only `/usr` (merged-`/usr` links recreated), an `/etc` subset, the provider image at
1140
+ `/seat/bin/<leg>`, the bundle and instructions as sealed memfds at `/seat/review/`, the
1141
+ staged clone read-write at `/seat/tree`, fresh `/seat/home` and `/seat/out`, tmpfs `/tmp`
1142
+ and `/dev/shm`, `--remount-ro /`, `--clearenv` plus a declared environment (the seat's
1143
+ `TMPDIR` and `CLAUDE_CODE_TMPDIR` are `/seat/home/.tmp`, on the disk-backed staging root,
1144
+ never the tmpfs `/tmp`; agent-harness#1147), and the J14
1145
+ seccomp filter (architecture kill, x32 EPERM, nested user/mount namespaces, `setns`,
1146
+ `clone3` ENOSYS, key syscalls, AF_ALG sockets, TIOCSTI/TIOCLINUX). The profile digest
1147
+ covers the mount set, the flags and the filter digest.
1148
+ - **Seat uid (D8).** The seat runs as a subordinate uid leased from the operator's
1149
+ `/etc/subuid` range, inside an egress holder namespace mapped by `newuidmap`/`newgidmap`
1150
+ (in it, uid 0 is the operator). Launch order: fresh session keyring, `nsenter` into H,
1151
+ the private-inode hand-off (`seat_sandbox_refused:stage_not_private` on any hard link),
1152
+ bwrap with `--cap-drop ALL` then exactly `CAP_SETUID`, `CAP_SETGID`, `CAP_SETPCAP` (P5:
1153
+ bwrap as namespace root otherwise keeps every capability), then `setpriv` to the seat
1154
+ uid with every capability set, the bounding set included, emptied and no-new-privs set,
1155
+ then `env --chdir=/seat/tree` as the seat. `/seat`, `/seat/bin`, `/seat/review` and
1156
+ `/etc` are created 0755 and the tmpfs mounts 1777, so the seat uid can traverse and use
1157
+ them (P5, P1).
1158
+ The host prerequisite (`apt install uidmap`, `usermod --add-subuids/--add-subgids`) is a
1159
+ one-time root step by the maintainer, never run by the runtime.
1160
+ - **Credential channels (plan amendment A1).** The Claude credential is resolved afresh at
1161
+ each jailed launch, in this order:
1162
+ 1. The seat-token override, the record `$XDG_STATE_HOME/phase-loop/seat-credentials/
1163
+ claude.override.json` (owner-only, in a 0700 directory, owned by the euid). It is
1164
+ written only by `phase-loop seat-sandbox store-token` and used only when it is bound to
1165
+ the account and organization the launching session is logged in to (plan amendment A4,
1166
+ below). A hand-placed raw `seat-credentials/claude` file is never used.
1167
+ 2. Otherwise, the current Claude login's `claudeAiOauth.accessToken` only, never its
1168
+ refresh token. It comes from the CLI's own store: `$CLAUDE_CONFIG_DIR/.credentials.json`
1169
+ or `~/.claude/.credentials.json`, and the login Keychain on macOS.
1170
+
1171
+ - **The login token's margin:** it must have the seat's hard deadline (its explicit
1172
+ per-leg timeout, else the 1800 s backstop) or `PHASE_LOOP_SEAT_LOGIN_TOKEN_MARGIN_S`
1173
+ left. One function (`_claude_seat_login_margin_s`) gives this margin to the pre-launch
1174
+ seat mode, the wait and the launch.
1175
+ - **A short login (plan amendment A3):** the harness never runs the Claude CLI to renew a
1176
+ credential. The mode line carries `claude_seat_login_token_awaiting_refresh` with the
1177
+ minutes left. Before staging, and before any seat id or namespace is held, the seat
1178
+ waits: `seat_credentials.await_login_margin` reads the store read-only every
1179
+ `PHASE_LOOP_SEAT_LOGIN_REFRESH_POLL_S` (30 s), for up to
1180
+ `PHASE_LOOP_SEAT_LOGIN_REFRESH_WAIT_S` (900 s; 0 means no wait).
1181
+ - **Renewed:** the seat runs jailed (logged `jailed (login refreshed)`), re-reading the
1182
+ token at launch.
1183
+ - **Not renewed in time:** the seat is DEGRADED and NOT RUN with
1184
+ `claude_seat_login_token_expiring`. A store that stops yielding a login ends it with
1185
+ `claude_seat_token_missing`. Nothing is launched (plan amendment A3b).
1186
+ - **Monitoring:** under `heartbeat_only` the wait is recorded as `login_wait` in the
1187
+ monitoring record, not as a stall, and the stall clock starts after it. Under a
1188
+ bounded policy it is charged to the leg's deadline. The monitor's cancel event and the
1189
+ quiescence latch end it.
1190
+ - **Delivery:** either credential is delivered only through one drained pipe named by
1191
+ `CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR`. No credential is in any argv, environment
1192
+ value, evidence or log.
1193
+ - **The output scan:** seat output is scanned for the credential's bytes and its
1194
+ standard, URL-safe and hex encodings (`claude_seat_token_in_output`).
1195
+ - **The residual:** a seat can use the credential for its remaining lifetime. That is
1196
+ hours for a login access token. The response is to log out and back in; the token also
1197
+ expires on its own.
1198
+ - **Gemini:** the D7 access-token-only copy (builder only; the tooled Gemini route is gated
1199
+ on P4 then P3).
1200
+ - **Credential outcomes by source.** For the override: `claude_seat_token_rate_limited` and
1201
+ `claude_seat_token_rejected`. For the login: `claude_seat_login_rate_limited` and
1202
+ `claude_seat_login_rejected`. A login token at or past its launch-time expiry fails as
1203
+ `claude_seat_login_token_expired`, in both the detail and the notice, and is safe to
1204
+ relaunch. None of these is a `seat_sandbox_refused:*` code. On both the sealed and the
1205
+ jailed route, an authentication failure in the PTY tail takes priority over the generic
1206
+ journaled give-up (`claude_seat_provider_api_error`), so a credential outcome is never
1207
+ hidden behind it; every typed give-up (limits, output budget, rejected transcript) keeps
1208
+ its priority.
1209
+ - **First-use qualification (plan amendment A2; folds in agent-harness#1186 option C).** A
1210
+ jailed route with no recorded pass for this host, digest and layout runs the host's jail
1211
+ qualification once, before launch. It is serialized by an exclusive lock in the per-user
1212
+ state directory, and on a pass it records the pass.
1213
+ - **On a pass:** the seat stays jailed, and its mode reports `qualified_now`.
1214
+ - **On a failure, or a run that cannot happen (a cached failure included):** the seat is
1215
+ DEGRADED and NOT RUN with `seat_jail_qualification_failed` and a typed reason
1216
+ (`prerequisite_missing`, `store_unsafe`, `falsifiers_failed`, `timeout` or `error`),
1217
+ each with a literal fix (plan amendment A3b supersedes A2's sealed fallback).
1218
+ - **The failure cache:** failures are cached per host, digest and layout for
1219
+ `PHASE_LOOP_SEAT_JAIL_QUALIFY_RETRY_S` (default 3600 s). A lock timeout is not cached.
1220
+ - **The launch-time re-check** against the built jail still refuses an unrecorded digest.
1221
+ - **Seat modes (plan amendment A1).** Before any seat launches, every board publishes one
1222
+ mode per seat: `jailed`, `unconfined`, `sealed`, `degraded` or `native`. Each mode carries
1223
+ its notice code, reason and fix, and the modes are delivered through `on_seat_modes`, the
1224
+ log and `seat-modes.json`. The `advisor-board` CLI prints them to stderr and carries them as
1225
+ `seat_modes` in `--json`.
1226
+ - **Launch helpers.** The pre-jail and in-namespace helpers (`seat_keyring_exec`, the
1227
+ `seat_uid` handoff and its in-namespace verbs) run from the installation the parent
1228
+ imported: `python -I` with this package's root put first on the import path
1229
+ (`seat_uid.trusted_module_argv`), never `python -m`, whatever the launch's working
1230
+ directory is. An inventory test fails on any `sys.executable -m` launch of a package
1231
+ module.
1232
+ - **Scratch decision (agent-harness#1147).** A jailed launch's helper chain gets one env
1233
+ from `child_scratch_env` (`_jail_launch_env`), and that same object is handed to the
1234
+ identity probe and the launch. The seat never sees it: bwrap clears the environment and
1235
+ sets the seat's own.
1236
+ - **The override follows the launching session (plan amendment A4).** A seat's credential
1237
+ follows the subscription of the session that launched the leg.
1238
+ - **Storing:** `phase-loop seat-sandbox store-token` reads the override with no echo, or
1239
+ from stdin. A terminal that cannot hide the input is refused. The token and its account
1240
+ are stored as ONE record, `seat-credentials/claude.override.json`
1241
+ (`{"schema": "seat_credential_override.v1", "account": ..., "token": ...}`).
1242
+ - **The account** is the current login's `oauthAccount.accountUuid`, from
1243
+ `$CLAUDE_CONFIG_DIR/.claude.json` or `~/.claude.json`, read without running the CLI.
1244
+ - **Refused** with no login. An unsafe account file is named in the refusal.
1245
+ - **The write:** it goes relative to the held directory descriptors (each directory
1246
+ component opened without following links and checked on the descriptor), as a new
1247
+ 0600 file under a random name renamed into place. A store is therefore atomic, and
1248
+ concurrent stores leave one complete record.
1249
+ - **At launch:** the record is read once, without following a link and without blocking.
1250
+ - **Used:** only when its account equals the launching session's account, and the
1251
+ launch uses exactly the token bytes whose account was checked.
1252
+ - **Not used:** when the accounts differ, when either is unknown, when the record is
1253
+ malformed, or when only a hand-placed raw `seat-credentials/claude` exists. The seat
1254
+ then uses the login and carries the notice `claude_seat_override_other_subscription`,
1255
+ also on its mode line, beside any login notice. That notice is not a jail refusal.
1256
+ - **Unsafe:** a record that is not a private regular file the euid owns refuses the
1257
+ launch (`seat_sandbox_refused:token_file_unsafe`).
1258
+ - **When the seat does not run:** a refusal (no login, a login short of the margin, a wait
1259
+ that ended short) carries `claude_seat_override_other_subscription` beside its one
1260
+ refusal code whenever a stored override was ignored. The seat's notices, the A3b
1261
+ DEGRADED result and the mode line all carry it.
1262
+ - **Per harness:** the rule lives once, in `override_decision(adapter)`. Each harness's
1263
+ `SeatCredentialAdapter` answers `override_present()`, `read_override()` (the record,
1264
+ read once) and `current_account()`, and declares its credential `sources` in precedence
1265
+ order; an adapter without the override source never uses one. Claude is the only
1266
+ adapter today, and `store-token` stores Claude's override.
1267
+ - **One slot per user:** the override lives under the Unix user's `$XDG_STATE_HOME`, so
1268
+ there is one per user, not one per config directory or account. A store from another
1269
+ account replaces it, and sessions on the earlier account then use their login, with
1270
+ the notice.
1271
+ - **Independent reads:** the mode line, the A3 wait and the launch each read the decision
1272
+ afresh. A `/login` between them can change the outcome. Every such change falls toward
1273
+ the login, never toward an unbound override.
1274
+ - **macOS:** the CLI keeps the login in the Keychain service named from
1275
+ `CLAUDE_SECURESTORAGE_CONFIG_DIR` when that is set, and the account in
1276
+ `CLAUDE_CONFIG_DIR/.claude.json`. With only the former set, the account and the login
1277
+ can describe different identities. Set both, or neither.
1278
+ - **Organization (maintainer ruling 2026-10-05):** the record (schema
1279
+ `seat_credential_override.v2`) binds both `oauthAccount.accountUuid` and
1280
+ `oauthAccount.organizationUuid`, read from the same `.claude.json`.
1281
+ - **At launch:** the override applies only when both are known and both equal the
1282
+ session's. A v1 or organization-less record is unbound.
1283
+ - **Storing:** `store-token` refuses when the organization is unknown.
1284
+ - **Permissions:** the record must be owner-only: any group or other bit refuses with
1285
+ `token_file_unsafe`. The store opens every directory component, the state root
1286
+ included, without following links; a linked state root is refused, naming the directory
1287
+ to set `XDG_STATE_HOME` to.
1288
+ - **Refusals after resolution:** a refusal raised after the credential is resolved (the
1289
+ jail build, the pre-seed, the namespace) also carries the ignored-override notice beside
1290
+ its one refusal code.
1291
+ - **Modes without the notice:** sealed, unconfined and native Claude modes carry no
1292
+ override notice, by design: the override is never their credential.
1293
+ - **Status:** `phase-loop seat-sandbox token-status` shows the bound account and
1294
+ organization, this session's, and whether the override applies. It exits 0 only when
1295
+ the override applies, and never shows the token.
1296
+ - **Seat-token rotation.** The override record is read at each jailed launch and never
1297
+ cached across legs or rounds.
1298
+ - **Rotating:** `phase-loop seat-sandbox store-token` is the only way to rotate it. It
1299
+ replaces the record with one rename, and the next launch uses the new token; a running
1300
+ leg keeps the token it was launched with.
1301
+ - **By hand:** a token file replaced by hand is ignored.
1302
+ The token is per-launch input only: neither the jail profile digest nor an EC-EXECFIND-2
1303
+ pass binds it, so replacing it trips no qualification check.
1304
+ - **A rate-limited seat token is not a jail fault.** When the provider refuses the seat
1305
+ token's subscription for a rate or usage limit (the shared leg-failure classifier's
1306
+ `usage_limit` class, with the provider's reset time when it gives one), the leg ends with
1307
+ that detail and the notice `claude_seat_token_rate_limited`: rotate or replace the seat
1308
+ token, or wait for the reset. It is never a `seat_sandbox_refused:*` code. A token the provider
1309
+ rejects (the classifier's `auth_failure`, measured in P2) carries
1310
+ `claude_seat_token_rejected`.
1311
+ - **Pointer-brief preflight.** On a `--pointer-brief` board, a seat whose launch takes the
1312
+ jailed route (the same J7 decision and EC-EXECFIND-2 gate the launch applies) has file
1313
+ access to the staged tree, so it is source-grounded and never marked
1314
+ `seat_pointer_brief_unreadable`. A jail that would be refused is not counted as one.
1315
+ - **Pointer mode.** A jailed seat gets a pointer brief: jail-path preamble, the
1316
+ AUTHORITATIVE INSTRUCTIONS inline, and POINTER frames naming the bundle (path, sha256,
1317
+ size) and the tree (path, source commit, approved digest). Evidence records
1318
+ `provider_input_mode: "pointer"`, `provider_input_inline: false`,
1319
+ `sandbox_filesystem_confined: true` and the jail profile id and digests;
1320
+ `verify_harden_evidence.py` reports EC-HARDEN-5 UNMET (accepted residual
1321
+ agent-harness#361, D3) on every such record.
1322
+ - **Notices.** `{code, seat_key, what, why, fix}`, rendered only from literals, on the
1323
+ `advisor-board` payload (`notices`, `legs[].notices`) and text summary, and on the
1324
+ governed path as one non-gating `seat_notice` finding per notice (L4b).
1325
+ - **Retention.** A failed in-namespace teardown keeps the seat directories under the leg's
1326
+ operator-owned 0700 scratch dir, adds `seat_sandbox_retained_after_teardown`, and records
1327
+ the path. `phase-loop seat-sandbox reap PATH` accepts only a recorded path under the
1328
+ stage root, opened `O_NOFOLLOW|O_DIRECTORY` component by component, and owned by a
1329
+ subordinate uid.
1330
+
1046
1331
  ## ABDFALSIFY — Executable review findings (IF-0-EXECFIND-1)
1047
1332
 
1048
1333
  An optional `falsifier` attachment names one `FindingFalsifier` with
@@ -1038,6 +1038,19 @@ def build_parser() -> argparse.ArgumentParser:
1038
1038
  metavar="PATH",
1039
1039
  help="Load the BOM from a fixture JSON instead of live registries (CI/test wiring).",
1040
1040
  )
1041
+ # seat-sandbox reap (agent-harness#1132, F022): remove a jailed seat's directory that
1042
+ # teardown retained. Only a path recorded by a retention notice is accepted.
1043
+ seat_sandbox_sub = subparsers.add_parser(
1044
+ "seat-sandbox",
1045
+ help=("Jailed review-seat maintenance: `qualify` runs the EC-EXECFIND-2 jail "
1046
+ "falsifiers on this host and records its pass; `reap PATH` removes a retained "
1047
+ "seat directory; `store-token` stores a Claude seat-token override (read with no "
1048
+ "echo, or from stdin) bound to the account you are logged in to now; "
1049
+ "`token-status` shows that binding (never the token)."),
1050
+ )
1051
+ seat_sandbox_sub.add_argument("seat_sandbox_action",
1052
+ choices=("qualify", "reap", "store-token", "token-status"))
1053
+ seat_sandbox_sub.add_argument("seat_sandbox_path", metavar="PATH", nargs="?")
1041
1054
  # train-status: non-mutating inspection of the cross-repo train ledger (#45).
1042
1055
  # Reads the SAME default ledger path as run-train; opens no PRs, writes nothing.
1043
1056
  train_status_sub = subparsers.add_parser(
@@ -1543,6 +1556,8 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
1543
1556
  return _task_message_broker_serve_command(args=args)
1544
1557
  if command == "advisor-board":
1545
1558
  return _advisor_board_command(args=args)
1559
+ if command == "seat-sandbox":
1560
+ return _seat_sandbox_command(args=args)
1546
1561
  if command == "docs-audit":
1547
1562
  from . import docs_audit
1548
1563
 
@@ -2319,6 +2334,14 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2319
2334
  elif getattr(args, "native_president", None) is not None:
2320
2335
  print("advisor-board: --native-president requires --landing-tier", file=sys.stderr)
2321
2336
  return 2
2337
+ # agent-harness#1132 (plan amendment A1): every seat's launch mode, printed before any
2338
+ # seat launches and carried into the JSON payload.
2339
+ seat_modes: list = []
2340
+
2341
+ def _on_seat_modes(modes) -> None:
2342
+ seat_modes.extend(modes)
2343
+ _print_seat_modes(modes)
2344
+
2322
2345
  try:
2323
2346
  with tempfile.TemporaryDirectory(prefix="advisor-board-") as scratch:
2324
2347
  invoke_kwargs: dict[str, object] = {
@@ -2328,6 +2351,7 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2328
2351
  **({"brief_ref": advisory_brief_ref} if advisory else {}),
2329
2352
  "agy_canary_capture": capture,
2330
2353
  **({"monitoring_policy": monitoring_policy} if monitoring_policy != "bounded" else {}),
2354
+ "on_seat_modes": _on_seat_modes,
2331
2355
  }
2332
2356
  if pointer_brief:
2333
2357
  # agent-harness#1204: the preflight's notices are printed BEFORE any launch.
@@ -2436,6 +2460,11 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2436
2460
  "requested_seats": requested_seats,
2437
2461
  "delivered_seats": usable_count,
2438
2462
  "shortfall": shortfall,
2463
+ # agent-harness#1132: typed seat notices, board-wide and per leg.
2464
+ "notices": _board_notices_json(result.legs),
2465
+ # agent-harness#1132 (plan amendment A1): each seat's launch mode, decided before
2466
+ # any seat launched.
2467
+ "seat_modes": [mode.as_json() for mode in seat_modes],
2439
2468
  "independence": {
2440
2469
  "level": independence.level,
2441
2470
  # The sealed evidence floor derives these from concrete leg
@@ -2456,6 +2485,7 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2456
2485
  # ABDNATIVE (#183): a deferred claude seat carries the
2457
2486
  # typed native-fill request the harness must run; None otherwise.
2458
2487
  "needs_native_agent": _native_agent_request_json(leg),
2488
+ "notices": [notice.as_json() for notice in leg.seat_notices],
2459
2489
  # agent-harness#1176: a heartbeat_only seat's monitoring record (progress
2460
2490
  # notice, provider terminal state); absent under the bounded policy.
2461
2491
  **({"review_monitoring": dict(leg.review_monitoring)}
@@ -2467,11 +2497,13 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2467
2497
  if pointer_brief:
2468
2498
  # agent-harness#1204: present only for a pointer-brief board, so every other
2469
2499
  # payload (and the closed capture schema) is unchanged.
2500
+ # The preflight notices join the seat notices (agent-harness#1132); neither
2501
+ # list replaces the other.
2470
2502
  payload["grounded_seats"] = grounded_count
2471
- payload["notices"] = [n.as_json() for n in result.seat_preflight_notices]
2503
+ payload["notices"] += [n.as_json() for n in result.seat_preflight_notices]
2472
2504
  for entry, leg in zip(payload["legs"], result.legs):
2473
2505
  entry["source_grounded"] = leg.source_grounded
2474
- entry["notices"] = [n.as_json() for n in leg.seat_preflight_notices]
2506
+ entry["notices"] += [n.as_json() for n in leg.seat_preflight_notices]
2475
2507
  if advisory:
2476
2508
  payload.update(_advisory_labels(review_brief, composed_board=board.name))
2477
2509
  if capture is not None:
@@ -2491,9 +2523,18 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2491
2523
  capture.close()
2492
2524
  return 2
2493
2525
  payload["agy_canary_capture"] = expected_capture
2526
+ # The private capture board has its own closed schema, which predates seat
2527
+ # notices and seat modes (agent-harness#1132); it is written without them,
2528
+ # byte-for-byte as before.
2529
+ capture_payload = {key: value for key, value in payload.items()
2530
+ if key not in ("notices", "seat_modes")}
2531
+ capture_payload["legs"] = [
2532
+ {key: value for key, value in leg.items() if key != "notices"}
2533
+ for leg in payload["legs"]
2534
+ ]
2494
2535
  try:
2495
2536
  private = write_private_board(
2496
- capture=capture, basename=private_board_name, payload=payload
2537
+ capture=capture, basename=private_board_name, payload=capture_payload
2497
2538
  )
2498
2539
  except AgyCanaryEvidenceError as exc:
2499
2540
  print(f"advisor-board: private capture sink failed: {exc}", file=sys.stderr)
@@ -2517,6 +2558,8 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2517
2558
  shown = _finalize_leg_detail(leg.detail)
2518
2559
  detail = f" — {shown}" if shown else ""
2519
2560
  print(f" [{leg.status}] {leg.seat_key}{detail}")
2561
+ for notice in leg.seat_notices:
2562
+ print(f" notice {notice.code}: {notice.what} / {notice.why} / fix: {notice.fix}")
2520
2563
  for notice in leg.seat_preflight_notices:
2521
2564
  # agent-harness#1204: once per seat, from the notice table's literals.
2522
2565
  print(f" notice {notice.code}: {notice.what} -- fix: {notice.fix}")
@@ -2572,6 +2615,109 @@ def _advisor_board_command(*, args: argparse.Namespace, _advisory_root: Path | N
2572
2615
  return exit_code
2573
2616
 
2574
2617
 
2618
+ def _seat_store_token() -> int:
2619
+ """`seat-sandbox store-token`: the token is read with no echo (or from stdin when it is
2620
+ not a terminal) and is never printed; it is stored bound to the current login's account."""
2621
+ import getpass
2622
+
2623
+ from . import seat_credentials
2624
+
2625
+ if sys.stdin.isatty():
2626
+ import warnings
2627
+
2628
+ # getpass falls back to reading with echo ON when it cannot control the terminal,
2629
+ # warning first; make that warning a refusal, raised before anything is read.
2630
+ try:
2631
+ with warnings.catch_warnings():
2632
+ warnings.simplefilter("error", getpass.GetPassWarning)
2633
+ token = getpass.getpass("Claude seat token (input hidden): ").encode("utf-8")
2634
+ except getpass.GetPassWarning:
2635
+ print("seat-sandbox store-token: refused: this terminal cannot hide the input; "
2636
+ "pipe the token on stdin instead", file=sys.stderr)
2637
+ return 1
2638
+ else:
2639
+ token = sys.stdin.buffer.read(64 * 1024)
2640
+ try:
2641
+ identity = seat_credentials.store_override(token)
2642
+ except seat_credentials.StoreRefused as exc:
2643
+ print(f"seat-sandbox store-token: refused: {exc}", file=sys.stderr)
2644
+ return 1
2645
+ except OSError as exc:
2646
+ print(f"seat-sandbox store-token: failed ({type(exc).__name__})", file=sys.stderr)
2647
+ return 1
2648
+ print(f"seat-sandbox store-token: stored, bound to account {identity.account} in "
2649
+ f"organization {identity.organization} (the login you are using now); seats use it "
2650
+ "only while you are logged in to that account and organization. "
2651
+ "`phase-loop seat-sandbox token-status` shows the binding.")
2652
+ return 0
2653
+
2654
+
2655
+ def _seat_token_status() -> int:
2656
+ """`seat-sandbox token-status`: the stored override's binding and whether it applies to
2657
+ this session. Never prints the token. Exits 0 only when the override applies."""
2658
+ from . import seat_credentials
2659
+
2660
+ status = seat_credentials.override_status()
2661
+ print(f"seat-sandbox token-status: override {status['state']}"
2662
+ f" (bound: account {status['bound_account'] or '-'},"
2663
+ f" organization {status['bound_organization'] or '-'};"
2664
+ f" this session: account {status['session_account'] or 'unknown'},"
2665
+ f" organization {status['session_organization'] or 'unknown'});"
2666
+ f" applies to this session: {'yes' if status['applies'] else 'no'}"
2667
+ + (f" [{status['notice']}]" if status['notice'] else ""))
2668
+ return 0 if status["applies"] else 1
2669
+
2670
+
2671
+ def _seat_sandbox_command(args: argparse.Namespace) -> int:
2672
+ from . import seat_uid
2673
+
2674
+ if args.seat_sandbox_action == "store-token":
2675
+ return _seat_store_token()
2676
+ if args.seat_sandbox_action == "token-status":
2677
+ return _seat_token_status()
2678
+
2679
+ if args.seat_sandbox_action == "qualify":
2680
+ from . import seat_jail_autoqualify, seat_jail_qualification
2681
+
2682
+ try:
2683
+ # The same host lock as a first-use run, so the two never race the store.
2684
+ with seat_jail_autoqualify.qualification_lock():
2685
+ return seat_jail_qualification.main([])
2686
+ except seat_jail_qualification.QualificationError as exc:
2687
+ print(f"seat-sandbox qualify: cannot run: {exc}", file=sys.stderr)
2688
+ return 1
2689
+ except TimeoutError:
2690
+ print("seat-sandbox qualify: cannot run: another qualification holds the lock",
2691
+ file=sys.stderr)
2692
+ return 1
2693
+ if not args.seat_sandbox_path:
2694
+ print("seat-sandbox reap: PATH is required", file=sys.stderr)
2695
+ return 2
2696
+
2697
+ try:
2698
+ seat_uid.reap(str(args.seat_sandbox_path))
2699
+ except seat_uid.ReapRefused as exc:
2700
+ print(f"seat-sandbox reap: refused: {exc}", file=sys.stderr)
2701
+ return 1
2702
+ except OSError as exc:
2703
+ print(f"seat-sandbox reap: failed ({type(exc).__name__}); {seat_uid.PREREQUISITE}",
2704
+ file=sys.stderr)
2705
+ return 1
2706
+ print(f"seat-sandbox reap: removed {args.seat_sandbox_path}")
2707
+ return 0
2708
+
2709
+
2710
+ def _board_notices_json(legs) -> list[dict[str, str]]:
2711
+ """Every leg's typed seat notices (agent-harness#1132), rendered from literals."""
2712
+ return [notice.as_json() for leg in legs for notice in leg.seat_notices]
2713
+
2714
+
2715
+ def _print_seat_modes(modes) -> None:
2716
+ """agent-harness#1132 (plan amendment A1): one line per seat, before any seat launches."""
2717
+ for mode in modes:
2718
+ print(f"advisor-board: seat mode: {mode.render()}", file=sys.stderr)
2719
+
2720
+
2575
2721
  def _print_seat_preflight(notices) -> None:
2576
2722
  """agent-harness#1204: the pointer-brief preflight, printed before any seat launches."""
2577
2723
  for notice in notices:
@@ -34,6 +34,9 @@ QUALIFIED_IMAGES = {
34
34
  # agy 1.2.16
35
35
  "a759ce7c7a235d9b6c281a25ead97cbbf2e92314a3ffd224e2f9144f3fae7a86":
36
36
  "8fcf40227fe84704f7f8155b3b5ebcee79dfdc5208fde6e8b07569c24425f976",
37
+ # agy 1.2.17
38
+ "c54ef90651a8646ae67334d39212c81f5946feec373ad6aa335f9ef401662bc5":
39
+ "8fcf40227fe84704f7f8155b3b5ebcee79dfdc5208fde6e8b07569c24425f976",
37
40
  }
38
41
  PROFILE_ID = "agy_memfd_home_deny_all_v1"
39
42
  PRIVATE_HOME = "/dev/phase-loop-agy"
@@ -239,6 +239,16 @@ def _findings_from_panel(
239
239
  f"record_digest={digest}; president ruling required")
240
240
 
241
241
  for leg in panel.legs:
242
+ # agent-harness#1132 (L4b): the leg's typed seat notices reach the governed path
243
+ # too, one non-gating finding each, rendered only from the notice table's literals.
244
+ for notice in getattr(leg, "seat_notices", ()):
245
+ findings.append(ReviewFinding(
246
+ code="seat_notice",
247
+ reason=(f"seat {notice.seat_key or leg.leg} notice {notice.code}: "
248
+ f"{notice.what} / {notice.why} / fix: {notice.fix}"),
249
+ severity="warn",
250
+ reviewed_sha=reviewed_sha,
251
+ ))
242
252
  # agent-harness#1176: a heartbeat_only seat that went without genuine progress past its
243
253
  # notice window is recorded, whatever its final status. A warn: the notice is history,
244
254
  # never a verdict, and never permission to end a seat.