phase-loop-runtime 0.2.0__tar.gz → 0.3.0__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 (637) hide show
  1. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/PKG-INFO +2 -2
  2. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/pyproject.toml +12 -7
  3. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/__init__.py +1 -1
  4. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +69 -0
  5. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_gates.py +170 -11
  6. phase_loop_runtime-0.3.0/src/phase_loop_runtime/gate_posture.py +135 -0
  7. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/panel_invoker.py +226 -8
  8. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +11 -3
  9. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +11 -3
  10. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +11 -3
  11. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +11 -3
  12. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +11 -3
  13. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +11 -3
  14. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +11 -3
  15. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +11 -3
  16. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
  17. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/SOURCES.txt +5 -0
  18. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/requires.txt +1 -1
  19. phase_loop_runtime-0.3.0/tests/test_advisor_board_advisory_mode.py +177 -0
  20. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backcompat.py +6 -4
  21. phase_loop_runtime-0.3.0/tests/test_advisor_board_ingestion.py +249 -0
  22. phase_loop_runtime-0.3.0/tests/test_gate_posture.py +113 -0
  23. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_git_discipline.py +14 -6
  24. phase_loop_runtime-0.3.0/tests/test_spec_conformance_gate.py +202 -0
  25. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/MANIFEST.in +0 -0
  26. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/README.md +0 -0
  27. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/protocol/protocol.md +0 -0
  28. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/setup.cfg +0 -0
  29. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  30. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  31. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  32. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  33. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  34. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  35. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  36. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  37. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  38. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  39. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  40. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  41. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  42. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  43. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  44. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  45. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  46. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  47. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  48. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  49. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  50. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  51. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  52. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  53. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  54. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  55. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
  56. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
  57. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
  58. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
  59. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  60. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
  61. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
  62. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  63. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  64. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  65. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  66. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  67. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
  68. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  69. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
  70. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
  71. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  72. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  73. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  74. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  75. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  76. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  77. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  78. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  79. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
  80. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
  81. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
  82. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  83. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  84. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  85. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  86. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  87. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  88. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  89. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  90. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  91. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  92. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  93. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  94. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  95. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  96. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  97. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  98. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  99. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  100. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_modular.py +0 -0
  101. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  102. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  103. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  104. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  105. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  106. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  107. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  108. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  109. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/broker.py +0 -0
  110. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/build_bundle.py +0 -0
  111. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/capability_registry.py +0 -0
  112. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/classifier.py +0 -0
  113. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  114. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  115. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cli.py +0 -0
  116. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout.py +0 -0
  117. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  118. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  119. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validation.py +0 -0
  120. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validators.py +0 -0
  121. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  122. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  123. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  124. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  125. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/discovery.py +0 -0
  126. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  127. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  128. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_audit.py +0 -0
  129. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_freshness.py +0 -0
  130. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  131. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  132. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events.py +0 -0
  133. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events_migration.py +0 -0
  134. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit.py +0 -0
  135. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  136. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_map.py +0 -0
  137. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  138. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  139. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_discipline.py +0 -0
  140. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_ops.py +0 -0
  141. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_topology.py +0 -0
  142. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_bundle.py +0 -0
  143. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_premerge.py +0 -0
  144. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_review.py +0 -0
  145. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff.py +0 -0
  146. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff_path.py +0 -0
  147. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/injection.py +0 -0
  148. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/install_status.py +0 -0
  149. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  150. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/launcher.py +0 -0
  151. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lease_store.py +0 -0
  152. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/maintenance.py +0 -0
  153. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  154. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/models.py +0 -0
  155. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/observability.py +0 -0
  156. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  157. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  158. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  159. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  160. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  161. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  162. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  163. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
  164. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  165. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_ir.py +0 -0
  166. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_manifest.py +0 -0
  167. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/planner_validation.py +0 -0
  168. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/profiles.py +0 -0
  169. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/prompts.py +0 -0
  170. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/provenance.py +0 -0
  171. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/publishing.py +0 -0
  172. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/py.typed +0 -0
  173. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reconcile.py +0 -0
  174. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/redaction.py +0 -0
  175. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reflection_sync.py +0 -0
  176. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/release_guard.py +0 -0
  177. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/render.py +0 -0
  178. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/repo_validation.py +0 -0
  179. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/review_summary.py +0 -0
  180. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  181. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_log.py +0 -0
  182. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  183. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  184. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runner.py +0 -0
  185. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_paths.py +0 -0
  186. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_projection.py +0 -0
  187. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_resources.py +0 -0
  188. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schema_export.py +0 -0
  189. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  190. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_install.py +0 -0
  191. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_inventory.py +0 -0
  192. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_paths.py +0 -0
  193. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  194. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  195. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  196. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  197. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  198. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  199. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  200. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  201. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  202. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  203. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  204. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  205. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  206. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  207. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  208. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  209. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  210. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  211. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  212. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  213. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  214. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  215. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  216. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  217. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  218. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  219. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  220. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  221. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  222. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  223. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  224. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  225. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  226. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  227. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  228. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  229. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  230. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  231. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  232. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  233. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  234. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  235. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  236. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  237. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  238. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  239. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  240. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  241. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  242. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  243. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  244. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  245. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  246. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  247. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  248. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  249. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  250. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  251. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  252. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  253. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  254. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  255. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  256. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  257. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  258. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  259. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  260. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  261. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  262. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  263. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  264. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  265. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  266. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  267. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  268. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  269. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  270. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  271. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  272. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  273. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  274. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  275. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  276. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  277. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  278. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  279. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  280. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  281. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  282. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  283. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  284. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  285. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  286. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  287. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  288. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  289. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  290. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  291. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  292. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  293. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  294. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  295. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  296. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  297. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  298. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  299. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  300. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  301. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  302. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  303. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  304. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  305. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  306. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  307. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  308. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  309. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  310. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  311. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  312. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  313. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  314. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  315. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  316. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  317. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  318. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  319. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  320. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  321. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  322. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  323. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  324. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  325. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  326. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  327. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  328. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  329. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  330. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  331. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  332. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  333. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  334. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  335. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  336. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  337. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  338. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  339. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  340. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  341. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  342. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  343. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  344. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  345. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  346. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  347. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  348. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  349. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  350. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  351. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  352. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  353. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  354. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  355. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  356. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  357. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  358. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  359. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  360. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  361. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  362. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  363. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  364. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  365. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  366. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  367. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  368. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  369. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  370. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state.py +0 -0
  371. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_degradation.py +0 -0
  372. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_ops.py +0 -0
  373. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_ledger.py +0 -0
  374. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_roadmap.py +0 -0
  375. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_runner.py +0 -0
  376. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence.py +0 -0
  377. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  378. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  379. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worker_pool.py +0 -0
  380. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worktree_index.py +0 -0
  381. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  382. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  383. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  384. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_alias_install.py +0 -0
  385. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_homebrew.py +0 -0
  386. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_omnigent.py +0 -0
  387. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_concurrency.py +0 -0
  388. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_config.py +0 -0
  389. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_golden.py +0 -0
  390. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_integration.py +0 -0
  391. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_matrix.py +0 -0
  392. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_observability.py +0 -0
  393. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_presets.py +0 -0
  394. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_registries.py +0 -0
  395. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_resolver.py +0 -0
  396. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_schema.py +0 -0
  397. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_agent_runtime_provider_cs08.py +0 -0
  398. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_branchgov_preflight.py +0 -0
  399. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_cli_train_status_45.py +0 -0
  400. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_break_glass_cli.py +0 -0
  401. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_classifier.py +0 -0
  402. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_convergence_fixes.py +0 -0
  403. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_exception_vocab.py +0 -0
  404. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_validator_hook.py +0 -0
  405. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_verification_gate.py +0 -0
  406. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_codex_effort_max_clamp_49.py +0 -0
  407. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_dual_layout.py +0 -0
  408. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_gates.py +0 -0
  409. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_ingest.py +0 -0
  410. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_scaffold.py +0 -0
  411. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_coordinator_wave_loop.py +0 -0
  412. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  413. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_helper.py +0 -0
  414. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  415. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_doc_delta_validator.py +0 -0
  416. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_docs_audit.py +0 -0
  417. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_docs_freshness.py +0 -0
  418. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dotfiles_tree.py +0 -0
  419. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_execute_phase_handoff_mode.py +0 -0
  420. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_execution_policy_tiering.py +0 -0
  421. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_export_schema.py +0 -0
  422. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_map.py +0 -0
  423. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics.py +0 -0
  424. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics_export.py +0 -0
  425. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_gate_a_wheel_isolation.py +0 -0
  426. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_disjointness_model_first.py +0 -0
  427. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_e2e.py +0 -0
  428. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_gate_crfixes.py +0 -0
  429. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_planning_gate.py +0 -0
  430. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge.py +0 -0
  431. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge_live.py +0 -0
  432. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_review.py +0 -0
  433. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_hotfix_lane.py +0 -0
  434. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_injection_skill_failloud.py +0 -0
  435. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lane_ir_override.py +0 -0
  436. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_launcher_liveness.py +0 -0
  437. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lease_store.py +0 -0
  438. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lease_store_conformance.py +0 -0
  439. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_ledger_serialization.py +0 -0
  440. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_model_class_policy.py +0 -0
  441. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_observability_alerting.py +0 -0
  442. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_advisory_mode_63.py +0 -0
  443. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker.py +0 -0
  444. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_spawn.py +0 -0
  445. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_timeout_argv.py +0 -0
  446. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  447. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_per_leg_model_66.py +0 -0
  448. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_tui_eof_48.py +0 -0
  449. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_verdict_summary.py +0 -0
  450. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_backcompat.py +0 -0
  451. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_cli.py +0 -0
  452. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle.py +0 -0
  453. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  454. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_dependency.py +0 -0
  455. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  456. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_injection.py +0 -0
  457. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_modular.py +0 -0
  458. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  459. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  460. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_export.py +0 -0
  461. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_source.py +0 -0
  462. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  463. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_build_bundle.py +0 -0
  464. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_classifier.py +0 -0
  465. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  466. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  467. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  468. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  469. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_security.py +0 -0
  470. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  471. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  472. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  473. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_route_selection.py +0 -0
  474. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli.py +0 -0
  475. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  476. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_control_only.py +0 -0
  477. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_event.py +0 -0
  478. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  479. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_hardening.py +0 -0
  480. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  481. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_schema.py +0 -0
  482. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_validation.py +0 -0
  483. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_citation.py +0 -0
  484. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_docs.py +0 -0
  485. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  486. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  487. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
  488. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
  489. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_discovery.py +0 -0
  490. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_docs.py +0 -0
  491. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  492. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  493. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  494. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  495. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_portal.py +0 -0
  496. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  497. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_drift_audit.py +0 -0
  498. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  499. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_events_migration.py +0 -0
  500. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit.py +0 -0
  501. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  502. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  503. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  504. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  505. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_execution_policy.py +0 -0
  506. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_executor_degradation.py +0 -0
  507. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_full_phase_mode.py +0 -0
  508. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff.py +0 -0
  509. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff_migration.py +0 -0
  510. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_init.py +0 -0
  511. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_injection.py +0 -0
  512. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_install_status.py +0 -0
  513. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_harnesses.py +0 -0
  514. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir.py +0 -0
  515. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  516. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_scheduler.py +0 -0
  517. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_launcher.py +0 -0
  518. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_debug.py +0 -0
  519. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_dedup.py +0 -0
  520. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_live_adapters.py +0 -0
  521. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_maintenance.py +0 -0
  522. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_metrics.py +0 -0
  523. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_migration_regressions.py +0 -0
  524. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  525. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  526. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  527. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_models.py +0 -0
  528. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_native_flags.py +0 -0
  529. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  530. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pi_executor.py +0 -0
  531. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  532. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  533. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  534. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  535. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  536. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_mode.py +0 -0
  537. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  538. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_manifest.py +0 -0
  539. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  540. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_validation.py +0 -0
  541. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_policy.py +0 -0
  542. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_protocol_contract.py +0 -0
  543. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_provenance.py +0 -0
  544. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile.py +0 -0
  545. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  546. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  547. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  548. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reducers.py +0 -0
  549. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  550. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  551. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_validate.py +0 -0
  552. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_rotation.py +0 -0
  553. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner.py +0 -0
  554. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  555. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_boundary.py +0 -0
  556. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_decouple.py +0 -0
  557. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_package_data.py +0 -0
  558. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_projection.py +0 -0
  559. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_schema_flow.py +0 -0
  560. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  561. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  562. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_contract.py +0 -0
  563. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  564. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_install.py +0 -0
  565. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  566. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_blockers.py +0 -0
  567. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  568. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_reentry.py +0 -0
  569. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  570. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  571. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
  572. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_state.py +0 -0
  573. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  574. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  575. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  576. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  577. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  578. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_e2e.py +0 -0
  579. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_principles.py +0 -0
  580. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  581. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_reconcile.py +0 -0
  582. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_sched.py +0 -0
  583. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_schedharden.py +0 -0
  584. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_wave_runner.py +0 -0
  585. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_observability.py +0 -0
  586. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_runner.py +0 -0
  587. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_state.py +0 -0
  588. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_worktrees.py +0 -0
  589. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  590. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_worktree_executor.py +0 -0
  591. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  592. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  593. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  594. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_flag.py +0 -0
  595. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_markers.py +0 -0
  596. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  597. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  598. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  599. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  600. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  601. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pkg_layout_freeze.py +0 -0
  602. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_plan_ir_iter_waves.py +0 -0
  603. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_preflight_verification.py +0 -0
  604. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_publishing.py +0 -0
  605. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  606. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reconcile_verification_log.py +0 -0
  607. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reflection_sync.py +0 -0
  608. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_repo_validation.py +0 -0
  609. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_review_summary.py +0 -0
  610. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_route_log.py +0 -0
  611. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_route_policy_conformance.py +0 -0
  612. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_routing_invariants.py +0 -0
  613. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_runtime_state_mirror_agreement.py +0 -0
  614. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_sibling_matcher_patterns.py +0 -0
  615. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_bundle_pinned.py +0 -0
  616. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_install_body_expansion.py +0 -0
  617. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_plan_manifest_write.py +0 -0
  618. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_sources_seam.py +0 -0
  619. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_bundle_drift.py +0 -0
  620. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_canon_parity.py +0 -0
  621. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_src_claude_literal_lint.py +0 -0
  622. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_sync_skills_apply_failloud.py +0 -0
  623. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_e2e.py +0 -0
  624. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_invariants.py +0 -0
  625. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_merge.py +0 -0
  626. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_order_only_deps_47.py +0 -0
  627. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_roadmap.py +0 -0
  628. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_runner.py +0 -0
  629. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  630. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  631. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence.py +0 -0
  632. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence_validator.py +0 -0
  633. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_visual_evidence_validator.py +0 -0
  634. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_failure_isolation.py +0 -0
  635. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_parallel.py +0 -0
  636. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_worktree_alloc.py +0 -0
  637. {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/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.2.0
3
+ Version: 0.3.0
4
4
  Summary: Harness-neutral phase-loop orchestration runtime and CLI
5
5
  Author: ViperJuice
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,7 @@ Description-Content-Type: text/markdown
18
18
  Requires-Dist: baml-py<0.223,>=0.222
19
19
  Requires-Dist: pydantic<3,>=2
20
20
  Requires-Dist: PyYAML<7,>=6
21
- Requires-Dist: consiliency-contract<0.5.0,>=0.3.0
21
+ Requires-Dist: consiliency-contract<0.7,>=0.6.3
22
22
  Requires-Dist: jsonschema<5,>=4
23
23
  Requires-Dist: tomli<3,>=2; python_version < "3.11"
24
24
 
@@ -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.2.0"
7
+ version = "0.3.0"
8
8
  description = "Harness-neutral phase-loop orchestration runtime and CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -22,12 +22,17 @@ dependencies = [
22
22
  "baml-py>=0.222,<0.223",
23
23
  "pydantic>=2,<3",
24
24
  "PyYAML>=6,<7",
25
- # Widened ceiling (Slice G): the git-discipline guardrail CONSUMES the
26
- # contract's `pipeline_ref_classes` registry + `git_discipline_protocol`
27
- # schema, first published in 0.4.x. Floor stays at 0.3.0 so CI still resolves
28
- # against the currently-published 0.3.0 (the guardrail then degrades to a
29
- # neutral no-op); it auto-adopts the git-discipline contract once 0.4.x ships.
30
- "consiliency-contract>=0.3.0,<0.5.0",
25
+ # PIN (spec-integration v0.3.0): floor at 0.6.3 -- ships the `gate_posture_registry`
26
+ # AND the manifest-schema `gate_posture_overrides` key (0.6.3) that makes the dial
27
+ # OPERABLE (a repo can declare per-repo posture overrides without failing layout_validity),
28
+ # alongside `pipeline_ref_classes` + `git_discipline_protocol`. This
29
+ # ACTIVATES the git-discipline guardrail AND the posture dial (per-finding-class
30
+ # enforcement with non-retractable floors). The dial degrades gracefully on an older
31
+ # contract (gate_posture.available() False -> legacy per-gate behavior preserved), so
32
+ # < 0.6.2 stays safe; the floor guarantees the teeth are present. Warn-default remains;
33
+ # human_required is never set. (0.6.0 shipped self-inconsistent version refs -> fixed in
34
+ # 0.6.1, contract PR #18.)
35
+ "consiliency-contract>=0.6.3,<0.7",
31
36
  "jsonschema>=4,<5",
32
37
  # Advisor Board config loader (ABDREG) parses advisor-boards.toml. tomllib is
33
38
  # stdlib on 3.11+; on the 3.10 requires-python floor it is absent, so pull in
@@ -17,4 +17,4 @@ __all__ = [
17
17
  "state_ops",
18
18
  ]
19
19
 
20
- __version__ = "0.2.0"
20
+ __version__ = "0.3.0"
@@ -255,3 +255,72 @@ the golden proves byte-identity):
255
255
  `claude` seats) now runs two concurrent same-lane CLI/PTY sessions — a scenario this
256
256
  fan-out newly enables and nothing yet tests. The `default` board has one claude seat,
257
257
  so it is unaffected.
258
+
259
+ ## ABDREF — "Reference, don't inline" ingestion · `panel_invoker._resolve_artifact` / `_resolve_brief`
260
+
261
+ The leg prompt was already lean (it stages `review-bundle.md` and instructs the leg
262
+ to READ the file); the remaining inline path was the caller→runtime boundary, where
263
+ building `artifact: str` forces the caller to hold the whole (20k+ token) bundle in
264
+ its own context. `artifact_ref` / `brief_ref` promote that to by-reference ingestion:
265
+ the caller passes a PATH and the runtime reads it.
266
+
267
+ - **Entry points.** `invoke_panel`, `invoke_board`, and `invoke_panel_request` accept
268
+ keyword-only `artifact_ref: str | Sequence[str] | None` and `brief_ref: str | None`
269
+ (default-valued additive extensions to the frozen signatures — back-compat, like
270
+ `models` / `max_concurrency`). The artifact is resolved at the TOP of the entry
271
+ point so timeout scaling, staging, and metadata all see the resolved content.
272
+ - **`_resolve_artifact(artifact, artifact_ref)`.** `artifact_ref is None` →
273
+ `artifact or ""` (today's bytes, verbatim). A single path (a bare string OR a
274
+ one-element sequence) returns the file content VERBATIM — no header — so
275
+ `artifact_ref=P` is byte-identical to `artifact=<contents of P>`. Multiple paths
276
+ concatenate deterministically in the given order, each under a `## {filename}`
277
+ header, joined by a blank line. `artifact_ref` WINS when both it and `artifact` are
278
+ supplied. A `str` is checked BEFORE the `Sequence` branch (a string is itself an
279
+ iterable of characters).
280
+ - **`_resolve_brief(mode, brief_ref)`.** `brief_ref` file when set, else
281
+ `_mode_instructions(mode)` — staged as `review-instructions.md`. Threaded through
282
+ `_default_spawn` / `_default_spawn_via_provider` (omitted-when-`None`, so the
283
+ default path's `_default_spawn` call stays byte-identical).
284
+ - **Fail-closed.** A missing `artifact_ref` / `brief_ref` path raises `ValueError`
285
+ NAMING the path — never a silent-empty bundle that would read as a real (empty)
286
+ review.
287
+ - **Inline-size guard (`_maybe_warn_inline_size`, `_MAX_INLINE_ARTIFACT_BYTES = 16 KB`).**
288
+ An INLINE (not-from-ref) artifact over the threshold logs ONE steering warning
289
+ pointing to `artifact_ref` — **WARN, never refuse, never mutate** (refusing would
290
+ break existing callers). A from-ref artifact is never warned.
291
+ - **Crash-residual scratch GC (`_gc_stale_panel_scratch`).** Best-effort, age-gated
292
+ (`max_age_s = 24h`) sweep of `pl-panel-*` dirs, called at the top of
293
+ `_default_spawn`. Reclaims dirs leaked when a run is KILLED before the per-run
294
+ `finally: rmtree` (timeout/crash); a concurrent run's fresh dir is never touched,
295
+ and a GC failure can NEVER affect the run (fully swallowed).
296
+ - **Golden byte-identity preserved.** No ref ⇒ identical staged bytes ⇒ identical
297
+ per-leg argv / env / timeout. `tests/test_advisor_board_golden.py` (Proof A hits
298
+ `_exec_leg`; Proof B injects `spawn=`) is untouched;
299
+ `tests/test_advisor_board_ingestion.py` proves the new path is byte-transparent.
300
+
301
+ ## ABDMODE — Purpose-derived default mode + advisory prompt hygiene · `panel_invoker.py` (#107)
302
+
303
+ A board's PURPOSE now selects its default panel MODE automatically, so a domain
304
+ board (esp. the legal boards) runs in the right posture instead of being hard
305
+ code-review-gated. `tests/test_advisor_board_advisory_mode.py`.
306
+
307
+ - **`_mode_for_purpose(purpose) -> str`.** Code-review-class purposes
308
+ (`code-review`, `premerge-review`) → `"review"` (the strict pre-merge gate:
309
+ bundle is untrusted material to accept/reject, a conforming AGREE / PARTIALLY
310
+ AGREE / DISAGREE verdict is REQUIRED). The known domain purposes (`legal-review`,
311
+ `legal-strategy-review`, `legal-brainstorm`, `brainstorm`, `doc-edit`, `general`)
312
+ → `"advisory"` (analysis / recommendation, no verdict — substantial prose is a
313
+ real leg). An UNKNOWN purpose → `"review"` (back-compat safe default: a strict
314
+ gate never silently loosens on an unrecognized board).
315
+ - **`invoke_board(mode=None)` derives, a caller-passed `mode` overrides.**
316
+ `invoke_board` defaults `mode` to `None`; when `None` it derives
317
+ `_mode_for_purpose(board.purpose)`. `invoke_panel` KEEPS its legacy
318
+ `mode="review"` default (no board / no purpose). `DEFAULT_BOARD.purpose` is
319
+ `premerge-review` → derives `"review"` → **the golden byte-identity holds** —
320
+ `invoke_board(DEFAULT_BOARD)` stays byte-identical to the legacy review path.
321
+ - **Mode-aware prompt hygiene (`_render_leg_prompt`, `_ADVISORY_INSTRUCTIONS`).**
322
+ The REVIEW framing is **byte-for-byte unchanged** (the golden asserts the exact
323
+ prompt/argv). The ADVISORY framing DROPS the code-review-gate posture — no
324
+ "authoritative", no "untrusted material under review", no accept/reject — while
325
+ KEEPING the instructions/material SEPARATION (injection-safe: the brief is your
326
+ task, the bundle is only material, never authoritative instructions).
@@ -62,7 +62,28 @@ CONSILIENCY_GATES_ENV = "PHASE_LOOP_CONSILIENCY_GATES"
62
62
  CONSILIENCY_GATES_MODES: tuple[str, ...] = ("off", "warn", "hard")
63
63
  DEFAULT_CONSILIENCY_GATES_MODE = "warn"
64
64
 
65
- _GATE_NAMES = ("presence", "local_integrity", "layout_validity", "version_skew", "git_discipline")
65
+ _GATE_NAMES = ("presence", "local_integrity", "layout_validity", "version_skew", "git_discipline", "spec_conformance")
66
+
67
+ # spec_conformance (HGATE) — the generic conformance ladder + default bar. Advisory
68
+ # panel (Fable + Codex 5.5 + Gemini 3.1 Pro, unanimous) set the default PASS bar at
69
+ # `hash-checked`+ ("bar B"): it's the lowest rung where the claim is checkable by the
70
+ # existing local_integrity digest machinery, so a self-asserted `hash-checked` obligates
71
+ # a recorded digest rather than being a free claim. `presence-only` is an INFO-grade
72
+ # soft warn (declared but not digest-anchored); `present-nonconforming`/`foreign`/
73
+ # `unmanaged` are loud. The per-archetype/per-doc conformance floor as CONTRACT REGISTRY
74
+ # DATA is the deferred ratchet (do NOT hardcode org policy here). These labels mirror the
75
+ # contract `maturity-labels` registry; `certified` is a deprecated alias of `parity-certified`.
76
+ _SPEC_PROJECTION_CLASSES = ("proj-S", "proj-code")
77
+ _CONFORMANCE_LADDER = { # conforming rungs, low -> high
78
+ "presence-only": 0,
79
+ "hash-checked": 1,
80
+ "realized-edge-observed": 2,
81
+ "parity-certified": 3,
82
+ "authority-certified": 4,
83
+ }
84
+ _CONFORMANCE_ALIASES = {"certified": "parity-certified"} # deprecated alias, ranked as parity-certified
85
+ _NONCONFORMING_LABELS = frozenset({"present-nonconforming", "foreign", "unmanaged"})
86
+ _CONFORMANCE_FLOOR = "hash-checked" # bar B: the generic default PASS floor
66
87
 
67
88
 
68
89
  def resolve_consiliency_gates_mode(env: Mapping[str, str] | None = None) -> str:
@@ -117,7 +138,8 @@ def scan_consiliency_gates(
117
138
  "local_integrity": _gate_local_integrity(repo_path, manifest, mode=mode),
118
139
  "layout_validity": _gate_layout_validity(repo_path, manifest, mode=mode),
119
140
  "version_skew": _gate_version_skew(manifest, mode=mode),
120
- "git_discipline": _gate_git_discipline(repo_path, mode=mode),
141
+ "git_discipline": _gate_git_discipline(repo_path, manifest, mode=mode),
142
+ "spec_conformance": _gate_spec_conformance(manifest, mode=mode),
121
143
  }
122
144
  if any(g["status"] == "blocked" for g in gates.values()):
123
145
  overall = "blocked"
@@ -142,6 +164,50 @@ def _gate_status(findings: list[dict[str, Any]], *, mode: str, capped_warn: bool
142
164
  return "warn"
143
165
 
144
166
 
167
+ _SEVERITY = {"note": 0, "warn": 1, "blocked": 2}
168
+ _SEVERITY_STATUS = {0: "passed", 1: "warn", 2: "blocked"}
169
+
170
+
171
+ def _apply_posture(
172
+ findings: list[dict[str, Any]], *, manifest: Mapping[str, Any] | None, mode: str,
173
+ legacy_capped_all: bool = False, legacy_capped_codes: frozenset[str] = frozenset(),
174
+ ) -> dict[str, Any]:
175
+ """Retractable teeth -- resolve each finding's posture from the contract registry and
176
+ derive the gate status. `observe` findings are RECORDED (as notes) but never escalate
177
+ past `passed`; `warn` -> warn; `enforce` -> warn unless the operator opted into `hard`
178
+ -> blocked. Any per-repo override that LOWERS a class below its default adds the
179
+ non-retractable `posture_retracted` finding -- fired from the manifest overrides, so
180
+ de-fanging is visible even on an otherwise-clean scan.
181
+
182
+ Contract < 0.6.2 fallback preserves each gate's PRIOR severity: `legacy_capped_all`
183
+ caps every finding at warn (version_skew's normative phase0 const), `legacy_capped_codes`
184
+ caps just those codes (spec_conformance's info tier); everything else follows mode."""
185
+ from . import gate_posture as gp
186
+
187
+ if not gp.available():
188
+ if not findings:
189
+ return {"status": "passed", "findings": findings}
190
+ worst = 0
191
+ for f in findings:
192
+ capped = legacy_capped_all or str(f.get("code") or "") in legacy_capped_codes
193
+ worst = max(worst, _SEVERITY["warn" if (capped or mode != "hard") else "blocked"])
194
+ return {"status": _SEVERITY_STATUS[worst], "findings": findings}
195
+
196
+ out: list[dict[str, Any]] = []
197
+ worst = 0
198
+ for f in findings:
199
+ res = gp.resolve_posture(str(f.get("code") or ""), manifest=manifest)
200
+ worst = max(worst, _SEVERITY.get(gp.posture_status(res["posture"], mode=mode), 1))
201
+ out.append({**f, "posture": res["posture"]})
202
+ retracted = gp.retracting_overrides(manifest)
203
+ if retracted:
204
+ r = gp.resolve_posture("posture_retracted", manifest=manifest)
205
+ worst = max(worst, _SEVERITY.get(gp.posture_status(r["posture"], mode=mode), 1))
206
+ out.append({"code": "posture_retracted", "posture": r["posture"], "retracted_classes": retracted,
207
+ "message": "per-repo posture override lowered: " + ", ".join(retracted)})
208
+ return {"status": _SEVERITY_STATUS[worst], "findings": out}
209
+
210
+
145
211
  def _declared_archetypes_modifiers(manifest: Mapping[str, Any]) -> tuple[str, tuple[str, ...], tuple[str, ...]]:
146
212
  declaration = dict(manifest.get("declaration") or {})
147
213
  decl_mode = str(declaration.get("mode") or "baseline-only")
@@ -178,6 +244,84 @@ def _gate_presence(repo: Path, manifest: Mapping[str, Any], *, mode: str) -> dic
178
244
  return {"status": _gate_status(findings, mode=mode), "maturity": "presence-only", "findings": findings}
179
245
 
180
246
 
247
+ def _gate_spec_conformance(manifest: Mapping[str, Any], *, mode: str) -> dict[str, Any]:
248
+ """HGATE: warn when a DECLARED spec-projection (proj-S/proj-code) sits below the
249
+ conformance bar. Structural — reads declared maturity, no byte/digest verification
250
+ (that is local_integrity's job for hash-checked, and a future canon-backed verifier's
251
+ for higher rungs). Full no-op when the repo declares no spec-projections (OPA-style
252
+ optional layer). Two-tier: `present-nonconforming`/`foreign`/`unmanaged` are loud
253
+ (may block under hard mode); a below-bar non-sanctioned `presence-only` is an
254
+ info-grade soft warn that NEVER blocks (so honest early adopters are nudged, not
255
+ punished).
256
+
257
+ HONESTY -- this gate is FORWARD INFRASTRUCTURE, dormant on schema-valid manifests
258
+ with today's contract data: (a) every proj-S/proj-code required-doc row is
259
+ `l0_stub_allowed` at a `presence-only` floor, so the info + below-floor branches
260
+ are dead until the per-archetype conformance ratchet raises floors (deferred to
261
+ contract-registry data); (b) the manifest schema's maturity enum is only
262
+ {presence-only, hash-checked, realized-edge-observed}, so the non-conforming labels
263
+ that drive the loud branches are schema-INVALID and already caught by
264
+ layout_validity. So today it fires nothing layout_validity does not; it activates
265
+ without code change when the schema enum + the ratchet expand. Known ceiling:
266
+ `hash-checked` is the only rung the harness can locally verify (via local_integrity,
267
+ and only for `path`-backed docs -- `ref`-backed hash-checked is not yet digest-
268
+ checked); `realized-edge-observed`+ pass as accepted claims, verified downstream by
269
+ a canon-backed verifier, not here."""
270
+ decl_mode, archetypes, modifiers = _declared_archetypes_modifiers(manifest)
271
+ try:
272
+ rows = compose_required_documents(mode=decl_mode, archetypes=archetypes, modifiers=modifiers)
273
+ except ValueError:
274
+ # A malformed declaration is presence/layout's finding, not conformance's.
275
+ return {"status": "passed", "maturity": "presence-only", "findings": [],
276
+ "note": "declaration invalid; deferred to presence/layout gates"}
277
+ proj_rows = {r.id: r for r in rows if r.doc_class in _SPEC_PROJECTION_CLASSES}
278
+ docs_by_id = {d.get("id"): d for d in manifest.get("documents", []) if isinstance(d, Mapping)}
279
+ declared = [(pid, proj_rows[pid], docs_by_id[pid]) for pid in sorted(proj_rows) if pid in docs_by_id]
280
+ if not declared:
281
+ return {"status": "passed", "maturity": "presence-only", "findings": [],
282
+ "note": "no spec-projection documents declared; conformance gate is a no-op"}
283
+
284
+ bar_rank = _CONFORMANCE_LADDER[_CONFORMANCE_FLOOR]
285
+ loud: list[dict[str, Any]] = []
286
+ info: list[dict[str, Any]] = []
287
+ for pid, row, entry in declared:
288
+ raw = str(entry.get("maturity") or "").strip()
289
+ label = _CONFORMANCE_ALIASES.get(raw, raw)
290
+ floor_rank = _CONFORMANCE_LADDER.get(_CONFORMANCE_ALIASES.get(row.maturity_floor, row.maturity_floor), 0)
291
+ if not raw:
292
+ loud.append({"code": "spec_maturity_missing", "doc_id": pid,
293
+ "message": f"spec-projection '{pid}' declares no maturity"})
294
+ elif label == "present-nonconforming":
295
+ loud.append({"code": "spec_nonconforming", "doc_id": pid, "maturity": raw,
296
+ "message": f"spec-projection '{pid}' is 'present-nonconforming' -- the projection asserts the code does NOT match spec"})
297
+ elif label in _NONCONFORMING_LABELS: # foreign / unmanaged -- governance-status, NOT a non-conformance assertion
298
+ loud.append({"code": "spec_ungoverned", "doc_id": pid, "maturity": raw,
299
+ "message": f"spec-projection '{pid}' declares governance status '{raw}' (not this repo's, or ungoverned) -- outside the conformance ladder"})
300
+ elif label not in _CONFORMANCE_LADDER:
301
+ loud.append({"code": "spec_maturity_unknown", "doc_id": pid, "maturity": raw,
302
+ "message": f"spec-projection '{pid}' declares an unrecognized maturity '{raw}'"})
303
+ elif _CONFORMANCE_LADDER[label] < floor_rank:
304
+ # Below the doc's OWN contract-declared maturity_floor -- a real regression.
305
+ loud.append({"code": "spec_below_declared_floor", "doc_id": pid, "maturity": raw, "floor": row.maturity_floor,
306
+ "message": f"spec-projection '{pid}' is '{raw}' but the contract floor for it is '{row.maturity_floor}'"})
307
+ elif _CONFORMANCE_LADDER[label] < bar_rank and not row.l0_stub_allowed:
308
+ # Below the generic conformance bar AND not a contract-sanctioned L0 stub -> info nudge.
309
+ info.append({"code": "spec_below_conformance_bar", "doc_id": pid, "maturity": raw,
310
+ "message": f"spec-projection '{pid}' is '{raw}'; the conformance bar is '{_CONFORMANCE_FLOOR}'+ (declared but not digest-anchored). Informational -- pass requires {_CONFORMANCE_FLOOR}+ unless it is a sanctioned L0 stub or local policy overrides."})
311
+ # else: at/above its contract floor and (hash-checked+ OR a sanctioned L0 stub) -> conforming
312
+
313
+ # Retractable teeth: the contract's posture registry (not a hardcoded loud/info split)
314
+ # now drives severity per finding-class -- spec_nonconforming/etc default to `warn`
315
+ # (advisory, may be raised to enforce per-repo), spec_below_conformance_bar to `observe`
316
+ # (a recorded note). This gate does NO digest work itself, so it reports its own
317
+ # maturity as presence-only (honest); hash-checked is the bar, not a verified claim.
318
+ # legacy_capped_codes: preserve the pre-registry info tier -- spec_below_conformance_bar
319
+ # never blocked even under hard, so cap it in the < 0.6.2 fallback.
320
+ result = _apply_posture(loud + info, manifest=manifest, mode=mode,
321
+ legacy_capped_codes=frozenset({"spec_below_conformance_bar"}))
322
+ return {"status": result["status"], "maturity": "presence-only", "findings": result["findings"]}
323
+
324
+
181
325
  def _git_show(repo: Path, path: str) -> bytes | None:
182
326
  try:
183
327
  return subprocess.check_output(
@@ -222,10 +366,14 @@ def _gate_local_integrity(repo: Path, manifest: Mapping[str, Any], *, mode: str)
222
366
  checked_any = True
223
367
  if recorded != digest:
224
368
  findings.append({"code": "hash_drift", "doc_id": doc_id, "path": path, "expected": recorded, "actual": digest})
369
+ # Retractable teeth: hash_drift is an audit-chain invariant floored at `warn` in the
370
+ # registry (warns, does not hard-block by default; can be raised to enforce). Migrated
371
+ # onto the dial so the contract data matches live behavior (CR: Codex/Gemini/Fable).
372
+ posture = _apply_posture(findings, manifest=manifest, mode=mode)
225
373
  return {
226
- "status": _gate_status(findings, mode=mode),
374
+ "status": posture["status"],
227
375
  "maturity": "hash-checked" if checked_any else "presence-only",
228
- "findings": findings,
376
+ "findings": posture["findings"],
229
377
  }
230
378
 
231
379
 
@@ -264,7 +412,7 @@ def _gate_layout_validity(repo: Path, manifest: Mapping[str, Any], *, mode: str)
264
412
  return {"status": _gate_status(findings, mode=mode), "maturity": "presence-only", "findings": findings}
265
413
 
266
414
 
267
- def _gate_git_discipline(repo: Path, *, mode: str) -> dict[str, Any]:
415
+ def _gate_git_discipline(repo: Path, manifest: Mapping[str, Any] | None, *, mode: str) -> dict[str, Any]:
268
416
  """Slice-G git-discipline guardrail: classify the repo's refs against the
269
417
  neutral contract's ``pipeline_ref_classes`` registry and check the
270
418
  write-footprint / branch-naming invariants. Consumes the contract, does not
@@ -296,7 +444,13 @@ def _gate_git_discipline(repo: Path, *, mode: str) -> dict[str, Any]:
296
444
  registry=registry,
297
445
  protocol=protocol,
298
446
  )
299
- return {"status": _gate_status(findings, mode=mode), "maturity": "presence-only", "findings": findings}
447
+ # Retractable teeth: per-finding-class posture from the contract registry replaces the
448
+ # uniform _gate_status -- pipeline_branch_naming_drift softens to `observe` (a note),
449
+ # write_footprint_violation holds at its `warn` floor, and never_delete_human_refs is
450
+ # `enforce` and NON-RETRACTABLE. Legacy uniform behavior survives when the contract
451
+ # predates the posture registry (< 0.6.2).
452
+ result = _apply_posture(findings, manifest=manifest, mode=mode)
453
+ return {"status": result["status"], "maturity": "presence-only", "findings": result["findings"]}
300
454
 
301
455
 
302
456
  _RANGE_RE = re.compile(r"^>=\s*([0-9.]+)\s*<\s*([0-9.]+)$")
@@ -361,14 +515,19 @@ def _gate_version_skew(manifest: Mapping[str, Any], *, mode: str) -> dict[str, A
361
515
  )
362
516
  else:
363
517
  compatibility = "compatible"
364
- # Normative: version-skew stays warn-only at Phase 0 regardless of the
365
- # gate mode opt-in (version-skew-protocol.schema `default_behavior.
366
- # phase0_severity` is a fixed const, not a per-consumer policy knob).
518
+ # Normative: version-skew stays warn-only at Phase 0. The `version_skew` finding class
519
+ # carries max_posture=warn in the contract posture registry, so the cap is now contract
520
+ # DATA (retractable teeth) rather than the hardcoded capped_warn flag -- the legacy
521
+ # cap survives (fallback) when the contract predates the registry.
522
+ # legacy_capped_all: the version-skew phase0 severity is a normative const `warn`, so
523
+ # the < 0.6.2 fallback must cap at warn (never block under hard) -- preserving the old
524
+ # capped_warn=True behavior.
525
+ posture = _apply_posture(findings, manifest=manifest, mode=mode, legacy_capped_all=True)
367
526
  return {
368
- "status": _gate_status(findings, mode=mode, capped_warn=True),
527
+ "status": posture["status"],
369
528
  "maturity": "realized-edge-observed",
370
529
  "compatibility": compatibility,
371
530
  "installed_contract_version": installed_version,
372
531
  "repo_contract_version": repo_version or None,
373
- "findings": findings,
532
+ "findings": posture["findings"],
374
533
  }
@@ -0,0 +1,135 @@
1
+ """Retractable teeth -- gate enforcement posture resolution.
2
+
3
+ Reads the merge-gated ``gate_posture_registry`` (consiliency-contract >= 0.6.2) and
4
+ resolves the *effective* posture for a finding class from three layers -- the contract
5
+ ``default_posture``, then a per-repo ``.consiliency/manifest.json`` override -- clamped
6
+ to the class's non-retractable ``min_posture`` FLOOR and optional ``max_posture`` cap.
7
+
8
+ Posture rungs: ``observe`` < ``warn`` < ``enforce``. A per-repo override may RAISE any
9
+ class freely but may LOWER it only to (never below) its floor -- ``invariant`` classes
10
+ (never-delete-human-refs, write-footprint, hash-drift) carry a real floor; ``advisory``
11
+ classes retract freely to ``observe``. The operator's ``PHASE_LOOP_CONSILIENCY_GATES``
12
+ = off | warn | hard remains the MASTER switch: ``enforce`` blocks ONLY under ``hard``;
13
+ ``human_required`` is NEVER set at any posture. A per-repo *downward* move is surfaced
14
+ via the non-retractable ``posture_retracted`` note so de-fanging is always fleet-visible.
15
+
16
+ Contract-absent degrade: if the installed contract predates the registry (< 0.6.2),
17
+ :func:`available` is False and callers keep their legacy status logic unchanged.
18
+
19
+ Design ratified by advisory panel (Fable + Codex 5.5 + Gemini 3.1 Pro, unanimous).
20
+ """
21
+ from __future__ import annotations
22
+
23
+ from typing import Any, Mapping
24
+
25
+ _RUNG = {"observe": 0, "warn": 1, "enforce": 2}
26
+ # Optional per-repo overrides live under this manifest key: {finding_code: posture}.
27
+ MANIFEST_OVERRIDE_KEY = "gate_posture_overrides"
28
+ _DEFAULT_UNLISTED = {"category": "advisory", "default_posture": "warn", "min_posture": "observe"}
29
+
30
+
31
+ def _rank(posture: str) -> int:
32
+ return _RUNG.get(posture, _RUNG["warn"])
33
+
34
+
35
+ _REGISTRY_CACHE: dict[str, Any] | None = None
36
+ _REGISTRY_LOADED = False
37
+
38
+
39
+ def _registry() -> dict[str, Any] | None:
40
+ global _REGISTRY_CACHE, _REGISTRY_LOADED
41
+ if _REGISTRY_LOADED:
42
+ return _REGISTRY_CACHE
43
+ try:
44
+ from consiliency_contract import load_registry
45
+
46
+ reg = load_registry("gate_posture_registry")
47
+ _REGISTRY_CACHE = reg if isinstance(reg, Mapping) else None
48
+ except Exception:
49
+ _REGISTRY_CACHE = None # contract predates the registry (< 0.6.2)
50
+ _REGISTRY_LOADED = True
51
+ return _REGISTRY_CACHE
52
+
53
+
54
+ def available() -> bool:
55
+ """True when the installed contract ships the posture registry (>= 0.6.2)."""
56
+ return _registry() is not None
57
+
58
+
59
+ def _class_entry(reg: Mapping[str, Any], code: str) -> Mapping[str, Any]:
60
+ for fc in reg.get("finding_classes", []):
61
+ if isinstance(fc, Mapping) and fc.get("code") == code:
62
+ return fc
63
+ unlisted = reg.get("default_unlisted")
64
+ return unlisted if isinstance(unlisted, Mapping) else _DEFAULT_UNLISTED
65
+
66
+
67
+ def _overrides(manifest: Mapping[str, Any] | None) -> dict[str, str]:
68
+ if isinstance(manifest, Mapping):
69
+ raw = manifest.get(MANIFEST_OVERRIDE_KEY)
70
+ if isinstance(raw, Mapping):
71
+ return {str(k): str(v) for k, v in raw.items()}
72
+ return {}
73
+
74
+
75
+ def resolve_posture(code: str, *, manifest: Mapping[str, Any] | None = None) -> dict[str, Any]:
76
+ """Resolve the effective posture for a finding ``code``.
77
+
78
+ Returns a dict with the effective ``posture`` plus provenance (``default``, ``floor``,
79
+ ``cap``, ``requested`` per-repo value, ``retracted`` = a real downward move below the
80
+ default, ``clamped_to_floor`` = an override that tried to go below the floor and was
81
+ denied, ``category``). ``available`` is False when the contract lacks the registry.
82
+ """
83
+ reg = _registry()
84
+ if reg is None:
85
+ return {"posture": "warn", "default": "warn", "floor": "observe", "cap": None,
86
+ "requested": None, "retracted": False, "clamped_to_floor": False,
87
+ "category": "advisory", "available": False}
88
+ entry = _class_entry(reg, code)
89
+ default = str(entry.get("default_posture", "warn"))
90
+ floor = str(entry.get("min_posture", "observe"))
91
+ cap = entry.get("max_posture")
92
+ cap = str(cap) if cap in _RUNG else None
93
+
94
+ requested = _overrides(manifest).get(code)
95
+ chosen = requested if requested in _RUNG else default
96
+
97
+ effective = chosen
98
+ clamped_to_floor = requested in _RUNG and _rank(requested) < _rank(floor)
99
+ if cap and _rank(effective) > _rank(cap):
100
+ effective = cap
101
+ if _rank(effective) < _rank(floor):
102
+ # NON-RETRACTABLE floor: a repo can never weaken below it -- and the floor wins
103
+ # even over a mis-configured max_posture < min_posture registry entry.
104
+ effective = floor
105
+
106
+ # `retracted` reflects an ACTUAL downward move of the effective posture below the
107
+ # default -- a floor-clamped attempt (effective unchanged) is NOT a retraction; it is
108
+ # surfaced via `clamped_to_floor` instead.
109
+ retracted = requested in _RUNG and _rank(effective) < _rank(default)
110
+ return {"posture": effective, "default": default, "floor": floor, "cap": cap,
111
+ "requested": requested, "retracted": bool(retracted),
112
+ "clamped_to_floor": bool(clamped_to_floor),
113
+ "category": str(entry.get("category", "advisory")), "available": True}
114
+
115
+
116
+ def retracting_overrides(manifest: Mapping[str, Any] | None) -> list[str]:
117
+ """The finding codes whose per-repo override LOWERS the effective posture below its
118
+ default -- de-fanging that must be surfaced even when that class fired no finding this
119
+ scan. A floor-clamped attempt (effective unchanged) is not counted (see resolve_posture)."""
120
+ if _registry() is None:
121
+ return []
122
+ out = [code for code in _overrides(manifest) if resolve_posture(code, manifest=manifest)["retracted"]]
123
+ return sorted(set(out))
124
+
125
+
126
+ def posture_status(posture: str, *, mode: str) -> str:
127
+ """Map a resolved posture + operator mode to a gate-status contribution:
128
+ ``observe`` -> ``note`` (recorded, never warns/blocks); ``warn`` -> ``warn``;
129
+ ``enforce`` -> ``warn`` unless the operator opted into ``hard`` -> ``blocked``.
130
+ ``human_required`` is never implied at any rung."""
131
+ if posture == "observe":
132
+ return "note"
133
+ if posture == "enforce" and mode == "hard":
134
+ return "blocked"
135
+ return "warn"