@trac3er/oh-my-god 2.2.3 → 2.3.0

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 (1047) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.claude-plugin/scripts/install.sh +1 -1
  4. package/.gemini/settings.json +2 -2
  5. package/.kimi/mcp.json +2 -2
  6. package/CHANGELOG.md +14 -1
  7. package/CLI-ADAPTER-MAP.md +3 -3
  8. package/OMG-setup.sh +7 -6
  9. package/OMG_COMPAT_CONTRACT.md +1 -1
  10. package/README.md +4 -2
  11. package/artifacts/public/dist/public/manifest.json +2 -2
  12. package/commands/OMG:validate.md +1 -1
  13. package/dist/enterprise/manifest.json +2 -2
  14. package/dist/public/manifest.json +2 -2
  15. package/docs/install/github-app.md +8 -7
  16. package/hooks/_common.py +20 -6
  17. package/hooks/secret-guard.py +3 -2
  18. package/hooks/stop_dispatcher.py +20 -2
  19. package/hooks/terms-guard.py +96 -0
  20. package/hooks/test-validator.py +36 -4
  21. package/hud/omg-hud.mjs +1 -1
  22. package/package.json +1 -1
  23. package/plugins/advanced/plugin.json +1 -1
  24. package/plugins/core/plugin.json +1 -1
  25. package/pyproject.toml +1 -1
  26. package/registry/bundles/algorithms.yaml +1 -1
  27. package/registry/bundles/api-twin.yaml +1 -1
  28. package/registry/bundles/ast-pack.yaml +1 -1
  29. package/registry/bundles/claim-judge.yaml +1 -1
  30. package/registry/bundles/control-plane.yaml +1 -1
  31. package/registry/bundles/data-lineage.yaml +1 -1
  32. package/registry/bundles/delta-classifier.yaml +1 -1
  33. package/registry/bundles/eval-gate.yaml +1 -1
  34. package/registry/bundles/hash-edit.yaml +1 -1
  35. package/registry/bundles/health.yaml +1 -1
  36. package/registry/bundles/hook-governor.yaml +1 -1
  37. package/registry/bundles/incident-replay.yaml +1 -1
  38. package/registry/bundles/lsp-pack.yaml +1 -1
  39. package/registry/bundles/mcp-fabric.yaml +1 -1
  40. package/registry/bundles/plan-council.yaml +1 -1
  41. package/registry/bundles/preflight.yaml +1 -1
  42. package/registry/bundles/proof-gate.yaml +1 -1
  43. package/registry/bundles/remote-supervisor.yaml +1 -1
  44. package/registry/bundles/robotics.yaml +1 -1
  45. package/registry/bundles/secure-worktree-pipeline.yaml +1 -1
  46. package/registry/bundles/security-check.yaml +1 -1
  47. package/registry/bundles/terminal-lane.yaml +1 -1
  48. package/registry/bundles/test-intent-lock.yaml +1 -1
  49. package/registry/bundles/tracebank.yaml +1 -1
  50. package/registry/bundles/vision.yaml +1 -1
  51. package/registry/omg-capability.schema.json +1 -1
  52. package/runtime/adoption.py +3 -2
  53. package/runtime/compliance_governor.py +28 -2
  54. package/runtime/context_compiler.py +131 -0
  55. package/runtime/contract_compiler.py +120 -25
  56. package/runtime/delta_classifier.py +68 -0
  57. package/runtime/github_review_bot.py +2 -2
  58. package/runtime/github_review_formatter.py +14 -0
  59. package/runtime/mutation_gate.py +38 -9
  60. package/runtime/omg_compat_contract_snapshot.json +1 -1
  61. package/runtime/provider_parity_eval.py +109 -0
  62. package/runtime/test_intent_lock.py +24 -2
  63. package/scripts/omg.py +63 -6
  64. package/settings.json +13 -3
  65. package/artifacts/release/.agents/skills/omg/AGENTS.fragment.md +0 -75
  66. package/artifacts/release/.agents/skills/omg/algorithms/SKILL.md +0 -11
  67. package/artifacts/release/.agents/skills/omg/algorithms/openai.yaml +0 -11
  68. package/artifacts/release/.agents/skills/omg/api-twin/SKILL.md +0 -11
  69. package/artifacts/release/.agents/skills/omg/api-twin/openai.yaml +0 -12
  70. package/artifacts/release/.agents/skills/omg/ast-pack/SKILL.md +0 -11
  71. package/artifacts/release/.agents/skills/omg/ast-pack/openai.yaml +0 -12
  72. package/artifacts/release/.agents/skills/omg/claim-judge/SKILL.md +0 -11
  73. package/artifacts/release/.agents/skills/omg/claim-judge/openai.yaml +0 -13
  74. package/artifacts/release/.agents/skills/omg/codex-mcp.toml +0 -4
  75. package/artifacts/release/.agents/skills/omg/codex-rules.md +0 -38
  76. package/artifacts/release/.agents/skills/omg/control-plane/SKILL.md +0 -11
  77. package/artifacts/release/.agents/skills/omg/control-plane/openai.yaml +0 -14
  78. package/artifacts/release/.agents/skills/omg/data-lineage/SKILL.md +0 -11
  79. package/artifacts/release/.agents/skills/omg/data-lineage/openai.yaml +0 -12
  80. package/artifacts/release/.agents/skills/omg/delta-classifier/SKILL.md +0 -11
  81. package/artifacts/release/.agents/skills/omg/delta-classifier/openai.yaml +0 -12
  82. package/artifacts/release/.agents/skills/omg/eval-gate/SKILL.md +0 -11
  83. package/artifacts/release/.agents/skills/omg/eval-gate/openai.yaml +0 -12
  84. package/artifacts/release/.agents/skills/omg/hash-edit/SKILL.md +0 -11
  85. package/artifacts/release/.agents/skills/omg/hash-edit/openai.yaml +0 -11
  86. package/artifacts/release/.agents/skills/omg/health/SKILL.md +0 -11
  87. package/artifacts/release/.agents/skills/omg/health/openai.yaml +0 -11
  88. package/artifacts/release/.agents/skills/omg/hook-governor/SKILL.md +0 -11
  89. package/artifacts/release/.agents/skills/omg/hook-governor/openai.yaml +0 -11
  90. package/artifacts/release/.agents/skills/omg/incident-replay/SKILL.md +0 -11
  91. package/artifacts/release/.agents/skills/omg/incident-replay/openai.yaml +0 -12
  92. package/artifacts/release/.agents/skills/omg/lsp-pack/SKILL.md +0 -11
  93. package/artifacts/release/.agents/skills/omg/lsp-pack/openai.yaml +0 -12
  94. package/artifacts/release/.agents/skills/omg/mcp-fabric/SKILL.md +0 -11
  95. package/artifacts/release/.agents/skills/omg/mcp-fabric/openai.yaml +0 -13
  96. package/artifacts/release/.agents/skills/omg/plan-council/SKILL.md +0 -11
  97. package/artifacts/release/.agents/skills/omg/plan-council/openai.yaml +0 -12
  98. package/artifacts/release/.agents/skills/omg/preflight/SKILL.md +0 -11
  99. package/artifacts/release/.agents/skills/omg/preflight/openai.yaml +0 -12
  100. package/artifacts/release/.agents/skills/omg/proof-gate/SKILL.md +0 -11
  101. package/artifacts/release/.agents/skills/omg/proof-gate/openai.yaml +0 -13
  102. package/artifacts/release/.agents/skills/omg/remote-supervisor/SKILL.md +0 -11
  103. package/artifacts/release/.agents/skills/omg/remote-supervisor/openai.yaml +0 -12
  104. package/artifacts/release/.agents/skills/omg/robotics/SKILL.md +0 -11
  105. package/artifacts/release/.agents/skills/omg/robotics/openai.yaml +0 -11
  106. package/artifacts/release/.agents/skills/omg/secure-worktree-pipeline/SKILL.md +0 -11
  107. package/artifacts/release/.agents/skills/omg/secure-worktree-pipeline/openai.yaml +0 -12
  108. package/artifacts/release/.agents/skills/omg/security-check/SKILL.md +0 -11
  109. package/artifacts/release/.agents/skills/omg/security-check/openai.yaml +0 -13
  110. package/artifacts/release/.agents/skills/omg/terminal-lane/SKILL.md +0 -11
  111. package/artifacts/release/.agents/skills/omg/terminal-lane/openai.yaml +0 -11
  112. package/artifacts/release/.agents/skills/omg/test-intent-lock/SKILL.md +0 -11
  113. package/artifacts/release/.agents/skills/omg/test-intent-lock/openai.yaml +0 -13
  114. package/artifacts/release/.agents/skills/omg/tracebank/SKILL.md +0 -11
  115. package/artifacts/release/.agents/skills/omg/tracebank/openai.yaml +0 -12
  116. package/artifacts/release/.agents/skills/omg/vision/SKILL.md +0 -11
  117. package/artifacts/release/.agents/skills/omg/vision/openai.yaml +0 -11
  118. package/artifacts/release/.claude-plugin/marketplace.json +0 -36
  119. package/artifacts/release/.claude-plugin/mcp.json +0 -11
  120. package/artifacts/release/.claude-plugin/plugin.json +0 -23
  121. package/artifacts/release/.gemini/settings.json +0 -72
  122. package/artifacts/release/.kimi/mcp.json +0 -72
  123. package/artifacts/release/.mcp.json +0 -18
  124. package/artifacts/release/OMG_COMPAT_CONTRACT.md +0 -111
  125. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/AGENTS.fragment.md.minisig +0 -4
  126. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/AGENTS.fragment.md.statement.json +0 -35
  127. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/algorithms/SKILL.md.minisig +0 -4
  128. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/algorithms/SKILL.md.statement.json +0 -35
  129. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/algorithms/openai.yaml.minisig +0 -4
  130. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/algorithms/openai.yaml.statement.json +0 -35
  131. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/api-twin/SKILL.md.minisig +0 -4
  132. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/api-twin/SKILL.md.statement.json +0 -35
  133. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/api-twin/openai.yaml.minisig +0 -4
  134. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/api-twin/openai.yaml.statement.json +0 -35
  135. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/ast-pack/SKILL.md.minisig +0 -4
  136. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/ast-pack/SKILL.md.statement.json +0 -35
  137. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/ast-pack/openai.yaml.minisig +0 -4
  138. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/ast-pack/openai.yaml.statement.json +0 -35
  139. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/claim-judge/SKILL.md.minisig +0 -4
  140. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/claim-judge/SKILL.md.statement.json +0 -35
  141. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/claim-judge/openai.yaml.minisig +0 -4
  142. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/claim-judge/openai.yaml.statement.json +0 -35
  143. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/codex-mcp.toml.minisig +0 -4
  144. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/codex-mcp.toml.statement.json +0 -35
  145. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/codex-rules.md.minisig +0 -4
  146. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/codex-rules.md.statement.json +0 -35
  147. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/control-plane/SKILL.md.minisig +0 -4
  148. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/control-plane/SKILL.md.statement.json +0 -35
  149. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/control-plane/openai.yaml.minisig +0 -4
  150. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/control-plane/openai.yaml.statement.json +0 -35
  151. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/data-lineage/SKILL.md.minisig +0 -4
  152. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/data-lineage/SKILL.md.statement.json +0 -35
  153. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/data-lineage/openai.yaml.minisig +0 -4
  154. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/data-lineage/openai.yaml.statement.json +0 -35
  155. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/delta-classifier/SKILL.md.minisig +0 -4
  156. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/delta-classifier/SKILL.md.statement.json +0 -35
  157. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/delta-classifier/openai.yaml.minisig +0 -4
  158. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/delta-classifier/openai.yaml.statement.json +0 -35
  159. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/eval-gate/SKILL.md.minisig +0 -4
  160. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/eval-gate/SKILL.md.statement.json +0 -35
  161. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/eval-gate/openai.yaml.minisig +0 -4
  162. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/eval-gate/openai.yaml.statement.json +0 -35
  163. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hash-edit/SKILL.md.minisig +0 -4
  164. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hash-edit/SKILL.md.statement.json +0 -35
  165. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hash-edit/openai.yaml.minisig +0 -4
  166. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hash-edit/openai.yaml.statement.json +0 -35
  167. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/health/SKILL.md.minisig +0 -4
  168. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/health/SKILL.md.statement.json +0 -35
  169. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/health/openai.yaml.minisig +0 -4
  170. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/health/openai.yaml.statement.json +0 -35
  171. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hook-governor/SKILL.md.minisig +0 -4
  172. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hook-governor/SKILL.md.statement.json +0 -35
  173. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hook-governor/openai.yaml.minisig +0 -4
  174. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/hook-governor/openai.yaml.statement.json +0 -35
  175. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/incident-replay/SKILL.md.minisig +0 -4
  176. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/incident-replay/SKILL.md.statement.json +0 -35
  177. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/incident-replay/openai.yaml.minisig +0 -4
  178. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/incident-replay/openai.yaml.statement.json +0 -35
  179. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/lsp-pack/SKILL.md.minisig +0 -4
  180. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/lsp-pack/SKILL.md.statement.json +0 -35
  181. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/lsp-pack/openai.yaml.minisig +0 -4
  182. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/lsp-pack/openai.yaml.statement.json +0 -35
  183. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/mcp-fabric/SKILL.md.minisig +0 -4
  184. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/mcp-fabric/SKILL.md.statement.json +0 -35
  185. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/mcp-fabric/openai.yaml.minisig +0 -4
  186. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/mcp-fabric/openai.yaml.statement.json +0 -35
  187. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/plan-council/SKILL.md.minisig +0 -4
  188. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/plan-council/SKILL.md.statement.json +0 -35
  189. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/plan-council/openai.yaml.minisig +0 -4
  190. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/plan-council/openai.yaml.statement.json +0 -35
  191. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/preflight/SKILL.md.minisig +0 -4
  192. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/preflight/SKILL.md.statement.json +0 -35
  193. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/preflight/openai.yaml.minisig +0 -4
  194. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/preflight/openai.yaml.statement.json +0 -35
  195. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/proof-gate/SKILL.md.minisig +0 -4
  196. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/proof-gate/SKILL.md.statement.json +0 -35
  197. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/proof-gate/openai.yaml.minisig +0 -4
  198. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/proof-gate/openai.yaml.statement.json +0 -35
  199. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/remote-supervisor/SKILL.md.minisig +0 -4
  200. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/remote-supervisor/SKILL.md.statement.json +0 -35
  201. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/remote-supervisor/openai.yaml.minisig +0 -4
  202. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/remote-supervisor/openai.yaml.statement.json +0 -35
  203. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/robotics/SKILL.md.minisig +0 -4
  204. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/robotics/SKILL.md.statement.json +0 -35
  205. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/robotics/openai.yaml.minisig +0 -4
  206. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/robotics/openai.yaml.statement.json +0 -35
  207. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md.minisig +0 -4
  208. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md.statement.json +0 -35
  209. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml.minisig +0 -4
  210. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml.statement.json +0 -35
  211. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/security-check/SKILL.md.minisig +0 -4
  212. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/security-check/SKILL.md.statement.json +0 -35
  213. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/security-check/openai.yaml.minisig +0 -4
  214. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/security-check/openai.yaml.statement.json +0 -35
  215. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/terminal-lane/SKILL.md.minisig +0 -4
  216. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/terminal-lane/SKILL.md.statement.json +0 -35
  217. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/terminal-lane/openai.yaml.minisig +0 -4
  218. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/terminal-lane/openai.yaml.statement.json +0 -35
  219. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/test-intent-lock/SKILL.md.minisig +0 -4
  220. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/test-intent-lock/SKILL.md.statement.json +0 -35
  221. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/test-intent-lock/openai.yaml.minisig +0 -4
  222. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/test-intent-lock/openai.yaml.statement.json +0 -35
  223. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/tracebank/SKILL.md.minisig +0 -4
  224. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/tracebank/SKILL.md.statement.json +0 -35
  225. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/tracebank/openai.yaml.minisig +0 -4
  226. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/tracebank/openai.yaml.statement.json +0 -35
  227. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/vision/SKILL.md.minisig +0 -4
  228. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/vision/SKILL.md.statement.json +0 -35
  229. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/vision/openai.yaml.minisig +0 -4
  230. package/artifacts/release/dist/enterprise/attestations/bundle/.agents/skills/omg/vision/openai.yaml.statement.json +0 -35
  231. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/marketplace.json.minisig +0 -4
  232. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/marketplace.json.statement.json +0 -35
  233. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/mcp.json.minisig +0 -4
  234. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/mcp.json.statement.json +0 -35
  235. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/plugin.json.minisig +0 -4
  236. package/artifacts/release/dist/enterprise/attestations/bundle/.claude-plugin/plugin.json.statement.json +0 -35
  237. package/artifacts/release/dist/enterprise/attestations/bundle/.gemini/settings.json.minisig +0 -4
  238. package/artifacts/release/dist/enterprise/attestations/bundle/.gemini/settings.json.statement.json +0 -35
  239. package/artifacts/release/dist/enterprise/attestations/bundle/.kimi/mcp.json.minisig +0 -4
  240. package/artifacts/release/dist/enterprise/attestations/bundle/.kimi/mcp.json.statement.json +0 -35
  241. package/artifacts/release/dist/enterprise/attestations/bundle/.mcp.json.minisig +0 -4
  242. package/artifacts/release/dist/enterprise/attestations/bundle/.mcp.json.statement.json +0 -35
  243. package/artifacts/release/dist/enterprise/attestations/bundle/OMG_COMPAT_CONTRACT.md.minisig +0 -4
  244. package/artifacts/release/dist/enterprise/attestations/bundle/OMG_COMPAT_CONTRACT.md.statement.json +0 -35
  245. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:code-review.md.minisig +0 -4
  246. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:code-review.md.statement.json +0 -35
  247. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:deep-plan.md.minisig +0 -4
  248. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:deep-plan.md.statement.json +0 -35
  249. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:handoff.md.minisig +0 -4
  250. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:handoff.md.statement.json +0 -35
  251. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:learn.md.minisig +0 -4
  252. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:learn.md.statement.json +0 -35
  253. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:maintainer.md.minisig +0 -4
  254. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:maintainer.md.statement.json +0 -35
  255. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ralph-start.md.minisig +0 -4
  256. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ralph-start.md.statement.json +0 -35
  257. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ralph-stop.md.minisig +0 -4
  258. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ralph-stop.md.statement.json +0 -35
  259. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:security-review.md.minisig +0 -4
  260. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:security-review.md.statement.json +0 -35
  261. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:sequential-thinking.md.minisig +0 -4
  262. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:sequential-thinking.md.statement.json +0 -35
  263. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ship.md.minisig +0 -4
  264. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/commands/OMG:ship.md.statement.json +0 -35
  265. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/plugin.json.minisig +0 -4
  266. package/artifacts/release/dist/enterprise/attestations/bundle/plugins/advanced/plugin.json.statement.json +0 -35
  267. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/algorithms.yaml.minisig +0 -4
  268. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/algorithms.yaml.statement.json +0 -35
  269. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/api-twin.yaml.minisig +0 -4
  270. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/api-twin.yaml.statement.json +0 -35
  271. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/ast-pack.yaml.minisig +0 -4
  272. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/ast-pack.yaml.statement.json +0 -35
  273. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/claim-judge.yaml.minisig +0 -4
  274. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/claim-judge.yaml.statement.json +0 -35
  275. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/control-plane.yaml.minisig +0 -4
  276. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/control-plane.yaml.statement.json +0 -35
  277. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/data-lineage.yaml.minisig +0 -4
  278. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/data-lineage.yaml.statement.json +0 -35
  279. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/delta-classifier.yaml.minisig +0 -4
  280. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/delta-classifier.yaml.statement.json +0 -35
  281. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/eval-gate.yaml.minisig +0 -4
  282. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/eval-gate.yaml.statement.json +0 -35
  283. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/hash-edit.yaml.minisig +0 -4
  284. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/hash-edit.yaml.statement.json +0 -35
  285. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/health.yaml.minisig +0 -4
  286. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/health.yaml.statement.json +0 -35
  287. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/hook-governor.yaml.minisig +0 -4
  288. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/hook-governor.yaml.statement.json +0 -35
  289. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/incident-replay.yaml.minisig +0 -4
  290. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/incident-replay.yaml.statement.json +0 -35
  291. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/lsp-pack.yaml.minisig +0 -4
  292. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/lsp-pack.yaml.statement.json +0 -35
  293. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/mcp-fabric.yaml.minisig +0 -4
  294. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/mcp-fabric.yaml.statement.json +0 -35
  295. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/plan-council.yaml.minisig +0 -4
  296. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/plan-council.yaml.statement.json +0 -35
  297. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/preflight.yaml.minisig +0 -4
  298. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/preflight.yaml.statement.json +0 -35
  299. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/proof-gate.yaml.minisig +0 -4
  300. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/proof-gate.yaml.statement.json +0 -35
  301. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/remote-supervisor.yaml.minisig +0 -4
  302. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/remote-supervisor.yaml.statement.json +0 -35
  303. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/robotics.yaml.minisig +0 -4
  304. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/robotics.yaml.statement.json +0 -35
  305. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/secure-worktree-pipeline.yaml.minisig +0 -4
  306. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/secure-worktree-pipeline.yaml.statement.json +0 -35
  307. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/security-check.yaml.minisig +0 -4
  308. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/security-check.yaml.statement.json +0 -35
  309. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/terminal-lane.yaml.minisig +0 -4
  310. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/terminal-lane.yaml.statement.json +0 -35
  311. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/test-intent-lock.yaml.minisig +0 -4
  312. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/test-intent-lock.yaml.statement.json +0 -35
  313. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/tracebank.yaml.minisig +0 -4
  314. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/tracebank.yaml.statement.json +0 -35
  315. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/vision.yaml.minisig +0 -4
  316. package/artifacts/release/dist/enterprise/attestations/bundle/registry/bundles/vision.yaml.statement.json +0 -35
  317. package/artifacts/release/dist/enterprise/attestations/bundle/registry/omg-capability.schema.json.minisig +0 -4
  318. package/artifacts/release/dist/enterprise/attestations/bundle/registry/omg-capability.schema.json.statement.json +0 -35
  319. package/artifacts/release/dist/enterprise/attestations/bundle/settings.json.minisig +0 -4
  320. package/artifacts/release/dist/enterprise/attestations/bundle/settings.json.statement.json +0 -35
  321. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/AGENTS.fragment.md +0 -75
  322. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/algorithms/SKILL.md +0 -11
  323. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/algorithms/openai.yaml +0 -11
  324. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/api-twin/SKILL.md +0 -11
  325. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/api-twin/openai.yaml +0 -12
  326. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/ast-pack/SKILL.md +0 -11
  327. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/ast-pack/openai.yaml +0 -12
  328. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/claim-judge/SKILL.md +0 -11
  329. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/claim-judge/openai.yaml +0 -13
  330. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/codex-mcp.toml +0 -4
  331. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/codex-rules.md +0 -38
  332. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/control-plane/SKILL.md +0 -11
  333. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/control-plane/openai.yaml +0 -14
  334. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/data-lineage/SKILL.md +0 -11
  335. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/data-lineage/openai.yaml +0 -12
  336. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/delta-classifier/SKILL.md +0 -11
  337. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/delta-classifier/openai.yaml +0 -12
  338. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/eval-gate/SKILL.md +0 -11
  339. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/eval-gate/openai.yaml +0 -12
  340. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/hash-edit/SKILL.md +0 -11
  341. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/hash-edit/openai.yaml +0 -11
  342. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/health/SKILL.md +0 -11
  343. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/health/openai.yaml +0 -11
  344. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/hook-governor/SKILL.md +0 -11
  345. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/hook-governor/openai.yaml +0 -11
  346. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/incident-replay/SKILL.md +0 -11
  347. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/incident-replay/openai.yaml +0 -12
  348. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/lsp-pack/SKILL.md +0 -11
  349. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/lsp-pack/openai.yaml +0 -12
  350. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/mcp-fabric/SKILL.md +0 -11
  351. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/mcp-fabric/openai.yaml +0 -13
  352. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/plan-council/SKILL.md +0 -11
  353. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/plan-council/openai.yaml +0 -12
  354. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/preflight/SKILL.md +0 -11
  355. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/preflight/openai.yaml +0 -12
  356. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/proof-gate/SKILL.md +0 -11
  357. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/proof-gate/openai.yaml +0 -13
  358. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/remote-supervisor/SKILL.md +0 -11
  359. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/remote-supervisor/openai.yaml +0 -12
  360. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/robotics/SKILL.md +0 -11
  361. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/robotics/openai.yaml +0 -11
  362. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md +0 -11
  363. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml +0 -12
  364. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/security-check/SKILL.md +0 -11
  365. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/security-check/openai.yaml +0 -13
  366. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/terminal-lane/SKILL.md +0 -11
  367. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/terminal-lane/openai.yaml +0 -11
  368. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/test-intent-lock/SKILL.md +0 -11
  369. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/test-intent-lock/openai.yaml +0 -13
  370. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/tracebank/SKILL.md +0 -11
  371. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/tracebank/openai.yaml +0 -12
  372. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/vision/SKILL.md +0 -11
  373. package/artifacts/release/dist/enterprise/bundle/.agents/skills/omg/vision/openai.yaml +0 -11
  374. package/artifacts/release/dist/enterprise/bundle/.claude-plugin/marketplace.json +0 -36
  375. package/artifacts/release/dist/enterprise/bundle/.claude-plugin/mcp.json +0 -11
  376. package/artifacts/release/dist/enterprise/bundle/.claude-plugin/plugin.json +0 -23
  377. package/artifacts/release/dist/enterprise/bundle/.gemini/settings.json +0 -72
  378. package/artifacts/release/dist/enterprise/bundle/.kimi/mcp.json +0 -72
  379. package/artifacts/release/dist/enterprise/bundle/.mcp.json +0 -18
  380. package/artifacts/release/dist/enterprise/bundle/OMG_COMPAT_CONTRACT.md +0 -111
  381. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:code-review.md +0 -114
  382. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:deep-plan.md +0 -266
  383. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:handoff.md +0 -115
  384. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:learn.md +0 -110
  385. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:maintainer.md +0 -31
  386. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:ralph-start.md +0 -43
  387. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:ralph-stop.md +0 -23
  388. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:security-review.md +0 -16
  389. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:sequential-thinking.md +0 -20
  390. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/commands/OMG:ship.md +0 -46
  391. package/artifacts/release/dist/enterprise/bundle/plugins/advanced/plugin.json +0 -104
  392. package/artifacts/release/dist/enterprise/bundle/registry/bundles/algorithms.yaml +0 -45
  393. package/artifacts/release/dist/enterprise/bundle/registry/bundles/api-twin.yaml +0 -48
  394. package/artifacts/release/dist/enterprise/bundle/registry/bundles/ast-pack.yaml +0 -80
  395. package/artifacts/release/dist/enterprise/bundle/registry/bundles/claim-judge.yaml +0 -49
  396. package/artifacts/release/dist/enterprise/bundle/registry/bundles/control-plane.yaml +0 -192
  397. package/artifacts/release/dist/enterprise/bundle/registry/bundles/data-lineage.yaml +0 -47
  398. package/artifacts/release/dist/enterprise/bundle/registry/bundles/delta-classifier.yaml +0 -47
  399. package/artifacts/release/dist/enterprise/bundle/registry/bundles/eval-gate.yaml +0 -47
  400. package/artifacts/release/dist/enterprise/bundle/registry/bundles/hash-edit.yaml +0 -73
  401. package/artifacts/release/dist/enterprise/bundle/registry/bundles/health.yaml +0 -45
  402. package/artifacts/release/dist/enterprise/bundle/registry/bundles/hook-governor.yaml +0 -101
  403. package/artifacts/release/dist/enterprise/bundle/registry/bundles/incident-replay.yaml +0 -47
  404. package/artifacts/release/dist/enterprise/bundle/registry/bundles/lsp-pack.yaml +0 -80
  405. package/artifacts/release/dist/enterprise/bundle/registry/bundles/mcp-fabric.yaml +0 -53
  406. package/artifacts/release/dist/enterprise/bundle/registry/bundles/plan-council.yaml +0 -56
  407. package/artifacts/release/dist/enterprise/bundle/registry/bundles/preflight.yaml +0 -48
  408. package/artifacts/release/dist/enterprise/bundle/registry/bundles/proof-gate.yaml +0 -49
  409. package/artifacts/release/dist/enterprise/bundle/registry/bundles/remote-supervisor.yaml +0 -49
  410. package/artifacts/release/dist/enterprise/bundle/registry/bundles/robotics.yaml +0 -45
  411. package/artifacts/release/dist/enterprise/bundle/registry/bundles/secure-worktree-pipeline.yaml +0 -69
  412. package/artifacts/release/dist/enterprise/bundle/registry/bundles/security-check.yaml +0 -50
  413. package/artifacts/release/dist/enterprise/bundle/registry/bundles/terminal-lane.yaml +0 -61
  414. package/artifacts/release/dist/enterprise/bundle/registry/bundles/test-intent-lock.yaml +0 -49
  415. package/artifacts/release/dist/enterprise/bundle/registry/bundles/tracebank.yaml +0 -47
  416. package/artifacts/release/dist/enterprise/bundle/registry/bundles/vision.yaml +0 -45
  417. package/artifacts/release/dist/enterprise/bundle/registry/omg-capability.schema.json +0 -378
  418. package/artifacts/release/dist/enterprise/bundle/settings.json +0 -694
  419. package/artifacts/release/dist/enterprise/manifest.json +0 -1093
  420. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/AGENTS.fragment.md.minisig +0 -4
  421. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/AGENTS.fragment.md.statement.json +0 -35
  422. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/algorithms/SKILL.md.minisig +0 -4
  423. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/algorithms/SKILL.md.statement.json +0 -35
  424. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/algorithms/openai.yaml.minisig +0 -4
  425. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/algorithms/openai.yaml.statement.json +0 -35
  426. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/api-twin/SKILL.md.minisig +0 -4
  427. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/api-twin/SKILL.md.statement.json +0 -35
  428. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/api-twin/openai.yaml.minisig +0 -4
  429. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/api-twin/openai.yaml.statement.json +0 -35
  430. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/ast-pack/SKILL.md.minisig +0 -4
  431. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/ast-pack/SKILL.md.statement.json +0 -35
  432. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/ast-pack/openai.yaml.minisig +0 -4
  433. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/ast-pack/openai.yaml.statement.json +0 -35
  434. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/claim-judge/SKILL.md.minisig +0 -4
  435. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/claim-judge/SKILL.md.statement.json +0 -35
  436. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/claim-judge/openai.yaml.minisig +0 -4
  437. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/claim-judge/openai.yaml.statement.json +0 -35
  438. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/codex-mcp.toml.minisig +0 -4
  439. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/codex-mcp.toml.statement.json +0 -35
  440. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/codex-rules.md.minisig +0 -4
  441. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/codex-rules.md.statement.json +0 -35
  442. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/control-plane/SKILL.md.minisig +0 -4
  443. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/control-plane/SKILL.md.statement.json +0 -35
  444. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/control-plane/openai.yaml.minisig +0 -4
  445. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/control-plane/openai.yaml.statement.json +0 -35
  446. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/data-lineage/SKILL.md.minisig +0 -4
  447. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/data-lineage/SKILL.md.statement.json +0 -35
  448. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/data-lineage/openai.yaml.minisig +0 -4
  449. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/data-lineage/openai.yaml.statement.json +0 -35
  450. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/delta-classifier/SKILL.md.minisig +0 -4
  451. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/delta-classifier/SKILL.md.statement.json +0 -35
  452. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/delta-classifier/openai.yaml.minisig +0 -4
  453. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/delta-classifier/openai.yaml.statement.json +0 -35
  454. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/eval-gate/SKILL.md.minisig +0 -4
  455. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/eval-gate/SKILL.md.statement.json +0 -35
  456. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/eval-gate/openai.yaml.minisig +0 -4
  457. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/eval-gate/openai.yaml.statement.json +0 -35
  458. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hash-edit/SKILL.md.minisig +0 -4
  459. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hash-edit/SKILL.md.statement.json +0 -35
  460. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hash-edit/openai.yaml.minisig +0 -4
  461. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hash-edit/openai.yaml.statement.json +0 -35
  462. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/health/SKILL.md.minisig +0 -4
  463. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/health/SKILL.md.statement.json +0 -35
  464. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/health/openai.yaml.minisig +0 -4
  465. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/health/openai.yaml.statement.json +0 -35
  466. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hook-governor/SKILL.md.minisig +0 -4
  467. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hook-governor/SKILL.md.statement.json +0 -35
  468. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hook-governor/openai.yaml.minisig +0 -4
  469. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/hook-governor/openai.yaml.statement.json +0 -35
  470. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/incident-replay/SKILL.md.minisig +0 -4
  471. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/incident-replay/SKILL.md.statement.json +0 -35
  472. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/incident-replay/openai.yaml.minisig +0 -4
  473. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/incident-replay/openai.yaml.statement.json +0 -35
  474. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/lsp-pack/SKILL.md.minisig +0 -4
  475. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/lsp-pack/SKILL.md.statement.json +0 -35
  476. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/lsp-pack/openai.yaml.minisig +0 -4
  477. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/lsp-pack/openai.yaml.statement.json +0 -35
  478. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/mcp-fabric/SKILL.md.minisig +0 -4
  479. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/mcp-fabric/SKILL.md.statement.json +0 -35
  480. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/mcp-fabric/openai.yaml.minisig +0 -4
  481. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/mcp-fabric/openai.yaml.statement.json +0 -35
  482. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/plan-council/SKILL.md.minisig +0 -4
  483. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/plan-council/SKILL.md.statement.json +0 -35
  484. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/plan-council/openai.yaml.minisig +0 -4
  485. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/plan-council/openai.yaml.statement.json +0 -35
  486. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/preflight/SKILL.md.minisig +0 -4
  487. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/preflight/SKILL.md.statement.json +0 -35
  488. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/preflight/openai.yaml.minisig +0 -4
  489. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/preflight/openai.yaml.statement.json +0 -35
  490. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/proof-gate/SKILL.md.minisig +0 -4
  491. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/proof-gate/SKILL.md.statement.json +0 -35
  492. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/proof-gate/openai.yaml.minisig +0 -4
  493. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/proof-gate/openai.yaml.statement.json +0 -35
  494. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/remote-supervisor/SKILL.md.minisig +0 -4
  495. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/remote-supervisor/SKILL.md.statement.json +0 -35
  496. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/remote-supervisor/openai.yaml.minisig +0 -4
  497. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/remote-supervisor/openai.yaml.statement.json +0 -35
  498. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/robotics/SKILL.md.minisig +0 -4
  499. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/robotics/SKILL.md.statement.json +0 -35
  500. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/robotics/openai.yaml.minisig +0 -4
  501. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/robotics/openai.yaml.statement.json +0 -35
  502. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md.minisig +0 -4
  503. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md.statement.json +0 -35
  504. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml.minisig +0 -4
  505. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml.statement.json +0 -35
  506. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/security-check/SKILL.md.minisig +0 -4
  507. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/security-check/SKILL.md.statement.json +0 -35
  508. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/security-check/openai.yaml.minisig +0 -4
  509. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/security-check/openai.yaml.statement.json +0 -35
  510. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/terminal-lane/SKILL.md.minisig +0 -4
  511. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/terminal-lane/SKILL.md.statement.json +0 -35
  512. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/terminal-lane/openai.yaml.minisig +0 -4
  513. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/terminal-lane/openai.yaml.statement.json +0 -35
  514. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/test-intent-lock/SKILL.md.minisig +0 -4
  515. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/test-intent-lock/SKILL.md.statement.json +0 -35
  516. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/test-intent-lock/openai.yaml.minisig +0 -4
  517. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/test-intent-lock/openai.yaml.statement.json +0 -35
  518. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/tracebank/SKILL.md.minisig +0 -4
  519. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/tracebank/SKILL.md.statement.json +0 -35
  520. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/tracebank/openai.yaml.minisig +0 -4
  521. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/tracebank/openai.yaml.statement.json +0 -35
  522. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/vision/SKILL.md.minisig +0 -4
  523. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/vision/SKILL.md.statement.json +0 -35
  524. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/vision/openai.yaml.minisig +0 -4
  525. package/artifacts/release/dist/public/attestations/bundle/.agents/skills/omg/vision/openai.yaml.statement.json +0 -35
  526. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/marketplace.json.minisig +0 -4
  527. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/marketplace.json.statement.json +0 -35
  528. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/mcp.json.minisig +0 -4
  529. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/mcp.json.statement.json +0 -35
  530. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/plugin.json.minisig +0 -4
  531. package/artifacts/release/dist/public/attestations/bundle/.claude-plugin/plugin.json.statement.json +0 -35
  532. package/artifacts/release/dist/public/attestations/bundle/.gemini/settings.json.minisig +0 -4
  533. package/artifacts/release/dist/public/attestations/bundle/.gemini/settings.json.statement.json +0 -35
  534. package/artifacts/release/dist/public/attestations/bundle/.kimi/mcp.json.minisig +0 -4
  535. package/artifacts/release/dist/public/attestations/bundle/.kimi/mcp.json.statement.json +0 -35
  536. package/artifacts/release/dist/public/attestations/bundle/.mcp.json.minisig +0 -4
  537. package/artifacts/release/dist/public/attestations/bundle/.mcp.json.statement.json +0 -35
  538. package/artifacts/release/dist/public/attestations/bundle/OMG_COMPAT_CONTRACT.md.minisig +0 -4
  539. package/artifacts/release/dist/public/attestations/bundle/OMG_COMPAT_CONTRACT.md.statement.json +0 -35
  540. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:code-review.md.minisig +0 -4
  541. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:code-review.md.statement.json +0 -35
  542. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:deep-plan.md.minisig +0 -4
  543. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:deep-plan.md.statement.json +0 -35
  544. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:handoff.md.minisig +0 -4
  545. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:handoff.md.statement.json +0 -35
  546. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:learn.md.minisig +0 -4
  547. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:learn.md.statement.json +0 -35
  548. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:maintainer.md.minisig +0 -4
  549. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:maintainer.md.statement.json +0 -35
  550. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ralph-start.md.minisig +0 -4
  551. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ralph-start.md.statement.json +0 -35
  552. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ralph-stop.md.minisig +0 -4
  553. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ralph-stop.md.statement.json +0 -35
  554. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:security-review.md.minisig +0 -4
  555. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:security-review.md.statement.json +0 -35
  556. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:sequential-thinking.md.minisig +0 -4
  557. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:sequential-thinking.md.statement.json +0 -35
  558. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ship.md.minisig +0 -4
  559. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/commands/OMG:ship.md.statement.json +0 -35
  560. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/plugin.json.minisig +0 -4
  561. package/artifacts/release/dist/public/attestations/bundle/plugins/advanced/plugin.json.statement.json +0 -35
  562. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/algorithms.yaml.minisig +0 -4
  563. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/algorithms.yaml.statement.json +0 -35
  564. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/api-twin.yaml.minisig +0 -4
  565. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/api-twin.yaml.statement.json +0 -35
  566. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/ast-pack.yaml.minisig +0 -4
  567. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/ast-pack.yaml.statement.json +0 -35
  568. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/claim-judge.yaml.minisig +0 -4
  569. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/claim-judge.yaml.statement.json +0 -35
  570. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/control-plane.yaml.minisig +0 -4
  571. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/control-plane.yaml.statement.json +0 -35
  572. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/data-lineage.yaml.minisig +0 -4
  573. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/data-lineage.yaml.statement.json +0 -35
  574. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/delta-classifier.yaml.minisig +0 -4
  575. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/delta-classifier.yaml.statement.json +0 -35
  576. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/eval-gate.yaml.minisig +0 -4
  577. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/eval-gate.yaml.statement.json +0 -35
  578. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/hash-edit.yaml.minisig +0 -4
  579. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/hash-edit.yaml.statement.json +0 -35
  580. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/health.yaml.minisig +0 -4
  581. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/health.yaml.statement.json +0 -35
  582. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/hook-governor.yaml.minisig +0 -4
  583. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/hook-governor.yaml.statement.json +0 -35
  584. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/incident-replay.yaml.minisig +0 -4
  585. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/incident-replay.yaml.statement.json +0 -35
  586. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/lsp-pack.yaml.minisig +0 -4
  587. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/lsp-pack.yaml.statement.json +0 -35
  588. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/mcp-fabric.yaml.minisig +0 -4
  589. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/mcp-fabric.yaml.statement.json +0 -35
  590. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/plan-council.yaml.minisig +0 -4
  591. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/plan-council.yaml.statement.json +0 -35
  592. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/preflight.yaml.minisig +0 -4
  593. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/preflight.yaml.statement.json +0 -35
  594. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/proof-gate.yaml.minisig +0 -4
  595. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/proof-gate.yaml.statement.json +0 -35
  596. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/remote-supervisor.yaml.minisig +0 -4
  597. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/remote-supervisor.yaml.statement.json +0 -35
  598. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/robotics.yaml.minisig +0 -4
  599. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/robotics.yaml.statement.json +0 -35
  600. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/secure-worktree-pipeline.yaml.minisig +0 -4
  601. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/secure-worktree-pipeline.yaml.statement.json +0 -35
  602. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/security-check.yaml.minisig +0 -4
  603. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/security-check.yaml.statement.json +0 -35
  604. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/terminal-lane.yaml.minisig +0 -4
  605. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/terminal-lane.yaml.statement.json +0 -35
  606. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/test-intent-lock.yaml.minisig +0 -4
  607. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/test-intent-lock.yaml.statement.json +0 -35
  608. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/tracebank.yaml.minisig +0 -4
  609. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/tracebank.yaml.statement.json +0 -35
  610. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/vision.yaml.minisig +0 -4
  611. package/artifacts/release/dist/public/attestations/bundle/registry/bundles/vision.yaml.statement.json +0 -35
  612. package/artifacts/release/dist/public/attestations/bundle/registry/omg-capability.schema.json.minisig +0 -4
  613. package/artifacts/release/dist/public/attestations/bundle/registry/omg-capability.schema.json.statement.json +0 -35
  614. package/artifacts/release/dist/public/attestations/bundle/settings.json.minisig +0 -4
  615. package/artifacts/release/dist/public/attestations/bundle/settings.json.statement.json +0 -35
  616. package/artifacts/release/dist/public/bundle/.agents/skills/omg/AGENTS.fragment.md +0 -75
  617. package/artifacts/release/dist/public/bundle/.agents/skills/omg/algorithms/SKILL.md +0 -11
  618. package/artifacts/release/dist/public/bundle/.agents/skills/omg/algorithms/openai.yaml +0 -11
  619. package/artifacts/release/dist/public/bundle/.agents/skills/omg/api-twin/SKILL.md +0 -11
  620. package/artifacts/release/dist/public/bundle/.agents/skills/omg/api-twin/openai.yaml +0 -12
  621. package/artifacts/release/dist/public/bundle/.agents/skills/omg/ast-pack/SKILL.md +0 -11
  622. package/artifacts/release/dist/public/bundle/.agents/skills/omg/ast-pack/openai.yaml +0 -12
  623. package/artifacts/release/dist/public/bundle/.agents/skills/omg/claim-judge/SKILL.md +0 -11
  624. package/artifacts/release/dist/public/bundle/.agents/skills/omg/claim-judge/openai.yaml +0 -13
  625. package/artifacts/release/dist/public/bundle/.agents/skills/omg/codex-mcp.toml +0 -4
  626. package/artifacts/release/dist/public/bundle/.agents/skills/omg/codex-rules.md +0 -38
  627. package/artifacts/release/dist/public/bundle/.agents/skills/omg/control-plane/SKILL.md +0 -11
  628. package/artifacts/release/dist/public/bundle/.agents/skills/omg/control-plane/openai.yaml +0 -14
  629. package/artifacts/release/dist/public/bundle/.agents/skills/omg/data-lineage/SKILL.md +0 -11
  630. package/artifacts/release/dist/public/bundle/.agents/skills/omg/data-lineage/openai.yaml +0 -12
  631. package/artifacts/release/dist/public/bundle/.agents/skills/omg/delta-classifier/SKILL.md +0 -11
  632. package/artifacts/release/dist/public/bundle/.agents/skills/omg/delta-classifier/openai.yaml +0 -12
  633. package/artifacts/release/dist/public/bundle/.agents/skills/omg/eval-gate/SKILL.md +0 -11
  634. package/artifacts/release/dist/public/bundle/.agents/skills/omg/eval-gate/openai.yaml +0 -12
  635. package/artifacts/release/dist/public/bundle/.agents/skills/omg/hash-edit/SKILL.md +0 -11
  636. package/artifacts/release/dist/public/bundle/.agents/skills/omg/hash-edit/openai.yaml +0 -11
  637. package/artifacts/release/dist/public/bundle/.agents/skills/omg/health/SKILL.md +0 -11
  638. package/artifacts/release/dist/public/bundle/.agents/skills/omg/health/openai.yaml +0 -11
  639. package/artifacts/release/dist/public/bundle/.agents/skills/omg/hook-governor/SKILL.md +0 -11
  640. package/artifacts/release/dist/public/bundle/.agents/skills/omg/hook-governor/openai.yaml +0 -11
  641. package/artifacts/release/dist/public/bundle/.agents/skills/omg/incident-replay/SKILL.md +0 -11
  642. package/artifacts/release/dist/public/bundle/.agents/skills/omg/incident-replay/openai.yaml +0 -12
  643. package/artifacts/release/dist/public/bundle/.agents/skills/omg/lsp-pack/SKILL.md +0 -11
  644. package/artifacts/release/dist/public/bundle/.agents/skills/omg/lsp-pack/openai.yaml +0 -12
  645. package/artifacts/release/dist/public/bundle/.agents/skills/omg/mcp-fabric/SKILL.md +0 -11
  646. package/artifacts/release/dist/public/bundle/.agents/skills/omg/mcp-fabric/openai.yaml +0 -13
  647. package/artifacts/release/dist/public/bundle/.agents/skills/omg/plan-council/SKILL.md +0 -11
  648. package/artifacts/release/dist/public/bundle/.agents/skills/omg/plan-council/openai.yaml +0 -12
  649. package/artifacts/release/dist/public/bundle/.agents/skills/omg/preflight/SKILL.md +0 -11
  650. package/artifacts/release/dist/public/bundle/.agents/skills/omg/preflight/openai.yaml +0 -12
  651. package/artifacts/release/dist/public/bundle/.agents/skills/omg/proof-gate/SKILL.md +0 -11
  652. package/artifacts/release/dist/public/bundle/.agents/skills/omg/proof-gate/openai.yaml +0 -13
  653. package/artifacts/release/dist/public/bundle/.agents/skills/omg/remote-supervisor/SKILL.md +0 -11
  654. package/artifacts/release/dist/public/bundle/.agents/skills/omg/remote-supervisor/openai.yaml +0 -12
  655. package/artifacts/release/dist/public/bundle/.agents/skills/omg/robotics/SKILL.md +0 -11
  656. package/artifacts/release/dist/public/bundle/.agents/skills/omg/robotics/openai.yaml +0 -11
  657. package/artifacts/release/dist/public/bundle/.agents/skills/omg/secure-worktree-pipeline/SKILL.md +0 -11
  658. package/artifacts/release/dist/public/bundle/.agents/skills/omg/secure-worktree-pipeline/openai.yaml +0 -12
  659. package/artifacts/release/dist/public/bundle/.agents/skills/omg/security-check/SKILL.md +0 -11
  660. package/artifacts/release/dist/public/bundle/.agents/skills/omg/security-check/openai.yaml +0 -13
  661. package/artifacts/release/dist/public/bundle/.agents/skills/omg/terminal-lane/SKILL.md +0 -11
  662. package/artifacts/release/dist/public/bundle/.agents/skills/omg/terminal-lane/openai.yaml +0 -11
  663. package/artifacts/release/dist/public/bundle/.agents/skills/omg/test-intent-lock/SKILL.md +0 -11
  664. package/artifacts/release/dist/public/bundle/.agents/skills/omg/test-intent-lock/openai.yaml +0 -13
  665. package/artifacts/release/dist/public/bundle/.agents/skills/omg/tracebank/SKILL.md +0 -11
  666. package/artifacts/release/dist/public/bundle/.agents/skills/omg/tracebank/openai.yaml +0 -12
  667. package/artifacts/release/dist/public/bundle/.agents/skills/omg/vision/SKILL.md +0 -11
  668. package/artifacts/release/dist/public/bundle/.agents/skills/omg/vision/openai.yaml +0 -11
  669. package/artifacts/release/dist/public/bundle/.claude-plugin/marketplace.json +0 -36
  670. package/artifacts/release/dist/public/bundle/.claude-plugin/mcp.json +0 -11
  671. package/artifacts/release/dist/public/bundle/.claude-plugin/plugin.json +0 -23
  672. package/artifacts/release/dist/public/bundle/.gemini/settings.json +0 -72
  673. package/artifacts/release/dist/public/bundle/.kimi/mcp.json +0 -72
  674. package/artifacts/release/dist/public/bundle/.mcp.json +0 -18
  675. package/artifacts/release/dist/public/bundle/OMG_COMPAT_CONTRACT.md +0 -111
  676. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:code-review.md +0 -114
  677. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:deep-plan.md +0 -266
  678. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:handoff.md +0 -115
  679. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:learn.md +0 -110
  680. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:maintainer.md +0 -31
  681. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:ralph-start.md +0 -43
  682. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:ralph-stop.md +0 -23
  683. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:security-review.md +0 -16
  684. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:sequential-thinking.md +0 -20
  685. package/artifacts/release/dist/public/bundle/plugins/advanced/commands/OMG:ship.md +0 -46
  686. package/artifacts/release/dist/public/bundle/plugins/advanced/plugin.json +0 -104
  687. package/artifacts/release/dist/public/bundle/registry/bundles/algorithms.yaml +0 -45
  688. package/artifacts/release/dist/public/bundle/registry/bundles/api-twin.yaml +0 -48
  689. package/artifacts/release/dist/public/bundle/registry/bundles/ast-pack.yaml +0 -80
  690. package/artifacts/release/dist/public/bundle/registry/bundles/claim-judge.yaml +0 -49
  691. package/artifacts/release/dist/public/bundle/registry/bundles/control-plane.yaml +0 -192
  692. package/artifacts/release/dist/public/bundle/registry/bundles/data-lineage.yaml +0 -47
  693. package/artifacts/release/dist/public/bundle/registry/bundles/delta-classifier.yaml +0 -47
  694. package/artifacts/release/dist/public/bundle/registry/bundles/eval-gate.yaml +0 -47
  695. package/artifacts/release/dist/public/bundle/registry/bundles/hash-edit.yaml +0 -73
  696. package/artifacts/release/dist/public/bundle/registry/bundles/health.yaml +0 -45
  697. package/artifacts/release/dist/public/bundle/registry/bundles/hook-governor.yaml +0 -101
  698. package/artifacts/release/dist/public/bundle/registry/bundles/incident-replay.yaml +0 -47
  699. package/artifacts/release/dist/public/bundle/registry/bundles/lsp-pack.yaml +0 -80
  700. package/artifacts/release/dist/public/bundle/registry/bundles/mcp-fabric.yaml +0 -53
  701. package/artifacts/release/dist/public/bundle/registry/bundles/plan-council.yaml +0 -56
  702. package/artifacts/release/dist/public/bundle/registry/bundles/preflight.yaml +0 -48
  703. package/artifacts/release/dist/public/bundle/registry/bundles/proof-gate.yaml +0 -49
  704. package/artifacts/release/dist/public/bundle/registry/bundles/remote-supervisor.yaml +0 -49
  705. package/artifacts/release/dist/public/bundle/registry/bundles/robotics.yaml +0 -45
  706. package/artifacts/release/dist/public/bundle/registry/bundles/secure-worktree-pipeline.yaml +0 -69
  707. package/artifacts/release/dist/public/bundle/registry/bundles/security-check.yaml +0 -50
  708. package/artifacts/release/dist/public/bundle/registry/bundles/terminal-lane.yaml +0 -61
  709. package/artifacts/release/dist/public/bundle/registry/bundles/test-intent-lock.yaml +0 -49
  710. package/artifacts/release/dist/public/bundle/registry/bundles/tracebank.yaml +0 -47
  711. package/artifacts/release/dist/public/bundle/registry/bundles/vision.yaml +0 -45
  712. package/artifacts/release/dist/public/bundle/registry/omg-capability.schema.json +0 -378
  713. package/artifacts/release/dist/public/bundle/settings.json +0 -694
  714. package/artifacts/release/dist/public/manifest.json +0 -1093
  715. package/artifacts/release/evidence/music-omr-run-1.json +0 -16
  716. package/artifacts/release/plugins/advanced/commands/OMG:code-review.md +0 -114
  717. package/artifacts/release/plugins/advanced/commands/OMG:deep-plan.md +0 -266
  718. package/artifacts/release/plugins/advanced/commands/OMG:handoff.md +0 -115
  719. package/artifacts/release/plugins/advanced/commands/OMG:learn.md +0 -110
  720. package/artifacts/release/plugins/advanced/commands/OMG:maintainer.md +0 -31
  721. package/artifacts/release/plugins/advanced/commands/OMG:ralph-start.md +0 -43
  722. package/artifacts/release/plugins/advanced/commands/OMG:ralph-stop.md +0 -23
  723. package/artifacts/release/plugins/advanced/commands/OMG:security-review.md +0 -16
  724. package/artifacts/release/plugins/advanced/commands/OMG:sequential-thinking.md +0 -20
  725. package/artifacts/release/plugins/advanced/commands/OMG:ship.md +0 -46
  726. package/artifacts/release/plugins/advanced/plugin.json +0 -104
  727. package/artifacts/release/registry/bundles/algorithms.yaml +0 -45
  728. package/artifacts/release/registry/bundles/api-twin.yaml +0 -48
  729. package/artifacts/release/registry/bundles/ast-pack.yaml +0 -80
  730. package/artifacts/release/registry/bundles/claim-judge.yaml +0 -49
  731. package/artifacts/release/registry/bundles/control-plane.yaml +0 -192
  732. package/artifacts/release/registry/bundles/data-lineage.yaml +0 -47
  733. package/artifacts/release/registry/bundles/delta-classifier.yaml +0 -47
  734. package/artifacts/release/registry/bundles/eval-gate.yaml +0 -47
  735. package/artifacts/release/registry/bundles/hash-edit.yaml +0 -73
  736. package/artifacts/release/registry/bundles/health.yaml +0 -45
  737. package/artifacts/release/registry/bundles/hook-governor.yaml +0 -101
  738. package/artifacts/release/registry/bundles/incident-replay.yaml +0 -47
  739. package/artifacts/release/registry/bundles/lsp-pack.yaml +0 -80
  740. package/artifacts/release/registry/bundles/mcp-fabric.yaml +0 -53
  741. package/artifacts/release/registry/bundles/plan-council.yaml +0 -56
  742. package/artifacts/release/registry/bundles/preflight.yaml +0 -48
  743. package/artifacts/release/registry/bundles/proof-gate.yaml +0 -49
  744. package/artifacts/release/registry/bundles/remote-supervisor.yaml +0 -49
  745. package/artifacts/release/registry/bundles/robotics.yaml +0 -45
  746. package/artifacts/release/registry/bundles/secure-worktree-pipeline.yaml +0 -69
  747. package/artifacts/release/registry/bundles/security-check.yaml +0 -50
  748. package/artifacts/release/registry/bundles/terminal-lane.yaml +0 -61
  749. package/artifacts/release/registry/bundles/test-intent-lock.yaml +0 -49
  750. package/artifacts/release/registry/bundles/tracebank.yaml +0 -47
  751. package/artifacts/release/registry/bundles/vision.yaml +0 -45
  752. package/artifacts/release/registry/omg-capability.schema.json +0 -378
  753. package/artifacts/release/settings.json +0 -694
  754. package/build/lib/agents/__init__.py +0 -1
  755. package/build/lib/agents/designer.md +0 -67
  756. package/build/lib/agents/explore.md +0 -60
  757. package/build/lib/agents/model_roles.py +0 -196
  758. package/build/lib/agents/omg-api-builder.md +0 -23
  759. package/build/lib/agents/omg-architect-mode.md +0 -41
  760. package/build/lib/agents/omg-architect.md +0 -13
  761. package/build/lib/agents/omg-backend-engineer.md +0 -41
  762. package/build/lib/agents/omg-critic.md +0 -16
  763. package/build/lib/agents/omg-database-engineer.md +0 -41
  764. package/build/lib/agents/omg-escalation-router.md +0 -17
  765. package/build/lib/agents/omg-executor.md +0 -12
  766. package/build/lib/agents/omg-frontend-designer.md +0 -41
  767. package/build/lib/agents/omg-implement-mode.md +0 -49
  768. package/build/lib/agents/omg-infra-engineer.md +0 -41
  769. package/build/lib/agents/omg-qa-tester.md +0 -16
  770. package/build/lib/agents/omg-research-mode.md +0 -41
  771. package/build/lib/agents/omg-security-auditor.md +0 -41
  772. package/build/lib/agents/omg-testing-engineer.md +0 -41
  773. package/build/lib/agents/plan.md +0 -80
  774. package/build/lib/agents/quick_task.md +0 -64
  775. package/build/lib/agents/reviewer.md +0 -83
  776. package/build/lib/agents/task.md +0 -71
  777. package/build/lib/commands/OMG:ai-commit.md +0 -113
  778. package/build/lib/commands/OMG:api-twin.md +0 -22
  779. package/build/lib/commands/OMG:arch.md +0 -313
  780. package/build/lib/commands/OMG:browser.md +0 -29
  781. package/build/lib/commands/OMG:ccg.md +0 -22
  782. package/build/lib/commands/OMG:compat.md +0 -57
  783. package/build/lib/commands/OMG:cost.md +0 -181
  784. package/build/lib/commands/OMG:crazy.md +0 -125
  785. package/build/lib/commands/OMG:create-agent.md +0 -183
  786. package/build/lib/commands/OMG:deep-plan.md +0 -18
  787. package/build/lib/commands/OMG:deps.md +0 -248
  788. package/build/lib/commands/OMG:diagnose-plugins.md +0 -33
  789. package/build/lib/commands/OMG:doctor.md +0 -37
  790. package/build/lib/commands/OMG:domain-init.md +0 -11
  791. package/build/lib/commands/OMG:escalate.md +0 -52
  792. package/build/lib/commands/OMG:forge.md +0 -103
  793. package/build/lib/commands/OMG:health-check.md +0 -48
  794. package/build/lib/commands/OMG:init.md +0 -134
  795. package/build/lib/commands/OMG:issue.md +0 -56
  796. package/build/lib/commands/OMG:mode.md +0 -44
  797. package/build/lib/commands/OMG:playwright.md +0 -17
  798. package/build/lib/commands/OMG:preflight.md +0 -26
  799. package/build/lib/commands/OMG:preset.md +0 -49
  800. package/build/lib/commands/OMG:profile-review.md +0 -58
  801. package/build/lib/commands/OMG:project-init.md +0 -11
  802. package/build/lib/commands/OMG:ralph-start.md +0 -43
  803. package/build/lib/commands/OMG:ralph-stop.md +0 -23
  804. package/build/lib/commands/OMG:security-check.md +0 -28
  805. package/build/lib/commands/OMG:session-branch.md +0 -101
  806. package/build/lib/commands/OMG:session-fork.md +0 -57
  807. package/build/lib/commands/OMG:session-merge.md +0 -138
  808. package/build/lib/commands/OMG:setup.md +0 -82
  809. package/build/lib/commands/OMG:stats.md +0 -225
  810. package/build/lib/commands/OMG:teams.md +0 -54
  811. package/build/lib/commands/OMG:theme.md +0 -44
  812. package/build/lib/commands/OMG:validate.md +0 -59
  813. package/build/lib/commands/__init__.py +0 -1
  814. package/build/lib/control_plane/__init__.py +0 -2
  815. package/build/lib/control_plane/openapi.yaml +0 -277
  816. package/build/lib/control_plane/server.py +0 -155
  817. package/build/lib/control_plane/service.py +0 -456
  818. package/build/lib/hooks/__init__.py +0 -0
  819. package/build/lib/hooks/_agent_registry.py +0 -479
  820. package/build/lib/hooks/_analytics.py +0 -291
  821. package/build/lib/hooks/_budget.py +0 -31
  822. package/build/lib/hooks/_common.py +0 -647
  823. package/build/lib/hooks/_compression_optimizer.py +0 -119
  824. package/build/lib/hooks/_cost_ledger.py +0 -176
  825. package/build/lib/hooks/_learnings.py +0 -126
  826. package/build/lib/hooks/_memory.py +0 -103
  827. package/build/lib/hooks/_protected_context.py +0 -150
  828. package/build/lib/hooks/_token_counter.py +0 -221
  829. package/build/lib/hooks/branch_manager.py +0 -253
  830. package/build/lib/hooks/budget_governor.py +0 -257
  831. package/build/lib/hooks/circuit-breaker.py +0 -270
  832. package/build/lib/hooks/compression_feedback.py +0 -254
  833. package/build/lib/hooks/config-guard.py +0 -216
  834. package/build/lib/hooks/context_pressure.py +0 -119
  835. package/build/lib/hooks/credential_store.py +0 -970
  836. package/build/lib/hooks/fetch-rate-limits.py +0 -212
  837. package/build/lib/hooks/firewall.py +0 -301
  838. package/build/lib/hooks/hashline-formatter-bridge.py +0 -224
  839. package/build/lib/hooks/hashline-injector.py +0 -273
  840. package/build/lib/hooks/hashline-validator.py +0 -216
  841. package/build/lib/hooks/idle-detector.py +0 -95
  842. package/build/lib/hooks/instructions-loaded.py +0 -26
  843. package/build/lib/hooks/intentgate-keyword-detector.py +0 -200
  844. package/build/lib/hooks/magic-keyword-router.py +0 -195
  845. package/build/lib/hooks/policy_engine.py +0 -718
  846. package/build/lib/hooks/post-tool-failure.py +0 -19
  847. package/build/lib/hooks/post-write.py +0 -219
  848. package/build/lib/hooks/post_write.py +0 -46
  849. package/build/lib/hooks/pre-compact.py +0 -470
  850. package/build/lib/hooks/pre-tool-inject.py +0 -98
  851. package/build/lib/hooks/prompt-enhancer.py +0 -877
  852. package/build/lib/hooks/quality-runner.py +0 -191
  853. package/build/lib/hooks/query.py +0 -512
  854. package/build/lib/hooks/secret-guard.py +0 -99
  855. package/build/lib/hooks/secret_audit.py +0 -144
  856. package/build/lib/hooks/security_validators.py +0 -75
  857. package/build/lib/hooks/session-end-capture.py +0 -505
  858. package/build/lib/hooks/session-start.py +0 -259
  859. package/build/lib/hooks/setup_wizard.py +0 -1132
  860. package/build/lib/hooks/shadow_manager.py +0 -476
  861. package/build/lib/hooks/state_migration.py +0 -228
  862. package/build/lib/hooks/stop-gate.py +0 -7
  863. package/build/lib/hooks/stop_dispatcher.py +0 -1130
  864. package/build/lib/hooks/tdd-gate.py +0 -10
  865. package/build/lib/hooks/test-validator.py +0 -430
  866. package/build/lib/hooks/test_generator_hook.py +0 -123
  867. package/build/lib/hooks/todo-state-tracker.py +0 -114
  868. package/build/lib/hooks/tool-ledger.py +0 -165
  869. package/build/lib/hooks/trust_review.py +0 -585
  870. package/build/lib/hooks/user-prompt-submit.py +0 -12
  871. package/build/lib/plugins/README.md +0 -64
  872. package/build/lib/plugins/__init__.py +0 -1
  873. package/build/lib/plugins/advanced/commands/OMG:code-review.md +0 -114
  874. package/build/lib/plugins/advanced/commands/OMG:deep-plan.md +0 -266
  875. package/build/lib/plugins/advanced/commands/OMG:handoff.md +0 -115
  876. package/build/lib/plugins/advanced/commands/OMG:learn.md +0 -110
  877. package/build/lib/plugins/advanced/commands/OMG:maintainer.md +0 -31
  878. package/build/lib/plugins/advanced/commands/OMG:ralph-start.md +0 -43
  879. package/build/lib/plugins/advanced/commands/OMG:ralph-stop.md +0 -23
  880. package/build/lib/plugins/advanced/commands/OMG:security-review.md +0 -16
  881. package/build/lib/plugins/advanced/commands/OMG:sequential-thinking.md +0 -20
  882. package/build/lib/plugins/advanced/commands/OMG:ship.md +0 -46
  883. package/build/lib/plugins/advanced/plugin.json +0 -104
  884. package/build/lib/plugins/core/plugin.json +0 -199
  885. package/build/lib/plugins/dephealth/__init__.py +0 -0
  886. package/build/lib/plugins/dephealth/cve_scanner.py +0 -279
  887. package/build/lib/plugins/dephealth/license_checker.py +0 -135
  888. package/build/lib/plugins/dephealth/manifest_detector.py +0 -423
  889. package/build/lib/plugins/dephealth/vuln_analyzer.py +0 -176
  890. package/build/lib/plugins/testgen/__init__.py +0 -0
  891. package/build/lib/plugins/testgen/codamosa_engine.py +0 -402
  892. package/build/lib/plugins/testgen/edge_case_synthesizer.py +0 -184
  893. package/build/lib/plugins/testgen/framework_detector.py +0 -271
  894. package/build/lib/plugins/testgen/skeleton_generator.py +0 -219
  895. package/build/lib/plugins/viz/__init__.py +0 -0
  896. package/build/lib/plugins/viz/ast_parser.py +0 -139
  897. package/build/lib/plugins/viz/diagram_generator.py +0 -192
  898. package/build/lib/plugins/viz/graph_builder.py +0 -444
  899. package/build/lib/plugins/viz/native_parsers.py +0 -259
  900. package/build/lib/plugins/viz/regex_parser.py +0 -112
  901. package/build/lib/registry/__init__.py +0 -1
  902. package/build/lib/registry/approval_artifact.py +0 -236
  903. package/build/lib/registry/bundles/algorithms.yaml +0 -45
  904. package/build/lib/registry/bundles/api-twin.yaml +0 -48
  905. package/build/lib/registry/bundles/ast-pack.yaml +0 -80
  906. package/build/lib/registry/bundles/claim-judge.yaml +0 -49
  907. package/build/lib/registry/bundles/control-plane.yaml +0 -192
  908. package/build/lib/registry/bundles/data-lineage.yaml +0 -47
  909. package/build/lib/registry/bundles/delta-classifier.yaml +0 -47
  910. package/build/lib/registry/bundles/eval-gate.yaml +0 -47
  911. package/build/lib/registry/bundles/hash-edit.yaml +0 -73
  912. package/build/lib/registry/bundles/health.yaml +0 -45
  913. package/build/lib/registry/bundles/hook-governor.yaml +0 -101
  914. package/build/lib/registry/bundles/incident-replay.yaml +0 -47
  915. package/build/lib/registry/bundles/lsp-pack.yaml +0 -80
  916. package/build/lib/registry/bundles/mcp-fabric.yaml +0 -53
  917. package/build/lib/registry/bundles/plan-council.yaml +0 -56
  918. package/build/lib/registry/bundles/preflight.yaml +0 -48
  919. package/build/lib/registry/bundles/proof-gate.yaml +0 -49
  920. package/build/lib/registry/bundles/remote-supervisor.yaml +0 -49
  921. package/build/lib/registry/bundles/robotics.yaml +0 -45
  922. package/build/lib/registry/bundles/secure-worktree-pipeline.yaml +0 -69
  923. package/build/lib/registry/bundles/security-check.yaml +0 -50
  924. package/build/lib/registry/bundles/terminal-lane.yaml +0 -61
  925. package/build/lib/registry/bundles/test-intent-lock.yaml +0 -49
  926. package/build/lib/registry/bundles/tracebank.yaml +0 -47
  927. package/build/lib/registry/bundles/vision.yaml +0 -45
  928. package/build/lib/registry/omg-capability.schema.json +0 -378
  929. package/build/lib/registry/trusted_signers.json +0 -19
  930. package/build/lib/registry/verify_artifact.py +0 -493
  931. package/build/lib/runtime/__init__.py +0 -36
  932. package/build/lib/runtime/adapters/__init__.py +0 -13
  933. package/build/lib/runtime/adapters/claude.py +0 -63
  934. package/build/lib/runtime/adapters/gpt.py +0 -56
  935. package/build/lib/runtime/adapters/local.py +0 -56
  936. package/build/lib/runtime/adoption.py +0 -276
  937. package/build/lib/runtime/api_twin.py +0 -450
  938. package/build/lib/runtime/architecture_signal.py +0 -226
  939. package/build/lib/runtime/artifact_parsers.py +0 -161
  940. package/build/lib/runtime/asset_loader.py +0 -62
  941. package/build/lib/runtime/background_verification.py +0 -178
  942. package/build/lib/runtime/budget_envelopes.py +0 -358
  943. package/build/lib/runtime/business_workflow.py +0 -234
  944. package/build/lib/runtime/canonical_surface.py +0 -53
  945. package/build/lib/runtime/claim_judge.py +0 -648
  946. package/build/lib/runtime/cli_provider.py +0 -105
  947. package/build/lib/runtime/compat.py +0 -1515
  948. package/build/lib/runtime/complexity_scorer.py +0 -148
  949. package/build/lib/runtime/compliance_governor.py +0 -479
  950. package/build/lib/runtime/context_engine.py +0 -708
  951. package/build/lib/runtime/context_limits.py +0 -363
  952. package/build/lib/runtime/contract_compiler.py +0 -3202
  953. package/build/lib/runtime/custom_agent_loader.py +0 -366
  954. package/build/lib/runtime/data_lineage.py +0 -244
  955. package/build/lib/runtime/defense_state.py +0 -261
  956. package/build/lib/runtime/delta_classifier.py +0 -163
  957. package/build/lib/runtime/dispatcher.py +0 -47
  958. package/build/lib/runtime/domain_packs.py +0 -75
  959. package/build/lib/runtime/ecosystem.py +0 -371
  960. package/build/lib/runtime/equalizer.py +0 -265
  961. package/build/lib/runtime/eval_gate.py +0 -96
  962. package/build/lib/runtime/evidence_query.py +0 -303
  963. package/build/lib/runtime/evidence_registry.py +0 -16
  964. package/build/lib/runtime/evidence_requirements.py +0 -157
  965. package/build/lib/runtime/exec_kernel.py +0 -267
  966. package/build/lib/runtime/feature_registry.py +0 -109
  967. package/build/lib/runtime/forge_agents.py +0 -915
  968. package/build/lib/runtime/forge_contracts.py +0 -519
  969. package/build/lib/runtime/forge_domains.py +0 -68
  970. package/build/lib/runtime/forge_run_id.py +0 -86
  971. package/build/lib/runtime/github_integration.py +0 -255
  972. package/build/lib/runtime/github_review_bot.py +0 -290
  973. package/build/lib/runtime/github_review_contract.py +0 -65
  974. package/build/lib/runtime/github_review_formatter.py +0 -165
  975. package/build/lib/runtime/guide_assert.py +0 -135
  976. package/build/lib/runtime/hook_governor.py +0 -156
  977. package/build/lib/runtime/host_parity.py +0 -373
  978. package/build/lib/runtime/incident_replay.py +0 -310
  979. package/build/lib/runtime/interaction_journal.py +0 -503
  980. package/build/lib/runtime/issue_surface.py +0 -362
  981. package/build/lib/runtime/legacy_compat.py +0 -7
  982. package/build/lib/runtime/mcp_config_writers.py +0 -233
  983. package/build/lib/runtime/mcp_lifecycle.py +0 -175
  984. package/build/lib/runtime/mcp_memory_server.py +0 -220
  985. package/build/lib/runtime/memory_parsers/__init__.py +0 -0
  986. package/build/lib/runtime/memory_parsers/chatgpt_parser.py +0 -257
  987. package/build/lib/runtime/memory_parsers/claude_import.py +0 -107
  988. package/build/lib/runtime/memory_parsers/export.py +0 -97
  989. package/build/lib/runtime/memory_parsers/gemini_import.py +0 -91
  990. package/build/lib/runtime/memory_parsers/kimi_import.py +0 -91
  991. package/build/lib/runtime/memory_store.py +0 -1182
  992. package/build/lib/runtime/merge_writer.py +0 -408
  993. package/build/lib/runtime/music_omr_testbed.py +0 -333
  994. package/build/lib/runtime/mutation_gate.py +0 -258
  995. package/build/lib/runtime/omc_compat.py +0 -7
  996. package/build/lib/runtime/omg_browser_cli.py +0 -95
  997. package/build/lib/runtime/omg_compat_contract_snapshot.json +0 -916
  998. package/build/lib/runtime/omg_contract_snapshot.json +0 -916
  999. package/build/lib/runtime/omg_mcp_server.py +0 -304
  1000. package/build/lib/runtime/playwright_adapter.py +0 -39
  1001. package/build/lib/runtime/playwright_pack.py +0 -253
  1002. package/build/lib/runtime/plugin_diagnostics.py +0 -248
  1003. package/build/lib/runtime/plugin_interop.py +0 -1035
  1004. package/build/lib/runtime/preflight.py +0 -135
  1005. package/build/lib/runtime/profile_io.py +0 -328
  1006. package/build/lib/runtime/proof_chain.py +0 -472
  1007. package/build/lib/runtime/proof_gate.py +0 -442
  1008. package/build/lib/runtime/providers/__init__.py +0 -0
  1009. package/build/lib/runtime/providers/codex_provider.py +0 -127
  1010. package/build/lib/runtime/providers/gemini_provider.py +0 -141
  1011. package/build/lib/runtime/providers/kimi_provider.py +0 -166
  1012. package/build/lib/runtime/providers/opencode_provider.py +0 -99
  1013. package/build/lib/runtime/release_run_coordinator.py +0 -547
  1014. package/build/lib/runtime/release_surfaces.py +0 -313
  1015. package/build/lib/runtime/remote_supervisor.py +0 -79
  1016. package/build/lib/runtime/repro_pack.py +0 -398
  1017. package/build/lib/runtime/rollback_manifest.py +0 -136
  1018. package/build/lib/runtime/router_critics.py +0 -229
  1019. package/build/lib/runtime/router_executor.py +0 -142
  1020. package/build/lib/runtime/router_selector.py +0 -99
  1021. package/build/lib/runtime/runtime_contracts.py +0 -292
  1022. package/build/lib/runtime/runtime_profile.py +0 -133
  1023. package/build/lib/runtime/security_check.py +0 -1064
  1024. package/build/lib/runtime/session_health.py +0 -524
  1025. package/build/lib/runtime/skill_evolution.py +0 -221
  1026. package/build/lib/runtime/skill_registry.py +0 -53
  1027. package/build/lib/runtime/subagent_dispatcher.py +0 -604
  1028. package/build/lib/runtime/team_router.py +0 -1374
  1029. package/build/lib/runtime/test_intent_lock.py +0 -521
  1030. package/build/lib/runtime/tmux_session_manager.py +0 -172
  1031. package/build/lib/runtime/tool_fabric.py +0 -570
  1032. package/build/lib/runtime/tool_plan_gate.py +0 -452
  1033. package/build/lib/runtime/tracebank.py +0 -125
  1034. package/build/lib/runtime/untrusted_content.py +0 -307
  1035. package/build/lib/runtime/validate.py +0 -293
  1036. package/build/lib/runtime/verification_controller.py +0 -235
  1037. package/build/lib/runtime/verification_loop.py +0 -73
  1038. package/build/lib/runtime/vision_artifacts.py +0 -31
  1039. package/build/lib/runtime/vision_cache.py +0 -38
  1040. package/build/lib/runtime/vision_jobs.py +0 -89
  1041. package/build/lib/runtime/worker_watchdog.py +0 -482
  1042. package/dist/oh_my_god-2.1.4-py3-none-any.whl +0 -0
  1043. package/dist/oh_my_god-2.1.4.tar.gz +0 -0
  1044. package/dist/oh_my_god-2.1.7-py3-none-any.whl +0 -0
  1045. package/dist/oh_my_god-2.1.8-py3-none-any.whl +0 -0
  1046. package/dist/oh_my_god-2.1.9-py3-none-any.whl +0 -0
  1047. package/dist/oh_my_god-2.2.2-py3-none-any.whl +0 -0
@@ -1,3202 +0,0 @@
1
- """Canonical OMG contract registry, compiler, and release-readiness checks."""
2
- from __future__ import annotations
3
-
4
- import hashlib
5
- import asyncio
6
- import importlib
7
- import importlib.util
8
- import json
9
- import os
10
- from datetime import datetime, timezone
11
- from pathlib import Path
12
- import re
13
- import shutil
14
- import subprocess
15
- import sys
16
- import tempfile
17
- from typing import Any, Iterable
18
- from urllib.parse import urlparse
19
- import zipfile
20
-
21
- import yaml
22
-
23
- from runtime.asset_loader import resolve_asset, resolve_assets
24
- from runtime.proof_chain import _normalize_evidence_pack
25
- from runtime.evidence_requirements import requirements_for_profile
26
- from runtime.runtime_contracts import schema_versions
27
- from runtime.compliance_governor import evaluate_release_compliance
28
- from runtime.release_run_coordinator import get_active_coordinator_run_id
29
- from runtime.release_surfaces import get_package_parity_surfaces, get_runtime_behavior_surfaces
30
- from runtime.adoption import (
31
- CANONICAL_MARKETPLACE_ID,
32
- CANONICAL_PACKAGE_NAME,
33
- CANONICAL_PLUGIN_ID,
34
- CANONICAL_REPO_URL,
35
- CANONICAL_VERSION,
36
- )
37
- from runtime.canonical_surface import get_canonical_hosts, get_compat_hosts
38
- from registry.verify_artifact import sign_artifact_statement, verify_artifact_statement
39
-
40
-
41
- CONTRACT_DOC_PATH = Path("OMG_COMPAT_CONTRACT.md")
42
- SCHEMA_PATH = Path("registry") / "omg-capability.schema.json"
43
- BUNDLES_DIR = Path("registry") / "bundles"
44
- SUPPORTED_HOSTS = tuple(get_canonical_hosts())
45
- RELEASE_BLOCKING_HOSTS = tuple(get_canonical_hosts())
46
- # Compatibility-only hosts (for example, OpenCode) are intentionally excluded from
47
- # release-blocking parity and compile-readiness requirements.
48
- COMPATIBILITY_ONLY_HOSTS = tuple(get_compat_hosts())
49
- SUPPORTED_CHANNELS = ("public", "enterprise")
50
- DEFAULT_REQUIRED_BUNDLES = (
51
- "control-plane",
52
- "plan-council",
53
- "claim-judge",
54
- "test-intent-lock",
55
- "proof-gate",
56
- "hook-governor",
57
- "mcp-fabric",
58
- "lsp-pack",
59
- "secure-worktree-pipeline",
60
- "security-check",
61
- "api-twin",
62
- "preflight",
63
- "robotics",
64
- "vision",
65
- "algorithms",
66
- "health",
67
- "tracebank",
68
- "eval-gate",
69
- "delta-classifier",
70
- "incident-replay",
71
- "data-lineage",
72
- "remote-supervisor",
73
- )
74
- TRUTH_COUNCIL_BUNDLES = (
75
- "plan-council",
76
- "claim-judge",
77
- "test-intent-lock",
78
- "proof-gate",
79
- )
80
- def _get_required_advanced_plugin_artifacts(root: Path) -> tuple[str, ...]:
81
- manifest_path = root / "plugins" / "advanced" / "plugin.json"
82
- try:
83
- manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
84
- except (OSError, json.JSONDecodeError):
85
- return ()
86
-
87
- required: list[str] = ["bundle/plugins/advanced/plugin.json"]
88
- seen = set(required)
89
- commands = manifest.get("commands", {})
90
- if not isinstance(commands, dict):
91
- return tuple(required)
92
-
93
- for command in commands.values():
94
- if not isinstance(command, dict):
95
- continue
96
- command_path = command.get("path")
97
- if not isinstance(command_path, str) or not command_path:
98
- continue
99
- bundled_path = f"bundle/plugins/advanced/{command_path}"
100
- if bundled_path in seen:
101
- continue
102
- required.append(bundled_path)
103
- seen.add(bundled_path)
104
- return tuple(required)
105
- REQUIRED_DOC_TOKENS = (
106
- "execution_contract",
107
- "tool_policy",
108
- "invocation_policy",
109
- "host_compilation_rules",
110
- "local_supervisor",
111
- )
112
- REQUIRED_BUNDLE_FIELDS = (
113
- "id",
114
- "kind",
115
- "version",
116
- "title",
117
- "description",
118
- "hosts",
119
- "assets",
120
- "invocation_policy",
121
- "tool_policy",
122
- "lifecycle_hooks",
123
- "mcp_contract",
124
- "lsp_contract",
125
- "evidence_outputs",
126
- "execution_contract",
127
- "channel_overrides",
128
- )
129
- REQUIRED_POLICY_MODEL_FIELDS = (
130
- "trust_tiers",
131
- "tool_policies",
132
- "protected_paths",
133
- "evidence_contract",
134
- "host_rules",
135
- )
136
- REQUIRED_CLAUDE_HOOK_EVENTS = (
137
- "UserPromptSubmit",
138
- "PreToolUse",
139
- "PostToolUse",
140
- "PostToolUseFailure",
141
- "InstructionsLoaded",
142
- )
143
- REQUIRED_CLAUDE_SUBAGENT_NAMES = ("security-reviewer", "release-manager")
144
- REQUIRED_CODEX_AGENTS_SECTIONS = (
145
- "## Build & Test",
146
- "## Protected Paths",
147
- "## Evidence Contract",
148
- "## Release Audit",
149
- "## Required Skills",
150
- "## Web Search Policy",
151
- "## Approval Constraints",
152
- )
153
- REQUIRED_CODEX_OUTPUTS = (
154
- "AGENTS.fragment.md",
155
- "codex-rules.md",
156
- "codex-mcp.toml",
157
- )
158
- HOST_COMPILED_ARTIFACTS = {
159
- "claude": (
160
- ".claude-plugin/plugin.json",
161
- ".claude-plugin/marketplace.json",
162
- ".mcp.json",
163
- "settings.json",
164
- ),
165
- "codex": (
166
- ".agents/skills/omg/AGENTS.fragment.md",
167
- ".agents/skills/omg/codex-rules.md",
168
- ".agents/skills/omg/codex-mcp.toml",
169
- ),
170
- "gemini": (
171
- ".gemini/settings.json",
172
- ),
173
- "kimi": (
174
- ".kimi/mcp.json",
175
- ),
176
- }
177
-
178
- _HOST_POLICY_REQUIRED_FIELDS: dict[str, tuple[str, ...]] = {
179
- "claude": ("compilation_targets", "hooks", "subagents", "skills"),
180
- "codex": ("compilation_targets", "skills", "agents_fragments", "rules", "automations"),
181
- "gemini": ("compilation_targets", "mcp", "skills", "automations"),
182
- "kimi": ("compilation_targets", "mcp", "skills", "automations"),
183
- }
184
-
185
- _REQUIRED_EXECUTION_PRIMITIVES = (
186
- "release_run_coordinator_state",
187
- "tdd_proof_chain_lock",
188
- "rollback_manifest",
189
- "intent_gate_state",
190
- "profile_digest",
191
- "session_health_state",
192
- "council_verdicts",
193
- "forge_starter_proof",
194
- "claim_judge_outcome",
195
- "compliance_governor_outcome",
196
- "exec_kernel_state",
197
- "worker_watchdog_replay",
198
- "merge_writer_provenance",
199
- "write_lease_provenance",
200
- "tool_fabric_ledger",
201
- "budget_envelope_state",
202
- "issue_report",
203
- "host_parity_report",
204
- "music_omr_testbed_evidence",
205
- )
206
-
207
- _PHASE1_FORGE_SPECIALIST_SURFACES = (
208
- "forge-profile-review",
209
- "forge-release-audit",
210
- "forge-validate",
211
- )
212
-
213
- _PHASE1_RELEASE_SURFACES = (
214
- "OMG:profile-review",
215
- "OMG:release-audit",
216
- "OMG:validate",
217
- )
218
-
219
- _PHASE1_ATTESTATION_REQUIREMENTS = (
220
- "registry.verify_artifact.sign_artifact_statement",
221
- "registry.verify_artifact.verify_artifact_statement",
222
- )
223
-
224
- _PHASE1_COMPLIANCE_EXPECTATIONS = (
225
- "runtime.compliance_governor.evaluate_release_compliance",
226
- "runtime.compliance_governor.evaluate_tool_compliance",
227
- )
228
-
229
- _PHASE1_RELEASE_READINESS_CHECKS = (
230
- "claim_judge",
231
- "compliance_governor",
232
- "execution_primitives",
233
- )
234
-
235
- _PHASE1_RUNTIME_BEHAVIOR_SURFACES = tuple(get_runtime_behavior_surfaces())
236
-
237
- _REQUIRED_CONTEXT_METADATA = (
238
- "context_checksum",
239
- "profile_version",
240
- "intent_gate_version",
241
- )
242
-
243
- _DEFAULT_EXECUTION_PRIMITIVE_MAX_AGE_SECONDS = 3600.0
244
-
245
-
246
- def _ensure_list(
247
- *,
248
- bundle_id: str,
249
- path: str,
250
- value: Any,
251
- errors: list[str],
252
- min_items: int = 1,
253
- ) -> list[Any]:
254
- if not isinstance(value, list):
255
- errors.append(f"{bundle_id}: {path} must be a list")
256
- return []
257
- if len(value) < min_items:
258
- errors.append(f"{bundle_id}: {path} must contain at least {min_items} item(s)")
259
- return value
260
-
261
-
262
- def _ensure_dict(*, bundle_id: str, path: str, value: Any, errors: list[str]) -> dict[str, Any]:
263
- if not isinstance(value, dict):
264
- errors.append(f"{bundle_id}: {path} must be an object")
265
- return {}
266
- return value
267
-
268
-
269
- def _validate_host_rule(
270
- *,
271
- bundle_id: str,
272
- host_name: str,
273
- host_rule: Any,
274
- required_fields: tuple[str, ...],
275
- errors: list[str],
276
- ) -> None:
277
- path = f"policy_model.host_rules.{host_name}"
278
- host_payload = _ensure_dict(bundle_id=bundle_id, path=path, value=host_rule, errors=errors)
279
- if not host_payload:
280
- return
281
- for field in required_fields:
282
- if field not in host_payload:
283
- errors.append(f"{bundle_id}: malformed host_rules entry for {host_name}: missing '{field}'")
284
- continue
285
- _ensure_list(
286
- bundle_id=bundle_id,
287
- path=f"{path}.{field}",
288
- value=host_payload[field],
289
- errors=errors,
290
- min_items=1,
291
- )
292
-
293
-
294
- def _validate_policy_model(
295
- bundle_id: str,
296
- policy_model: Any,
297
- *,
298
- bundle_hosts: Iterable[str] = (),
299
- ) -> list[str]:
300
- errors: list[str] = []
301
- payload = _ensure_dict(bundle_id=bundle_id, path="policy_model", value=policy_model, errors=errors)
302
- if not payload:
303
- return errors
304
-
305
- for field in REQUIRED_POLICY_MODEL_FIELDS:
306
- if field not in payload:
307
- errors.append(f"{bundle_id}: policy_model missing field {field}")
308
-
309
- tier_names: set[str] = set()
310
- for index, tier in enumerate(
311
- _ensure_list(
312
- bundle_id=bundle_id,
313
- path="policy_model.trust_tiers",
314
- value=payload.get("trust_tiers", []),
315
- errors=errors,
316
- )
317
- ):
318
- tier_payload = _ensure_dict(
319
- bundle_id=bundle_id,
320
- path=f"policy_model.trust_tiers[{index}]",
321
- value=tier,
322
- errors=errors,
323
- )
324
- if not tier_payload:
325
- continue
326
- for field in ("name", "level", "label", "allowed_sources"):
327
- if field not in tier_payload:
328
- errors.append(f"{bundle_id}: policy_model.trust_tiers[{index}] missing field {field}")
329
- if isinstance(tier_payload.get("name"), str) and tier_payload["name"].strip():
330
- tier_names.add(tier_payload["name"].strip())
331
- if "allowed_sources" in tier_payload:
332
- _ensure_list(
333
- bundle_id=bundle_id,
334
- path=f"policy_model.trust_tiers[{index}].allowed_sources",
335
- value=tier_payload.get("allowed_sources"),
336
- errors=errors,
337
- min_items=1,
338
- )
339
-
340
- for index, tool in enumerate(
341
- _ensure_list(
342
- bundle_id=bundle_id,
343
- path="policy_model.tool_policies",
344
- value=payload.get("tool_policies", []),
345
- errors=errors,
346
- )
347
- ):
348
- tool_payload = _ensure_dict(
349
- bundle_id=bundle_id,
350
- path=f"policy_model.tool_policies[{index}]",
351
- value=tool,
352
- errors=errors,
353
- )
354
- if not tool_payload:
355
- continue
356
- for field in ("tool_name", "allowed_tiers", "requires_approval"):
357
- if field not in tool_payload:
358
- errors.append(f"{bundle_id}: policy_model.tool_policies[{index}] missing field {field}")
359
- allowed_tiers = _ensure_list(
360
- bundle_id=bundle_id,
361
- path=f"policy_model.tool_policies[{index}].allowed_tiers",
362
- value=tool_payload.get("allowed_tiers", []),
363
- errors=errors,
364
- min_items=1,
365
- )
366
- if tier_names:
367
- unknown_tiers = sorted(
368
- tier_name
369
- for tier_name in allowed_tiers
370
- if isinstance(tier_name, str) and tier_name not in tier_names
371
- )
372
- if unknown_tiers:
373
- errors.append(
374
- f"{bundle_id}: policy_model.tool_policies[{index}] references unknown tiers {unknown_tiers}"
375
- )
376
-
377
- for index, item in enumerate(
378
- _ensure_list(
379
- bundle_id=bundle_id,
380
- path="policy_model.protected_paths",
381
- value=payload.get("protected_paths", []),
382
- errors=errors,
383
- )
384
- ):
385
- path_payload = _ensure_dict(
386
- bundle_id=bundle_id,
387
- path=f"policy_model.protected_paths[{index}]",
388
- value=item,
389
- errors=errors,
390
- )
391
- if not path_payload:
392
- continue
393
- for field in ("path_pattern", "required_tier"):
394
- if field not in path_payload:
395
- errors.append(f"{bundle_id}: policy_model.protected_paths[{index}] missing field {field}")
396
- required_tier = path_payload.get("required_tier")
397
- if tier_names and isinstance(required_tier, str) and required_tier not in tier_names:
398
- errors.append(
399
- f"{bundle_id}: policy_model.protected_paths[{index}] references unknown tier '{required_tier}'"
400
- )
401
-
402
- evidence_contract = _ensure_dict(
403
- bundle_id=bundle_id,
404
- path="policy_model.evidence_contract",
405
- value=payload.get("evidence_contract", {}),
406
- errors=errors,
407
- )
408
- for field in ("timestamp", "executor", "trace_id", "lineage"):
409
- if field not in evidence_contract:
410
- errors.append(f"{bundle_id}: policy_model.evidence_contract missing field {field}")
411
-
412
- host_rules = _ensure_dict(
413
- bundle_id=bundle_id,
414
- path="policy_model.host_rules",
415
- value=payload.get("host_rules", {}),
416
- errors=errors,
417
- )
418
- declared_hosts = {str(host).strip() for host in bundle_hosts if str(host).strip()}
419
-
420
- for host_name in get_canonical_hosts():
421
- if host_name not in host_rules and host_name not in declared_hosts:
422
- continue
423
- required_fields = _HOST_POLICY_REQUIRED_FIELDS.get(host_name)
424
- if required_fields is None:
425
- continue
426
- _validate_host_rule(
427
- bundle_id=bundle_id,
428
- host_name=host_name,
429
- host_rule=host_rules.get(host_name),
430
- required_fields=required_fields,
431
- errors=errors,
432
- )
433
- return errors
434
-
435
-
436
- def _policy_model_for_bundle(bundles: Iterable[dict[str, Any]], bundle_id: str) -> dict[str, Any] | None:
437
- for bundle in bundles:
438
- if str(bundle.get("id", "")) == bundle_id and isinstance(bundle.get("policy_model"), dict):
439
- return dict(bundle["policy_model"])
440
- return None
441
-
442
-
443
- def _policy_protected_paths(policy_model: dict[str, Any] | None, *, channel: str) -> list[str]:
444
- if not policy_model:
445
- return _protected_paths_for_channel(channel)
446
- values: list[str] = []
447
- for item in policy_model.get("protected_paths", []):
448
- if isinstance(item, dict):
449
- pattern = str(item.get("path_pattern", "")).strip()
450
- if pattern:
451
- values.append(pattern)
452
- return values or _protected_paths_for_channel(channel)
453
-
454
-
455
- def _resolve_root(root_dir: str | Path | None) -> Path:
456
- if root_dir is None:
457
- return Path(__file__).resolve().parents[1]
458
- return Path(root_dir).resolve()
459
-
460
-
461
- def _resolve_output_root(root_dir: Path, output_root: str | Path | None) -> Path:
462
- if output_root is None or str(output_root).strip() == "":
463
- return root_dir
464
- return Path(output_root).resolve()
465
-
466
-
467
- def _load_json(path: Path) -> dict[str, Any]:
468
- parsed = json.loads(path.read_text(encoding="utf-8"))
469
- if not isinstance(parsed, dict):
470
- raise ValueError(f"Expected JSON object in {path}")
471
- return parsed
472
-
473
-
474
- def _write_json(path: Path, payload: dict[str, Any]) -> None:
475
- path.parent.mkdir(parents=True, exist_ok=True)
476
- path.write_text(json.dumps(payload, indent=2, ensure_ascii=True) + "\n", encoding="utf-8")
477
-
478
-
479
- def _write_text(path: Path, content: str) -> None:
480
- path.parent.mkdir(parents=True, exist_ok=True)
481
- path.write_text(content, encoding="utf-8")
482
-
483
-
484
- def _build_phase1_release_contract() -> dict[str, list[str]]:
485
- return {
486
- "forge_specialist_surfaces": list(_PHASE1_FORGE_SPECIALIST_SURFACES),
487
- "release_surfaces": list(_PHASE1_RELEASE_SURFACES),
488
- "attestation_requirements": list(_PHASE1_ATTESTATION_REQUIREMENTS),
489
- "compliance_governor_expectations": list(_PHASE1_COMPLIANCE_EXPECTATIONS),
490
- "release_readiness_checks": list(_PHASE1_RELEASE_READINESS_CHECKS),
491
- "runtime_behavior_surfaces": list(_PHASE1_RUNTIME_BEHAVIOR_SURFACES),
492
- }
493
-
494
-
495
- def _sha256_file(path: Path) -> str:
496
- digest = hashlib.sha256()
497
- with path.open("rb") as handle:
498
- for chunk in iter(lambda: handle.read(65536), b""):
499
- digest.update(chunk)
500
- return digest.hexdigest()
501
-
502
-
503
- def load_contract_doc(root_dir: str | Path | None = None) -> str:
504
- if root_dir is not None:
505
- root = _resolve_root(root_dir)
506
- candidate = root / CONTRACT_DOC_PATH
507
- if candidate.exists():
508
- return candidate.read_text(encoding="utf-8")
509
- return resolve_asset(CONTRACT_DOC_PATH).read_text(encoding="utf-8")
510
-
511
-
512
- def load_contract_schema(root_dir: str | Path | None = None) -> dict[str, Any]:
513
- if root_dir is not None:
514
- root = _resolve_root(root_dir)
515
- candidate = root / SCHEMA_PATH
516
- if candidate.exists():
517
- return _load_json(candidate)
518
- return _load_json(resolve_asset(SCHEMA_PATH))
519
-
520
-
521
- def load_contract_bundles(root_dir: str | Path | None = None) -> list[dict[str, Any]]:
522
- root = _resolve_root(root_dir)
523
- bundles: list[dict[str, Any]] = []
524
- paths = sorted((root / BUNDLES_DIR).glob("*.yaml")) if (root / BUNDLES_DIR).exists() else resolve_assets(BUNDLES_DIR, suffix=".yaml")
525
- for path in paths:
526
- parsed = yaml.safe_load(path.read_text(encoding="utf-8"))
527
- if not isinstance(parsed, dict):
528
- raise ValueError(f"Expected mapping bundle manifest in {path}")
529
- bundle = dict(parsed)
530
- try:
531
- bundle["_path"] = str(path.relative_to(root))
532
- except ValueError:
533
- bundle["_path"] = str(Path(BUNDLES_DIR) / path.name)
534
- bundles.append(bundle)
535
- return bundles
536
-
537
-
538
- def _bundle_summary(bundle: dict[str, Any]) -> dict[str, Any]:
539
- return {
540
- "id": bundle.get("id", ""),
541
- "kind": bundle.get("kind", ""),
542
- "version": bundle.get("version", ""),
543
- "title": bundle.get("title", ""),
544
- "hosts": list(bundle.get("hosts", [])),
545
- "path": bundle.get("_path", ""),
546
- }
547
-
548
-
549
- def validate_contract_registry(root_dir: str | Path | None = None) -> dict[str, Any]:
550
- root = _resolve_root(root_dir)
551
- errors: list[str] = []
552
-
553
- try:
554
- doc_text = load_contract_doc(root)
555
- except FileNotFoundError:
556
- errors.append(f"missing contract doc: {CONTRACT_DOC_PATH}")
557
- doc_text = ""
558
- else:
559
- for token in REQUIRED_DOC_TOKENS:
560
- if token not in doc_text:
561
- errors.append(f"contract doc missing token: {token}")
562
- if CANONICAL_VERSION not in doc_text:
563
- errors.append(f"contract doc missing version: {CANONICAL_VERSION}")
564
-
565
- try:
566
- schema_payload = load_contract_schema(root)
567
- except FileNotFoundError:
568
- errors.append(f"missing contract schema: {SCHEMA_PATH}")
569
- schema_payload: dict[str, Any] = {}
570
- else:
571
- if str(schema_payload.get("version", "")) != CANONICAL_VERSION:
572
- errors.append(f"contract schema version drift: {schema_payload.get('version')!r}")
573
-
574
- bundles = load_contract_bundles(root)
575
- if not bundles:
576
- errors.append(f"missing bundles directory: {BUNDLES_DIR}")
577
-
578
- bundle_ids = set()
579
- bundle_summaries: list[dict[str, Any]] = []
580
- for bundle in bundles:
581
- bundle_summaries.append(_bundle_summary(bundle))
582
- bundle_id = str(bundle.get("id", "")).strip()
583
- if not bundle_id:
584
- errors.append(f"bundle missing id: {bundle.get('_path', '<unknown>')}")
585
- continue
586
- if bundle_id in bundle_ids:
587
- errors.append(f"duplicate bundle id: {bundle_id}")
588
- bundle_ids.add(bundle_id)
589
- for field in REQUIRED_BUNDLE_FIELDS:
590
- if field not in bundle:
591
- errors.append(f"{bundle_id}: missing field {field}")
592
- if bundle.get("version") != CANONICAL_VERSION:
593
- errors.append(f"{bundle_id}: version drift {bundle.get('version')!r}")
594
- hosts = bundle.get("hosts", [])
595
- if not isinstance(hosts, list) or not hosts:
596
- errors.append(f"{bundle_id}: hosts must be a non-empty list")
597
- else:
598
- bad_hosts = [host for host in hosts if host not in SUPPORTED_HOSTS]
599
- if bad_hosts:
600
- errors.append(f"{bundle_id}: unsupported hosts {bad_hosts}")
601
- if "policy_model" in bundle:
602
- errors.extend(_validate_policy_model(bundle_id, bundle.get("policy_model"), bundle_hosts=hosts))
603
-
604
- missing_bundles = [bundle_id for bundle_id in DEFAULT_REQUIRED_BUNDLES if bundle_id not in bundle_ids]
605
- for bundle_id in missing_bundles:
606
- errors.append(f"missing required bundle: {bundle_id}")
607
-
608
- contract = {
609
- "path": str(CONTRACT_DOC_PATH),
610
- "schema_path": str(SCHEMA_PATH),
611
- "version": CANONICAL_VERSION,
612
- "bundle_count": len(bundle_summaries),
613
- }
614
- return {
615
- "schema": "OmgContractValidationResult",
616
- "status": "ok" if not errors else "error",
617
- "contract": contract,
618
- "bundles": bundle_summaries,
619
- "errors": errors,
620
- }
621
-
622
-
623
- def _copy_contract_inputs(root: Path, output_root: Path) -> list[Path]:
624
- copied: list[Path] = []
625
- for rel_path in [CONTRACT_DOC_PATH, SCHEMA_PATH]:
626
- src = resolve_asset(rel_path)
627
- dst = output_root / rel_path
628
- _write_text(dst, src.read_text(encoding="utf-8"))
629
- copied.append(dst)
630
- for bundle in load_contract_bundles(root):
631
- rel_path = Path(str(bundle["_path"]))
632
- src = resolve_asset(rel_path)
633
- dst = output_root / rel_path
634
- _write_text(dst, src.read_text(encoding="utf-8"))
635
- copied.append(dst)
636
-
637
- # Copy advanced plugin artifacts (plugin.json + all command markdown files)
638
- advanced_plugin_json = Path("plugins") / "advanced" / "plugin.json"
639
- try:
640
- src = resolve_asset(advanced_plugin_json)
641
- dst = output_root / advanced_plugin_json
642
- _write_text(dst, src.read_text(encoding="utf-8"))
643
- copied.append(dst)
644
- except FileNotFoundError:
645
- pass
646
-
647
- advanced_commands = resolve_assets(Path("plugins") / "advanced" / "commands", suffix=".md")
648
- for src in advanced_commands:
649
- rel = Path("plugins") / "advanced" / "commands" / src.name
650
- dst = output_root / rel
651
- _write_text(dst, src.read_text(encoding="utf-8"))
652
- copied.append(dst)
653
-
654
- return copied
655
-
656
-
657
- def _base_mcp_servers() -> dict[str, Any]:
658
- return {
659
- "filesystem": {
660
- "command": "npx",
661
- "args": ["@modelcontextprotocol/server-filesystem@2026.1.14", "."],
662
- },
663
- "omg-control": {
664
- "command": "python3",
665
- "args": ["-m", "runtime.omg_mcp_server"],
666
- },
667
- }
668
-
669
-
670
- def _plugin_mcp_servers() -> dict[str, Any]:
671
- return {
672
- "omg-control": {
673
- "command": "python3",
674
- "args": ["-m", "runtime.omg_mcp_server"],
675
- },
676
- }
677
-
678
-
679
- def _build_claude_plugin() -> dict[str, Any]:
680
- return {
681
- "name": CANONICAL_PLUGIN_ID,
682
- "version": CANONICAL_VERSION,
683
- "description": "OMG plugin layer for Claude Code with native setup, orchestration, and interop.",
684
- "author": {"name": "trac3er00"},
685
- "repository": CANONICAL_REPO_URL,
686
- "homepage": CANONICAL_REPO_URL,
687
- "license": "MIT",
688
- "keywords": [
689
- "claude-code",
690
- "plugin",
691
- "orchestration",
692
- "multi-agent",
693
- "omg",
694
- "codex",
695
- "gemini",
696
- "crazy-mode",
697
- "escalation",
698
- ],
699
- "mcpServers": "./.claude-plugin/mcp.json",
700
- }
701
-
702
-
703
- def _build_claude_marketplace() -> dict[str, Any]:
704
- return {
705
- "name": CANONICAL_MARKETPLACE_ID,
706
- "description": "Marketplace metadata for the OMG Claude plugin",
707
- "owner": {"name": "trac3er00"},
708
- "metadata": {
709
- "description": "OMG - Oh-My-God for Claude Code and supported agent hosts",
710
- "version": CANONICAL_VERSION,
711
- "homepage": CANONICAL_REPO_URL,
712
- "repository": CANONICAL_REPO_URL,
713
- },
714
- "plugins": [
715
- {
716
- "name": CANONICAL_PLUGIN_ID,
717
- "description": "OMG plugin layer for Claude Code and supported agent hosts with native setup, orchestration, and interop.",
718
- "version": CANONICAL_VERSION,
719
- "source": "./",
720
- "author": {"name": "trac3er00"},
721
- "license": "MIT",
722
- "category": "productivity",
723
- "tags": [
724
- "orchestration",
725
- "automation",
726
- "multi-agent",
727
- "omg",
728
- "codex",
729
- "gemini",
730
- "crazy-mode",
731
- ],
732
- }
733
- ],
734
- "version": CANONICAL_VERSION,
735
- }
736
-
737
-
738
- def _bundle_map(bundles: Iterable[dict[str, Any]]) -> dict[str, dict[str, Any]]:
739
- return {str(bundle["id"]): bundle for bundle in bundles}
740
-
741
-
742
- def _compile_hook_settings(bundle: dict[str, Any]) -> dict[str, Any]:
743
- events = bundle.get("compiled_hooks", {})
744
- if not isinstance(events, dict):
745
- return {}
746
-
747
- compiled: dict[str, Any] = {}
748
- for event_name, items in events.items():
749
- if not isinstance(items, list):
750
- continue
751
- compiled_entries: list[dict[str, Any]] = []
752
- for item in items:
753
- if not isinstance(item, dict):
754
- continue
755
- command = str(item.get("command", "")).strip()
756
- if not command:
757
- continue
758
- hook_payload: dict[str, Any] = {"type": "command", "command": command}
759
- timeout = item.get("timeout")
760
- if isinstance(timeout, int):
761
- hook_payload["timeout"] = timeout
762
- entry: dict[str, Any] = {"hooks": [hook_payload]}
763
- if "matcher" in item:
764
- entry["matcher"] = str(item.get("matcher", ""))
765
- compiled_entries.append(entry)
766
- if compiled_entries:
767
- compiled[str(event_name)] = compiled_entries
768
- return compiled
769
-
770
-
771
- def _protected_paths_for_channel(channel: str) -> list[str]:
772
- paths = [".omg/**", ".agents/**", ".codex/**", ".claude/**"]
773
- if channel == "enterprise":
774
- paths.extend(["registry/**", "dist/**"])
775
- return paths
776
-
777
-
778
- def _default_claude_hook_registrations() -> dict[str, list[dict[str, Any]]]:
779
- """Default OMG hook registrations for each required Claude event."""
780
- return {
781
- "UserPromptSubmit": [
782
- {
783
- "hooks": [
784
- {
785
- "type": "command",
786
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/user-prompt-submit.py"',
787
- "timeout": 10,
788
- }
789
- ],
790
- }
791
- ],
792
- "PreToolUse": [
793
- {
794
- "hooks": [
795
- {
796
- "type": "command",
797
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/firewall.py"',
798
- "timeout": 10,
799
- }
800
- ],
801
- "matcher": "Bash",
802
- },
803
- {
804
- "hooks": [
805
- {
806
- "type": "command",
807
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/secret-guard.py"',
808
- "timeout": 10,
809
- }
810
- ],
811
- "matcher": "Read|Write|Edit|MultiEdit",
812
- },
813
- ],
814
- "PostToolUse": [
815
- {
816
- "hooks": [
817
- {
818
- "type": "command",
819
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/tool-ledger.py"',
820
- "timeout": 10,
821
- }
822
- ],
823
- "matcher": "Write|Edit|MultiEdit",
824
- },
825
- ],
826
- "PostToolUseFailure": [
827
- {
828
- "hooks": [
829
- {
830
- "type": "command",
831
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/post-tool-failure.py"',
832
- }
833
- ],
834
- }
835
- ],
836
- "InstructionsLoaded": [
837
- {
838
- "hooks": [
839
- {
840
- "type": "command",
841
- "command": '"$HOME/.claude/omg-runtime/.venv/bin/python" "$HOME/.claude/hooks/instructions-loaded.py"',
842
- "timeout": 10,
843
- }
844
- ],
845
- }
846
- ],
847
- }
848
-
849
-
850
- def _build_claude_subagents(protected_paths: list[str]) -> list[dict[str, Any]]:
851
- """Build narrow-tool Claude subagent definitions. No bypassPermissions allowed."""
852
- return [
853
- {
854
- "name": "security-reviewer",
855
- "description": "Read-only security review subagent with scoped tool access.",
856
- "tools": [
857
- "Read",
858
- "Grep",
859
- "Glob",
860
- "Bash(grep *)",
861
- "Bash(find *)",
862
- "Bash(git log *)",
863
- "Bash(git diff *)",
864
- ],
865
- "bypassPermissions": False,
866
- },
867
- {
868
- "name": "release-manager",
869
- "description": "Release management subagent with write access governed by protected-path policy.",
870
- "tools": [
871
- "Read",
872
- "Write",
873
- "Edit",
874
- "Grep",
875
- "Glob",
876
- "Bash(git *)",
877
- "Bash(python3 scripts/omg.py *)",
878
- ],
879
- "bypassPermissions": False,
880
- "protectedPaths": protected_paths,
881
- },
882
- ]
883
-
884
-
885
- def _build_claude_skills(policy_model: dict[str, Any] | None) -> list[dict[str, Any]]:
886
- """Build Claude skill definitions from the policy model host_rules."""
887
- skill_refs: list[str] = []
888
- if isinstance(policy_model, dict):
889
- host_rules = policy_model.get("host_rules", {})
890
- if isinstance(host_rules, dict):
891
- claude_rules = host_rules.get("claude", {})
892
- if isinstance(claude_rules, dict):
893
- skill_refs = [str(s) for s in claude_rules.get("skills", []) if str(s).strip()]
894
- skills: list[dict[str, Any]] = []
895
- for ref in skill_refs:
896
- skills.append({"name": ref, "source": f".agents/skills/{ref}/"})
897
- return skills
898
-
899
-
900
- def _validate_compiled_claude_output(output_root: Path) -> list[str]:
901
- """Validate compiled Claude settings.json contains required hooks and subagents."""
902
- settings_path = output_root / "settings.json"
903
- if not settings_path.exists():
904
- return ["claude: missing compiled settings.json"]
905
-
906
- settings = _load_json(settings_path)
907
- errors: list[str] = []
908
-
909
- hooks = settings.get("hooks", {})
910
- for event in REQUIRED_CLAUDE_HOOK_EVENTS:
911
- if event not in hooks or not hooks[event]:
912
- errors.append(f"claude: missing required hook event '{event}'")
913
-
914
- omg = settings.get("_omg", {})
915
- generated = omg.get("generated", {})
916
- subagents = generated.get("subagents", [])
917
- subagent_names = {sa.get("name") for sa in subagents if isinstance(sa, dict)}
918
- for name in REQUIRED_CLAUDE_SUBAGENT_NAMES:
919
- if name not in subagent_names:
920
- errors.append(f"claude: missing required subagent '{name}'")
921
-
922
- for sa in subagents:
923
- if isinstance(sa, dict) and sa.get("bypassPermissions"):
924
- errors.append(
925
- f"claude: subagent '{sa.get('name', '<unknown>')}' has bypassPermissions enabled"
926
- )
927
-
928
- return errors
929
-
930
-
931
- def _compile_claude_outputs(
932
- *,
933
- root: Path,
934
- output_root: Path,
935
- bundles: list[dict[str, Any]],
936
- channel: str,
937
- policy_model: dict[str, Any] | None,
938
- ) -> list[Path]:
939
- artifacts: list[Path] = []
940
-
941
- _write_json(output_root / ".claude-plugin" / "plugin.json", _build_claude_plugin())
942
- artifacts.append(output_root / ".claude-plugin" / "plugin.json")
943
-
944
- _write_json(output_root / ".claude-plugin" / "marketplace.json", _build_claude_marketplace())
945
- artifacts.append(output_root / ".claude-plugin" / "marketplace.json")
946
-
947
- _write_json(output_root / ".claude-plugin" / "mcp.json", {"mcpServers": _plugin_mcp_servers()})
948
- artifacts.append(output_root / ".claude-plugin" / "mcp.json")
949
-
950
- mcp_payload = {"mcpServers": _base_mcp_servers()}
951
- _write_json(output_root / ".mcp.json", mcp_payload)
952
- artifacts.append(output_root / ".mcp.json")
953
-
954
- settings_path = root / "settings.json"
955
- if not settings_path.exists():
956
- settings_path = resolve_asset("settings.json")
957
- settings = _load_json(settings_path)
958
- hook_bundle = _bundle_map(bundles)["hook-governor"]
959
- compiled_hooks = _compile_hook_settings(hook_bundle)
960
- defaults = _default_claude_hook_registrations()
961
- for event in REQUIRED_CLAUDE_HOOK_EVENTS:
962
- if event not in compiled_hooks or not compiled_hooks[event]:
963
- compiled_hooks[event] = defaults[event]
964
- settings["hooks"] = compiled_hooks
965
-
966
- protected_paths = _policy_protected_paths(policy_model, channel=channel)
967
- subagents = _build_claude_subagents(protected_paths)
968
- skills = _build_claude_skills(policy_model)
969
-
970
- omg_settings = dict(settings.get("_omg", {}))
971
- omg_settings["_version"] = CANONICAL_VERSION
972
- phase1_release_contract = _build_phase1_release_contract()
973
- omg_settings["generated"] = {
974
- "contract_version": CANONICAL_VERSION,
975
- "channel": channel,
976
- "required_bundles": list(DEFAULT_REQUIRED_BUNDLES),
977
- "protected_paths": protected_paths,
978
- "emulated_events": list(hook_bundle.get("lifecycle_hooks", {}).get("emulated", [])),
979
- "policy_model": policy_model or {},
980
- "subagents": subagents,
981
- "skills": skills,
982
- "phase1_release_contract": phase1_release_contract,
983
- }
984
- settings["_omg"] = omg_settings
985
- _write_json(output_root / "settings.json", settings)
986
- artifacts.append(output_root / "settings.json")
987
-
988
- return artifacts
989
-
990
-
991
- def _yaml_string(value: str) -> str:
992
- return json.dumps(value, ensure_ascii=True)
993
-
994
-
995
- def _render_codex_skill(bundle: dict[str, Any], channel: str) -> str:
996
- execution_modes = ", ".join(str(mode) for mode in bundle.get("execution_contract", {}).get("modes", []))
997
- mcp_servers = ", ".join(str(name) for name in bundle.get("mcp_contract", {}).get("servers", []))
998
- return (
999
- f"---\n"
1000
- f"name: omg-{bundle['id']}\n"
1001
- f"description: {_yaml_string(str(bundle['description']))}\n"
1002
- f"---\n\n"
1003
- f"# {bundle['title']}\n\n"
1004
- f"- Channel: `{channel}`\n"
1005
- f"- Execution modes: `{execution_modes}`\n"
1006
- f"- MCP servers: `{mcp_servers}`\n"
1007
- f"- Evidence outputs: `{', '.join(bundle.get('evidence_outputs', {}).get('artifacts', []))}`\n"
1008
- )
1009
-
1010
-
1011
- def _render_openai_yaml(bundle: dict[str, Any], channel: str) -> str:
1012
- invocation = bundle.get("invocation_policy", {})
1013
- servers = bundle.get("mcp_contract", {}).get("servers", [])
1014
- tools = bundle.get("tool_policy", {}).get("allowed_tools", {}).get("codex", [])
1015
- lines = [
1016
- f"name: omg-{bundle['id']}",
1017
- f"description: {_yaml_string(str(bundle['description']))}",
1018
- f"allow_implicit_invocation: {'true' if invocation.get('allow_implicit_invocation') else 'false'}",
1019
- "metadata:",
1020
- f" channel: {channel}",
1021
- f" bundle_id: {bundle['id']}",
1022
- f" title: {_yaml_string(str(bundle['title']))}",
1023
- "mcp_servers:",
1024
- ]
1025
- for server in servers:
1026
- lines.append(f" - {server}")
1027
- lines.append("allowed_tools:")
1028
- for tool in tools:
1029
- lines.append(f" - {_yaml_string(str(tool))}")
1030
- return "\n".join(lines) + "\n"
1031
-
1032
-
1033
- def _codex_skill_refs(policy_model: dict[str, Any] | None) -> list[str]:
1034
- """Extract skill references from policy_model.host_rules.codex.skills."""
1035
- if not isinstance(policy_model, dict):
1036
- return []
1037
- host_rules = policy_model.get("host_rules", {})
1038
- if not isinstance(host_rules, dict):
1039
- return []
1040
- codex_rules = host_rules.get("codex", {})
1041
- if not isinstance(codex_rules, dict):
1042
- return []
1043
- return [str(s) for s in codex_rules.get("skills", []) if str(s).strip()]
1044
-
1045
-
1046
- def _codex_evidence_fields(policy_model: dict[str, Any] | None) -> list[str]:
1047
- """Extract required evidence contract fields from the policy model."""
1048
- if not isinstance(policy_model, dict):
1049
- return []
1050
- ec = policy_model.get("evidence_contract", {})
1051
- if not isinstance(ec, dict):
1052
- return []
1053
- return sorted(ec.keys())
1054
-
1055
-
1056
- def _codex_protected_planning_skills(bundles: Iterable[dict[str, Any]]) -> list[str]:
1057
- protected: list[str] = []
1058
- for bundle in bundles:
1059
- if "codex" not in bundle.get("hosts", []):
1060
- continue
1061
- if str(bundle.get("kind", "")).strip().lower() != "planning":
1062
- continue
1063
- invocation = bundle.get("invocation_policy", {})
1064
- if not isinstance(invocation, dict):
1065
- continue
1066
- if invocation.get("allow_implicit_invocation") is False:
1067
- protected.append(f"omg/{bundle['id']}")
1068
- return sorted(set(protected))
1069
-
1070
-
1071
- def _render_codex_agents_fragment(
1072
- *,
1073
- channel: str,
1074
- protected_paths: list[str],
1075
- codex_rules: list[str],
1076
- codex_automations: list[str],
1077
- codex_skills: list[str],
1078
- evidence_fields: list[str],
1079
- protected_planning_skills: list[str],
1080
- phase1_release_contract: dict[str, list[str]],
1081
- ) -> str:
1082
- """Render a comprehensive AGENTS.fragment.md for Codex host."""
1083
- sections: list[str] = []
1084
-
1085
- # Header
1086
- sections.append(f"# OMG Codex Governance (channel: {channel})\n")
1087
-
1088
- # Build & Test
1089
- sections.append("## Build & Test\n")
1090
- sections.append("```bash")
1091
- sections.append("python3 -m pytest tests -q")
1092
- sections.append("python3 scripts/omg.py contract validate")
1093
- sections.append(f"python3 scripts/omg.py contract compile --host codex --channel {channel}")
1094
- sections.append("```\n")
1095
-
1096
- # Protected Paths
1097
- sections.append("## Protected Paths\n")
1098
- sections.append("The following paths require tier-gated review before mutation:\n")
1099
- for path in protected_paths:
1100
- sections.append(f"- `{path}`")
1101
- sections.append("")
1102
-
1103
- sections.append("## Release Audit\n")
1104
- sections.append("Release readiness requires claim and compliance outcomes:\n")
1105
- for check in phase1_release_contract.get("release_readiness_checks", []):
1106
- sections.append(f"- `{check}`")
1107
- sections.append("Attestation requirements:")
1108
- for requirement in phase1_release_contract.get("attestation_requirements", []):
1109
- sections.append(f"- `{requirement}`")
1110
- sections.append("")
1111
-
1112
- # Evidence Contract
1113
- sections.append("## Evidence Contract\n")
1114
- sections.append("Every production action must emit evidence containing these fields:\n")
1115
- if evidence_fields:
1116
- for field in evidence_fields:
1117
- sections.append(f"- `{field}`")
1118
- else:
1119
- sections.append("- `timestamp`")
1120
- sections.append("- `executor`")
1121
- sections.append("- `trace_id`")
1122
- sections.append("- `lineage`")
1123
- sections.append("")
1124
-
1125
- # Required Skills
1126
- sections.append("## Required Skills\n")
1127
- if codex_skills:
1128
- for skill in codex_skills:
1129
- sections.append(f"- `{skill}`")
1130
- else:
1131
- sections.append("- `omg/control-plane`")
1132
- sections.append("")
1133
-
1134
- sections.append("## Protected Planning Surface\n")
1135
- if protected_planning_skills:
1136
- sections.append("Council planning skills are protected and explicit-invocation only:")
1137
- sections.append("")
1138
- for skill in protected_planning_skills:
1139
- sections.append(f"- `{skill}`")
1140
- else:
1141
- sections.append("- No protected planning skills configured.")
1142
- sections.append("")
1143
-
1144
- # Web Search Policy
1145
- sections.append("## Web Search Policy\n")
1146
- sections.append("- Prefer cached results over live network requests.")
1147
- sections.append("- Do NOT initiate live web searches unless explicitly instructed.")
1148
- sections.append("- Use `context7` or local documentation before external lookups.")
1149
- sections.append("- Set `cached_web_search: prefer_cached` as the default.\n")
1150
-
1151
- # Approval Constraints
1152
- sections.append("## Approval Constraints\n")
1153
- sections.append("- Destructive file operations require explicit user approval.")
1154
- sections.append("- `git push --force` and branch deletions require explicit approval.")
1155
- sections.append("- Production deployments require explicit approval.")
1156
- sections.append("- Mutations to protected paths require tier-gated approval.\n")
1157
-
1158
- # Rules & Automations (compact summary)
1159
- sections.append("## Rules & Automations\n")
1160
- rules_str = ", ".join(codex_rules) if codex_rules else "protected_paths, explicit_invocation"
1161
- auto_str = ", ".join(codex_automations) if codex_automations else "contract-compile"
1162
- sections.append(f"- Rules: `{rules_str}`")
1163
- sections.append(f"- Automations: `{auto_str}`")
1164
- sections.append("- Defer to the repo's `AGENTS.md` / `AGENTS.override.md` instruction hierarchy before OMG-specific guidance.")
1165
- sections.append("- Do not mirror or override Codex built-in slash commands; OMG guidance applies through MCP, skills, and generated rules.")
1166
- sections.append("- Require explicit invocation for protected production planning skills.")
1167
- sections.append("")
1168
-
1169
- return "\n".join(sections)
1170
-
1171
-
1172
- def _render_codex_rules(
1173
- *,
1174
- channel: str,
1175
- protected_paths: list[str],
1176
- codex_skills: list[str],
1177
- protected_planning_skills: list[str],
1178
- ) -> str:
1179
- """Render a codex-rules.md config fragment encoding defaults."""
1180
- lines: list[str] = []
1181
- lines.append(f"# OMG Codex Rules (channel: {channel})\n")
1182
-
1183
- lines.append("## Defaults\n")
1184
- lines.append("- `cached_web_search: prefer_cached`")
1185
- lines.append("- `live_network: deny_by_default`")
1186
- lines.append("- `destructive_approval: required`\n")
1187
-
1188
- lines.append("## Protected Paths\n")
1189
- for path in protected_paths:
1190
- lines.append(f"- `{path}`")
1191
- lines.append("")
1192
-
1193
- lines.append("## Required Skills\n")
1194
- for skill in (codex_skills or ["omg/control-plane"]):
1195
- lines.append(f"- `{skill}`")
1196
- lines.append("")
1197
-
1198
- lines.append("## Host Interop\n")
1199
- lines.append("- Respect the repo `AGENTS.md` / `AGENTS.override.md` chain before applying OMG-specific rules.")
1200
- lines.append("- Keep OMG guidance separate from Codex built-in slash commands.")
1201
- lines.append("")
1202
-
1203
- lines.append("## Protected Planning Surface\n")
1204
- if protected_planning_skills:
1205
- for skill in protected_planning_skills:
1206
- lines.append(f"- `{skill}` (explicit invocation only)")
1207
- else:
1208
- lines.append("- none")
1209
- lines.append("")
1210
-
1211
- lines.append("## Approval Matrix\n")
1212
- lines.append("| Action | Approval Required |")
1213
- lines.append("|--------|------------------|")
1214
- lines.append("| Read / Grep | No |")
1215
- lines.append("| Write to protected paths | Yes |")
1216
- lines.append("| Bash (python3:*) | Yes (balanced+ tier) |")
1217
- lines.append("| git push --force | Yes |")
1218
- lines.append("| Production deploy | Yes |")
1219
- lines.append("")
1220
-
1221
- return "\n".join(lines)
1222
-
1223
-
1224
- def _validate_compiled_codex_output(output_root: Path) -> list[str]:
1225
- """Validate compiled Codex output contains required AGENTS sections and artifacts."""
1226
- errors: list[str] = []
1227
- shared_dir = output_root / ".agents" / "skills" / "omg"
1228
-
1229
- for required_file in REQUIRED_CODEX_OUTPUTS:
1230
- path = shared_dir / required_file
1231
- if not path.exists():
1232
- errors.append(f"codex: missing required output '{required_file}'")
1233
-
1234
- agents_path = shared_dir / "AGENTS.fragment.md"
1235
- if agents_path.exists():
1236
- content = agents_path.read_text(encoding="utf-8")
1237
- for section in REQUIRED_CODEX_AGENTS_SECTIONS:
1238
- if section not in content:
1239
- errors.append(f"codex: AGENTS.fragment.md missing required section '{section}'")
1240
- else:
1241
- errors.append("codex: cannot validate AGENTS.fragment.md — file missing")
1242
-
1243
- return errors
1244
-
1245
-
1246
- def _compile_codex_outputs(
1247
- *,
1248
- output_root: Path,
1249
- bundles: list[dict[str, Any]],
1250
- channel: str,
1251
- policy_model: dict[str, Any] | None,
1252
- ) -> list[Path]:
1253
- artifacts: list[Path] = []
1254
- shared_dir = output_root / ".agents" / "skills" / "omg"
1255
- shared_dir.mkdir(parents=True, exist_ok=True)
1256
-
1257
- protected_paths = _policy_protected_paths(policy_model, channel=channel)
1258
- codex_rules: list[str] = []
1259
- codex_automations: list[str] = []
1260
- if isinstance(policy_model, dict):
1261
- host_rules = policy_model.get("host_rules", {})
1262
- if isinstance(host_rules, dict):
1263
- codex_policy = host_rules.get("codex", {})
1264
- if isinstance(codex_policy, dict):
1265
- codex_rules = [str(item) for item in codex_policy.get("rules", []) if str(item).strip()]
1266
- codex_automations = [
1267
- str(item) for item in codex_policy.get("automations", []) if str(item).strip()
1268
- ]
1269
-
1270
- codex_skills = _codex_skill_refs(policy_model)
1271
- evidence_fields = _codex_evidence_fields(policy_model)
1272
- protected_planning_skills = _codex_protected_planning_skills(bundles)
1273
- phase1_release_contract = _build_phase1_release_contract()
1274
-
1275
- agents_fragment = _render_codex_agents_fragment(
1276
- channel=channel,
1277
- protected_paths=protected_paths,
1278
- codex_rules=codex_rules,
1279
- codex_automations=codex_automations,
1280
- codex_skills=codex_skills,
1281
- evidence_fields=evidence_fields,
1282
- protected_planning_skills=protected_planning_skills,
1283
- phase1_release_contract=phase1_release_contract,
1284
- )
1285
- _write_text(shared_dir / "AGENTS.fragment.md", agents_fragment)
1286
- artifacts.append(shared_dir / "AGENTS.fragment.md")
1287
-
1288
- rules_content = _render_codex_rules(
1289
- channel=channel,
1290
- protected_paths=protected_paths,
1291
- codex_skills=codex_skills,
1292
- protected_planning_skills=protected_planning_skills,
1293
- )
1294
- _write_text(shared_dir / "codex-rules.md", rules_content)
1295
- artifacts.append(shared_dir / "codex-rules.md")
1296
-
1297
- from runtime.mcp_config_writers import write_codex_mcp_stdio_config
1298
-
1299
- codex_mcp_path = shared_dir / "codex-mcp.toml"
1300
- write_codex_mcp_stdio_config(
1301
- command="python3",
1302
- args=["-m", "runtime.omg_mcp_server"],
1303
- server_name="omg-control",
1304
- config_path=codex_mcp_path,
1305
- )
1306
- artifacts.append(codex_mcp_path)
1307
-
1308
- for bundle in bundles:
1309
- if "codex" not in bundle.get("hosts", []):
1310
- continue
1311
- skill_dir = shared_dir / str(bundle["id"])
1312
- _write_text(skill_dir / "SKILL.md", _render_codex_skill(bundle, channel))
1313
- _write_text(skill_dir / "openai.yaml", _render_openai_yaml(bundle, channel))
1314
- artifacts.extend([skill_dir / "SKILL.md", skill_dir / "openai.yaml"])
1315
-
1316
- return artifacts
1317
-
1318
-
1319
- def _compile_gemini_outputs(output_root: Path, channel: str) -> dict[str, Any]:
1320
- from runtime.mcp_config_writers import write_gemini_mcp_stdio_config
1321
-
1322
- config_path = output_root / ".gemini" / "settings.json"
1323
- write_gemini_mcp_stdio_config(
1324
- command="python3",
1325
- args=["-m", "runtime.omg_mcp_server"],
1326
- server_name="omg-control",
1327
- config_path=config_path,
1328
- )
1329
- payload = _load_json(config_path)
1330
- payload["_omg"] = {
1331
- "_version": CANONICAL_VERSION,
1332
- "generated": {
1333
- "contract_version": CANONICAL_VERSION,
1334
- "channel": channel,
1335
- "required_bundles": list(DEFAULT_REQUIRED_BUNDLES),
1336
- "phase1_release_contract": _build_phase1_release_contract(),
1337
- },
1338
- }
1339
- _write_json(config_path, payload)
1340
- return {"host": "gemini", "artifacts": [config_path]}
1341
-
1342
-
1343
- def _compile_kimi_outputs(output_root: Path, channel: str) -> dict[str, Any]:
1344
- from runtime.mcp_config_writers import write_kimi_mcp_stdio_config
1345
-
1346
- config_path = output_root / ".kimi" / "mcp.json"
1347
- write_kimi_mcp_stdio_config(
1348
- command="python3",
1349
- args=["-m", "runtime.omg_mcp_server"],
1350
- server_name="omg-control",
1351
- config_path=config_path,
1352
- )
1353
- payload = _load_json(config_path)
1354
- payload["_omg"] = {
1355
- "_version": CANONICAL_VERSION,
1356
- "generated": {
1357
- "contract_version": CANONICAL_VERSION,
1358
- "channel": channel,
1359
- "required_bundles": list(DEFAULT_REQUIRED_BUNDLES),
1360
- "phase1_release_contract": _build_phase1_release_contract(),
1361
- },
1362
- }
1363
- _write_json(config_path, payload)
1364
- return {"host": "kimi", "artifacts": [config_path]}
1365
-
1366
-
1367
- def _copy_release_bundle(
1368
- *,
1369
- output_root: Path,
1370
- channel: str,
1371
- artifacts: list[Path],
1372
- ) -> list[Path]:
1373
- bundle_root = output_root / "dist" / channel / "bundle"
1374
- if bundle_root.exists():
1375
- shutil.rmtree(bundle_root)
1376
- copied: list[Path] = []
1377
- for path in sorted(set(artifacts)):
1378
- rel_path = path.relative_to(output_root)
1379
- dst = bundle_root / rel_path
1380
- dst.parent.mkdir(parents=True, exist_ok=True)
1381
- shutil.copy2(path, dst)
1382
- copied.append(dst)
1383
- return copied
1384
-
1385
-
1386
- def _build_dist_manifest(output_root: Path, *, channel: str, hosts: list[str], artifacts: list[Path]) -> Path:
1387
- dist_root = output_root / "dist" / channel
1388
- artifact_entries: list[dict[str, str]] = []
1389
- attestation_rows: list[dict[str, str]] = []
1390
-
1391
- for path in sorted(set(artifacts)):
1392
- rel_path = str(path.relative_to(dist_root))
1393
- digest = _sha256_file(path)
1394
- artifact_entries.append({"path": rel_path, "sha256": digest})
1395
-
1396
- statement = sign_artifact_statement(
1397
- artifact_path=rel_path,
1398
- subject_digest=digest,
1399
- )
1400
-
1401
- statement_rel = f"attestations/{rel_path}.statement.json"
1402
- statement_abs = dist_root / statement_rel
1403
- _write_json(statement_abs, statement)
1404
-
1405
- sig_rel = f"attestations/{rel_path}.minisig"
1406
- sig_abs = dist_root / sig_rel
1407
- sig_value = statement.get("signature", {}).get("value", "")
1408
- _write_text(sig_abs, sig_value + "\n")
1409
-
1410
- attestation_rows.append({
1411
- "artifact_path": rel_path,
1412
- "statement_path": statement_rel,
1413
- "signature_path": sig_rel,
1414
- "signer_key_id": statement.get("signature", {}).get("keyid", ""),
1415
- "algorithm": "ed25519-minisign",
1416
- })
1417
-
1418
- payload = {
1419
- "schema": "OmgCompiledArtifactManifest",
1420
- "channel": channel,
1421
- "hosts": list(hosts),
1422
- "contract_version": CANONICAL_VERSION,
1423
- "artifacts": artifact_entries,
1424
- "attestations": attestation_rows,
1425
- }
1426
- out_path = dist_root / "manifest.json"
1427
- _write_json(out_path, payload)
1428
- return out_path
1429
-
1430
-
1431
- def compile_contract_outputs(
1432
- *,
1433
- root_dir: str | Path | None = None,
1434
- output_root: str | Path | None = None,
1435
- hosts: list[str] | tuple[str, ...] | None = None,
1436
- channel: str = "public",
1437
- ) -> dict[str, Any]:
1438
- root = _resolve_root(root_dir)
1439
- output = _resolve_output_root(root, output_root)
1440
- validation = validate_contract_registry(root)
1441
- if validation["status"] != "ok":
1442
- return {
1443
- "schema": "OmgContractCompileResult",
1444
- "status": "error",
1445
- "channel": channel,
1446
- "hosts": list(hosts or SUPPORTED_HOSTS),
1447
- "errors": validation["errors"],
1448
- "artifacts": [],
1449
- }
1450
-
1451
- if channel not in SUPPORTED_CHANNELS:
1452
- return {
1453
- "schema": "OmgContractCompileResult",
1454
- "status": "error",
1455
- "channel": channel,
1456
- "hosts": list(hosts or SUPPORTED_HOSTS),
1457
- "errors": [f"unsupported channel: {channel}"],
1458
- "artifacts": [],
1459
- }
1460
-
1461
- selected_hosts = list(hosts or SUPPORTED_HOSTS)
1462
- bad_hosts = [host for host in selected_hosts if host not in SUPPORTED_HOSTS]
1463
- if bad_hosts:
1464
- return {
1465
- "schema": "OmgContractCompileResult",
1466
- "status": "error",
1467
- "channel": channel,
1468
- "hosts": selected_hosts,
1469
- "errors": [f"unsupported hosts: {bad_hosts}"],
1470
- "artifacts": [],
1471
- }
1472
-
1473
- bundles = load_contract_bundles(root)
1474
- policy_model = _policy_model_for_bundle(bundles, "control-plane")
1475
- artifacts = _copy_contract_inputs(root, output)
1476
-
1477
- if "claude" in selected_hosts:
1478
- artifacts.extend(
1479
- _compile_claude_outputs(
1480
- root=root,
1481
- output_root=output,
1482
- bundles=bundles,
1483
- channel=channel,
1484
- policy_model=policy_model,
1485
- )
1486
- )
1487
- claude_errors = _validate_compiled_claude_output(output)
1488
- if claude_errors:
1489
- return {
1490
- "schema": "OmgContractCompileResult",
1491
- "status": "error",
1492
- "channel": channel,
1493
- "hosts": selected_hosts,
1494
- "errors": claude_errors,
1495
- "artifacts": [],
1496
- }
1497
- if "codex" in selected_hosts:
1498
- artifacts.extend(
1499
- _compile_codex_outputs(
1500
- output_root=output,
1501
- bundles=bundles,
1502
- channel=channel,
1503
- policy_model=policy_model,
1504
- )
1505
- )
1506
- codex_errors = _validate_compiled_codex_output(output)
1507
- if codex_errors:
1508
- return {
1509
- "schema": "OmgContractCompileResult",
1510
- "status": "error",
1511
- "channel": channel,
1512
- "hosts": selected_hosts,
1513
- "errors": codex_errors,
1514
- "artifacts": [],
1515
- }
1516
-
1517
- if "gemini" in selected_hosts:
1518
- artifacts.extend(_compile_gemini_outputs(output, channel)["artifacts"])
1519
-
1520
- if "kimi" in selected_hosts:
1521
- artifacts.extend(_compile_kimi_outputs(output, channel)["artifacts"])
1522
-
1523
- bundled_artifacts = _copy_release_bundle(output_root=output, channel=channel, artifacts=artifacts)
1524
- manifest_path = _build_dist_manifest(output, channel=channel, hosts=selected_hosts, artifacts=bundled_artifacts)
1525
- artifacts.append(manifest_path)
1526
-
1527
- return {
1528
- "schema": "OmgContractCompileResult",
1529
- "status": "ok",
1530
- "channel": channel,
1531
- "hosts": selected_hosts,
1532
- "artifacts": [str(path.relative_to(output)) for path in artifacts],
1533
- "manifest": str(manifest_path.relative_to(output)),
1534
- }
1535
-
1536
-
1537
- def _provider_statuses() -> dict[str, dict[str, Any]]:
1538
- ready_override = {
1539
- item.strip()
1540
- for item in os.environ.get("OMG_RELEASE_READY_PROVIDERS", "").split(",")
1541
- if item.strip()
1542
- }
1543
- statuses: dict[str, dict[str, Any]] = {}
1544
-
1545
- for provider_name in SUPPORTED_HOSTS:
1546
- if provider_name in ready_override:
1547
- statuses[provider_name] = {"ready": True, "source": "env"}
1548
- continue
1549
-
1550
- if provider_name == "claude":
1551
- claude_bin = os.environ.get("OMG_CLAUDE_BIN", "claude")
1552
- cmd = os.environ.get("OMG_CLAUDE_WORKER_CMD", "").strip()
1553
- ready = bool(cmd) or shutil.which(claude_bin) is not None
1554
- statuses[provider_name] = {
1555
- "ready": ready,
1556
- "source": "env-cmd" if cmd else "path",
1557
- "detail": cmd or claude_bin,
1558
- }
1559
- continue
1560
-
1561
- if provider_name == "gemini":
1562
- import runtime.providers.gemini_provider # noqa: F401
1563
- elif provider_name == "kimi":
1564
- import runtime.providers.kimi_provider # noqa: F401
1565
- else:
1566
- import runtime.providers.codex_provider # noqa: F401
1567
- from runtime.cli_provider import get_provider
1568
-
1569
- provider = get_provider(provider_name)
1570
- ready = bool(provider and provider.detect())
1571
- statuses[provider_name] = {"ready": ready, "source": "provider"}
1572
-
1573
- return statuses
1574
-
1575
-
1576
- def _check_mcp_fabric() -> dict[str, Any]:
1577
- import runtime.omg_mcp_server as omg_mcp_server
1578
-
1579
- prompts = asyncio.run(omg_mcp_server.mcp.list_prompts())
1580
- resources = asyncio.run(omg_mcp_server.mcp.list_resources())
1581
- instructions = getattr(omg_mcp_server.mcp, "instructions", "")
1582
- return {
1583
- "ready": isinstance(instructions, str) and bool(instructions.strip()) and len(prompts) >= 1 and len(resources) >= 1,
1584
- "prompt_count": len(prompts),
1585
- "resource_count": len(resources),
1586
- }
1587
-
1588
-
1589
- def _check_plugin_command_paths(root: Path) -> dict[str, Any]:
1590
- blockers: list[str] = []
1591
- details: dict[str, Any] = {}
1592
-
1593
- plugin_specs: list[tuple[str, Path, Path]] = [
1594
- ("core", root / "plugins" / "core" / "plugin.json", root),
1595
- ("advanced", root / "plugins" / "advanced" / "plugin.json", root / "plugins" / "advanced"),
1596
- ]
1597
-
1598
- for plugin_name, manifest_path, resolve_root in plugin_specs:
1599
- plugin_detail: dict[str, Any] = {"manifest": str(manifest_path), "commands": {}}
1600
- if not manifest_path.exists():
1601
- blockers.append(f"plugin_command_paths: missing manifest {manifest_path.relative_to(root)}")
1602
- plugin_detail["status"] = "error"
1603
- details[plugin_name] = plugin_detail
1604
- continue
1605
-
1606
- try:
1607
- manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
1608
- except (json.JSONDecodeError, OSError) as exc:
1609
- blockers.append(f"plugin_command_paths: unreadable manifest {manifest_path.relative_to(root)}: {exc}")
1610
- plugin_detail["status"] = "error"
1611
- details[plugin_name] = plugin_detail
1612
- continue
1613
-
1614
- commands = manifest.get("commands", {})
1615
- missing: list[str] = []
1616
- for cmd_name, cmd_config in commands.items():
1617
- cmd_path = cmd_config.get("path", "")
1618
- resolved = resolve_root / cmd_path
1619
- plugin_detail["commands"][cmd_name] = str(cmd_path)
1620
- if not resolved.exists():
1621
- missing.append(cmd_path)
1622
- blockers.append(
1623
- f"plugin_command_paths: {plugin_name} command '{cmd_name}' missing source {cmd_path}"
1624
- )
1625
-
1626
- plugin_detail["missing"] = missing
1627
- plugin_detail["status"] = "ok" if not missing else "error"
1628
- details[plugin_name] = plugin_detail
1629
-
1630
- return {
1631
- "status": "ok" if not blockers else "error",
1632
- "blockers": blockers,
1633
- "details": details,
1634
- }
1635
-
1636
-
1637
- def _check_version_identity_drift(root: Path) -> dict[str, Any]:
1638
- canonical_version = CANONICAL_VERSION
1639
- blockers: list[str] = []
1640
- drift_details: dict[str, str] = {}
1641
-
1642
- from runtime.release_surfaces import AUTHORED_SURFACES
1643
-
1644
- sync_script = Path(__file__).resolve().parents[1] / "scripts" / "sync-release-identity.py"
1645
- if not sync_script.exists():
1646
- return {
1647
- "status": "error",
1648
- "canonical_version": canonical_version,
1649
- "blockers": ["version_drift: missing scripts/sync-release-identity.py"],
1650
- "drift_details": {},
1651
- }
1652
-
1653
- spec = importlib.util.spec_from_file_location("sync_release_identity", sync_script)
1654
- if spec is None or spec.loader is None:
1655
- return {
1656
- "status": "error",
1657
- "canonical_version": canonical_version,
1658
- "blockers": ["version_drift: unable to load scripts/sync-release-identity.py"],
1659
- "drift_details": {},
1660
- }
1661
-
1662
- module = importlib.util.module_from_spec(spec)
1663
- spec.loader.exec_module(module)
1664
- check_surface = getattr(module, "check_surface", None)
1665
- if not callable(check_surface):
1666
- return {
1667
- "status": "error",
1668
- "canonical_version": canonical_version,
1669
- "blockers": ["version_drift: scripts/sync-release-identity.py missing check_surface"],
1670
- "drift_details": {},
1671
- }
1672
-
1673
- for surface in AUTHORED_SURFACES:
1674
- raw_drifts = check_surface(root, surface, canonical_version)
1675
- if not isinstance(raw_drifts, list):
1676
- blockers.append(
1677
- f"version_drift: {surface.file_path} has version <invalid drift payload>, expected {canonical_version}"
1678
- )
1679
- continue
1680
- for drift in raw_drifts:
1681
- if not isinstance(drift, (tuple, list)) or len(drift) != 2:
1682
- continue
1683
- label, found = drift
1684
- found_value = "<not found>" if found is None else str(found)
1685
- blockers.append(
1686
- f"version_drift: {label} has version {found_value}, expected {canonical_version}"
1687
- )
1688
- drift_details[str(label)] = found_value
1689
-
1690
- return {
1691
- "status": "ok" if not blockers else "error",
1692
- "canonical_version": canonical_version,
1693
- "blockers": blockers,
1694
- "drift_details": drift_details,
1695
- }
1696
-
1697
-
1698
- def _check_doctor_output(output_root: Path) -> dict[str, Any]:
1699
- evidence_dir = output_root / ".omg" / "evidence"
1700
- doctor_path = evidence_dir / "doctor.json"
1701
- if not doctor_path.exists():
1702
- return {
1703
- "status": "error",
1704
- "path": "",
1705
- "doctor": {},
1706
- "blockers": ["doctor_check_missing: missing .omg/evidence/doctor.json"],
1707
- }
1708
- try:
1709
- payload = _load_json(doctor_path)
1710
- except Exception as exc:
1711
- return {
1712
- "status": "error",
1713
- "path": str(doctor_path.relative_to(output_root)),
1714
- "doctor": {},
1715
- "blockers": [f"doctor_check_missing: invalid doctor output ({exc})"],
1716
- }
1717
-
1718
- blockers: list[str] = []
1719
- if payload.get("schema") != "DoctorResult":
1720
- blockers.append("doctor_check_missing: doctor evidence schema mismatch")
1721
- if payload.get("status") != "pass":
1722
- blockers.append("doctor_check_missing: doctor status is not pass")
1723
- checks = payload.get("checks", [])
1724
- if not isinstance(checks, list) or not checks:
1725
- blockers.append("doctor_check_missing: doctor checks missing")
1726
-
1727
- return {
1728
- "status": "ok" if not blockers else "error",
1729
- "path": str(doctor_path.relative_to(output_root)),
1730
- "doctor": payload,
1731
- "blockers": blockers,
1732
- }
1733
-
1734
-
1735
- def _check_proof_surface(root: Path) -> dict[str, Any]:
1736
- proof_path = root / "docs" / "proof.md"
1737
- if not proof_path.exists():
1738
- return {
1739
- "status": "error",
1740
- "path": "docs/proof.md",
1741
- "blockers": ["prose_only_proof: docs/proof.md missing"],
1742
- }
1743
-
1744
- content = proof_path.read_text(encoding="utf-8")
1745
- lowered = content.lower()
1746
- hardcoded_counts = bool(
1747
- re.search(r"\b\d+\s*/\s*\d+\b", lowered)
1748
- or re.search(r"\b\d+\s+(tests?|checks?|providers?)\s+(passed|pass|green|successful)\b", lowered)
1749
- or re.search(r"\ball\s+tests?\s+passed\b", lowered)
1750
- )
1751
- artifact_refs = (
1752
- ".omg/evidence/",
1753
- ".omg/tracebank/",
1754
- ".omg/evals/",
1755
- ".omg/lineage/",
1756
- )
1757
- has_artifact_refs = any(token in content for token in artifact_refs)
1758
-
1759
- blockers: list[str] = []
1760
- if hardcoded_counts and not has_artifact_refs:
1761
- blockers.append("prose_only_proof: hardcoded proof counts without machine artifact references")
1762
-
1763
- return {
1764
- "status": "ok" if not blockers else "error",
1765
- "path": str(proof_path.relative_to(root)),
1766
- "hardcoded_counts": hardcoded_counts,
1767
- "has_artifact_refs": has_artifact_refs,
1768
- "blockers": blockers,
1769
- }
1770
-
1771
-
1772
- def _is_loopback_hostname(hostname: str) -> bool:
1773
- lowered = hostname.strip().lower()
1774
- return lowered in {"localhost", "127.0.0.1", "::1"}
1775
-
1776
-
1777
- def _collect_http_urls(line: str) -> list[str]:
1778
- return re.findall(r"https?://[^\s)\]>'\"]+", line)
1779
-
1780
-
1781
- def _check_same_machine_scope(root: Path, output_root: Path) -> dict[str, Any]:
1782
- blockers: list[str] = []
1783
- scanned: list[str] = []
1784
-
1785
- for rel_path in ("README.md", "docs/proof.md", "OMG_COMPAT_CONTRACT.md"):
1786
- path = root / rel_path
1787
- if not path.exists():
1788
- continue
1789
- scanned.append(rel_path)
1790
- for line in path.read_text(encoding="utf-8").splitlines():
1791
- if "production" not in line.lower():
1792
- continue
1793
- for url in _collect_http_urls(line):
1794
- parsed = urlparse(url)
1795
- if parsed.scheme != "http":
1796
- continue
1797
- host = parsed.hostname or ""
1798
- if host and not _is_loopback_hostname(host):
1799
- blockers.append(
1800
- f"same_machine_scope_violation: {rel_path} claims production over non-loopback HTTP ({url})"
1801
- )
1802
-
1803
- mcp_path = output_root / ".mcp.json"
1804
- if mcp_path.exists():
1805
- scanned.append(str(mcp_path.relative_to(output_root)))
1806
- mcp_payload = _load_json(mcp_path)
1807
- servers = mcp_payload.get("mcpServers", {})
1808
- if isinstance(servers, dict):
1809
- for server_name, server_cfg in servers.items():
1810
- if not isinstance(server_cfg, dict):
1811
- continue
1812
- for key in ("url", "httpUrl"):
1813
- raw_url = str(server_cfg.get(key, "")).strip()
1814
- if not raw_url:
1815
- continue
1816
- parsed = urlparse(raw_url)
1817
- if parsed.scheme != "http":
1818
- continue
1819
- host = parsed.hostname or ""
1820
- if host and not _is_loopback_hostname(host):
1821
- blockers.append(
1822
- "same_machine_scope_violation: "
1823
- f".mcp.json server '{server_name}' uses non-loopback HTTP endpoint ({raw_url})"
1824
- )
1825
-
1826
- return {
1827
- "status": "ok" if not blockers else "error",
1828
- "scanned": scanned,
1829
- "blockers": blockers,
1830
- }
1831
-
1832
-
1833
- def _check_provider_host_parity(output_root: Path, providers: dict[str, dict[str, Any]]) -> dict[str, Any]:
1834
- blockers: list[str] = []
1835
- required_for_provider = {
1836
- "claude": (
1837
- output_root / "settings.json",
1838
- output_root / ".claude-plugin" / "plugin.json",
1839
- ),
1840
- "codex": (
1841
- output_root / ".agents" / "skills" / "omg" / "AGENTS.fragment.md",
1842
- output_root / ".agents" / "skills" / "omg" / "codex-mcp.toml",
1843
- ),
1844
- "gemini": (
1845
- output_root / ".gemini" / "settings.json",
1846
- ),
1847
- "kimi": (
1848
- output_root / ".kimi" / "mcp.json",
1849
- ),
1850
- }
1851
- for provider, status in providers.items():
1852
- if not status.get("ready"):
1853
- continue
1854
- for required_path in required_for_provider.get(provider, ()):
1855
- if not required_path.exists():
1856
- blockers.append(
1857
- "provider_host_parity: "
1858
- f"provider '{provider}' ready but host artifact missing {required_path.relative_to(output_root)}"
1859
- )
1860
- return {
1861
- "status": "ok" if not blockers else "error",
1862
- "blockers": blockers,
1863
- }
1864
-
1865
-
1866
- def _check_host_semantic_parity(
1867
- output_root: Path,
1868
- required_hosts: set[str],
1869
- release_run_id: str = "",
1870
- ) -> dict[str, Any]:
1871
- evidence_dir = output_root / ".omg" / "evidence"
1872
- parity_files = sorted(evidence_dir.glob("host-parity-*.json")) if evidence_dir.exists() else []
1873
- report_path = parity_files[-1] if parity_files else None
1874
- require_report_env = os.environ.get("OMG_REQUIRE_HOST_PARITY_REPORT", "").strip().lower() in {
1875
- "1",
1876
- "true",
1877
- "yes",
1878
- "on",
1879
- }
1880
- canonical_required_hosts = {
1881
- host
1882
- for host in required_hosts
1883
- if host in RELEASE_BLOCKING_HOSTS
1884
- }
1885
- require_report = require_report_env or bool(canonical_required_hosts)
1886
-
1887
- if report_path is None:
1888
- return {
1889
- "status": "error" if require_report else "missing",
1890
- "report": None,
1891
- "blockers": ["host_semantic_parity: missing host parity report"] if require_report else [],
1892
- }
1893
-
1894
- try:
1895
- report = _load_json(report_path)
1896
- except Exception as exc:
1897
- return {
1898
- "status": "error",
1899
- "report": str(report_path.relative_to(output_root)),
1900
- "blockers": [f"host_semantic_parity: failed to parse report ({exc})"],
1901
- }
1902
-
1903
- canonical_hosts = {
1904
- str(host).strip().lower()
1905
- for host in report.get("canonical_hosts", [])
1906
- if str(host).strip()
1907
- }
1908
- missing_hosts = sorted(host for host in canonical_required_hosts if host not in canonical_hosts)
1909
- overall_status = str(report.get("overall_status", "")).strip().lower()
1910
- parity_results = report.get("parity_results", {})
1911
- passed = bool(parity_results.get("passed")) if isinstance(parity_results, dict) else False
1912
- host_results = parity_results.get("host_results", {}) if isinstance(parity_results, dict) else {}
1913
-
1914
- blockers: list[str] = []
1915
- report_run_id = str(report.get("run_id", "")).strip()
1916
- if release_run_id and report_run_id and report_run_id != release_run_id:
1917
- blockers.append("host_parity_report:cross_run")
1918
- if missing_hosts:
1919
- blockers.append(f"host_semantic_parity: report missing canonical hosts {missing_hosts}")
1920
- if overall_status and overall_status != "ok":
1921
- blockers.append(f"host_semantic_parity: report overall_status={overall_status}")
1922
- if isinstance(parity_results, dict) and not passed:
1923
- blockers.append("host_semantic_parity: parity check reported drift")
1924
- if not isinstance(host_results, dict):
1925
- blockers.append("host_semantic_parity: report missing host results")
1926
- else:
1927
- for host in sorted(canonical_required_hosts):
1928
- host_result = host_results.get(host)
1929
- normalized = host_result.get("normalized", {}) if isinstance(host_result, dict) else {}
1930
- source_class = str(normalized.get("source_class", "")).strip().lower() if isinstance(normalized, dict) else ""
1931
- source_path = str(normalized.get("source_path", "")).strip() if isinstance(normalized, dict) else ""
1932
- if source_class != "compiled_or_replayed" or not source_path:
1933
- blockers.append(f"host_semantic_parity: synthetic payload rejected for {host}")
1934
-
1935
- return {
1936
- "status": "ok" if not blockers else "error",
1937
- "report": str(report_path.relative_to(output_root)),
1938
- "required_hosts": sorted(canonical_required_hosts),
1939
- "blockers": blockers,
1940
- }
1941
-
1942
-
1943
- def _has_waiver(risk: dict[str, Any]) -> bool:
1944
- return bool(
1945
- risk.get("waived")
1946
- or risk.get("waiver")
1947
- or risk.get("waiver_id")
1948
- or risk.get("waiver_evidence")
1949
- )
1950
-
1951
-
1952
- def _check_high_risk_security_waivers(payload: dict[str, Any]) -> list[str]:
1953
- blockers: list[str] = []
1954
- unresolved = payload.get("unresolved_risks", [])
1955
- if isinstance(unresolved, list):
1956
- for item in unresolved:
1957
- if isinstance(item, dict):
1958
- severity = str(item.get("severity") or item.get("risk_level") or "").lower()
1959
- if severity in {"high", "critical"} and not _has_waiver(item):
1960
- blockers.append("security_blocker_unwaived: unresolved high-risk item without waiver evidence")
1961
- break
1962
- elif isinstance(item, str):
1963
- lowered = item.lower()
1964
- is_high = "high" in lowered or "critical" in lowered
1965
- waived = "waiv" in lowered
1966
- if is_high and not waived:
1967
- blockers.append("security_blocker_unwaived: unresolved high-risk item without waiver evidence")
1968
- break
1969
-
1970
- scans = payload.get("security_scans", [])
1971
- if isinstance(scans, list):
1972
- for scan in scans:
1973
- if not isinstance(scan, dict):
1974
- continue
1975
- findings = scan.get("findings", [])
1976
- if not isinstance(findings, list):
1977
- continue
1978
- for finding in findings:
1979
- if not isinstance(finding, dict):
1980
- continue
1981
- severity = str(finding.get("severity", "")).lower()
1982
- if severity in {"high", "critical"} and not _has_waiver(finding):
1983
- blockers.append("security_blocker_unwaived: high-risk security finding without waiver evidence")
1984
- return blockers
1985
- return blockers
1986
-
1987
-
1988
- def build_release_readiness(
1989
- *,
1990
- root_dir: str | Path | None = None,
1991
- output_root: str | Path | None = None,
1992
- channel: str = "dual",
1993
- ) -> dict[str, Any]:
1994
- root = _resolve_root(root_dir)
1995
- output = _resolve_output_root(root, output_root)
1996
- blockers: list[str] = []
1997
- checks: dict[str, Any] = {}
1998
- provider_override = {
1999
- item.strip().lower()
2000
- for item in os.environ.get("OMG_RELEASE_READY_PROVIDERS", "").split(",")
2001
- if item.strip()
2002
- }
2003
- required_provider_hosts: set[str] = (
2004
- {host for host in provider_override if host in RELEASE_BLOCKING_HOSTS}
2005
- if provider_override
2006
- else set(RELEASE_BLOCKING_HOSTS)
2007
- )
2008
-
2009
- validation = validate_contract_registry(root)
2010
- checks["contract_validation"] = validation
2011
- if validation["status"] != "ok":
2012
- blockers.extend(validation["errors"])
2013
-
2014
- required_channels = ["public", "enterprise"] if channel == "dual" else [channel]
2015
- for required_channel in required_channels:
2016
- dist_root = output / "dist" / required_channel
2017
- manifest_path = dist_root / "manifest.json"
2018
- if not manifest_path.exists():
2019
- blockers.append(f"missing compiled manifest: dist/{required_channel}/manifest.json")
2020
- continue
2021
- manifest = _load_json(manifest_path)
2022
- manifest_errors: list[str] = []
2023
- for artifact in manifest.get("artifacts", []):
2024
- if not isinstance(artifact, dict):
2025
- continue
2026
- rel_path = str(artifact.get("path", ""))
2027
- expected_sha = str(artifact.get("sha256", ""))
2028
- artifact_path = dist_root / rel_path
2029
- if not artifact_path.exists():
2030
- manifest_errors.append(f"{required_channel}: missing bundled artifact {rel_path}")
2031
- continue
2032
- if _sha256_file(artifact_path) != expected_sha:
2033
- manifest_errors.append(f"{required_channel}: sha mismatch for {rel_path}")
2034
- manifest_paths = {str(a.get("path", "")) for a in manifest.get("artifacts", []) if isinstance(a, dict)}
2035
- declared_hosts = [str(host).strip().lower() for host in manifest.get("hosts", []) if str(host).strip()]
2036
- if not declared_hosts:
2037
- declared_hosts = get_canonical_hosts()
2038
- missing_required_hosts = sorted(host for host in required_provider_hosts if host not in declared_hosts)
2039
- if missing_required_hosts:
2040
- manifest_errors.append(
2041
- f"{required_channel}: canonical_host_compile_parity_missing {missing_required_hosts}"
2042
- )
2043
- required_provider_hosts.update(declared_hosts)
2044
- for host_name in declared_hosts:
2045
- for host_path in HOST_COMPILED_ARTIFACTS.get(host_name, ()):
2046
- bundled_host_path = f"bundle/{host_path}"
2047
- if bundled_host_path not in manifest_paths:
2048
- manifest_errors.append(
2049
- f"{required_channel}: host_parity_missing {host_name} {bundled_host_path}"
2050
- )
2051
- for req_path in _get_required_advanced_plugin_artifacts(root):
2052
- if req_path not in manifest_paths:
2053
- manifest_errors.append(f"{required_channel}: advanced_plugin_missing {req_path}")
2054
- if manifest_errors:
2055
- blockers.extend(manifest_errors)
2056
- manifest["integrity_errors"] = manifest_errors
2057
- checks[f"dist_{required_channel}"] = manifest
2058
-
2059
- required_outputs = [
2060
- output / host_artifact
2061
- for host_name in RELEASE_BLOCKING_HOSTS
2062
- for host_artifact in HOST_COMPILED_ARTIFACTS.get(host_name, ())
2063
- ]
2064
- required_outputs.extend(
2065
- [
2066
- output / ".agents" / "skills" / "omg" / "control-plane" / "SKILL.md",
2067
- output / ".agents" / "skills" / "omg" / "control-plane" / "openai.yaml",
2068
- ]
2069
- )
2070
- missing_outputs = [str(path.relative_to(output)) for path in required_outputs if not path.exists()]
2071
- if missing_outputs:
2072
- blockers.append(f"missing compiled outputs: {', '.join(missing_outputs)}")
2073
- checks["compiled_outputs"] = {"missing": missing_outputs}
2074
-
2075
- required_bundle_outputs: list[Path] = []
2076
- for bundle_id in DEFAULT_REQUIRED_BUNDLES:
2077
- required_bundle_outputs.extend(
2078
- [
2079
- output / ".agents" / "skills" / "omg" / bundle_id / "SKILL.md",
2080
- output / ".agents" / "skills" / "omg" / bundle_id / "openai.yaml",
2081
- ]
2082
- )
2083
- missing_bundle_outputs = [str(path.relative_to(output)) for path in required_bundle_outputs if not path.exists()]
2084
- if missing_bundle_outputs:
2085
- blockers.append(f"missing bundle outputs: {', '.join(missing_bundle_outputs)}")
2086
- checks["bundle_outputs"] = {"missing": missing_bundle_outputs}
2087
-
2088
- evidence_check = _check_recent_evidence(output)
2089
- checks["evidence"] = evidence_check
2090
- blockers.extend(evidence_check.get("blockers", []))
2091
-
2092
- doctor_check = _check_doctor_output(output)
2093
- checks["doctor"] = doctor_check
2094
- blockers.extend(doctor_check.get("blockers", []))
2095
-
2096
- eval_check = _check_eval_gate(output)
2097
- checks["eval_gate"] = eval_check
2098
- blockers.extend(eval_check.get("blockers", []))
2099
-
2100
- proof_chain_check = _check_proof_chain(output)
2101
- checks["proof_chain"] = proof_chain_check
2102
- blockers.extend(proof_chain_check.get("blockers", []))
2103
-
2104
- execution_primitives = _check_execution_primitives(output_root=output, evidence_profile="release")
2105
- checks["execution_primitives"] = execution_primitives
2106
- blockers.extend(execution_primitives.get("blockers", []))
2107
-
2108
- claim_judge_compliance = _check_claim_judge_compliance(output)
2109
- checks["claim_judge_compliance"] = claim_judge_compliance
2110
- blockers.extend(claim_judge_compliance.get("blockers", []))
2111
-
2112
- security_blockers = [
2113
- blocker
2114
- for blocker in evidence_check.get("blockers", [])
2115
- if isinstance(blocker, str) and blocker.startswith("security_blocker_unwaived:")
2116
- ]
2117
- checks["security_blocker_unwaived"] = {
2118
- "status": "ok" if not security_blockers else "error",
2119
- "blockers": security_blockers,
2120
- }
2121
-
2122
- proof_surface_check = _check_proof_surface(root)
2123
- checks["proof_surface"] = proof_surface_check
2124
- blockers.extend(proof_surface_check.get("blockers", []))
2125
-
2126
- same_machine_scope = _check_same_machine_scope(root, output)
2127
- checks["same_machine_scope"] = same_machine_scope
2128
- blockers.extend(same_machine_scope.get("blockers", []))
2129
-
2130
- package_check = _check_packaged_install_smoke(root)
2131
- checks["package_smoke"] = package_check
2132
- blockers.extend(package_check.get("blockers", []))
2133
-
2134
- package_parity = check_package_parity(root)
2135
- checks["package_parity"] = package_parity
2136
- blockers.extend(package_parity.get("blockers", []))
2137
-
2138
- plugin_cmd_check = _check_plugin_command_paths(root)
2139
- checks["plugin_command_paths"] = plugin_cmd_check
2140
- blockers.extend(plugin_cmd_check.get("blockers", []))
2141
-
2142
- version_drift_check = _check_version_identity_drift(root)
2143
- checks["version_identity_drift"] = version_drift_check
2144
- blockers.extend(version_drift_check.get("blockers", []))
2145
-
2146
- if channel == "dual":
2147
- bundle_promotion_parity = _check_bundle_promotion_parity(root, output)
2148
- checks["bundle_promotion_parity"] = bundle_promotion_parity
2149
- blockers.extend(bundle_promotion_parity.get("blockers", []))
2150
-
2151
- providers = _provider_statuses()
2152
- checks["providers"] = providers
2153
- for provider_name, status in providers.items():
2154
- if provider_name not in required_provider_hosts:
2155
- continue
2156
- if not status.get("ready"):
2157
- blockers.append(f"provider not ready: {provider_name}")
2158
-
2159
- required_providers = {
2160
- provider_name: status
2161
- for provider_name, status in providers.items()
2162
- if provider_name in required_provider_hosts
2163
- }
2164
- provider_parity = _check_provider_host_parity(output, required_providers)
2165
- checks["provider_host_parity"] = provider_parity
2166
- blockers.extend(provider_parity.get("blockers", []))
2167
-
2168
- host_semantic_parity = _check_host_semantic_parity(
2169
- output,
2170
- required_provider_hosts,
2171
- release_run_id=str(evidence_check.get("run_id", "")).strip(),
2172
- )
2173
- checks["host_semantic_parity"] = host_semantic_parity
2174
- blockers.extend(host_semantic_parity.get("blockers", []))
2175
-
2176
- worktree_ready = shutil.which("git") is not None and (root / ".git").exists()
2177
- checks["worktree"] = {"ready": worktree_ready}
2178
- if not worktree_ready:
2179
- blockers.append("git worktree support not available")
2180
-
2181
- mcp_status = _check_mcp_fabric()
2182
- checks["mcp_fabric"] = mcp_status
2183
- if not mcp_status.get("ready"):
2184
- blockers.append("mcp fabric incomplete")
2185
-
2186
- return {
2187
- "schema": "OmgReleaseReadinessResult",
2188
- "status": "ok" if not blockers else "error",
2189
- "channel": channel,
2190
- "blockers": blockers,
2191
- "checks": checks,
2192
- }
2193
-
2194
-
2195
- def _check_recent_evidence(output_root: Path) -> dict[str, Any]:
2196
- latest = _latest_evidence_pack(output_root)
2197
- if latest is None:
2198
- return {"status": "missing", "blockers": []}
2199
-
2200
- evidence_path, payload = latest
2201
- blockers: list[str] = []
2202
- if not payload.get("security_scans"):
2203
- blockers.append("cosmetic evidence: security_scans is empty")
2204
- if not payload.get("provenance"):
2205
- blockers.append("cosmetic evidence: provenance is empty")
2206
- if not payload.get("timestamp") and not payload.get("created_at"):
2207
- blockers.append("missing_attribution: evidence missing timestamp")
2208
- if not payload.get("executor"):
2209
- blockers.append("missing_attribution: evidence missing executor")
2210
- if not payload.get("environment"):
2211
- blockers.append("missing_attribution: evidence missing environment")
2212
- if not payload.get("trace_ids"):
2213
- blockers.append("missing trace ids in evidence")
2214
- if not payload.get("trace_id") and not payload.get("trace_ids"):
2215
- blockers.append("missing trace_id in evidence")
2216
- if not payload.get("lineage"):
2217
- blockers.append("missing lineage in evidence")
2218
- tests = payload.get("tests", [])
2219
- if isinstance(tests, list):
2220
- for item in tests:
2221
- if isinstance(item, dict) and item.get("name") == "worker_implementation" and not item.get("passed", False):
2222
- blockers.append("simulated worker evidence detected")
2223
- break
2224
- blockers.extend(_check_test_intent_claims(payload))
2225
- blockers.extend(_check_high_risk_security_waivers(payload))
2226
- return {
2227
- "status": "ok" if not blockers else "error",
2228
- "evidence_file": str(evidence_path.relative_to(output_root)),
2229
- "run_id": str(payload.get("run_id", "")).strip(),
2230
- "blockers": blockers,
2231
- }
2232
-
2233
-
2234
- def _latest_evidence_pack(output_root: Path) -> tuple[Path, dict[str, Any]] | None:
2235
- evidence_dir = output_root / ".omg" / "evidence"
2236
- if not evidence_dir.exists():
2237
- return None
2238
-
2239
- evidence_files = sorted(path for path in evidence_dir.glob("*.json") if path.is_file())
2240
- evidence_payloads: list[tuple[Path, dict[str, Any]]] = []
2241
- for path in evidence_files:
2242
- try:
2243
- payload = _load_json(path)
2244
- except Exception:
2245
- continue
2246
- if payload.get("schema") != "EvidencePack":
2247
- continue
2248
- try:
2249
- payload = _normalize_evidence_pack(payload)
2250
- except ValueError as exc:
2251
- return path, {"schema": "EvidencePack", "invalid": f"invalid evidence pack: {exc}"}
2252
- evidence_payloads.append((path, payload))
2253
-
2254
- if not evidence_payloads:
2255
- return None
2256
- return evidence_payloads[-1]
2257
-
2258
-
2259
- def _required_fields_for_module(module: str) -> list[str]:
2260
- metadata = schema_versions().get(module, {})
2261
- required = metadata.get("required_fields", []) if isinstance(metadata, dict) else []
2262
- if isinstance(required, list):
2263
- return [str(field) for field in required if str(field).strip()]
2264
- return []
2265
-
2266
-
2267
- def _missing_context_metadata(payload: dict[str, Any]) -> list[str]:
2268
- missing: list[str] = []
2269
- for key in _REQUIRED_CONTEXT_METADATA:
2270
- value = str(payload.get(key, "")).strip()
2271
- if not value:
2272
- missing.append(key)
2273
- return missing
2274
-
2275
-
2276
- def _env_truthy(name: str) -> bool:
2277
- return os.environ.get(name, "").strip().lower() in {"1", "true", "yes", "on"}
2278
-
2279
-
2280
- def _execution_primitive_max_age_seconds() -> float:
2281
- raw = str(os.environ.get("OMG_EXECUTION_PRIMITIVE_MAX_AGE_SECONDS", "")).strip()
2282
- if not raw:
2283
- return _DEFAULT_EXECUTION_PRIMITIVE_MAX_AGE_SECONDS
2284
- try:
2285
- value = float(raw)
2286
- except ValueError:
2287
- return _DEFAULT_EXECUTION_PRIMITIVE_MAX_AGE_SECONDS
2288
- return value if value >= 0 else _DEFAULT_EXECUTION_PRIMITIVE_MAX_AGE_SECONDS
2289
-
2290
-
2291
- def _as_non_empty_list(value: Any) -> list[Any]:
2292
- if not isinstance(value, list):
2293
- return []
2294
- items: list[Any] = []
2295
- for item in value:
2296
- if isinstance(item, str) and not item.strip():
2297
- continue
2298
- if item in ({}, []):
2299
- continue
2300
- items.append(item)
2301
- return items
2302
-
2303
-
2304
- def _normalize_exclusion_token(value: Any) -> str:
2305
- if isinstance(value, str):
2306
- return value.strip()
2307
- if isinstance(value, dict):
2308
- for field in ("id", "test", "name", "reason"):
2309
- token = str(value.get(field, "")).strip()
2310
- if token:
2311
- return token
2312
- return json.dumps(value, sort_keys=True, ensure_ascii=True)
2313
- return str(value).strip()
2314
-
2315
-
2316
- def _extract_signed_statement(payload: dict[str, Any]) -> dict[str, Any] | None:
2317
- if "_type" in payload and "subject" in payload and "predicateType" in payload:
2318
- return payload
2319
- for key in ("attestation_statement", "statement", "attestation"):
2320
- candidate = payload.get(key)
2321
- if isinstance(candidate, dict):
2322
- return candidate
2323
- return None
2324
-
2325
-
2326
- def _resolve_relative_path(*, output_root: Path, rel_path: str) -> Path | None:
2327
- candidate = Path(rel_path)
2328
- if not rel_path or candidate.is_absolute():
2329
- return None
2330
- resolved = (output_root / candidate).resolve()
2331
- root = output_root.resolve()
2332
- try:
2333
- resolved.relative_to(root)
2334
- except ValueError:
2335
- return None
2336
- return resolved
2337
-
2338
-
2339
- def _load_json_or_none(path: Path) -> dict[str, Any] | None:
2340
- try:
2341
- payload = _load_json(path)
2342
- except Exception:
2343
- return None
2344
- return payload if isinstance(payload, dict) else None
2345
-
2346
-
2347
- def _jsonl_has_run_id(path: Path, run_id: str) -> bool:
2348
- try:
2349
- lines = path.read_text(encoding="utf-8").splitlines()
2350
- except OSError:
2351
- return False
2352
- for line in lines:
2353
- if not line.strip():
2354
- continue
2355
- try:
2356
- payload = json.loads(line)
2357
- except json.JSONDecodeError:
2358
- continue
2359
- if isinstance(payload, dict) and str(payload.get("run_id", "")).strip() == run_id:
2360
- return True
2361
- return False
2362
-
2363
-
2364
- def _is_stale_execution_primitive(path: Path, *, evidence_mtime: float, max_age_seconds: float) -> bool:
2365
- try:
2366
- primitive_mtime = path.stat().st_mtime
2367
- except OSError:
2368
- return False
2369
- return (evidence_mtime - primitive_mtime) > max_age_seconds
2370
-
2371
-
2372
- def _check_excluded_failures_waiver(
2373
- *,
2374
- output_root: Path,
2375
- evidence_payload: dict[str, Any],
2376
- run_id: str,
2377
- ) -> dict[str, Any]:
2378
- excluded_failures = _as_non_empty_list(evidence_payload.get("excluded_failures"))
2379
- blockers: list[str] = []
2380
- waiver_path = str(evidence_payload.get("excluded_failures_waiver_path", "")).strip()
2381
- if not waiver_path:
2382
- waiver = evidence_payload.get("excluded_failures_waiver")
2383
- if isinstance(waiver, dict):
2384
- waiver_path = str(waiver.get("path", "")).strip()
2385
-
2386
- if not excluded_failures:
2387
- return {
2388
- "status": "ok",
2389
- "excluded_failures": [],
2390
- "waiver_path": waiver_path,
2391
- "blockers": [],
2392
- }
2393
-
2394
- if not waiver_path:
2395
- blockers.append("excluded_failures_without_signed_waiver: missing waiver artifact path")
2396
- return {
2397
- "status": "error",
2398
- "excluded_failures": excluded_failures,
2399
- "waiver_path": waiver_path,
2400
- "blockers": blockers,
2401
- }
2402
-
2403
- resolved_path = _resolve_relative_path(output_root=output_root, rel_path=waiver_path)
2404
- if resolved_path is None:
2405
- blockers.append("excluded_failures_without_signed_waiver: waiver path outside output root")
2406
- return {
2407
- "status": "error",
2408
- "excluded_failures": excluded_failures,
2409
- "waiver_path": waiver_path,
2410
- "blockers": blockers,
2411
- }
2412
-
2413
- waiver_payload = _load_json_or_none(resolved_path)
2414
- if not isinstance(waiver_payload, dict):
2415
- blockers.append("excluded_failures_without_signed_waiver: unreadable waiver artifact")
2416
- return {
2417
- "status": "error",
2418
- "excluded_failures": excluded_failures,
2419
- "waiver_path": waiver_path,
2420
- "blockers": blockers,
2421
- }
2422
-
2423
- statement = _extract_signed_statement(waiver_payload)
2424
- if not isinstance(statement, dict) or not verify_artifact_statement(statement):
2425
- blockers.append("excluded_failures_without_signed_waiver: invalid waiver signature")
2426
- return {
2427
- "status": "error",
2428
- "excluded_failures": excluded_failures,
2429
- "waiver_path": waiver_path,
2430
- "blockers": blockers,
2431
- }
2432
-
2433
- waiver_run_id = str(waiver_payload.get("run_id", "")).strip()
2434
- if run_id and waiver_run_id and waiver_run_id != run_id:
2435
- blockers.append("excluded_failures_without_signed_waiver: waiver run_id mismatch")
2436
-
2437
- authorized_failures = _as_non_empty_list(waiver_payload.get("excluded_failures"))
2438
- if not authorized_failures:
2439
- blockers.append("excluded_failures_without_signed_waiver: waiver missing excluded_failures list")
2440
- else:
2441
- required_tokens = {_normalize_exclusion_token(item) for item in excluded_failures}
2442
- authorized_tokens = {_normalize_exclusion_token(item) for item in authorized_failures}
2443
- if not required_tokens.issubset(authorized_tokens):
2444
- blockers.append("excluded_failures_without_signed_waiver: waiver does not authorize all exclusions")
2445
-
2446
- return {
2447
- "status": "ok" if not blockers else "error",
2448
- "excluded_failures": excluded_failures,
2449
- "waiver_path": waiver_path,
2450
- "blockers": blockers,
2451
- }
2452
-
2453
-
2454
- def _check_execution_primitives(*, output_root: Path, evidence_profile: str | None = None) -> dict[str, Any]:
2455
- blockers: list[str] = []
2456
- missing: list[str] = []
2457
- invalid: list[str] = []
2458
- evidence_paths: dict[str, str] = {key: "" for key in _REQUIRED_EXECUTION_PRIMITIVES}
2459
- require_exec_kernel_evidence = _env_truthy("OMG_REQUIRE_EXEC_KERNEL_EVIDENCE")
2460
- require_governed_tool_evidence = _env_truthy("OMG_REQUIRE_GOVERNED_TOOL_EVIDENCE")
2461
- excluded_failures_policy: dict[str, Any] = {
2462
- "status": "ok",
2463
- "excluded_failures": [],
2464
- "waiver_path": "",
2465
- "blockers": [],
2466
- }
2467
- resolved_profile = (evidence_profile or "").strip()
2468
- required_evidence_requirements = requirements_for_profile(resolved_profile)
2469
- active_run_id = get_active_coordinator_run_id(str(output_root)) or ""
2470
-
2471
- latest = _latest_evidence_pack(output_root)
2472
- if latest is None:
2473
- missing.extend(list(_REQUIRED_EXECUTION_PRIMITIVES))
2474
- blockers.extend(f"missing_execution_primitive: {item}" for item in missing)
2475
- return {
2476
- "status": "error",
2477
- "run_id": "",
2478
- "evidence_profile": resolved_profile,
2479
- "required_evidence_requirements": list(required_evidence_requirements),
2480
- "require_exec_kernel_evidence": require_exec_kernel_evidence,
2481
- "require_governed_tool_evidence": require_governed_tool_evidence,
2482
- "required": list(_REQUIRED_EXECUTION_PRIMITIVES),
2483
- "missing": missing,
2484
- "invalid": invalid,
2485
- "evidence_paths": evidence_paths,
2486
- "blockers": blockers,
2487
- }
2488
-
2489
- evidence_path, evidence_payload = latest
2490
- invalid_evidence = str(evidence_payload.get("invalid", "")).strip()
2491
- if invalid_evidence:
2492
- invalid.append(f"release_evidence_pack:{invalid_evidence}")
2493
- blockers.append(f"invalid_execution_primitive: release_evidence_pack: {invalid_evidence}")
2494
- return {
2495
- "status": "error",
2496
- "run_id": "",
2497
- "evidence_profile": resolved_profile,
2498
- "required_evidence_requirements": list(required_evidence_requirements),
2499
- "require_exec_kernel_evidence": require_exec_kernel_evidence,
2500
- "require_governed_tool_evidence": require_governed_tool_evidence,
2501
- "required": list(_REQUIRED_EXECUTION_PRIMITIVES),
2502
- "missing": list(_REQUIRED_EXECUTION_PRIMITIVES),
2503
- "invalid": invalid,
2504
- "evidence_paths": evidence_paths,
2505
- "blockers": blockers,
2506
- }
2507
-
2508
- if not resolved_profile:
2509
- resolved_profile = str(evidence_payload.get("evidence_profile", "")).strip()
2510
- required_evidence_requirements = requirements_for_profile(resolved_profile)
2511
-
2512
- try:
2513
- evidence_mtime = evidence_path.stat().st_mtime
2514
- except OSError:
2515
- evidence_mtime = datetime.now(timezone.utc).timestamp()
2516
- max_age_seconds = _execution_primitive_max_age_seconds()
2517
-
2518
- run_id = str(evidence_payload.get("run_id", "")).strip()
2519
- if not run_id:
2520
- invalid.append("run_id_unresolved")
2521
- blockers.append("invalid_execution_primitive: run_id_unresolved")
2522
- if active_run_id and run_id and run_id != active_run_id:
2523
- invalid.append("run_id_cross_run")
2524
- blockers.append("execution_primitive:cross_run")
2525
-
2526
- evidence_metadata_missing = _missing_context_metadata(evidence_payload)
2527
- if evidence_metadata_missing:
2528
- invalid.append("release_evidence_pack:missing_context_metadata")
2529
- blockers.append(
2530
- "invalid_execution_primitive: release_evidence_pack: "
2531
- f"missing_context_metadata={','.join(sorted(evidence_metadata_missing))}"
2532
- )
2533
-
2534
- excluded_failures_policy = _check_excluded_failures_waiver(
2535
- output_root=output_root,
2536
- evidence_payload=evidence_payload,
2537
- run_id=run_id,
2538
- )
2539
- if excluded_failures_policy.get("status") != "ok":
2540
- invalid.append("excluded_failures:missing_signed_waiver")
2541
- blockers.extend(
2542
- item
2543
- for item in excluded_failures_policy.get("blockers", [])
2544
- if isinstance(item, str)
2545
- )
2546
-
2547
- checks: list[tuple[str, str, str]] = [
2548
- ("release_run_coordinator_state", "release_run_coordinator", "ReleaseRunCoordinatorState"),
2549
- ("rollback_manifest", "rollback_manifest", "RollbackManifest"),
2550
- ("intent_gate_state", "intent_gate", "IntentGateDecision"),
2551
- ("session_health_state", "session_health", "SessionHealth"),
2552
- ("council_verdicts", "council_verdicts", "CouncilVerdicts"),
2553
- ]
2554
- resolved_state_payloads: dict[str, dict[str, Any]] = {}
2555
- for token, module, schema_name in checks:
2556
- matched_path, matched_payload = _find_state_for_run(output_root=output_root, module=module, run_id=run_id)
2557
- if matched_path is None or matched_payload is None:
2558
- missing.append(token)
2559
- blockers.append(f"missing_execution_primitive: {token}")
2560
- continue
2561
- evidence_paths[token] = str(matched_path.relative_to(output_root)).replace("\\", "/")
2562
- resolved_state_payloads[token] = matched_payload
2563
- payload_run_id = str(matched_payload.get("run_id", "")).strip()
2564
- if run_id and payload_run_id and payload_run_id != run_id:
2565
- invalid.append(f"{token}:cross_run")
2566
- blockers.append(f"cross_run_execution_primitive: {token}")
2567
- schema = str(matched_payload.get("schema", "")).strip()
2568
- if schema != schema_name:
2569
- invalid.append(f"{token}:schema_mismatch")
2570
- blockers.append(f"invalid_execution_primitive: {token}: schema_mismatch")
2571
- continue
2572
- required_fields = _required_fields_for_module(module)
2573
- missing_fields = [field for field in required_fields if field not in matched_payload]
2574
- if missing_fields:
2575
- invalid.append(f"{token}:missing_fields")
2576
- blockers.append(
2577
- f"invalid_execution_primitive: {token}: missing_fields={','.join(sorted(missing_fields))}"
2578
- )
2579
- if token in {"intent_gate_state", "session_health_state", "council_verdicts"}:
2580
- metadata_missing = _missing_context_metadata(matched_payload)
2581
- if metadata_missing:
2582
- invalid.append(f"{token}:missing_context_metadata")
2583
- blockers.append(
2584
- f"invalid_execution_primitive: {token}: "
2585
- f"missing_context_metadata={','.join(sorted(metadata_missing))}"
2586
- )
2587
- if _is_stale_execution_primitive(
2588
- matched_path,
2589
- evidence_mtime=evidence_mtime,
2590
- max_age_seconds=max_age_seconds,
2591
- ):
2592
- invalid.append(f"{token}:stale")
2593
- blockers.append(f"stale_execution_primitive: {token}")
2594
-
2595
- claims_payload = evidence_payload.get("claims")
2596
- claims = claims_payload if isinstance(claims_payload, list) else []
2597
- if not claims or not run_id:
2598
- missing.append("claim_judge_outcome")
2599
- blockers.append("missing_execution_primitive: claim_judge_outcome")
2600
- else:
2601
- release_evidence: dict[str, object] = {"run_id": run_id, "claims": claims}
2602
- artifact = evidence_payload.get("artifact")
2603
- if isinstance(artifact, dict):
2604
- release_evidence["artifact"] = artifact
2605
- compliance = evaluate_release_compliance(
2606
- project_dir=str(output_root),
2607
- run_id=run_id,
2608
- release_evidence=release_evidence,
2609
- )
2610
- claim_dir = output_root / ".omg" / "evidence"
2611
- claim_candidates = sorted(claim_dir.glob("claim-judge-*.json")) if claim_dir.exists() else []
2612
- if claim_candidates:
2613
- claim_path = claim_candidates[-1]
2614
- evidence_paths["claim_judge_outcome"] = str(claim_path.relative_to(output_root)).replace("\\", "/")
2615
- else:
2616
- missing.append("claim_judge_outcome")
2617
- blockers.append("missing_execution_primitive: claim_judge_outcome")
2618
- if str(compliance.get("status", "")).strip().lower() == "blocked":
2619
- invalid.append("claim_judge_outcome:blocked")
2620
- reason = str(compliance.get("reason", "claim_judge_blocked")).strip()
2621
- blockers.append(f"invalid_execution_primitive: claim_judge_outcome: {reason}")
2622
-
2623
- release_state = resolved_state_payloads.get("release_run_coordinator_state", {})
2624
- if not release_state:
2625
- missing.append("compliance_governor_outcome")
2626
- blockers.append("missing_execution_primitive: compliance_governor_outcome")
2627
- else:
2628
- evidence_paths["compliance_governor_outcome"] = evidence_paths.get("release_run_coordinator_state", "")
2629
- authority = str(release_state.get("compliance_authority", "")).strip()
2630
- reason = str(release_state.get("compliance_reason", "")).strip()
2631
- if not authority or not reason:
2632
- invalid.append("compliance_governor_outcome:missing_fields")
2633
- blockers.append("invalid_execution_primitive: compliance_governor_outcome: missing_fields")
2634
- artifact_verdict = str(release_state.get("artifact_verdict", "")).strip()
2635
- if artifact_verdict:
2636
- artifact_alg = str(release_state.get("artifact_alg", "")).strip()
2637
- artifact_key_id = str(release_state.get("artifact_key_id", "")).strip()
2638
- if not artifact_alg or not artifact_key_id:
2639
- invalid.append("compliance_governor_outcome:missing_artifact_audit")
2640
- blockers.append(
2641
- "invalid_execution_primitive: compliance_governor_outcome: missing_artifact_audit_fields"
2642
- )
2643
-
2644
- profile_path = output_root / ".omg" / "state" / "profile.yaml"
2645
- if not profile_path.exists():
2646
- missing.append("profile_digest")
2647
- blockers.append("missing_execution_primitive: profile_digest")
2648
- else:
2649
- evidence_paths["profile_digest"] = str(profile_path.relative_to(output_root)).replace("\\", "/")
2650
- try:
2651
- profile_payload = yaml.safe_load(profile_path.read_text(encoding="utf-8"))
2652
- except Exception:
2653
- profile_payload = None
2654
- profile_version = ""
2655
- if isinstance(profile_payload, dict):
2656
- profile_version = str(
2657
- profile_payload.get("profile_version")
2658
- or profile_payload.get("version")
2659
- or ""
2660
- ).strip()
2661
- if not profile_version:
2662
- provenance = profile_payload.get("profile_provenance")
2663
- if isinstance(provenance, dict):
2664
- profile_version = str(
2665
- provenance.get("checksum")
2666
- or provenance.get("version")
2667
- or ""
2668
- ).strip()
2669
- if not profile_version:
2670
- invalid.append("profile_digest:missing_profile_version")
2671
- blockers.append("invalid_execution_primitive: profile_digest: missing_profile_version")
2672
-
2673
- lock_path, lock_payload = _find_test_intent_lock(output_root=output_root, run_id=run_id, evidence_payload=evidence_payload)
2674
- if lock_path is None or lock_payload is None:
2675
- missing.append("tdd_proof_chain_lock")
2676
- blockers.append("missing_execution_primitive: tdd_proof_chain_lock")
2677
- else:
2678
- evidence_paths["tdd_proof_chain_lock"] = str(lock_path.relative_to(output_root)).replace("\\", "/")
2679
- lock_run_id = str(lock_payload.get("run_id", "")).strip()
2680
- if run_id and lock_run_id and lock_run_id != run_id:
2681
- invalid.append("tdd_proof_chain_lock:cross_run")
2682
- blockers.append("cross_run_execution_primitive: tdd_proof_chain_lock")
2683
- lock_status = str(lock_payload.get("status", "")).strip().lower()
2684
- if lock_status in {"", "error", "blocked"}:
2685
- invalid.append("tdd_proof_chain_lock:status_invalid")
2686
- blockers.append("invalid_execution_primitive: tdd_proof_chain_lock: status_invalid")
2687
- if _is_stale_execution_primitive(
2688
- lock_path,
2689
- evidence_mtime=evidence_mtime,
2690
- max_age_seconds=max_age_seconds,
2691
- ):
2692
- invalid.append("tdd_proof_chain_lock:stale")
2693
- blockers.append("stale_execution_primitive: tdd_proof_chain_lock")
2694
-
2695
- forge_path, forge_payload = _find_forge_starter_proof(output_root=output_root, run_id=run_id)
2696
- if forge_path is None or forge_payload is None:
2697
- missing.append("forge_starter_proof")
2698
- blockers.append("missing_execution_primitive: forge_starter_proof")
2699
- else:
2700
- evidence_paths["forge_starter_proof"] = str(forge_path.relative_to(output_root)).replace("\\", "/")
2701
- forge_run_id = str(forge_payload.get("run_id", "")).strip()
2702
- if run_id and forge_run_id and forge_run_id != run_id:
2703
- invalid.append("forge_starter_proof:cross_run")
2704
- blockers.append("cross_run_execution_primitive: forge_starter_proof")
2705
- forge_schema = str(forge_payload.get("schema", "")).strip()
2706
- if forge_schema != "ForgeSpecialistDispatchEvidence":
2707
- invalid.append("forge_starter_proof:schema_mismatch")
2708
- blockers.append("invalid_execution_primitive: forge_starter_proof: schema_mismatch")
2709
- if forge_payload.get("proof_backed") is not True:
2710
- invalid.append("forge_starter_proof:not_proof_backed")
2711
- blockers.append("invalid_execution_primitive: forge_starter_proof: proof_backed_false")
2712
- forge_metadata_missing = _missing_context_metadata(forge_payload)
2713
- if forge_metadata_missing:
2714
- invalid.append("forge_starter_proof:missing_context_metadata")
2715
- blockers.append(
2716
- "invalid_execution_primitive: forge_starter_proof: "
2717
- f"missing_context_metadata={','.join(sorted(forge_metadata_missing))}"
2718
- )
2719
- if _is_stale_execution_primitive(
2720
- forge_path,
2721
- evidence_mtime=evidence_mtime,
2722
- max_age_seconds=max_age_seconds,
2723
- ):
2724
- invalid.append("forge_starter_proof:stale")
2725
- blockers.append("stale_execution_primitive: forge_starter_proof")
2726
-
2727
- # ── Resolve evidence-pack-embedded primitives ──────────────────────────
2728
- # The evidence pack stores new execution primitives as nested dicts with
2729
- # a "path" key. Resolve each one against output_root.
2730
- _pack_embedded_primitives = (
2731
- "exec_kernel_state",
2732
- "worker_watchdog_replay",
2733
- "merge_writer_provenance",
2734
- "write_lease_provenance",
2735
- "tool_fabric_ledger",
2736
- "budget_envelope_state",
2737
- "issue_report",
2738
- "host_parity_report",
2739
- "music_omr_testbed_evidence",
2740
- )
2741
- for token in _pack_embedded_primitives:
2742
- entry = evidence_payload.get(token)
2743
- if not isinstance(entry, dict):
2744
- missing.append(token)
2745
- blockers.append(f"missing_execution_primitive: {token}")
2746
- continue
2747
- entry_run_id = str(entry.get("run_id", "")).strip()
2748
- if run_id and entry_run_id and entry_run_id != run_id:
2749
- invalid.append(f"{token}:cross_run")
2750
- blockers.append(f"cross_run_execution_primitive: {token}")
2751
- rel_path = str(entry.get("path", "")).strip()
2752
- if not rel_path:
2753
- missing.append(token)
2754
- blockers.append(f"missing_execution_primitive: {token}")
2755
- continue
2756
- resolved = _resolve_relative_path(output_root=output_root, rel_path=rel_path)
2757
- if resolved is None:
2758
- invalid.append(f"{token}:invalid_path")
2759
- blockers.append(f"invalid_execution_primitive: {token}: invalid_path")
2760
- continue
2761
- if not resolved.exists():
2762
- missing.append(token)
2763
- blockers.append(f"missing_execution_primitive: {token}")
2764
- continue
2765
- normalized_rel_path = str(resolved.relative_to(output_root)).replace("\\", "/")
2766
- evidence_paths[token] = normalized_rel_path
2767
- if token == "tool_fabric_ledger":
2768
- if run_id and not _jsonl_has_run_id(resolved, run_id):
2769
- invalid.append(f"{token}:run_id_missing")
2770
- blockers.append(f"invalid_execution_primitive: {token}: run_id_missing")
2771
- else:
2772
- payload = _load_json_or_none(resolved)
2773
- if isinstance(payload, dict):
2774
- payload_run_id = str(payload.get("run_id", "")).strip()
2775
- if run_id and payload_run_id and payload_run_id != run_id:
2776
- invalid.append(f"{token}:cross_run")
2777
- blockers.append(f"cross_run_execution_primitive: {token}")
2778
- if token == "exec_kernel_state" and require_exec_kernel_evidence:
2779
- if str(payload.get("schema", "")).strip() != "ExecKernelRunState":
2780
- invalid.append("exec_kernel_state:schema_mismatch")
2781
- blockers.append("invalid_execution_primitive: exec_kernel_state: schema_mismatch")
2782
- if payload.get("kernel_enabled") is not True:
2783
- invalid.append("exec_kernel_state:kernel_disabled")
2784
- blockers.append("invalid_execution_primitive: exec_kernel_state: kernel_disabled")
2785
- elif token == "exec_kernel_state" and require_exec_kernel_evidence:
2786
- invalid.append("exec_kernel_state:unreadable")
2787
- blockers.append("invalid_execution_primitive: exec_kernel_state: unreadable")
2788
- if token == "tool_fabric_ledger" and require_governed_tool_evidence:
2789
- try:
2790
- ledger_size = resolved.stat().st_size
2791
- except OSError:
2792
- ledger_size = 0
2793
- if ledger_size <= 0:
2794
- invalid.append("tool_fabric_ledger:empty")
2795
- blockers.append("invalid_execution_primitive: tool_fabric_ledger: empty")
2796
- if _is_stale_execution_primitive(
2797
- resolved,
2798
- evidence_mtime=evidence_mtime,
2799
- max_age_seconds=max_age_seconds,
2800
- ):
2801
- invalid.append(f"{token}:stale")
2802
- blockers.append(f"stale_execution_primitive: {token}")
2803
-
2804
- return {
2805
- "status": "ok" if not blockers else "error",
2806
- "run_id": run_id,
2807
- "evidence_profile": resolved_profile,
2808
- "required_evidence_requirements": list(required_evidence_requirements),
2809
- "require_exec_kernel_evidence": require_exec_kernel_evidence,
2810
- "require_governed_tool_evidence": require_governed_tool_evidence,
2811
- "evidence_pack": str(evidence_path.relative_to(output_root)).replace("\\", "/"),
2812
- "required": list(_REQUIRED_EXECUTION_PRIMITIVES),
2813
- "missing": sorted(set(missing)),
2814
- "invalid": sorted(set(invalid)),
2815
- "evidence_paths": evidence_paths,
2816
- "blockers": blockers,
2817
- }
2818
-
2819
-
2820
- def _find_state_for_run(
2821
- *,
2822
- output_root: Path,
2823
- module: str,
2824
- run_id: str,
2825
- ) -> tuple[Path | None, dict[str, Any] | None]:
2826
- state_dir = output_root / ".omg" / "state" / module
2827
- if not state_dir.exists():
2828
- return None, None
2829
-
2830
- preferred = state_dir / f"{run_id}.json"
2831
- if run_id and preferred.exists():
2832
- try:
2833
- payload = _load_json(preferred)
2834
- except Exception:
2835
- payload = {}
2836
- if isinstance(payload, dict):
2837
- return preferred, payload
2838
-
2839
- for path in sorted(state_dir.glob("*.json")):
2840
- try:
2841
- payload = _load_json(path)
2842
- except Exception:
2843
- continue
2844
- if not isinstance(payload, dict):
2845
- continue
2846
- if run_id and str(payload.get("run_id", "")).strip() != run_id:
2847
- continue
2848
- return path, payload
2849
- return None, None
2850
-
2851
-
2852
- def _find_test_intent_lock(
2853
- *,
2854
- output_root: Path,
2855
- run_id: str,
2856
- evidence_payload: dict[str, Any],
2857
- ) -> tuple[Path | None, dict[str, Any] | None]:
2858
- lock_dir = output_root / ".omg" / "state" / "test-intent-lock"
2859
- if not lock_dir.exists():
2860
- return None, None
2861
-
2862
- lock_id = ""
2863
- test_delta = evidence_payload.get("test_delta")
2864
- if isinstance(test_delta, dict):
2865
- lock_id = str(test_delta.get("lock_id", "")).strip()
2866
-
2867
- for path in sorted(lock_dir.glob("*.json")):
2868
- try:
2869
- payload = _load_json(path)
2870
- except Exception:
2871
- continue
2872
- if not isinstance(payload, dict):
2873
- continue
2874
- payload_lock_id = str(payload.get("lock_id", "")).strip()
2875
- if lock_id and payload_lock_id == lock_id:
2876
- return path, payload
2877
- intent = payload.get("intent")
2878
- if isinstance(intent, dict):
2879
- intent_run = str(intent.get("run_id", "")).strip()
2880
- if run_id and intent_run == run_id:
2881
- return path, payload
2882
- payload_run = str(payload.get("run_id", "")).strip()
2883
- if run_id and payload_run == run_id:
2884
- return path, payload
2885
- return None, None
2886
-
2887
-
2888
- def _find_forge_starter_proof(*, output_root: Path, run_id: str) -> tuple[Path | None, dict[str, Any] | None]:
2889
- evidence_dir = output_root / ".omg" / "evidence"
2890
- if not evidence_dir.exists():
2891
- return None, None
2892
- for path in sorted(evidence_dir.glob("forge-specialists-*.json")):
2893
- try:
2894
- payload = _load_json(path)
2895
- except Exception:
2896
- continue
2897
- if not isinstance(payload, dict):
2898
- continue
2899
- payload_run = str(payload.get("run_id", "")).strip()
2900
- if run_id and payload_run and payload_run != run_id:
2901
- continue
2902
- return path, payload
2903
- return None, None
2904
-
2905
-
2906
- def _sanitize_run_id(value: str) -> str:
2907
- cleaned = "".join(ch if ch.isalnum() or ch in {"-", "_", "."} else "-" for ch in value.strip())
2908
- return cleaned or "unknown"
2909
-
2910
-
2911
- def _check_claim_judge_compliance(output_root: Path) -> dict[str, Any]:
2912
- latest = _latest_evidence_pack(output_root)
2913
- if latest is None:
2914
- return {"status": "missing", "blockers": []}
2915
-
2916
- _, evidence_payload = latest
2917
- run_id = str(evidence_payload.get("run_id", "")).strip()
2918
- claims_payload = evidence_payload.get("claims")
2919
- claims = claims_payload if isinstance(claims_payload, list) else []
2920
- if not run_id or not claims:
2921
- return {
2922
- "status": "missing",
2923
- "run_id": run_id,
2924
- "blockers": ["claim_judge_compliance_gate: missing release claims for compliance evaluation"],
2925
- }
2926
-
2927
- release_evidence: dict[str, object] = {"run_id": run_id, "claims": claims}
2928
- artifact = evidence_payload.get("artifact")
2929
- if isinstance(artifact, dict):
2930
- release_evidence["artifact"] = artifact
2931
- decision = evaluate_release_compliance(
2932
- project_dir=str(output_root),
2933
- run_id=run_id,
2934
- release_evidence=release_evidence,
2935
- )
2936
- decision_status = str(decision.get("status", "")).strip().lower()
2937
- blockers: list[str] = []
2938
- if decision_status == "blocked":
2939
- reason = str(decision.get("reason", "compliance_gate_blocked")).strip() or "compliance_gate_blocked"
2940
- blockers.append(f"claim_judge_compliance_gate: {reason}")
2941
- return {
2942
- "status": "ok" if not blockers else "error",
2943
- "run_id": run_id,
2944
- "decision": decision,
2945
- "blockers": blockers,
2946
- }
2947
-
2948
-
2949
- def _check_test_intent_claims(payload: dict[str, Any]) -> list[str]:
2950
- test_delta = payload.get("test_delta")
2951
- claims = payload.get("claims", [])
2952
- if not isinstance(claims, list):
2953
- return []
2954
-
2955
- from runtime.test_intent_lock import evaluate_test_delta
2956
-
2957
- blockers: list[str] = []
2958
- guarded_claims = {"tests passed", "tests_passed", "bug fixed", "bug_fixed"}
2959
- for claim in claims:
2960
- if not isinstance(claim, dict):
2961
- continue
2962
- claim_type = str(claim.get("claim_type", "")).strip().lower()
2963
- if claim_type not in guarded_claims:
2964
- continue
2965
- delta = claim.get("test_delta")
2966
- if not isinstance(delta, dict):
2967
- delta = test_delta if isinstance(test_delta, dict) else None
2968
- if not isinstance(delta, dict):
2969
- blockers.append(f"test_intent_lock_missing_delta: claim '{claim_type}' requires test_delta evidence")
2970
- continue
2971
- result = evaluate_test_delta(delta)
2972
- if result.get("verdict") != "pass":
2973
- reasons = result.get("reasons", [])
2974
- reason_text = "; ".join(str(item) for item in reasons if str(item).strip())
2975
- suffix = f": {reason_text}" if reason_text else ""
2976
- blockers.append(f"test_intent_lock_blocked: claim '{claim_type}'{suffix}")
2977
- return blockers
2978
-
2979
-
2980
- def _check_eval_gate(output_root: Path) -> dict[str, Any]:
2981
- latest_path = output_root / ".omg" / "evals" / "latest.json"
2982
- if not latest_path.exists():
2983
- return {"status": "missing", "blockers": []}
2984
- payload = _load_json(latest_path)
2985
- blockers: list[str] = []
2986
- if payload.get("status") != "ok" or bool(payload.get("summary", {}).get("regressed")):
2987
- blockers.append("eval regression detected")
2988
- return {
2989
- "status": "ok" if not blockers else "error",
2990
- "path": str(latest_path.relative_to(output_root)),
2991
- "blockers": blockers,
2992
- }
2993
-
2994
-
2995
- def _check_proof_chain(output_root: Path) -> dict[str, Any]:
2996
- chain_module = importlib.import_module("runtime.proof_chain")
2997
- gate_module = importlib.import_module("runtime.proof_gate")
2998
-
2999
- gate_input = chain_module.build_proof_gate_input(str(output_root))
3000
- chain = gate_input.get("proof_chain", {}) if isinstance(gate_input, dict) else {}
3001
- chain_status = str(chain.get("status", "error"))
3002
- raw_blockers = chain.get("blockers", [])
3003
- blockers = [f"proof_chain_linkage: {item}" for item in raw_blockers] if isinstance(raw_blockers, list) else ["proof_chain_linkage: invalid blockers"]
3004
- if chain_status == "ok":
3005
- blockers = []
3006
-
3007
- proof_gate = gate_module.evaluate_proof_gate(gate_input if isinstance(gate_input, dict) else {})
3008
- if str(proof_gate.get("verdict", "fail")) != "pass":
3009
- gate_blockers = proof_gate.get("blockers", [])
3010
- if isinstance(gate_blockers, list) and gate_blockers:
3011
- blockers.extend(f"proof_gate_blocked: {item}" for item in gate_blockers)
3012
- else:
3013
- blockers.append("proof_gate_blocked: verdict_fail")
3014
-
3015
- return {
3016
- "status": "ok" if not blockers else "error",
3017
- "proof_chain": chain,
3018
- "proof_gate": proof_gate,
3019
- "blockers": blockers,
3020
- }
3021
-
3022
-
3023
- def _check_bundle_promotion_parity(root: Path, output_root: Path) -> dict[str, Any]:
3024
- missing_settings_required_bundles: list[str] = []
3025
- missing_dist_public: list[str] = []
3026
- missing_dist_enterprise: list[str] = []
3027
- missing_pyproject_data_files: list[str] = []
3028
-
3029
- settings_path = output_root / "settings.json"
3030
- if settings_path.exists():
3031
- settings = _load_json(settings_path)
3032
- required_bundles = settings.get("_omg", {}).get("generated", {}).get("required_bundles", [])
3033
- if not isinstance(required_bundles, list):
3034
- required_bundles = []
3035
- required_bundle_set = {str(item) for item in required_bundles}
3036
- missing_settings_required_bundles = [
3037
- bundle_id for bundle_id in TRUTH_COUNCIL_BUNDLES if bundle_id not in required_bundle_set
3038
- ]
3039
- else:
3040
- missing_settings_required_bundles = list(TRUTH_COUNCIL_BUNDLES)
3041
-
3042
- for bundle_id in TRUTH_COUNCIL_BUNDLES:
3043
- public_skill = output_root / "dist" / "public" / "bundle" / ".agents" / "skills" / "omg" / bundle_id / "SKILL.md"
3044
- if not public_skill.exists():
3045
- missing_dist_public.append(str(public_skill.relative_to(output_root)))
3046
-
3047
- enterprise_skill = output_root / "dist" / "enterprise" / "bundle" / ".agents" / "skills" / "omg" / bundle_id / "SKILL.md"
3048
- if not enterprise_skill.exists():
3049
- missing_dist_enterprise.append(str(enterprise_skill.relative_to(output_root)))
3050
-
3051
- pyproject_path = root / "pyproject.toml"
3052
- if pyproject_path.exists():
3053
- pyproject_content = pyproject_path.read_text(encoding="utf-8")
3054
- for bundle_id in TRUTH_COUNCIL_BUNDLES:
3055
- data_file_key = f'".agents/skills/omg/{bundle_id}" = '
3056
- if data_file_key not in pyproject_content:
3057
- missing_pyproject_data_files.append(bundle_id)
3058
- else:
3059
- missing_pyproject_data_files = list(TRUTH_COUNCIL_BUNDLES)
3060
-
3061
- failed = any(
3062
- (
3063
- missing_settings_required_bundles,
3064
- missing_dist_public,
3065
- missing_dist_enterprise,
3066
- missing_pyproject_data_files,
3067
- )
3068
- )
3069
- return {
3070
- "status": "ok" if not failed else "error",
3071
- "blockers": ["bundle_promotion_parity"] if failed else [],
3072
- "missing_settings_required_bundles": missing_settings_required_bundles,
3073
- "missing_dist_public": missing_dist_public,
3074
- "missing_dist_enterprise": missing_dist_enterprise,
3075
- "missing_pyproject_data_files": missing_pyproject_data_files,
3076
- }
3077
-
3078
-
3079
- def check_package_parity(root_path: str | Path) -> dict[str, Any]:
3080
- root = _resolve_root(root_path)
3081
- required_surfaces = tuple(get_package_parity_surfaces())
3082
- machine_blockers: list[dict[str, str]] = []
3083
- blockers: list[str] = []
3084
-
3085
- def _add_blocker(*, location: str, surface: str, path: str, reason: str = "missing_surface") -> None:
3086
- blocker = {
3087
- "kind": "package_parity_missing",
3088
- "location": location,
3089
- "surface": surface,
3090
- "path": path,
3091
- "reason": reason,
3092
- }
3093
- machine_blockers.append(blocker)
3094
- blockers.append(
3095
- f"package_parity_missing: location={location} surface={surface} path={path} reason={reason}"
3096
- )
3097
-
3098
- for surface in required_surfaces:
3099
- source_path = root / ".agents" / "skills" / "omg" / surface / "SKILL.md"
3100
- if not source_path.exists():
3101
- _add_blocker(location="source", surface=surface, path=str(source_path.relative_to(root)))
3102
-
3103
- def _check_bundle_surface_roots(*, location: str, roots: list[Path]) -> None:
3104
- if not roots:
3105
- for surface in required_surfaces:
3106
- _add_blocker(
3107
- location=location,
3108
- surface=surface,
3109
- path=f"{location}/bundle/.agents/skills/omg/{surface}/SKILL.md",
3110
- reason="missing_output_location",
3111
- )
3112
- return
3113
- for surface in required_surfaces:
3114
- found = False
3115
- for bundle_root in roots:
3116
- candidate = bundle_root / ".agents" / "skills" / "omg" / surface / "SKILL.md"
3117
- if candidate.exists():
3118
- found = True
3119
- break
3120
- if not found:
3121
- _add_blocker(
3122
- location=location,
3123
- surface=surface,
3124
- path=f"{location}/bundle/.agents/skills/omg/{surface}/SKILL.md",
3125
- )
3126
-
3127
- dist_bundle_roots = [path for path in sorted((root / "dist").glob("*/bundle")) if path.is_dir()]
3128
- _check_bundle_surface_roots(location="dist", roots=dist_bundle_roots)
3129
-
3130
- release_bundle_roots = [
3131
- path for path in sorted((root / "artifacts" / "release" / "dist").glob("*/bundle")) if path.is_dir()
3132
- ]
3133
- _check_bundle_surface_roots(location="release", roots=release_bundle_roots)
3134
-
3135
- wheel_files = sorted((root / "dist").glob("*.whl"))
3136
- if not wheel_files:
3137
- for surface in required_surfaces:
3138
- _add_blocker(
3139
- location="wheel",
3140
- surface=surface,
3141
- path=f"dist/*.whl::.agents/skills/omg/{surface}/SKILL.md",
3142
- reason="missing_output_location",
3143
- )
3144
- else:
3145
- wheel_path = wheel_files[-1]
3146
- with zipfile.ZipFile(wheel_path) as archive:
3147
- names = set(archive.namelist())
3148
- for surface in required_surfaces:
3149
- suffix = f".agents/skills/omg/{surface}/SKILL.md"
3150
- if not any(name.endswith(suffix) for name in names):
3151
- _add_blocker(
3152
- location="wheel",
3153
- surface=surface,
3154
- path=f"{wheel_path.relative_to(root)}::{suffix}",
3155
- )
3156
-
3157
- return {
3158
- "status": "ok" if not blockers else "error",
3159
- "required_surfaces": list(required_surfaces),
3160
- "machine_blockers": machine_blockers,
3161
- "blockers": blockers,
3162
- }
3163
-
3164
-
3165
- def _check_packaged_install_smoke(root: Path) -> dict[str, Any]:
3166
- blockers: list[str] = []
3167
- with tempfile.TemporaryDirectory(prefix="omg-wheel-") as tmp_dir:
3168
- proc = subprocess.run(
3169
- [sys.executable, "-m", "pip", "wheel", ".", "--no-deps", "-w", tmp_dir],
3170
- cwd=str(root),
3171
- capture_output=True,
3172
- text=True,
3173
- check=False,
3174
- timeout=120,
3175
- )
3176
- if proc.returncode != 0:
3177
- return {
3178
- "status": "error",
3179
- "blockers": ["package smoke failed to build wheel"],
3180
- "stdout": proc.stdout,
3181
- "stderr": proc.stderr,
3182
- }
3183
- wheels = sorted(Path(tmp_dir).glob("*.whl"))
3184
- if not wheels:
3185
- return {"status": "error", "blockers": ["package smoke did not produce a wheel"]}
3186
- with zipfile.ZipFile(wheels[-1]) as archive:
3187
- names = set(archive.namelist())
3188
- required_suffixes = (
3189
- "control_plane/service.py",
3190
- "registry/verify_artifact.py",
3191
- "plugins/dephealth/cve_scanner.py",
3192
- "OMG_COMPAT_CONTRACT.md",
3193
- ".agents/skills/omg/security-check/SKILL.md",
3194
- ".agents/skills/omg/plan-council/SKILL.md",
3195
- ".agents/skills/omg/claim-judge/SKILL.md",
3196
- ".agents/skills/omg/test-intent-lock/SKILL.md",
3197
- ".agents/skills/omg/proof-gate/SKILL.md",
3198
- )
3199
- for suffix in required_suffixes:
3200
- if not any(name.endswith(suffix) for name in names):
3201
- blockers.append(f"package parity missing {suffix}")
3202
- return {"status": "ok" if not blockers else "error", "blockers": blockers}