phase-loop-runtime 0.7.2__tar.gz → 0.7.4__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 (726) hide show
  1. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/PKG-INFO +1 -1
  2. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/pyproject.toml +1 -1
  3. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/__init__.py +1 -1
  4. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/cli.py +8 -0
  5. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/discovery.py +11 -5
  6. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/events.py +19 -6
  7. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/panel_invoker.py +129 -13
  8. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/ratification.py +8 -6
  9. phase_loop_runtime-0.7.4/src/phase_loop_runtime/roadmap_authority.py +204 -0
  10. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runner.py +7 -8
  11. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state.py +2 -0
  12. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_broker_client.py +17 -6
  13. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_resolver.py +43 -12
  14. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_roadmap.py +54 -8
  15. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
  16. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/SOURCES.txt +3 -0
  17. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_branchgov_preflight.py +37 -12
  18. phase_loop_runtime-0.7.4/tests/test_panel_tui_liveness_188.py +191 -0
  19. phase_loop_runtime-0.7.4/tests/test_roadmap_authority.py +490 -0
  20. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_broker_cli.py +76 -2
  21. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_resolver.py +83 -0
  22. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_invariants.py +46 -0
  23. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_roadmap.py +79 -0
  24. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/MANIFEST.in +0 -0
  25. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/README.md +0 -0
  26. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/protocol/protocol.md +0 -0
  27. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/setup.cfg +0 -0
  28. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  29. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  30. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  31. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  32. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  33. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  34. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  35. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  36. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  37. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  38. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  39. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  40. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  41. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  42. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_proc_cpu.py +0 -0
  43. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  44. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  45. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  46. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  47. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  48. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  49. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  50. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  51. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  52. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  53. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  54. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  55. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  56. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  57. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  58. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  59. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  60. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  61. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  62. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  63. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  64. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  65. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  66. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  67. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  68. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  69. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  70. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  71. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  72. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  73. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  74. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  75. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  76. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  77. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  78. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  79. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  80. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  81. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  82. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  83. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
  84. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  85. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  86. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  87. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
  88. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  89. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  90. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  91. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  92. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  93. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  94. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  95. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  96. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  97. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  98. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  99. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  100. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  101. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  102. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_modular.py +0 -0
  103. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  104. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  105. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  106. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  107. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  108. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  109. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  110. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  111. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/broker.py +0 -0
  112. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/build_bundle.py +0 -0
  113. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/capability_registry.py +0 -0
  114. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/classifier.py +0 -0
  115. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  116. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  117. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout.py +0 -0
  118. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  119. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  120. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_validation.py +0 -0
  121. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_validators.py +0 -0
  122. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/__init__.py +0 -0
  123. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
  124. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
  125. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
  126. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
  127. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
  128. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
  129. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
  130. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
  131. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
  132. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
  133. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
  134. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
  135. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_gates.py +0 -0
  136. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  137. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  138. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  139. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  140. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
  141. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
  142. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  143. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  144. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_audit.py +0 -0
  145. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_freshness.py +0 -0
  146. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  147. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/doctor.py +0 -0
  148. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  149. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/events_migration.py +0 -0
  150. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/evidence_audit.py +0 -0
  151. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  152. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/executor_availability.py +0 -0
  153. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_map.py +0 -0
  154. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  155. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  156. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/gate_posture.py +0 -0
  157. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_discipline.py +0 -0
  158. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_ops.py +0 -0
  159. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_topology.py +0 -0
  160. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_bundle.py +0 -0
  161. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_premerge.py +0 -0
  162. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_review.py +0 -0
  163. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/handoff.py +0 -0
  164. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/handoff_path.py +0 -0
  165. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
  166. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/injection.py +0 -0
  167. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/install_status.py +0 -0
  168. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  169. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/launcher.py +0 -0
  170. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/lease_store.py +0 -0
  171. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/maintenance.py +0 -0
  172. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  173. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/models.py +0 -0
  174. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/observability.py +0 -0
  175. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  176. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  177. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  178. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  179. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  180. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  181. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  182. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  183. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/plan_ir.py +0 -0
  184. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/plan_manifest.py +0 -0
  185. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/planner_validation.py +0 -0
  186. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/profiles.py +0 -0
  187. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/prompts.py +0 -0
  188. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/provenance.py +0 -0
  189. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/publishing.py +0 -0
  190. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/py.typed +0 -0
  191. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/ratification_policy.py +0 -0
  192. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/reconcile.py +0 -0
  193. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/redaction.py +0 -0
  194. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/reflection_sync.py +0 -0
  195. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/release_guard.py +0 -0
  196. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/render.py +0 -0
  197. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/repo_validation.py +0 -0
  198. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/review_summary.py +0 -0
  199. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  200. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_log.py +0 -0
  201. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  202. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  203. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_paths.py +0 -0
  204. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_projection.py +0 -0
  205. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_resources.py +0 -0
  206. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schema_export.py +0 -0
  207. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
  208. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
  209. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  210. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_install.py +0 -0
  211. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_inventory.py +0 -0
  212. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_paths.py +0 -0
  213. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  214. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  215. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  216. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  217. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  218. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  219. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  220. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  221. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  222. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  223. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  224. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  225. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  226. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  227. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  228. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  229. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  230. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  231. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  232. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  233. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  234. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  235. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  236. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  237. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  238. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  239. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  240. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  241. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  242. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  243. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  244. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  245. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  246. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  247. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  248. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  249. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  250. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  251. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  252. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  253. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  254. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  255. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  256. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  257. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  258. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  259. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  260. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  261. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  262. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  263. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  264. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  265. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  266. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  267. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  268. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  269. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  270. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  271. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  272. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  273. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  274. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  275. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  276. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  277. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  278. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  279. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  280. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  281. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  282. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  283. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  284. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  285. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  286. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  287. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  288. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  289. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  290. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  291. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  292. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  293. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  294. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  295. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  296. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  297. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  298. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  299. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  300. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  301. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  302. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  303. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  304. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  305. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  306. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  307. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  308. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  309. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  310. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  311. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  312. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  313. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  314. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  315. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  316. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  317. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  318. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  319. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  320. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  321. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  322. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  323. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  324. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  325. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  326. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  327. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  328. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  329. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  330. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  331. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  332. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  333. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  334. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  335. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  336. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  337. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  338. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  339. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  340. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  341. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  342. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  343. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  344. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  345. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  346. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  347. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  348. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  349. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  350. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  351. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  352. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  353. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  354. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  355. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  356. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  357. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  358. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  359. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  360. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  361. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  362. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  363. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  364. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  365. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  366. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  367. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  368. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  369. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  370. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  371. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  372. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  373. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  374. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  375. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  376. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  377. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  378. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  379. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  380. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  381. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  382. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  383. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  384. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  385. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  386. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  387. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  388. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  389. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  390. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  391. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  392. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  393. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  394. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  395. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  396. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  397. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  398. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  399. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  400. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  401. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  402. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state_degradation.py +0 -0
  403. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state_ops.py +0 -0
  404. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_broker.py +0 -0
  405. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_ledger.py +0 -0
  406. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_runner.py +0 -0
  407. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/verification_evidence.py +0 -0
  408. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  409. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  410. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/worker_pool.py +0 -0
  411. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/worktree_index.py +0 -0
  412. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  413. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  414. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
  415. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  416. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_advisory_mode.py +0 -0
  417. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_alias_install.py +0 -0
  418. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backcompat.py +0 -0
  419. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backing_homebrew.py +0 -0
  420. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backing_omnigent.py +0 -0
  421. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_cli_legacy.py +0 -0
  422. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_composition.py +0 -0
  423. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_concurrency.py +0 -0
  424. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_config.py +0 -0
  425. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_golden.py +0 -0
  426. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_ingestion.py +0 -0
  427. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_integration.py +0 -0
  428. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_matrix.py +0 -0
  429. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_observability.py +0 -0
  430. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_presets.py +0 -0
  431. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_registries.py +0 -0
  432. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_resolver.py +0 -0
  433. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_schema.py +0 -0
  434. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_twin_alias_legacy.py +0 -0
  435. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_agent_runtime_provider_cs08.py +0 -0
  436. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_autosel.py +0 -0
  437. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_certificate_tier.py +0 -0
  438. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_cli_train_status_45.py +0 -0
  439. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_break_glass_cli.py +0 -0
  440. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_classifier.py +0 -0
  441. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_convergence_fixes.py +0 -0
  442. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_exception_vocab.py +0 -0
  443. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_validator_hook.py +0 -0
  444. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_verification_gate.py +0 -0
  445. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_codex_effort_max_clamp_49.py +0 -0
  446. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_conformance_golden.py +0 -0
  447. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_dual_layout.py +0 -0
  448. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_gates.py +0 -0
  449. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_ingest.py +0 -0
  450. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_scaffold.py +0 -0
  451. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_coordinator_wave_loop.py +0 -0
  452. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_discovery_hygiene_legacy.py +0 -0
  453. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  454. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_helper.py +0 -0
  455. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_reentrancy.py +0 -0
  456. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  457. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_doc_delta_validator.py +0 -0
  458. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_docs_audit.py +0 -0
  459. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_docs_freshness.py +0 -0
  460. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_doctor_bom.py +0 -0
  461. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dotfiles_tree.py +0 -0
  462. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execgov.py +0 -0
  463. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execreg_launch_registry.py +0 -0
  464. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execute_phase_handoff_mode.py +0 -0
  465. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execution_policy_tiering.py +0 -0
  466. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_executor_availability.py +0 -0
  467. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_export_schema.py +0 -0
  468. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_map.py +0 -0
  469. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_metrics.py +0 -0
  470. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_metrics_export.py +0 -0
  471. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_gate_a_wheel_isolation.py +0 -0
  472. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_gate_posture.py +0 -0
  473. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_git_discipline.py +0 -0
  474. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_git_grounded_projection.py +0 -0
  475. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_disjointness_model_first.py +0 -0
  476. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_e2e.py +0 -0
  477. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_gate_crfixes.py +0 -0
  478. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_planning_gate.py +0 -0
  479. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_premerge.py +0 -0
  480. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_premerge_live.py +0 -0
  481. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_review.py +0 -0
  482. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_grokexec.py +0 -0
  483. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_hotfix_lane.py +0 -0
  484. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_injection_skill_failloud.py +0 -0
  485. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lane_ir_override.py +0 -0
  486. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_launcher_liveness.py +0 -0
  487. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_launchspec_golden.py +0 -0
  488. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lease_store.py +0 -0
  489. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lease_store_conformance.py +0 -0
  490. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_ledger_serialization.py +0 -0
  491. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_leg_liveness_monitor.py +0 -0
  492. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_manifest_per_entry_164.py +0 -0
  493. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_model_class_policy.py +0 -0
  494. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_model_id_source_guard.py +0 -0
  495. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_observability_alerting.py +0 -0
  496. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory.py +0 -0
  497. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory_cli.py +0 -0
  498. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory_fixtures.py +0 -0
  499. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_authority_boundary.py +0 -0
  500. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_drift.py +0 -0
  501. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_imports.py +0 -0
  502. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_pin.py +0 -0
  503. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_core_api.py +0 -0
  504. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_provenance.py +0 -0
  505. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_ci.py +0 -0
  506. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_cli.py +0 -0
  507. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_output.py +0 -0
  508. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_runtime.py +0 -0
  509. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_redaction.py +0 -0
  510. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_release_surface.py +0 -0
  511. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_schema_validation.py +0 -0
  512. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_vectors.py +0 -0
  513. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_advisory_mode_63.py +0 -0
  514. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_context_refs_114.py +0 -0
  515. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker.py +0 -0
  516. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker_spawn.py +0 -0
  517. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker_timeout_argv.py +0 -0
  518. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  519. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_native_fill_183.py +0 -0
  520. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_per_leg_model_66.py +0 -0
  521. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_streaming_verdicts.py +0 -0
  522. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_tui_eof_48.py +0 -0
  523. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_verdict_summary.py +0 -0
  524. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_parallel_dispatch_backcompat.py +0 -0
  525. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_parallel_dispatch_cli.py +0 -0
  526. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_adoption_bundle.py +0 -0
  527. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  528. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_dependency.py +0 -0
  529. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  530. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_injection.py +0 -0
  531. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_modular.py +0 -0
  532. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  533. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  534. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_schema_export.py +0 -0
  535. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_schema_source.py +0 -0
  536. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  537. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_break_glass_rerun.py +0 -0
  538. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_build_bundle.py +0 -0
  539. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_classifier.py +0 -0
  540. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  541. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  542. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  543. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  544. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_security.py +0 -0
  545. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  546. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  547. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  548. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_route_selection.py +0 -0
  549. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_cli.py +0 -0
  550. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  551. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_control_only.py +0 -0
  552. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_event.py +0 -0
  553. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  554. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_hardening.py +0 -0
  555. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  556. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_schema.py +0 -0
  557. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_validation.py +0 -0
  558. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_citation.py +0 -0
  559. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_docs.py +0 -0
  560. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  561. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
  562. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  563. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  564. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  565. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_discovery.py +0 -0
  566. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_docs.py +0 -0
  567. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  568. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  569. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  570. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  571. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_portal.py +0 -0
  572. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  573. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_drift_audit.py +0 -0
  574. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
  575. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  576. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_events_migration.py +0 -0
  577. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit.py +0 -0
  578. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  579. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  580. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  581. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  582. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_execution_policy.py +0 -0
  583. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_executor_degradation.py +0 -0
  584. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_full_phase_mode.py +0 -0
  585. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_handoff.py +0 -0
  586. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_handoff_migration.py +0 -0
  587. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_init.py +0 -0
  588. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_injection.py +0 -0
  589. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_install_status.py +0 -0
  590. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
  591. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_harnesses.py +0 -0
  592. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_ir.py +0 -0
  593. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  594. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_scheduler.py +0 -0
  595. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_launcher.py +0 -0
  596. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_ledger_debug.py +0 -0
  597. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_ledger_dedup.py +0 -0
  598. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_live_adapters.py +0 -0
  599. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_maintenance.py +0 -0
  600. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_metrics.py +0 -0
  601. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_migration_regressions.py +0 -0
  602. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  603. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  604. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  605. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_models.py +0 -0
  606. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_native_flags.py +0 -0
  607. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  608. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pi_executor.py +0 -0
  609. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  610. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  611. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  612. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  613. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  614. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_mode.py +0 -0
  615. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  616. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_plan_manifest.py +0 -0
  617. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  618. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_planner_validation.py +0 -0
  619. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_policy.py +0 -0
  620. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_protocol_contract.py +0 -0
  621. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_provenance.py +0 -0
  622. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile.py +0 -0
  623. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  624. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  625. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  626. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reducers.py +0 -0
  627. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
  628. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  629. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  630. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_roadmap_validate.py +0 -0
  631. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_rotation.py +0 -0
  632. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runner.py +0 -0
  633. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  634. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_boundary.py +0 -0
  635. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_decouple.py +0 -0
  636. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_package_data.py +0 -0
  637. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_projection.py +0 -0
  638. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_schema_flow.py +0 -0
  639. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  640. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  641. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_contract.py +0 -0
  642. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  643. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_install.py +0 -0
  644. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  645. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_blockers.py +0 -0
  646. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  647. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_reentry.py +0 -0
  648. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  649. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  650. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  651. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_state.py +0 -0
  652. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  653. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  654. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  655. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  656. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  657. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v22_e2e.py +0 -0
  658. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v22_principles.py +0 -0
  659. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  660. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_reconcile.py +0 -0
  661. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_sched.py +0 -0
  662. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_schedharden.py +0 -0
  663. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_wave_runner.py +0 -0
  664. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_observability.py +0 -0
  665. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_runner.py +0 -0
  666. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_state.py +0 -0
  667. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_worktrees.py +0 -0
  668. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  669. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_worktree_executor.py +0 -0
  670. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  671. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  672. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  673. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_flag.py +0 -0
  674. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_markers.py +0 -0
  675. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  676. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  677. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  678. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  679. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  680. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pkg_layout_freeze.py +0 -0
  681. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_plan_ir_iter_waves.py +0 -0
  682. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_preflight_verification.py +0 -0
  683. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_proc_cpu.py +0 -0
  684. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_prune_merged_worktrees_script.py +0 -0
  685. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_publishing.py +0 -0
  686. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pushflow.py +0 -0
  687. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_ratification_policy.py +0 -0
  688. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  689. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reconcile_verification_log.py +0 -0
  690. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reflection_sync.py +0 -0
  691. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_release_dispatch_operator_approval_145.py +0 -0
  692. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_release_pin_autotrack.py +0 -0
  693. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_repo_validation.py +0 -0
  694. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_review_leg_sandbox.py +0 -0
  695. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_review_summary.py +0 -0
  696. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_route_log.py +0 -0
  697. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_route_policy_conformance.py +0 -0
  698. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_routing_invariants.py +0 -0
  699. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_runtime_state_mirror_agreement.py +0 -0
  700. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sibling_matcher_patterns.py +0 -0
  701. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_bundle_pinned.py +0 -0
  702. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_install_body_expansion.py +0 -0
  703. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_plan_manifest_write.py +0 -0
  704. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_sources_seam.py +0 -0
  705. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_bundle_drift.py +0 -0
  706. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_canon_parity.py +0 -0
  707. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_src_claude_literal_lint.py +0 -0
  708. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_spec_conformance_gate.py +0 -0
  709. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_status_read_only_62.py +0 -0
  710. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sweep_fleet_worktrees_script.py +0 -0
  711. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sync_skills_apply_failloud.py +0 -0
  712. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_broker.py +0 -0
  713. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_e2e.py +0 -0
  714. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_merge.py +0 -0
  715. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_order_only_deps_47.py +0 -0
  716. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_runner.py +0 -0
  717. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_unattended_release.py +0 -0
  718. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  719. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  720. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_verification_evidence.py +0 -0
  721. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_verification_evidence_validator.py +0 -0
  722. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_visual_evidence_validator.py +0 -0
  723. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_failure_isolation.py +0 -0
  724. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_parallel.py +0 -0
  725. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_worktree_alloc.py +0 -0
  726. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/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.2
3
+ Version: 0.7.4
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.2"
7
+ version = "0.7.4"
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.2"
21
+ __version__ = "0.7.4"
@@ -18,6 +18,7 @@ from .consiliency_scaffold import ScaffoldError, scaffold
18
18
  from .docs_freshness import scan_docs_freshness
19
19
  from .discovery import AmbiguousRoadmapError, find_plan_artifact, phase_source_bundle_diagnostic, resolve_repo, resolve_suite_command, select_roadmap
20
20
  from .events import append_event, read_events
21
+ from .roadmap_authority import RoadmapAuthorityError, assert_roadmap_authorized
21
22
  from .git_topology import collect_git_topology
22
23
  from .handoff import handoff_metadata, write_tui_handoff
23
24
  from .install_status import build_install_status
@@ -859,6 +860,9 @@ def main(argv: list[str] | None = None) -> int:
859
860
  file=sys.stderr,
860
861
  )
861
862
  return 2
863
+ except RoadmapAuthorityError as exc:
864
+ print(f"phase-loop {command}: roadmap authority refusal — {exc}", file=sys.stderr)
865
+ return 2
862
866
 
863
867
 
864
868
  def _resolve_run_closeout_mode(args: argparse.Namespace, command: str) -> str:
@@ -1046,6 +1050,7 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
1046
1050
  _warn_roadmap_validation(select_roadmap(repo, args.roadmap))
1047
1051
  return _evidence_audit_command(repo=repo, args=args, as_json=as_json)
1048
1052
  if command in {"run", "resume", "dry-run"} and bool(getattr(args, "reset_capability", False)):
1053
+ assert_roadmap_authorized(repo, args.roadmap)
1049
1054
  clear_degradation(repo)
1050
1055
 
1051
1056
  if command == "execute":
@@ -1137,6 +1142,7 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
1137
1142
  )
1138
1143
  return 0
1139
1144
  if command == "migrate-handoffs":
1145
+ assert_roadmap_authorized(repo, args.roadmap)
1140
1146
  records = migrate_handoffs(repo, apply=bool(getattr(args, "apply", False)))
1141
1147
  if as_json:
1142
1148
  print(records_to_json(records))
@@ -1145,8 +1151,10 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
1145
1151
  print(f"{record.status}\t{record.action}\t{record.skill_name}\t{record.source}\t{record.target}")
1146
1152
  return 1 if any(record.action == "blocked" for record in records) else 0
1147
1153
  if command == "migrate-events":
1154
+ assert_roadmap_authorized(repo, args.roadmap)
1148
1155
  return _migrate_events_command(repo=repo, dry_run=bool(args.dry_run), backup_suffix=args.backup_suffix)
1149
1156
  if command == "archive-state":
1157
+ assert_roadmap_authorized(repo, args.roadmap)
1150
1158
  print(render_archive_result(
1151
1159
  archive_state(repo, reason=getattr(args, "reason", None), dry_run=bool(getattr(args, "dry_run", False))),
1152
1160
  as_json=as_json,
@@ -39,6 +39,7 @@ from .models import (
39
39
  )
40
40
  from .pipeline_adapter.flag import reconcile_git_reality_enabled
41
41
  from .provenance import phase_sha256, roadmap_sha256
42
+ from .roadmap_authority import active_authorized_roadmap, assert_roadmap_authorized
42
43
  from .runtime_paths import phase_loop_state_read_file
43
44
 
44
45
 
@@ -413,28 +414,33 @@ def select_roadmap(repo: Path, explicit: str | Path | None = None) -> Path:
413
414
  path = Path(explicit).expanduser()
414
415
  if not path.is_absolute():
415
416
  path = repo / path
417
+ authorized = assert_roadmap_authorized(repo, path)
416
418
  if not path.exists():
417
419
  raise FileNotFoundError(f"roadmap not found: {path}")
418
- return path.resolve()
420
+ return authorized
421
+
422
+ authority_roadmap = active_authorized_roadmap(repo)
423
+ if authority_roadmap is not None:
424
+ return authority_roadmap
419
425
 
420
426
  state_roadmap = active_state_roadmap(repo)
421
427
  if state_roadmap is not None:
422
- return state_roadmap
428
+ return assert_roadmap_authorized(repo, state_roadmap)
423
429
 
424
430
  manifest_roadmap = manifest_backed_roadmap(repo)
425
431
  if manifest_roadmap is not None:
426
- return manifest_roadmap
432
+ return assert_roadmap_authorized(repo, manifest_roadmap)
427
433
 
428
434
  handoff = latest_handoff_roadmap(repo_identity(repo), "codex-phase-roadmap-builder")
429
435
  if handoff is not None:
430
- return handoff
436
+ return assert_roadmap_authorized(repo, handoff)
431
437
 
432
438
  candidates = sorted((repo / "specs").glob("phase-plans-v*.md"))
433
439
  if not candidates:
434
440
  raise FileNotFoundError("no specs/phase-plans-v*.md roadmap found")
435
441
  if len(candidates) != 1:
436
442
  raise AmbiguousRoadmapError([c.resolve() for c in candidates])
437
- return candidates[0].resolve()
443
+ return assert_roadmap_authorized(repo, candidates[0])
438
444
 
439
445
 
440
446
  def active_state_roadmap(repo: Path) -> Path | None:
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from .closeout import phase_loop_closeout_diagnostic
9
9
  from .git_topology import attach_git_topology, collect_git_topology
10
10
  from .models import LoopEvent, WorkUnitEventMetadata
11
+ from .roadmap_authority import assert_roadmap_authorized
11
12
  from .runtime_paths import ensure_phase_loop_excluded, phase_loop_event_file, phase_loop_event_read_files
12
13
 
13
14
 
@@ -20,16 +21,17 @@ def event_read_paths(repo: Path) -> tuple[Path, ...]:
20
21
 
21
22
 
22
23
  def append_event(repo: Path, event: LoopEvent) -> None:
23
- ensure_phase_loop_excluded(repo)
24
24
  event = _event_with_closeout_metadata(event)
25
25
  event = attach_git_topology(repo, event)
26
- path = event_path(repo)
27
- path.parent.mkdir(parents=True, exist_ok=True)
28
- _append_jsonl(path, event.to_json())
26
+ append_payload(
27
+ repo,
28
+ event.to_json(),
29
+ roadmap=event.roadmap,
30
+ )
29
31
 
30
32
 
31
33
  def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap: Path | None = None) -> None:
32
- ensure_phase_loop_excluded(repo)
34
+ authorized_roadmap = assert_roadmap_authorized(repo, roadmap)
33
35
  payload = event.to_json()
34
36
  closeout = _extract_work_unit_closeout(payload)
35
37
  if closeout is not None:
@@ -37,7 +39,7 @@ def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap:
37
39
  payload.update(
38
40
  {
39
41
  "repo": str(repo),
40
- "roadmap": str(roadmap or ""),
42
+ "roadmap": str(roadmap or authorized_roadmap or ""),
41
43
  "phase": event.identity.phase,
42
44
  "action": "work_unit",
43
45
  "status": event.status,
@@ -46,6 +48,17 @@ def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap:
46
48
  "git_topology": collect_git_topology(repo),
47
49
  }
48
50
  )
51
+ append_payload(repo, payload, roadmap=roadmap or authorized_roadmap)
52
+
53
+
54
+ def append_payload(
55
+ repo: Path,
56
+ payload: dict,
57
+ *,
58
+ roadmap: str | Path | None,
59
+ ) -> None:
60
+ assert_roadmap_authorized(repo, roadmap)
61
+ ensure_phase_loop_excluded(repo)
49
62
  path = event_path(repo)
50
63
  path.parent.mkdir(parents=True, exist_ok=True)
51
64
  _append_jsonl(path, payload)
@@ -1235,6 +1235,91 @@ def _run_leg_with_liveness(
1235
1235
  pass
1236
1236
 
1237
1237
 
1238
+ # #188 — de-animation of the Claude TUI's cosmetic status line. While the model
1239
+ # call is in flight the TUI repaints an animated "✻ Herding… (Ns · esc to
1240
+ # interrupt)" line ~1x/sec (rotating whimsical verb + a per-second elapsed
1241
+ # counter). Those repaints are PTY output but NOT reviewer progress: a leg wedged
1242
+ # in ``ep_poll`` waiting on a stream that never completes keeps animating that
1243
+ # line forever. Treating any PTY byte as a heartbeat (the pre-#188 behavior) let
1244
+ # a wedged Fable leg hang ~17 min with ~2s CPU and no output. So for the TUI path
1245
+ # the kill clock is reset ONLY by GENUINE reviewer progress — output-file growth,
1246
+ # transcript growth, or SUBSTANTIVE novel de-animated terminal text — never by raw
1247
+ # PTY churn and never by incidental CPU (a Node CLI trickles libuv/GC CPU while
1248
+ # blocked, which would defeat a CPU heartbeat here just as the animation defeats a
1249
+ # byte heartbeat). This is exactly #188's "separate process-alive from
1250
+ # reviewer-heartbeat freshness"; the codex/grok/gemini ``_run_leg_with_liveness``
1251
+ # path keeps its stdout/stderr + CPU heartbeat (load-bearing there) untouched.
1252
+ _ANSI_CSI_RE = re.compile(r"\x1b\[[0-9;?]*[ -/]*[@-~]")
1253
+ _ANSI_OSC_RE = re.compile(r"\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)")
1254
+ _TUI_DIGIT_RUN_RE = re.compile(r"\d+")
1255
+ _TUI_NON_TOKEN_RE = re.compile(r"[^0-9a-zA-Z#]+")
1256
+ # A normalized visible line must be at least this long to count as substantive
1257
+ # novelty — filters out short glyph/one-word blips while any real review sentence
1258
+ # (or streamed token run) clears it easily.
1259
+ _TUI_PROGRESS_MIN_CHARS = 8
1260
+
1261
+
1262
+ def _normalize_tui_line(line: str) -> str:
1263
+ """Collapse a rendered terminal line to a spinner/timer-invariant token string.
1264
+
1265
+ Digit runs → ``#`` (kills the per-second elapsed counter) and every non-alnum
1266
+ glyph/punctuation is dropped (kills the rotating spinner glyph + box drawing),
1267
+ so the animated status line maps to a FINITE set of normalized strings while
1268
+ genuinely-streamed review text keeps introducing novel ones.
1269
+ """
1270
+ line = _TUI_DIGIT_RUN_RE.sub("#", line)
1271
+ line = _TUI_NON_TOKEN_RE.sub(" ", line)
1272
+ return " ".join(line.split()).strip().lower()
1273
+
1274
+
1275
+ def _tui_chunk_has_novel_content(chunk: bytes, seen: set[str]) -> bool:
1276
+ """True iff a PTY chunk carries SUBSTANTIVE new (non-cosmetic) terminal text.
1277
+
1278
+ Strips ANSI escapes, splits on newline AND carriage-return (spinner overwrite),
1279
+ normalizes each visible line, and reports whether any sufficiently-long line
1280
+ has not been seen before. ``seen`` accumulates for the session (bounded by real
1281
+ novelty — a wedge's animation vocabulary is finite, so it saturates and stops
1282
+ resetting the kill clock).
1283
+ """
1284
+ text = chunk.decode("utf-8", errors="replace")
1285
+ text = _ANSI_OSC_RE.sub("", text)
1286
+ text = _ANSI_CSI_RE.sub("", text)
1287
+ novel = False
1288
+ for raw in re.split(r"[\r\n]+", text):
1289
+ norm = _normalize_tui_line(raw)
1290
+ if len(norm) >= _TUI_PROGRESS_MIN_CHARS and norm not in seen:
1291
+ seen.add(norm)
1292
+ novel = True
1293
+ return novel
1294
+
1295
+
1296
+ # A single ``os.read(8192)`` can split a novel review line across two chunks; each
1297
+ # fragment normalizes differently (or collides with a seen/too-short form), so the
1298
+ # whole-line progress signal is lost. Carry the trailing PARTIAL line (bytes after
1299
+ # the last newline/CR) forward and prepend it to the next chunk, so novelty is only
1300
+ # ever evaluated on COMPLETE lines. Bounded so an unterminated over-long run (a rare
1301
+ # no-newline stream) is flushed rather than growing the buffer without limit.
1302
+ _TUI_CARRY_MAX_BYTES = 1 << 16 # 64 KiB
1303
+
1304
+
1305
+ def _tui_take_complete_lines(carry: bytearray, chunk: bytes) -> bytes:
1306
+ """Append ``chunk`` to ``carry`` and return the bytes up to the last line
1307
+ terminator (complete lines, safe to scan for novelty), retaining the trailing
1308
+ partial line in ``carry`` for the next read. Carried at the RAW byte level so a
1309
+ straddling ANSI escape (never containing \\n/\\r) also reassembles intact."""
1310
+ carry.extend(chunk)
1311
+ last = max(carry.rfind(b"\n"), carry.rfind(b"\r"))
1312
+ if last < 0:
1313
+ if len(carry) >= _TUI_CARRY_MAX_BYTES:
1314
+ complete = bytes(carry)
1315
+ carry.clear()
1316
+ return complete
1317
+ return b""
1318
+ complete = bytes(carry[: last + 1])
1319
+ del carry[: last + 1]
1320
+ return complete
1321
+
1322
+
1238
1323
  def _run_claude_tui_session(
1239
1324
  *,
1240
1325
  command: Sequence[str],
@@ -1266,8 +1351,14 @@ def _run_claude_tui_session(
1266
1351
  next_transcript_check = start_monotonic + _CLAUDE_TUI_TRANSCRIPT_INTERVAL_S
1267
1352
  transcript_salvage = ""
1268
1353
  last_heartbeat = start_monotonic
1269
- last_cpu_sample = start_monotonic
1270
- last_ticks = 0
1354
+ # #188: GENUINE-progress heartbeat state. The kill clock (``last_heartbeat``)
1355
+ # is reset ONLY by reviewer progress — never by cosmetic PTY animation or
1356
+ # incidental CPU. ``seen_tui_lines`` accumulates de-animated visible lines so a
1357
+ # wedged TUI's finite animation vocabulary saturates and stops resetting it.
1358
+ seen_tui_lines: set[str] = set()
1359
+ tui_carry = bytearray() # #188 CR: trailing partial line held across os.read boundaries
1360
+ last_review_len = 0
1361
+ last_transcript_len = 0
1271
1362
  try:
1272
1363
  master_fd, slave_fd = pty.openpty()
1273
1364
  try:
@@ -1293,7 +1384,6 @@ def _run_claude_tui_session(
1293
1384
  os.close(master_fd)
1294
1385
  return 1, "", f"claude_tui_launch_error:{type(exc).__name__}"
1295
1386
 
1296
- last_ticks = group_cpu_ticks(proc.pid)
1297
1387
  try:
1298
1388
  while time.monotonic() < deadline:
1299
1389
  if master_fd is not None:
@@ -1305,7 +1395,17 @@ def _run_claude_tui_session(
1305
1395
  chunk = b""
1306
1396
  if chunk:
1307
1397
  terminal_bytes.extend(chunk)
1308
- last_heartbeat = time.monotonic() # PTY output = liveness
1398
+ # #188: a raw PTY chunk is a heartbeat ONLY if it carries
1399
+ # SUBSTANTIVE novel text. The TUI's animated "thinking"
1400
+ # status line (rotating verb + per-second timer) repaints
1401
+ # forever while wedged in ep_poll; de-animation maps it to
1402
+ # already-seen lines so it never resets the kill clock.
1403
+ # #188 CR: carry the trailing partial line across read
1404
+ # boundaries so a novel line split by ``os.read`` is scanned
1405
+ # WHOLE (only complete lines are evaluated).
1406
+ complete = _tui_take_complete_lines(tui_carry, chunk)
1407
+ if complete and _tui_chunk_has_novel_content(complete, seen_tui_lines):
1408
+ last_heartbeat = time.monotonic()
1309
1409
  else:
1310
1410
  # #48: PTY EOF — the child CLI and ALL its descendants closed
1311
1411
  # the slave side, so no further output can arrive. Without this
@@ -1341,11 +1441,20 @@ def _run_claude_tui_session(
1341
1441
  except OSError:
1342
1442
  return 1, "", "claude_tui_submit_failed"
1343
1443
  review_text = _read_review_output(output_file)
1444
+ # #188: canonical review OUTPUT growing is unambiguous reviewer progress.
1445
+ if len(review_text) > last_review_len:
1446
+ last_review_len = len(review_text)
1447
+ last_heartbeat = now
1344
1448
  if _completion_ok(review_text, mode):
1345
1449
  return 0, review_text, "claude_tui_file_output"
1346
1450
  if now >= next_transcript_check:
1347
1451
  next_transcript_check = now + _CLAUDE_TUI_TRANSCRIPT_INTERVAL_S
1348
1452
  transcript_text = _latest_claude_transcript_text(str(cwd), since=start_wall)
1453
+ # #188: the session transcript growing (tool calls, streamed
1454
+ # messages) is genuine progress even before a file verdict lands.
1455
+ if len(transcript_text) > last_transcript_len:
1456
+ last_transcript_len = len(transcript_text)
1457
+ last_heartbeat = now
1349
1458
  if _completion_ok(transcript_text, mode):
1350
1459
  transcript_salvage = transcript_text
1351
1460
  if proc.poll() is not None:
@@ -1355,14 +1464,13 @@ def _run_claude_tui_session(
1355
1464
  return 0, review_text, "claude_tui_file_output"
1356
1465
  detail = "claude_tui_missing_canonical_output"
1357
1466
  return proc.returncode or 1, review_text or transcript_text, detail
1358
- # secondary CPU heartbeat (never a kill; only extends life) + stall reclaim.
1359
- if now - last_cpu_sample >= _LEG_LIVENESS_CPU_SAMPLE_S:
1360
- last_cpu_sample = now
1361
- ticks = group_cpu_ticks(proc.pid)
1362
- if ticks > last_ticks:
1363
- last_heartbeat = now
1364
- last_ticks = ticks
1365
- # stall: PTY silent AND CPU-flat past the threshold while still running. The
1467
+ # #188: NO CPU heartbeat on the TUI path. Unlike the print-mode legs, a
1468
+ # Node CLI blocked in ep_poll still trickles libuv/GC CPU, so a CPU-advance
1469
+ # reset would keep a genuinely-wedged TUI alive forever (the ~2s-CPU/17-min
1470
+ # hang). Liveness here is reviewer progress ONLY (novel PTY text / output /
1471
+ # transcript growth above) — "process-alive" is deliberately NOT "leg-alive".
1472
+ #
1473
+ # stall: no GENUINE progress for the threshold while still running. The
1366
1474
  # canonical verdict is the review FILE (checked above); nothing to nudge for a
1367
1475
  # wedged TUI, so fail closed (rc forced non-zero, like the #48/deadline paths).
1368
1476
  if now - last_heartbeat >= _LEG_STALL_THRESHOLD_S:
@@ -1729,7 +1837,15 @@ def _exec_claude_tui_leg(
1729
1837
  mode=mode,
1730
1838
  backstop_s=backstop_s,
1731
1839
  )
1732
- return _classify_leg(rc, review_text, log_text, mode), review_text or log_text
1840
+ # #188: a heartbeat-reclaimed (genuinely wedged) TUI leg is a TYPED stalled leg,
1841
+ # not a bare ERROR — surface it as DEGRADED so the panel summary names the
1842
+ # liveness reclaim ("process alive but no reviewer heartbeat") while the three
1843
+ # completed seats are preserved. A leg that produced a conforming verdict before
1844
+ # the reclaim still classifies OK (unchanged).
1845
+ status = _classify_leg(rc, review_text, log_text, mode)
1846
+ if log_text == "claude_tui_stalled" and status != "OK":
1847
+ return "DEGRADED", review_text or "claude_tui_stalled: no reviewer heartbeat (liveness reclaim)"
1848
+ return status, review_text or log_text
1733
1849
 
1734
1850
 
1735
1851
  def _exec_claude_agent_view_attempt(
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from typing import Any
7
7
 
8
8
  from ..git_topology import collect_git_topology
9
- from ..runtime_paths import ensure_phase_loop_excluded, phase_loop_event_file
9
+ from ..events import append_payload
10
10
  from ..models import utc_now
11
11
  from .merge_policy import MergePolicy
12
12
 
@@ -21,12 +21,11 @@ def emit_ratification_passed(
21
21
  ratification_gate: str,
22
22
  merge_policy: MergePolicy,
23
23
  audit: dict[str, Any],
24
+ *,
25
+ roadmap_path: Path | None = None,
24
26
  ) -> None:
25
27
  repo = Path(repo_root)
26
28
  payload = _payload(repo, roadmap_version, phase_alias, ratification_gate, merge_policy, audit)
27
- ensure_phase_loop_excluded(repo)
28
- event_path = phase_loop_event_file(repo)
29
- event_path.parent.mkdir(parents=True, exist_ok=True)
30
29
  event = {
31
30
  "timestamp": utc_now(),
32
31
  "repo": str(repo),
@@ -40,8 +39,11 @@ def emit_ratification_passed(
40
39
  "payload": payload,
41
40
  "git_topology": collect_git_topology(repo),
42
41
  }
43
- with event_path.open("a", encoding="utf-8") as handle:
44
- handle.write(json.dumps(event, sort_keys=True) + "\n")
42
+ append_payload(
43
+ repo,
44
+ event,
45
+ roadmap=roadmap_path or repo / "specs" / f"phase-plans-{roadmap_version}.md",
46
+ )
45
47
 
46
48
  trigger = repo / TRIGGER_PATH
47
49
  trigger.parent.mkdir(parents=True, exist_ok=True)
@@ -0,0 +1,204 @@
1
+ from __future__ import annotations
2
+
3
+ import hashlib
4
+ import json
5
+ import os
6
+ import stat
7
+ from pathlib import Path
8
+
9
+
10
+ SCHEMA = "phase_loop_roadmap_authority.v1"
11
+ REQUIRED_MARKER = "phase_loop_roadmap_authority_required.v1\n"
12
+ LATCH_MARKER = "phase_loop_roadmap_authority_latched.v1\n"
13
+
14
+
15
+ class RoadmapAuthorityError(RuntimeError):
16
+ pass
17
+
18
+
19
+ def roadmap_authority_file(repo: Path) -> Path:
20
+ return _git_common_path(repo, "phase-loop-roadmap-authority.json")
21
+
22
+
23
+ def roadmap_authority_required_file(repo: Path) -> Path:
24
+ return _git_common_path(repo, "phase-loop-roadmap-authority-required")
25
+
26
+
27
+ def roadmap_authority_latch_file(repo: Path) -> Path:
28
+ return _git_common_path(repo, "phase-loop-roadmap-authority-latch")
29
+
30
+
31
+ def roadmap_authority_worktree_latch_file(repo: Path) -> Path:
32
+ return repo.resolve() / ".phase-loop" / "roadmap-authority-latch"
33
+
34
+
35
+ def _git_common_path(repo: Path, name: str) -> Path:
36
+ git_entry = repo.resolve() / ".git"
37
+ if git_entry.is_dir():
38
+ common = git_entry
39
+ elif git_entry.is_file():
40
+ try:
41
+ line = git_entry.read_text(encoding="utf-8").strip()
42
+ if not line.startswith("gitdir: "):
43
+ raise ValueError
44
+ git_dir = Path(line.removeprefix("gitdir: "))
45
+ git_dir = git_dir if git_dir.is_absolute() else (repo / git_dir).resolve()
46
+ commondir = git_dir / "commondir"
47
+ if commondir.exists():
48
+ common_value = commondir.read_text(encoding="utf-8").strip()
49
+ common_path = Path(common_value)
50
+ common = common_path if common_path.is_absolute() else (git_dir / common_path).resolve()
51
+ else:
52
+ common = git_dir
53
+ except (OSError, UnicodeDecodeError, ValueError) as error:
54
+ raise RoadmapAuthorityError("roadmap authority marker path unavailable") from error
55
+ else:
56
+ common = git_entry
57
+ return common / name
58
+
59
+
60
+ def active_authorized_roadmap(repo: Path) -> Path | None:
61
+ return assert_roadmap_authorized(repo, None)
62
+
63
+
64
+ def assert_roadmap_authorized(
65
+ repo: Path,
66
+ roadmap: str | Path | None,
67
+ ) -> Path | None:
68
+ root = repo.resolve()
69
+ authority_path = roadmap_authority_file(root)
70
+ if not authority_path.exists():
71
+ _require_authority_not_removed(root)
72
+ return _resolve_roadmap(root, roadmap) if roadmap is not None and str(roadmap).strip() else None
73
+ _require_authority_installed(root, authority_path)
74
+ authority = _read_authority(authority_path)
75
+ if authority["status"] != "active":
76
+ raise RoadmapAuthorityError("roadmap authority is blocked")
77
+ active = _bound_path(root, authority["active_roadmap"])
78
+ retired = {_bound_path(root, item["path"]): item for item in authority["retired_roadmaps"]}
79
+ for path, item in retired.items():
80
+ blob = _bound_common_blob(authority_path.parent, item["common_blob"])
81
+ _require_control_mode(blob, 0o400)
82
+ if not blob.is_file() or _sha256(blob) != item["sha256"]:
83
+ raise RoadmapAuthorityError(f"retired roadmap digest mismatch: {path}")
84
+ target = active if roadmap is None or str(roadmap).strip() == "" else _resolve_roadmap(root, roadmap)
85
+ if target in retired:
86
+ raise RoadmapAuthorityError(f"roadmap retired: {target}")
87
+ if target != active:
88
+ raise RoadmapAuthorityError(f"roadmap is not active: {target}")
89
+ if active.is_file():
90
+ if _sha256(active) != authority["active_roadmap_sha256"]:
91
+ raise RoadmapAuthorityError(f"roadmap authority digest mismatch: {active}")
92
+ else:
93
+ raise RoadmapAuthorityError(f"roadmap authority digest mismatch: {active}")
94
+ return target
95
+
96
+
97
+ def _read_authority(path: Path) -> dict:
98
+ try:
99
+ value = json.loads(path.read_text(encoding="utf-8"))
100
+ except (OSError, UnicodeDecodeError, json.JSONDecodeError) as error:
101
+ raise RoadmapAuthorityError(f"invalid roadmap authority: {path}") from error
102
+ if not isinstance(value, dict) or set(value) != {
103
+ "schema",
104
+ "status",
105
+ "active_roadmap",
106
+ "active_roadmap_sha256",
107
+ "retired_roadmaps",
108
+ }:
109
+ raise RoadmapAuthorityError(f"invalid roadmap authority schema: {path}")
110
+ if value["schema"] != SCHEMA or value["status"] not in {"blocked", "active"} or not _digest(value["active_roadmap_sha256"]):
111
+ raise RoadmapAuthorityError(f"invalid roadmap authority binding: {path}")
112
+ retired = value["retired_roadmaps"]
113
+ if not isinstance(retired, list):
114
+ raise RoadmapAuthorityError(f"invalid retired roadmap set: {path}")
115
+ seen: set[str] = set()
116
+ for item in retired:
117
+ if not isinstance(item, dict) or set(item) != {"path", "sha256", "common_blob"}:
118
+ raise RoadmapAuthorityError(f"invalid retired roadmap binding: {path}")
119
+ if not isinstance(item["path"], str) or item["path"] in seen or not _digest(item["sha256"]) or not isinstance(item["common_blob"], str) or not item["common_blob"]:
120
+ raise RoadmapAuthorityError(f"invalid retired roadmap binding: {path}")
121
+ seen.add(item["path"])
122
+ return value
123
+
124
+
125
+ def _require_authority_not_removed(repo: Path) -> None:
126
+ marker = roadmap_authority_required_file(repo)
127
+ latch = roadmap_authority_latch_file(repo)
128
+ worktree_latch = roadmap_authority_worktree_latch_file(repo)
129
+ if not marker.exists() and not latch.exists() and not worktree_latch.exists():
130
+ return
131
+ if worktree_latch.exists():
132
+ _read_control_file(worktree_latch, LATCH_MARKER, 0o400)
133
+ if latch.exists():
134
+ _read_control_file(latch, LATCH_MARKER, 0o400)
135
+ if marker.exists():
136
+ _read_control_file(marker, REQUIRED_MARKER, 0o400)
137
+ raise RoadmapAuthorityError("required roadmap authority is missing")
138
+
139
+
140
+ def _require_authority_installed(repo: Path, authority: Path) -> None:
141
+ _require_control_mode(authority, 0o600)
142
+ _read_control_file(roadmap_authority_worktree_latch_file(repo), LATCH_MARKER, 0o400)
143
+ _read_control_file(roadmap_authority_required_file(repo), REQUIRED_MARKER, 0o400)
144
+ _read_control_file(roadmap_authority_latch_file(repo), LATCH_MARKER, 0o400)
145
+
146
+
147
+ def _read_control_file(path: Path, expected: str, mode: int) -> None:
148
+ try:
149
+ value = path.read_text(encoding="utf-8")
150
+ except (OSError, UnicodeDecodeError) as error:
151
+ raise RoadmapAuthorityError("invalid roadmap authority required marker") from error
152
+ if value != expected:
153
+ raise RoadmapAuthorityError("invalid roadmap authority required marker")
154
+ _require_control_mode(path, mode)
155
+
156
+
157
+ def _require_control_mode(path: Path, mode: int) -> None:
158
+ try:
159
+ metadata = path.stat()
160
+ common_owner = path.parent.stat().st_uid
161
+ except OSError as error:
162
+ raise RoadmapAuthorityError("invalid roadmap authority control file") from error
163
+ if os.name == "nt":
164
+ return
165
+ if metadata.st_uid != common_owner or stat.S_IMODE(metadata.st_mode) != mode or metadata.st_uid != os.geteuid():
166
+ raise RoadmapAuthorityError("invalid roadmap authority control file")
167
+
168
+
169
+ def _resolve_roadmap(repo: Path, roadmap: str | Path | None) -> Path:
170
+ if roadmap is None or str(roadmap).strip() == "":
171
+ raise RoadmapAuthorityError("roadmap authority requires a roadmap path")
172
+ path = Path(roadmap).expanduser()
173
+ return (path if path.is_absolute() else repo / path).resolve()
174
+
175
+
176
+ def _bound_common_blob(common: Path, value: str) -> Path:
177
+ path = Path(value)
178
+ if path.is_absolute():
179
+ raise RoadmapAuthorityError("retired roadmap blob escapes git common directory")
180
+ resolved = (common / path).resolve()
181
+ try:
182
+ resolved.relative_to(common.resolve())
183
+ except ValueError as error:
184
+ raise RoadmapAuthorityError("retired roadmap blob escapes git common directory") from error
185
+ return resolved
186
+
187
+
188
+ def _bound_path(repo: Path, value: object) -> Path:
189
+ if not isinstance(value, str) or not value or Path(value).is_absolute():
190
+ raise RoadmapAuthorityError("roadmap authority paths must be repository-relative")
191
+ path = (repo / value).resolve()
192
+ try:
193
+ path.relative_to(repo)
194
+ except ValueError as error:
195
+ raise RoadmapAuthorityError("roadmap authority path escapes repository") from error
196
+ return path
197
+
198
+
199
+ def _sha256(path: Path) -> str:
200
+ return hashlib.sha256(path.read_bytes()).hexdigest()
201
+
202
+
203
+ def _digest(value: object) -> bool:
204
+ return isinstance(value, str) and len(value) == 64 and all(character in "0123456789abcdef" for character in value)