phase-loop-runtime 0.2.1__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.1 → phase_loop_runtime-0.3.0}/PKG-INFO +2 -2
  2. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/pyproject.toml +12 -7
  3. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/__init__.py +1 -1
  4. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_gates.py +170 -11
  5. phase_loop_runtime-0.3.0/src/phase_loop_runtime/gate_posture.py +135 -0
  6. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
  7. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/SOURCES.txt +3 -0
  8. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/requires.txt +1 -1
  9. phase_loop_runtime-0.3.0/tests/test_gate_posture.py +113 -0
  10. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_git_discipline.py +14 -6
  11. phase_loop_runtime-0.3.0/tests/test_spec_conformance_gate.py +202 -0
  12. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/MANIFEST.in +0 -0
  13. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/README.md +0 -0
  14. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/protocol/protocol.md +0 -0
  15. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/setup.cfg +0 -0
  16. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
  17. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
  18. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
  19. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
  20. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
  21. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
  22. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
  23. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
  24. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
  25. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
  26. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
  27. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
  28. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
  29. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
  30. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
  31. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
  32. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
  33. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
  34. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
  35. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
  36. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
  37. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
  38. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
  39. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
  40. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
  41. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
  42. {phase_loop_runtime-0.2.1 → 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
  43. {phase_loop_runtime-0.2.1 → 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
  44. {phase_loop_runtime-0.2.1 → 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
  45. {phase_loop_runtime-0.2.1 → 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
  46. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
  47. {phase_loop_runtime-0.2.1 → 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
  48. {phase_loop_runtime-0.2.1 → 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
  49. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
  50. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
  51. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
  52. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
  53. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
  54. {phase_loop_runtime-0.2.1 → 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
  55. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
  56. {phase_loop_runtime-0.2.1 → 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
  57. {phase_loop_runtime-0.2.1 → 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
  58. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
  59. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
  60. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
  61. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
  62. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
  63. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
  64. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
  65. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
  66. {phase_loop_runtime-0.2.1 → 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
  67. {phase_loop_runtime-0.2.1 → 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
  68. {phase_loop_runtime-0.2.1 → 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
  69. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/adoption_bundle.py +0 -0
  70. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
  71. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
  72. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
  73. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
  74. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/config.py +0 -0
  75. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/events.py +0 -0
  76. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
  77. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
  78. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
  79. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
  80. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
  81. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
  82. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
  83. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
  84. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
  85. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
  86. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
  87. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
  88. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_modular.py +0 -0
  89. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
  90. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
  91. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
  92. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
  93. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
  94. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
  95. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
  96. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
  97. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/broker.py +0 -0
  98. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/build_bundle.py +0 -0
  99. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/capability_registry.py +0 -0
  100. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/classifier.py +0 -0
  101. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_agent_view.py +0 -0
  102. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
  103. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cli.py +0 -0
  104. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout.py +0 -0
  105. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_classifier.py +0 -0
  106. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
  107. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validation.py +0 -0
  108. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validators.py +0 -0
  109. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
  110. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_layout.py +0 -0
  111. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
  112. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
  113. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/discovery.py +0 -0
  114. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dispatch_lock.py +0 -0
  115. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
  116. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_audit.py +0 -0
  117. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_freshness.py +0 -0
  118. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_surfaces.py +0 -0
  119. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
  120. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events.py +0 -0
  121. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events_migration.py +0 -0
  122. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit.py +0 -0
  123. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
  124. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_map.py +0 -0
  125. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics.py +0 -0
  126. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
  127. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_discipline.py +0 -0
  128. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_ops.py +0 -0
  129. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_topology.py +0 -0
  130. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_bundle.py +0 -0
  131. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_premerge.py +0 -0
  132. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_review.py +0 -0
  133. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff.py +0 -0
  134. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff_path.py +0 -0
  135. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/injection.py +0 -0
  136. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/install_status.py +0 -0
  137. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lane_scheduler.py +0 -0
  138. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/launcher.py +0 -0
  139. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lease_store.py +0 -0
  140. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/maintenance.py +0 -0
  141. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
  142. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/models.py +0 -0
  143. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/observability.py +0 -0
  144. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/panel_invoker.py +0 -0
  145. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
  146. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
  147. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
  148. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
  149. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
  150. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
  151. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
  152. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
  153. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
  154. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_ir.py +0 -0
  155. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_manifest.py +0 -0
  156. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/planner_validation.py +0 -0
  157. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/profiles.py +0 -0
  158. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/prompts.py +0 -0
  159. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/provenance.py +0 -0
  160. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/publishing.py +0 -0
  161. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/py.typed +0 -0
  162. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reconcile.py +0 -0
  163. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/redaction.py +0 -0
  164. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reflection_sync.py +0 -0
  165. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/release_guard.py +0 -0
  166. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/render.py +0 -0
  167. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/repo_validation.py +0 -0
  168. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/review_summary.py +0 -0
  169. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/roadmap_lint.py +0 -0
  170. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_log.py +0 -0
  171. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
  172. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
  173. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runner.py +0 -0
  174. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_paths.py +0 -0
  175. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_projection.py +0 -0
  176. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_resources.py +0 -0
  177. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schema_export.py +0 -0
  178. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
  179. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_install.py +0 -0
  180. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_inventory.py +0 -0
  181. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_paths.py +0 -0
  182. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
  183. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
  184. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
  185. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
  186. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
  187. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
  188. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
  189. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
  190. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
  191. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  192. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  193. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  194. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  195. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  196. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  197. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  198. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
  199. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  200. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
  201. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
  202. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
  203. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
  204. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
  205. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
  206. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
  207. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
  208. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  209. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
  210. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  211. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
  212. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
  213. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
  214. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
  215. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
  216. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
  217. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
  218. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
  219. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
  220. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
  221. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
  222. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
  223. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
  224. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
  225. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  226. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
  227. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
  228. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
  229. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
  230. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
  231. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
  232. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
  233. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
  234. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
  235. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
  236. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
  237. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  238. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  239. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  240. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  241. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  242. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  243. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  244. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
  245. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  246. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
  247. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
  248. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
  249. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
  250. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
  251. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
  252. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
  253. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
  254. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  255. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
  256. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  257. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
  258. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
  259. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
  260. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
  261. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
  262. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
  263. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
  264. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
  265. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
  266. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
  267. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
  268. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
  269. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
  270. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
  271. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  272. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
  273. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
  274. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
  275. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
  276. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
  277. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
  278. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
  279. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
  280. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
  281. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
  282. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
  283. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  284. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  285. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  286. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  287. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  288. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  289. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  290. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
  291. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  292. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
  293. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
  294. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
  295. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
  296. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
  297. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
  298. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
  299. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
  300. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  301. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
  302. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  303. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
  304. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
  305. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
  306. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
  307. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
  308. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
  309. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
  310. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
  311. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
  312. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
  313. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
  314. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
  315. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
  316. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
  317. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  318. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
  319. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
  320. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
  321. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
  322. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
  323. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
  324. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
  325. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
  326. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
  327. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
  328. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
  329. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
  330. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
  331. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
  332. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
  333. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
  334. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
  335. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
  336. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
  337. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
  338. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
  339. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
  340. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
  341. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
  342. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
  343. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
  344. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
  345. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
  346. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
  347. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
  348. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
  349. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
  350. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
  351. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
  352. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
  353. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
  354. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
  355. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
  356. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
  357. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
  358. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
  359. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
  360. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
  361. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
  362. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
  363. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
  364. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
  365. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
  366. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
  367. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state.py +0 -0
  368. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_degradation.py +0 -0
  369. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_ops.py +0 -0
  370. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_ledger.py +0 -0
  371. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_roadmap.py +0 -0
  372. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_runner.py +0 -0
  373. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence.py +0 -0
  374. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
  375. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
  376. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worker_pool.py +0 -0
  377. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worktree_index.py +0 -0
  378. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
  379. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
  380. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
  381. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_advisory_mode.py +0 -0
  382. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_alias_install.py +0 -0
  383. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backcompat.py +0 -0
  384. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_homebrew.py +0 -0
  385. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_omnigent.py +0 -0
  386. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_concurrency.py +0 -0
  387. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_config.py +0 -0
  388. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_golden.py +0 -0
  389. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_ingestion.py +0 -0
  390. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_integration.py +0 -0
  391. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_matrix.py +0 -0
  392. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_observability.py +0 -0
  393. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_presets.py +0 -0
  394. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_registries.py +0 -0
  395. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_resolver.py +0 -0
  396. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_schema.py +0 -0
  397. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_agent_runtime_provider_cs08.py +0 -0
  398. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_branchgov_preflight.py +0 -0
  399. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_cli_train_status_45.py +0 -0
  400. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_break_glass_cli.py +0 -0
  401. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_classifier.py +0 -0
  402. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_convergence_fixes.py +0 -0
  403. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_exception_vocab.py +0 -0
  404. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_validator_hook.py +0 -0
  405. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_verification_gate.py +0 -0
  406. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_codex_effort_max_clamp_49.py +0 -0
  407. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_dual_layout.py +0 -0
  408. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_gates.py +0 -0
  409. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_ingest.py +0 -0
  410. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_scaffold.py +0 -0
  411. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_coordinator_wave_loop.py +0 -0
  412. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
  413. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_helper.py +0 -0
  414. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_same_roadmap.py +0 -0
  415. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_doc_delta_validator.py +0 -0
  416. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_docs_audit.py +0 -0
  417. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_docs_freshness.py +0 -0
  418. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dotfiles_tree.py +0 -0
  419. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_execute_phase_handoff_mode.py +0 -0
  420. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_execution_policy_tiering.py +0 -0
  421. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_export_schema.py +0 -0
  422. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_map.py +0 -0
  423. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics.py +0 -0
  424. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics_export.py +0 -0
  425. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_gate_a_wheel_isolation.py +0 -0
  426. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_disjointness_model_first.py +0 -0
  427. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_e2e.py +0 -0
  428. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_gate_crfixes.py +0 -0
  429. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_planning_gate.py +0 -0
  430. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge.py +0 -0
  431. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge_live.py +0 -0
  432. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_review.py +0 -0
  433. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_hotfix_lane.py +0 -0
  434. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_injection_skill_failloud.py +0 -0
  435. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lane_ir_override.py +0 -0
  436. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_launcher_liveness.py +0 -0
  437. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lease_store.py +0 -0
  438. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lease_store_conformance.py +0 -0
  439. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_ledger_serialization.py +0 -0
  440. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_model_class_policy.py +0 -0
  441. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_observability_alerting.py +0 -0
  442. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_advisory_mode_63.py +0 -0
  443. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker.py +0 -0
  444. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_spawn.py +0 -0
  445. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_timeout_argv.py +0 -0
  446. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_leg_auth_preflight_64.py +0 -0
  447. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_per_leg_model_66.py +0 -0
  448. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_tui_eof_48.py +0 -0
  449. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_verdict_summary.py +0 -0
  450. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_backcompat.py +0 -0
  451. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_cli.py +0 -0
  452. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle.py +0 -0
  453. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
  454. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_dependency.py +0 -0
  455. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_end_to_end.py +0 -0
  456. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_injection.py +0 -0
  457. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_modular.py +0 -0
  458. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
  459. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
  460. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_export.py +0 -0
  461. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_source.py +0 -0
  462. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_branch_divergence_event.py +0 -0
  463. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_build_bundle.py +0 -0
  464. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_classifier.py +0 -0
  465. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
  466. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
  467. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
  468. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
  469. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_security.py +0 -0
  470. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
  471. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
  472. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
  473. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_route_selection.py +0 -0
  474. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli.py +0 -0
  475. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli_plugin_load.py +0 -0
  476. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_control_only.py +0 -0
  477. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_event.py +0 -0
  478. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
  479. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_hardening.py +0 -0
  480. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
  481. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_schema.py +0 -0
  482. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_validation.py +0 -0
  483. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_citation.py +0 -0
  484. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_docs.py +0 -0
  485. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_rollback.py +0 -0
  486. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
  487. {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_discovery.py +0 -0
  490. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_docs.py +0 -0
  491. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
  492. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_sources.py +0 -0
  493. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
  494. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
  495. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_portal.py +0 -0
  496. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_regenesis.py +0 -0
  497. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_drift_audit.py +0 -0
  498. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dry_run_then_run.py +0 -0
  499. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_events_migration.py +0 -0
  500. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit.py +0 -0
  501. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
  502. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
  503. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
  504. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
  505. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_execution_policy.py +0 -0
  506. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_executor_degradation.py +0 -0
  507. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_full_phase_mode.py +0 -0
  508. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff.py +0 -0
  509. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff_migration.py +0 -0
  510. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_init.py +0 -0
  511. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_injection.py +0 -0
  512. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_install_status.py +0 -0
  513. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_harnesses.py +0 -0
  514. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir.py +0 -0
  515. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
  516. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_scheduler.py +0 -0
  517. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_launcher.py +0 -0
  518. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_debug.py +0 -0
  519. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_dedup.py +0 -0
  520. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_live_adapters.py +0 -0
  521. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_maintenance.py +0 -0
  522. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_metrics.py +0 -0
  523. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_migration_regressions.py +0 -0
  524. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
  525. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
  526. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_observability.py +0 -0
  527. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_models.py +0 -0
  528. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_native_flags.py +0 -0
  529. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
  530. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pi_executor.py +0 -0
  531. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
  532. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bridge.py +0 -0
  533. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bundle.py +0 -0
  534. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_closeout.py +0 -0
  535. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_freshness.py +0 -0
  536. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_mode.py +0 -0
  537. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_doc_skip.py +0 -0
  538. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_manifest.py +0 -0
  539. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
  540. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_validation.py +0 -0
  541. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_policy.py +0 -0
  542. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_protocol_contract.py +0 -0
  543. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_provenance.py +0 -0
  544. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile.py +0 -0
  545. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
  546. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
  547. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
  548. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reducers.py +0 -0
  549. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
  550. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_amendments.py +0 -0
  551. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_validate.py +0 -0
  552. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_rotation.py +0 -0
  553. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner.py +0 -0
  554. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
  555. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_boundary.py +0 -0
  556. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_decouple.py +0 -0
  557. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_package_data.py +0 -0
  558. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_projection.py +0 -0
  559. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_schema_flow.py +0 -0
  560. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
  561. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
  562. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_contract.py +0 -0
  563. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_execute_contract.py +0 -0
  564. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_install.py +0 -0
  565. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_planner_contract.py +0 -0
  566. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_blockers.py +0 -0
  567. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
  568. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_reentry.py +0 -0
  569. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
  570. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
  571. {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_state.py +0 -0
  573. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
  574. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
  575. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
  576. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
  577. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
  578. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_e2e.py +0 -0
  579. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_principles.py +0 -0
  580. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_found_contracts.py +0 -0
  581. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_reconcile.py +0 -0
  582. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_sched.py +0 -0
  583. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_schedharden.py +0 -0
  584. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_wave_runner.py +0 -0
  585. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_observability.py +0 -0
  586. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_runner.py +0 -0
  587. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_state.py +0 -0
  588. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_worktrees.py +0 -0
  589. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_owned_dirty_relaxation.py +0 -0
  590. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_worktree_executor.py +0 -0
  591. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
  592. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
  593. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
  594. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_flag.py +0 -0
  595. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_markers.py +0 -0
  596. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
  597. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
  598. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
  599. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
  600. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
  601. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pkg_layout_freeze.py +0 -0
  602. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_plan_ir_iter_waves.py +0 -0
  603. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_preflight_verification.py +0 -0
  604. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_publishing.py +0 -0
  605. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reconcile_manifest_dedup_46.py +0 -0
  606. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reconcile_verification_log.py +0 -0
  607. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reflection_sync.py +0 -0
  608. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_repo_validation.py +0 -0
  609. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_review_summary.py +0 -0
  610. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_route_log.py +0 -0
  611. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_route_policy_conformance.py +0 -0
  612. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_routing_invariants.py +0 -0
  613. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_runtime_state_mirror_agreement.py +0 -0
  614. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_sibling_matcher_patterns.py +0 -0
  615. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_bundle_pinned.py +0 -0
  616. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_install_body_expansion.py +0 -0
  617. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_plan_manifest_write.py +0 -0
  618. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_sources_seam.py +0 -0
  619. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_bundle_drift.py +0 -0
  620. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_canon_parity.py +0 -0
  621. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_src_claude_literal_lint.py +0 -0
  622. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_sync_skills_apply_failloud.py +0 -0
  623. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_e2e.py +0 -0
  624. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_invariants.py +0 -0
  625. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_merge.py +0 -0
  626. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_order_only_deps_47.py +0 -0
  627. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_roadmap.py +0 -0
  628. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_runner.py +0 -0
  629. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_v34_parallel_dispatch_soak.py +0 -0
  630. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_validate_plan_doc_docs_lane.py +0 -0
  631. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence.py +0 -0
  632. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence_validator.py +0 -0
  633. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_visual_evidence_validator.py +0 -0
  634. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_failure_isolation.py +0 -0
  635. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_parallel.py +0 -0
  636. {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_worktree_alloc.py +0 -0
  637. {phase_loop_runtime-0.2.1 → 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.1
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.1"
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.1"
20
+ __version__ = "0.3.0"
@@ -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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phase-loop-runtime
3
- Version: 0.2.1
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
 
@@ -37,6 +37,7 @@ src/phase_loop_runtime/evidence_audit_config.py
37
37
  src/phase_loop_runtime/fleet_map.py
38
38
  src/phase_loop_runtime/fleet_metrics.py
39
39
  src/phase_loop_runtime/fleet_metrics_export.py
40
+ src/phase_loop_runtime/gate_posture.py
40
41
  src/phase_loop_runtime/git_discipline.py
41
42
  src/phase_loop_runtime/git_ops.py
42
43
  src/phase_loop_runtime/git_topology.py
@@ -417,6 +418,7 @@ tests/test_fleet_map.py
417
418
  tests/test_fleet_metrics.py
418
419
  tests/test_fleet_metrics_export.py
419
420
  tests/test_gate_a_wheel_isolation.py
421
+ tests/test_gate_posture.py
420
422
  tests/test_git_discipline.py
421
423
  tests/test_governed_disjointness_model_first.py
422
424
  tests/test_governed_e2e.py
@@ -614,6 +616,7 @@ tests/test_skill_sources_seam.py
614
616
  tests/test_skills_bundle_drift.py
615
617
  tests/test_skills_canon_parity.py
616
618
  tests/test_skills_src_claude_literal_lint.py
619
+ tests/test_spec_conformance_gate.py
617
620
  tests/test_sync_skills_apply_failloud.py
618
621
  tests/test_train_e2e.py
619
622
  tests/test_train_invariants.py
@@ -1,7 +1,7 @@
1
1
  baml-py<0.223,>=0.222
2
2
  pydantic<3,>=2
3
3
  PyYAML<7,>=6
4
- consiliency-contract<0.5.0,>=0.3.0
4
+ consiliency-contract<0.7,>=0.6.3
5
5
  jsonschema<5,>=4
6
6
 
7
7
  [:python_version < "3.11"]
@@ -0,0 +1,113 @@
1
+ """Retractable teeth -- posture resolution (floors, clamps, caps, retraction visibility)."""
2
+ from __future__ import annotations
3
+
4
+ import unittest
5
+
6
+ from phase_loop_runtime import gate_posture as gp
7
+
8
+
9
+ class GatePostureResolveTest(unittest.TestCase):
10
+ def test_registry_available_on_0_6_2(self):
11
+ self.assertTrue(gp.available())
12
+
13
+ def test_invariant_default_is_its_floor_and_cannot_be_retracted(self):
14
+ # never_delete_human_refs: default enforce, floor enforce -> non-retractable.
15
+ base = gp.resolve_posture("never_delete_human_refs")
16
+ self.assertEqual(base["posture"], "enforce")
17
+ self.assertEqual(base["floor"], "enforce")
18
+ # a repo tries to silence it -> denied, clamped back to the floor
19
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"never_delete_human_refs": "observe"}}
20
+ r = gp.resolve_posture("never_delete_human_refs", manifest=m)
21
+ self.assertEqual(r["posture"], "enforce")
22
+ self.assertTrue(r["clamped_to_floor"])
23
+
24
+ def test_write_footprint_floored_at_warn(self):
25
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"write_footprint_violation": "observe"}}
26
+ r = gp.resolve_posture("write_footprint_violation", manifest=m)
27
+ self.assertEqual(r["posture"], "warn") # cannot drop below the warn floor
28
+ self.assertTrue(r["clamped_to_floor"])
29
+
30
+ def test_advisory_retracts_freely_and_is_flagged_retracted(self):
31
+ # spec_nonconforming: advisory, default warn, floor observe.
32
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"spec_nonconforming": "observe"}}
33
+ r = gp.resolve_posture("spec_nonconforming", manifest=m)
34
+ self.assertEqual(r["posture"], "observe") # retract honored
35
+ self.assertTrue(r["retracted"]) # ...but recorded as a downward move
36
+ self.assertFalse(r["clamped_to_floor"])
37
+
38
+ def test_repo_may_raise_freely(self):
39
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"pipeline_branch_naming_drift": "enforce"}}
40
+ r = gp.resolve_posture("pipeline_branch_naming_drift", manifest=m)
41
+ self.assertEqual(r["posture"], "enforce")
42
+ self.assertFalse(r["retracted"])
43
+
44
+ def test_version_skew_capped_at_warn(self):
45
+ # even an explicit raise to enforce is capped by max_posture.
46
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"version_skew": "enforce"}}
47
+ r = gp.resolve_posture("version_skew", manifest=m)
48
+ self.assertEqual(r["posture"], "warn")
49
+ self.assertEqual(r["cap"], "warn")
50
+
51
+ def test_unlisted_code_uses_advisory_default(self):
52
+ r = gp.resolve_posture("some_brand_new_finding")
53
+ self.assertEqual(r["posture"], "warn")
54
+ self.assertEqual(r["category"], "advisory")
55
+
56
+ def test_clamped_invariant_is_not_flagged_retracted(self):
57
+ # CR fix: a floor-clamped attempt (effective unchanged) is clamped_to_floor, NOT retracted.
58
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"never_delete_human_refs": "observe"}}
59
+ r = gp.resolve_posture("never_delete_human_refs", manifest=m)
60
+ self.assertEqual(r["posture"], "enforce")
61
+ self.assertFalse(r["retracted"])
62
+ self.assertTrue(r["clamped_to_floor"])
63
+
64
+ def test_retracting_overrides_lists_only_real_downward_moves(self):
65
+ # CR fix: de-fanging visible on clean scans -- retracting_overrides scans the manifest,
66
+ # counting only overrides that ACTUALLY lower a class (clamped invariants excluded).
67
+ m = {gp.MANIFEST_OVERRIDE_KEY: {
68
+ "spec_nonconforming": "observe", # real down-move (advisory)
69
+ "never_delete_human_refs": "observe", # clamped -> not counted
70
+ "pipeline_branch_naming_drift": "enforce"}} # a raise -> not counted
71
+ self.assertEqual(gp.retracting_overrides(m), ["spec_nonconforming"])
72
+
73
+ def test_max_posture_never_undercuts_the_floor(self):
74
+ # CR fix: floor wins even over a (hypothetical) mis-set max<min; version_skew has
75
+ # floor observe + cap warn, so a raise-to-enforce lands at the warn cap, not below.
76
+ m = {gp.MANIFEST_OVERRIDE_KEY: {"version_skew": "enforce"}}
77
+ self.assertEqual(gp.resolve_posture("version_skew", manifest=m)["posture"], "warn")
78
+
79
+ def test_posture_status_mapping(self):
80
+ self.assertEqual(gp.posture_status("observe", mode="warn"), "note")
81
+ self.assertEqual(gp.posture_status("observe", mode="hard"), "note")
82
+ self.assertEqual(gp.posture_status("warn", mode="warn"), "warn")
83
+ self.assertEqual(gp.posture_status("warn", mode="hard"), "warn")
84
+ self.assertEqual(gp.posture_status("enforce", mode="warn"), "warn") # master switch not thrown
85
+ self.assertEqual(gp.posture_status("enforce", mode="hard"), "blocked") # opted into hard
86
+
87
+
88
+ class ApplyPostureFallbackTest(unittest.TestCase):
89
+ """CR regression guard: on a contract < 0.6.2 (registry absent) the fallback must
90
+ preserve each gate's PRIOR severity, not uniformly block under hard."""
91
+
92
+ def _apply(self, findings, *, mode, **kw):
93
+ from unittest import mock
94
+ from phase_loop_runtime import consiliency_gates as cg
95
+ with mock.patch.object(gp, "available", return_value=False):
96
+ return cg._apply_posture(findings, manifest=None, mode=mode, **kw)
97
+
98
+ def test_version_skew_fallback_stays_warn_under_hard(self):
99
+ r = self._apply([{"code": "version_skew"}], mode="hard", legacy_capped_all=True)
100
+ self.assertEqual(r["status"], "warn") # NOT blocked -- normative phase0 const
101
+
102
+ def test_spec_info_fallback_stays_warn_under_hard(self):
103
+ r = self._apply([{"code": "spec_below_conformance_bar"}], mode="hard",
104
+ legacy_capped_codes=frozenset({"spec_below_conformance_bar"}))
105
+ self.assertEqual(r["status"], "warn") # info tier never blocks, even in fallback
106
+
107
+ def test_uncapped_finding_still_blocks_under_hard_in_fallback(self):
108
+ r = self._apply([{"code": "some_finding"}], mode="hard")
109
+ self.assertEqual(r["status"], "blocked") # legacy uniform behavior preserved
110
+
111
+
112
+ if __name__ == "__main__":
113
+ unittest.main()
@@ -186,12 +186,20 @@ class GateSeverityTest(unittest.TestCase):
186
186
  gd.load_protocol = self._orig_proto
187
187
  gd.gather_repo_ref_facts = self._orig_facts
188
188
 
189
- def test_warns_by_default_blocks_on_opt_in(self):
189
+ def test_write_footprint_warns_by_default_and_blocks_on_enforce_opt_in(self):
190
+ # Retractable teeth: write_footprint_violation is an invariant FLOORED at warn --
191
+ # it warns by default (even under hard, forgiving), can't be silenced below warn,
192
+ # and blocks under hard only when a repo/fleet raises it to `enforce`.
190
193
  self._patch("consiliency/pipeline/v0.4", ["src/app.py"])
191
- warn = _gate_git_discipline(Path("/nonexistent"), mode="warn")
192
- hard = _gate_git_discipline(Path("/nonexistent"), mode="hard")
194
+ warn = _gate_git_discipline(Path("/nonexistent"), None, mode="warn")
195
+ hard = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
193
196
  self.assertEqual(warn["status"], "warn")
194
- self.assertEqual(hard["status"], "blocked")
197
+ self.assertEqual(hard["status"], "warn") # forgiving default: warns, does not block
198
+ enforce = {"gate_posture_overrides": {"write_footprint_violation": "enforce"}}
199
+ self.assertEqual(_gate_git_discipline(Path("/nonexistent"), enforce, mode="hard")["status"], "blocked")
200
+ # ...but it can never be silenced below its warn floor:
201
+ silence = {"gate_posture_overrides": {"write_footprint_violation": "observe"}}
202
+ self.assertEqual(_gate_git_discipline(Path("/nonexistent"), silence, mode="warn")["status"], "warn")
195
203
  self.assertTrue(warn["findings"])
196
204
  # The gate never emits a human_required signal.
197
205
  self.assertNotIn("human_required", warn)
@@ -200,7 +208,7 @@ class GateSeverityTest(unittest.TestCase):
200
208
 
201
209
  def test_clean_pipeline_branch_passes(self):
202
210
  self._patch("consiliency/pipeline/v0.4", [".consiliency/manifest.json"])
203
- result = _gate_git_discipline(Path("/nonexistent"), mode="hard")
211
+ result = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
204
212
  self.assertEqual(result["status"], "passed")
205
213
 
206
214
 
@@ -214,7 +222,7 @@ class ContractAbsentDegradeTest(unittest.TestCase):
214
222
 
215
223
  def test_gate_degrades_to_passed_not_warn(self):
216
224
  # Neutral no-op even in hard mode -- must NOT flip governed scans to warn.
217
- result = _gate_git_discipline(Path("/nonexistent"), mode="hard")
225
+ result = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
218
226
  self.assertEqual(result["status"], "passed")
219
227
  self.assertIn("latent", result["note"])
220
228