phase-loop-runtime 0.7.2__tar.gz → 0.7.3__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 (725) hide show
  1. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/PKG-INFO +1 -1
  2. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/pyproject.toml +1 -1
  3. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/__init__.py +1 -1
  4. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/cli.py +8 -0
  5. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/discovery.py +11 -5
  6. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/events.py +19 -6
  7. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/ratification.py +8 -6
  8. phase_loop_runtime-0.7.3/src/phase_loop_runtime/roadmap_authority.py +204 -0
  9. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/runner.py +7 -8
  10. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/state.py +2 -0
  11. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/task_message_broker_client.py +17 -6
  12. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/task_message_resolver.py +43 -12
  13. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
  14. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/SOURCES.txt +2 -0
  15. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_branchgov_preflight.py +37 -12
  16. phase_loop_runtime-0.7.3/tests/test_roadmap_authority.py +490 -0
  17. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_task_message_broker_cli.py +76 -2
  18. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_task_message_resolver.py +83 -0
  19. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/MANIFEST.in +0 -0
  20. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/README.md +0 -0
  21. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/protocol/protocol.md +0 -0
  22. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/setup.cfg +0 -0
  23. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  24. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  25. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  26. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  27. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  28. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  29. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  30. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  31. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  32. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  33. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  34. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  35. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  36. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  37. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_proc_cpu.py +0 -0
  38. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  39. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  40. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  41. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  42. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  43. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  44. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  45. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  46. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  47. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  48. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  49. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  50. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  51. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  52. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  53. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  54. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  55. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  56. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  57. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  58. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  59. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  60. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  61. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  62. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  63. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  64. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  65. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  66. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  67. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  68. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  69. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  70. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  71. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  72. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  73. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  74. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  75. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  76. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  77. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  78. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
  79. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  80. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  81. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  82. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
  83. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  84. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  85. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  86. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  87. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  88. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  89. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  90. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  91. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  92. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  93. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  94. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  95. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  96. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  97. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_modular.py +0 -0
  98. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  99. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  100. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  101. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  102. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  103. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  104. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  105. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  106. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/broker.py +0 -0
  107. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/build_bundle.py +0 -0
  108. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/capability_registry.py +0 -0
  109. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/classifier.py +0 -0
  110. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  111. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  112. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/closeout.py +0 -0
  113. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  114. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  115. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/closeout_validation.py +0 -0
  116. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/closeout_validators.py +0 -0
  117. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/__init__.py +0 -0
  118. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
  119. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
  120. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
  121. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
  122. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
  123. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
  124. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
  125. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
  126. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
  127. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
  128. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
  129. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
  130. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/consiliency_gates.py +0 -0
  131. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  132. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  133. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  134. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  135. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
  136. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
  137. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  138. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  139. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/docs_audit.py +0 -0
  140. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/docs_freshness.py +0 -0
  141. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  142. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/doctor.py +0 -0
  143. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  144. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/events_migration.py +0 -0
  145. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/evidence_audit.py +0 -0
  146. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  147. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/executor_availability.py +0 -0
  148. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/fleet_map.py +0 -0
  149. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  150. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  151. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/gate_posture.py +0 -0
  152. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/git_discipline.py +0 -0
  153. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/git_ops.py +0 -0
  154. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/git_topology.py +0 -0
  155. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/governed_bundle.py +0 -0
  156. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/governed_premerge.py +0 -0
  157. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/governed_review.py +0 -0
  158. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/handoff.py +0 -0
  159. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/handoff_path.py +0 -0
  160. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
  161. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/injection.py +0 -0
  162. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/install_status.py +0 -0
  163. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  164. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/launcher.py +0 -0
  165. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/lease_store.py +0 -0
  166. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/maintenance.py +0 -0
  167. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  168. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/models.py +0 -0
  169. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/observability.py +0 -0
  170. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/panel_invoker.py +0 -0
  171. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  172. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  173. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  174. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  175. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  176. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  177. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  178. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  179. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/plan_ir.py +0 -0
  180. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/plan_manifest.py +0 -0
  181. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/planner_validation.py +0 -0
  182. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/profiles.py +0 -0
  183. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/prompts.py +0 -0
  184. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/provenance.py +0 -0
  185. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/publishing.py +0 -0
  186. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/py.typed +0 -0
  187. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/ratification_policy.py +0 -0
  188. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/reconcile.py +0 -0
  189. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/redaction.py +0 -0
  190. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/reflection_sync.py +0 -0
  191. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/release_guard.py +0 -0
  192. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/render.py +0 -0
  193. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/repo_validation.py +0 -0
  194. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/review_summary.py +0 -0
  195. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  196. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/route_log.py +0 -0
  197. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  198. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  199. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/runtime_paths.py +0 -0
  200. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/runtime_projection.py +0 -0
  201. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/runtime_resources.py +0 -0
  202. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/schema_export.py +0 -0
  203. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
  204. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
  205. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  206. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skill_install.py +0 -0
  207. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skill_inventory.py +0 -0
  208. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skill_paths.py +0 -0
  209. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  210. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  211. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  212. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  213. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  214. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  215. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  216. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  217. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  218. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  219. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  220. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  221. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  222. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  223. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  224. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  225. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  226. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  227. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  228. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  229. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  230. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  231. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  232. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  233. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  234. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  235. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  236. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  237. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  238. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  239. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  240. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  241. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  242. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  243. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  244. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  245. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  246. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  247. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  248. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  249. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  250. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  251. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  252. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  253. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  254. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  255. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  256. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  257. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  258. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  259. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  260. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  261. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  262. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  263. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  264. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  265. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  266. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  267. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  268. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  269. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  270. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  271. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  272. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  273. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  274. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  275. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  276. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  277. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  278. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  279. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  280. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  281. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  282. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  283. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  284. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  285. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  286. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  287. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  288. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  289. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  290. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  291. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  292. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  293. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  294. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  295. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  296. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  297. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  298. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  299. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  300. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  301. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  302. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  303. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  304. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  305. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  306. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  307. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  308. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  309. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  310. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  311. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  312. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  313. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  314. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  315. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  316. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  317. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  318. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  319. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  320. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  321. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  322. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  323. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  324. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  325. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  326. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  327. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  328. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  329. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  330. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  331. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  332. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  333. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  334. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  335. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  336. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  337. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  338. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  339. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  340. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  341. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  342. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  343. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  344. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  345. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  346. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  347. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  348. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  349. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  350. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  351. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  352. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  353. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  354. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  355. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  356. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  357. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  358. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  359. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  360. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  361. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  362. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  363. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  364. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  365. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  366. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  367. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  368. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  369. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  370. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  371. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  372. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  373. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  374. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  375. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  376. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  377. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  378. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  379. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  380. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  381. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  382. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  383. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  384. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  385. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  386. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  387. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  388. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  389. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  390. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  391. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  392. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  393. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  394. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  395. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  396. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  397. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  398. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/state_degradation.py +0 -0
  399. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/state_ops.py +0 -0
  400. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/task_message_broker.py +0 -0
  401. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/train_ledger.py +0 -0
  402. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/train_roadmap.py +0 -0
  403. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/train_runner.py +0 -0
  404. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/verification_evidence.py +0 -0
  405. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  406. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  407. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/worker_pool.py +0 -0
  408. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime/worktree_index.py +0 -0
  409. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  410. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  411. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
  412. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  413. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_advisory_mode.py +0 -0
  414. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_alias_install.py +0 -0
  415. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_backcompat.py +0 -0
  416. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_backing_homebrew.py +0 -0
  417. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_backing_omnigent.py +0 -0
  418. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_cli_legacy.py +0 -0
  419. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_composition.py +0 -0
  420. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_concurrency.py +0 -0
  421. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_config.py +0 -0
  422. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_golden.py +0 -0
  423. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_ingestion.py +0 -0
  424. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_integration.py +0 -0
  425. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_matrix.py +0 -0
  426. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_observability.py +0 -0
  427. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_presets.py +0 -0
  428. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_registries.py +0 -0
  429. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_resolver.py +0 -0
  430. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_board_schema.py +0 -0
  431. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_advisor_twin_alias_legacy.py +0 -0
  432. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_agent_runtime_provider_cs08.py +0 -0
  433. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_autosel.py +0 -0
  434. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_certificate_tier.py +0 -0
  435. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_cli_train_status_45.py +0 -0
  436. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_break_glass_cli.py +0 -0
  437. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_classifier.py +0 -0
  438. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_convergence_fixes.py +0 -0
  439. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_exception_vocab.py +0 -0
  440. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_validator_hook.py +0 -0
  441. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_closeout_verification_gate.py +0 -0
  442. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_codex_effort_max_clamp_49.py +0 -0
  443. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_conformance_golden.py +0 -0
  444. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_consiliency_dual_layout.py +0 -0
  445. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_consiliency_gates.py +0 -0
  446. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_consiliency_ingest.py +0 -0
  447. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_consiliency_scaffold.py +0 -0
  448. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_coordinator_wave_loop.py +0 -0
  449. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_discovery_hygiene_legacy.py +0 -0
  450. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  451. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_dispatch_lock_helper.py +0 -0
  452. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_dispatch_lock_reentrancy.py +0 -0
  453. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  454. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_doc_delta_validator.py +0 -0
  455. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_docs_audit.py +0 -0
  456. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_docs_freshness.py +0 -0
  457. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_doctor_bom.py +0 -0
  458. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_dotfiles_tree.py +0 -0
  459. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_execgov.py +0 -0
  460. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_execreg_launch_registry.py +0 -0
  461. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_execute_phase_handoff_mode.py +0 -0
  462. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_execution_policy_tiering.py +0 -0
  463. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_executor_availability.py +0 -0
  464. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_export_schema.py +0 -0
  465. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_fleet_map.py +0 -0
  466. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_fleet_metrics.py +0 -0
  467. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_fleet_metrics_export.py +0 -0
  468. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_gate_a_wheel_isolation.py +0 -0
  469. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_gate_posture.py +0 -0
  470. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_git_discipline.py +0 -0
  471. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_git_grounded_projection.py +0 -0
  472. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_disjointness_model_first.py +0 -0
  473. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_e2e.py +0 -0
  474. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_gate_crfixes.py +0 -0
  475. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_planning_gate.py +0 -0
  476. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_premerge.py +0 -0
  477. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_premerge_live.py +0 -0
  478. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_governed_review.py +0 -0
  479. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_grokexec.py +0 -0
  480. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_hotfix_lane.py +0 -0
  481. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_injection_skill_failloud.py +0 -0
  482. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_lane_ir_override.py +0 -0
  483. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_launcher_liveness.py +0 -0
  484. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_launchspec_golden.py +0 -0
  485. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_lease_store.py +0 -0
  486. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_lease_store_conformance.py +0 -0
  487. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_ledger_serialization.py +0 -0
  488. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_leg_liveness_monitor.py +0 -0
  489. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_manifest_per_entry_164.py +0 -0
  490. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_model_class_policy.py +0 -0
  491. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_model_id_source_guard.py +0 -0
  492. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_observability_alerting.py +0 -0
  493. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_advisory.py +0 -0
  494. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_advisory_cli.py +0 -0
  495. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_advisory_fixtures.py +0 -0
  496. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_authority_boundary.py +0 -0
  497. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_contract_drift.py +0 -0
  498. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_contract_imports.py +0 -0
  499. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_contract_pin.py +0 -0
  500. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_core_api.py +0 -0
  501. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_provenance.py +0 -0
  502. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_real_ci.py +0 -0
  503. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_real_cli.py +0 -0
  504. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_real_output.py +0 -0
  505. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_real_runtime.py +0 -0
  506. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_redaction.py +0 -0
  507. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_release_surface.py +0 -0
  508. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_schema_validation.py +0 -0
  509. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_outside_agent_vectors.py +0 -0
  510. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_advisory_mode_63.py +0 -0
  511. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_context_refs_114.py +0 -0
  512. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_invoker.py +0 -0
  513. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_invoker_spawn.py +0 -0
  514. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_invoker_timeout_argv.py +0 -0
  515. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  516. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_native_fill_183.py +0 -0
  517. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_per_leg_model_66.py +0 -0
  518. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_streaming_verdicts.py +0 -0
  519. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_tui_eof_48.py +0 -0
  520. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_panel_verdict_summary.py +0 -0
  521. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_parallel_dispatch_backcompat.py +0 -0
  522. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_parallel_dispatch_cli.py +0 -0
  523. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_adoption_bundle.py +0 -0
  524. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  525. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_dependency.py +0 -0
  526. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  527. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_injection.py +0 -0
  528. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_modular.py +0 -0
  529. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  530. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  531. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_schema_export.py +0 -0
  532. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_baml_schema_source.py +0 -0
  533. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  534. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_break_glass_rerun.py +0 -0
  535. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_build_bundle.py +0 -0
  536. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_classifier.py +0 -0
  537. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  538. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  539. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  540. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  541. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_security.py +0 -0
  542. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  543. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  544. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  545. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_claude_route_selection.py +0 -0
  546. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_cli.py +0 -0
  547. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  548. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_control_only.py +0 -0
  549. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_event.py +0 -0
  550. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  551. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_hardening.py +0 -0
  552. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  553. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_schema.py +0 -0
  554. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_closeout_validation.py +0 -0
  555. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_collaborator_citation.py +0 -0
  556. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_collaborator_docs.py +0 -0
  557. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  558. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
  559. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  560. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  561. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  562. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_discovery.py +0 -0
  563. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_docs.py +0 -0
  564. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  565. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  566. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  567. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  568. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_downstream_portal.py +0 -0
  569. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  570. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_drift_audit.py +0 -0
  571. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
  572. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  573. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_events_migration.py +0 -0
  574. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_evidence_audit.py +0 -0
  575. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  576. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  577. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  578. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  579. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_execution_policy.py +0 -0
  580. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_executor_degradation.py +0 -0
  581. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_full_phase_mode.py +0 -0
  582. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_handoff.py +0 -0
  583. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_handoff_migration.py +0 -0
  584. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_init.py +0 -0
  585. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_injection.py +0 -0
  586. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_install_status.py +0 -0
  587. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
  588. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_lane_harnesses.py +0 -0
  589. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_lane_ir.py +0 -0
  590. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  591. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_lane_scheduler.py +0 -0
  592. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_launcher.py +0 -0
  593. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_ledger_debug.py +0 -0
  594. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_ledger_dedup.py +0 -0
  595. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_live_adapters.py +0 -0
  596. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_maintenance.py +0 -0
  597. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_metrics.py +0 -0
  598. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_migration_regressions.py +0 -0
  599. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  600. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  601. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  602. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_models.py +0 -0
  603. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_native_flags.py +0 -0
  604. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  605. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pi_executor.py +0 -0
  606. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  607. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  608. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  609. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  610. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  611. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_pipeline_mode.py +0 -0
  612. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  613. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_plan_manifest.py +0 -0
  614. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  615. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_planner_validation.py +0 -0
  616. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_policy.py +0 -0
  617. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_protocol_contract.py +0 -0
  618. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_provenance.py +0 -0
  619. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_reconcile.py +0 -0
  620. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  621. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  622. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  623. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_reducers.py +0 -0
  624. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
  625. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  626. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  627. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_roadmap_validate.py +0 -0
  628. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_rotation.py +0 -0
  629. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runner.py +0 -0
  630. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  631. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runtime_boundary.py +0 -0
  632. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runtime_decouple.py +0 -0
  633. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runtime_package_data.py +0 -0
  634. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_runtime_projection.py +0 -0
  635. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_schema_flow.py +0 -0
  636. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  637. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  638. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_contract.py +0 -0
  639. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  640. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_install.py +0 -0
  641. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  642. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_smoke_blockers.py +0 -0
  643. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  644. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_smoke_reentry.py +0 -0
  645. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  646. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  647. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  648. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_state.py +0 -0
  649. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  650. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  651. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  652. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  653. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  654. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v22_e2e.py +0 -0
  655. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v22_principles.py +0 -0
  656. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  657. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v45_reconcile.py +0 -0
  658. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v45_sched.py +0 -0
  659. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_v45_schedharden.py +0 -0
  660. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_wave_runner.py +0 -0
  661. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_work_unit_observability.py +0 -0
  662. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_work_unit_runner.py +0 -0
  663. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_work_unit_state.py +0 -0
  664. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_loop_worktrees.py +0 -0
  665. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  666. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_phase_worktree_executor.py +0 -0
  667. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  668. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  669. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  670. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_flag.py +0 -0
  671. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_markers.py +0 -0
  672. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  673. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  674. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  675. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  676. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  677. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pkg_layout_freeze.py +0 -0
  678. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_plan_ir_iter_waves.py +0 -0
  679. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_preflight_verification.py +0 -0
  680. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_proc_cpu.py +0 -0
  681. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_prune_merged_worktrees_script.py +0 -0
  682. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_publishing.py +0 -0
  683. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_pushflow.py +0 -0
  684. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_ratification_policy.py +0 -0
  685. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  686. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_reconcile_verification_log.py +0 -0
  687. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_reflection_sync.py +0 -0
  688. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_release_dispatch_operator_approval_145.py +0 -0
  689. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_release_pin_autotrack.py +0 -0
  690. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_repo_validation.py +0 -0
  691. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_review_leg_sandbox.py +0 -0
  692. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_review_summary.py +0 -0
  693. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_route_log.py +0 -0
  694. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_route_policy_conformance.py +0 -0
  695. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_routing_invariants.py +0 -0
  696. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_runtime_state_mirror_agreement.py +0 -0
  697. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_sibling_matcher_patterns.py +0 -0
  698. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skill_bundle_pinned.py +0 -0
  699. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skill_install_body_expansion.py +0 -0
  700. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skill_plan_manifest_write.py +0 -0
  701. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skill_sources_seam.py +0 -0
  702. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skills_bundle_drift.py +0 -0
  703. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skills_canon_parity.py +0 -0
  704. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_skills_src_claude_literal_lint.py +0 -0
  705. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_spec_conformance_gate.py +0 -0
  706. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_status_read_only_62.py +0 -0
  707. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_sweep_fleet_worktrees_script.py +0 -0
  708. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_sync_skills_apply_failloud.py +0 -0
  709. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_task_message_broker.py +0 -0
  710. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_e2e.py +0 -0
  711. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_invariants.py +0 -0
  712. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_merge.py +0 -0
  713. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_order_only_deps_47.py +0 -0
  714. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_roadmap.py +0 -0
  715. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_train_runner.py +0 -0
  716. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_unattended_release.py +0 -0
  717. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  718. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  719. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_verification_evidence.py +0 -0
  720. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_verification_evidence_validator.py +0 -0
  721. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_visual_evidence_validator.py +0 -0
  722. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_workerpool_failure_isolation.py +0 -0
  723. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_workerpool_parallel.py +0 -0
  724. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/tests/test_workerpool_worktree_alloc.py +0 -0
  725. {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.3}/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.3
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.3"
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.3"
@@ -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)
@@ -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)
@@ -68,6 +68,7 @@ from .closeout_evidence_audit import audit_closeout_evidence
68
68
  from .closeout import build_phase_loop_closeout, phase_loop_closeout_diagnostic
69
69
  from .consiliency_gates import scan_consiliency_gates
70
70
  from .docs_freshness import scan_docs_freshness
71
+ from .roadmap_authority import active_authorized_roadmap
71
72
  from .closeout_validation import validate_produced_gates
72
73
  from .discovery import (
73
74
  PLAN_RE,
@@ -101,7 +102,7 @@ from .discovery import (
101
102
  verification_commands_from_plan,
102
103
  )
103
104
  from .dispatch_lock import DispatchLock, DispatchLockContention
104
- from .events import append_event, event_path, read_events
105
+ from .events import append_event, append_payload, event_path, read_events
105
106
  from .fleet_metrics import record_phase_fleet_metrics
106
107
  from .evidence_audit import run_tier3_runner_audit
107
108
  from .evidence_audit_config import EvidenceAuditConfigError, load_evidence_audit_config
@@ -482,7 +483,7 @@ def _branchgov_orphan_blocker_before_dispatch(
482
483
  from .pipeline_adapter.branch_ops import roadmap_orphaned_by_branchgov
483
484
  from .pipeline_adapter.flag import branchgov_override_explicit
484
485
 
485
- if branchgov_override_explicit():
486
+ if branchgov_override_explicit() and active_authorized_roadmap(repo) is None:
486
487
  return None
487
488
 
488
489
  roadmap_version = _roadmap_version(roadmap)
@@ -686,6 +687,7 @@ def _emit_ratification_if_reached(
686
687
  ratification_gate,
687
688
  merge_policy,
688
689
  _ratification_audit_payload(child_automation),
690
+ roadmap_path=roadmap,
689
691
  )
690
692
  except Exception as exc:
691
693
  return {
@@ -1753,8 +1755,8 @@ def run_loop(
1753
1755
  provenance=branchgov_provenance,
1754
1756
  preflight="roadmap_orphan",
1755
1757
  next_action=(
1756
- "Push the roadmap to the pipeline-branch base, or pass "
1757
- "--allow-branchgov to switch anyway, before dispatch."
1758
+ "Push the roadmap to the pipeline-branch base before dispatch; "
1759
+ "authority-pinned roadmaps cannot be orphaned with --allow-branchgov."
1758
1760
  ),
1759
1761
  )
1760
1762
  return (_DispatchOutcome("break", None), None)
@@ -6127,8 +6129,6 @@ def _append_tier3_audit_event(
6127
6129
  reasoning_effort: str,
6128
6130
  source: str,
6129
6131
  ) -> None:
6130
- path = event_path(repo)
6131
- path.parent.mkdir(parents=True, exist_ok=True)
6132
6132
  payload = {
6133
6133
  "timestamp": utc_now(),
6134
6134
  "repo": str(repo),
@@ -6144,8 +6144,7 @@ def _append_tier3_audit_event(
6144
6144
  "schema_version": 2,
6145
6145
  **event_provenance(roadmap, phase),
6146
6146
  }
6147
- with path.open("a", encoding="utf-8") as handle:
6148
- handle.write(json.dumps(payload, sort_keys=True) + "\n")
6147
+ append_payload(repo, payload, roadmap=roadmap)
6149
6148
 
6150
6149
 
6151
6150
  def _attach_work_unit_metric(
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
 
8
8
  from .git_topology import attach_git_topology
9
9
  from .models import StateSnapshot, WorkUnitState, utc_now
10
+ from .roadmap_authority import assert_roadmap_authorized
10
11
  from .runtime_paths import ensure_phase_loop_excluded, phase_loop_state_file, phase_loop_state_read_file
11
12
 
12
13
 
@@ -19,6 +20,7 @@ def state_read_path(repo: Path) -> Path:
19
20
 
20
21
 
21
22
  def write_state(repo: Path, snapshot: StateSnapshot) -> None:
23
+ assert_roadmap_authorized(repo, snapshot.roadmap)
22
24
  ensure_phase_loop_excluded(repo)
23
25
  snapshot = attach_git_topology(repo, snapshot)
24
26
  path = state_path(repo)
@@ -8,7 +8,7 @@ import json
8
8
  import queue
9
9
  import re
10
10
  import threading
11
- from typing import BinaryIO, Callable
11
+ from typing import BinaryIO, Callable, Mapping
12
12
  from urllib.error import HTTPError, URLError
13
13
  from urllib.parse import urlsplit
14
14
  from urllib.request import HTTPRedirectHandler, Request, build_opener
@@ -16,7 +16,12 @@ from urllib.request import HTTPRedirectHandler, Request, build_opener
16
16
  import rfc8785
17
17
 
18
18
  from .task_message_broker import decode_strict_json
19
- from .task_message_resolver import APPROVAL_CONTRACT_VERSIONS, FAILURE_CODES, TaskMessageResolverError
19
+ from .task_message_resolver import (
20
+ APPROVAL_CONTRACT_VERSIONS,
21
+ FAILURE_CODES,
22
+ TaskMessageResolverError,
23
+ approval_source_identity,
24
+ )
20
25
 
21
26
 
22
27
  COMMIT_SHA = re.compile(r"[0-9a-f]{40}")
@@ -254,13 +259,19 @@ class TaskMessageBrokerClient:
254
259
  canonical = rfc8785.dumps(approval_document)
255
260
  except (TypeError, ValueError, json.JSONDecodeError):
256
261
  return False
262
+ source_identity = (
263
+ approval_source_identity(approval_document)
264
+ if isinstance(approval_document, dict)
265
+ else None
266
+ )
257
267
  return (
258
- isinstance(approval_document, dict)
268
+ isinstance(source_identity, Mapping)
259
269
  and approval_document.get("contract_version") in APPROVAL_CONTRACT_VERSIONS
260
270
  and approval_document.get("authorized") is True
261
- and approval_document.get("source_thread_id") == thread_id
262
- and approval_document.get("source_message_id") == message_id
263
- and approval_document.get("source_message_sha256") == hashlib.sha256(message_bytes).hexdigest()
271
+ and source_identity.get("source_thread_id") == thread_id
272
+ and source_identity.get("source_message_id") == message_id
273
+ and source_identity.get("source_message_sha256") == hashlib.sha256(message_bytes).hexdigest()
274
+ and source_identity.get("approval_message_id", f"{message_id}-approval") == f"{message_id}-approval"
264
275
  and hashlib.sha256(message_bytes).hexdigest() == payload["message_sha256"]
265
276
  and hashlib.sha256(approval_body_bytes).hexdigest() == payload["approval_body_sha256"]
266
277
  and hashlib.sha256(canonical).hexdigest() == payload["approval_canonical_sha256"]
@@ -25,10 +25,22 @@ FAILURE_CODES = frozenset(
25
25
  }
26
26
  )
27
27
  APPROVAL_CLIENT_ID_SUFFIX = "-approval"
28
- APPROVAL_CONTRACT_VERSIONS = frozenset({
28
+ TOP_LEVEL_SOURCE_CONTRACT_VERSIONS = frozenset({
29
29
  "embedding_provenance_deploy_approval.v2",
30
30
  "embedding_provenance_bootstrap_approval.v3",
31
31
  })
32
+ NESTED_SOURCE_CONTRACT_VERSIONS = frozenset({
33
+ "gpu0_unit_install_approval.v1",
34
+ "gpu0_prov_fence_approval.v1",
35
+ "gpu0_fence_fm_ack.v1",
36
+ })
37
+ APPROVAL_CONTRACT_VERSIONS = TOP_LEVEL_SOURCE_CONTRACT_VERSIONS | NESTED_SOURCE_CONTRACT_VERSIONS
38
+ SOURCE_IDENTITY_KEYS = frozenset({
39
+ "source_thread_id",
40
+ "source_message_id",
41
+ "source_message_sha256",
42
+ })
43
+ NESTED_SOURCE_IDENTITY_KEYS = SOURCE_IDENTITY_KEYS | {"approval_message_id"}
32
44
 
33
45
 
34
46
  def _decode_strict_json(value: bytes) -> Any:
@@ -50,6 +62,23 @@ def _decode_strict_json(value: bytes) -> Any:
50
62
  )
51
63
 
52
64
 
65
+ def approval_source_identity(approval: Mapping[str, Any]) -> Mapping[str, Any] | None:
66
+ """Select the exact source-identity location for a governed contract."""
67
+ contract_version = approval.get("contract_version")
68
+ if contract_version in TOP_LEVEL_SOURCE_CONTRACT_VERSIONS:
69
+ if "source" in approval or not SOURCE_IDENTITY_KEYS.issubset(approval):
70
+ return None
71
+ return approval
72
+ if contract_version not in NESTED_SOURCE_CONTRACT_VERSIONS:
73
+ return None
74
+ if any(key in approval for key in NESTED_SOURCE_IDENTITY_KEYS):
75
+ return None
76
+ source = approval.get("source")
77
+ if not isinstance(source, dict) or set(source) != NESTED_SOURCE_IDENTITY_KEYS:
78
+ return None
79
+ return source
80
+
81
+
53
82
  class TaskMessageResolverError(LookupError):
54
83
  """Fail-closed resolver result carrying only governed metadata."""
55
84
 
@@ -453,23 +482,25 @@ class CodexAppServerTaskMessageResolver:
453
482
  rfc8785.dumps(approval)
454
483
  except (TypeError, ValueError) as exc:
455
484
  raise self._error("approval_body_unavailable", thread_id, message_id) from exc
456
- required_claims = {
457
- "contract_version",
458
- "authorized",
459
- "source_thread_id",
460
- "source_message_id",
461
- "source_message_sha256",
462
- }
463
485
  if (
464
- not required_claims.issubset(approval)
465
- or not isinstance(approval.get("contract_version"), str)
486
+ not isinstance(approval.get("contract_version"), str)
466
487
  or approval.get("contract_version") not in APPROVAL_CONTRACT_VERSIONS
467
488
  or approval.get("authorized") is not True
468
489
  ):
469
490
  raise self._error("approval_body_unavailable", thread_id, message_id)
470
- if approval.get("source_thread_id") != thread_id or approval.get("source_message_id") != message_id:
491
+ source_identity = approval_source_identity(approval)
492
+ if source_identity is None:
493
+ raise self._error("approval_body_unavailable", thread_id, message_id)
494
+ if (
495
+ source_identity.get("source_thread_id") != thread_id
496
+ or source_identity.get("source_message_id") != message_id
497
+ or (
498
+ "approval_message_id" in source_identity
499
+ and source_identity.get("approval_message_id") != approval_message_id
500
+ )
501
+ ):
471
502
  raise self._error("source_identity_mismatch", thread_id, message_id)
472
- if approval.get("source_message_sha256") != hashlib.sha256(message_bytes).hexdigest():
503
+ if source_identity.get("source_message_sha256") != hashlib.sha256(message_bytes).hexdigest():
473
504
  raise self._error("attestation_invalid", thread_id, message_id)
474
505
 
475
506
  source_started_at = source_turn.get("startedAt")
@@ -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.3
4
4
  Summary: Harness-neutral phase-loop orchestration runtime and CLI
5
5
  Author: ViperJuice
6
6
  License-Expression: Apache-2.0
@@ -79,6 +79,7 @@ src/phase_loop_runtime/release_guard.py
79
79
  src/phase_loop_runtime/render.py
80
80
  src/phase_loop_runtime/repo_validation.py
81
81
  src/phase_loop_runtime/review_summary.py
82
+ src/phase_loop_runtime/roadmap_authority.py
82
83
  src/phase_loop_runtime/roadmap_lint.py
83
84
  src/phase_loop_runtime/route_log.py
84
85
  src/phase_loop_runtime/runner.py
@@ -684,6 +685,7 @@ tests/test_release_pin_autotrack.py
684
685
  tests/test_repo_validation.py
685
686
  tests/test_review_leg_sandbox.py
686
687
  tests/test_review_summary.py
688
+ tests/test_roadmap_authority.py
687
689
  tests/test_route_log.py
688
690
  tests/test_route_policy_conformance.py
689
691
  tests/test_routing_invariants.py