phase-loop-runtime 0.6.0__tar.gz → 0.6.2__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 (688) hide show
  1. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/PKG-INFO +2 -1
  2. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/pyproject.toml +7 -1
  3. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/__init__.py +1 -1
  4. phase_loop_runtime-0.6.2/src/phase_loop_runtime/_proc_cpu.py +57 -0
  5. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/cli.py +38 -0
  6. phase_loop_runtime-0.6.2/src/phase_loop_runtime/doctor.py +466 -0
  7. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/panel_invoker.py +277 -30
  8. phase_loop_runtime-0.6.2/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +79 -0
  9. phase_loop_runtime-0.6.2/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +95 -0
  10. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -1
  11. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/SOURCES.txt +9 -0
  12. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/requires.txt +1 -0
  13. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backing_homebrew.py +26 -37
  14. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_golden.py +18 -22
  15. phase_loop_runtime-0.6.2/tests/test_conformance_golden.py +387 -0
  16. phase_loop_runtime-0.6.2/tests/test_doctor_bom.py +198 -0
  17. phase_loop_runtime-0.6.2/tests/test_leg_liveness_monitor.py +180 -0
  18. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_advisory_mode_63.py +1 -1
  19. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_context_refs_114.py +8 -4
  20. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker_spawn.py +49 -34
  21. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker_timeout_argv.py +50 -18
  22. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_leg_auth_preflight_64.py +23 -18
  23. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_per_leg_model_66.py +13 -8
  24. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_decouple.py +34 -0
  25. phase_loop_runtime-0.6.2/tests/test_proc_cpu.py +45 -0
  26. phase_loop_runtime-0.6.2/tests/test_release_pin_autotrack.py +123 -0
  27. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/MANIFEST.in +0 -0
  28. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/README.md +0 -0
  29. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/protocol/protocol.md +0 -0
  30. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/setup.cfg +0 -0
  31. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  32. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  33. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  34. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  35. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  36. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  37. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  38. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  39. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  40. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  41. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  42. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  43. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  44. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  45. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  46. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  47. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  48. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  49. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  50. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  51. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  52. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  53. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  54. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  55. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  56. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  57. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  58. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  59. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  60. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  61. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  62. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  63. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  64. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  65. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  66. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  67. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  68. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  69. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  70. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  71. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  72. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  73. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  74. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  75. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  76. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  77. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  78. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  79. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  80. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  81. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  82. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  83. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  84. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  85. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
  86. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  87. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  88. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  89. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
  90. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  91. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  92. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  93. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  94. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  95. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  96. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  97. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  98. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  99. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  100. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  101. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  102. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  103. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  104. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_modular.py +0 -0
  105. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  106. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  107. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  108. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  109. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  110. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  111. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  112. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  113. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/broker.py +0 -0
  114. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/build_bundle.py +0 -0
  115. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/capability_registry.py +0 -0
  116. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/classifier.py +0 -0
  117. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  118. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  119. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout.py +0 -0
  120. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  121. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  122. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_validation.py +0 -0
  123. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/closeout_validators.py +0 -0
  124. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/__init__.py +0 -0
  125. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
  126. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
  127. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
  128. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
  129. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
  130. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
  131. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
  132. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
  133. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
  134. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
  135. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
  136. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
  137. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_gates.py +0 -0
  138. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  139. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  140. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  141. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  142. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/discovery.py +0 -0
  143. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  144. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  145. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_audit.py +0 -0
  146. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_freshness.py +0 -0
  147. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  148. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  149. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/events.py +0 -0
  150. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/events_migration.py +0 -0
  151. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/evidence_audit.py +0 -0
  152. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  153. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_map.py +0 -0
  154. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  155. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  156. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/gate_posture.py +0 -0
  157. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_discipline.py +0 -0
  158. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_ops.py +0 -0
  159. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/git_topology.py +0 -0
  160. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_bundle.py +0 -0
  161. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_premerge.py +0 -0
  162. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/governed_review.py +0 -0
  163. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/handoff.py +0 -0
  164. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/handoff_path.py +0 -0
  165. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/injection.py +0 -0
  166. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/install_status.py +0 -0
  167. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  168. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/launcher.py +0 -0
  169. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/lease_store.py +0 -0
  170. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/maintenance.py +0 -0
  171. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  172. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/models.py +0 -0
  173. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/observability.py +0 -0
  174. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  175. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  176. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  177. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  178. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  179. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  180. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  181. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
  182. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  183. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/plan_ir.py +0 -0
  184. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/plan_manifest.py +0 -0
  185. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/planner_validation.py +0 -0
  186. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/profiles.py +0 -0
  187. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/prompts.py +0 -0
  188. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/provenance.py +0 -0
  189. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/publishing.py +0 -0
  190. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/py.typed +0 -0
  191. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/reconcile.py +0 -0
  192. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/redaction.py +0 -0
  193. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/reflection_sync.py +0 -0
  194. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/release_guard.py +0 -0
  195. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/render.py +0 -0
  196. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/repo_validation.py +0 -0
  197. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/review_summary.py +0 -0
  198. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  199. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_log.py +0 -0
  200. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  201. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  202. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runner.py +0 -0
  203. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_paths.py +0 -0
  204. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_projection.py +0 -0
  205. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/runtime_resources.py +0 -0
  206. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/schema_export.py +0 -0
  207. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  208. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_install.py +0 -0
  209. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_inventory.py +0 -0
  210. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_paths.py +0 -0
  211. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  212. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  213. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  214. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  215. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  216. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  217. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  218. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  219. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  220. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  221. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  222. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  223. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  224. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  225. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  226. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  227. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  228. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  229. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  230. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  231. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  232. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  233. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  234. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  235. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  236. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  237. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  238. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  239. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  240. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  241. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  242. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  243. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  244. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  245. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  246. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  247. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  248. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  249. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  250. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  251. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  252. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  253. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  254. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  255. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  256. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  257. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  258. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  259. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  260. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  261. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  262. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  263. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  264. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  265. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  266. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  267. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  268. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  269. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  270. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  271. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  272. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  273. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  274. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  275. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  276. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  277. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  278. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  279. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  280. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  281. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  282. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  283. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  284. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  285. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  286. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  287. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  288. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  289. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  290. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  291. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  292. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  293. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  294. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  295. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  296. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  297. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  298. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  299. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  300. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  301. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  302. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  303. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  304. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  305. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  306. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  307. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  308. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  309. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  310. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  311. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  312. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  313. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  314. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  315. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  316. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  317. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  318. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  319. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  320. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  321. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  322. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  323. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  324. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  325. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  326. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  327. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  328. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  329. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  330. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  331. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  332. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  333. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  334. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  335. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  336. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  337. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  338. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  339. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  340. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  341. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  342. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  343. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  344. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  345. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  346. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  347. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  348. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  349. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  350. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  351. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  352. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  353. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  354. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  355. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  356. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  357. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  358. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  359. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  360. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  361. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  362. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  363. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  364. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  365. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  366. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  367. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
  368. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  369. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  370. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  371. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  372. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  373. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  374. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  375. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  376. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  377. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  378. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  379. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  380. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  381. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  382. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  383. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  384. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  385. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  386. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  387. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  388. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  389. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  390. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  391. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  392. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  393. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  394. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  395. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  396. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  397. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  398. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  399. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  400. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/state.py +0 -0
  401. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/state_degradation.py +0 -0
  402. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/state_ops.py +0 -0
  403. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_ledger.py +0 -0
  404. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_roadmap.py +0 -0
  405. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/train_runner.py +0 -0
  406. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/verification_evidence.py +0 -0
  407. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  408. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  409. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/worker_pool.py +0 -0
  410. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime/worktree_index.py +0 -0
  411. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  412. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  413. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  414. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_advisory_mode.py +0 -0
  415. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_alias_install.py +0 -0
  416. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backcompat.py +0 -0
  417. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_backing_omnigent.py +0 -0
  418. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_composition.py +0 -0
  419. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_concurrency.py +0 -0
  420. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_config.py +0 -0
  421. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_ingestion.py +0 -0
  422. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_integration.py +0 -0
  423. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_matrix.py +0 -0
  424. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_observability.py +0 -0
  425. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_presets.py +0 -0
  426. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_registries.py +0 -0
  427. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_resolver.py +0 -0
  428. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_advisor_board_schema.py +0 -0
  429. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_agent_runtime_provider_cs08.py +0 -0
  430. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_branchgov_preflight.py +0 -0
  431. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_certificate_tier.py +0 -0
  432. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_cli_train_status_45.py +0 -0
  433. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_break_glass_cli.py +0 -0
  434. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_classifier.py +0 -0
  435. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_convergence_fixes.py +0 -0
  436. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_exception_vocab.py +0 -0
  437. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_validator_hook.py +0 -0
  438. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_closeout_verification_gate.py +0 -0
  439. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_codex_effort_max_clamp_49.py +0 -0
  440. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_dual_layout.py +0 -0
  441. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_gates.py +0 -0
  442. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_ingest.py +0 -0
  443. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_consiliency_scaffold.py +0 -0
  444. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_coordinator_wave_loop.py +0 -0
  445. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  446. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_helper.py +0 -0
  447. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  448. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_doc_delta_validator.py +0 -0
  449. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_docs_audit.py +0 -0
  450. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_docs_freshness.py +0 -0
  451. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_dotfiles_tree.py +0 -0
  452. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_execute_phase_handoff_mode.py +0 -0
  453. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_execution_policy_tiering.py +0 -0
  454. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_export_schema.py +0 -0
  455. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_map.py +0 -0
  456. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_metrics.py +0 -0
  457. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_fleet_metrics_export.py +0 -0
  458. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_gate_a_wheel_isolation.py +0 -0
  459. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_gate_posture.py +0 -0
  460. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_git_discipline.py +0 -0
  461. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_git_grounded_projection.py +0 -0
  462. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_disjointness_model_first.py +0 -0
  463. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_e2e.py +0 -0
  464. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_gate_crfixes.py +0 -0
  465. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_planning_gate.py +0 -0
  466. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_premerge.py +0 -0
  467. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_premerge_live.py +0 -0
  468. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_governed_review.py +0 -0
  469. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_hotfix_lane.py +0 -0
  470. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_injection_skill_failloud.py +0 -0
  471. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lane_ir_override.py +0 -0
  472. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_launcher_liveness.py +0 -0
  473. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lease_store.py +0 -0
  474. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_lease_store_conformance.py +0 -0
  475. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_ledger_serialization.py +0 -0
  476. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_model_class_policy.py +0 -0
  477. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_model_id_source_guard.py +0 -0
  478. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_observability_alerting.py +0 -0
  479. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory.py +0 -0
  480. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory_cli.py +0 -0
  481. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_advisory_fixtures.py +0 -0
  482. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_authority_boundary.py +0 -0
  483. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_drift.py +0 -0
  484. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_imports.py +0 -0
  485. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_contract_pin.py +0 -0
  486. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_core_api.py +0 -0
  487. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_provenance.py +0 -0
  488. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_ci.py +0 -0
  489. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_cli.py +0 -0
  490. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_output.py +0 -0
  491. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_real_runtime.py +0 -0
  492. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_redaction.py +0 -0
  493. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_release_surface.py +0 -0
  494. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_schema_validation.py +0 -0
  495. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_outside_agent_vectors.py +0 -0
  496. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_invoker.py +0 -0
  497. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_tui_eof_48.py +0 -0
  498. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_panel_verdict_summary.py +0 -0
  499. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_parallel_dispatch_backcompat.py +0 -0
  500. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_parallel_dispatch_cli.py +0 -0
  501. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_adoption_bundle.py +0 -0
  502. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  503. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_dependency.py +0 -0
  504. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  505. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_injection.py +0 -0
  506. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_modular.py +0 -0
  507. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  508. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  509. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_schema_export.py +0 -0
  510. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_baml_schema_source.py +0 -0
  511. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  512. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_build_bundle.py +0 -0
  513. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_classifier.py +0 -0
  514. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  515. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  516. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  517. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  518. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_security.py +0 -0
  519. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  520. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  521. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  522. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_claude_route_selection.py +0 -0
  523. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_cli.py +0 -0
  524. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  525. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_control_only.py +0 -0
  526. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_event.py +0 -0
  527. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  528. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_hardening.py +0 -0
  529. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  530. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_schema.py +0 -0
  531. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_closeout_validation.py +0 -0
  532. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_citation.py +0 -0
  533. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_docs.py +0 -0
  534. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  535. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  536. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  537. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  538. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_discovery.py +0 -0
  539. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_docs.py +0 -0
  540. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  541. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  542. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  543. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  544. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_portal.py +0 -0
  545. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  546. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_drift_audit.py +0 -0
  547. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  548. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_events_migration.py +0 -0
  549. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit.py +0 -0
  550. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  551. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  552. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  553. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  554. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_execution_policy.py +0 -0
  555. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_executor_degradation.py +0 -0
  556. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_full_phase_mode.py +0 -0
  557. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_handoff.py +0 -0
  558. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_handoff_migration.py +0 -0
  559. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_init.py +0 -0
  560. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_injection.py +0 -0
  561. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_install_status.py +0 -0
  562. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_harnesses.py +0 -0
  563. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_ir.py +0 -0
  564. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  565. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_lane_scheduler.py +0 -0
  566. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_launcher.py +0 -0
  567. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_ledger_debug.py +0 -0
  568. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_ledger_dedup.py +0 -0
  569. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_live_adapters.py +0 -0
  570. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_maintenance.py +0 -0
  571. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_metrics.py +0 -0
  572. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_migration_regressions.py +0 -0
  573. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  574. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  575. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  576. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_models.py +0 -0
  577. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_native_flags.py +0 -0
  578. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  579. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pi_executor.py +0 -0
  580. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  581. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  582. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  583. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  584. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  585. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_pipeline_mode.py +0 -0
  586. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  587. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_plan_manifest.py +0 -0
  588. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  589. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_planner_validation.py +0 -0
  590. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_policy.py +0 -0
  591. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_protocol_contract.py +0 -0
  592. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_provenance.py +0 -0
  593. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile.py +0 -0
  594. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  595. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  596. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  597. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_reducers.py +0 -0
  598. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  599. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  600. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_roadmap_validate.py +0 -0
  601. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_rotation.py +0 -0
  602. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runner.py +0 -0
  603. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  604. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_boundary.py +0 -0
  605. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_package_data.py +0 -0
  606. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_runtime_projection.py +0 -0
  607. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_schema_flow.py +0 -0
  608. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  609. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  610. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_contract.py +0 -0
  611. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  612. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_install.py +0 -0
  613. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  614. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_blockers.py +0 -0
  615. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  616. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_smoke_reentry.py +0 -0
  617. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  618. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  619. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  620. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_state.py +0 -0
  621. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  622. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  623. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  624. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  625. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  626. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v22_e2e.py +0 -0
  627. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v22_principles.py +0 -0
  628. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  629. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_reconcile.py +0 -0
  630. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_sched.py +0 -0
  631. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_v45_schedharden.py +0 -0
  632. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_wave_runner.py +0 -0
  633. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_observability.py +0 -0
  634. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_runner.py +0 -0
  635. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_work_unit_state.py +0 -0
  636. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_loop_worktrees.py +0 -0
  637. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  638. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_phase_worktree_executor.py +0 -0
  639. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  640. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  641. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  642. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_flag.py +0 -0
  643. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_markers.py +0 -0
  644. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  645. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  646. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  647. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  648. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  649. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_pkg_layout_freeze.py +0 -0
  650. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_plan_ir_iter_waves.py +0 -0
  651. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_preflight_verification.py +0 -0
  652. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_prune_merged_worktrees_script.py +0 -0
  653. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_publishing.py +0 -0
  654. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  655. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reconcile_verification_log.py +0 -0
  656. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_reflection_sync.py +0 -0
  657. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_repo_validation.py +0 -0
  658. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_review_summary.py +0 -0
  659. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_route_log.py +0 -0
  660. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_route_policy_conformance.py +0 -0
  661. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_routing_invariants.py +0 -0
  662. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_runtime_state_mirror_agreement.py +0 -0
  663. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sibling_matcher_patterns.py +0 -0
  664. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_bundle_pinned.py +0 -0
  665. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_install_body_expansion.py +0 -0
  666. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_plan_manifest_write.py +0 -0
  667. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skill_sources_seam.py +0 -0
  668. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_bundle_drift.py +0 -0
  669. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_canon_parity.py +0 -0
  670. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_skills_src_claude_literal_lint.py +0 -0
  671. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_spec_conformance_gate.py +0 -0
  672. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sweep_fleet_worktrees_script.py +0 -0
  673. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_sync_skills_apply_failloud.py +0 -0
  674. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_e2e.py +0 -0
  675. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_invariants.py +0 -0
  676. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_merge.py +0 -0
  677. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_order_only_deps_47.py +0 -0
  678. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_roadmap.py +0 -0
  679. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_train_runner.py +0 -0
  680. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  681. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  682. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_verification_evidence.py +0 -0
  683. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_verification_evidence_validator.py +0 -0
  684. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_visual_evidence_validator.py +0 -0
  685. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_failure_isolation.py +0 -0
  686. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_parallel.py +0 -0
  687. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/tests/test_workerpool_worktree_alloc.py +0 -0
  688. {phase_loop_runtime-0.6.0 → phase_loop_runtime-0.6.2}/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.6.0
3
+ Version: 0.6.2
4
4
  Summary: Harness-neutral phase-loop orchestration runtime and CLI
5
5
  Author: ViperJuice
6
6
  License-Expression: Apache-2.0
@@ -20,6 +20,7 @@ Requires-Dist: pydantic<3,>=2
20
20
  Requires-Dist: PyYAML<7,>=6
21
21
  Requires-Dist: consiliency-contract<0.7,>=0.6.5
22
22
  Requires-Dist: jsonschema<5,>=4
23
+ Requires-Dist: packaging>=21
23
24
  Requires-Dist: tomli<3,>=2; python_version < "3.11"
24
25
 
25
26
  # phase-loop-runtime
@@ -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.6.0"
7
+ version = "0.6.2"
8
8
  description = "Harness-neutral phase-loop orchestration runtime and CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -44,6 +44,12 @@ dependencies = [
44
44
  # guarantees the contract-owned vocabulary (incl. governance_contracts) is live.
45
45
  "consiliency-contract>=0.6.5,<0.7",
46
46
  "jsonschema>=4,<5",
47
+ # `phase-loop doctor` (IF-0-AHADOPT-2) compares consumer pins to registry
48
+ # latest with PEP 440 version ordering. Declared so the BOM produces real
49
+ # stale|current verdicts on the isolated `uv tool install` path (where pip —
50
+ # and its transitive packaging — is not present); the doctor still degrades to
51
+ # `unknown` rather than crash if it is somehow absent.
52
+ "packaging>=21",
47
53
  # Advisor Board config loader (ABDREG) parses advisor-boards.toml. tomllib is
48
54
  # stdlib on 3.11+; on the 3.10 requires-python floor it is absent, so pull in
49
55
  # the tomli backport there (import shim in advisor_board/config.py).
@@ -18,4 +18,4 @@ __all__ = [
18
18
  "state_ops",
19
19
  ]
20
20
 
21
- __version__ = "0.6.0"
21
+ __version__ = "0.6.2"
@@ -0,0 +1,57 @@
1
+ """Process-group CPU sampling for the leg-liveness monitor.
2
+
3
+ A panel leg is launched with ``start_new_session=True``, so its process-group id
4
+ (pgid) equals the leader pid and every descendant it spawns inherits that pgid.
5
+ ``group_cpu_ticks(leader_pid)`` therefore sums CPU (utime+stime) across the whole
6
+ leg — leader and all children — which is the heartbeat signal for a leg that is
7
+ *thinking silently* (codex/grok in print mode emit no incremental stdout, then
8
+ write their ``--output-last-message`` file at the end; a thinking process burns
9
+ CPU, a wedged one does not).
10
+
11
+ Linux-only via ``/proc``. On any other platform (or a missing ``/proc``) it
12
+ returns 0, so the runner degrades to a stdout-only heartbeat — still correct: a
13
+ streaming leg heartbeats on stdout, and a silent-AND-idle leg is genuinely dead.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import os
18
+
19
+
20
+ def _pgrp_and_ticks(pid: int) -> tuple[int, int]:
21
+ """Return ``(process_group_id, utime+stime)`` for ``pid`` from /proc/<pid>/stat.
22
+
23
+ The ``comm`` field (2nd) is wrapped in parens and may itself contain spaces or
24
+ parens, so parse the fixed fields AFTER the last ``)``: from there field 3
25
+ (state) is index 0, so pgrp (field 5) = index 2, utime (14) = index 11, and
26
+ stime (15) = index 12.
27
+ """
28
+ with open(f"/proc/{pid}/stat", encoding="ascii", errors="replace") as fh:
29
+ data = fh.read()
30
+ after = data[data.rfind(")") + 2 :].split()
31
+ pgrp = int(after[2])
32
+ return pgrp, int(after[11]) + int(after[12])
33
+
34
+
35
+ def group_cpu_ticks(leader_pid: int) -> int:
36
+ """Sum CPU ticks (utime+stime) across every process in ``leader_pid``'s group.
37
+
38
+ Returns 0 when ``/proc`` is unavailable (non-Linux) or nothing matches — the
39
+ caller treats 0-delta as "no CPU heartbeat", which combined with the stdout
40
+ heartbeat still catches a genuinely wedged leg and never false-kills a
41
+ streaming one.
42
+ """
43
+ total = 0
44
+ try:
45
+ entries = os.listdir("/proc")
46
+ except OSError:
47
+ return 0
48
+ for entry in entries:
49
+ if not entry.isdigit():
50
+ continue
51
+ try:
52
+ pgrp, ticks = _pgrp_and_ticks(int(entry))
53
+ except (OSError, ValueError, IndexError):
54
+ continue # process exited mid-scan, or an unreadable/odd stat line
55
+ if pgrp == leader_pid:
56
+ total += ticks
57
+ return total
@@ -640,6 +640,31 @@ def build_parser() -> argparse.ArgumentParser:
640
640
  choices=repo_validation.ALL_TARGET_TOKENS,
641
641
  help="One of: fast, gate, full, fix, affected, doctor (check == doctor).",
642
642
  )
643
+ # doctor: the front-door adoptability report (IF-0-AHADOPT-2). A NEW top-level
644
+ # command and strict SUPERSET of `repo-validate doctor` — it adds the two
645
+ # install surfaces and the multi-registry BOM, emitting the checked-in
646
+ # `phase-loop-doctor.v1` schema. Own --json/--fail-on-stale/--bom-fixture so
647
+ # they can follow the subcommand (`phase-loop doctor --json`); reuses the
648
+ # top-level --repo.
649
+ doctor_sub = subparsers.add_parser(
650
+ "doctor",
651
+ help=(
652
+ "Adoptability report: which tools/CLIs are installed+authed and what "
653
+ "each unlocks, across BOTH install surfaces, plus a pin-vs-registry "
654
+ "BOM (npm+PyPI) with stale|current|unknown verdicts."
655
+ ),
656
+ )
657
+ doctor_sub.add_argument("--json", action="store_true", help="Emit the phase-loop-doctor.v1 payload as JSON.")
658
+ doctor_sub.add_argument(
659
+ "--fail-on-stale",
660
+ action="store_true",
661
+ help="Exit non-zero if any GATING (repo-owned) BOM target is stale.",
662
+ )
663
+ doctor_sub.add_argument(
664
+ "--bom-fixture",
665
+ metavar="PATH",
666
+ help="Load the BOM from a fixture JSON instead of live registries (CI/test wiring).",
667
+ )
643
668
  # train-status: non-mutating inspection of the cross-repo train ledger (#45).
644
669
  # Reads the SAME default ledger path as run-train; opens no PRs, writes nothing.
645
670
  train_status_sub = subparsers.add_parser(
@@ -756,6 +781,19 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
756
781
  cwd=args.repo or ".",
757
782
  as_json=bool(getattr(args, "json", False)),
758
783
  )
784
+ if command == "doctor":
785
+ # DECOUPLE SL-1: lazy import keeps the doctor module (and its reuse of
786
+ # repo_validation / install_status) off the bare `import cli` graph, and
787
+ # the doctor graph itself pulls NO dotfiles-domain module.
788
+ from . import doctor as _doctor
789
+
790
+ fixture = getattr(args, "bom_fixture", None)
791
+ return _doctor.run_doctor(
792
+ repo=Path(args.repo or "."),
793
+ as_json=bool(getattr(args, "json", False)),
794
+ fail_on_stale=bool(getattr(args, "fail_on_stale", False)),
795
+ bom_fixture=Path(fixture) if fixture else None,
796
+ )
759
797
  if command == "export-schema":
760
798
  return _export_schema_command(args=args)
761
799
  if command == "validate-roadmap":
@@ -0,0 +1,466 @@
1
+ """``phase-loop doctor`` — front-door adoptability report (IF-0-AHADOPT-2).
2
+
3
+ A NEW top-level command and a strict SUPERSET of ``repo-validate doctor``. It
4
+ REUSES the seed *patterns* — ``repo_validation.doctor_report()`` (tool/stack
5
+ probe) and ``install_status.build_install_status()`` (per-harness skill surface)
6
+ — and adds two things they lack:
7
+
8
+ 1. **Install surfaces**, both of them: the wheel-bundled-skills path
9
+ (``phase-loop run`` with no dotfiles) and the interactive-harness path
10
+ (skills copied into ``~/.claude/skills`` &c.).
11
+ 2. A **multi-registry BOM** (Bill of Materials): named consumer pins compared to
12
+ the *live* npm + PyPI registry latest, each with a ``stale|current|unknown``
13
+ verdict. The BOM degrades to ``unknown`` — never fails — when a registry is
14
+ unreachable, and ``--fail-on-stale`` exits non-zero only on a ``stale`` verdict
15
+ among the **gating** (repo-owned) targets.
16
+
17
+ DECOUPLE SL-1: this module pulls NO dotfiles-domain module
18
+ (``adoption_bundle`` / ``build_bundle`` / ``sync-skills``). It emits the checked-in
19
+ ``phase-loop-doctor.v1`` schema and is metadata-only (no absolute paths).
20
+ """
21
+ from __future__ import annotations
22
+
23
+ import json
24
+ import re
25
+ import shutil
26
+ import sys
27
+ import urllib.request
28
+ from pathlib import Path
29
+ from typing import Any, Callable, Optional
30
+
31
+ from . import repo_validation
32
+ from .install_status import _assert_redacted, build_install_status
33
+
34
+ SCHEMA_ID = "phase-loop-doctor.v1"
35
+
36
+ # A fetcher maps a URL to the response body (str) or None on ANY failure — the
37
+ # offline-degrade seam and the injection point for the offline mock-registry test.
38
+ Fetcher = Callable[[str], Optional[str]]
39
+
40
+ # `phase-loop doctor` is a strict SUPERSET of `repo-validate doctor`: it probes
41
+ # every tool `repo_validation.doctor_report()` does (unlocks labels below) and
42
+ # ADDS the executor CLIs, and it folds doctor_report's `stack_hints` +
43
+ # `declared_contracts` into the payload. `_CORE_TOOL_UNLOCKS` labels the
44
+ # doctor_report tool set; unknown names fall back to the bare name.
45
+ _CORE_TOOL_UNLOCKS: dict[str, str] = {
46
+ "git": "version control",
47
+ "just": "just task runner (repo agent:* contracts)",
48
+ "dagger": "dagger CI pipelines",
49
+ "docker": "docker compose self-host (DEPLOY)",
50
+ "node": "node / npx (governed-pipeline, DEPLOY)",
51
+ "pnpm": "pnpm package install",
52
+ "npm": "npm / npx package install",
53
+ "yarn": "yarn package install",
54
+ "bun": "bun runtime / package install",
55
+ "uv": "uv tool install (primitive install path)",
56
+ "python3": "python runtime",
57
+ "cargo": "cargo (rust builds)",
58
+ }
59
+
60
+ # Executor CLIs added on top of the repo-validate tool set; `authed` is meaningful.
61
+ _EXECUTORS: tuple[tuple[str, str], ...] = (
62
+ ("codex", "codex executor leg"),
63
+ ("claude", "claude executor leg"),
64
+ ("gemini", "gemini executor leg"),
65
+ ("opencode", "opencode executor leg"),
66
+ ("pi", "pi executor leg"),
67
+ )
68
+
69
+ # Best-effort auth heuristics: credential-file presence per executor CLI. Only a
70
+ # BOOLEAN is emitted (never a path), so the payload stays metadata-only.
71
+ _AUTH_HINTS: dict[str, tuple[str, ...]] = {
72
+ "codex": ("~/.codex/auth.json",),
73
+ "claude": ("~/.claude/.credentials.json", "~/.claude.json"),
74
+ "gemini": ("~/.gemini/oauth_creds.json", "~/.gemini/antigravity/auth.json"),
75
+ "opencode": ("~/.local/share/opencode/auth.json",),
76
+ "pi": ("~/.pi/agent/auth.json",),
77
+ }
78
+
79
+
80
+ # --------------------------------------------------------------------------- #
81
+ # registry access (offline-degrading)
82
+ # --------------------------------------------------------------------------- #
83
+ def _default_fetch(url: str, timeout: float = 10.0) -> Optional[str]:
84
+ try:
85
+ with urllib.request.urlopen(url, timeout=timeout) as resp: # noqa: S310 (fixed hosts)
86
+ return resp.read().decode("utf-8")
87
+ except Exception:
88
+ # Any failure (network down, 404, timeout) => None => verdict "unknown".
89
+ return None
90
+
91
+
92
+ def _pypi_latest(name: str, fetch: Fetcher) -> Optional[str]:
93
+ body = fetch(f"https://pypi.org/pypi/{name}/json")
94
+ if not body:
95
+ return None
96
+ try:
97
+ return str(json.loads(body)["info"]["version"])
98
+ except Exception:
99
+ return None
100
+
101
+
102
+ def _npm_latest(name: str, fetch: Fetcher) -> Optional[str]:
103
+ body = fetch(f"https://registry.npmjs.org/{name.replace('/', '%2f')}")
104
+ if not body:
105
+ return None
106
+ try:
107
+ return str(json.loads(body)["dist-tags"]["latest"])
108
+ except Exception:
109
+ return None
110
+
111
+
112
+ def _verdict(pinned: Optional[str], latest: Optional[str]) -> str:
113
+ if not pinned or not latest:
114
+ return "unknown"
115
+ try:
116
+ from packaging.version import Version
117
+
118
+ return "stale" if Version(latest) > Version(pinned) else "current"
119
+ except Exception:
120
+ return "unknown"
121
+
122
+
123
+ def _entry(
124
+ target: str,
125
+ ecosystem: str,
126
+ pinned: Optional[str],
127
+ latest: Optional[str],
128
+ *,
129
+ gating: bool,
130
+ note: str,
131
+ ) -> dict[str, Any]:
132
+ return {
133
+ "target": target,
134
+ "ecosystem": ecosystem,
135
+ "pinned": pinned,
136
+ "latest": latest,
137
+ "verdict": _verdict(pinned, latest),
138
+ "gating": gating,
139
+ "note": note,
140
+ }
141
+
142
+
143
+ # --------------------------------------------------------------------------- #
144
+ # local pin resolution (all degrade to None when the source is not reachable)
145
+ # --------------------------------------------------------------------------- #
146
+ def _find_up(start: Path, name: str) -> Optional[Path]:
147
+ start = start.resolve()
148
+ for parent in (start, *start.parents):
149
+ candidate = parent / name
150
+ if candidate.exists():
151
+ return candidate
152
+ return None
153
+
154
+
155
+ # Version-shape guard: local pin sources feed the payload, so validate they look
156
+ # like a version (v?X.Y[.Z...]) and drop anything else to None — keeps arbitrary
157
+ # file content out of the metadata-only BOM (defense beyond the redactor prefixes).
158
+ _VERSION_RE = re.compile(r"v?\d+(?:\.\d+)+[0-9A-Za-z.\-]*")
159
+
160
+
161
+ def _as_version(raw: Optional[str]) -> Optional[str]:
162
+ if not raw:
163
+ return None
164
+ raw = raw.strip()
165
+ if not _VERSION_RE.fullmatch(raw):
166
+ return None
167
+ return raw[1:] if raw.startswith("v") else raw
168
+
169
+
170
+ def _release_pin(repo: Path) -> Optional[str]:
171
+ pin_file = _find_up(repo, "RELEASE_PIN")
172
+ if pin_file is None:
173
+ return None
174
+ return _as_version(pin_file.read_text(encoding="utf-8"))
175
+
176
+
177
+ def _contract_floor(repo: Path) -> Optional[str]:
178
+ """The `consiliency-contract>=X` floor from phase-loop-runtime/pyproject.toml."""
179
+ for rel in ("pyproject.toml", "phase-loop-runtime/pyproject.toml"):
180
+ pyproj = _find_up(repo, rel) if "/" not in rel else (repo / rel)
181
+ if pyproj is None or not pyproj.is_file():
182
+ continue
183
+ try:
184
+ try:
185
+ import tomllib
186
+ except ModuleNotFoundError: # py<3.11
187
+ import tomli as tomllib # type: ignore[no-redef]
188
+ deps = tomllib.loads(pyproj.read_text(encoding="utf-8"))["project"]["dependencies"]
189
+ except Exception:
190
+ continue
191
+ for dep in deps:
192
+ if dep.replace(" ", "").startswith("consiliency-contract>="):
193
+ floor = dep.split(">=", 1)[1]
194
+ return floor.split(",", 1)[0].strip()
195
+ return None
196
+
197
+
198
+ def _vendored_contract_version(repo: Path) -> Optional[str]:
199
+ """The vendored `@consiliency/contract` version from .consiliency/manifest.json."""
200
+ manifest = _find_up(repo, ".consiliency/manifest.json")
201
+ if manifest is None:
202
+ return None
203
+ try:
204
+ data = json.loads(manifest.read_text(encoding="utf-8"))
205
+ except Exception:
206
+ return None
207
+ version = data.get("contract_version") or data.get("adoption", {}).get("contract_version")
208
+ return _as_version(str(version)) if version else None
209
+
210
+
211
+ # --------------------------------------------------------------------------- #
212
+ # BOM
213
+ # --------------------------------------------------------------------------- #
214
+ def build_bom(repo: Path, *, fetch: Optional[Fetcher] = None) -> list[dict[str, Any]]:
215
+ """The named multi-registry BOM inventory v1.
216
+
217
+ GATING (repo-owned, `--fail-on-stale` acts on these): the PyPI
218
+ ``consiliency-contract`` floor and the install-script auto-track pin. The
219
+ vendored npm mirrors and the mac-skills ref are REPORTED but not gated — their
220
+ currency is owned by other repos'/vendoring processes, so failing this repo's
221
+ doctor on their drift would be noise (it is surfaced, not enforced here).
222
+ """
223
+ fetch = fetch or _default_fetch
224
+ return [
225
+ _entry(
226
+ "consiliency-contract",
227
+ "pypi",
228
+ _contract_floor(repo),
229
+ _pypi_latest("consiliency-contract", fetch),
230
+ gating=True,
231
+ note="phase-loop-runtime dependency floor",
232
+ ),
233
+ _entry(
234
+ "install-agent-harness.sh ref",
235
+ "pypi(phase-loop-runtime)",
236
+ _release_pin(repo),
237
+ _pypi_latest("phase-loop-runtime", fetch),
238
+ gating=True,
239
+ note="auto-track install pin (RELEASE_PIN vs published runtime)",
240
+ ),
241
+ _entry(
242
+ "@consiliency/contract",
243
+ "npm",
244
+ _vendored_contract_version(repo),
245
+ _npm_latest("@consiliency/contract", fetch),
246
+ gating=False,
247
+ note="vendored contract (owned by consiliency-ingest; reported, not gated)",
248
+ ),
249
+ _entry(
250
+ "@consiliency/canon-core",
251
+ "npm",
252
+ None,
253
+ _npm_latest("@consiliency/canon-core", fetch),
254
+ gating=False,
255
+ note="no local pin in the primitive; reported for visibility",
256
+ ),
257
+ _entry(
258
+ "mac-skills ref",
259
+ "dotfiles",
260
+ None,
261
+ None,
262
+ gating=False,
263
+ note="owned by dotfiles; not resolvable from the decoupled primitive",
264
+ ),
265
+ ]
266
+
267
+
268
+ def stale_gating_targets(bom: list[dict[str, Any]]) -> list[dict[str, Any]]:
269
+ return [e for e in bom if e.get("gating") and e.get("verdict") == "stale"]
270
+
271
+
272
+ # --------------------------------------------------------------------------- #
273
+ # tools + install surfaces
274
+ # --------------------------------------------------------------------------- #
275
+ def _cli_authed(name: str, present: bool) -> Optional[bool]:
276
+ if not present:
277
+ return None
278
+ for hint in _AUTH_HINTS.get(name, ()): # boolean only — never the path
279
+ if Path(hint).expanduser().exists():
280
+ return True
281
+ return False
282
+
283
+
284
+ def _tools_report(core_tools: dict[str, Optional[str]]) -> list[dict[str, Any]]:
285
+ """Union of the repo-validate tool probe (converted to booleans — the raw
286
+ values are absolute `shutil.which` paths, forbidden by the metadata-only
287
+ redactor) and the executor CLIs."""
288
+ out: list[dict[str, Any]] = []
289
+ for name, path in core_tools.items():
290
+ out.append(
291
+ {
292
+ "name": name,
293
+ "present": path is not None,
294
+ "authed": None,
295
+ "unlocks": _CORE_TOOL_UNLOCKS.get(name, name),
296
+ }
297
+ )
298
+ for name, unlocks in _EXECUTORS:
299
+ present = shutil.which(name) is not None
300
+ out.append(
301
+ {
302
+ "name": name,
303
+ "present": present,
304
+ "authed": _cli_authed(name, present),
305
+ "unlocks": unlocks,
306
+ }
307
+ )
308
+ return out
309
+
310
+
311
+ def _wheel_bundled_surface() -> dict[str, Any]:
312
+ try:
313
+ from importlib.resources import files
314
+
315
+ bundle = files("phase_loop_runtime") / "skills_bundle"
316
+ status = "present" if bundle.is_dir() else "missing"
317
+ except Exception:
318
+ status = "unknown"
319
+ return {
320
+ "surface": "wheel-bundled-skills",
321
+ "status": status,
322
+ "unlocks": "phase-loop run / dry-run with no dotfiles",
323
+ }
324
+
325
+
326
+ def _interactive_surfaces(repo: Path) -> list[dict[str, Any]]:
327
+ surfaces: list[dict[str, Any]] = []
328
+ try:
329
+ status = build_install_status(repo)
330
+ except Exception:
331
+ return surfaces
332
+ for record in status.get("harnesses", ()):
333
+ root = record.get("root_status")
334
+ parity = record.get("skill_parity")
335
+ if root == "missing":
336
+ verdict = "missing"
337
+ elif parity == "complete":
338
+ verdict = "present"
339
+ else:
340
+ verdict = "partial"
341
+ surfaces.append(
342
+ {
343
+ "surface": "interactive-harness-skills",
344
+ "harness": record.get("harness"),
345
+ "status": verdict,
346
+ }
347
+ )
348
+ return surfaces
349
+
350
+
351
+ # --------------------------------------------------------------------------- #
352
+ # assembly
353
+ # --------------------------------------------------------------------------- #
354
+ def _summary(tools: list[dict[str, Any]], bom: list[dict[str, Any]]) -> str:
355
+ present = sum(1 for t in tools if t["present"])
356
+ current = sum(1 for e in bom if e["verdict"] == "current")
357
+ stale = sum(1 for e in bom if e["verdict"] == "stale")
358
+ unknown = sum(1 for e in bom if e["verdict"] == "unknown")
359
+ gating_stale = len(stale_gating_targets(bom))
360
+ return (
361
+ f"{present}/{len(tools)} tools present; "
362
+ f"BOM {current} current / {stale} stale / {unknown} unknown "
363
+ f"({gating_stale} gating-stale)"
364
+ )
365
+
366
+
367
+ def build_doctor_report(
368
+ repo: Path,
369
+ *,
370
+ fetch: Optional[Fetcher] = None,
371
+ bom_fixture: Optional[Path] = None,
372
+ ) -> dict[str, Any]:
373
+ # Strict superset of `repo-validate doctor`: resolve the same root and reuse
374
+ # its probe. `repo_validation` pulls no dotfiles-domain module (asserted by the
375
+ # decouple test), so this stays on the decoupled import graph.
376
+ root = repo_validation.find_repo_root(repo) or repo
377
+ rv = repo_validation.doctor_report(root)
378
+ tools = _tools_report(rv["tools"]) # type: ignore[arg-type]
379
+ surfaces = [_wheel_bundled_surface(), *_interactive_surfaces(repo)]
380
+ if bom_fixture is not None:
381
+ bom = _load_bom_fixture(bom_fixture)
382
+ else:
383
+ bom = build_bom(root, fetch=fetch)
384
+ report = {
385
+ "schema": SCHEMA_ID,
386
+ "summary": _summary(tools, bom),
387
+ "tools": tools,
388
+ # From repo_validation.doctor_report (superset). Metadata-only: filenames
389
+ # and target/runner strings. `repo_root` is intentionally OMITTED — it is
390
+ # an absolute path, which the metadata-only redactor forbids.
391
+ "stack_hints": list(rv["stack_hints"]), # type: ignore[arg-type]
392
+ "declared_contracts": list(rv["declared_contracts"]), # type: ignore[arg-type]
393
+ "install_surfaces": surfaces,
394
+ "bom": bom,
395
+ }
396
+ # Metadata-only guarantee: no absolute paths, no secrets. Reuses the same
397
+ # redaction contract as phase-loop-install-status.v1.
398
+ _assert_redacted(report)
399
+ return report
400
+
401
+
402
+ def _load_bom_fixture(path: Path) -> list[dict[str, Any]]:
403
+ data = json.loads(Path(path).read_text(encoding="utf-8"))
404
+ if isinstance(data, dict) and "bom" in data:
405
+ data = data["bom"]
406
+ if not isinstance(data, list):
407
+ raise ValueError(f"BOM fixture {path} must be a list or {{'bom': [...]}}")
408
+ return data
409
+
410
+
411
+ def _print_doctor(report: dict[str, Any]) -> None:
412
+ print("phase-loop doctor")
413
+ print(f" {report['summary']}")
414
+ print("")
415
+ print("Tools:")
416
+ for tool in report["tools"]:
417
+ authed = tool["authed"]
418
+ auth_str = "" if authed is None else (" authed" if authed else " NOT authed")
419
+ state = "present" if tool["present"] else "missing"
420
+ print(f" {tool['name']:<10} {state}{auth_str} → {tool['unlocks']}")
421
+ print("")
422
+ print("Repo stack hints:")
423
+ for hint in report.get("stack_hints", []):
424
+ print(f" {hint}")
425
+ print("Declared agent contracts:")
426
+ contracts = report.get("declared_contracts", [])
427
+ if contracts:
428
+ for entry in contracts:
429
+ print(f" {entry['target']:<12} {entry['runner']}")
430
+ else:
431
+ print(" none")
432
+ print("")
433
+ print("Install surfaces:")
434
+ for surface in report["install_surfaces"]:
435
+ harness = f" [{surface['harness']}]" if surface.get("harness") else ""
436
+ print(f" {surface['surface']}{harness}: {surface['status']}")
437
+ print("")
438
+ print("BOM (pin vs registry latest):")
439
+ for entry in report["bom"]:
440
+ gate = "gating" if entry["gating"] else "report"
441
+ print(
442
+ f" [{entry['verdict']:<7}] {entry['target']:<32} "
443
+ f"pinned={entry['pinned']} latest={entry['latest']} ({entry['ecosystem']}, {gate})"
444
+ )
445
+
446
+
447
+ def run_doctor(
448
+ *,
449
+ repo: Path,
450
+ as_json: bool,
451
+ fail_on_stale: bool,
452
+ bom_fixture: Optional[Path],
453
+ ) -> int:
454
+ report = build_doctor_report(repo, bom_fixture=bom_fixture)
455
+ if as_json:
456
+ print(json.dumps(report, indent=2))
457
+ else:
458
+ _print_doctor(report)
459
+ if fail_on_stale:
460
+ stale = stale_gating_targets(report["bom"])
461
+ if stale:
462
+ names = ", ".join(e["target"] for e in stale)
463
+ # To stderr so `--json` stdout stays pure, machine-parseable JSON.
464
+ print(f"FAIL: stale gating BOM target(s): {names}", file=sys.stderr, flush=True)
465
+ return 1
466
+ return 0