productfoo 0.0.0-stage → 1.0.1

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 (498) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +338 -2
  3. package/bin/foo +3 -0
  4. package/bin/foo.mjs +42 -0
  5. package/commands/bug.md +31 -0
  6. package/commands/discovery.md +28 -0
  7. package/commands/ideate.md +27 -0
  8. package/commands/init.md +28 -0
  9. package/commands/pitch.md +27 -0
  10. package/commands/preview.md +25 -0
  11. package/commands/research.md +31 -0
  12. package/commands/roast.md +27 -0
  13. package/commands/spec.md +30 -0
  14. package/config/pricing.yaml +198 -0
  15. package/config/routing-policy.yaml +171 -0
  16. package/dist-public/src/activeModel.d.ts +83 -0
  17. package/dist-public/src/activeModel.js +331 -0
  18. package/dist-public/src/agentAdapters.d.ts +122 -0
  19. package/dist-public/src/agentAdapters.js +178 -0
  20. package/dist-public/src/agentState.d.ts +43 -0
  21. package/dist-public/src/agentState.js +177 -0
  22. package/dist-public/src/bugCapsule.d.ts +94 -0
  23. package/dist-public/src/bugCapsule.js +227 -0
  24. package/dist-public/src/bugCapture.d.ts +26 -0
  25. package/dist-public/src/bugCapture.js +251 -0
  26. package/dist-public/src/bugOwnerLog.d.ts +93 -0
  27. package/dist-public/src/bugOwnerLog.js +304 -0
  28. package/dist-public/src/bugReportStore.d.ts +48 -0
  29. package/dist-public/src/bugReportStore.js +860 -0
  30. package/dist-public/src/bugSpecContext.d.ts +7 -0
  31. package/dist-public/src/bugSpecContext.js +129 -0
  32. package/dist-public/src/channelFreshness.d.ts +25 -0
  33. package/dist-public/src/channelFreshness.js +194 -0
  34. package/dist-public/src/cli.d.ts +30 -0
  35. package/dist-public/src/cli.js +1667 -0
  36. package/dist-public/src/cliArgs.d.ts +7 -0
  37. package/dist-public/src/cliArgs.js +44 -0
  38. package/dist-public/src/codeCatalog.d.ts +41 -0
  39. package/dist-public/src/codeCatalog.js +197 -0
  40. package/dist-public/src/commandContract.d.ts +84 -0
  41. package/dist-public/src/commandContract.js +390 -0
  42. package/dist-public/src/commandUsage.d.ts +3 -0
  43. package/dist-public/src/commandUsage.js +30 -0
  44. package/dist-public/src/commands/agent.d.ts +60 -0
  45. package/dist-public/src/commands/agent.js +1353 -0
  46. package/dist-public/src/commands/asp.d.ts +8 -0
  47. package/dist-public/src/commands/asp.js +669 -0
  48. package/dist-public/src/commands/evalCmd.d.ts +4 -0
  49. package/dist-public/src/commands/evalCmd.js +405 -0
  50. package/dist-public/src/commands/login.d.ts +25 -0
  51. package/dist-public/src/commands/login.js +94 -0
  52. package/dist-public/src/commands/loop.d.ts +16 -0
  53. package/dist-public/src/commands/loop.js +619 -0
  54. package/dist-public/src/commands/reconcile.d.ts +41 -0
  55. package/dist-public/src/commands/reconcile.js +292 -0
  56. package/dist-public/src/commands/runtime.d.ts +1 -0
  57. package/dist-public/src/commands/runtime.js +36 -0
  58. package/dist-public/src/commands/scanRedact.d.ts +8 -0
  59. package/dist-public/src/commands/scanRedact.js +266 -0
  60. package/dist-public/src/commands/setup.d.ts +28 -0
  61. package/dist-public/src/commands/setup.js +398 -0
  62. package/dist-public/src/commands/shared.d.ts +17 -0
  63. package/dist-public/src/commands/shared.js +147 -0
  64. package/dist-public/src/commands/source.d.ts +1 -0
  65. package/dist-public/src/commands/source.js +134 -0
  66. package/dist-public/src/commands/specCmd.d.ts +24 -0
  67. package/dist-public/src/commands/specCmd.js +794 -0
  68. package/dist-public/src/commands/update.d.ts +61 -0
  69. package/dist-public/src/commands/update.js +244 -0
  70. package/dist-public/src/comprehensionSignal.d.ts +20 -0
  71. package/dist-public/src/comprehensionSignal.js +166 -0
  72. package/dist-public/src/conductor/diversity.d.ts +48 -0
  73. package/dist-public/src/conductor/diversity.js +423 -0
  74. package/dist-public/src/conductor/engine.d.ts +7 -0
  75. package/dist-public/src/conductor/engine.js +295 -0
  76. package/dist-public/src/conductor/families/ideate.d.ts +2 -0
  77. package/dist-public/src/conductor/families/ideate.js +255 -0
  78. package/dist-public/src/conductor/families/interview.d.ts +2 -0
  79. package/dist-public/src/conductor/families/interview.js +39 -0
  80. package/dist-public/src/conductor/families/specSwarm.d.ts +2 -0
  81. package/dist-public/src/conductor/families/specSwarm.js +146 -0
  82. package/dist-public/src/conductor/familyDelivery.d.ts +6 -0
  83. package/dist-public/src/conductor/familyDelivery.js +37 -0
  84. package/dist-public/src/conductor/familyPackArtifact.d.ts +4 -0
  85. package/dist-public/src/conductor/familyPackArtifact.js +260 -0
  86. package/dist-public/src/conductor/ideateDecision.d.ts +6 -0
  87. package/dist-public/src/conductor/ideateDecision.js +237 -0
  88. package/dist-public/src/conductor/pack.d.ts +26 -0
  89. package/dist-public/src/conductor/pack.js +75 -0
  90. package/dist-public/src/conductor/types.d.ts +111 -0
  91. package/dist-public/src/conductor/types.js +7 -0
  92. package/dist-public/src/configPath.d.ts +2 -0
  93. package/dist-public/src/configPath.js +7 -0
  94. package/dist-public/src/discoveryArtifacts.d.ts +54 -0
  95. package/dist-public/src/discoveryArtifacts.js +467 -0
  96. package/dist-public/src/discoveryCommand.d.ts +127 -0
  97. package/dist-public/src/discoveryCommand.js +2148 -0
  98. package/dist-public/src/discoveryConnections.d.ts +339 -0
  99. package/dist-public/src/discoveryConnections.js +613 -0
  100. package/dist-public/src/discoveryDocs.d.ts +129 -0
  101. package/dist-public/src/discoveryDocs.js +577 -0
  102. package/dist-public/src/discoveryEvidence.d.ts +59 -0
  103. package/dist-public/src/discoveryEvidence.js +198 -0
  104. package/dist-public/src/discoveryFireflies.d.ts +25 -0
  105. package/dist-public/src/discoveryFireflies.js +551 -0
  106. package/dist-public/src/discoveryGmail.d.ts +12 -0
  107. package/dist-public/src/discoveryGmail.js +466 -0
  108. package/dist-public/src/discoveryGong.d.ts +12 -0
  109. package/dist-public/src/discoveryGong.js +491 -0
  110. package/dist-public/src/discoveryLearningRouting.d.ts +90 -0
  111. package/dist-public/src/discoveryLearningRouting.js +405 -0
  112. package/dist-public/src/discoveryMatching.d.ts +26 -0
  113. package/dist-public/src/discoveryMatching.js +73 -0
  114. package/dist-public/src/discoveryOutlook.d.ts +12 -0
  115. package/dist-public/src/discoveryOutlook.js +492 -0
  116. package/dist-public/src/discoveryProcess.d.ts +221 -0
  117. package/dist-public/src/discoveryProcess.js +703 -0
  118. package/dist-public/src/discoveryProof.d.ts +143 -0
  119. package/dist-public/src/discoveryProof.js +529 -0
  120. package/dist-public/src/discoveryProviders.d.ts +152 -0
  121. package/dist-public/src/discoveryProviders.js +756 -0
  122. package/dist-public/src/discoveryReadiness.d.ts +219 -0
  123. package/dist-public/src/discoveryReadiness.js +672 -0
  124. package/dist-public/src/discoveryReconcile.d.ts +57 -0
  125. package/dist-public/src/discoveryReconcile.js +424 -0
  126. package/dist-public/src/discoverySlack.d.ts +12 -0
  127. package/dist-public/src/discoverySlack.js +452 -0
  128. package/dist-public/src/discoverySources.d.ts +56 -0
  129. package/dist-public/src/discoverySources.js +322 -0
  130. package/dist-public/src/discoverySync.d.ts +52 -0
  131. package/dist-public/src/discoverySync.js +151 -0
  132. package/dist-public/src/discoverySynthesis.d.ts +57 -0
  133. package/dist-public/src/discoverySynthesis.js +215 -0
  134. package/dist-public/src/discoveryTeams.d.ts +12 -0
  135. package/dist-public/src/discoveryTeams.js +516 -0
  136. package/dist-public/src/discoveryZoom.d.ts +12 -0
  137. package/dist-public/src/discoveryZoom.js +523 -0
  138. package/dist-public/src/elicitationSurface.d.ts +13 -0
  139. package/dist-public/src/elicitationSurface.js +77 -0
  140. package/dist-public/src/errorReport.d.ts +99 -0
  141. package/dist-public/src/errorReport.js +443 -0
  142. package/dist-public/src/errorTaxonomy.d.ts +84 -0
  143. package/dist-public/src/errorTaxonomy.js +189 -0
  144. package/dist-public/src/evalCalibration.d.ts +82 -0
  145. package/dist-public/src/evalCalibration.js +169 -0
  146. package/dist-public/src/evalChecks.d.ts +21 -0
  147. package/dist-public/src/evalChecks.js +295 -0
  148. package/dist-public/src/evalCompile.d.ts +56 -0
  149. package/dist-public/src/evalCompile.js +58 -0
  150. package/dist-public/src/evalImprove.d.ts +60 -0
  151. package/dist-public/src/evalImprove.js +175 -0
  152. package/dist-public/src/evalJudge.d.ts +47 -0
  153. package/dist-public/src/evalJudge.js +143 -0
  154. package/dist-public/src/evalLabels.d.ts +100 -0
  155. package/dist-public/src/evalLabels.js +287 -0
  156. package/dist-public/src/evalRecord.d.ts +68 -0
  157. package/dist-public/src/evalRecord.js +165 -0
  158. package/dist-public/src/evalRoast.d.ts +88 -0
  159. package/dist-public/src/evalRoast.js +249 -0
  160. package/dist-public/src/evidenceIntake.d.ts +66 -0
  161. package/dist-public/src/evidenceIntake.js +356 -0
  162. package/dist-public/src/feedback.d.ts +78 -0
  163. package/dist-public/src/feedback.js +294 -0
  164. package/dist-public/src/firefliesClient.d.ts +106 -0
  165. package/dist-public/src/firefliesClient.js +258 -0
  166. package/dist-public/src/firstMoveTensions.d.ts +10 -0
  167. package/dist-public/src/firstMoveTensions.js +93 -0
  168. package/dist-public/src/gitRun.d.ts +21 -0
  169. package/dist-public/src/gitRun.js +50 -0
  170. package/dist-public/src/githubReconcile.d.ts +94 -0
  171. package/dist-public/src/githubReconcile.js +205 -0
  172. package/dist-public/src/gmailNango.d.ts +131 -0
  173. package/dist-public/src/gmailNango.js +329 -0
  174. package/dist-public/src/gongNango.d.ts +118 -0
  175. package/dist-public/src/gongNango.js +308 -0
  176. package/dist-public/src/grammarGate.d.ts +13 -0
  177. package/dist-public/src/grammarGate.js +72 -0
  178. package/dist-public/src/harnessGates.d.ts +65 -0
  179. package/dist-public/src/harnessGates.js +168 -0
  180. package/dist-public/src/humanSurfaceEval.d.ts +19 -0
  181. package/dist-public/src/humanSurfaceEval.js +156 -0
  182. package/dist-public/src/ideate.d.ts +43 -0
  183. package/dist-public/src/ideate.js +255 -0
  184. package/dist-public/src/ideateContext.d.ts +11 -0
  185. package/dist-public/src/ideateContext.js +83 -0
  186. package/dist-public/src/index.d.ts +2 -0
  187. package/dist-public/src/index.js +4 -0
  188. package/dist-public/src/initCommand.d.ts +25 -0
  189. package/dist-public/src/initCommand.js +558 -0
  190. package/dist-public/src/interviewGate.d.ts +25 -0
  191. package/dist-public/src/interviewGate.js +126 -0
  192. package/dist-public/src/jsonFile.d.ts +2 -0
  193. package/dist-public/src/jsonFile.js +22 -0
  194. package/dist-public/src/loopBudget.d.ts +182 -0
  195. package/dist-public/src/loopBudget.js +494 -0
  196. package/dist-public/src/loopContracts.d.ts +35 -0
  197. package/dist-public/src/loopContracts.js +364 -0
  198. package/dist-public/src/machineState.d.ts +1 -0
  199. package/dist-public/src/machineState.js +9 -0
  200. package/dist-public/src/notionNango.d.ts +93 -0
  201. package/dist-public/src/notionNango.js +279 -0
  202. package/dist-public/src/orchestrationResult.d.ts +11 -0
  203. package/dist-public/src/orchestrationResult.js +73 -0
  204. package/dist-public/src/outlookNango.d.ts +124 -0
  205. package/dist-public/src/outlookNango.js +327 -0
  206. package/dist-public/src/packetCorrections.d.ts +40 -0
  207. package/dist-public/src/packetCorrections.js +172 -0
  208. package/dist-public/src/packetGlossary.d.ts +6 -0
  209. package/dist-public/src/packetGlossary.js +42 -0
  210. package/dist-public/src/packetIndex.d.ts +54 -0
  211. package/dist-public/src/packetIndex.js +744 -0
  212. package/dist-public/src/packetIndexEntry.d.ts +3 -0
  213. package/dist-public/src/packetIndexEntry.js +128 -0
  214. package/dist-public/src/packetIndexServe.d.ts +13 -0
  215. package/dist-public/src/packetIndexServe.js +113 -0
  216. package/dist-public/src/packetIndexWorker.d.ts +7 -0
  217. package/dist-public/src/packetIndexWorker.js +45 -0
  218. package/dist-public/src/packetLifecycle.d.ts +30 -0
  219. package/dist-public/src/packetLifecycle.js +127 -0
  220. package/dist-public/src/packetReconcile.d.ts +73 -0
  221. package/dist-public/src/packetReconcile.js +386 -0
  222. package/dist-public/src/packetStatus.d.ts +125 -0
  223. package/dist-public/src/packetStatus.js +770 -0
  224. package/dist-public/src/packetValidation.d.ts +17 -0
  225. package/dist-public/src/packetValidation.js +333 -0
  226. package/dist-public/src/packetVerify.d.ts +73 -0
  227. package/dist-public/src/packetVerify.js +303 -0
  228. package/dist-public/src/packetWrite.d.ts +52 -0
  229. package/dist-public/src/packetWrite.js +448 -0
  230. package/dist-public/src/pitch.d.ts +38 -0
  231. package/dist-public/src/pitch.js +154 -0
  232. package/dist-public/src/processMemo.d.ts +8 -0
  233. package/dist-public/src/processMemo.js +23 -0
  234. package/dist-public/src/productDetect.d.ts +30 -0
  235. package/dist-public/src/productDetect.js +376 -0
  236. package/dist-public/src/profile.d.ts +62 -0
  237. package/dist-public/src/profile.js +334 -0
  238. package/dist-public/src/questionModel.d.ts +46 -0
  239. package/dist-public/src/questionModel.js +74 -0
  240. package/dist-public/src/questionText.d.ts +7 -0
  241. package/dist-public/src/questionText.js +38 -0
  242. package/dist-public/src/redactConfig.d.ts +2 -0
  243. package/dist-public/src/redactConfig.js +11 -0
  244. package/dist-public/src/redactEngine.d.ts +59 -0
  245. package/dist-public/src/redactEngine.js +509 -0
  246. package/dist-public/src/redactGate.d.ts +63 -0
  247. package/dist-public/src/redactGate.js +209 -0
  248. package/dist-public/src/repoRead.d.ts +29 -0
  249. package/dist-public/src/repoRead.js +160 -0
  250. package/dist-public/src/research.d.ts +242 -0
  251. package/dist-public/src/research.js +1314 -0
  252. package/dist-public/src/researchCompletion.d.ts +34 -0
  253. package/dist-public/src/researchCompletion.js +123 -0
  254. package/dist-public/src/researchExecution.d.ts +47 -0
  255. package/dist-public/src/researchExecution.js +309 -0
  256. package/dist-public/src/researchFormat.d.ts +21 -0
  257. package/dist-public/src/researchFormat.js +77 -0
  258. package/dist-public/src/researchGate.d.ts +86 -0
  259. package/dist-public/src/researchGate.js +1036 -0
  260. package/dist-public/src/researchReceipt.d.ts +76 -0
  261. package/dist-public/src/researchReceipt.js +148 -0
  262. package/dist-public/src/researchRender.d.ts +2 -0
  263. package/dist-public/src/researchRender.js +267 -0
  264. package/dist-public/src/researchSigningKey.d.ts +19 -0
  265. package/dist-public/src/researchSigningKey.js +95 -0
  266. package/dist-public/src/riskClassify.d.ts +42 -0
  267. package/dist-public/src/riskClassify.js +149 -0
  268. package/dist-public/src/routines.d.ts +42 -0
  269. package/dist-public/src/routines.js +269 -0
  270. package/dist-public/src/routingPolicy.d.ts +172 -0
  271. package/dist-public/src/routingPolicy.js +646 -0
  272. package/dist-public/src/secretInput.d.ts +8 -0
  273. package/dist-public/src/secretInput.js +89 -0
  274. package/dist-public/src/selfCheck.d.ts +7 -0
  275. package/dist-public/src/selfCheck.js +473 -0
  276. package/dist-public/src/selfCheckCache.d.ts +29 -0
  277. package/dist-public/src/selfCheckCache.js +147 -0
  278. package/dist-public/src/severityClass.d.ts +15 -0
  279. package/dist-public/src/severityClass.js +22 -0
  280. package/dist-public/src/skillClientPolicy.d.ts +8 -0
  281. package/dist-public/src/skillClientPolicy.js +16 -0
  282. package/dist-public/src/skillLocal.d.ts +98 -0
  283. package/dist-public/src/skillLocal.js +463 -0
  284. package/dist-public/src/skillTreeDigest.d.ts +9 -0
  285. package/dist-public/src/skillTreeDigest.js +64 -0
  286. package/dist-public/src/slackNango.d.ts +62 -0
  287. package/dist-public/src/slackNango.js +208 -0
  288. package/dist-public/src/social/arxiv.d.ts +19 -0
  289. package/dist-public/src/social/arxiv.js +96 -0
  290. package/dist-public/src/social/github.d.ts +2 -0
  291. package/dist-public/src/social/github.js +78 -0
  292. package/dist-public/src/social/hackernews.d.ts +2 -0
  293. package/dist-public/src/social/hackernews.js +67 -0
  294. package/dist-public/src/social/index.d.ts +10 -0
  295. package/dist-public/src/social/index.js +79 -0
  296. package/dist-public/src/social/reddit.d.ts +2 -0
  297. package/dist-public/src/social/reddit.js +125 -0
  298. package/dist-public/src/social/types.d.ts +73 -0
  299. package/dist-public/src/social/types.js +61 -0
  300. package/dist-public/src/social/xml.d.ts +10 -0
  301. package/dist-public/src/social/xml.js +49 -0
  302. package/dist-public/src/social/youtube.d.ts +7 -0
  303. package/dist-public/src/social/youtube.js +217 -0
  304. package/dist-public/src/sourceIngress.d.ts +488 -0
  305. package/dist-public/src/sourceIngress.js +1651 -0
  306. package/dist-public/src/specAfter.d.ts +187 -0
  307. package/dist-public/src/specAfter.js +814 -0
  308. package/dist-public/src/specBudget.d.ts +124 -0
  309. package/dist-public/src/specBudget.js +424 -0
  310. package/dist-public/src/specDecisionSignals.d.ts +38 -0
  311. package/dist-public/src/specDecisionSignals.js +121 -0
  312. package/dist-public/src/specLinkedCommits.d.ts +7 -0
  313. package/dist-public/src/specLinkedCommits.js +107 -0
  314. package/dist-public/src/specSections.d.ts +105 -0
  315. package/dist-public/src/specSections.js +718 -0
  316. package/dist-public/src/statusGlyphs.d.ts +18 -0
  317. package/dist-public/src/statusGlyphs.js +75 -0
  318. package/dist-public/src/swarmCommand.d.ts +10 -0
  319. package/dist-public/src/swarmCommand.js +96 -0
  320. package/dist-public/src/teamsNango.d.ts +114 -0
  321. package/dist-public/src/teamsNango.js +301 -0
  322. package/dist-public/src/tokenStore.d.ts +10 -0
  323. package/dist-public/src/tokenStore.js +77 -0
  324. package/dist-public/src/trustEnvelope.d.ts +78 -0
  325. package/dist-public/src/trustEnvelope.js +392 -0
  326. package/dist-public/src/untrustedText.d.ts +6 -0
  327. package/dist-public/src/untrustedText.js +20 -0
  328. package/dist-public/src/updateNotice.d.ts +41 -0
  329. package/dist-public/src/updateNotice.js +290 -0
  330. package/dist-public/src/vendorYaml.d.ts +1 -0
  331. package/dist-public/src/vendorYaml.js +7374 -0
  332. package/dist-public/src/workflowRunActuals.d.ts +67 -0
  333. package/dist-public/src/workflowRunActuals.js +184 -0
  334. package/dist-public/src/zendeskDiscovery.d.ts +12 -0
  335. package/dist-public/src/zendeskDiscovery.js +513 -0
  336. package/dist-public/src/zendeskNango.d.ts +131 -0
  337. package/dist-public/src/zendeskNango.js +344 -0
  338. package/dist-public/src/zoomNango.d.ts +106 -0
  339. package/dist-public/src/zoomNango.js +351 -0
  340. package/docs/CHANGELOG.md +32 -0
  341. package/docs/THIRD_PARTY_NOTICES.md +36 -0
  342. package/package.json +71 -4
  343. package/schemas/bug-capsule-receipt.schema.json +54 -0
  344. package/schemas/bug-capsule.schema.json +189 -0
  345. package/schemas/discovery-evidence-envelope.schema.json +79 -0
  346. package/schemas/discovery-processing-receipt.schema.json +71 -0
  347. package/schemas/discovery-service-contract.schema.json +189 -0
  348. package/skills/AGENTS.md +32 -0
  349. package/skills/README.md +287 -0
  350. package/skills/bug/SKILL.md +49 -0
  351. package/skills/build-preview-spec/SKILL.md +103 -0
  352. package/skills/capture-external-artifact/SKILL.md +23 -0
  353. package/skills/capture-external-artifact/agents/openai.yaml +4 -0
  354. package/skills/capture-external-artifact/references/extractor-libraries.md +27 -0
  355. package/skills/check-spec-health/SKILL.md +45 -0
  356. package/skills/check-spec-health/agents/openai.yaml +4 -0
  357. package/skills/competitive-positioning/SKILL.md +86 -0
  358. package/skills/competitive-positioning/agents/openai.yaml +4 -0
  359. package/skills/cpo-lens/SKILL.md +398 -0
  360. package/skills/cpo-lens/agents/openai.yaml +4 -0
  361. package/skills/create-prd/SKILL.md +26 -0
  362. package/skills/create-prd/agents/openai.yaml +4 -0
  363. package/skills/customer-discovery/SKILL.md +192 -0
  364. package/skills/design-system/SKILL.md +49 -0
  365. package/skills/design-system/agents/openai.yaml +4 -0
  366. package/skills/discussion-guide/SKILL.md +75 -0
  367. package/skills/discussion-guide/agents/openai.yaml +4 -0
  368. package/skills/firecrawl-research-papers/SKILL.md +96 -0
  369. package/skills/firecrawl-research-papers/agents/openai.yaml +4 -0
  370. package/skills/foo-roast/SKILL.md +325 -0
  371. package/skills/generate-gtm-brief/SKILL.md +41 -0
  372. package/skills/generate-gtm-brief/agents/openai.yaml +4 -0
  373. package/skills/generate-gtm-brief/references/gtm-brief-template.md +56 -0
  374. package/skills/gong-quotes/SKILL.md +43 -0
  375. package/skills/gong-quotes/agents/openai.yaml +4 -0
  376. package/skills/grill-me/SKILL.md +27 -0
  377. package/skills/grill-me/agents/openai.yaml +4 -0
  378. package/skills/ideate/SKILL.md +180 -0
  379. package/skills/ideate/references/family-packs.md +5 -0
  380. package/skills/initiative-tracker/SKILL.md +23 -0
  381. package/skills/initiative-tracker/agents/openai.yaml +4 -0
  382. package/skills/interop-review/SKILL.md +25 -0
  383. package/skills/interop-review/agents/openai.yaml +4 -0
  384. package/skills/interview-me/SKILL.md +404 -0
  385. package/skills/interview-me/agents/openai.yaml +4 -0
  386. package/skills/loop-library-audit/SKILL.md +123 -0
  387. package/skills/pitch/SKILL.md +110 -0
  388. package/skills/pitch/references/opportunity-assessment.md +136 -0
  389. package/skills/pitch/references/prfaq-template.md +54 -0
  390. package/skills/pmm-release-briefing/SKILL.md +27 -0
  391. package/skills/pmm-release-briefing/agents/openai.yaml +4 -0
  392. package/skills/pmm-release-briefing/references/variant-generalized.md +16 -0
  393. package/skills/positioning-messaging/SKILL.md +70 -0
  394. package/skills/positioning-messaging/agents/openai.yaml +4 -0
  395. package/skills/positioning-messaging/references/guest-insights.md +1400 -0
  396. package/skills/preview-swarm/SKILL.md +418 -0
  397. package/skills/preview-swarm/agents/openai.yaml +4 -0
  398. package/skills/preview-swarm/references/html-effectiveness-build-previews.md +168 -0
  399. package/skills/product-copywriting/SKILL.md +127 -0
  400. package/skills/product-copywriting/agents/openai.yaml +4 -0
  401. package/skills/product-copywriting/references/foo-voice.md +26 -0
  402. package/skills/product-shape-interview/SKILL.md +219 -0
  403. package/skills/product-shape-interview/agents/openai.yaml +4 -0
  404. package/skills/ready-for-release/SKILL.md +39 -0
  405. package/skills/ready-for-release/agents/openai.yaml +4 -0
  406. package/skills/redact-transcripts/SKILL.md +23 -0
  407. package/skills/redact-transcripts/agents/openai.yaml +4 -0
  408. package/skills/research-brief/SKILL.md +48 -0
  409. package/skills/research-brief/agents/openai.yaml +4 -0
  410. package/skills/research-refresh/SKILL.md +63 -0
  411. package/skills/research-refresh/references/worked-cases.md +44 -0
  412. package/skills/review-loop/SKILL.md +200 -0
  413. package/skills/review-spec/SKILL.md +32 -0
  414. package/skills/review-spec/agents/openai.yaml +4 -0
  415. package/skills/rfc-from-research/SKILL.md +42 -0
  416. package/skills/rfc-from-research/agents/openai.yaml +4 -0
  417. package/skills/rfc-from-research/references/rfc-pattern.md +69 -0
  418. package/skills/skill-registry.yaml +810 -0
  419. package/skills/spec-cleanup/SKILL.md +103 -0
  420. package/skills/spec-cleanup/agents/openai.yaml +4 -0
  421. package/skills/spec-swarm/SKILL.md +87 -0
  422. package/skills/spec-swarm/agents/openai.yaml +4 -0
  423. package/skills/spec-swarm/template/SKILL.template.md +94 -0
  424. package/skills/spec-swarm/template/personas/accessibility-inclusion.md +40 -0
  425. package/skills/spec-swarm/template/personas/ai-technical-pm.md +69 -0
  426. package/skills/spec-swarm/template/personas/analytics-engineering.md +39 -0
  427. package/skills/spec-swarm/template/personas/applied-ai-eval.md +64 -0
  428. package/skills/spec-swarm/template/personas/business-gm-pm.md +67 -0
  429. package/skills/spec-swarm/template/personas/consumer-craft-pm.md +68 -0
  430. package/skills/spec-swarm/template/personas/content-design.md +40 -0
  431. package/skills/spec-swarm/template/personas/cpo.md +42 -0
  432. package/skills/spec-swarm/template/personas/data-science.md +42 -0
  433. package/skills/spec-swarm/template/personas/developer-experience.md +65 -0
  434. package/skills/spec-swarm/template/personas/dx-product.md +70 -0
  435. package/skills/spec-swarm/template/personas/field.md +43 -0
  436. package/skills/spec-swarm/template/personas/finance-cfo.md +40 -0
  437. package/skills/spec-swarm/template/personas/growth-pm.md +67 -0
  438. package/skills/spec-swarm/template/personas/platform-pm.md +67 -0
  439. package/skills/spec-swarm/template/personas/pmm.md +43 -0
  440. package/skills/spec-swarm/template/personas/principal-product-designer.md +42 -0
  441. package/skills/spec-swarm/template/personas/product-ops-program.md +41 -0
  442. package/skills/spec-swarm/template/personas/qa-release.md +41 -0
  443. package/skills/spec-swarm/template/personas/responsible-ai-safety.md +64 -0
  444. package/skills/spec-swarm/template/personas/security-privacy-legal.md +40 -0
  445. package/skills/spec-swarm/template/personas/strategy-competitive.md +41 -0
  446. package/skills/spec-swarm/template/personas/technical-architect.md +42 -0
  447. package/skills/spec-swarm/template/personas/technical-lead.md +43 -0
  448. package/skills/spec-swarm/template/personas/user-research.md +41 -0
  449. package/skills/spec-swarm-accessibility-inclusion/SKILL.md +95 -0
  450. package/skills/spec-swarm-accessibility-inclusion/agents/openai.yaml +4 -0
  451. package/skills/spec-swarm-ai-technical-pm/SKILL.md +124 -0
  452. package/skills/spec-swarm-analytics-engineering/SKILL.md +94 -0
  453. package/skills/spec-swarm-analytics-engineering/agents/openai.yaml +4 -0
  454. package/skills/spec-swarm-applied-ai-eval/SKILL.md +120 -0
  455. package/skills/spec-swarm-business-gm-pm/SKILL.md +122 -0
  456. package/skills/spec-swarm-consumer-craft-pm/SKILL.md +122 -0
  457. package/skills/spec-swarm-content-design/SKILL.md +95 -0
  458. package/skills/spec-swarm-content-design/agents/openai.yaml +4 -0
  459. package/skills/spec-swarm-cpo/SKILL.md +94 -0
  460. package/skills/spec-swarm-cpo/agents/openai.yaml +4 -0
  461. package/skills/spec-swarm-data-science/SKILL.md +95 -0
  462. package/skills/spec-swarm-data-science/agents/openai.yaml +4 -0
  463. package/skills/spec-swarm-developer-experience/SKILL.md +121 -0
  464. package/skills/spec-swarm-dx-product/SKILL.md +126 -0
  465. package/skills/spec-swarm-field/SKILL.md +96 -0
  466. package/skills/spec-swarm-field/agents/openai.yaml +4 -0
  467. package/skills/spec-swarm-finance-cfo/SKILL.md +95 -0
  468. package/skills/spec-swarm-finance-cfo/agents/openai.yaml +4 -0
  469. package/skills/spec-swarm-growth-pm/SKILL.md +122 -0
  470. package/skills/spec-swarm-platform-pm/SKILL.md +122 -0
  471. package/skills/spec-swarm-pmm/SKILL.md +96 -0
  472. package/skills/spec-swarm-pmm/agents/openai.yaml +4 -0
  473. package/skills/spec-swarm-principal-product-designer/SKILL.md +95 -0
  474. package/skills/spec-swarm-principal-product-designer/agents/openai.yaml +4 -0
  475. package/skills/spec-swarm-product-ops-program/SKILL.md +96 -0
  476. package/skills/spec-swarm-product-ops-program/agents/openai.yaml +4 -0
  477. package/skills/spec-swarm-qa-release/SKILL.md +96 -0
  478. package/skills/spec-swarm-qa-release/agents/openai.yaml +4 -0
  479. package/skills/spec-swarm-responsible-ai-safety/SKILL.md +120 -0
  480. package/skills/spec-swarm-security-privacy-legal/SKILL.md +95 -0
  481. package/skills/spec-swarm-security-privacy-legal/agents/openai.yaml +4 -0
  482. package/skills/spec-swarm-strategy-competitive/SKILL.md +96 -0
  483. package/skills/spec-swarm-strategy-competitive/agents/openai.yaml +4 -0
  484. package/skills/spec-swarm-technical-architect/SKILL.md +95 -0
  485. package/skills/spec-swarm-technical-architect/agents/openai.yaml +4 -0
  486. package/skills/spec-swarm-technical-lead/SKILL.md +96 -0
  487. package/skills/spec-swarm-technical-lead/agents/openai.yaml +4 -0
  488. package/skills/spec-swarm-user-research/SKILL.md +95 -0
  489. package/skills/spec-swarm-user-research/agents/openai.yaml +4 -0
  490. package/skills/strategy-check/SKILL.md +170 -0
  491. package/skills/strategy-check/agents/openai.yaml +4 -0
  492. package/skills/study-digest/SKILL.md +41 -0
  493. package/skills/synthetic-customer/SKILL.md +68 -0
  494. package/skills/update-cli-spec/SKILL.md +69 -0
  495. package/skills/update-cli-spec/agents/openai.yaml +4 -0
  496. package/skills/voc-researcher/SKILL.md +45 -0
  497. package/skills/voc-researcher/agents/openai.yaml +4 -0
  498. package/skills-lock.json +35 -0
@@ -0,0 +1,5 @@
1
+ # Foo signed family packs v1
2
+
3
+ ```json foo-family-packs
4
+ {"family":"ideate","schema_version":"1","variants":{"deep:0":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","- F4 first-principles: TODO","- F5 second-order: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: deep — 5 reframes · 8 ideators · stress top 5 · 3 judge(s) + extra dissent round","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules — each with its why):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth — framing seeds different ideas, so it comes first."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL — persona labels alone are not independence; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after — panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted) — a near-dupe count you reached by reading is a guess wearing data's clothes, and a homogeneous pool is a finding, not a retry; render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name — the JSON is for machines and stays the appendix, never the lead."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff — more rounds entrench errors; no added ideator fan-out."," STRESS top 5 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner — dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing: a stress pass that leaves no trace is a stress pass that can be skipped); the strongest surviving objection and the runner-up go into the minority report, never voted away. Run one extra dissent round (deep)."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied — an N score with no named neighbor is a number wearing a measurement's clothes) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range — a pool judged 4-to-7 is a judge refusing to judge — and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there."," The meter is computed from those objects, never counted by hand — a near-dupe number a human eyeballed is worse than none, because every downstream reader treats it as measured.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects: a mechanism spent on disclaimers is a mechanism not spent on the idea, and forty restatements of the same guardrail are what a homogeneous pool is made of.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," ideator-4: frame=first-principles lens=design seed=32"," ideator-5: frame=second-order lens=gtm seed=39"," ideator-6: frame=analogy lens=data seed=46"," ideator-7: frame=inversion lens=user-research seed=53"," ideator-8: frame=how-might-we lens=platform seed=60"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 8 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"deep","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: deep","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":false,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"},"deep:1":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","- F4 first-principles: TODO","- F5 second-order: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: deep — 5 reframes · 8 ideators · stress top 5 · 3 judge(s) + extra dissent round","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after; panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted); render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff; no added ideator fan-out."," STRESS top 5 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner; dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing); the strongest surviving objection and the runner-up go into the minority report, never voted away. Run one extra dissent round (deep)."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range, and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," ideator-4: frame=first-principles lens=design seed=32"," ideator-5: frame=second-order lens=gtm seed=39"," ideator-6: frame=analogy lens=data seed=46"," ideator-7: frame=inversion lens=user-research seed=53"," ideator-8: frame=how-might-we lens=platform seed=60"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 8 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"deep","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: deep","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":true,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"},"fast:0":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: fast — 3 reframes · 3 ideators · stress top 1 · 1 judge(s)","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules — each with its why):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth — framing seeds different ideas, so it comes first."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL — persona labels alone are not independence; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after — panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted) — a near-dupe count you reached by reading is a guess wearing data's clothes, and a homogeneous pool is a finding, not a retry; render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name — the JSON is for machines and stays the appendix, never the lead."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff — more rounds entrench errors; no added ideator fan-out."," STRESS top 1 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner — dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing: a stress pass that leaves no trace is a stress pass that can be skipped); the strongest surviving objection and the runner-up go into the minority report, never voted away."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied — an N score with no named neighbor is a number wearing a measurement's clothes) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range — a pool judged 4-to-7 is a judge refusing to judge — and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there."," The meter is computed from those objects, never counted by hand — a near-dupe number a human eyeballed is worse than none, because every downstream reader treats it as measured.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects: a mechanism spent on disclaimers is a mechanism not spent on the idea, and forty restatements of the same guardrail are what a homogeneous pool is made of.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 3 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"fast","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: fast","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":false,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"},"fast:1":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: fast — 3 reframes · 3 ideators · stress top 1 · 1 judge(s)","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after; panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted); render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff; no added ideator fan-out."," STRESS top 1 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner; dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing); the strongest surviving objection and the runner-up go into the minority report, never voted away."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range, and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 3 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"fast","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: fast","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":true,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"},"standard:0":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","- F4 first-principles: TODO","- F5 second-order: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: standard — 5 reframes · 5 ideators · stress top 3 · 3 judge(s)","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules — each with its why):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth — framing seeds different ideas, so it comes first."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL — persona labels alone are not independence; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after — panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted) — a near-dupe count you reached by reading is a guess wearing data's clothes, and a homogeneous pool is a finding, not a retry; render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name — the JSON is for machines and stays the appendix, never the lead."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff — more rounds entrench errors; no added ideator fan-out."," STRESS top 3 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner — dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing: a stress pass that leaves no trace is a stress pass that can be skipped); the strongest surviving objection and the runner-up go into the minority report, never voted away."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied — an N score with no named neighbor is a number wearing a measurement's clothes) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range — a pool judged 4-to-7 is a judge refusing to judge — and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there."," The meter is computed from those objects, never counted by hand — a near-dupe number a human eyeballed is worse than none, because every downstream reader treats it as measured.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects: a mechanism spent on disclaimers is a mechanism not spent on the idea, and forty restatements of the same guardrail are what a homogeneous pool is made of.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," ideator-4: frame=first-principles lens=design seed=32"," ideator-5: frame=second-order lens=gtm seed=39"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 5 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"standard","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: standard","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":false,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"},"standard:1":{"banner":"── foo ▸ ideate ── ideas before specs ──","body":["","# The call","(CAPTURE renders `foo ideate result <record>` here: a decision in at most 600 words, its new contribution, prior work, conditional alternatives, and a first test. The rank and full pool below are backing evidence.)","","# Stack rank — surviving directions scored New / Useful / Feasible (1–10); exclusions retained","(CONVERGE + CAPTURE write this: Every cluster has a disposition and plain-English name. Every ranking table includes a `What this is` column immediately after `Direction`: one concrete sentence explaining who does or receives what, understandable without the idea's title, score, or rationale. Eligible directions carry N/U/F scores and placement reasons; clusters with no surviving idea are excluded with the refutation, never scored. Distinguish panel scores from the completion pass.)","","# Decision","pick: null","keep: []","maybe: []","cut: []","not_doing: []","nearest_existing: \"\"","cheapest_test: \"\"","minority_report: \"\"","what_would_change_our_mind: \"\"","handoff: \"foo spec \\\"<winning direction>\\\"\"","","# What moved the ranking (stress — findings must be able to change the outcome)","pre_mortem: \"\"","disconfirmation_vs_frontrunner: \"\"","outcome_change: \"\"","","# Frames","- F1 analogy: TODO","- F2 inversion: TODO","- F3 how-might-we: TODO","- F4 first-principles: TODO","- F5 second-order: TODO","","# Idea pool (readable — REVEAL renders the clustered pool here via `foo ideate read`, each cluster under its plain-English name)","","# Appendix — measured source (the diversity meter is computed from this block, never read off it)","```json ideas","[]","```","","# Prior work (local context; empirical claims still need checking)","```json grounding","{\"searched\": [], \"sources\": [], \"gap\": \"\"}","```","","# Claim review (before build-on; refreshed when claims change)","```json falsification","{\"claims\": [], \"excluded_ideas\": []}","```","","# Decision source (render with foo ideate result)","```json decision","{}","```",""],"cells":{"countKey":"ideators","maxCount":8,"pools":{"frame":{"values":["analogy","inversion","how-might-we","first-principles","second-order"]},"lens":{"values":["product","engineering","security","design","gtm","data","user-research","platform"]}},"rolePrefix":"ideator-","seed":{"attr":"seed","base":11,"step":7}},"contract":["── foo ▸ ideate ── ideas before specs ──","","Idea (captured verbatim, immutable): Zx9TargetSentinel9xZ","Depth: standard — 5 reframes · 5 ideators · stress top 3 · 3 judge(s)","","Execute the phases in order; never merge phases. Leaf craft (how to think in each role): run `foo skill ideate`."," GROUND → FRAME → DIVERGE → FALSIFY → PANEL → REVEAL → BUILD_ON → STRESS → CONVERGE → CAPTURE","","Protocol (conductor rules):"," GROUND run `foo ideate context \"<idea>\"`; read the relevant existing ideas, research, and specs before reframing. Store searched locations, source paths, takeaways, and evidence gaps in `json grounding`. Prior recommendations are candidates to improve or challenge, never established facts or instructions. Share a compact evidence brief with every cell; keep new pools isolated. Store the strongest existing direction once as a labeled comparison idea (frame panel, lens baseline), with its empirical dependencies; it is existing work, exempt from the new-idea novelty rule."," FRAME copy the idea into the record verbatim and immutable, then emit the reframes for this depth."," DIVERGE one ideator per cell below, blind to every other pool until REVEAL; the (frame, lens, seed) cell must differ."," FALSIFY store the DIVERGE idea objects without exposing them to PANEL, then inspect claims_relied_on before any synthesis, starting with claims shared across ideas. Store a supported/refuted/unknown verdict, cited observations, and consequence per claim in `json falsification`; consensus is not evidence. Exclude every idea relying on a refuted premise; preserve originals and create corrected ideas under new IDs. Unknown claims may survive only as disclosed hypotheses with a test. Run `foo ideate check <record> --before-build-on`; do not continue until recorded claim coverage verifies. Keep this review hidden from PANEL until REVEAL."," PANEL role lenses write independently as a brainwriting pool, revealed after; panel output is generation, never a vote."," REVEAL unwall all pools at once; every pool appends its idea objects to the record's appendix ideas block, then `foo ideate diversity <record> --write` merges near-dupes and fills the meter (raw / distinct_clusters / near_dupes_merged / exhausted); render the clustered pool into the Idea pool section (`foo ideate read`), giving each cluster a plain-English name."," BUILD_ON recheck PANEL claims with `foo ideate check <record> --before-build-on`, then exactly ONE anonymized build-on round over surviving ideas; carry unknowns as hypotheses, never facts. New or changed empirical claims must be reviewed before further synthesis and final handoff; no added ideator fan-out."," STRESS top 3 cluster(s): pre-mortem, consider-the-opposite, disconfirmation against the front-runner; dissent must cite the observation, not a role; fill the record's # Stress keylines (pre_mortem, disconfirmation_vs_frontrunner, outcome_change — what the pass changed, or exactly why nothing); the strongest surviving objection and the runner-up go into the minority report, never voted away."," CONVERGE score finalists NUF 1-10 with an asymmetry note and a competence tag; every finalist row also names `nearest existing: <thing it beats>` (\"none found locally\" must be said, never implied) and `cheapest test: <one-week falsification a person could start Monday>`; judges see clusters blind to authorship, score in BOTH orderings (inconsistent pairs are discarded and re-judged once), write the reason before the score, use the full 1-10 range, and never judge their own pool. Then a labeled completion pass scores remaining eligible clusters. A cluster with no surviving idea stays as an excluded row with its refutation and no score; ranking cannot restore it."," CAPTURE fill `json decision` and run `foo ideate check <record>`, then render `foo ideate result <record>` as # The call and the primary human answer (at most 600 words). Lead with one concrete recommendation, why it wins, what it adds to named prior work, confidence and assumptions; offer at most two alternatives with conditions for choosing them. Include the first experiment, effort, observable pass/fail criteria, strongest dissent, proposed scope cuts, and exact next action. Separate evidence-based exclusions from proposed not-doing choices; the human has not accepted the scope cuts. If all ideas fail, recommend a no-build or evidence-gathering decision with empty idea_ids; never force a winner. The complete stack rank and pool remain backing evidence. Copy decision.recommendation exactly into the front matter and keep it under ~60 words; human selection stays pending.","","Decision evidence (decisions-v2; one block each, in the backing record):"," json grounding: {\"searched\":[\"ideas/\",\"research/\",\"specs/\"],\"sources\":[{\"source\":\"path\",\"takeaway\":\"finding or earlier idea, with its uncertainty\"}],\"gap\":\"what is missing; say no relevant work found only after searching\"}. Empty sources are valid when none is relevant."," json falsification: {\"claims\":[{\"claim\":\"exact claims_relied_on text\",\"verdict\":\"supported|refuted|unknown\",\"evidence\":[{\"source\":\"file or approved citation\",\"observation\":\"what was actually observed\"}],\"consequence\":\"what changes or remains conditional\"}],\"excluded_ideas\":[\"refuted idea id\"]}. Review every stored empirical claim; evidence may be empty only for unknown. This check verifies coverage, not truth or chronology."," json decision: {\"recommendation\":\"concrete choice\",\"rationale\":\"why it beats the closest alternative\",\"new_contribution\":\"what becomes possible beyond the prior ideas\",\"builds_on\":[{\"source\":\"a grounding source path\",\"delta\":\"what is retained, changed, or rejected\"}],\"idea_ids\":[\"surviving source idea\"],\"assumptions\":[\"unresolved claims, copied exactly, plus the load-bearing bet\"],\"confidence\":{\"level\":\"low|medium|high\",\"reason\":\"evidence and limits\"},\"alternatives\":[{\"direction\":\"plain name\",\"choose_when\":\"specific switch condition\",\"idea_ids\":[\"surviving source idea\"]}],\"experiment\":{\"action\":\"smallest useful test\",\"effort\":\"time/cost bound\",\"pass\":\"observable success criterion\",\"fail\":\"stop or change-direction criterion\"},\"dissent\":\"strongest surviving objection\",\"not_doing\":[\"cut and why\"],\"next_action\":\"exact action or command for the human\"}. At most 2 alternatives and 3 builds_on references; cite only sources already read and recorded. An empty idea_ids is a deliberate no-build recommendation.","Use prior research as context until its empirical claims are checked. New web research uses foo research; connected-source approval rules still apply. Do not launch research automatically to fill a gap; unknown is a valid result.","","Required output shape — every ideator and panelist returns objects, never prose:"," {\"id\": \"i1\", \"claim\": \"one sentence\", \"frame\": \"<your frame>\", \"lens\": \"<your lens>\", \"reasoning\": \"the frame move, SHOWN — shapes below\", \"mechanism\": \"free text: how it works\", \"assumption\": \"the one load-bearing assumption\", \"novelty\": \"vs: <nearest existing or obvious approach> — <what this beats it on>\", \"claims_relied_on\": [\"empirical claim this rests on\"]}"," Append each object to the record's ideas block. `mechanism` is read by humans and never clustered on, so keep the nuance there.","","Frame execution (frames-v1, gated) — `reasoning` must SHOW the move; a frame label without its move is cosplay and fails `foo ideate check`:"," analogy `source-domain: <domain>` and `mechanism-stolen: <the mechanism>` — steal the mechanism, never the surface."," inversion `guarantee-failure: <ingredient>; <ingredient>; …` then `negated: <the negation this idea is>` — enumerate the failure first."," how-might-we `tension: <the tension>` and `answer: <why this answers the sharpest HMW>`."," first-principles `bedrock: <what must be true>` and `discarded-assumption: <the inherited default this rejects>`."," second-order `then-1: <first-order effect>` and `then-2: <what that causes next>`."," panel/build-on free text stating the move (never empty).","Novelty must be a useful difference: compare against the strongest existing idea or current workflow, name a changed mechanism and a concrete before/after example in mechanism. Reuse good earlier ideas; include a surprising alternative without treating novelty as an automatic win. Claims of research support belong in claims_relied_on and get checked.","Cell economics: each cell returns AT MOST 4 idea objects. Keep the existing-direction baseline as a comparison. For NEW candidates, your first instinct is the pool's most available idea — everyone else has it too, so discard generic restatements and return ideas whose `novelty` can honestly say what they beat (`vs: …`). Four ideas that survive that test beat ten that don't.","Constraints named in the idea are held ONCE, here at contract level — never restate consent, approval, or exclusion language inside idea objects.","","Engineered independence — one ideator per cell, hidden until REVEAL (R2):"," ideator-1: frame=analogy lens=product seed=11"," ideator-2: frame=inversion lens=engineering seed=18"," ideator-3: frame=how-might-we lens=security seed=25"," ideator-4: frame=first-principles lens=design seed=32"," ideator-5: frame=second-order lens=gtm seed=39"," Every cell reads local sources only — say exactly that in each spawn. These pools read this repo and the files already on disk; a cell that needs the open web is not an ideator, it is a research run, and it goes through `foo research`.","","Progress surface (what the USER sees WHILE ideators run — separate from the record above):"," Narrate the whole divergence as ONE foo status line, not a per-ideator agent tree — e.g. \"🔄 doing — exploring 5 independent idea directions\" while they run, then \"✋ needs your input — shortlist ready\" at the handoff. The ideator count and cell machinery are plumbing; productfoo feels simple only when plumbing stays invisible."," If your harness insists on surfacing agents separately, label EVERY agent — in EVERY phase (DIVERGE ideators, PANEL lenses, STRESS reviewers, CONVERGE judges) — as \"Explorer N\" with ONE running counter that never resets between phases, so no phase is distinguishable from another. The label is the NUMBER ALONE: never a frame, lens, seed, role, OR a stress/judging technique — never \"pre-mortem\", \"consider-the-opposite\", \"disconfirmation\", \"Stress: …\", \"Panel: …\", \"Judge: …\". Each agent's final line is a bare COUNT of what it produced — \"Done — 9 ideas\", \"Done — 3 findings\" — never the technique it ran. \"Explorer 1 inversion/product\", \"Stress: pre-mortem\", and \"Panel: reverse-engineering red team\" all leak the craft exactly as loudly as the raw slug did; a number with anything stapled to it is not anonymized."," WHICH frames and lenses foo pairs, which stress moves it runs against the front-runner, and how the cells are engineered for independence — ALL of it is the craft. A progress panel is the most screenshotted, most shared surface productfoo has; none of that design belongs in transient chrome."," Numbered in the RUNTIME, named in the RECORD. Anonymity buys secrecy in the chrome, never in the product: the frames, clusters, diversity meter, and minority report stay fully visible in the record, each attributed to its real cell. Never write \"Explorer 3\" into a report — a reader who did not watch the run cannot resolve a number back to an idea.","","If it goes wrong: homogeneous pool → vary frames (not seeds) for one regeneration, else record exhausted: true visibly; judge inconsistency → discard the pair, re-judge once, else log it unresolved in the minority report; no surviving dissent → run one extra disconfirmation pass before recording an empty minority report, and say so.","","Ideate record scaffolded: ideas/0000-00-00-zx9targetsentinel9xz.md"," Read that record before you fill it. productfoo's CLI wrote the file, not you — and a harness that guards blind overwrites refuses the first write to a file the session has never read, so filling it blind fails.","Verify before hand-off: foo ideate check ideas/0000-00-00-zx9targetsentinel9xz.md — fix named fields; never hand-edit the verdict; the record is the contract.","Boundary B4: allowed actions are frame/generate/cluster/critique/score — never ship, send, commit, or auto-promote.","The human picks the winner. Then: foo spec \"<winning direction>\"",""],"decider":"human","defaultDepth":"standard","depth":"standard","depths":{"deep":{"extra_dissent_round":true,"ideators":8,"judges":3,"reframes":5,"stress_on":5},"fast":{"extra_dissent_round":false,"ideators":3,"judges":1,"reframes":3,"stress_on":1},"standard":{"extra_dissent_round":false,"ideators":5,"judges":3,"reframes":5,"stress_on":3}},"family":"ideate","frontmatter":["---","recommendation: null","idea: \"Zx9TargetSentinel9xZ\"","depth: standard","decider: human","ideate_id: ideate-0000-00-00-zx9targetsentinel9xz","ideate_contract: decisions-v2","diversity: { raw: 0, distinct_clusters: 0, near_dupes_merged: 0, exhausted: false }","diversity_method: measured","---"],"gates":[{"check":"early-falsification","type":"ideate-falsification"},{"check":"actionable-decision","type":"ideate-decision"},{"check":"raw-idea","detail":"raw idea captured verbatim","failDetail":"idea missing from front matter","field":"idea","type":"frontmatter-present"},{"check":"depth","detail":"depth {value}","failDetail":"depth missing or invalid","field":"depth","pattern":"(fast|standard|deep)","type":"frontmatter-present"},{"check":"diversity-meter","floorCap":3,"floorKey":"ideators","type":"diversity-meter"},{"check":"diversity-provenance","type":"diversity-provenance"},{"check":"frame-execution","type":"frame-reasoning"},{"check":"stress-pre-mortem","detail":"stress: pre-mortem recorded","failDetail":"stress pre_mortem empty — the adversarial pass left no trace (#695)","field":"pre_mortem","type":"versioned-keyline"},{"check":"stress-disconfirmation","detail":"stress: disconfirmation vs front-runner recorded","failDetail":"disconfirmation_vs_frontrunner empty — nobody tried to kill the front-runner (#695)","field":"disconfirmation_vs_frontrunner","type":"versioned-keyline"},{"check":"stress-outcome","detail":"stress verdict recorded (what changed, or why nothing)","failDetail":"outcome_change empty — say what stress changed, or exactly why it changed nothing (#695)","field":"outcome_change","type":"versioned-keyline"},{"check":"novelty-anchor","detail":"novelty anchored: nearest existing thing named","failDetail":"nearest_existing empty — N is unanchored until the recommendation names what it beats; \"none found locally\" must be said (#698)","field":"nearest_existing","type":"versioned-keyline"},{"check":"cheapest-test","detail":"cheapest one-week falsification test recorded","failDetail":"cheapest_test empty — the recommendation has no one-week falsification a person could start Monday","field":"cheapest_test","type":"versioned-keyline"},{"check":"recommendation","detail":"recommendation takes a position","failDetail":"recommendation is null — the record must open with a stance: \"<winner>. <why>. Bet: <assumption>. Test: <Monday falsifier>.\"","field":"recommendation","type":"versioned-keyline"},{"check":"minority-report","detail":"dissent preserved","failDetail":"minority report empty — dissent was voted away (R5)","field":"minority_report","type":"frontmatter-nonempty"},{"check":"not-doing","detail":"explicit not-doing recorded","failDetail":"missing \"what we are NOT doing\" (R6)","field":"not_doing","type":"frontmatter-nonempty"},{"check":"human-decider","detail":"human is the Decider","expect":"human","failDetail":"decider must be human, found: ","field":"decider","type":"frontmatter-equals"},{"check":"falsifier","detail":"decision-journal falsifier present","failDetail":"missing \"what would change our mind\" (R7)","field":"what_would_change_our_mind","type":"frontmatter-nonempty"}],"handoff":"foo spec \"<winning direction>\"","lean":true,"phases":["GROUND","FRAME","DIVERGE","FALSIFY","PANEL","REVEAL","BUILD_ON","STRESS","CONVERGE","CAPTURE"],"recordDir":"ideas","skillRef":"ideate","tagline":"ideas before specs"}}}
5
+ ```
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: initiative-tracker
3
+ description: "Use when product initiatives need a status-digest outline but recurring collection or delivery would be required."
4
+ ---
5
+
6
+ # Product Initiative Tracker
7
+
8
+ ## Usage
9
+
10
+ **Product Initiative Tracker** is a draft that keeps its egress boundary.
11
+
12
+ It may organize explicit intent, repo facts, and approved sanitized evidence into
13
+ an in-chat or local outline: initiative, outcome, owner, state, proof, risk,
14
+ decision, and next action. It must not collect connected signals, schedule a run,
15
+ send an update, or mutate a tracker. Include **Sources used**, **Sources omitted**,
16
+ **Trust status**, and **Limits**.
17
+
18
+ ## Error Handling
19
+
20
+ - For recurring collection or delivery, return `status: blocked`, name what did
21
+ not run, identify the egress boundary, give `next action: review the local
22
+ outline and update the destination manually`, and set `exit: nonzero`.
23
+ - Do not turn missing status into “on track” or infer an owner from history.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Product Initiative Tracker"
3
+ short_description: "Draft a local initiative digest; scheduling and delivery stay blocked."
4
+ default_prompt: "Use $initiative-tracker for the relevant workflow."
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: interop-review
3
+ description: "Use when an interoperability decision needs a local review outline but copying results to an external system would be required."
4
+ ---
5
+
6
+ # Interoperability Review
7
+
8
+ ## Usage
9
+
10
+ This draft keeps its egress boundary. From explicit intent, repo facts, and
11
+ approved sanitized evidence, it may prepare an in-chat or local outline; it must
12
+ not fetch private guidelines, copy results, publish, or update another system.
13
+
14
+ Review protocol assumptions, versioning, identity, data mapping, failure modes,
15
+ security, compatibility, migration, observability, and ownership. Separate
16
+ verified facts from hypotheses and include **Sources used**, **Sources omitted**,
17
+ **Trust status**, and **Limits**.
18
+
19
+ ## Error Handling
20
+
21
+ - If the requested outcome requires an external read or write, return `status:
22
+ blocked`, name what did not run, identify the egress boundary, give the `next
23
+ action: provide approved sanitized evidence and review the local outline`, and
24
+ set `exit: nonzero`.
25
+ - Do not infer a partner contract, guideline, or compatibility guarantee.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Interop Review"
3
+ short_description: "Draft a local interoperability review; external transfer stays blocked."
4
+ default_prompt: "Use $interop-review for the relevant workflow."