@agentikos/omega-os 0.2.0 → 0.19.6

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 (376) hide show
  1. package/README.md +33 -3
  2. package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
  3. package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
  4. package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
  5. package/bootstrap/lib/claude-code-settings.py +176 -0
  6. package/bootstrap/lib/common.sh +457 -1
  7. package/bootstrap/lib/llm-clis.py +341 -0
  8. package/bootstrap/lib/manifest-helpers.py +384 -0
  9. package/bootstrap/lib/steps.sh +790 -21
  10. package/bootstrap/manifest.example.yaml +87 -1
  11. package/bootstrap/templates/aisb/CLAUDE.md +305 -0
  12. package/bootstrap/templates/aisb/architect.md +204 -0
  13. package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
  14. package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
  15. package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
  16. package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
  17. package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
  18. package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
  19. package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
  20. package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
  21. package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
  22. package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
  23. package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
  24. package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
  25. package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
  26. package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
  27. package/bootstrap/templates/aisb/construct.md +135 -0
  28. package/bootstrap/templates/aisb/keymaker.md +227 -0
  29. package/bootstrap/templates/aisb/link.md +170 -0
  30. package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
  31. package/bootstrap/templates/aisb/merovingian.md +159 -0
  32. package/bootstrap/templates/aisb/morpheus.md +243 -0
  33. package/bootstrap/templates/aisb/neo.md +147 -0
  34. package/bootstrap/templates/aisb/niobe.md +197 -0
  35. package/bootstrap/templates/aisb/oracle.md +244 -0
  36. package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
  37. package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
  38. package/bootstrap/templates/aisb/pythia.md +153 -0
  39. package/bootstrap/templates/aisb/seraph.md +315 -0
  40. package/bootstrap/templates/aisb/smith.md +202 -0
  41. package/bootstrap/templates/aisb/zion.md +172 -0
  42. package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
  43. package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
  44. package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
  45. package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
  46. package/docs/AUDITS.md +85 -0
  47. package/docs/GAP-ANALYSIS.md +214 -0
  48. package/docs/INSTALL.md +47 -9
  49. package/docs/MCP-AND-PLUGINS.md +31 -4
  50. package/docs/SIMULATION.md +171 -0
  51. package/docs/simulate.sh +211 -0
  52. package/install.sh +164 -17
  53. package/omega/Agentik_Engine/README.md +4 -2
  54. package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
  55. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  105. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  106. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  107. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  108. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  109. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  110. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/account.py +28 -31
  114. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  115. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  116. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  117. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  121. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  122. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  123. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  124. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  125. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  126. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  127. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  128. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  129. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  130. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  131. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  132. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  133. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  134. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  135. package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
  136. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  137. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  138. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  139. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  140. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
  143. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
  144. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  155. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  156. package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
  157. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  158. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  159. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  160. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  161. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  167. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  168. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  169. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  170. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  171. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  172. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  173. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  174. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  175. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  176. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  177. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  178. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  179. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  180. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  181. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  182. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  183. package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
  184. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  185. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  186. package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
  187. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  188. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  189. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  190. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  191. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  192. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  198. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  199. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  203. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  204. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  205. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  206. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  207. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  208. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  209. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  210. package/omega/Agentik_Engine/omega_engine/store.py +88 -41
  211. package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
  212. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  213. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  214. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  215. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  216. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  217. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  218. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  219. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  220. package/omega/Agentik_Engine/pyproject.toml +1 -1
  221. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  222. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  223. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  224. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  225. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  226. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  227. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  228. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
  229. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  230. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  231. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  232. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  233. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  234. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  235. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/test_account.py +8 -3
  304. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  305. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  306. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  307. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  308. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  309. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  310. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  311. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  312. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  313. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  314. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  315. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  316. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  317. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  318. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  319. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  320. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  321. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  322. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  323. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  324. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  325. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  326. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  327. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  328. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  329. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  330. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  331. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  332. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  333. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  334. package/omega/Agentik_Runtime/audits.db +0 -0
  335. package/omega/Agentik_SSOT/VERSION +1 -1
  336. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  337. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  338. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  339. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
  340. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
  341. package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
  342. package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
  343. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  344. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  345. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  346. package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
  347. package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
  348. package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
  349. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  350. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  351. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  352. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  356. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  357. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  359. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  360. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  361. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  362. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  363. package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
  364. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  365. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  366. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  367. package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
  368. package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
  369. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  370. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  371. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  372. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  373. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  374. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  375. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  376. package/package.json +2 -2
@@ -0,0 +1,950 @@
1
+ """Phase content generators — produce the docs for each Genesis phase.
2
+
3
+ Each phase is a pure function ``(state) -> list[FileSpec]`` where
4
+ :class:`FileSpec` is a ``(path, content)`` pair anchored to the project
5
+ root. The orchestrator persists every spec to disk inside the per-project
6
+ ``docs/`` tree, then flips the state machine.
7
+
8
+ The content of each file is a **structured template** the orchestrator
9
+ fills with what it knows (slug, name, intent, stack). The template
10
+ intentionally LEAVES sections marked ``<!-- TODO: ... -->`` for the
11
+ worker agent to fill — Genesis writes the skeleton; the workers (Layer 5)
12
+ do the deep research.
13
+
14
+ Why a structured template instead of "ask the LLM to write it"
15
+ --------------------------------------------------------------
16
+
17
+ The pre-v0.18 ``/prd`` skill called the LLM to author every file from
18
+ scratch. Three problems:
19
+
20
+ 1. **Non-deterministic file shape.** Two re-runs produced different
21
+ section layouts → downstream skills couldn't grep reliably.
22
+ 2. **No per-section worker dispatch.** When a section was bad, you had
23
+ to regen the whole file.
24
+ 3. **No depends_on graph.** Features came out in random order.
25
+
26
+ This module solves all three: the file STRUCTURE is deterministic Python
27
+ code; only the per-section CONTENT is filled by workers. Each worker can
28
+ target ``31-PRD.md#section-3`` instead of "rewrite the PRD".
29
+ """
30
+ from __future__ import annotations
31
+
32
+ from dataclasses import dataclass
33
+ from typing import Any
34
+
35
+ from omega_engine.genesis.state import GenesisState
36
+
37
+
38
+ @dataclass
39
+ class FileSpec:
40
+ """One file to write under the project's docs tree."""
41
+
42
+ rel_path: str # relative to project_root, e.g. "docs/00-VISION.md"
43
+ content: str # full file body (markdown)
44
+
45
+
46
+ # ---------------------------------------------------------------------------
47
+ # Section helpers — every phase uses the same skeleton style
48
+ # ---------------------------------------------------------------------------
49
+
50
+
51
+ def _frontmatter(state: GenesisState, *, kind: str) -> str:
52
+ """YAML frontmatter on every doc — machine-readable provenance."""
53
+ return (
54
+ f"---\n"
55
+ f"slug: {state.slug}\n"
56
+ f"name: {state.name}\n"
57
+ f"kind: {kind}\n"
58
+ f"phase: {state.phase}\n"
59
+ f"stack:\n"
60
+ f" type: {state.stack.type}\n"
61
+ f" frontend: {state.stack.frontend}\n"
62
+ f" backend: {state.stack.backend}\n"
63
+ f" ui_kit: {state.stack.ui_kit}\n"
64
+ f"generated_at: {state.updated_at}\n"
65
+ f"---\n\n"
66
+ )
67
+
68
+
69
+ def _todo(label: str) -> str:
70
+ return f"<!-- TODO: {label} -->"
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # PHASE 1 — Vision
75
+ # ---------------------------------------------------------------------------
76
+
77
+
78
+ def phase_vision(state: GenesisState) -> list[FileSpec]:
79
+ """One file: docs/00-VISION.md — product identity + emotional positioning."""
80
+ body = _frontmatter(state, kind="vision") + f"""# Vision — {state.name}
81
+
82
+ > **One-line intent (operator brief):**
83
+ > {state.intent or _todo("operator did not provide an intent — capture it during the vision interview")}
84
+
85
+ ## Why this product exists
86
+
87
+ {_todo("3-5 sentences. What void does this fill? Who hurts today, and how?")}
88
+
89
+ ## The user we're building for
90
+
91
+ - **Primary persona:** {_todo("1-line role + 1-line stage of life/work")}
92
+ - **Pain we end:** {_todo("the concrete pain, in their words")}
93
+ - **Win we deliver:** {_todo("the concrete win, measurable in minutes / dollars / confidence")}
94
+
95
+ ## The 1-second pitch (5-year-old version)
96
+
97
+ {_todo("If you told a 5-year-old what this product does in one sentence, what would you say?")}
98
+
99
+ ## What this product is NOT
100
+
101
+ - {_todo("the most likely confusion — and why we're not that")}
102
+ - {_todo("the adjacent market we will not serve")}
103
+
104
+ ## Internal compass — 3 principles we will not betray
105
+
106
+ 1. {_todo("principle 1 — concrete, verifiable in product decisions")}
107
+ 2. {_todo("principle 2 — concrete, verifiable in product decisions")}
108
+ 3. {_todo("principle 3 — concrete, verifiable in product decisions")}
109
+
110
+ ## Emotional positioning
111
+
112
+ | Adjective | Why it matters here |
113
+ |---|---|
114
+ | {_todo("adjective 1")} | {_todo("why")} |
115
+ | {_todo("adjective 2")} | {_todo("why")} |
116
+ | {_todo("adjective 3")} | {_todo("why")} |
117
+
118
+ ## Success — what 'working' looks like 12 months from launch
119
+
120
+ - **User win:** {_todo("a specific user outcome we'd celebrate")}
121
+ - **Business win:** {_todo("a specific revenue / retention / activation number")}
122
+ - **Team win:** {_todo("the team's pride moment, what they'd brag about")}
123
+
124
+ ---
125
+
126
+ **Next:** ``omega genesis run {state.slug}`` to advance to the **market** phase.
127
+ """
128
+ return [FileSpec("docs/00-VISION.md", body)]
129
+
130
+
131
+ # ---------------------------------------------------------------------------
132
+ # PHASE 2 — Market (5 files)
133
+ # ---------------------------------------------------------------------------
134
+
135
+
136
+ def phase_market(state: GenesisState) -> list[FileSpec]:
137
+ fm = _frontmatter(state, kind="market-research")
138
+ return [
139
+ FileSpec("docs/10-market/11-COMPETITORS.md", fm + f"""# Competitors — {state.name}
140
+
141
+ > Direct, indirect, and adjacent players. We name them so we can decide
142
+ > how we differ — not to copy them.
143
+
144
+ ## Direct competitors
145
+
146
+ | Player | URL | Stage | Pricing | Where they win | Where we beat them |
147
+ |---|---|---|---|---|---|
148
+ | {_todo("Player A")} | {_todo("url")} | {_todo("seed/A/B/scale")} | {_todo("from $X")} | {_todo("their strength")} | {_todo("our advantage")} |
149
+ | {_todo("Player B")} | {_todo("url")} | {_todo("stage")} | {_todo("pricing")} | {_todo("strength")} | {_todo("advantage")} |
150
+
151
+ ## Indirect / adjacent
152
+
153
+ - {_todo("adjacent player — what they solve that overlaps ~30%")}
154
+
155
+ ## Open positioning gap (the wedge)
156
+
157
+ {_todo("one paragraph: the specific job-to-be-done nobody owns yet")}
158
+
159
+ ## Switching cost — how a user leaves a competitor for us
160
+
161
+ {_todo("the concrete migration path: what they export, what we import, what we promise during onboarding")}
162
+ """),
163
+
164
+ FileSpec("docs/10-market/12-ICP.md", fm + f"""# Ideal Customer Profile — {state.name}
165
+
166
+ ## ICP — Tier 1 (the bullseye)
167
+
168
+ - **Role / Title:** {_todo("e.g. 'Head of Growth at a 50-200 ARR B2B SaaS'")}
169
+ - **Company stage:** {_todo("series A-B, profitable, 50-200 employees")}
170
+ - **Geography:** {_todo("EU / US / global / French-speaking-only")}
171
+ - **Trigger event:** {_todo("the moment they suddenly need this — funding round, churn spike, hiring freeze")}
172
+ - **Where they hang out:** {_todo("Twitter circles, Slack groups, LinkedIn niches")}
173
+ - **Budget signal:** {_todo("they already pay $X/mo for Y product")}
174
+
175
+ ## ICP — Tier 2 (the spillover, lower ACV but volume)
176
+
177
+ {_todo("same shape, secondary segment")}
178
+
179
+ ## Anti-ICP (we'd refuse this customer)
180
+
181
+ - {_todo("anti-pattern 1 — why we'd say no even at full price")}
182
+
183
+ ## Job-to-be-done
184
+
185
+ > When **{_todo("situation")}**, I want to **{_todo("verb + outcome")}**, so I can **{_todo("higher-level goal")}**.
186
+ """),
187
+
188
+ FileSpec("docs/10-market/13-PRICING-STRATEGY.md", fm + f"""# Pricing strategy — {state.name}
189
+
190
+ ## Pricing axis (what we charge for)
191
+
192
+ {_todo("seats / events / API calls / outcomes / tier features — pick ONE primary axis and one secondary at most")}
193
+
194
+ ## Tiers (initial)
195
+
196
+ | Tier | Price | Limits | Who | Why we drew the line here |
197
+ |---|---|---|---|---|
198
+ | Free | $0/mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
199
+ | Pro | ${_todo("X")} /mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
200
+ | Team | ${_todo("X")} /mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
201
+ | Enterprise | custom | unlimited | {_todo("who")} | {_todo("rationale")} |
202
+
203
+ ## Willingness to pay signals (from competitor + ICP research)
204
+
205
+ - {_todo("they currently pay $X for Y — anchor")}
206
+ - {_todo("survey / interview / public pricing reference")}
207
+
208
+ ## Stripe Connect configuration
209
+
210
+ - **Mode:** {_todo("destination charges | direct charges | subscriptions")}
211
+ - **Currency:** {_todo("USD / EUR / multi")}
212
+ - **Tax handling:** {_todo("Stripe Tax / Avalara / manual")}
213
+ - **Webhooks we MUST handle:** ``checkout.session.completed``, ``invoice.payment_failed``, ``customer.subscription.*``
214
+
215
+ ## Pricing experiments we will run
216
+
217
+ 1. {_todo("test 1 — what we change, what we measure")}
218
+ 2. {_todo("test 2")}
219
+ """),
220
+
221
+ FileSpec("docs/10-market/14-GTM-CHANNELS.md", fm + f"""# Go-to-market channels — {state.name}
222
+
223
+ ## Rank-ordered channels (top 5 we will lean on)
224
+
225
+ | Rank | Channel | Why this one | Owner | First experiment |
226
+ |---|---|---|---|---|
227
+ | 1 | {_todo("channel")} | {_todo("fit with ICP + cost")} | {_todo("who runs it")} | {_todo("week-1 test")} |
228
+ | 2 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
229
+ | 3 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
230
+ | 4 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
231
+ | 5 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
232
+
233
+ ## Channels we explicitly reject
234
+
235
+ - {_todo("channel + why it doesn't fit the ICP")}
236
+
237
+ ## Distribution moat — what compounds
238
+
239
+ {_todo("the thing that gets cheaper / better the longer we run it (SEO, community, viral loop, integrations)")}
240
+ """),
241
+
242
+ FileSpec("docs/10-market/15-POSITIONING.md", fm + f"""# Positioning — {state.name}
243
+
244
+ ## The one-sentence positioning statement
245
+
246
+ > For **{_todo("ICP")}** who struggle with **{_todo("pain")}**,
247
+ > **{state.name}** is the **{_todo("product category")}** that
248
+ > **{_todo("unique benefit")}** —
249
+ > unlike **{_todo("alternative")}**, we **{_todo("how we differ")}**.
250
+
251
+ ## Category we play in
252
+
253
+ - **Existing category:** {_todo("e.g. 'sales engagement'")}
254
+ - **Our framing:** {_todo("how we re-name the category to favour our shape (e.g. 'AI sales rooms')")}
255
+
256
+ ## Three messages, ranked
257
+
258
+ 1. **Lead message:** {_todo("the line on the hero")}
259
+ 2. **Proof message:** {_todo("the line that closes a skeptic")}
260
+ 3. **Differentiator:** {_todo("the line that makes us memorable")}
261
+
262
+ ## Anti-positioning — what we will NEVER claim
263
+
264
+ - {_todo("a tempting positioning we will refuse for integrity")}
265
+ """),
266
+ ]
267
+
268
+
269
+ # ---------------------------------------------------------------------------
270
+ # PHASE 3 — Branding (3 files, wired to the design-discipline skills)
271
+ # ---------------------------------------------------------------------------
272
+
273
+
274
+ def phase_branding(state: GenesisState) -> list[FileSpec]:
275
+ fm = _frontmatter(state, kind="branding")
276
+ ui_kit = state.stack.ui_kit
277
+ # The 3 design skills the operator already has installed globally
278
+ # are referenced here so the worker that fills these files knows
279
+ # which skills to invoke.
280
+ design_skills_block = (
281
+ "## Design discipline — skills the worker MUST invoke when filling this\n\n"
282
+ "- **`/emil-design-eng`** (https://github.com/emilkowalski/skill) — "
283
+ "Emil Kowalski's design engineering discipline; bias toward subtle, "
284
+ "tactile, motion-aware interfaces.\n"
285
+ "- **`/impeccable`** (https://github.com/pbakaus/impeccable) — "
286
+ "Pixel-level craft. No half-baked components, no inconsistent spacing.\n"
287
+ "- **`/taste-skill`** (https://www.tasteskill.dev) — taste calibration "
288
+ "across typography, colour, hierarchy, motion.\n"
289
+ "- **`/shadcn-ui`** — every component from "
290
+ "https://ui.shadcn.com/docs/components is in scope by default.\n\n"
291
+ )
292
+ return [
293
+ FileSpec("docs/20-brand/21-BRAND-IDENTITY.md", fm + f"""# Brand identity — {state.name}
294
+
295
+ {design_skills_block}
296
+
297
+ ## Personality (5-7 adjectives, ranked)
298
+
299
+ 1. {_todo("adjective 1")}
300
+ 2. {_todo("adjective 2")}
301
+ 3. {_todo("adjective 3")}
302
+
303
+ ## Voice rules
304
+
305
+ - **We sound like:** {_todo("1 sentence describing the voice — e.g. 'a senior engineer who respects your time'")}
306
+ - **We never sound:** {_todo("anti-pattern — e.g. 'hype, exclamation marks, AI-marketing-ese'")}
307
+
308
+ ## Tone matrix
309
+
310
+ | Context | Tone | Example phrase |
311
+ |---|---|---|
312
+ | Onboarding | {_todo("welcoming | direct")} | "{_todo("phrase")}" |
313
+ | Error | {_todo("clear | accountable")} | "{_todo("phrase")}" |
314
+ | Success | {_todo("understated | warm")} | "{_todo("phrase")}" |
315
+ | Marketing | {_todo("confident | specific")} | "{_todo("phrase")}" |
316
+
317
+ ## Visual mood (mood-board references)
318
+
319
+ - {_todo("ref 1 — Linear, Vercel, Stripe, Things, …")}
320
+ - {_todo("ref 2")}
321
+ - {_todo("ref 3 — and ONE we explicitly want to be NOT like")}
322
+
323
+ ## Logo direction
324
+
325
+ - **Mark:** {_todo("wordmark | symbol+wordmark | letter mark")}
326
+ - **Energy:** {_todo("static | kinetic | playful | severe")}
327
+ - **Constraint:** {_todo("monochrome-first / colour-first / both")}
328
+ """),
329
+
330
+ FileSpec("docs/20-brand/22-DESIGN-SYSTEM.md", fm + f"""# Design system — {state.name}
331
+
332
+ {design_skills_block}
333
+
334
+ ## Foundation
335
+
336
+ - **UI kit:** ``{ui_kit}``
337
+ - **shadcn theme:** {_todo("oklch palette name + 1-line justification")}
338
+ - **Type scale:** {_todo("modular scale ratio (1.125 / 1.250 / 1.333)")}
339
+ - **Radius:** {_todo("rounded-md by default | sharp | very rounded")}
340
+ - **Spacing unit:** {_todo("4px / 8px / Tailwind default")}
341
+
342
+ ## Colour tokens (oklch, light + dark)
343
+
344
+ | Token | Light | Dark | Used on |
345
+ |---|---|---|---|
346
+ | bg | {_todo("L 100% C 0 H 0")} | {_todo("L 8% C 0 H 0")} | page backgrounds |
347
+ | fg | {_todo("L 14% C 0.02 H 250")} | {_todo("L 96% C 0.02 H 250")} | primary text |
348
+ | primary | {_todo("L 60% C 0.18 H 250")} | {_todo("L 65% C 0.18 H 250")} | CTAs |
349
+ | accent | {_todo("L 70% C 0.20 H 30")} | {_todo("L 70% C 0.20 H 30")} | highlights |
350
+
351
+ ## Typography pairings
352
+
353
+ - **Display:** {_todo("font + weight + tracking")}
354
+ - **Body:** {_todo("font + weight + line-height")}
355
+ - **Mono:** {_todo("font for code/numbers")}
356
+
357
+ ## Component inventory we will ship in v1
358
+
359
+ (from https://ui.shadcn.com/docs/components — pick + extend)
360
+
361
+ - {_todo("button: 4 variants + 3 sizes")}
362
+ - {_todo("card, input, select, dialog, sheet, tabs")}
363
+ - {_todo("toast, tooltip, dropdown")}
364
+ - {_todo("app-specific: chat-bubble | data-card | flow-canvas")}
365
+
366
+ ## Components we will NOT use
367
+
368
+ - {_todo("e.g. carousel — never tells the story we want")}
369
+ """),
370
+
371
+ FileSpec("docs/20-brand/23-MOTION-LANGUAGE.md", fm + f"""# Motion language — {state.name}
372
+
373
+ {design_skills_block}
374
+
375
+ ## Motion principles (Emil Kowalski + Impeccable)
376
+
377
+ 1. **Purpose first.** Motion is only allowed when it serves comprehension
378
+ or feedback. Decorative motion is rejected.
379
+ 2. **Spring physics, not curves.** Use Framer Motion springs with
380
+ ``stiffness`` 300-500 + ``damping`` 25-40 — easing only for transforms
381
+ tied to user gestures.
382
+ 3. **150-250ms.** Anything outside this window feels broken (too fast
383
+ feels jittery, too slow feels slow).
384
+ 4. **Mass + drag.** Heavy elements move slower; light elements snap.
385
+ 5. **Reduced-motion compliance.** Every transition checks
386
+ ``prefers-reduced-motion`` and disables the spring.
387
+
388
+ ## Motion catalogue we will ship
389
+
390
+ | Event | Spec | Why |
391
+ |---|---|---|
392
+ | Page enter | {_todo("fade + 8px translateY, 200ms spring")} | {_todo("reason")} |
393
+ | Modal open | {_todo("scale 0.96→1 + fade, 180ms")} | {_todo("reason")} |
394
+ | Hover affordance | {_todo("y -2px, instant on touch")} | {_todo("reason")} |
395
+ | Tab switch | {_todo("layoutId + 200ms spring")} | {_todo("reason")} |
396
+ | Toast | {_todo("slide-in 250ms, auto-dismiss 4s")} | {_todo("reason")} |
397
+
398
+ ## Library
399
+
400
+ - **Primary:** ``framer-motion`` (matches React + shadcn)
401
+ - **For complex orchestration:** ``gsap`` (only when framer-motion can't, with rationale per use)
402
+ - **For 3D / WebGL:** ``three.js`` + ``@react-three/fiber`` (only for hero / brand moments)
403
+ """),
404
+ ]
405
+
406
+
407
+ # ---------------------------------------------------------------------------
408
+ # PHASE 4 — PRD suite (9 files)
409
+ # ---------------------------------------------------------------------------
410
+
411
+
412
+ def phase_prd(state: GenesisState) -> list[FileSpec]:
413
+ fm = _frontmatter(state, kind="prd")
414
+ s = state.stack
415
+ return [
416
+ FileSpec("docs/30-prd/31-PRD.md", fm + f"""# Product Requirements Document — {state.name}
417
+
418
+ ## 1. Problem
419
+
420
+ {_todo("3-5 sentences. Same problem as VISION but here with concrete user behaviours that prove the pain.")}
421
+
422
+ ## 2. Goals (v1 — what we MUST ship)
423
+
424
+ | Goal | Measurable success | Owner |
425
+ |---|---|---|
426
+ | {_todo("goal")} | {_todo("metric + threshold")} | {_todo("role")} |
427
+
428
+ ## 3. Non-goals (for v1)
429
+
430
+ - {_todo("explicit feature we WILL NOT build in v1")}
431
+ - {_todo("audience we WILL NOT serve in v1")}
432
+
433
+ ## 4. Personas
434
+
435
+ (See ``docs/10-market/12-ICP.md`` for full ICPs.)
436
+
437
+ ## 5. Top user stories — v1 scope
438
+
439
+ | ID | Story | Acceptance |
440
+ |---|---|---|
441
+ | US-01 | As a {_todo("role")}, I want to {_todo("verb + object")}, so I can {_todo("higher-level goal")} | {_todo("verifiable criterion")} |
442
+ | US-02 | … | … |
443
+
444
+ ## 6. Feature list
445
+
446
+ See ``docs/40-features/F-*.md`` — each feature has its own spec with
447
+ ``depends_on`` (the DAG the v0.19 plan executor uses).
448
+
449
+ ## 7. Constraints
450
+
451
+ - **Stack:** {s.frontend} + {s.backend} + {s.deploy} + {s.payments}
452
+ - **Compliance:** {_todo("GDPR / SOC2 / HIPAA / none")}
453
+ - **Performance budget:** {_todo("LCP <2.5s, CLS <0.1, bundle <X KB")}
454
+
455
+ ## 8. Risks + mitigations
456
+
457
+ | Risk | Mitigation |
458
+ |---|---|
459
+ | {_todo("risk 1")} | {_todo("mitigation")} |
460
+ | {_todo("risk 2")} | {_todo("mitigation")} |
461
+ """),
462
+
463
+ FileSpec("docs/30-prd/32-TECH-ARCHITECTURE.md", fm + f"""# Technical architecture — {state.name}
464
+
465
+ ## Stack lock
466
+
467
+ | Layer | Choice | Version policy |
468
+ |---|---|---|
469
+ | Frontend | ``{s.frontend}`` | latest LTS — fetched via Context7 at install |
470
+ | Backend | ``{s.backend}`` | latest stable |
471
+ | Deploy | ``{s.deploy}`` | — |
472
+ | Payments | ``{s.payments}`` | latest API |
473
+ | Auth | ``{s.auth}`` | — |
474
+ | UI kit | ``{s.ui_kit}`` | latest |
475
+ | Extras | {", ".join(s.extras) or "—"} | per-lib best practice |
476
+
477
+ ## Repo shape (monorepo or single?)
478
+
479
+ {_todo("single-repo / Turborepo / pnpm workspaces — and why")}
480
+
481
+ ## Folder structure
482
+
483
+ ```
484
+ {state.slug}/
485
+ ├── apps/
486
+ │ └── web/ # Next.js App Router
487
+ │ ├── app/
488
+ │ ├── components/
489
+ │ └── lib/
490
+ ├── packages/ # if monorepo
491
+ ├── convex/ # backend functions (if convex)
492
+ ├── docs/ # Genesis output (this tree)
493
+ ├── plan/ # v0.19 plan store
494
+ └── .env.local
495
+ ```
496
+
497
+ ## Deployment topology
498
+
499
+ - **Web:** {_todo("Vercel project name + region")}
500
+ - **Backend:** {_todo("Convex deployment name + region")}
501
+ - **DNS:** {_todo("apex domain + subdomain plan")}
502
+
503
+ ## Observability
504
+
505
+ - **Errors:** Sentry
506
+ - **Analytics:** {_todo("PostHog | Plausible | Mixpanel — and one reason")}
507
+ - **Performance:** Vercel Analytics + Speed Insights
508
+ """),
509
+
510
+ FileSpec("docs/30-prd/33-DESIGN-SYSTEM-DETAIL.md", fm + f"""# Design system — implementation detail
511
+
512
+ (High-level system in ``docs/20-brand/22-DESIGN-SYSTEM.md``.)
513
+
514
+ ## Tailwind v4 config
515
+
516
+ {_todo("the @theme block with the oklch palette, font stack, radius, spacing")}
517
+
518
+ ## shadcn theme
519
+
520
+ {_todo("the components.json baseColor + the per-token override block")}
521
+
522
+ ## Component conventions
523
+
524
+ - Every shadcn component MUST be in ``components/ui/<name>.tsx``.
525
+ - App-specific components go in ``components/<feature>/<Name>.tsx``.
526
+ - NEVER edit shadcn primitives in-place — wrap and extend.
527
+
528
+ ## Accessibility floor
529
+
530
+ - WCAG 2.1 AA on every page.
531
+ - ``/a11yaudit`` MUST score ≥ 85 on every PR.
532
+ """),
533
+
534
+ FileSpec("docs/30-prd/34-LAYOUTS.md", fm + f"""# Layouts — {state.name}
535
+
536
+ ## Top-level routes
537
+
538
+ | Route | Purpose | Auth required | Layout |
539
+ |---|---|---|---|
540
+ | ``/`` | Marketing landing | no | marketing |
541
+ | ``/sign-in`` | Auth | no | minimal |
542
+ | ``/dashboard`` | App home | yes | app |
543
+ | ``/dashboard/{_todo("...")}`` | feature | yes | app |
544
+ | ``/settings`` | Account | yes | app |
545
+
546
+ ## App-shell layout
547
+
548
+ ```
549
+ ┌─────────────────────────────────────────────┐
550
+ │ top-bar (logo · search · profile) │
551
+ ├──────┬──────────────────────────────────────┤
552
+ │ side │ main content │
553
+ │ nav │ │
554
+ │ │ │
555
+ └──────┴──────────────────────────────────────┘
556
+ ```
557
+
558
+ ## Marketing layout
559
+
560
+ {_todo("hero, social proof, features grid, pricing, footer — order + one-line each")}
561
+ """),
562
+
563
+ FileSpec("docs/30-prd/35-DATA-MODEL.md", fm + f"""# Data model — {state.name}
564
+
565
+ ## Entities (Convex tables / Postgres tables)
566
+
567
+ | Entity | Fields | Indexed by | Relationships |
568
+ |---|---|---|---|
569
+ | users | id, email, name, createdAt, planTier | byEmail | 1-to-many → projects |
570
+ | {_todo("entity")} | {_todo("fields")} | {_todo("indexes")} | {_todo("relationships")} |
571
+
572
+ ## Convex schema (schema.ts)
573
+
574
+ ```typescript
575
+ {_todo("import { defineSchema, defineTable } from convex/server; …")}
576
+ ```
577
+
578
+ ## Migrations strategy
579
+
580
+ - Every schema change carries a migration script in ``convex/migrations/``.
581
+ - ``omega plan build`` REJECTS a feature whose ``depends_on`` includes a
582
+ schema change that hasn't been verified by ``/dataaudit``.
583
+
584
+ ## PII + secrets
585
+
586
+ - {_todo("which fields are PII — and where they're encrypted at rest")}
587
+ - {_todo("which fields are secrets — and the vault path that holds them")}
588
+ """),
589
+
590
+ FileSpec("docs/30-prd/36-AGENT-PLAYBOOK.md", fm + f"""# Agent playbook — {state.name}
591
+
592
+ > This file is read by every worker the v0.19 plan executor dispatches.
593
+ > It tells the worker WHAT IT MUST RESPECT, project-wide.
594
+
595
+ ## Stack contract
596
+
597
+ - Frontend: ``{s.frontend}`` — App Router, Server Components by default.
598
+ - Backend: ``{s.backend}`` — queries + mutations only; no ad-hoc REST.
599
+ - Auth: ``{s.auth}`` — use the official middleware. Never roll your own.
600
+ - Payments: ``{s.payments}`` — webhook verification is non-negotiable.
601
+
602
+ ## Skills the workers MUST invoke when the task touches their domain
603
+
604
+ | Worker domain | Skill |
605
+ |---|---|
606
+ | UI / pages | ``/shadcn-ui`` + ``/emil-design-eng`` + ``/impeccable`` + ``/taste-skill`` |
607
+ | Convex queries / mutations | ``/convex`` + ``/convex-best-practices`` |
608
+ | Stripe integration | ``/stripe-best-practices`` |
609
+ | Vercel deploy | ``/vl-deploy-to-vercel`` |
610
+ | Forms | ``/mk-form-cro`` |
611
+ | SEO surfaces | ``/seoaudit`` + ``/mk-schema-markup`` |
612
+ | Performance | ``/perfaudit`` |
613
+ | Accessibility | ``/a11yaudit`` |
614
+ | Motion | ``/motionaudit`` |
615
+
616
+ ## Non-negotiables (worker MUST refuse the task if it violates these)
617
+
618
+ 1. **No inline styles** unless the design system needs an escape hatch — and even then, document it.
619
+ 2. **Server Components by default** in Next.js — ``"use client"`` only when state/effects/event handlers are needed.
620
+ 3. **All routes auth-checked** via Clerk middleware. A page without a Clerk check is a security bug.
621
+ 4. **Convex calls only from Server Components or via ``useQuery``** — never raw fetch().
622
+ 5. **Every PR runs ``/perfaudit`` + ``/a11yaudit`` + ``/codeaudit`` before merge.**
623
+
624
+ ## Verify per task
625
+
626
+ Each task has a ``verify_cmd`` set by the v0.19 plan builder. It's
627
+ non-negotiable: the worker writes ``.done.json`` with ``status=done_clean``
628
+ ONLY when verify_cmd exits 0. If it doesn't, status=pending — and the
629
+ worker explains in ``pending_actions`` what blocked it.
630
+ """),
631
+
632
+ FileSpec("docs/30-prd/37-TESTING-STRATEGY.md", fm + f"""# Testing strategy — {state.name}
633
+
634
+ ## Test pyramid
635
+
636
+ | Layer | What | Tool | Run when |
637
+ |---|---|---|---|
638
+ | Unit | Pure functions, utils | Vitest | every save |
639
+ | Component | shadcn-derived components | Vitest + Testing Library | every save |
640
+ | Integration | Convex query+mutation flow | Vitest + convex-test | pre-commit |
641
+ | E2E auth flow | Sign-in → Dashboard → core action | Playwright + Clerk sign-in-token | on PR |
642
+ | Forensic | Full ``/e2e`` skill | OmegaOS Quality Arsenal | pre-launch |
643
+
644
+ ## E2E auth — the Clerk sign-in-token + ticket strategy
645
+
646
+ (Documented in ``/e2e`` skill — bypasses 2FA in CI safely.)
647
+
648
+ ## Snapshot policy
649
+
650
+ - Component snapshots on every PR.
651
+ - Pixel-level visual regression via Playwright screenshots for the top 10 routes.
652
+
653
+ ## CI integration
654
+
655
+ - Pre-commit: lint + unit + component tests.
656
+ - PR: integration + e2e on changed surfaces.
657
+ - Pre-merge: ``/codeaudit`` + ``/perfaudit`` + ``/a11yaudit`` GREEN.
658
+ """),
659
+
660
+ FileSpec("docs/30-prd/38-CHANGELOG.md", fm + f"""# Changelog — {state.name}
661
+
662
+ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
663
+
664
+ ## [Unreleased]
665
+
666
+ ### Added
667
+ - {_todo("feature")}
668
+
669
+ ### Changed
670
+ - {_todo("change")}
671
+
672
+ ### Fixed
673
+ - {_todo("fix")}
674
+
675
+ ---
676
+
677
+ ## [0.0.1] — {state.created_at[:10]}
678
+
679
+ ### Added
680
+ - Project genesis tree created by ``omega genesis`` (this run).
681
+ """),
682
+
683
+ FileSpec("docs/30-prd/39-GLOSSARY.md", fm + f"""# Glossary — {state.name}
684
+
685
+ | Term | Definition | Source of truth |
686
+ |---|---|---|
687
+ | {_todo("term")} | {_todo("definition")} | {_todo("file / link")} |
688
+ """),
689
+ ]
690
+
691
+
692
+ # ---------------------------------------------------------------------------
693
+ # PHASE 5 — Features (N files with explicit DAG)
694
+ # ---------------------------------------------------------------------------
695
+
696
+
697
+ def _default_feature_skeleton(state: GenesisState) -> list[dict[str, Any]]:
698
+ """A starter feature DAG every web project needs.
699
+
700
+ Each dict is the metadata the orchestrator writes into the feature
701
+ file's frontmatter PLUS the YAML stored in ``plan/DAG.json``.
702
+ Topological order: F-001 → F-002 → … with explicit depends_on.
703
+ """
704
+ return [
705
+ {
706
+ "id": "F-001", "slug": "foundation",
707
+ "title": "Foundation — Next.js app + Convex backend + Clerk auth",
708
+ "depends_on": [],
709
+ "wave": 1, "estimated_minutes": 90,
710
+ "files_owned": [
711
+ "package.json", "next.config.ts", "tsconfig.json",
712
+ "app/layout.tsx", "app/page.tsx",
713
+ "convex/schema.ts", "middleware.ts",
714
+ ],
715
+ "verify_cmd": "pnpm build && pnpm test -- --run",
716
+ "skill": "/convex + /vercel-react-best-practices",
717
+ },
718
+ {
719
+ "id": "F-002", "slug": "design-system",
720
+ "title": "Design system — Tailwind v4 + shadcn theme + 12 base components",
721
+ "depends_on": ["F-001"],
722
+ "wave": 1, "estimated_minutes": 60,
723
+ "files_owned": [
724
+ "app/globals.css", "components.json",
725
+ "components/ui/*.tsx",
726
+ ],
727
+ "verify_cmd": "pnpm build && pnpm test -- components/ui",
728
+ "skill": "/shadcn-ui + /design-system + /taste-skill",
729
+ },
730
+ {
731
+ "id": "F-003", "slug": "auth-flow",
732
+ "title": "Auth flow — sign-in / sign-up / sign-out + ClerkProvider",
733
+ "depends_on": ["F-001", "F-002"],
734
+ "wave": 1, "estimated_minutes": 45,
735
+ "files_owned": [
736
+ "app/sign-in/page.tsx", "app/sign-up/page.tsx",
737
+ "components/auth/*.tsx",
738
+ ],
739
+ "verify_cmd": "pnpm test -- e2e/auth.spec.ts",
740
+ "skill": "/emil-design-eng + /impeccable",
741
+ },
742
+ {
743
+ "id": "F-004", "slug": "marketing-landing",
744
+ "title": "Marketing landing — hero, features grid, pricing teaser, footer",
745
+ "depends_on": ["F-002"],
746
+ "wave": 2, "estimated_minutes": 90,
747
+ "files_owned": [
748
+ "app/page.tsx", "components/marketing/*.tsx",
749
+ ],
750
+ "verify_cmd": "pnpm test -- marketing && pnpm exec playwright test e2e/landing.spec.ts",
751
+ "skill": "/shadcn-ui + /taste-skill + /copyaudit + /seoaudit",
752
+ },
753
+ {
754
+ "id": "F-005", "slug": "dashboard-shell",
755
+ "title": "Dashboard shell — top bar + side nav + protected layout",
756
+ "depends_on": ["F-003"],
757
+ "wave": 2, "estimated_minutes": 60,
758
+ "files_owned": [
759
+ "app/(app)/layout.tsx", "app/(app)/dashboard/page.tsx",
760
+ "components/app-shell/*.tsx",
761
+ ],
762
+ "verify_cmd": "pnpm test -- e2e/dashboard.spec.ts",
763
+ "skill": "/shadcn-ui + /impeccable",
764
+ },
765
+ {
766
+ "id": "F-006", "slug": "billing-stripe-connect",
767
+ "title": "Billing — Stripe subscription + webhook + customer portal",
768
+ "depends_on": ["F-001", "F-003"],
769
+ "wave": 2, "estimated_minutes": 120,
770
+ "files_owned": [
771
+ "app/api/stripe/webhook/route.ts",
772
+ "convex/billing/*.ts",
773
+ "app/(app)/settings/billing/page.tsx",
774
+ ],
775
+ "verify_cmd": "pnpm test -- billing",
776
+ "skill": "/stripe-best-practices",
777
+ },
778
+ # Operator-specific features go from F-007 onwards. The
779
+ # orchestrator's feature-phase output emits this skeleton + a
780
+ # TODO block calling out the operator to add the product-specific
781
+ # features in the correct topological order.
782
+ ]
783
+
784
+
785
+ def phase_features(state: GenesisState) -> list[FileSpec]:
786
+ """Emit:
787
+ * one ``F-NNN-<slug>.md`` per default feature (with frontmatter
788
+ carrying ``depends_on``, ``wave``, ``estimated_minutes``,
789
+ ``files_owned``, ``verify_cmd``, ``skill``).
790
+ * one ``F-TEMPLATE.md`` for the operator to copy when adding their
791
+ product-specific features.
792
+ * one ``DAG.json`` under ``plan/`` that the v0.19 plan builder
793
+ consumes.
794
+ """
795
+ fm = _frontmatter(state, kind="feature-spec")
796
+ skeleton = _default_feature_skeleton(state)
797
+ specs: list[FileSpec] = []
798
+
799
+ # Feature files (one per F-NNN)
800
+ for f in skeleton:
801
+ body = f"""---
802
+ slug: {state.slug}
803
+ feature_id: {f['id']}
804
+ feature_slug: {f['slug']}
805
+ title: {f['title']}
806
+ depends_on: {f['depends_on']}
807
+ wave: {f['wave']}
808
+ estimated_minutes: {f['estimated_minutes']}
809
+ files_owned: {f['files_owned']}
810
+ verify_cmd: "{f['verify_cmd']}"
811
+ skill: "{f['skill']}"
812
+ generated_at: {state.updated_at}
813
+ ---
814
+
815
+ # {f['id']} — {f['title']}
816
+
817
+ ## Why this exists
818
+
819
+ {_todo("1-2 sentences: what user pain or business win this directly serves.")}
820
+
821
+ ## Acceptance criteria (verifiable by `{f['verify_cmd']}`)
822
+
823
+ - [ ] {_todo("checkbox 1")}
824
+ - [ ] {_todo("checkbox 2")}
825
+ - [ ] {_todo("checkbox 3")}
826
+
827
+ ## Files this feature owns
828
+
829
+ {chr(10).join(f"- ``{p}``" for p in f['files_owned'])}
830
+
831
+ ## Depends on
832
+
833
+ {(chr(10).join(f"- {d}" for d in f['depends_on'])) if f['depends_on'] else "_(none — first wave)_"}
834
+
835
+ ## How the worker should approach this
836
+
837
+ 1. Read this file.
838
+ 2. Read every file in ``files_owned`` (most don't exist yet → that's OK).
839
+ 3. Read ``docs/30-prd/36-AGENT-PLAYBOOK.md`` and respect EVERY non-negotiable.
840
+ 4. Invoke the skill: ``{f['skill']}``.
841
+ 5. Implement, then run ``{f['verify_cmd']}``.
842
+ 6. Write ``.done.json`` only when the verify command exits 0.
843
+
844
+ ## Skill block
845
+
846
+ The worker spawn injects this skill list into the system prompt:
847
+ ``{f['skill']}``.
848
+ """
849
+ specs.append(FileSpec(
850
+ f"docs/40-features/{f['id']}-{f['slug']}.md", body,
851
+ ))
852
+
853
+ # Template for operator-authored features
854
+ template = fm + """# F-TEMPLATE — Copy this file when adding a new feature
855
+
856
+ > Rename to ``F-NNN-<slug>.md`` (NNN strictly increasing, no gaps).
857
+ > The v0.19 plan builder reads every file matching ``F-[0-9]+-*.md`` and
858
+ > sorts by id, but enforces order via the ``depends_on`` DAG — NOT by
859
+ > filename.
860
+
861
+ Frontmatter required:
862
+
863
+ ```yaml
864
+ ---
865
+ slug: <project-slug>
866
+ feature_id: F-NNN
867
+ feature_slug: <kebab-case>
868
+ title: <one-line title>
869
+ depends_on: [F-XXX, F-YYY]
870
+ wave: 2
871
+ estimated_minutes: 45
872
+ files_owned:
873
+ - apps/web/app/<route>/page.tsx
874
+ - convex/<feature>/*.ts
875
+ verify_cmd: "pnpm test -- e2e/<feature>.spec.ts"
876
+ skill: "/shadcn-ui + /taste-skill"
877
+ ---
878
+ ```
879
+ """
880
+ specs.append(FileSpec("docs/40-features/F-TEMPLATE.md", template))
881
+
882
+ # DAG.json — the machine-readable view the v0.19 plan builder consumes
883
+ import json as _json
884
+ dag = {
885
+ "slug": state.slug,
886
+ "generated_at": state.updated_at,
887
+ "features": skeleton,
888
+ }
889
+ specs.append(FileSpec("plan/DAG.json", _json.dumps(dag, indent=2)))
890
+
891
+ return specs
892
+
893
+
894
+ # ---------------------------------------------------------------------------
895
+ # PHASE 6 — Plan (handoff to v0.19)
896
+ # ---------------------------------------------------------------------------
897
+
898
+
899
+ def phase_plan(state: GenesisState) -> list[FileSpec]:
900
+ """Final phase — emits the handoff doc that tells the operator how to
901
+ move from Genesis to the v0.19 Plan executor."""
902
+ fm = _frontmatter(state, kind="genesis-handoff")
903
+ body = fm + f"""# Genesis complete — ready for `omega plan`
904
+
905
+ The Genesis pipeline has finished. Every doc is in place under
906
+ ``docs/``; the feature DAG is at ``plan/DAG.json``.
907
+
908
+ ## What you have now
909
+
910
+ - ``docs/00-VISION.md`` — product identity
911
+ - ``docs/10-market/{{11..15}}-*.md`` — 5 market files
912
+ - ``docs/20-brand/{{21..23}}-*.md`` — 3 brand files
913
+ - ``docs/30-prd/{{31..39}}-*.md`` — 9 PRD files
914
+ - ``docs/40-features/F-001..F-006*.md`` — starter feature DAG
915
+ - ``plan/DAG.json`` — machine-readable DAG
916
+
917
+ ## The next step
918
+
919
+ ```bash
920
+ omega plan build {state.slug} # ingests DAG.json into the v0.19 plan store
921
+ omega plan next {state.slug} # returns the next eligible task (1 at a time)
922
+ omega plan run {state.slug} # multi-day autonomous loop with FSM-enforced ordering
923
+ ```
924
+
925
+ ## What still needs operator attention
926
+
927
+ - Fill the `<!-- TODO -->` blocks in every doc. Most will be picked up by
928
+ the v0.19 plan executor when it dispatches worker briefs, but some
929
+ (especially Vision §3 personas, Market §11 competitors) benefit from
930
+ a single human pass first.
931
+ - Add your product-specific features beyond F-006. Copy
932
+ ``docs/40-features/F-TEMPLATE.md``, increment the id, list
933
+ ``depends_on``.
934
+ - Re-run ``omega plan build {state.slug}`` after editing the DAG — it's
935
+ idempotent and re-validates the topological order.
936
+
937
+ ## Stack summary (for the workers)
938
+
939
+ | | |
940
+ |---|---|
941
+ | Type | ``{state.stack.type}`` |
942
+ | Frontend | ``{state.stack.frontend}`` |
943
+ | Backend | ``{state.stack.backend}`` |
944
+ | Deploy | ``{state.stack.deploy}`` |
945
+ | Payments | ``{state.stack.payments}`` |
946
+ | UI kit | ``{state.stack.ui_kit}`` |
947
+ | Auth | ``{state.stack.auth}`` |
948
+ | Extras | {", ".join(state.stack.extras) or "—"} |
949
+ """
950
+ return [FileSpec("docs/GENESIS-COMPLETE.md", body)]