@trac3r/oh-my-god 2.2.11

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 (638) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/INSTALL-VERIFICATION-INDEX.md +51 -0
  3. package/LICENSE +21 -0
  4. package/OMG-setup.sh +2549 -0
  5. package/QUICK-REFERENCE.md +58 -0
  6. package/README.md +207 -0
  7. package/agents/__init__.py +1 -0
  8. package/agents/__pycache__/model_roles.cpython-313.pyc +0 -0
  9. package/agents/_model_roles.yaml +26 -0
  10. package/agents/designer.md +67 -0
  11. package/agents/explore.md +60 -0
  12. package/agents/model_roles.py +196 -0
  13. package/agents/omg-api-builder.md +23 -0
  14. package/agents/omg-architect-mode.md +41 -0
  15. package/agents/omg-architect.md +13 -0
  16. package/agents/omg-backend-engineer.md +41 -0
  17. package/agents/omg-critic.md +16 -0
  18. package/agents/omg-database-engineer.md +41 -0
  19. package/agents/omg-escalation-router.md +17 -0
  20. package/agents/omg-executor.md +12 -0
  21. package/agents/omg-frontend-designer.md +41 -0
  22. package/agents/omg-implement-mode.md +49 -0
  23. package/agents/omg-infra-engineer.md +41 -0
  24. package/agents/omg-qa-tester.md +16 -0
  25. package/agents/omg-research-mode.md +41 -0
  26. package/agents/omg-security-auditor.md +41 -0
  27. package/agents/omg-testing-engineer.md +41 -0
  28. package/agents/plan.md +80 -0
  29. package/agents/quick_task.md +64 -0
  30. package/agents/reviewer.md +83 -0
  31. package/agents/task.md +71 -0
  32. package/bin/omg +41 -0
  33. package/commands/OMG:ai-commit.md +113 -0
  34. package/commands/OMG:api-twin.md +22 -0
  35. package/commands/OMG:arch.md +313 -0
  36. package/commands/OMG:browser.md +29 -0
  37. package/commands/OMG:ccg.md +22 -0
  38. package/commands/OMG:compat.md +57 -0
  39. package/commands/OMG:cost.md +181 -0
  40. package/commands/OMG:crazy.md +125 -0
  41. package/commands/OMG:create-agent.md +183 -0
  42. package/commands/OMG:deep-plan.md +18 -0
  43. package/commands/OMG:deps.md +248 -0
  44. package/commands/OMG:diagnose-plugins.md +33 -0
  45. package/commands/OMG:doctor.md +37 -0
  46. package/commands/OMG:domain-init.md +11 -0
  47. package/commands/OMG:escalate.md +52 -0
  48. package/commands/OMG:forge.md +103 -0
  49. package/commands/OMG:health-check.md +48 -0
  50. package/commands/OMG:init.md +134 -0
  51. package/commands/OMG:issue.md +56 -0
  52. package/commands/OMG:mode.md +44 -0
  53. package/commands/OMG:playwright.md +17 -0
  54. package/commands/OMG:preflight.md +26 -0
  55. package/commands/OMG:preset.md +49 -0
  56. package/commands/OMG:profile-review.md +58 -0
  57. package/commands/OMG:project-init.md +11 -0
  58. package/commands/OMG:ralph-start.md +43 -0
  59. package/commands/OMG:ralph-stop.md +23 -0
  60. package/commands/OMG:security-check.md +28 -0
  61. package/commands/OMG:session-branch.md +101 -0
  62. package/commands/OMG:session-fork.md +57 -0
  63. package/commands/OMG:session-merge.md +138 -0
  64. package/commands/OMG:setup.md +82 -0
  65. package/commands/OMG:ship.md +18 -0
  66. package/commands/OMG:stats.md +225 -0
  67. package/commands/OMG:teams.md +54 -0
  68. package/commands/OMG:theme.md +44 -0
  69. package/commands/OMG:validate.md +59 -0
  70. package/commands/__init__.py +1 -0
  71. package/docs/command-surface.md +55 -0
  72. package/docs/install/claude-code.md +53 -0
  73. package/docs/install/codex.md +45 -0
  74. package/docs/install/gemini.md +43 -0
  75. package/docs/install/github-action.md +81 -0
  76. package/docs/install/github-app-required-checks.md +107 -0
  77. package/docs/install/github-app.md +161 -0
  78. package/docs/install/kimi.md +43 -0
  79. package/docs/install/opencode.md +38 -0
  80. package/docs/proof.md +182 -0
  81. package/hooks/__init__.py +0 -0
  82. package/hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  83. package/hooks/__pycache__/_agent_registry.cpython-313.pyc +0 -0
  84. package/hooks/__pycache__/_analytics.cpython-313.pyc +0 -0
  85. package/hooks/__pycache__/_budget.cpython-313.pyc +0 -0
  86. package/hooks/__pycache__/_common.cpython-313.pyc +0 -0
  87. package/hooks/__pycache__/_compression_optimizer.cpython-313.pyc +0 -0
  88. package/hooks/__pycache__/_cost_ledger.cpython-313.pyc +0 -0
  89. package/hooks/__pycache__/_learnings.cpython-313.pyc +0 -0
  90. package/hooks/__pycache__/_memory.cpython-313.pyc +0 -0
  91. package/hooks/__pycache__/_post_write.cpython-313.pyc +0 -0
  92. package/hooks/__pycache__/_protected_context.cpython-313.pyc +0 -0
  93. package/hooks/__pycache__/_token_counter.cpython-313.pyc +0 -0
  94. package/hooks/__pycache__/branch_manager.cpython-313.pyc +0 -0
  95. package/hooks/__pycache__/budget_governor.cpython-313.pyc +0 -0
  96. package/hooks/__pycache__/circuit-breaker.cpython-313.pyc +0 -0
  97. package/hooks/__pycache__/compression_feedback.cpython-313.pyc +0 -0
  98. package/hooks/__pycache__/config-guard.cpython-313.pyc +0 -0
  99. package/hooks/__pycache__/context_pressure.cpython-313.pyc +0 -0
  100. package/hooks/__pycache__/credential_store.cpython-313.pyc +0 -0
  101. package/hooks/__pycache__/fetch-rate-limits.cpython-313.pyc +0 -0
  102. package/hooks/__pycache__/firewall.cpython-313.pyc +0 -0
  103. package/hooks/__pycache__/hashline-formatter-bridge.cpython-313.pyc +0 -0
  104. package/hooks/__pycache__/hashline-injector.cpython-313.pyc +0 -0
  105. package/hooks/__pycache__/hashline-validator.cpython-313.pyc +0 -0
  106. package/hooks/__pycache__/idle-detector.cpython-313.pyc +0 -0
  107. package/hooks/__pycache__/instructions-loaded.cpython-313.pyc +0 -0
  108. package/hooks/__pycache__/intentgate-keyword-detector.cpython-313.pyc +0 -0
  109. package/hooks/__pycache__/magic-keyword-router.cpython-313.pyc +0 -0
  110. package/hooks/__pycache__/policy_engine.cpython-313.pyc +0 -0
  111. package/hooks/__pycache__/post-tool-failure.cpython-313.pyc +0 -0
  112. package/hooks/__pycache__/post-write.cpython-313.pyc +0 -0
  113. package/hooks/__pycache__/post_write.cpython-313.pyc +0 -0
  114. package/hooks/__pycache__/pre-compact.cpython-313.pyc +0 -0
  115. package/hooks/__pycache__/pre-tool-inject.cpython-313.pyc +0 -0
  116. package/hooks/__pycache__/prompt-enhancer.cpython-313.pyc +0 -0
  117. package/hooks/__pycache__/quality-runner.cpython-313.pyc +0 -0
  118. package/hooks/__pycache__/query.cpython-313.pyc +0 -0
  119. package/hooks/__pycache__/secret-guard.cpython-313.pyc +0 -0
  120. package/hooks/__pycache__/secret_audit.cpython-313.pyc +0 -0
  121. package/hooks/__pycache__/security_validators.cpython-313.pyc +0 -0
  122. package/hooks/__pycache__/session-end-capture.cpython-313.pyc +0 -0
  123. package/hooks/__pycache__/session-start.cpython-313.pyc +0 -0
  124. package/hooks/__pycache__/setup_wizard.cpython-313.pyc +0 -0
  125. package/hooks/__pycache__/shadow_manager.cpython-313.pyc +0 -0
  126. package/hooks/__pycache__/state_migration.cpython-313.pyc +0 -0
  127. package/hooks/__pycache__/stop-gate.cpython-313.pyc +0 -0
  128. package/hooks/__pycache__/stop_dispatcher.cpython-313.pyc +0 -0
  129. package/hooks/__pycache__/tdd-gate.cpython-313.pyc +0 -0
  130. package/hooks/__pycache__/terms-guard.cpython-313.pyc +0 -0
  131. package/hooks/__pycache__/test-validator.cpython-313.pyc +0 -0
  132. package/hooks/__pycache__/test_generator_hook.cpython-313.pyc +0 -0
  133. package/hooks/__pycache__/todo-state-tracker.cpython-313.pyc +0 -0
  134. package/hooks/__pycache__/tool-ledger.cpython-313.pyc +0 -0
  135. package/hooks/__pycache__/trust_review.cpython-313.pyc +0 -0
  136. package/hooks/__pycache__/user-prompt-submit.cpython-313.pyc +0 -0
  137. package/hooks/_agent_registry.py +481 -0
  138. package/hooks/_analytics.py +291 -0
  139. package/hooks/_budget.py +31 -0
  140. package/hooks/_common.py +761 -0
  141. package/hooks/_compression_optimizer.py +119 -0
  142. package/hooks/_cost_ledger.py +176 -0
  143. package/hooks/_learnings.py +126 -0
  144. package/hooks/_memory.py +103 -0
  145. package/hooks/_post_write.py +46 -0
  146. package/hooks/_protected_context.py +150 -0
  147. package/hooks/_token_counter.py +221 -0
  148. package/hooks/branch_manager.py +255 -0
  149. package/hooks/budget_governor.py +326 -0
  150. package/hooks/circuit-breaker.py +270 -0
  151. package/hooks/compression_feedback.py +254 -0
  152. package/hooks/config-guard.py +193 -0
  153. package/hooks/context_pressure.py +119 -0
  154. package/hooks/credential_store.py +970 -0
  155. package/hooks/fetch-rate-limits.py +212 -0
  156. package/hooks/firewall.py +323 -0
  157. package/hooks/hashline-formatter-bridge.py +224 -0
  158. package/hooks/hashline-injector.py +273 -0
  159. package/hooks/hashline-validator.py +216 -0
  160. package/hooks/idle-detector.py +97 -0
  161. package/hooks/instructions-loaded.py +26 -0
  162. package/hooks/intentgate-keyword-detector.py +200 -0
  163. package/hooks/magic-keyword-router.py +195 -0
  164. package/hooks/policy_engine.py +767 -0
  165. package/hooks/post-tool-failure.py +19 -0
  166. package/hooks/post-write.py +233 -0
  167. package/hooks/pre-compact.py +470 -0
  168. package/hooks/pre-tool-inject.py +98 -0
  169. package/hooks/prompt-enhancer.py +879 -0
  170. package/hooks/quality-runner.py +191 -0
  171. package/hooks/query.py +512 -0
  172. package/hooks/secret-guard.py +120 -0
  173. package/hooks/secret_audit.py +144 -0
  174. package/hooks/security_validators.py +93 -0
  175. package/hooks/session-end-capture.py +505 -0
  176. package/hooks/session-start.py +261 -0
  177. package/hooks/setup_wizard.py +1101 -0
  178. package/hooks/shadow_manager.py +476 -0
  179. package/hooks/state_migration.py +228 -0
  180. package/hooks/stop-gate.py +7 -0
  181. package/hooks/stop_dispatcher.py +1259 -0
  182. package/hooks/tdd-gate.py +10 -0
  183. package/hooks/terms-guard.py +98 -0
  184. package/hooks/test-validator.py +462 -0
  185. package/hooks/test_generator_hook.py +123 -0
  186. package/hooks/todo-state-tracker.py +114 -0
  187. package/hooks/tool-ledger.py +165 -0
  188. package/hooks/trust_review.py +662 -0
  189. package/hooks/user-prompt-submit.py +12 -0
  190. package/hud/omg-hud.mjs +1571 -0
  191. package/lab/__init__.py +1 -0
  192. package/lab/__pycache__/__init__.cpython-313.pyc +0 -0
  193. package/lab/__pycache__/axolotl_adapter.cpython-313.pyc +0 -0
  194. package/lab/__pycache__/forge_runner.cpython-313.pyc +0 -0
  195. package/lab/__pycache__/gazebo_adapter.cpython-313.pyc +0 -0
  196. package/lab/__pycache__/isaac_gym_adapter.cpython-313.pyc +0 -0
  197. package/lab/__pycache__/mock_isaac_env.cpython-313.pyc +0 -0
  198. package/lab/__pycache__/pipeline.cpython-313.pyc +0 -0
  199. package/lab/__pycache__/policies.cpython-313.pyc +0 -0
  200. package/lab/__pycache__/pybullet_adapter.cpython-313.pyc +0 -0
  201. package/lab/axolotl_adapter.py +531 -0
  202. package/lab/forge_runner.py +103 -0
  203. package/lab/gazebo_adapter.py +168 -0
  204. package/lab/isaac_gym_adapter.py +190 -0
  205. package/lab/mock_isaac_env.py +47 -0
  206. package/lab/pipeline.py +712 -0
  207. package/lab/policies.py +52 -0
  208. package/lab/pybullet_adapter.py +192 -0
  209. package/package.json +61 -0
  210. package/plugins/README.md +78 -0
  211. package/plugins/__init__.py +1 -0
  212. package/plugins/__pycache__/__init__.cpython-313.pyc +0 -0
  213. package/plugins/advanced/commands/OMG-code-review.md +114 -0
  214. package/plugins/advanced/commands/OMG-deep-plan.md +266 -0
  215. package/plugins/advanced/commands/OMG-handoff.md +115 -0
  216. package/plugins/advanced/commands/OMG-learn.md +110 -0
  217. package/plugins/advanced/commands/OMG-maintainer.md +31 -0
  218. package/plugins/advanced/commands/OMG-ralph-start.md +43 -0
  219. package/plugins/advanced/commands/OMG-ralph-stop.md +23 -0
  220. package/plugins/advanced/commands/OMG-security-review.md +16 -0
  221. package/plugins/advanced/commands/OMG-sequential-thinking.md +20 -0
  222. package/plugins/advanced/commands/OMG-ship.md +46 -0
  223. package/plugins/advanced/commands/OMG:code-review.md +114 -0
  224. package/plugins/advanced/commands/OMG:deep-plan.md +266 -0
  225. package/plugins/advanced/commands/OMG:handoff.md +115 -0
  226. package/plugins/advanced/commands/OMG:learn.md +110 -0
  227. package/plugins/advanced/commands/OMG:maintainer.md +31 -0
  228. package/plugins/advanced/commands/OMG:ralph-start.md +43 -0
  229. package/plugins/advanced/commands/OMG:ralph-stop.md +23 -0
  230. package/plugins/advanced/commands/OMG:security-review.md +16 -0
  231. package/plugins/advanced/commands/OMG:sequential-thinking.md +20 -0
  232. package/plugins/advanced/commands/OMG:ship.md +46 -0
  233. package/plugins/advanced/plugin.json +104 -0
  234. package/plugins/core/plugin.json +204 -0
  235. package/plugins/dephealth/__init__.py +0 -0
  236. package/plugins/dephealth/__pycache__/__init__.cpython-313.pyc +0 -0
  237. package/plugins/dephealth/__pycache__/cve_scanner.cpython-313.pyc +0 -0
  238. package/plugins/dephealth/__pycache__/license_checker.cpython-313.pyc +0 -0
  239. package/plugins/dephealth/__pycache__/manifest_detector.cpython-313.pyc +0 -0
  240. package/plugins/dephealth/__pycache__/vuln_analyzer.cpython-313.pyc +0 -0
  241. package/plugins/dephealth/cve_scanner.py +279 -0
  242. package/plugins/dephealth/license_checker.py +135 -0
  243. package/plugins/dephealth/manifest_detector.py +423 -0
  244. package/plugins/dephealth/vuln_analyzer.py +176 -0
  245. package/plugins/testgen/__init__.py +0 -0
  246. package/plugins/testgen/__pycache__/__init__.cpython-313.pyc +0 -0
  247. package/plugins/testgen/__pycache__/codamosa_engine.cpython-313.pyc +0 -0
  248. package/plugins/testgen/__pycache__/edge_case_synthesizer.cpython-313.pyc +0 -0
  249. package/plugins/testgen/__pycache__/framework_detector.cpython-313.pyc +0 -0
  250. package/plugins/testgen/__pycache__/skeleton_generator.cpython-313.pyc +0 -0
  251. package/plugins/testgen/codamosa_engine.py +402 -0
  252. package/plugins/testgen/edge_case_synthesizer.py +184 -0
  253. package/plugins/testgen/framework_detector.py +271 -0
  254. package/plugins/testgen/skeleton_generator.py +219 -0
  255. package/plugins/viz/__init__.py +0 -0
  256. package/plugins/viz/__pycache__/__init__.cpython-313.pyc +0 -0
  257. package/plugins/viz/__pycache__/ast_parser.cpython-313.pyc +0 -0
  258. package/plugins/viz/__pycache__/diagram_generator.cpython-313.pyc +0 -0
  259. package/plugins/viz/__pycache__/graph_builder.cpython-313.pyc +0 -0
  260. package/plugins/viz/__pycache__/native_parsers.cpython-313.pyc +0 -0
  261. package/plugins/viz/__pycache__/regex_parser.cpython-313.pyc +0 -0
  262. package/plugins/viz/ast_parser.py +139 -0
  263. package/plugins/viz/diagram_generator.py +192 -0
  264. package/plugins/viz/graph_builder.py +444 -0
  265. package/plugins/viz/native_parsers.py +259 -0
  266. package/plugins/viz/regex_parser.py +112 -0
  267. package/pyproject.toml +143 -0
  268. package/registry/__init__.py +1 -0
  269. package/registry/__pycache__/__init__.cpython-313.pyc +0 -0
  270. package/registry/__pycache__/approval_artifact.cpython-313.pyc +0 -0
  271. package/registry/__pycache__/verify_artifact.cpython-313.pyc +0 -0
  272. package/registry/approval_artifact.py +236 -0
  273. package/registry/bundles/algorithms.yaml +45 -0
  274. package/registry/bundles/api-twin.yaml +48 -0
  275. package/registry/bundles/ast-pack.yaml +80 -0
  276. package/registry/bundles/claim-judge.yaml +49 -0
  277. package/registry/bundles/control-plane.yaml +192 -0
  278. package/registry/bundles/data-lineage.yaml +47 -0
  279. package/registry/bundles/delta-classifier.yaml +47 -0
  280. package/registry/bundles/eval-gate.yaml +47 -0
  281. package/registry/bundles/hash-edit.yaml +73 -0
  282. package/registry/bundles/health.yaml +45 -0
  283. package/registry/bundles/hook-governor.yaml +101 -0
  284. package/registry/bundles/incident-replay.yaml +47 -0
  285. package/registry/bundles/lsp-pack.yaml +80 -0
  286. package/registry/bundles/mcp-fabric.yaml +53 -0
  287. package/registry/bundles/plan-council.yaml +56 -0
  288. package/registry/bundles/preflight.yaml +48 -0
  289. package/registry/bundles/proof-gate.yaml +49 -0
  290. package/registry/bundles/remote-supervisor.yaml +49 -0
  291. package/registry/bundles/robotics.yaml +45 -0
  292. package/registry/bundles/secure-worktree-pipeline.yaml +69 -0
  293. package/registry/bundles/security-check.yaml +50 -0
  294. package/registry/bundles/terminal-lane.yaml +61 -0
  295. package/registry/bundles/test-intent-lock.yaml +49 -0
  296. package/registry/bundles/tracebank.yaml +47 -0
  297. package/registry/bundles/vision.yaml +45 -0
  298. package/registry/omg-capability.schema.json +378 -0
  299. package/registry/policy-packs/airgapped.lock.json +11 -0
  300. package/registry/policy-packs/airgapped.signature.json +10 -0
  301. package/registry/policy-packs/airgapped.yaml +16 -0
  302. package/registry/policy-packs/fintech.lock.json +11 -0
  303. package/registry/policy-packs/fintech.signature.json +10 -0
  304. package/registry/policy-packs/fintech.yaml +15 -0
  305. package/registry/policy-packs/locked-prod.lock.json +11 -0
  306. package/registry/policy-packs/locked-prod.signature.json +10 -0
  307. package/registry/policy-packs/locked-prod.yaml +18 -0
  308. package/registry/trusted_signers.json +44 -0
  309. package/registry/verify_artifact.py +493 -0
  310. package/runtime/__init__.py +36 -0
  311. package/runtime/__pycache__/__init__.cpython-313.pyc +0 -0
  312. package/runtime/__pycache__/adoption.cpython-313.pyc +0 -0
  313. package/runtime/__pycache__/agent_selector.cpython-313.pyc +0 -0
  314. package/runtime/__pycache__/api_twin.cpython-313.pyc +0 -0
  315. package/runtime/__pycache__/architecture_signal.cpython-313.pyc +0 -0
  316. package/runtime/__pycache__/artifact_parsers.cpython-313.pyc +0 -0
  317. package/runtime/__pycache__/asset_loader.cpython-313.pyc +0 -0
  318. package/runtime/__pycache__/background_verification.cpython-313.pyc +0 -0
  319. package/runtime/__pycache__/budget_envelopes.cpython-313.pyc +0 -0
  320. package/runtime/__pycache__/business_workflow.cpython-313.pyc +0 -0
  321. package/runtime/__pycache__/canonical_surface.cpython-313.pyc +0 -0
  322. package/runtime/__pycache__/canonical_taxonomy.cpython-313.pyc +0 -0
  323. package/runtime/__pycache__/claim_judge.cpython-313.pyc +0 -0
  324. package/runtime/__pycache__/cli_provider.cpython-313.pyc +0 -0
  325. package/runtime/__pycache__/compat.cpython-313.pyc +0 -0
  326. package/runtime/__pycache__/complexity_scorer.cpython-313.pyc +0 -0
  327. package/runtime/__pycache__/compliance_governor.cpython-313.pyc +0 -0
  328. package/runtime/__pycache__/config_transaction.cpython-313.pyc +0 -0
  329. package/runtime/__pycache__/context_compiler.cpython-313.pyc +0 -0
  330. package/runtime/__pycache__/context_engine.cpython-313.pyc +0 -0
  331. package/runtime/__pycache__/context_limits.cpython-313.pyc +0 -0
  332. package/runtime/__pycache__/contract_compiler.cpython-313.pyc +0 -0
  333. package/runtime/__pycache__/custom_agent_loader.cpython-313.pyc +0 -0
  334. package/runtime/__pycache__/data_lineage.cpython-313.pyc +0 -0
  335. package/runtime/__pycache__/defense_state.cpython-313.pyc +0 -0
  336. package/runtime/__pycache__/delta_classifier.cpython-313.pyc +0 -0
  337. package/runtime/__pycache__/dispatcher.cpython-313.pyc +0 -0
  338. package/runtime/__pycache__/doc_generator.cpython-313.pyc +0 -0
  339. package/runtime/__pycache__/domain_packs.cpython-313.pyc +0 -0
  340. package/runtime/__pycache__/ecosystem.cpython-313.pyc +0 -0
  341. package/runtime/__pycache__/equalizer.cpython-313.pyc +0 -0
  342. package/runtime/__pycache__/eval_gate.cpython-313.pyc +0 -0
  343. package/runtime/__pycache__/evidence_narrator.cpython-313.pyc +0 -0
  344. package/runtime/__pycache__/evidence_query.cpython-313.pyc +0 -0
  345. package/runtime/__pycache__/evidence_registry.cpython-313.pyc +0 -0
  346. package/runtime/__pycache__/evidence_requirements.cpython-313.pyc +0 -0
  347. package/runtime/__pycache__/exec_kernel.cpython-313.pyc +0 -0
  348. package/runtime/__pycache__/explainer_formatter.cpython-313.pyc +0 -0
  349. package/runtime/__pycache__/feature_registry.cpython-313.pyc +0 -0
  350. package/runtime/__pycache__/forge_agents.cpython-313.pyc +0 -0
  351. package/runtime/__pycache__/forge_contracts.cpython-313.pyc +0 -0
  352. package/runtime/__pycache__/forge_domains.cpython-313.pyc +0 -0
  353. package/runtime/__pycache__/forge_run_id.cpython-313.pyc +0 -0
  354. package/runtime/__pycache__/github_integration.cpython-313.pyc +0 -0
  355. package/runtime/__pycache__/github_review_bot.cpython-313.pyc +0 -0
  356. package/runtime/__pycache__/github_review_contract.cpython-313.pyc +0 -0
  357. package/runtime/__pycache__/github_review_formatter.cpython-313.pyc +0 -0
  358. package/runtime/__pycache__/guide_assert.cpython-313.pyc +0 -0
  359. package/runtime/__pycache__/hook_governor.cpython-313.pyc +0 -0
  360. package/runtime/__pycache__/host_parity.cpython-313.pyc +0 -0
  361. package/runtime/__pycache__/incident_replay.cpython-313.pyc +0 -0
  362. package/runtime/__pycache__/install_planner.cpython-313.pyc +0 -0
  363. package/runtime/__pycache__/interaction_journal.cpython-313.pyc +0 -0
  364. package/runtime/__pycache__/issue_surface.cpython-313.pyc +0 -0
  365. package/runtime/__pycache__/legacy_compat.cpython-313.pyc +0 -0
  366. package/runtime/__pycache__/mcp_config_writers.cpython-313.pyc +0 -0
  367. package/runtime/__pycache__/mcp_lifecycle.cpython-313.pyc +0 -0
  368. package/runtime/__pycache__/mcp_memory_server.cpython-313.pyc +0 -0
  369. package/runtime/__pycache__/memory_store.cpython-313.pyc +0 -0
  370. package/runtime/__pycache__/merge_writer.cpython-313.pyc +0 -0
  371. package/runtime/__pycache__/music_omr_testbed.cpython-313.pyc +0 -0
  372. package/runtime/__pycache__/mutation_gate.cpython-313.pyc +0 -0
  373. package/runtime/__pycache__/omc_compat.cpython-313.pyc +0 -0
  374. package/runtime/__pycache__/omg_browser_cli.cpython-313.pyc +0 -0
  375. package/runtime/__pycache__/omg_mcp_server.cpython-313.pyc +0 -0
  376. package/runtime/__pycache__/opus_plan.cpython-313.pyc +0 -0
  377. package/runtime/__pycache__/playwright_adapter.cpython-313.pyc +0 -0
  378. package/runtime/__pycache__/playwright_pack.cpython-313.pyc +0 -0
  379. package/runtime/__pycache__/plugin_diagnostics.cpython-313.pyc +0 -0
  380. package/runtime/__pycache__/plugin_interop.cpython-313.pyc +0 -0
  381. package/runtime/__pycache__/policy_pack_loader.cpython-313.pyc +0 -0
  382. package/runtime/__pycache__/preflight.cpython-313.pyc +0 -0
  383. package/runtime/__pycache__/profile_io.cpython-313.pyc +0 -0
  384. package/runtime/__pycache__/prompt_compiler.cpython-313.pyc +0 -0
  385. package/runtime/__pycache__/proof_chain.cpython-313.pyc +0 -0
  386. package/runtime/__pycache__/proof_gate.cpython-313.pyc +0 -0
  387. package/runtime/__pycache__/provider_parity_eval.cpython-313.pyc +0 -0
  388. package/runtime/__pycache__/release_artifact_audit.cpython-313.pyc +0 -0
  389. package/runtime/__pycache__/release_run_coordinator.cpython-313.pyc +0 -0
  390. package/runtime/__pycache__/release_surface_compiler.cpython-313.pyc +0 -0
  391. package/runtime/__pycache__/release_surface_registry.cpython-313.pyc +0 -0
  392. package/runtime/__pycache__/release_surfaces.cpython-313.pyc +0 -0
  393. package/runtime/__pycache__/remote_supervisor.cpython-313.pyc +0 -0
  394. package/runtime/__pycache__/repro_pack.cpython-313.pyc +0 -0
  395. package/runtime/__pycache__/rollback_manifest.cpython-313.pyc +0 -0
  396. package/runtime/__pycache__/router_critics.cpython-313.pyc +0 -0
  397. package/runtime/__pycache__/router_executor.cpython-313.pyc +0 -0
  398. package/runtime/__pycache__/router_selector.cpython-313.pyc +0 -0
  399. package/runtime/__pycache__/runtime_contracts.cpython-313.pyc +0 -0
  400. package/runtime/__pycache__/runtime_profile.cpython-313.pyc +0 -0
  401. package/runtime/__pycache__/security_check.cpython-313.pyc +0 -0
  402. package/runtime/__pycache__/session_health.cpython-313.pyc +0 -0
  403. package/runtime/__pycache__/skill_evolution.cpython-313.pyc +0 -0
  404. package/runtime/__pycache__/skill_registry.cpython-313.pyc +0 -0
  405. package/runtime/__pycache__/subagent_dispatcher.cpython-313.pyc +0 -0
  406. package/runtime/__pycache__/subscription_tiers.cpython-313.pyc +0 -0
  407. package/runtime/__pycache__/team_router.cpython-313.pyc +0 -0
  408. package/runtime/__pycache__/test_intent_lock.cpython-313-pytest-9.0.2.pyc +0 -0
  409. package/runtime/__pycache__/test_intent_lock.cpython-313.pyc +0 -0
  410. package/runtime/__pycache__/tmux_session_manager.cpython-313.pyc +0 -0
  411. package/runtime/__pycache__/tool_fabric.cpython-313.pyc +0 -0
  412. package/runtime/__pycache__/tool_plan_gate.cpython-313.pyc +0 -0
  413. package/runtime/__pycache__/tool_relevance.cpython-313.pyc +0 -0
  414. package/runtime/__pycache__/tracebank.cpython-313.pyc +0 -0
  415. package/runtime/__pycache__/untrusted_content.cpython-313.pyc +0 -0
  416. package/runtime/__pycache__/validate.cpython-313.pyc +0 -0
  417. package/runtime/__pycache__/verdict_schema.cpython-313.pyc +0 -0
  418. package/runtime/__pycache__/verification_controller.cpython-313.pyc +0 -0
  419. package/runtime/__pycache__/verification_loop.cpython-313.pyc +0 -0
  420. package/runtime/__pycache__/vision_artifacts.cpython-313.pyc +0 -0
  421. package/runtime/__pycache__/vision_cache.cpython-313.pyc +0 -0
  422. package/runtime/__pycache__/vision_jobs.cpython-313.pyc +0 -0
  423. package/runtime/__pycache__/worker_watchdog.cpython-313.pyc +0 -0
  424. package/runtime/adapters/__init__.py +13 -0
  425. package/runtime/adapters/__pycache__/__init__.cpython-313.pyc +0 -0
  426. package/runtime/adapters/__pycache__/claude.cpython-313.pyc +0 -0
  427. package/runtime/adapters/__pycache__/gpt.cpython-313.pyc +0 -0
  428. package/runtime/adapters/__pycache__/local.cpython-313.pyc +0 -0
  429. package/runtime/adapters/claude.py +63 -0
  430. package/runtime/adapters/gpt.py +56 -0
  431. package/runtime/adapters/local.py +56 -0
  432. package/runtime/adoption.py +280 -0
  433. package/runtime/api_twin.py +450 -0
  434. package/runtime/architecture_signal.py +226 -0
  435. package/runtime/artifact_parsers.py +161 -0
  436. package/runtime/asset_loader.py +62 -0
  437. package/runtime/background_verification.py +178 -0
  438. package/runtime/budget_envelopes.py +398 -0
  439. package/runtime/business_workflow.py +234 -0
  440. package/runtime/canonical_surface.py +53 -0
  441. package/runtime/canonical_taxonomy.py +27 -0
  442. package/runtime/claim_judge.py +648 -0
  443. package/runtime/cli_provider.py +105 -0
  444. package/runtime/compat.py +2222 -0
  445. package/runtime/complexity_scorer.py +148 -0
  446. package/runtime/compliance_governor.py +505 -0
  447. package/runtime/config_transaction.py +304 -0
  448. package/runtime/context_compiler.py +131 -0
  449. package/runtime/context_engine.py +708 -0
  450. package/runtime/context_limits.py +363 -0
  451. package/runtime/contract_compiler.py +3664 -0
  452. package/runtime/custom_agent_loader.py +366 -0
  453. package/runtime/data_lineage.py +244 -0
  454. package/runtime/defense_state.py +261 -0
  455. package/runtime/delta_classifier.py +231 -0
  456. package/runtime/dispatcher.py +47 -0
  457. package/runtime/doc_generator.py +319 -0
  458. package/runtime/domain_packs.py +75 -0
  459. package/runtime/ecosystem.py +371 -0
  460. package/runtime/equalizer.py +268 -0
  461. package/runtime/eval_gate.py +96 -0
  462. package/runtime/evidence_narrator.py +147 -0
  463. package/runtime/evidence_query.py +303 -0
  464. package/runtime/evidence_registry.py +16 -0
  465. package/runtime/evidence_requirements.py +157 -0
  466. package/runtime/exec_kernel.py +267 -0
  467. package/runtime/explainer_formatter.py +82 -0
  468. package/runtime/feature_registry.py +109 -0
  469. package/runtime/forge_agents.py +915 -0
  470. package/runtime/forge_contracts.py +519 -0
  471. package/runtime/forge_domains.py +68 -0
  472. package/runtime/forge_run_id.py +86 -0
  473. package/runtime/guide_assert.py +135 -0
  474. package/runtime/hook_governor.py +156 -0
  475. package/runtime/host_parity.py +373 -0
  476. package/runtime/incident_replay.py +310 -0
  477. package/runtime/install_planner.py +617 -0
  478. package/runtime/interaction_journal.py +566 -0
  479. package/runtime/issue_surface.py +472 -0
  480. package/runtime/legacy_compat.py +7 -0
  481. package/runtime/mcp_config_writers.py +360 -0
  482. package/runtime/mcp_lifecycle.py +175 -0
  483. package/runtime/mcp_memory_server.py +220 -0
  484. package/runtime/memory_parsers/__init__.py +0 -0
  485. package/runtime/memory_parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  486. package/runtime/memory_parsers/__pycache__/chatgpt_parser.cpython-313.pyc +0 -0
  487. package/runtime/memory_parsers/__pycache__/claude_import.cpython-313.pyc +0 -0
  488. package/runtime/memory_parsers/__pycache__/export.cpython-313.pyc +0 -0
  489. package/runtime/memory_parsers/__pycache__/gemini_import.cpython-313.pyc +0 -0
  490. package/runtime/memory_parsers/__pycache__/kimi_import.cpython-313.pyc +0 -0
  491. package/runtime/memory_parsers/chatgpt_parser.py +257 -0
  492. package/runtime/memory_parsers/claude_import.py +107 -0
  493. package/runtime/memory_parsers/export.py +97 -0
  494. package/runtime/memory_parsers/gemini_import.py +91 -0
  495. package/runtime/memory_parsers/kimi_import.py +91 -0
  496. package/runtime/memory_store.py +1182 -0
  497. package/runtime/merge_writer.py +445 -0
  498. package/runtime/music_omr_testbed.py +336 -0
  499. package/runtime/mutation_gate.py +320 -0
  500. package/runtime/omc_compat.py +7 -0
  501. package/runtime/omg_browser_cli.py +95 -0
  502. package/runtime/omg_compat_contract_snapshot.json +936 -0
  503. package/runtime/omg_contract_snapshot.json +936 -0
  504. package/runtime/omg_mcp_server.py +306 -0
  505. package/runtime/playwright_adapter.py +39 -0
  506. package/runtime/playwright_pack.py +253 -0
  507. package/runtime/plugin_diagnostics.py +308 -0
  508. package/runtime/plugin_interop.py +1060 -0
  509. package/runtime/policy_pack_loader.py +147 -0
  510. package/runtime/preflight.py +135 -0
  511. package/runtime/profile_io.py +328 -0
  512. package/runtime/proof_chain.py +472 -0
  513. package/runtime/proof_gate.py +442 -0
  514. package/runtime/provider_parity_eval.py +109 -0
  515. package/runtime/providers/__init__.py +0 -0
  516. package/runtime/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  517. package/runtime/providers/__pycache__/codex_provider.cpython-313.pyc +0 -0
  518. package/runtime/providers/__pycache__/gemini_provider.cpython-313.pyc +0 -0
  519. package/runtime/providers/__pycache__/kimi_provider.cpython-313.pyc +0 -0
  520. package/runtime/providers/__pycache__/opencode_provider.cpython-313.pyc +0 -0
  521. package/runtime/providers/codex_provider.py +129 -0
  522. package/runtime/providers/gemini_provider.py +143 -0
  523. package/runtime/providers/kimi_provider.py +167 -0
  524. package/runtime/providers/opencode_provider.py +99 -0
  525. package/runtime/release_artifact_audit.py +556 -0
  526. package/runtime/release_run_coordinator.py +574 -0
  527. package/runtime/release_surface_compiler.py +643 -0
  528. package/runtime/release_surface_registry.py +283 -0
  529. package/runtime/release_surfaces.py +320 -0
  530. package/runtime/remote_supervisor.py +79 -0
  531. package/runtime/repro_pack.py +398 -0
  532. package/runtime/rollback_manifest.py +143 -0
  533. package/runtime/router_critics.py +229 -0
  534. package/runtime/router_executor.py +142 -0
  535. package/runtime/router_selector.py +99 -0
  536. package/runtime/runtime_contracts.py +292 -0
  537. package/runtime/runtime_profile.py +133 -0
  538. package/runtime/security_check.py +1094 -0
  539. package/runtime/session_health.py +546 -0
  540. package/runtime/skill_evolution.py +221 -0
  541. package/runtime/skill_registry.py +53 -0
  542. package/runtime/subagent_dispatcher.py +604 -0
  543. package/runtime/subscription_tiers.py +258 -0
  544. package/runtime/team_router.py +1399 -0
  545. package/runtime/test_intent_lock.py +543 -0
  546. package/runtime/tmux_session_manager.py +172 -0
  547. package/runtime/tool_fabric.py +570 -0
  548. package/runtime/tool_plan_gate.py +460 -0
  549. package/runtime/tracebank.py +125 -0
  550. package/runtime/untrusted_content.py +360 -0
  551. package/runtime/validate.py +293 -0
  552. package/runtime/verdict_schema.py +198 -0
  553. package/runtime/verification_controller.py +235 -0
  554. package/runtime/verification_loop.py +73 -0
  555. package/runtime/vision_artifacts.py +31 -0
  556. package/runtime/vision_cache.py +38 -0
  557. package/runtime/vision_jobs.py +92 -0
  558. package/runtime/worker_watchdog.py +526 -0
  559. package/scripts/__pycache__/audit-published-artifact.cpython-313.pyc +0 -0
  560. package/scripts/__pycache__/check-doc-parity.cpython-313.pyc +0 -0
  561. package/scripts/__pycache__/check-omg-standalone-clean.cpython-313.pyc +0 -0
  562. package/scripts/__pycache__/github_review_helpers.cpython-313.pyc +0 -0
  563. package/scripts/__pycache__/omg.cpython-313.pyc +0 -0
  564. package/scripts/__pycache__/prepare-release-proof-fixtures.cpython-313.pyc +0 -0
  565. package/scripts/__pycache__/sync-release-identity.cpython-313.pyc +0 -0
  566. package/scripts/__pycache__/validate-release-identity.cpython-313.pyc +0 -0
  567. package/scripts/audit-published-artifact.py +59 -0
  568. package/scripts/check-omg-compat-contract-snapshot.py +137 -0
  569. package/scripts/check-omg-contract-snapshot.py +12 -0
  570. package/scripts/check-omg-public-ready.py +273 -0
  571. package/scripts/check-omg-standalone-clean.py +133 -0
  572. package/scripts/emit_host_parity.py +72 -0
  573. package/scripts/legacy_to_omg_migrate.py +29 -0
  574. package/scripts/migrate-legacy.py +464 -0
  575. package/scripts/omc_to_omg_migrate.py +12 -0
  576. package/scripts/omg.py +2962 -0
  577. package/scripts/pre-release-check.sh +38 -0
  578. package/scripts/prepare-release-proof-fixtures.py +602 -0
  579. package/scripts/print-canonical-version.py +80 -0
  580. package/scripts/settings-merge.py +289 -0
  581. package/scripts/sync-release-identity.py +481 -0
  582. package/scripts/validate-release-identity.py +632 -0
  583. package/scripts/verify-no-omc.sh +5 -0
  584. package/scripts/verify-standalone.sh +35 -0
  585. package/settings.json +751 -0
  586. package/tools/__init__.py +2 -0
  587. package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  588. package/tools/__pycache__/browser_consent.cpython-313.pyc +0 -0
  589. package/tools/__pycache__/browser_stealth.cpython-313.pyc +0 -0
  590. package/tools/__pycache__/browser_tool.cpython-313.pyc +0 -0
  591. package/tools/__pycache__/changelog_generator.cpython-313.pyc +0 -0
  592. package/tools/__pycache__/commit_splitter.cpython-313.pyc +0 -0
  593. package/tools/__pycache__/config_discovery.cpython-313.pyc +0 -0
  594. package/tools/__pycache__/config_merger.cpython-313.pyc +0 -0
  595. package/tools/__pycache__/dashboard_generator.cpython-313.pyc +0 -0
  596. package/tools/__pycache__/git_inspector.cpython-313.pyc +0 -0
  597. package/tools/__pycache__/lsp_client.cpython-313.pyc +0 -0
  598. package/tools/__pycache__/lsp_operations.cpython-313.pyc +0 -0
  599. package/tools/__pycache__/pr_generator.cpython-313.pyc +0 -0
  600. package/tools/__pycache__/python_repl.cpython-313.pyc +0 -0
  601. package/tools/__pycache__/python_sandbox.cpython-313.pyc +0 -0
  602. package/tools/__pycache__/session_snapshot.cpython-313.pyc +0 -0
  603. package/tools/__pycache__/ssh_manager.cpython-313.pyc +0 -0
  604. package/tools/__pycache__/theme_engine.cpython-313.pyc +0 -0
  605. package/tools/__pycache__/theme_selector.cpython-313.pyc +0 -0
  606. package/tools/__pycache__/web_search.cpython-313.pyc +0 -0
  607. package/tools/browser_consent.py +289 -0
  608. package/tools/browser_stealth.py +481 -0
  609. package/tools/browser_tool.py +448 -0
  610. package/tools/changelog_generator.py +347 -0
  611. package/tools/commit_splitter.py +749 -0
  612. package/tools/config_discovery.py +151 -0
  613. package/tools/config_merger.py +449 -0
  614. package/tools/dashboard_generator.py +300 -0
  615. package/tools/git_inspector.py +298 -0
  616. package/tools/lsp_client.py +275 -0
  617. package/tools/lsp_discovery.py +231 -0
  618. package/tools/lsp_operations.py +392 -0
  619. package/tools/pr_generator.py +404 -0
  620. package/tools/python_repl.py +712 -0
  621. package/tools/python_sandbox.py +768 -0
  622. package/tools/search_providers/__init__.py +77 -0
  623. package/tools/search_providers/__pycache__/__init__.cpython-313.pyc +0 -0
  624. package/tools/search_providers/__pycache__/brave.cpython-313.pyc +0 -0
  625. package/tools/search_providers/__pycache__/exa.cpython-313.pyc +0 -0
  626. package/tools/search_providers/__pycache__/jina.cpython-313.pyc +0 -0
  627. package/tools/search_providers/__pycache__/perplexity.cpython-313.pyc +0 -0
  628. package/tools/search_providers/__pycache__/synthetic.cpython-313.pyc +0 -0
  629. package/tools/search_providers/brave.py +115 -0
  630. package/tools/search_providers/exa.py +116 -0
  631. package/tools/search_providers/jina.py +104 -0
  632. package/tools/search_providers/perplexity.py +139 -0
  633. package/tools/search_providers/synthetic.py +74 -0
  634. package/tools/session_snapshot.py +851 -0
  635. package/tools/ssh_manager.py +912 -0
  636. package/tools/theme_engine.py +296 -0
  637. package/tools/theme_selector.py +137 -0
  638. package/tools/web_search.py +675 -0
@@ -0,0 +1,632 @@
1
+ #!/usr/bin/env python3
2
+ """Read-only release identity validator.
3
+
4
+ Usage:
5
+ python3 scripts/validate-release-identity.py --scope all --forbid-version <forbid-version>
6
+ python3 scripts/validate-release-identity.py --scope authored
7
+ python3 scripts/validate-release-identity.py --scope derived
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import ast
13
+ import json
14
+ import re
15
+ import sys
16
+ from pathlib import Path
17
+ from typing import Any
18
+
19
+ _REPO_ROOT = Path(__file__).resolve().parent.parent
20
+ if str(_REPO_ROOT) not in sys.path:
21
+ sys.path.insert(0, str(_REPO_ROOT))
22
+
23
+ from runtime.release_surfaces import AUTHORED_SURFACES, SCOPED_RESIDUE_TARGETS
24
+ from registry.verify_artifact import verify_artifact_statement
25
+ from runtime.release_surface_compiler import compile_release_surfaces
26
+ from runtime.doc_generator import check_docs
27
+
28
+ import importlib.util
29
+
30
+ _SYNC_SCRIPT = _REPO_ROOT / "scripts" / "sync-release-identity.py"
31
+ if not _SYNC_SCRIPT.exists() or not _SYNC_SCRIPT.resolve().is_relative_to(_REPO_ROOT):
32
+ raise FileNotFoundError(f"sync-release-identity.py not found at {_SYNC_SCRIPT}")
33
+ _sync_spec = importlib.util.spec_from_file_location("sync_release_identity", _SYNC_SCRIPT)
34
+ assert _sync_spec is not None and _sync_spec.loader is not None
35
+ _sync_mod = importlib.util.module_from_spec(_sync_spec)
36
+ _sync_spec.loader.exec_module(_sync_mod)
37
+
38
+ check_surface = _sync_mod.check_surface
39
+ extract_canonical_version = _sync_mod.extract_canonical_version
40
+
41
+
42
+ _DERIVED_JSON_SURFACES: list[tuple[str, list[str]]] = [
43
+ ("dist/public/manifest.json", ["contract_version"]),
44
+ ("dist/enterprise/manifest.json", ["contract_version"]),
45
+ ("artifacts/release/dist/public/manifest.json", ["contract_version"]),
46
+ ("artifacts/release/dist/enterprise/manifest.json", ["contract_version"]),
47
+ ]
48
+
49
+ _DERIVED_AST_SURFACE = "build/lib/runtime/adoption.py"
50
+ _PROMOTION_MANIFEST_SURFACES = {
51
+ "artifacts/release/dist/public/manifest.json",
52
+ "artifacts/release/dist/enterprise/manifest.json",
53
+ }
54
+
55
+ _CHANGELOG_HISTORICAL_RE = re.compile(r"^## \[?\d+\.\d+\.\d+\]?")
56
+ _VERSION_HEADER_RE = re.compile(r"^##\s+\[?(\d+\.\d+\.\d+)\]?\b")
57
+
58
+ _REQUIRED_GENERATED_MARKERS: dict[str, tuple[str, ...]] = {
59
+ "README.md": (
60
+ "install-intro",
61
+ "why-omg",
62
+ ),
63
+ "CHANGELOG.md": (),
64
+ "docs/proof.md": ("proof-quickstart",),
65
+ "QUICK-REFERENCE.md": ("quick-reference-hosts",),
66
+ "INSTALL-VERIFICATION-INDEX.md": ("verification-index-targets",),
67
+ }
68
+
69
+ _EXPECTED_EXPLAIN_COMMANDS: dict[str, str] = {
70
+ "docs/proof.md": "npx omg explain run --run-id <id>",
71
+ "QUICK-REFERENCE.md": "npx omg explain run --run-id <id>",
72
+ }
73
+
74
+ _POSITIONAL_EXPLAIN_COMMAND = "omg explain run <id>"
75
+
76
+ _INSTALL_GUIDES = (
77
+ "docs/install/claude-code.md",
78
+ "docs/install/codex.md",
79
+ "docs/install/gemini.md",
80
+ "docs/install/kimi.md",
81
+ "docs/install/opencode.md",
82
+ )
83
+
84
+ _BAD_LOCAL_INSTALL = "npm install @trac3r/oh-my-god"
85
+
86
+ _NPX_FRONT_DOOR_TARGETS: dict[str, tuple[str, ...]] = {
87
+ "README.md": (
88
+ "npx omg env doctor",
89
+ "npx omg install --plan",
90
+ "npx omg install --apply",
91
+ "npx omg ship",
92
+ ),
93
+ "docs/install/claude-code.md": (
94
+ "npx omg env doctor",
95
+ "npx omg install --plan",
96
+ "npx omg install --apply",
97
+ ),
98
+ "docs/install/codex.md": (
99
+ "npx omg env doctor",
100
+ "npx omg install --plan",
101
+ "npx omg install --apply",
102
+ ),
103
+ "docs/install/opencode.md": (
104
+ "npx omg env doctor",
105
+ "npx omg install --plan",
106
+ "npx omg install --apply",
107
+ ),
108
+ }
109
+
110
+
111
+ def validate_authored(repo_root: Path, canonical: str) -> dict[str, Any]:
112
+ blockers: list[dict[str, str]] = []
113
+ for surface in AUTHORED_SURFACES:
114
+ drifts = check_surface(repo_root, surface, canonical)
115
+ for label, found in drifts:
116
+ blockers.append({
117
+ "surface": label,
118
+ "found": found if found is not None else "<not found>",
119
+ "expected": canonical,
120
+ })
121
+ status = "fail" if blockers else "ok"
122
+ return {"status": status, "blockers": blockers}
123
+
124
+
125
+ def validate_derived(repo_root: Path, canonical: str) -> dict[str, Any]:
126
+ blockers: list[dict[str, str]] = []
127
+
128
+ for rel_path, key_path in _DERIVED_JSON_SURFACES:
129
+ full_path = repo_root / rel_path
130
+ if not full_path.exists():
131
+ continue
132
+ try:
133
+ data = json.loads(full_path.read_text(encoding="utf-8"))
134
+ except (OSError, json.JSONDecodeError):
135
+ continue
136
+ current: Any = data
137
+ for key in key_path:
138
+ if isinstance(current, dict):
139
+ current = current.get(key)
140
+ else:
141
+ current = None
142
+ break
143
+ if current is not None and current != canonical:
144
+ blockers.append({
145
+ "surface": rel_path,
146
+ "found": str(current),
147
+ "expected": canonical,
148
+ })
149
+
150
+ if rel_path in _PROMOTION_MANIFEST_SURFACES:
151
+ blockers.extend(_validate_promotion_manifest_attestations(rel_path=rel_path, payload=data))
152
+
153
+ ast_path = repo_root / _DERIVED_AST_SURFACE
154
+ if ast_path.exists():
155
+ try:
156
+ tree = ast.parse(ast_path.read_text(encoding="utf-8"))
157
+ for node in ast.walk(tree):
158
+ if isinstance(node, ast.Assign):
159
+ for target in node.targets:
160
+ if isinstance(target, ast.Name) and target.id == "CANONICAL_VERSION":
161
+ if isinstance(node.value, ast.Constant) and isinstance(node.value.value, str):
162
+ if node.value.value != canonical:
163
+ blockers.append({
164
+ "surface": _DERIVED_AST_SURFACE,
165
+ "found": node.value.value,
166
+ "expected": canonical,
167
+ })
168
+ except (OSError, SyntaxError):
169
+ pass
170
+
171
+ status = "fail" if blockers else "ok"
172
+ return {"status": status, "blockers": blockers}
173
+
174
+
175
+ _KNOWN_ATTESTATION_ALGORITHMS = {"ed25519-minisign"}
176
+
177
+
178
+ def _collect_attestations(payload: dict[str, Any]) -> dict[str, dict[str, Any]]:
179
+ rows = payload.get("attestations")
180
+ if not isinstance(rows, list):
181
+ return {}
182
+ indexed: dict[str, dict[str, Any]] = {}
183
+ for row in rows:
184
+ if not isinstance(row, dict):
185
+ continue
186
+ artifact_path = str(row.get("artifact_path", "")).strip()
187
+ if not artifact_path:
188
+ continue
189
+ # New detached shape: statement_path + signature_path + signer_key_id + algorithm
190
+ if row.get("statement_path") is not None or row.get("signature_path") is not None:
191
+ indexed[artifact_path] = row
192
+ continue
193
+ # Inline shape: statement dict + signer_pubkey string
194
+ statement = row.get("statement")
195
+ signer_pubkey = row.get("signer_pubkey")
196
+ if isinstance(statement, dict) and isinstance(signer_pubkey, str):
197
+ indexed[artifact_path] = row
198
+ return indexed
199
+
200
+
201
+ def _validate_promotion_manifest_attestations(*, rel_path: str, payload: dict[str, Any]) -> list[dict[str, str]]:
202
+ blockers: list[dict[str, str]] = []
203
+ artifacts = payload.get("artifacts")
204
+ if not isinstance(artifacts, list):
205
+ return blockers
206
+
207
+ attestations = _collect_attestations(payload)
208
+ if not attestations and artifacts:
209
+ blockers.append({
210
+ "surface": f"{rel_path}#missing_attestation",
211
+ "found": "absent",
212
+ "expected": "signed attestation records for promotion artifacts",
213
+ })
214
+ return blockers
215
+
216
+ for artifact in artifacts:
217
+ if not isinstance(artifact, dict):
218
+ continue
219
+ artifact_path = str(artifact.get("path", "")).strip()
220
+ digest = str(artifact.get("sha256", "")).strip().lower()
221
+ if not artifact_path or not digest:
222
+ continue
223
+
224
+ record = attestations.get(artifact_path)
225
+ if record is None:
226
+ blockers.append({
227
+ "surface": f"{rel_path}#missing_attestation:{artifact_path}",
228
+ "found": "absent",
229
+ "expected": "signed attestation",
230
+ })
231
+ continue
232
+
233
+ if record.get("statement_path") is not None or record.get("signature_path") is not None:
234
+ statement_path = record.get("statement_path")
235
+ if not isinstance(statement_path, str) or not statement_path.strip():
236
+ blockers.append({
237
+ "surface": f"{rel_path}#missing_statement_path:{artifact_path}",
238
+ "found": "absent",
239
+ "expected": "non-empty statement_path",
240
+ })
241
+ continue
242
+ signature_path = record.get("signature_path")
243
+ if not isinstance(signature_path, str) or not signature_path.strip():
244
+ blockers.append({
245
+ "surface": f"{rel_path}#missing_signature_path:{artifact_path}",
246
+ "found": "absent",
247
+ "expected": "non-empty signature_path",
248
+ })
249
+ continue
250
+ algorithm = str(record.get("algorithm", "")).strip()
251
+ if algorithm not in _KNOWN_ATTESTATION_ALGORITHMS:
252
+ blockers.append({
253
+ "surface": f"{rel_path}#unknown_algorithm:{artifact_path}",
254
+ "found": algorithm or "<missing>",
255
+ "expected": "known attestation algorithm",
256
+ })
257
+ continue
258
+ signer_key_id = str(record.get("signer_key_id", "")).strip()
259
+ if not signer_key_id:
260
+ blockers.append({
261
+ "surface": f"{rel_path}#missing_signer_key_id:{artifact_path}",
262
+ "found": "absent",
263
+ "expected": "non-empty signer_key_id",
264
+ })
265
+ continue
266
+
267
+ statement = record.get("statement")
268
+ signer_pubkey = record.get("signer_pubkey")
269
+ if not isinstance(statement, dict) or not isinstance(signer_pubkey, str):
270
+ blockers.append({
271
+ "surface": f"{rel_path}#invalid_attestation:{artifact_path}",
272
+ "found": "malformed",
273
+ "expected": "valid detached or inline attestation",
274
+ })
275
+ continue
276
+
277
+ subject = statement.get("subject")
278
+ subject_digest = ""
279
+ if isinstance(subject, list) and subject and isinstance(subject[0], dict):
280
+ digest_map = subject[0].get("digest")
281
+ if isinstance(digest_map, dict):
282
+ value = digest_map.get("sha256")
283
+ if isinstance(value, str):
284
+ subject_digest = value.lower()
285
+ if subject_digest != digest:
286
+ blockers.append({
287
+ "surface": f"{rel_path}#subject_digest_mismatch:{artifact_path}",
288
+ "found": subject_digest or "<missing>",
289
+ "expected": digest,
290
+ })
291
+ continue
292
+
293
+ if not verify_artifact_statement(statement, signer_pubkey=signer_pubkey):
294
+ blockers.append({
295
+ "surface": f"{rel_path}#invalid_signature:{artifact_path}",
296
+ "found": "verification_failed",
297
+ "expected": "valid_detached_signature",
298
+ })
299
+
300
+ return blockers
301
+
302
+
303
+ def _is_changelog_historical(line: str, forbid_version: str) -> bool:
304
+ return (
305
+ _CHANGELOG_HISTORICAL_RE.match(line.strip()) is not None
306
+ and forbid_version in line
307
+ )
308
+
309
+
310
+ def _scan_file_for_residue(
311
+ file_path: Path, rel_path: str, forbid_version: str,
312
+ ) -> list[dict[str, Any]]:
313
+ blockers: list[dict[str, Any]] = []
314
+ try:
315
+ lines = file_path.read_text(encoding="utf-8").splitlines()
316
+ except (OSError, UnicodeDecodeError):
317
+ return blockers
318
+
319
+ for line_num, line in enumerate(lines, start=1):
320
+ if forbid_version not in line:
321
+ continue
322
+ if file_path.name == "CHANGELOG.md" and _is_changelog_historical(line, forbid_version):
323
+ continue
324
+ blockers.append({
325
+ "file": rel_path,
326
+ "line": line_num,
327
+ "content": line.strip(),
328
+ })
329
+ return blockers
330
+
331
+
332
+ def scan_scoped_residue(repo_root: Path, forbid_version: str) -> dict[str, Any]:
333
+ blockers: list[dict[str, Any]] = []
334
+
335
+ for target in SCOPED_RESIDUE_TARGETS:
336
+ full_path = repo_root / target
337
+ if not full_path.exists():
338
+ continue
339
+
340
+ if full_path.is_file():
341
+ blockers.extend(_scan_file_for_residue(full_path, target, forbid_version))
342
+ elif full_path.is_dir():
343
+ for child in sorted(full_path.rglob("*")):
344
+ if child.is_file():
345
+ rel = str(child.relative_to(repo_root))
346
+ blockers.extend(_scan_file_for_residue(child, rel, forbid_version))
347
+
348
+ status = "fail" if blockers else "ok"
349
+ return {"status": status, "forbid_version": forbid_version, "blockers": blockers}
350
+
351
+
352
+ def _latest_changelog_version(repo_root: Path) -> str:
353
+ changelog = repo_root / "CHANGELOG.md"
354
+ if not changelog.exists():
355
+ return ""
356
+ for raw_line in changelog.read_text(encoding="utf-8").splitlines():
357
+ match = _VERSION_HEADER_RE.match(raw_line.strip())
358
+ if match:
359
+ return match.group(1)
360
+ return ""
361
+
362
+
363
+ def _find_explain_command_blockers(repo_root: Path) -> list[str]:
364
+ blockers: list[str] = []
365
+ for rel_path, expected in _EXPECTED_EXPLAIN_COMMANDS.items():
366
+ path = repo_root / rel_path
367
+ if not path.exists():
368
+ continue
369
+ content = path.read_text(encoding="utf-8")
370
+ if _POSITIONAL_EXPLAIN_COMMAND in content:
371
+ blockers.append(f"explain_command:{rel_path}:uses positional explain syntax")
372
+ if expected not in content:
373
+ blockers.append(f"explain_command:{rel_path}:missing expected syntax")
374
+ return blockers
375
+
376
+
377
+ def _find_install_launcher_blockers(repo_root: Path) -> list[str]:
378
+ blockers: list[str] = []
379
+ for rel_path in _INSTALL_GUIDES:
380
+ path = repo_root / rel_path
381
+ if not path.exists():
382
+ continue
383
+ content = path.read_text(encoding="utf-8")
384
+ if _BAD_LOCAL_INSTALL in content:
385
+ blockers.append(f"install_launcher:{rel_path}:uses local npm install")
386
+ return blockers
387
+
388
+
389
+ def _find_npx_front_door_blockers(repo_root: Path) -> list[str]:
390
+ blockers: list[str] = []
391
+ bare_commands = (
392
+ "omg env doctor",
393
+ "omg install --plan",
394
+ "omg install --apply",
395
+ "omg ship",
396
+ )
397
+ for rel_path, required_commands in _NPX_FRONT_DOOR_TARGETS.items():
398
+ path = repo_root / rel_path
399
+ if not path.exists():
400
+ continue
401
+ content = path.read_text(encoding="utf-8")
402
+ for command in required_commands:
403
+ if command not in content:
404
+ blockers.append(f"npx_front_door:{rel_path}:missing '{command}'")
405
+ for command in bare_commands:
406
+ if re.search(rf"(?m)^{re.escape(command)}$", content):
407
+ blockers.append(f"npx_front_door:{rel_path}:uses bare '{command}'")
408
+ return blockers
409
+
410
+
411
+ def validate_release_surface(repo_root: Path, canonical: str) -> dict[str, Any]:
412
+ blockers: list[str] = []
413
+ checks: dict[str, Any] = {}
414
+
415
+ release_surface_result = compile_release_surfaces(repo_root, check_only=True)
416
+ checks["release_surface_drift"] = release_surface_result
417
+ for item in release_surface_result.get("drift", []):
418
+ if isinstance(item, dict):
419
+ surface = str(item.get("surface", "unknown"))
420
+ reason = str(item.get("reason", "drift"))
421
+ blockers.append(f"release_surface_drift:{surface}:{reason}")
422
+ else:
423
+ blockers.append(f"release_surface_drift:{item}")
424
+
425
+ docs_result = check_docs(repo_root)
426
+ checks["docs_drift"] = docs_result
427
+ for item in docs_result.get("drift", []):
428
+ blockers.append(f"docs_drift:{item}")
429
+
430
+ explain_blockers = _find_explain_command_blockers(repo_root)
431
+ checks["explain_commands"] = explain_blockers
432
+ blockers.extend(explain_blockers)
433
+
434
+ install_launcher_blockers = _find_install_launcher_blockers(repo_root)
435
+ checks["install_launchers"] = install_launcher_blockers
436
+ blockers.extend(install_launcher_blockers)
437
+
438
+ npx_front_door_blockers = _find_npx_front_door_blockers(repo_root)
439
+ checks["npx_front_door"] = npx_front_door_blockers
440
+ blockers.extend(npx_front_door_blockers)
441
+
442
+ latest_version = _latest_changelog_version(repo_root)
443
+ checks["latest_changelog_version"] = latest_version
444
+ if latest_version != canonical:
445
+ blockers.append(
446
+ f"latest_changelog_version:{latest_version or '<missing>'}:expected:{canonical}"
447
+ )
448
+
449
+ readme_path = repo_root / "README.md"
450
+ if not readme_path.exists():
451
+ blockers.append("front_door:README.md not found")
452
+ return {"status": "fail", "blockers": blockers, "checks": checks}
453
+ readme = readme_path.read_text(encoding="utf-8")
454
+ line = next((raw for raw in readme.splitlines() if "Claude front door:" in raw), "")
455
+ checks["readme_claude_front_door"] = line
456
+ if not line or "omg " not in line:
457
+ blockers.append("front_door:README Claude front door must use launcher syntax")
458
+ elif "/OMG:" in line and line.index("omg ") > line.index("/OMG:"):
459
+ blockers.append("front_door:README Claude front door lists slash commands before launcher")
460
+
461
+ command_idx = readme.find("## Command Surface")
462
+ next_section = readme.find("\n## ", command_idx + 1) if command_idx >= 0 else -1
463
+ command_surface = readme[command_idx : next_section if next_section > 0 else len(readme)] if command_idx >= 0 else ""
464
+ checks["readme_command_surface"] = command_idx >= 0
465
+ launcher_pos = command_surface.find("omg ")
466
+ slash_pos = command_surface.find("/OMG:")
467
+ if launcher_pos < 0:
468
+ blockers.append("front_door:README Command Surface must mention launcher commands")
469
+ elif slash_pos >= 0 and launcher_pos > slash_pos:
470
+ blockers.append("front_door:README Command Surface must lead with launcher commands")
471
+
472
+ pkg_path = repo_root / "package.json"
473
+ if not pkg_path.exists():
474
+ blockers.append("install_truthfulness:package.json not found")
475
+ return {"status": "fail", "blockers": blockers, "checks": checks}
476
+ pkg = json.loads(pkg_path.read_text(encoding="utf-8"))
477
+ postinstall = str(pkg.get("scripts", {}).get("postinstall", ""))
478
+ checks["postinstall"] = postinstall
479
+ if "--plan" not in postinstall or "--apply" in postinstall:
480
+ blockers.append("install_truthfulness:package.json postinstall must stay plan-only")
481
+
482
+ truthfulness_targets = [
483
+ repo_root / "README.md",
484
+ repo_root / "docs" / "install" / "claude-code.md",
485
+ repo_root / "docs" / "install" / "codex.md",
486
+ repo_root / "docs" / "install" / "gemini.md",
487
+ repo_root / "docs" / "install" / "kimi.md",
488
+ repo_root / "docs" / "install" / "opencode.md",
489
+ ]
490
+ truthfulness_hits: dict[str, bool] = {}
491
+ for path in truthfulness_targets:
492
+ if not path.exists():
493
+ continue
494
+ content = path.read_text(encoding="utf-8").lower()
495
+ rel = str(path.relative_to(repo_root))
496
+ truthfulness_hits[rel] = "no mutations" in content
497
+ if "no mutations" not in content:
498
+ blockers.append(f"install_truthfulness:{rel}:missing 'no mutations'")
499
+ if "`npm install` is equivalent for omg" in content:
500
+ blockers.append(f"install_truthfulness:{rel}:claims npm install equivalence")
501
+ checks["install_truthfulness"] = truthfulness_hits
502
+
503
+ marker_checks: dict[str, list[str]] = {}
504
+ for rel_path, markers in _REQUIRED_GENERATED_MARKERS.items():
505
+ path = repo_root / rel_path
506
+ if not path.exists():
507
+ blockers.append(f"generated_surface:{rel_path}:missing file")
508
+ continue
509
+ content = path.read_text(encoding="utf-8")
510
+ expected_markers = list(markers)
511
+ if rel_path == "CHANGELOG.md":
512
+ expected_markers = [f"changelog-v{canonical}"]
513
+ marker_checks[rel_path] = expected_markers
514
+ for marker in expected_markers:
515
+ if f"<!-- OMG:GENERATED:{marker} -->" not in content:
516
+ blockers.append(f"generated_surface:{rel_path}:missing marker {marker}")
517
+ checks["generated_markers"] = marker_checks
518
+
519
+ return {
520
+ "status": "fail" if blockers else "ok",
521
+ "blockers": blockers,
522
+ "checks": checks,
523
+ }
524
+
525
+
526
+ def build_report(
527
+ *,
528
+ canonical: str,
529
+ scope: str,
530
+ forbid_version: str | None,
531
+ authored: dict[str, Any] | None,
532
+ derived: dict[str, Any] | None,
533
+ scoped_residue: dict[str, Any] | None,
534
+ release_surface: dict[str, Any] | None = None,
535
+ ) -> dict[str, Any]:
536
+ has_failure = False
537
+ for section in (authored, derived, scoped_residue, release_surface):
538
+ if section is not None and section.get("status") == "fail":
539
+ has_failure = True
540
+ break
541
+
542
+ report: dict[str, Any] = {
543
+ "canonical_version": canonical,
544
+ "scope": scope,
545
+ "forbid_version": forbid_version,
546
+ }
547
+
548
+ if authored is not None:
549
+ report["authored"] = authored
550
+ if derived is not None:
551
+ report["derived"] = derived
552
+ if scoped_residue is not None:
553
+ report["scoped_residue"] = scoped_residue
554
+ if release_surface is not None:
555
+ report["release_surface"] = release_surface
556
+
557
+ report["overall_status"] = "fail" if has_failure else "ok"
558
+ return report
559
+
560
+
561
+ def main() -> int:
562
+ parser = argparse.ArgumentParser(description="Read-only release identity validator")
563
+ parser.add_argument("--scope", choices=["authored", "derived", "all"], default="all")
564
+ parser.add_argument("--forbid-version", default=None)
565
+ parser.add_argument("--output-json", default=None)
566
+ args = parser.parse_args()
567
+
568
+ adoption_file = _REPO_ROOT / "runtime" / "adoption.py"
569
+ if not adoption_file.exists():
570
+ print(json.dumps({"error": "runtime/adoption.py not found"}), file=sys.stderr)
571
+ return 1
572
+
573
+ canonical = extract_canonical_version(adoption_file)
574
+ if canonical is None:
575
+ print(json.dumps({"error": "CANONICAL_VERSION not found"}), file=sys.stderr)
576
+ return 1
577
+
578
+ authored_result = None
579
+ derived_result = None
580
+ residue_result = None
581
+ release_surface_result = None
582
+
583
+ if args.scope in ("authored", "all"):
584
+ authored_result = validate_authored(_REPO_ROOT, canonical)
585
+ else:
586
+ authored_result = {"status": "skipped", "blockers": []}
587
+
588
+ if args.scope in ("derived", "all"):
589
+ derived_result = validate_derived(_REPO_ROOT, canonical)
590
+ else:
591
+ derived_result = {"status": "skipped", "blockers": []}
592
+
593
+ if args.forbid_version and args.scope in ("derived", "all"):
594
+ if args.forbid_version == canonical:
595
+ residue_result = {
596
+ "status": "ok",
597
+ "forbid_version": args.forbid_version,
598
+ "blockers": [],
599
+ }
600
+ else:
601
+ residue_result = scan_scoped_residue(_REPO_ROOT, args.forbid_version)
602
+
603
+ if args.scope == "all":
604
+ release_surface_result = validate_release_surface(_REPO_ROOT, canonical)
605
+
606
+ report = build_report(
607
+ canonical=canonical,
608
+ scope=args.scope,
609
+ forbid_version=args.forbid_version,
610
+ authored=authored_result,
611
+ derived=derived_result,
612
+ scoped_residue=residue_result,
613
+ release_surface=release_surface_result,
614
+ )
615
+
616
+ output = json.dumps(report, indent=2)
617
+
618
+ if args.output_json:
619
+ out_path = Path(args.output_json).resolve()
620
+ if not out_path.is_relative_to(_REPO_ROOT):
621
+ print(json.dumps({"error": f"--output-json must be within repo root: {_REPO_ROOT}"}), file=sys.stderr)
622
+ return 1
623
+ out_path.parent.mkdir(parents=True, exist_ok=True)
624
+ out_path.write_text(output + "\n", encoding="utf-8")
625
+ else:
626
+ print(output)
627
+
628
+ return 1 if report["overall_status"] == "fail" else 0
629
+
630
+
631
+ if __name__ == "__main__":
632
+ sys.exit(main())
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ exec "$SCRIPT_DIR/verify-standalone.sh" "$@"
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ FORBID_VERSION="${FORBID_VERSION:-}"
5
+
6
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
+ TMP_DIR="${1:-$(mktemp -d)}"
8
+
9
+ echo "[verify-standalone] source: $ROOT_DIR"
10
+ echo "[verify-standalone] workdir: $TMP_DIR"
11
+
12
+ tar --exclude="./.omc" --exclude="./.omg" --exclude="./.pytest_cache" -cf - -C "$ROOT_DIR" . | (cd "$TMP_DIR" && tar -xf -)
13
+
14
+ cd "$TMP_DIR"
15
+ mkdir -p .omg/evidence
16
+ export OMG_RELEASE_READY_PROVIDERS="claude,codex,gemini,kimi"
17
+ python3 scripts/omg.py doctor --format json > .omg/evidence/doctor.json
18
+ python3 scripts/prepare-release-proof-fixtures.py --output-root .
19
+ python3 scripts/omg.py contract validate
20
+ python3 scripts/omg.py contract compile --host claude --host codex --host gemini --host kimi --channel public --output-root .
21
+ python3 scripts/omg.py contract compile --host claude --host codex --host gemini --host kimi --channel enterprise --output-root .
22
+ python3 scripts/omg.py release readiness --channel dual --output-root .
23
+ python3 scripts/omg.py compat gate --max-bridge 0 --output .omg/evidence/omg-compat-gap.json
24
+ python3 scripts/check-omg-public-ready.py
25
+
26
+ echo "=== Validating release identity ==="
27
+ python3 scripts/validate-release-identity.py --scope all --forbid-version "${FORBID_VERSION}"
28
+
29
+ if command -v pyenv >/dev/null 2>&1 && pyenv prefix 3.12.7 >/dev/null 2>&1; then
30
+ PYENV_VERSION=3.12.7 python -m pytest -q -o addopts=''
31
+ else
32
+ python3 -m pytest -q -o addopts=''
33
+ fi
34
+
35
+ echo "[verify-standalone] passed"