phase-loop-runtime 0.7.4__tar.gz → 0.7.6__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 (768) hide show
  1. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/PKG-INFO +1 -1
  2. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/pyproject.toml +1 -1
  3. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/__init__.py +1 -1
  4. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/cli.py +20 -0
  5. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/__init__.py +110 -0
  6. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/adapters/__init__.py +6 -0
  7. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/adapters/base.py +52 -0
  8. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/adapters/claude.py +5 -0
  9. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/adapters/codex.py +5 -0
  10. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/adapters/outside_agent.py +9 -0
  11. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/__init__.py +7 -0
  12. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/admission.py +56 -0
  13. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/credsep.py +120 -0
  14. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/evidence.py +53 -0
  15. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/live.py +82 -0
  16. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/broker/verbs.py +76 -0
  17. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/contracts.py +129 -0
  18. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/dispatch.py +100 -0
  19. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/event_log.py +140 -0
  20. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/fencing.py +68 -0
  21. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/provider_contracts.py +151 -0
  22. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/reconcile.py +92 -0
  23. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/refresh.py +67 -0
  24. phase_loop_runtime-0.7.6/src/phase_loop_runtime/convergence/status.py +33 -0
  25. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/panel_invoker.py +37 -0
  26. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/publishing.py +22 -108
  27. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_ledger.py +108 -1
  28. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_runner.py +79 -2
  29. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
  30. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/SOURCES.txt +42 -0
  31. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_cli_train_status_45.py +14 -1
  32. phase_loop_runtime-0.7.6/tests/test_convergence_adapters.py +10 -0
  33. phase_loop_runtime-0.7.6/tests/test_convergence_broker_admission.py +8 -0
  34. phase_loop_runtime-0.7.6/tests/test_convergence_broker_api.py +4 -0
  35. phase_loop_runtime-0.7.6/tests/test_convergence_broker_credsep.py +184 -0
  36. phase_loop_runtime-0.7.6/tests/test_convergence_broker_evidence.py +35 -0
  37. phase_loop_runtime-0.7.6/tests/test_convergence_broker_verbs.py +82 -0
  38. phase_loop_runtime-0.7.6/tests/test_convergence_cli_integration.py +7 -0
  39. phase_loop_runtime-0.7.6/tests/test_convergence_coordination_contracts.py +38 -0
  40. phase_loop_runtime-0.7.6/tests/test_convergence_dispatch.py +14 -0
  41. phase_loop_runtime-0.7.6/tests/test_convergence_event_contracts.py +52 -0
  42. phase_loop_runtime-0.7.6/tests/test_convergence_event_log.py +43 -0
  43. phase_loop_runtime-0.7.6/tests/test_convergence_fencing.py +13 -0
  44. phase_loop_runtime-0.7.6/tests/test_convergence_fixture_contracts.py +40 -0
  45. phase_loop_runtime-0.7.6/tests/test_convergence_invalidation.py +9 -0
  46. phase_loop_runtime-0.7.6/tests/test_convergence_live_enable.py +168 -0
  47. phase_loop_runtime-0.7.6/tests/test_convergence_provider_contracts.py +42 -0
  48. phase_loop_runtime-0.7.6/tests/test_convergence_reconcile.py +15 -0
  49. phase_loop_runtime-0.7.6/tests/test_convergence_refresh.py +13 -0
  50. phase_loop_runtime-0.7.6/tests/test_convergence_runtime_imports.py +14 -0
  51. phase_loop_runtime-0.7.6/tests/test_convergence_seat_lifecycle.py +11 -0
  52. phase_loop_runtime-0.7.6/tests/test_convergence_status.py +10 -0
  53. phase_loop_runtime-0.7.6/tests/test_convergence_train_integration.py +74 -0
  54. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_publishing.py +26 -49
  55. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/MANIFEST.in +0 -0
  56. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/README.md +0 -0
  57. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/protocol/protocol.md +0 -0
  58. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/setup.cfg +0 -0
  59. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  60. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  61. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  62. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  63. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  64. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  65. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  66. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  67. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  68. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  69. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  70. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  71. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  72. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  73. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_proc_cpu.py +0 -0
  74. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  75. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  76. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  77. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  78. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  79. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  80. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  81. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  82. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  83. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  84. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  85. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  86. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  87. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  88. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  89. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  90. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  91. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  92. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  93. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  94. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  95. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  96. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  97. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  98. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  99. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  100. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  101. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  102. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  103. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  104. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  105. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  106. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  107. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  108. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  109. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  110. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  111. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  112. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  113. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  114. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
  115. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  116. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  117. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  118. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
  119. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  120. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  121. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  122. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  123. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  124. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  125. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  126. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  127. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  128. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  129. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  130. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  131. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  132. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  133. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_modular.py +0 -0
  134. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  135. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  136. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  137. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  138. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  139. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  140. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  141. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  142. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/broker.py +0 -0
  143. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/build_bundle.py +0 -0
  144. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/capability_registry.py +0 -0
  145. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/classifier.py +0 -0
  146. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  147. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  148. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout.py +0 -0
  149. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  150. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  151. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_validation.py +0 -0
  152. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/closeout_validators.py +0 -0
  153. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/__init__.py +0 -0
  154. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
  155. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
  156. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
  157. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
  158. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
  159. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
  160. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
  161. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
  162. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
  163. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
  164. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
  165. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
  166. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_gates.py +0 -0
  167. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  168. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  169. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  170. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  171. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
  172. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
  173. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/discovery.py +0 -0
  174. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  175. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  176. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_audit.py +0 -0
  177. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_freshness.py +0 -0
  178. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  179. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/doctor.py +0 -0
  180. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  181. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/events.py +0 -0
  182. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/events_migration.py +0 -0
  183. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/evidence_audit.py +0 -0
  184. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  185. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/executor_availability.py +0 -0
  186. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_map.py +0 -0
  187. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  188. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  189. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/gate_posture.py +0 -0
  190. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_discipline.py +0 -0
  191. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_ops.py +0 -0
  192. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/git_topology.py +0 -0
  193. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_bundle.py +0 -0
  194. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_premerge.py +0 -0
  195. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/governed_review.py +0 -0
  196. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/handoff.py +0 -0
  197. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/handoff_path.py +0 -0
  198. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
  199. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/injection.py +0 -0
  200. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/install_status.py +0 -0
  201. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  202. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/launcher.py +0 -0
  203. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/lease_store.py +0 -0
  204. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/maintenance.py +0 -0
  205. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  206. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/models.py +0 -0
  207. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/observability.py +0 -0
  208. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  209. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  210. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  211. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  212. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  213. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  214. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  215. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
  216. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  217. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/plan_ir.py +0 -0
  218. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/plan_manifest.py +0 -0
  219. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/planner_validation.py +0 -0
  220. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/profiles.py +0 -0
  221. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/prompts.py +0 -0
  222. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/provenance.py +0 -0
  223. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/py.typed +0 -0
  224. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/ratification_policy.py +0 -0
  225. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/reconcile.py +0 -0
  226. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/redaction.py +0 -0
  227. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/reflection_sync.py +0 -0
  228. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/release_guard.py +0 -0
  229. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/render.py +0 -0
  230. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/repo_validation.py +0 -0
  231. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/review_summary.py +0 -0
  232. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/roadmap_authority.py +0 -0
  233. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  234. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_log.py +0 -0
  235. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  236. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  237. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runner.py +0 -0
  238. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_paths.py +0 -0
  239. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_projection.py +0 -0
  240. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/runtime_resources.py +0 -0
  241. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schema_export.py +0 -0
  242. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
  243. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
  244. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  245. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_install.py +0 -0
  246. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_inventory.py +0 -0
  247. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_paths.py +0 -0
  248. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  249. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  250. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  251. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  252. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  253. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  254. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  255. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  256. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  257. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  258. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  259. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  260. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  261. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  262. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  263. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  264. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  265. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  266. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  267. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  268. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  269. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  270. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  271. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  272. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  273. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  274. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  275. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  276. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  277. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  278. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  279. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  280. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  281. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  282. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  283. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  284. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  285. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  286. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  287. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  288. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  289. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  290. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  291. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  292. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  293. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  294. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  295. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  296. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  297. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  298. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  299. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  300. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  301. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  302. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  303. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  304. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  305. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  306. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  307. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  308. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  309. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  310. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  311. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  312. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  313. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  314. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  315. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  316. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  317. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  318. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  319. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  320. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  321. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  322. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  323. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  324. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  325. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  326. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  327. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  328. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  329. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  330. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  331. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  332. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  333. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  334. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  335. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  336. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  337. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  338. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  339. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  340. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  341. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  342. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  343. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  344. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  345. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  346. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  347. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  348. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  349. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  350. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  351. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  352. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  353. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  354. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  355. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  356. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  357. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  358. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  359. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  360. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  361. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  362. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  363. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  364. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  365. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  366. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  367. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  368. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  369. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  370. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  371. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  372. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  373. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  374. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  375. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  376. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  377. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  378. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  379. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  380. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  381. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  382. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  383. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  384. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  385. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  386. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  387. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  388. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  389. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  390. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  391. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  392. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  393. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  394. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  395. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  396. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  397. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  398. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  399. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  400. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  401. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  402. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  403. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  404. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  405. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  406. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  407. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  408. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  409. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  410. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  411. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  412. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  413. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  414. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  415. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  416. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  417. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  418. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  419. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  420. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  421. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  422. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  423. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  424. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  425. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  426. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  427. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  428. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  429. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  430. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  431. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  432. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  433. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  434. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  435. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  436. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  437. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state.py +0 -0
  438. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state_degradation.py +0 -0
  439. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/state_ops.py +0 -0
  440. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_broker.py +0 -0
  441. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_broker_client.py +0 -0
  442. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/task_message_resolver.py +0 -0
  443. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/train_roadmap.py +0 -0
  444. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/verification_evidence.py +0 -0
  445. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  446. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  447. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/worker_pool.py +0 -0
  448. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime/worktree_index.py +0 -0
  449. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  450. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  451. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
  452. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  453. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_advisory_mode.py +0 -0
  454. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_alias_install.py +0 -0
  455. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backcompat.py +0 -0
  456. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backing_homebrew.py +0 -0
  457. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_backing_omnigent.py +0 -0
  458. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_cli_legacy.py +0 -0
  459. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_composition.py +0 -0
  460. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_concurrency.py +0 -0
  461. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_config.py +0 -0
  462. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_golden.py +0 -0
  463. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_ingestion.py +0 -0
  464. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_integration.py +0 -0
  465. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_matrix.py +0 -0
  466. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_observability.py +0 -0
  467. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_presets.py +0 -0
  468. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_registries.py +0 -0
  469. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_resolver.py +0 -0
  470. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_board_schema.py +0 -0
  471. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_advisor_twin_alias_legacy.py +0 -0
  472. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_agent_runtime_provider_cs08.py +0 -0
  473. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_autosel.py +0 -0
  474. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_branchgov_preflight.py +0 -0
  475. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_certificate_tier.py +0 -0
  476. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_break_glass_cli.py +0 -0
  477. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_classifier.py +0 -0
  478. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_convergence_fixes.py +0 -0
  479. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_exception_vocab.py +0 -0
  480. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_validator_hook.py +0 -0
  481. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_closeout_verification_gate.py +0 -0
  482. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_codex_effort_max_clamp_49.py +0 -0
  483. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_conformance_golden.py +0 -0
  484. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_consiliency_dual_layout.py +0 -0
  485. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_consiliency_gates.py +0 -0
  486. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_consiliency_ingest.py +0 -0
  487. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_consiliency_scaffold.py +0 -0
  488. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_coordinator_wave_loop.py +0 -0
  489. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_discovery_hygiene_legacy.py +0 -0
  490. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  491. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_helper.py +0 -0
  492. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_reentrancy.py +0 -0
  493. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  494. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_doc_delta_validator.py +0 -0
  495. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_docs_audit.py +0 -0
  496. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_docs_freshness.py +0 -0
  497. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_doctor_bom.py +0 -0
  498. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_dotfiles_tree.py +0 -0
  499. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_execgov.py +0 -0
  500. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_execreg_launch_registry.py +0 -0
  501. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_execute_phase_handoff_mode.py +0 -0
  502. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_execution_policy_tiering.py +0 -0
  503. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_executor_availability.py +0 -0
  504. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_export_schema.py +0 -0
  505. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_fleet_map.py +0 -0
  506. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_fleet_metrics.py +0 -0
  507. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_fleet_metrics_export.py +0 -0
  508. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_gate_a_wheel_isolation.py +0 -0
  509. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_gate_posture.py +0 -0
  510. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_git_discipline.py +0 -0
  511. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_git_grounded_projection.py +0 -0
  512. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_disjointness_model_first.py +0 -0
  513. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_e2e.py +0 -0
  514. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_gate_crfixes.py +0 -0
  515. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_planning_gate.py +0 -0
  516. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_premerge.py +0 -0
  517. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_premerge_live.py +0 -0
  518. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_governed_review.py +0 -0
  519. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_grokexec.py +0 -0
  520. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_hotfix_lane.py +0 -0
  521. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_injection_skill_failloud.py +0 -0
  522. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_lane_ir_override.py +0 -0
  523. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_launcher_liveness.py +0 -0
  524. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_launchspec_golden.py +0 -0
  525. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_lease_store.py +0 -0
  526. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_lease_store_conformance.py +0 -0
  527. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_ledger_serialization.py +0 -0
  528. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_leg_liveness_monitor.py +0 -0
  529. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_manifest_per_entry_164.py +0 -0
  530. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_model_class_policy.py +0 -0
  531. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_model_id_source_guard.py +0 -0
  532. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_observability_alerting.py +0 -0
  533. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory.py +0 -0
  534. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory_cli.py +0 -0
  535. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_advisory_fixtures.py +0 -0
  536. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_authority_boundary.py +0 -0
  537. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_drift.py +0 -0
  538. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_imports.py +0 -0
  539. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_contract_pin.py +0 -0
  540. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_core_api.py +0 -0
  541. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_provenance.py +0 -0
  542. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_ci.py +0 -0
  543. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_cli.py +0 -0
  544. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_output.py +0 -0
  545. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_real_runtime.py +0 -0
  546. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_redaction.py +0 -0
  547. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_release_surface.py +0 -0
  548. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_schema_validation.py +0 -0
  549. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_outside_agent_vectors.py +0 -0
  550. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_advisory_mode_63.py +0 -0
  551. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_context_refs_114.py +0 -0
  552. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker.py +0 -0
  553. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker_spawn.py +0 -0
  554. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_invoker_timeout_argv.py +0 -0
  555. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  556. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_native_fill_183.py +0 -0
  557. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_per_leg_model_66.py +0 -0
  558. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_streaming_verdicts.py +0 -0
  559. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_tui_eof_48.py +0 -0
  560. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_tui_liveness_188.py +0 -0
  561. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_panel_verdict_summary.py +0 -0
  562. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_parallel_dispatch_backcompat.py +0 -0
  563. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_parallel_dispatch_cli.py +0 -0
  564. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_adoption_bundle.py +0 -0
  565. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  566. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_dependency.py +0 -0
  567. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  568. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_injection.py +0 -0
  569. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_modular.py +0 -0
  570. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  571. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  572. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_schema_export.py +0 -0
  573. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_baml_schema_source.py +0 -0
  574. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  575. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_break_glass_rerun.py +0 -0
  576. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_build_bundle.py +0 -0
  577. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_classifier.py +0 -0
  578. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  579. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  580. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  581. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  582. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_security.py +0 -0
  583. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  584. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  585. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  586. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_claude_route_selection.py +0 -0
  587. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_cli.py +0 -0
  588. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  589. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_control_only.py +0 -0
  590. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_event.py +0 -0
  591. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  592. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_hardening.py +0 -0
  593. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  594. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_schema.py +0 -0
  595. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_closeout_validation.py +0 -0
  596. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_citation.py +0 -0
  597. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_docs.py +0 -0
  598. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  599. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
  600. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  601. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  602. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  603. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_discovery.py +0 -0
  604. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_docs.py +0 -0
  605. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  606. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  607. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  608. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  609. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_portal.py +0 -0
  610. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  611. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_drift_audit.py +0 -0
  612. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
  613. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  614. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_events_migration.py +0 -0
  615. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit.py +0 -0
  616. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  617. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  618. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  619. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  620. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_execution_policy.py +0 -0
  621. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_executor_degradation.py +0 -0
  622. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_full_phase_mode.py +0 -0
  623. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_handoff.py +0 -0
  624. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_handoff_migration.py +0 -0
  625. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_init.py +0 -0
  626. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_injection.py +0 -0
  627. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_install_status.py +0 -0
  628. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
  629. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_harnesses.py +0 -0
  630. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_ir.py +0 -0
  631. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  632. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_lane_scheduler.py +0 -0
  633. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_launcher.py +0 -0
  634. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_ledger_debug.py +0 -0
  635. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_ledger_dedup.py +0 -0
  636. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_live_adapters.py +0 -0
  637. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_maintenance.py +0 -0
  638. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_metrics.py +0 -0
  639. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_migration_regressions.py +0 -0
  640. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  641. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  642. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  643. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_models.py +0 -0
  644. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_native_flags.py +0 -0
  645. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  646. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pi_executor.py +0 -0
  647. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  648. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  649. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  650. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  651. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  652. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_pipeline_mode.py +0 -0
  653. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  654. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_plan_manifest.py +0 -0
  655. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  656. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_planner_validation.py +0 -0
  657. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_policy.py +0 -0
  658. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_protocol_contract.py +0 -0
  659. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_provenance.py +0 -0
  660. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile.py +0 -0
  661. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  662. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  663. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  664. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_reducers.py +0 -0
  665. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
  666. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  667. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  668. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_roadmap_validate.py +0 -0
  669. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_rotation.py +0 -0
  670. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runner.py +0 -0
  671. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  672. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_boundary.py +0 -0
  673. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_decouple.py +0 -0
  674. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_package_data.py +0 -0
  675. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_runtime_projection.py +0 -0
  676. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_schema_flow.py +0 -0
  677. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  678. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  679. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_contract.py +0 -0
  680. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  681. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_install.py +0 -0
  682. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  683. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_blockers.py +0 -0
  684. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  685. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_smoke_reentry.py +0 -0
  686. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  687. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  688. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  689. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_state.py +0 -0
  690. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  691. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  692. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  693. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  694. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  695. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v22_e2e.py +0 -0
  696. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v22_principles.py +0 -0
  697. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  698. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_reconcile.py +0 -0
  699. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_sched.py +0 -0
  700. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_v45_schedharden.py +0 -0
  701. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_wave_runner.py +0 -0
  702. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_observability.py +0 -0
  703. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_runner.py +0 -0
  704. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_work_unit_state.py +0 -0
  705. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_loop_worktrees.py +0 -0
  706. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  707. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_phase_worktree_executor.py +0 -0
  708. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  709. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  710. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  711. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_flag.py +0 -0
  712. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_markers.py +0 -0
  713. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  714. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  715. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  716. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  717. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  718. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pkg_layout_freeze.py +0 -0
  719. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_plan_ir_iter_waves.py +0 -0
  720. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_preflight_verification.py +0 -0
  721. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_proc_cpu.py +0 -0
  722. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_prune_merged_worktrees_script.py +0 -0
  723. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_pushflow.py +0 -0
  724. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_ratification_policy.py +0 -0
  725. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  726. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_reconcile_verification_log.py +0 -0
  727. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_reflection_sync.py +0 -0
  728. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_release_dispatch_operator_approval_145.py +0 -0
  729. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_release_pin_autotrack.py +0 -0
  730. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_repo_validation.py +0 -0
  731. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_review_leg_sandbox.py +0 -0
  732. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_review_summary.py +0 -0
  733. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_roadmap_authority.py +0 -0
  734. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_route_log.py +0 -0
  735. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_route_policy_conformance.py +0 -0
  736. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_routing_invariants.py +0 -0
  737. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_runtime_state_mirror_agreement.py +0 -0
  738. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_sibling_matcher_patterns.py +0 -0
  739. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skill_bundle_pinned.py +0 -0
  740. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skill_install_body_expansion.py +0 -0
  741. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skill_plan_manifest_write.py +0 -0
  742. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skill_sources_seam.py +0 -0
  743. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skills_bundle_drift.py +0 -0
  744. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skills_canon_parity.py +0 -0
  745. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_skills_src_claude_literal_lint.py +0 -0
  746. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_spec_conformance_gate.py +0 -0
  747. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_status_read_only_62.py +0 -0
  748. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_sweep_fleet_worktrees_script.py +0 -0
  749. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_sync_skills_apply_failloud.py +0 -0
  750. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_task_message_broker.py +0 -0
  751. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_task_message_broker_cli.py +0 -0
  752. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_task_message_resolver.py +0 -0
  753. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_e2e.py +0 -0
  754. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_invariants.py +0 -0
  755. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_merge.py +0 -0
  756. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_order_only_deps_47.py +0 -0
  757. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_roadmap.py +0 -0
  758. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_train_runner.py +0 -0
  759. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_unattended_release.py +0 -0
  760. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  761. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  762. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_verification_evidence.py +0 -0
  763. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_verification_evidence_validator.py +0 -0
  764. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_visual_evidence_validator.py +0 -0
  765. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_workerpool_failure_isolation.py +0 -0
  766. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_workerpool_parallel.py +0 -0
  767. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/tests/test_workerpool_worktree_alloc.py +0 -0
  768. {phase_loop_runtime-0.7.4 → phase_loop_runtime-0.7.6}/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.4
3
+ Version: 0.7.6
4
4
  Summary: Harness-neutral phase-loop orchestration runtime and CLI
5
5
  Author: ViperJuice
6
6
  License-Expression: Apache-2.0
@@ -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.4"
7
+ version = "0.7.6"
8
8
  description = "Harness-neutral phase-loop orchestration runtime and CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -18,4 +18,4 @@ __all__ = [
18
18
  "state_ops",
19
19
  ]
20
20
 
21
- __version__ = "0.7.4"
21
+ __version__ = "0.7.6"
@@ -728,6 +728,11 @@ def build_parser() -> argparse.ArgumentParser:
728
728
  metavar="FILE",
729
729
  help="Path to the cross-repo release-train roadmap (same file as run-train).",
730
730
  )
731
+ train_status_sub.add_argument(
732
+ "--event-log",
733
+ metavar="PATH",
734
+ help="Read a coordinator-owned convergence event log instead of a legacy train ledger.",
735
+ )
731
736
  train_status_sub.add_argument(
732
737
  "--ledger-dir",
733
738
  default=None,
@@ -3059,6 +3064,21 @@ def _run_train_status_command(*, parser: argparse.ArgumentParser, args: argparse
3059
3064
  """
3060
3065
  import json as _json
3061
3066
 
3067
+ event_log = getattr(args, "event_log", None)
3068
+ if event_log:
3069
+ if getattr(args, "train_file", None) or getattr(args, "ledger_dir", None):
3070
+ parser.error("train-status --event-log is mutually exclusive with --train and --ledger-dir")
3071
+ return 2
3072
+ from .convergence import build_train_status, read_convergence_events, recover_train_state, render_train_status
3073
+ path = Path(event_log)
3074
+ try:
3075
+ snapshot = build_train_status(recover_train_state(read_convergence_events(path)), path)
3076
+ except Exception as exc:
3077
+ print(f"train-status: failed to read event log at {path}: {exc}", file=sys.stderr)
3078
+ return 1
3079
+ print(render_train_status(snapshot, as_json=bool(getattr(args, "json", False))))
3080
+ return 0
3081
+
3062
3082
  from .train_ledger import default_ledger_path, read_ledger
3063
3083
 
3064
3084
  train_file = getattr(args, "train_file", None)
@@ -0,0 +1,110 @@
1
+ """Frozen convergence contracts only; runtime and broker behavior are intentionally absent."""
2
+
3
+ from phase_loop_runtime.convergence.contracts import (
4
+ AdmissionRequest,
5
+ AuthoritySource,
6
+ BrokerRequest,
7
+ BrokerTerminalEvidence,
8
+ BrokerVerb,
9
+ InvalidationTrigger,
10
+ PublishCommittedBranchResult,
11
+ ReconciliationBinding,
12
+ ResourceIsolationDecision,
13
+ evaluate_resource_isolation,
14
+ )
15
+ from phase_loop_runtime.convergence.provider_contracts import (
16
+ PROVIDER_COMPLETION_CLASSIFICATIONS,
17
+ ProviderAutomationDisposition,
18
+ ProviderCompletionClassification,
19
+ ProviderCompletionContract,
20
+ TerminalOutcomeState,
21
+ validate_terminal_transition,
22
+ )
23
+ from phase_loop_runtime.train_ledger import (
24
+ CoordinatorEvent,
25
+ CoordinatorEventKind,
26
+ ConvergenceResultEnvelope,
27
+ ConvergenceResultStatus,
28
+ normalize_legacy_ledger_record,
29
+ )
30
+ from phase_loop_runtime.convergence.event_log import (
31
+ RecoveredTrainState,
32
+ default_convergence_event_log_path,
33
+ read_convergence_events,
34
+ record_intent,
35
+ record_outcome,
36
+ recover_train_state,
37
+ )
38
+ from phase_loop_runtime.convergence.reconcile import ActionReconciliation, ExactStateProbes, ReconciliationVerdict, SupportedConvergenceVersions, invalidate_action_evidence, reconcile_before_action, reconcile_train_state
39
+ from phase_loop_runtime.convergence.dispatch import DispatchDecision, RepositoryDispatchRequest, RepositoryLockKey, dispatch_ready_nodes
40
+ from phase_loop_runtime.convergence.fencing import ApprovalBinding, AttemptLease, FencedAdmissionFactory, compute_approval_digest, validate_attempt_lease
41
+ from phase_loop_runtime.convergence.refresh import DownstreamRefreshRequest, DownstreamRefreshResult, DownstreamRefreshStatus, refresh_downstream_after_merge
42
+ from phase_loop_runtime.convergence.status import TrainStatusSnapshot, build_train_status, render_train_status
43
+ from phase_loop_runtime.convergence.adapters import AdapterExecutionRequest, run_claude_adapter, run_codex_adapter, run_outside_agent_adapter
44
+ from phase_loop_runtime.convergence.broker import (
45
+ AdmissionRecord, BrokerAdmissionPolicy, BrokerClient, BrokerEnvironmentBoundary,
46
+ BrokerEvidenceStore, BrokerExecutionResult, BrokerProviderAdapter, BrokerService,
47
+ EvidenceRecord, GitHubBrokerAdapter, LinearizableAdmissionStore,
48
+ publish_committed_branch_idempotency_key,
49
+ )
50
+
51
+ __all__ = [
52
+ "AdmissionRequest",
53
+ "AuthoritySource",
54
+ "BrokerRequest",
55
+ "BrokerTerminalEvidence",
56
+ "BrokerVerb",
57
+ "CoordinatorEvent",
58
+ "CoordinatorEventKind",
59
+ "ConvergenceResultEnvelope",
60
+ "ConvergenceResultStatus",
61
+ "InvalidationTrigger",
62
+ "PROVIDER_COMPLETION_CLASSIFICATIONS",
63
+ "ProviderAutomationDisposition",
64
+ "ProviderCompletionClassification",
65
+ "ProviderCompletionContract",
66
+ "PublishCommittedBranchResult",
67
+ "ReconciliationBinding",
68
+ "ResourceIsolationDecision",
69
+ "TerminalOutcomeState",
70
+ "evaluate_resource_isolation",
71
+ "normalize_legacy_ledger_record",
72
+ "validate_terminal_transition",
73
+ "AdapterExecutionRequest",
74
+ "ExactStateProbes",
75
+ "ActionReconciliation",
76
+ "ApprovalBinding",
77
+ "AttemptLease",
78
+ "DispatchDecision",
79
+ "DownstreamRefreshRequest",
80
+ "DownstreamRefreshResult",
81
+ "DownstreamRefreshStatus",
82
+ "FencedAdmissionFactory",
83
+ "RecoveredTrainState",
84
+ "ReconciliationVerdict",
85
+ "RepositoryDispatchRequest",
86
+ "RepositoryLockKey",
87
+ "SupportedConvergenceVersions",
88
+ "TrainStatusSnapshot",
89
+ "build_train_status",
90
+ "default_convergence_event_log_path",
91
+ "compute_approval_digest",
92
+ "dispatch_ready_nodes",
93
+ "invalidate_action_evidence",
94
+ "read_convergence_events",
95
+ "reconcile_train_state",
96
+ "reconcile_before_action",
97
+ "record_intent",
98
+ "record_outcome",
99
+ "recover_train_state",
100
+ "render_train_status",
101
+ "run_claude_adapter",
102
+ "run_codex_adapter",
103
+ "run_outside_agent_adapter",
104
+ "refresh_downstream_after_merge",
105
+ "validate_attempt_lease",
106
+ "AdmissionRecord", "BrokerAdmissionPolicy", "BrokerClient", "BrokerEnvironmentBoundary",
107
+ "BrokerEvidenceStore", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService",
108
+ "EvidenceRecord", "GitHubBrokerAdapter", "LinearizableAdmissionStore",
109
+ "publish_committed_branch_idempotency_key",
110
+ ]
@@ -0,0 +1,6 @@
1
+ from .base import AdapterExecutionRequest
2
+ from .codex import run_codex_adapter
3
+ from .claude import run_claude_adapter
4
+ from .outside_agent import run_outside_agent_adapter
5
+
6
+ __all__ = ["AdapterExecutionRequest", "run_codex_adapter", "run_claude_adapter", "run_outside_agent_adapter"]
@@ -0,0 +1,52 @@
1
+ """Bounded, credential-stripped adapter execution primitives."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ import subprocess
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import Mapping
10
+
11
+ from phase_loop_runtime.convergence.contracts import AdmissionRequest
12
+ from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope, ConvergenceResultStatus
13
+
14
+ _DENIED_ENV = ("OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GOOGLE_API_KEY", "GEMINI_API_KEY")
15
+ _ALLOWED_ACTIONS = frozenset({"execute", "repair", "review"})
16
+
17
+ @dataclass(frozen=True)
18
+ class AdapterExecutionRequest:
19
+ attempt_id: str
20
+ admission: AdmissionRequest
21
+ argv: tuple[str, ...]
22
+ cwd: Path
23
+ timeout_seconds: float
24
+ allowed_action: str
25
+ evidence_references: tuple[str, ...] = ()
26
+
27
+ def __post_init__(self) -> None:
28
+ if not self.argv or self.timeout_seconds <= 0 or self.allowed_action not in _ALLOWED_ACTIONS:
29
+ raise ValueError("adapter request is outside bounded execution contract")
30
+ if self.admission.attempt_id != self.attempt_id:
31
+ raise ValueError("adapter request must preserve admission attempt id")
32
+
33
+
34
+ def run_bounded(request: AdapterExecutionRequest, *, expected_prefix: str) -> ConvergenceResultEnvelope:
35
+ if not request.argv[0].startswith(expected_prefix):
36
+ return ConvergenceResultEnvelope(ConvergenceResultStatus.BLOCKED, request.attempt_id, "adapter command outside provider bounds")
37
+ env = {key: value for key, value in os.environ.items() if key not in _DENIED_ENV}
38
+ try:
39
+ result = subprocess.run(request.argv, cwd=request.cwd, env=env, text=True, capture_output=True, timeout=request.timeout_seconds, start_new_session=True, check=False)
40
+ except subprocess.TimeoutExpired:
41
+ return ConvergenceResultEnvelope(ConvergenceResultStatus.DEGRADED, request.attempt_id, "adapter timed out")
42
+ except OSError as exc:
43
+ return ConvergenceResultEnvelope(ConvergenceResultStatus.FAILED, request.attempt_id, str(exc)[:256])
44
+ detail = (result.stdout or result.stderr or "")[:1024]
45
+ if result.returncode:
46
+ return ConvergenceResultEnvelope(ConvergenceResultStatus.FAILED, request.attempt_id, detail)
47
+ try:
48
+ payload = json.loads(result.stdout)
49
+ status = ConvergenceResultStatus(payload.get("status", "completed"))
50
+ except (ValueError, json.JSONDecodeError):
51
+ status = ConvergenceResultStatus.COMPLETED
52
+ return ConvergenceResultEnvelope(status, request.attempt_id, detail)
@@ -0,0 +1,5 @@
1
+ from .base import AdapterExecutionRequest, run_bounded
2
+ from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope
3
+
4
+ def run_claude_adapter(request: AdapterExecutionRequest) -> ConvergenceResultEnvelope:
5
+ return run_bounded(request, expected_prefix="claude")
@@ -0,0 +1,5 @@
1
+ from .base import AdapterExecutionRequest, run_bounded
2
+ from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope
3
+
4
+ def run_codex_adapter(request: AdapterExecutionRequest) -> ConvergenceResultEnvelope:
5
+ return run_bounded(request, expected_prefix="codex")
@@ -0,0 +1,9 @@
1
+ from .base import AdapterExecutionRequest, run_bounded
2
+ from phase_loop_runtime.train_ledger import ConvergenceResultEnvelope, ConvergenceResultStatus
3
+
4
+ def run_outside_agent_adapter(request: AdapterExecutionRequest, submission: dict | None = None) -> ConvergenceResultEnvelope:
5
+ if submission is not None:
6
+ from phase_loop_runtime.conformance import validate_outside_agent_submission
7
+ if validate_outside_agent_submission(submission).status.value != "pass":
8
+ return ConvergenceResultEnvelope(ConvergenceResultStatus.BLOCKED, request.attempt_id, "outside-agent submission failed conformance")
9
+ return run_bounded(request, expected_prefix="outside-agent")
@@ -0,0 +1,7 @@
1
+ """Credential-capable, fail-closed broker epoch."""
2
+ from .admission import AdmissionRecord, BrokerAdmissionPolicy, LinearizableAdmissionStore
3
+ from .credsep import BrokerEnvironmentBoundary, GitHubBrokerAdapter
4
+ from .evidence import BrokerEvidenceStore, EvidenceRecord
5
+ from .live import build_github_broker_client
6
+ from .verbs import BrokerClient, BrokerExecutionResult, BrokerProviderAdapter, BrokerService, publish_committed_branch_idempotency_key
7
+ __all__ = ["AdmissionRecord", "BrokerAdmissionPolicy", "LinearizableAdmissionStore", "BrokerEnvironmentBoundary", "GitHubBrokerAdapter", "BrokerEvidenceStore", "EvidenceRecord", "BrokerClient", "BrokerExecutionResult", "BrokerProviderAdapter", "BrokerService", "build_github_broker_client", "publish_committed_branch_idempotency_key"]
@@ -0,0 +1,56 @@
1
+ """Durable, metadata-only broker admission ordering."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ from dataclasses import asdict, dataclass
7
+ from pathlib import Path
8
+ from typing import Callable
9
+
10
+ from phase_loop_runtime.convergence.contracts import AdmissionRequest
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class AdmissionRecord:
15
+ sequence: int
16
+ epoch: int
17
+ request: AdmissionRequest
18
+
19
+
20
+ BrokerAdmissionPolicy = Callable[[AdmissionRequest], bool]
21
+
22
+
23
+ class LinearizableAdmissionStore:
24
+ """Append-only admission log guarded by an OS advisory lock."""
25
+ def __init__(self, root: Path, policy: BrokerAdmissionPolicy | None = None, epoch_blocked: Callable[[], bool] | None = None) -> None:
26
+ self.root, self.policy, self.epoch_blocked = root, policy, epoch_blocked or (lambda: False)
27
+ self.root.mkdir(parents=True, exist_ok=True)
28
+ self.path, self.lock_path = root / "admissions.jsonl", root / "admissions.lock"
29
+
30
+ def _records(self) -> list[AdmissionRecord]:
31
+ if not self.path.exists(): return []
32
+ records = []
33
+ for line in self.path.read_text(encoding="utf-8").splitlines():
34
+ raw = json.loads(line); raw["request"] = AdmissionRequest(**raw["request"]); records.append(AdmissionRecord(**raw))
35
+ return records
36
+
37
+ def admit(self, request: AdmissionRequest) -> AdmissionRecord:
38
+ import fcntl
39
+ with self.lock_path.open("a+", encoding="utf-8") as lock:
40
+ fcntl.flock(lock, fcntl.LOCK_EX)
41
+ try:
42
+ if self.epoch_blocked() or self.policy is None or not self.policy(request):
43
+ raise PermissionError("broker admission denied")
44
+ records = self._records()
45
+ for record in records:
46
+ if record.request.idempotency_key == request.idempotency_key:
47
+ if record.request != request: raise ValueError("conflicting idempotency key")
48
+ return record
49
+ if records and request.lease_epoch < max(r.epoch for r in records): raise PermissionError("stale epoch")
50
+ record = AdmissionRecord(len(records) + 1, request.lease_epoch, request)
51
+ with self.path.open("a", encoding="utf-8") as stream:
52
+ stream.write(json.dumps(asdict(record), sort_keys=True) + "\n"); stream.flush(); os.fsync(stream.fileno())
53
+ return record
54
+ finally: fcntl.flock(lock, fcntl.LOCK_UN)
55
+
56
+ def replay(self) -> tuple[AdmissionRecord, ...]: return tuple(self._records())
@@ -0,0 +1,120 @@
1
+ """Credential boundary and GitHub publish adapter."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ import re
7
+ import subprocess
8
+ from pathlib import Path
9
+ from typing import Mapping
10
+
11
+ from phase_loop_runtime.convergence.contracts import BrokerRequest, BrokerTerminalEvidence, PublishCommittedBranchResult
12
+
13
+ MUTATION_CREDENTIAL_KEYS = frozenset({"GH_TOKEN", "GITHUB_TOKEN"})
14
+ # Repo-redirect env var: gh resolves its target repo from GH_REPO over cwd's origin,
15
+ # so a stray GH_REPO could send a `gh pr create` to a DIFFERENT repo while the
16
+ # push+ls-remote (bound to origin) still match — an undetected wrong-repo PR. The
17
+ # host is instead pinned by the host-qualified `--repo host/owner/repo` (which beats
18
+ # GH_HOST/gh-config), so GH_HOST is left intact to preserve GHE config routing.
19
+ REPO_REDIRECT_KEYS = frozenset({"GH_REPO"})
20
+ def strip_mutation_credentials(environment: Mapping[str, str]) -> dict[str, str]: return {k: v for k, v in environment.items() if k not in MUTATION_CREDENTIAL_KEYS}
21
+ class BrokerEnvironmentBoundary:
22
+ def environment_for(self, role: str, environment: Mapping[str, str] | None = None) -> dict[str, str]:
23
+ env = dict(os.environ if environment is None else environment)
24
+ # The broker keeps its mutation credential (to push) but NEVER the repo-redirect
25
+ # vars; every other role is stripped of credentials.
26
+ return {k: v for k, v in env.items() if k not in REPO_REDIRECT_KEYS} if role == "broker" else strip_mutation_credentials(env)
27
+ def build_non_force_branch_ref(branch: str) -> str:
28
+ if not branch or branch.startswith("-") or branch in {"main", "master", "develop", "release"}: raise ValueError("unsafe branch")
29
+ return f"refs/heads/{branch}"
30
+ # Origin-host invariant (fail-closed): the broker only publishes to an allow-listed
31
+ # host, so a `gh --repo host/owner/repo` derived from the origin url can NEVER be
32
+ # mis-bound to a look-alike host by any URL-text edge (custom port, IPv6, ssh alias,
33
+ # twin instance). Default is github.com-only; a self-hosted/GHE fleet passes its own
34
+ # allow-list explicitly. This retires the whole host-parse edge class at the boundary.
35
+ ALLOWED_ORIGIN_HOSTS = frozenset({"github.com"})
36
+ class GitHubBrokerAdapter:
37
+ def __init__(self, repo_path: Path, run=subprocess.run, allowed_hosts: frozenset[str] = ALLOWED_ORIGIN_HOSTS) -> None:
38
+ self.repo_path, self.run, self.allowed_hosts = repo_path, run, allowed_hosts
39
+ def _output(self, *args: str) -> str:
40
+ return self.run(["git", "-C", str(self.repo_path), *args], capture_output=True, text=True, check=True).stdout.strip()
41
+ def _origin_url(self) -> str:
42
+ # The single canonical origin URL the broker validates AND operates through
43
+ # explicitly (push + ls-remote), so the mutation can never be redirected by the
44
+ # `origin` alias (remote.origin.pushurl / url.*.pushInsteadOf) to an unvalidated
45
+ # target. This is git's FETCH url; the broker deliberately publishes to the
46
+ # canonical repo it validated, not a local triangular pushurl.
47
+ return self._output("remote", "get-url", "origin")
48
+ def _origin_repo(self) -> str:
49
+ return self._slug_for(self._origin_url())
50
+ def _slug_for(self, url: str) -> str:
51
+ # Resolve a git URL to a HOST-QUALIFIED `host/owner/repo` slug so `gh` is bound
52
+ # with `--repo host/owner/repo` (highest precedence — beats a stray
53
+ # GH_REPO/GH_HOST/cwd/gh-config), pinning the PR to the SAME host AND repo the
54
+ # push targets. Fail-closed if the URL cannot be resolved or is not allow-listed.
55
+ if "://" in url: # scheme://[user@]host[:port]/owner/repo(.git)
56
+ scheme = url.split("://", 1)[0].lower()
57
+ rest = url.split("://", 1)[1].split("@", 1)[-1]
58
+ authority, _, path = rest.partition("/")
59
+ # Fail-closed on authorities --repo cannot faithfully pin: an IPv6 literal
60
+ # (mis-split below) or a non-default http(s) API port (silently dropped →
61
+ # gh would hit the default-port host, a twin-host risk). ssh transport
62
+ # ports are irrelevant to the gh API host, so they are allowed.
63
+ if authority.startswith("[") or authority.count(":") > 1:
64
+ raise ValueError(f"unsupported IPv6/authority in origin {url!r}")
65
+ host, _, port = authority.partition(":")
66
+ default_port = {"https": "443", "http": "80"}.get(scheme)
67
+ if scheme in ("http", "https") and port and port != default_port:
68
+ raise ValueError(f"non-default {scheme} port in origin {url!r} cannot be pinned by --repo")
69
+ else: # scp-like: [user@]host:owner/repo(.git)
70
+ hostpart, sep, path = url.partition(":")
71
+ host = hostpart.split("@", 1)[-1]
72
+ if not sep:
73
+ raise ValueError(f"cannot resolve origin host/owner/repo from {url!r}")
74
+ if path.endswith(".git"):
75
+ path = path[:-4]
76
+ path = path.strip("/")
77
+ parts = path.split("/")
78
+ if not host or len(parts) != 2 or not all(parts):
79
+ raise ValueError(f"cannot resolve origin host/owner/repo from {url!r}")
80
+ if host not in self.allowed_hosts:
81
+ # Origin-host invariant: refuse to publish to a host outside the allow-list.
82
+ # This is the class-closing gate — no URL-text edge (port/IPv6/alias/twin)
83
+ # can mis-bind a gh call to a look-alike host, because a non-allow-listed
84
+ # host fails closed here (-> outcome_ambiguous_blocked), never a live PR.
85
+ raise ValueError(f"origin host {host!r} not in allowed broker hosts {sorted(self.allowed_hosts)}")
86
+ return f"{host}/{path}"
87
+ def _ambiguous(self, request: BrokerRequest, reference: str):
88
+ # v5 rule: a failed/empty remote read is NEVER inferred as no_effect and
89
+ # NEVER fabricated as success — it is a permanent ambiguous block.
90
+ return None, BrokerTerminalEvidence(request.admission.idempotency_key, "outcome_ambiguous_blocked", reference)
91
+
92
+ def execute(self, request: BrokerRequest):
93
+ if self._output("branch", "--show-current") != request.branch or self._output("rev-parse", "HEAD") != request.head_sha: raise ValueError("branch/head mismatch")
94
+ origin_url = self._origin_url() # ONE canonical url, used explicitly everywhere
95
+ origin_repo = self._slug_for(origin_url) # validate allow-list + derive the gh slug from the SAME url
96
+ ref = build_non_force_branch_ref(request.branch)
97
+ # Push + ls-remote target the EXPLICIT validated url, never the `origin` alias,
98
+ # so remote.origin.pushurl / url.*.pushInsteadOf cannot redirect the mutation.
99
+ pushed = self.run(["git", "-C", str(self.repo_path), "push", origin_url, ref], capture_output=True, text=True)
100
+ if pushed.returncode: return self._ambiguous(request, "push-unconfirmed")
101
+ args = ["gh", "pr", "create", "--repo", origin_repo, "--draft"] if request.draft else ["gh", "pr", "create", "--repo", origin_repo, "--fill"]
102
+ created = self.run(args, cwd=self.repo_path, capture_output=True, text=True)
103
+ if created.returncode: return self._ambiguous(request, "pr-unconfirmed")
104
+ # Exact-published-head verification: READ the remote and confirm the branch
105
+ # head on origin equals the pushed sha, then resolve the REAL PR url and
106
+ # confirm its headRefOid matches. Only then is the effect terminally observed.
107
+ remote = self.run(["git", "-C", str(self.repo_path), "ls-remote", origin_url, ref], capture_output=True, text=True)
108
+ if remote.returncode: return self._ambiguous(request, "remote-read-failed")
109
+ remote_sha = remote.stdout.split("\t", 1)[0].strip() if remote.stdout.strip() else ""
110
+ if not remote_sha: return self._ambiguous(request, "remote-branch-absent")
111
+ if remote_sha != request.head_sha: return self._ambiguous(request, "remote-head-mismatch")
112
+ listed = self.run(["gh", "pr", "list", "--repo", origin_repo, "--head", request.branch, "--json", "url,headRefOid"], cwd=self.repo_path, capture_output=True, text=True)
113
+ if listed.returncode: return self._ambiguous(request, "pr-read-failed")
114
+ try:
115
+ prs = json.loads(listed.stdout or "[]")
116
+ except json.JSONDecodeError:
117
+ return self._ambiguous(request, "pr-read-unparsable")
118
+ match = next((p for p in prs if p.get("headRefOid") == request.head_sha and p.get("url")), None)
119
+ if match is None: return self._ambiguous(request, "pr-head-unconfirmed")
120
+ return PublishCommittedBranchResult(request.branch, request.head_sha, match["url"]), BrokerTerminalEvidence(request.admission.idempotency_key, "effect_terminal_observed", match["url"])
@@ -0,0 +1,53 @@
1
+ """Append-only terminal evidence for broker operations."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ from dataclasses import asdict, dataclass
7
+ from pathlib import Path
8
+
9
+ from phase_loop_runtime.convergence.provider_contracts import TerminalOutcomeState, validate_terminal_transition
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class EvidenceRecord:
14
+ idempotency_key: str
15
+ state: TerminalOutcomeState
16
+ evidence_reference: str = ""
17
+
18
+
19
+ class BrokerEvidenceStore:
20
+ def __init__(self, root: Path) -> None:
21
+ self.root = root; root.mkdir(parents=True, exist_ok=True); self.path = root / "evidence.jsonl"
22
+ def replay(self) -> dict[str, EvidenceRecord]:
23
+ result: dict[str, EvidenceRecord] = {}
24
+ if self.path.exists():
25
+ for line in self.path.read_text(encoding="utf-8").splitlines():
26
+ raw = json.loads(line); raw["state"] = TerminalOutcomeState(raw["state"]); result[raw["idempotency_key"]] = EvidenceRecord(**raw)
27
+ return result
28
+ @property
29
+ def epoch_blocked(self) -> bool:
30
+ return any(r.state is TerminalOutcomeState.OUTCOME_AMBIGUOUS_BLOCKED for r in self.replay().values())
31
+ def record_intent(self, key: str) -> EvidenceRecord:
32
+ current = self.replay().get(key)
33
+ if current: return current
34
+ return self._append(EvidenceRecord(key, TerminalOutcomeState.PROVIDER_CALL_IN_FLIGHT))
35
+ def record_terminal(self, record: EvidenceRecord, *, pre_linearization_proven: bool = False) -> EvidenceRecord:
36
+ current = self.replay().get(record.idempotency_key)
37
+ if current is None: raise ValueError("intent must precede evidence")
38
+ if current == record: return current
39
+ if not validate_terminal_transition(current.state, record.state, pre_linearization_proven=pre_linearization_proven): raise ValueError("invalid terminal transition")
40
+ return self._append(record)
41
+ def rejected_before_start(self, key: str, evidence_reference: str) -> EvidenceRecord:
42
+ return self._append(EvidenceRecord(key, TerminalOutcomeState.REJECTED_BEFORE_START, evidence_reference))
43
+ def _append(self, record: EvidenceRecord) -> EvidenceRecord:
44
+ # Storage-layer permanence: no write may transition OUT of a terminal
45
+ # outcome_ambiguous_blocked record. This is self-enforcing regardless of
46
+ # caller path (record_terminal, rejected_before_start, record_intent), so a
47
+ # buggy caller cannot escape the block by writing a fresh terminal record.
48
+ current = self.replay().get(record.idempotency_key)
49
+ if current is not None and current.state is TerminalOutcomeState.OUTCOME_AMBIGUOUS_BLOCKED and record != current:
50
+ raise ValueError("outcome_ambiguous_blocked is permanent; no transition out")
51
+ with self.path.open("a", encoding="utf-8") as stream:
52
+ stream.write(json.dumps(asdict(record), sort_keys=True) + "\n"); stream.flush(); os.fsync(stream.fileno())
53
+ return record
@@ -0,0 +1,82 @@
1
+ """Opt-in construction of a live, credential-capable GitHub broker client.
2
+
3
+ This is the *only* helper that assembles a broker able to perform a real GitHub
4
+ mutation. It is never auto-instantiated: legacy ``run_train`` callers that pass
5
+ no ``coordinator_runtime`` (or a runtime with ``broker_client=None``) publish
6
+ exactly as before. A caller wanting broker-mediated publication builds a client
7
+ here and attaches it to :class:`CoordinatorRuntime.broker_client`.
8
+
9
+ The wired client enforces every already-merged safety property: linearizable
10
+ admission, permanent fail-closed ``outcome_ambiguous_blocked`` evidence, canonical
11
+ ``(repo, branch, head_sha)`` idempotency, and the adapter's exact-published-head
12
+ verification. Only the ``publish_committed_branch``/``github`` verb is SUPPORTED
13
+ (see ``provider_contracts``); the service refuses every other verb.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import subprocess
18
+ from pathlib import Path
19
+ from typing import Callable
20
+
21
+ from phase_loop_runtime.convergence.contracts import AdmissionRequest
22
+ from phase_loop_runtime.convergence.provider_contracts import PROVIDER_COMPLETION_CLASSIFICATIONS
23
+
24
+ from .admission import BrokerAdmissionPolicy, LinearizableAdmissionStore
25
+ from .credsep import GitHubBrokerAdapter
26
+ from .evidence import BrokerEvidenceStore
27
+ from .verbs import BrokerClient, BrokerService
28
+
29
+
30
+ def _default_admission_policy(_request: AdmissionRequest) -> bool:
31
+ """Admit any structurally-valid admission request.
32
+
33
+ ``AdmissionRequest.__post_init__`` already rejects a request missing any
34
+ fencing field, so a request that reaches the policy is well-formed. Epoch
35
+ staleness and idempotency-key conflicts are enforced inside
36
+ ``LinearizableAdmissionStore.admit`` regardless of this policy.
37
+ """
38
+ return True
39
+
40
+
41
+ def build_github_broker_client(
42
+ repo_path: Path,
43
+ *,
44
+ broker_root: Path,
45
+ admission_policy: BrokerAdmissionPolicy | None = None,
46
+ run: Callable[..., subprocess.CompletedProcess] = subprocess.run,
47
+ ) -> BrokerClient:
48
+ """Wire a live GitHub broker client.
49
+
50
+ Parameters
51
+ ----------
52
+ repo_path:
53
+ Worktree the :class:`GitHubBrokerAdapter` runs git/gh against.
54
+ broker_root:
55
+ Durable directory for the admission log + terminal-evidence log. MUST
56
+ live OUTSIDE ``repo_path`` (e.g. ``CoordinatorRuntime.coordinator_root``)
57
+ so broker state never dirties the worktree being published — a dirty
58
+ worktree trips the publish staged-diff audit and the train clean-worktree
59
+ preflight.
60
+ admission_policy:
61
+ Optional admission gate; defaults to admitting any well-formed request.
62
+ run:
63
+ Injectable subprocess runner (tests pass a fake to mock the git/gh seam).
64
+
65
+ Returns
66
+ -------
67
+ BrokerClient
68
+ A :class:`BrokerService` bound to the global (verb-gated) contracts, so
69
+ only ``publish_committed_branch``/``github`` can execute.
70
+ """
71
+ admission_store = LinearizableAdmissionStore(
72
+ Path(broker_root),
73
+ admission_policy or _default_admission_policy,
74
+ )
75
+ evidence_store = BrokerEvidenceStore(Path(broker_root))
76
+ adapter = GitHubBrokerAdapter(Path(repo_path), run=run)
77
+ return BrokerService(
78
+ admission_store,
79
+ evidence_store,
80
+ adapter,
81
+ contracts=PROVIDER_COMPLETION_CLASSIFICATIONS,
82
+ )