@zigrivers/scaffold 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/commands/adopt.d.ts +12 -0
  4. package/dist/cli/commands/adopt.d.ts.map +1 -0
  5. package/dist/cli/commands/adopt.js +107 -0
  6. package/dist/cli/commands/adopt.js.map +1 -0
  7. package/dist/cli/commands/adopt.test.d.ts +2 -0
  8. package/dist/cli/commands/adopt.test.d.ts.map +1 -0
  9. package/dist/cli/commands/adopt.test.js +277 -0
  10. package/dist/cli/commands/adopt.test.js.map +1 -0
  11. package/dist/cli/commands/build.d.ts +12 -0
  12. package/dist/cli/commands/build.d.ts.map +1 -0
  13. package/dist/cli/commands/build.js +105 -0
  14. package/dist/cli/commands/build.js.map +1 -0
  15. package/dist/cli/commands/build.test.d.ts +2 -0
  16. package/dist/cli/commands/build.test.d.ts.map +1 -0
  17. package/dist/cli/commands/build.test.js +272 -0
  18. package/dist/cli/commands/build.test.js.map +1 -0
  19. package/dist/cli/commands/dashboard.d.ts +14 -0
  20. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  21. package/dist/cli/commands/dashboard.js +102 -0
  22. package/dist/cli/commands/dashboard.js.map +1 -0
  23. package/dist/cli/commands/dashboard.test.d.ts +2 -0
  24. package/dist/cli/commands/dashboard.test.d.ts.map +1 -0
  25. package/dist/cli/commands/dashboard.test.js +142 -0
  26. package/dist/cli/commands/dashboard.test.js.map +1 -0
  27. package/dist/cli/commands/decisions.d.ts +13 -0
  28. package/dist/cli/commands/decisions.d.ts.map +1 -0
  29. package/dist/cli/commands/decisions.js +62 -0
  30. package/dist/cli/commands/decisions.js.map +1 -0
  31. package/dist/cli/commands/decisions.test.d.ts +2 -0
  32. package/dist/cli/commands/decisions.test.d.ts.map +1 -0
  33. package/dist/cli/commands/decisions.test.js +154 -0
  34. package/dist/cli/commands/decisions.test.js.map +1 -0
  35. package/dist/cli/commands/info.d.ts +12 -0
  36. package/dist/cli/commands/info.d.ts.map +1 -0
  37. package/dist/cli/commands/info.js +110 -0
  38. package/dist/cli/commands/info.js.map +1 -0
  39. package/dist/cli/commands/info.test.d.ts +2 -0
  40. package/dist/cli/commands/info.test.d.ts.map +1 -0
  41. package/dist/cli/commands/info.test.js +392 -0
  42. package/dist/cli/commands/info.test.js.map +1 -0
  43. package/dist/cli/commands/init.d.ts +13 -0
  44. package/dist/cli/commands/init.d.ts.map +1 -0
  45. package/dist/cli/commands/init.js +46 -0
  46. package/dist/cli/commands/init.js.map +1 -0
  47. package/dist/cli/commands/init.test.d.ts +2 -0
  48. package/dist/cli/commands/init.test.d.ts.map +1 -0
  49. package/dist/cli/commands/init.test.js +156 -0
  50. package/dist/cli/commands/init.test.js.map +1 -0
  51. package/dist/cli/commands/knowledge.d.ts +4 -0
  52. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  53. package/dist/cli/commands/knowledge.js +346 -0
  54. package/dist/cli/commands/knowledge.js.map +1 -0
  55. package/dist/cli/commands/knowledge.test.d.ts +2 -0
  56. package/dist/cli/commands/knowledge.test.d.ts.map +1 -0
  57. package/dist/cli/commands/knowledge.test.js +293 -0
  58. package/dist/cli/commands/knowledge.test.js.map +1 -0
  59. package/dist/cli/commands/list.d.ts +12 -0
  60. package/dist/cli/commands/list.d.ts.map +1 -0
  61. package/dist/cli/commands/list.js +73 -0
  62. package/dist/cli/commands/list.js.map +1 -0
  63. package/dist/cli/commands/list.test.d.ts +2 -0
  64. package/dist/cli/commands/list.test.d.ts.map +1 -0
  65. package/dist/cli/commands/list.test.js +166 -0
  66. package/dist/cli/commands/list.test.js.map +1 -0
  67. package/dist/cli/commands/next.d.ts +12 -0
  68. package/dist/cli/commands/next.d.ts.map +1 -0
  69. package/dist/cli/commands/next.js +75 -0
  70. package/dist/cli/commands/next.js.map +1 -0
  71. package/dist/cli/commands/next.test.d.ts +2 -0
  72. package/dist/cli/commands/next.test.d.ts.map +1 -0
  73. package/dist/cli/commands/next.test.js +236 -0
  74. package/dist/cli/commands/next.test.js.map +1 -0
  75. package/dist/cli/commands/reset.d.ts +13 -0
  76. package/dist/cli/commands/reset.d.ts.map +1 -0
  77. package/dist/cli/commands/reset.js +105 -0
  78. package/dist/cli/commands/reset.js.map +1 -0
  79. package/dist/cli/commands/reset.test.d.ts +2 -0
  80. package/dist/cli/commands/reset.test.d.ts.map +1 -0
  81. package/dist/cli/commands/reset.test.js +211 -0
  82. package/dist/cli/commands/reset.test.js.map +1 -0
  83. package/dist/cli/commands/run.d.ts +14 -0
  84. package/dist/cli/commands/run.d.ts.map +1 -0
  85. package/dist/cli/commands/run.js +379 -0
  86. package/dist/cli/commands/run.js.map +1 -0
  87. package/dist/cli/commands/run.test.d.ts +2 -0
  88. package/dist/cli/commands/run.test.d.ts.map +1 -0
  89. package/dist/cli/commands/run.test.js +535 -0
  90. package/dist/cli/commands/run.test.js.map +1 -0
  91. package/dist/cli/commands/skip.d.ts +13 -0
  92. package/dist/cli/commands/skip.d.ts.map +1 -0
  93. package/dist/cli/commands/skip.js +123 -0
  94. package/dist/cli/commands/skip.js.map +1 -0
  95. package/dist/cli/commands/skip.test.d.ts +2 -0
  96. package/dist/cli/commands/skip.test.d.ts.map +1 -0
  97. package/dist/cli/commands/skip.test.js +339 -0
  98. package/dist/cli/commands/skip.test.js.map +1 -0
  99. package/dist/cli/commands/status.d.ts +12 -0
  100. package/dist/cli/commands/status.d.ts.map +1 -0
  101. package/dist/cli/commands/status.js +79 -0
  102. package/dist/cli/commands/status.js.map +1 -0
  103. package/dist/cli/commands/status.test.d.ts +2 -0
  104. package/dist/cli/commands/status.test.d.ts.map +1 -0
  105. package/dist/cli/commands/status.test.js +245 -0
  106. package/dist/cli/commands/status.test.js.map +1 -0
  107. package/dist/cli/commands/update.d.ts +11 -0
  108. package/dist/cli/commands/update.d.ts.map +1 -0
  109. package/dist/cli/commands/update.js +159 -0
  110. package/dist/cli/commands/update.js.map +1 -0
  111. package/dist/cli/commands/update.test.d.ts +2 -0
  112. package/dist/cli/commands/update.test.d.ts.map +1 -0
  113. package/dist/cli/commands/update.test.js +140 -0
  114. package/dist/cli/commands/update.test.js.map +1 -0
  115. package/dist/cli/commands/validate.d.ts +12 -0
  116. package/dist/cli/commands/validate.d.ts.map +1 -0
  117. package/dist/cli/commands/validate.js +65 -0
  118. package/dist/cli/commands/validate.js.map +1 -0
  119. package/dist/cli/commands/validate.test.d.ts +2 -0
  120. package/dist/cli/commands/validate.test.d.ts.map +1 -0
  121. package/dist/cli/commands/validate.test.js +159 -0
  122. package/dist/cli/commands/validate.test.js.map +1 -0
  123. package/dist/cli/commands/version.d.ts +13 -0
  124. package/dist/cli/commands/version.d.ts.map +1 -0
  125. package/dist/cli/commands/version.js +89 -0
  126. package/dist/cli/commands/version.js.map +1 -0
  127. package/dist/cli/commands/version.test.d.ts +2 -0
  128. package/dist/cli/commands/version.test.d.ts.map +1 -0
  129. package/dist/cli/commands/version.test.js +63 -0
  130. package/dist/cli/commands/version.test.js.map +1 -0
  131. package/dist/cli/index.d.ts +4 -0
  132. package/dist/cli/index.d.ts.map +1 -0
  133. package/dist/cli/index.js +72 -0
  134. package/dist/cli/index.js.map +1 -0
  135. package/dist/cli/index.test.d.ts +2 -0
  136. package/dist/cli/index.test.d.ts.map +1 -0
  137. package/dist/cli/index.test.js +8 -0
  138. package/dist/cli/index.test.js.map +1 -0
  139. package/dist/cli/middleware/output-mode.d.ts +21 -0
  140. package/dist/cli/middleware/output-mode.d.ts.map +1 -0
  141. package/dist/cli/middleware/output-mode.js +27 -0
  142. package/dist/cli/middleware/output-mode.js.map +1 -0
  143. package/dist/cli/middleware/output-mode.test.d.ts +2 -0
  144. package/dist/cli/middleware/output-mode.test.d.ts.map +1 -0
  145. package/dist/cli/middleware/output-mode.test.js +41 -0
  146. package/dist/cli/middleware/output-mode.test.js.map +1 -0
  147. package/dist/cli/middleware/project-root.d.ts +21 -0
  148. package/dist/cli/middleware/project-root.d.ts.map +1 -0
  149. package/dist/cli/middleware/project-root.js +54 -0
  150. package/dist/cli/middleware/project-root.js.map +1 -0
  151. package/dist/cli/middleware/project-root.test.d.ts +2 -0
  152. package/dist/cli/middleware/project-root.test.d.ts.map +1 -0
  153. package/dist/cli/middleware/project-root.test.js +112 -0
  154. package/dist/cli/middleware/project-root.test.js.map +1 -0
  155. package/dist/cli/output/auto.d.ts +18 -0
  156. package/dist/cli/output/auto.d.ts.map +1 -0
  157. package/dist/cli/output/auto.js +43 -0
  158. package/dist/cli/output/auto.js.map +1 -0
  159. package/dist/cli/output/context.d.ts +19 -0
  160. package/dist/cli/output/context.d.ts.map +1 -0
  161. package/dist/cli/output/context.js +15 -0
  162. package/dist/cli/output/context.js.map +1 -0
  163. package/dist/cli/output/context.test.d.ts +2 -0
  164. package/dist/cli/output/context.test.d.ts.map +1 -0
  165. package/dist/cli/output/context.test.js +335 -0
  166. package/dist/cli/output/context.test.js.map +1 -0
  167. package/dist/cli/output/error-display.d.ts +31 -0
  168. package/dist/cli/output/error-display.d.ts.map +1 -0
  169. package/dist/cli/output/error-display.js +79 -0
  170. package/dist/cli/output/error-display.js.map +1 -0
  171. package/dist/cli/output/error-display.test.d.ts +2 -0
  172. package/dist/cli/output/error-display.test.d.ts.map +1 -0
  173. package/dist/cli/output/error-display.test.js +230 -0
  174. package/dist/cli/output/error-display.test.js.map +1 -0
  175. package/dist/cli/output/interactive.d.ts +22 -0
  176. package/dist/cli/output/interactive.d.ts.map +1 -0
  177. package/dist/cli/output/interactive.js +126 -0
  178. package/dist/cli/output/interactive.js.map +1 -0
  179. package/dist/cli/output/json.d.ts +17 -0
  180. package/dist/cli/output/json.d.ts.map +1 -0
  181. package/dist/cli/output/json.js +62 -0
  182. package/dist/cli/output/json.js.map +1 -0
  183. package/dist/cli/types.d.ts +11 -0
  184. package/dist/cli/types.d.ts.map +1 -0
  185. package/dist/cli/types.js +2 -0
  186. package/dist/cli/types.js.map +1 -0
  187. package/dist/config/loader.d.ts +22 -0
  188. package/dist/config/loader.d.ts.map +1 -0
  189. package/dist/config/loader.js +159 -0
  190. package/dist/config/loader.js.map +1 -0
  191. package/dist/config/loader.test.d.ts +2 -0
  192. package/dist/config/loader.test.d.ts.map +1 -0
  193. package/dist/config/loader.test.js +226 -0
  194. package/dist/config/loader.test.js.map +1 -0
  195. package/dist/config/migration.d.ts +15 -0
  196. package/dist/config/migration.d.ts.map +1 -0
  197. package/dist/config/migration.js +39 -0
  198. package/dist/config/migration.js.map +1 -0
  199. package/dist/config/migration.test.d.ts +2 -0
  200. package/dist/config/migration.test.d.ts.map +1 -0
  201. package/dist/config/migration.test.js +44 -0
  202. package/dist/config/migration.test.js.map +1 -0
  203. package/dist/config/schema.d.ts +121 -0
  204. package/dist/config/schema.d.ts.map +1 -0
  205. package/dist/config/schema.js +22 -0
  206. package/dist/config/schema.js.map +1 -0
  207. package/dist/config/schema.test.d.ts +2 -0
  208. package/dist/config/schema.test.d.ts.map +1 -0
  209. package/dist/config/schema.test.js +126 -0
  210. package/dist/config/schema.test.js.map +1 -0
  211. package/dist/core/adapters/adapter.d.ts +64 -0
  212. package/dist/core/adapters/adapter.d.ts.map +1 -0
  213. package/dist/core/adapters/adapter.js +25 -0
  214. package/dist/core/adapters/adapter.js.map +1 -0
  215. package/dist/core/adapters/adapter.test.d.ts +2 -0
  216. package/dist/core/adapters/adapter.test.d.ts.map +1 -0
  217. package/dist/core/adapters/adapter.test.js +175 -0
  218. package/dist/core/adapters/adapter.test.js.map +1 -0
  219. package/dist/core/adapters/claude-code.d.ts +9 -0
  220. package/dist/core/adapters/claude-code.d.ts.map +1 -0
  221. package/dist/core/adapters/claude-code.js +34 -0
  222. package/dist/core/adapters/claude-code.js.map +1 -0
  223. package/dist/core/adapters/claude-code.test.d.ts +2 -0
  224. package/dist/core/adapters/claude-code.test.d.ts.map +1 -0
  225. package/dist/core/adapters/claude-code.test.js +100 -0
  226. package/dist/core/adapters/claude-code.test.js.map +1 -0
  227. package/dist/core/adapters/codex.d.ts +10 -0
  228. package/dist/core/adapters/codex.d.ts.map +1 -0
  229. package/dist/core/adapters/codex.js +61 -0
  230. package/dist/core/adapters/codex.js.map +1 -0
  231. package/dist/core/adapters/codex.test.d.ts +2 -0
  232. package/dist/core/adapters/codex.test.d.ts.map +1 -0
  233. package/dist/core/adapters/codex.test.js +122 -0
  234. package/dist/core/adapters/codex.test.js.map +1 -0
  235. package/dist/core/adapters/universal.d.ts +10 -0
  236. package/dist/core/adapters/universal.d.ts.map +1 -0
  237. package/dist/core/adapters/universal.js +45 -0
  238. package/dist/core/adapters/universal.js.map +1 -0
  239. package/dist/core/adapters/universal.test.d.ts +2 -0
  240. package/dist/core/adapters/universal.test.d.ts.map +1 -0
  241. package/dist/core/adapters/universal.test.js +121 -0
  242. package/dist/core/adapters/universal.test.js.map +1 -0
  243. package/dist/core/assembly/context-gatherer.d.ts +17 -0
  244. package/dist/core/assembly/context-gatherer.d.ts.map +1 -0
  245. package/dist/core/assembly/context-gatherer.js +49 -0
  246. package/dist/core/assembly/context-gatherer.js.map +1 -0
  247. package/dist/core/assembly/context-gatherer.test.d.ts +2 -0
  248. package/dist/core/assembly/context-gatherer.test.d.ts.map +1 -0
  249. package/dist/core/assembly/context-gatherer.test.js +252 -0
  250. package/dist/core/assembly/context-gatherer.test.js.map +1 -0
  251. package/dist/core/assembly/depth-resolver.d.ts +11 -0
  252. package/dist/core/assembly/depth-resolver.d.ts.map +1 -0
  253. package/dist/core/assembly/depth-resolver.js +23 -0
  254. package/dist/core/assembly/depth-resolver.js.map +1 -0
  255. package/dist/core/assembly/depth-resolver.test.d.ts +2 -0
  256. package/dist/core/assembly/depth-resolver.test.d.ts.map +1 -0
  257. package/dist/core/assembly/depth-resolver.test.js +100 -0
  258. package/dist/core/assembly/depth-resolver.test.js.map +1 -0
  259. package/dist/core/assembly/engine.d.ts +22 -0
  260. package/dist/core/assembly/engine.d.ts.map +1 -0
  261. package/dist/core/assembly/engine.js +215 -0
  262. package/dist/core/assembly/engine.js.map +1 -0
  263. package/dist/core/assembly/engine.test.d.ts +2 -0
  264. package/dist/core/assembly/engine.test.d.ts.map +1 -0
  265. package/dist/core/assembly/engine.test.js +462 -0
  266. package/dist/core/assembly/engine.test.js.map +1 -0
  267. package/dist/core/assembly/instruction-loader.d.ts +16 -0
  268. package/dist/core/assembly/instruction-loader.d.ts.map +1 -0
  269. package/dist/core/assembly/instruction-loader.js +40 -0
  270. package/dist/core/assembly/instruction-loader.js.map +1 -0
  271. package/dist/core/assembly/instruction-loader.test.d.ts +2 -0
  272. package/dist/core/assembly/instruction-loader.test.d.ts.map +1 -0
  273. package/dist/core/assembly/instruction-loader.test.js +109 -0
  274. package/dist/core/assembly/instruction-loader.test.js.map +1 -0
  275. package/dist/core/assembly/knowledge-loader.d.ts +34 -0
  276. package/dist/core/assembly/knowledge-loader.d.ts.map +1 -0
  277. package/dist/core/assembly/knowledge-loader.js +204 -0
  278. package/dist/core/assembly/knowledge-loader.js.map +1 -0
  279. package/dist/core/assembly/knowledge-loader.test.d.ts +2 -0
  280. package/dist/core/assembly/knowledge-loader.test.d.ts.map +1 -0
  281. package/dist/core/assembly/knowledge-loader.test.js +205 -0
  282. package/dist/core/assembly/knowledge-loader.test.js.map +1 -0
  283. package/dist/core/assembly/meta-prompt-loader.d.ts +13 -0
  284. package/dist/core/assembly/meta-prompt-loader.d.ts.map +1 -0
  285. package/dist/core/assembly/meta-prompt-loader.js +91 -0
  286. package/dist/core/assembly/meta-prompt-loader.js.map +1 -0
  287. package/dist/core/assembly/meta-prompt-loader.test.d.ts +2 -0
  288. package/dist/core/assembly/meta-prompt-loader.test.d.ts.map +1 -0
  289. package/dist/core/assembly/meta-prompt-loader.test.js +232 -0
  290. package/dist/core/assembly/meta-prompt-loader.test.js.map +1 -0
  291. package/dist/core/assembly/methodology-change.d.ts +27 -0
  292. package/dist/core/assembly/methodology-change.d.ts.map +1 -0
  293. package/dist/core/assembly/methodology-change.js +41 -0
  294. package/dist/core/assembly/methodology-change.js.map +1 -0
  295. package/dist/core/assembly/methodology-change.test.d.ts +2 -0
  296. package/dist/core/assembly/methodology-change.test.d.ts.map +1 -0
  297. package/dist/core/assembly/methodology-change.test.js +145 -0
  298. package/dist/core/assembly/methodology-change.test.js.map +1 -0
  299. package/dist/core/assembly/methodology-resolver.d.ts +11 -0
  300. package/dist/core/assembly/methodology-resolver.d.ts.map +1 -0
  301. package/dist/core/assembly/methodology-resolver.js +19 -0
  302. package/dist/core/assembly/methodology-resolver.js.map +1 -0
  303. package/dist/core/assembly/methodology-resolver.test.d.ts +2 -0
  304. package/dist/core/assembly/methodology-resolver.test.d.ts.map +1 -0
  305. package/dist/core/assembly/methodology-resolver.test.js +87 -0
  306. package/dist/core/assembly/methodology-resolver.test.js.map +1 -0
  307. package/dist/core/assembly/preset-loader.d.ts +26 -0
  308. package/dist/core/assembly/preset-loader.d.ts.map +1 -0
  309. package/dist/core/assembly/preset-loader.js +146 -0
  310. package/dist/core/assembly/preset-loader.js.map +1 -0
  311. package/dist/core/assembly/preset-loader.test.d.ts +2 -0
  312. package/dist/core/assembly/preset-loader.test.d.ts.map +1 -0
  313. package/dist/core/assembly/preset-loader.test.js +107 -0
  314. package/dist/core/assembly/preset-loader.test.js.map +1 -0
  315. package/dist/core/assembly/update-mode.d.ts +25 -0
  316. package/dist/core/assembly/update-mode.d.ts.map +1 -0
  317. package/dist/core/assembly/update-mode.js +70 -0
  318. package/dist/core/assembly/update-mode.js.map +1 -0
  319. package/dist/core/assembly/update-mode.test.d.ts +2 -0
  320. package/dist/core/assembly/update-mode.test.d.ts.map +1 -0
  321. package/dist/core/assembly/update-mode.test.js +235 -0
  322. package/dist/core/assembly/update-mode.test.js.map +1 -0
  323. package/dist/core/dependency/dependency.d.ts +20 -0
  324. package/dist/core/dependency/dependency.d.ts.map +1 -0
  325. package/dist/core/dependency/dependency.js +104 -0
  326. package/dist/core/dependency/dependency.js.map +1 -0
  327. package/dist/core/dependency/dependency.test.d.ts +2 -0
  328. package/dist/core/dependency/dependency.test.d.ts.map +1 -0
  329. package/dist/core/dependency/dependency.test.js +166 -0
  330. package/dist/core/dependency/dependency.test.js.map +1 -0
  331. package/dist/core/dependency/eligibility.d.ts +17 -0
  332. package/dist/core/dependency/eligibility.d.ts.map +1 -0
  333. package/dist/core/dependency/eligibility.js +60 -0
  334. package/dist/core/dependency/eligibility.js.map +1 -0
  335. package/dist/core/dependency/eligibility.test.d.ts +2 -0
  336. package/dist/core/dependency/eligibility.test.d.ts.map +1 -0
  337. package/dist/core/dependency/eligibility.test.js +198 -0
  338. package/dist/core/dependency/eligibility.test.js.map +1 -0
  339. package/dist/core/dependency/graph.d.ts +12 -0
  340. package/dist/core/dependency/graph.d.ts.map +1 -0
  341. package/dist/core/dependency/graph.js +34 -0
  342. package/dist/core/dependency/graph.js.map +1 -0
  343. package/dist/core/knowledge/knowledge-update-assembler.d.ts +24 -0
  344. package/dist/core/knowledge/knowledge-update-assembler.d.ts.map +1 -0
  345. package/dist/core/knowledge/knowledge-update-assembler.js +46 -0
  346. package/dist/core/knowledge/knowledge-update-assembler.js.map +1 -0
  347. package/dist/core/knowledge/knowledge-update-assembler.test.d.ts +2 -0
  348. package/dist/core/knowledge/knowledge-update-assembler.test.d.ts.map +1 -0
  349. package/dist/core/knowledge/knowledge-update-assembler.test.js +93 -0
  350. package/dist/core/knowledge/knowledge-update-assembler.test.js.map +1 -0
  351. package/dist/core/knowledge/knowledge-update-template.md +55 -0
  352. package/dist/dashboard/generator.d.ts +37 -0
  353. package/dist/dashboard/generator.d.ts.map +1 -0
  354. package/dist/dashboard/generator.js +42 -0
  355. package/dist/dashboard/generator.js.map +1 -0
  356. package/dist/dashboard/generator.test.d.ts +2 -0
  357. package/dist/dashboard/generator.test.d.ts.map +1 -0
  358. package/dist/dashboard/generator.test.js +186 -0
  359. package/dist/dashboard/generator.test.js.map +1 -0
  360. package/dist/dashboard/template.d.ts +4 -0
  361. package/dist/dashboard/template.d.ts.map +1 -0
  362. package/dist/dashboard/template.js +190 -0
  363. package/dist/dashboard/template.js.map +1 -0
  364. package/dist/e2e/commands.test.d.ts +9 -0
  365. package/dist/e2e/commands.test.d.ts.map +1 -0
  366. package/dist/e2e/commands.test.js +499 -0
  367. package/dist/e2e/commands.test.js.map +1 -0
  368. package/dist/e2e/init.test.d.ts +10 -0
  369. package/dist/e2e/init.test.d.ts.map +1 -0
  370. package/dist/e2e/init.test.js +180 -0
  371. package/dist/e2e/init.test.js.map +1 -0
  372. package/dist/e2e/knowledge.test.d.ts +2 -0
  373. package/dist/e2e/knowledge.test.d.ts.map +1 -0
  374. package/dist/e2e/knowledge.test.js +103 -0
  375. package/dist/e2e/knowledge.test.js.map +1 -0
  376. package/dist/e2e/pipeline.test.d.ts +8 -0
  377. package/dist/e2e/pipeline.test.d.ts.map +1 -0
  378. package/dist/e2e/pipeline.test.js +295 -0
  379. package/dist/e2e/pipeline.test.js.map +1 -0
  380. package/dist/index.d.ts +3 -0
  381. package/dist/index.d.ts.map +1 -0
  382. package/dist/index.js +7 -0
  383. package/dist/index.js.map +1 -0
  384. package/dist/project/adopt.d.ts +28 -0
  385. package/dist/project/adopt.d.ts.map +1 -0
  386. package/dist/project/adopt.js +49 -0
  387. package/dist/project/adopt.js.map +1 -0
  388. package/dist/project/adopt.test.d.ts +2 -0
  389. package/dist/project/adopt.test.d.ts.map +1 -0
  390. package/dist/project/adopt.test.js +220 -0
  391. package/dist/project/adopt.test.js.map +1 -0
  392. package/dist/project/claude-md.d.ts +33 -0
  393. package/dist/project/claude-md.d.ts.map +1 -0
  394. package/dist/project/claude-md.js +112 -0
  395. package/dist/project/claude-md.js.map +1 -0
  396. package/dist/project/claude-md.test.d.ts +2 -0
  397. package/dist/project/claude-md.test.d.ts.map +1 -0
  398. package/dist/project/claude-md.test.js +151 -0
  399. package/dist/project/claude-md.test.js.map +1 -0
  400. package/dist/project/detector.d.ts +7 -0
  401. package/dist/project/detector.d.ts.map +1 -0
  402. package/dist/project/detector.js +78 -0
  403. package/dist/project/detector.js.map +1 -0
  404. package/dist/project/detector.test.d.ts +2 -0
  405. package/dist/project/detector.test.d.ts.map +1 -0
  406. package/dist/project/detector.test.js +137 -0
  407. package/dist/project/detector.test.js.map +1 -0
  408. package/dist/project/frontmatter.d.ts +17 -0
  409. package/dist/project/frontmatter.d.ts.map +1 -0
  410. package/dist/project/frontmatter.js +236 -0
  411. package/dist/project/frontmatter.js.map +1 -0
  412. package/dist/project/frontmatter.test.d.ts +2 -0
  413. package/dist/project/frontmatter.test.d.ts.map +1 -0
  414. package/dist/project/frontmatter.test.js +218 -0
  415. package/dist/project/frontmatter.test.js.map +1 -0
  416. package/dist/project/signals.d.ts +12 -0
  417. package/dist/project/signals.d.ts.map +1 -0
  418. package/dist/project/signals.js +2 -0
  419. package/dist/project/signals.js.map +1 -0
  420. package/dist/state/completion.d.ts +22 -0
  421. package/dist/state/completion.d.ts.map +1 -0
  422. package/dist/state/completion.js +82 -0
  423. package/dist/state/completion.js.map +1 -0
  424. package/dist/state/completion.test.d.ts +2 -0
  425. package/dist/state/completion.test.d.ts.map +1 -0
  426. package/dist/state/completion.test.js +246 -0
  427. package/dist/state/completion.test.js.map +1 -0
  428. package/dist/state/decision-logger.d.ts +16 -0
  429. package/dist/state/decision-logger.d.ts.map +1 -0
  430. package/dist/state/decision-logger.js +80 -0
  431. package/dist/state/decision-logger.js.map +1 -0
  432. package/dist/state/decision-logger.test.d.ts +2 -0
  433. package/dist/state/decision-logger.test.d.ts.map +1 -0
  434. package/dist/state/decision-logger.test.js +182 -0
  435. package/dist/state/decision-logger.test.js.map +1 -0
  436. package/dist/state/lock-manager.d.ts +18 -0
  437. package/dist/state/lock-manager.d.ts.map +1 -0
  438. package/dist/state/lock-manager.js +134 -0
  439. package/dist/state/lock-manager.js.map +1 -0
  440. package/dist/state/lock-manager.test.d.ts +2 -0
  441. package/dist/state/lock-manager.test.d.ts.map +1 -0
  442. package/dist/state/lock-manager.test.js +190 -0
  443. package/dist/state/lock-manager.test.js.map +1 -0
  444. package/dist/state/state-manager.d.ts +37 -0
  445. package/dist/state/state-manager.d.ts.map +1 -0
  446. package/dist/state/state-manager.js +125 -0
  447. package/dist/state/state-manager.js.map +1 -0
  448. package/dist/state/state-manager.test.d.ts +2 -0
  449. package/dist/state/state-manager.test.d.ts.map +1 -0
  450. package/dist/state/state-manager.test.js +240 -0
  451. package/dist/state/state-manager.test.js.map +1 -0
  452. package/dist/types/adapter.d.ts +24 -0
  453. package/dist/types/adapter.d.ts.map +1 -0
  454. package/dist/types/adapter.js +2 -0
  455. package/dist/types/adapter.js.map +1 -0
  456. package/dist/types/assembly.d.ts +89 -0
  457. package/dist/types/assembly.d.ts.map +1 -0
  458. package/dist/types/assembly.js +2 -0
  459. package/dist/types/assembly.js.map +1 -0
  460. package/dist/types/claude-md.d.ts +11 -0
  461. package/dist/types/claude-md.d.ts.map +1 -0
  462. package/dist/types/claude-md.js +2 -0
  463. package/dist/types/claude-md.js.map +1 -0
  464. package/dist/types/cli.d.ts +15 -0
  465. package/dist/types/cli.d.ts.map +1 -0
  466. package/dist/types/cli.js +2 -0
  467. package/dist/types/cli.js.map +1 -0
  468. package/dist/types/config.d.ts +40 -0
  469. package/dist/types/config.d.ts.map +1 -0
  470. package/dist/types/config.js +2 -0
  471. package/dist/types/config.js.map +1 -0
  472. package/dist/types/decision.d.ts +14 -0
  473. package/dist/types/decision.d.ts.map +1 -0
  474. package/dist/types/decision.js +2 -0
  475. package/dist/types/decision.js.map +1 -0
  476. package/dist/types/dependency.d.ts +12 -0
  477. package/dist/types/dependency.d.ts.map +1 -0
  478. package/dist/types/dependency.js +2 -0
  479. package/dist/types/dependency.js.map +1 -0
  480. package/dist/types/enums.d.ts +23 -0
  481. package/dist/types/enums.d.ts.map +1 -0
  482. package/dist/types/enums.js +11 -0
  483. package/dist/types/enums.js.map +1 -0
  484. package/dist/types/enums.test.d.ts +2 -0
  485. package/dist/types/enums.test.d.ts.map +1 -0
  486. package/dist/types/enums.test.js +13 -0
  487. package/dist/types/enums.test.js.map +1 -0
  488. package/dist/types/errors.d.ts +24 -0
  489. package/dist/types/errors.d.ts.map +1 -0
  490. package/dist/types/errors.js +2 -0
  491. package/dist/types/errors.js.map +1 -0
  492. package/dist/types/frontmatter.d.ts +43 -0
  493. package/dist/types/frontmatter.d.ts.map +1 -0
  494. package/dist/types/frontmatter.js +2 -0
  495. package/dist/types/frontmatter.js.map +1 -0
  496. package/dist/types/index.d.ts +14 -0
  497. package/dist/types/index.d.ts.map +1 -0
  498. package/dist/types/index.js +14 -0
  499. package/dist/types/index.js.map +1 -0
  500. package/dist/types/lock.d.ts +10 -0
  501. package/dist/types/lock.d.ts.map +1 -0
  502. package/dist/types/lock.js +2 -0
  503. package/dist/types/lock.js.map +1 -0
  504. package/dist/types/state.d.ts +49 -0
  505. package/dist/types/state.d.ts.map +1 -0
  506. package/dist/types/state.js +2 -0
  507. package/dist/types/state.js.map +1 -0
  508. package/dist/types/wizard.d.ts +14 -0
  509. package/dist/types/wizard.d.ts.map +1 -0
  510. package/dist/types/wizard.js +2 -0
  511. package/dist/types/wizard.js.map +1 -0
  512. package/dist/utils/errors.d.ts +42 -0
  513. package/dist/utils/errors.d.ts.map +1 -0
  514. package/dist/utils/errors.js +232 -0
  515. package/dist/utils/errors.js.map +1 -0
  516. package/dist/utils/errors.test.d.ts +2 -0
  517. package/dist/utils/errors.test.d.ts.map +1 -0
  518. package/dist/utils/errors.test.js +91 -0
  519. package/dist/utils/errors.test.js.map +1 -0
  520. package/dist/utils/fs.d.ts +11 -0
  521. package/dist/utils/fs.d.ts.map +1 -0
  522. package/dist/utils/fs.js +20 -0
  523. package/dist/utils/fs.js.map +1 -0
  524. package/dist/utils/fs.test.d.ts +2 -0
  525. package/dist/utils/fs.test.d.ts.map +1 -0
  526. package/dist/utils/fs.test.js +93 -0
  527. package/dist/utils/fs.test.js.map +1 -0
  528. package/dist/utils/index.d.ts +4 -0
  529. package/dist/utils/index.d.ts.map +1 -0
  530. package/dist/utils/index.js +4 -0
  531. package/dist/utils/index.js.map +1 -0
  532. package/dist/utils/levenshtein.d.ts +11 -0
  533. package/dist/utils/levenshtein.d.ts.map +1 -0
  534. package/dist/utils/levenshtein.js +37 -0
  535. package/dist/utils/levenshtein.js.map +1 -0
  536. package/dist/utils/levenshtein.test.d.ts +2 -0
  537. package/dist/utils/levenshtein.test.d.ts.map +1 -0
  538. package/dist/utils/levenshtein.test.js +34 -0
  539. package/dist/utils/levenshtein.test.js.map +1 -0
  540. package/dist/validation/config-validator.d.ts +10 -0
  541. package/dist/validation/config-validator.d.ts.map +1 -0
  542. package/dist/validation/config-validator.js +11 -0
  543. package/dist/validation/config-validator.js.map +1 -0
  544. package/dist/validation/dependency-validator.d.ts +10 -0
  545. package/dist/validation/dependency-validator.d.ts.map +1 -0
  546. package/dist/validation/dependency-validator.js +34 -0
  547. package/dist/validation/dependency-validator.js.map +1 -0
  548. package/dist/validation/frontmatter-validator.d.ts +12 -0
  549. package/dist/validation/frontmatter-validator.d.ts.map +1 -0
  550. package/dist/validation/frontmatter-validator.js +50 -0
  551. package/dist/validation/frontmatter-validator.js.map +1 -0
  552. package/dist/validation/index.d.ts +19 -0
  553. package/dist/validation/index.d.ts.map +1 -0
  554. package/dist/validation/index.js +64 -0
  555. package/dist/validation/index.js.map +1 -0
  556. package/dist/validation/index.test.d.ts +2 -0
  557. package/dist/validation/index.test.d.ts.map +1 -0
  558. package/dist/validation/index.test.js +241 -0
  559. package/dist/validation/index.test.js.map +1 -0
  560. package/dist/validation/state-validator.d.ts +15 -0
  561. package/dist/validation/state-validator.d.ts.map +1 -0
  562. package/dist/validation/state-validator.js +104 -0
  563. package/dist/validation/state-validator.js.map +1 -0
  564. package/dist/wizard/questions.d.ts +18 -0
  565. package/dist/wizard/questions.d.ts.map +1 -0
  566. package/dist/wizard/questions.js +46 -0
  567. package/dist/wizard/questions.js.map +1 -0
  568. package/dist/wizard/suggestion.d.ts +10 -0
  569. package/dist/wizard/suggestion.d.ts.map +1 -0
  570. package/dist/wizard/suggestion.js +17 -0
  571. package/dist/wizard/suggestion.js.map +1 -0
  572. package/dist/wizard/wizard.d.ts +19 -0
  573. package/dist/wizard/wizard.d.ts.map +1 -0
  574. package/dist/wizard/wizard.js +104 -0
  575. package/dist/wizard/wizard.js.map +1 -0
  576. package/dist/wizard/wizard.test.d.ts +2 -0
  577. package/dist/wizard/wizard.test.d.ts.map +1 -0
  578. package/dist/wizard/wizard.test.js +167 -0
  579. package/dist/wizard/wizard.test.js.map +1 -0
  580. package/knowledge/core/adr-craft.md +281 -0
  581. package/knowledge/core/api-design.md +501 -0
  582. package/knowledge/core/database-design.md +380 -0
  583. package/knowledge/core/domain-modeling.md +317 -0
  584. package/knowledge/core/operations-runbook.md +513 -0
  585. package/knowledge/core/security-review.md +523 -0
  586. package/knowledge/core/system-architecture.md +402 -0
  587. package/knowledge/core/task-decomposition.md +372 -0
  588. package/knowledge/core/testing-strategy.md +409 -0
  589. package/knowledge/core/user-stories.md +337 -0
  590. package/knowledge/core/user-story-innovation.md +171 -0
  591. package/knowledge/core/ux-specification.md +380 -0
  592. package/knowledge/finalization/apply-fixes-and-freeze.md +93 -0
  593. package/knowledge/finalization/developer-onboarding.md +376 -0
  594. package/knowledge/finalization/implementation-playbook.md +404 -0
  595. package/knowledge/product/gap-analysis.md +305 -0
  596. package/knowledge/product/prd-craft.md +324 -0
  597. package/knowledge/product/prd-innovation.md +204 -0
  598. package/knowledge/review/review-adr.md +203 -0
  599. package/knowledge/review/review-api-contracts.md +233 -0
  600. package/knowledge/review/review-database-schema.md +229 -0
  601. package/knowledge/review/review-domain-modeling.md +288 -0
  602. package/knowledge/review/review-implementation-tasks.md +202 -0
  603. package/knowledge/review/review-methodology.md +215 -0
  604. package/knowledge/review/review-operations.md +212 -0
  605. package/knowledge/review/review-prd.md +235 -0
  606. package/knowledge/review/review-security.md +213 -0
  607. package/knowledge/review/review-system-architecture.md +296 -0
  608. package/knowledge/review/review-testing-strategy.md +176 -0
  609. package/knowledge/review/review-user-stories.md +172 -0
  610. package/knowledge/review/review-ux-spec.md +208 -0
  611. package/knowledge/validation/critical-path-analysis.md +203 -0
  612. package/knowledge/validation/cross-phase-consistency.md +181 -0
  613. package/knowledge/validation/decision-completeness.md +218 -0
  614. package/knowledge/validation/dependency-validation.md +233 -0
  615. package/knowledge/validation/implementability-review.md +252 -0
  616. package/knowledge/validation/scope-management.md +223 -0
  617. package/knowledge/validation/traceability.md +198 -0
  618. package/methodology/custom-defaults.yml +43 -0
  619. package/methodology/deep.yml +42 -0
  620. package/methodology/mvp.yml +42 -0
  621. package/package.json +58 -0
  622. package/pipeline/architecture/review-architecture.md +44 -0
  623. package/pipeline/architecture/system-architecture.md +45 -0
  624. package/pipeline/decisions/adrs.md +45 -0
  625. package/pipeline/decisions/review-adrs.md +39 -0
  626. package/pipeline/finalization/apply-fixes-and-freeze.md +39 -0
  627. package/pipeline/finalization/developer-onboarding-guide.md +36 -0
  628. package/pipeline/finalization/implementation-playbook.md +45 -0
  629. package/pipeline/modeling/domain-modeling.md +57 -0
  630. package/pipeline/modeling/review-domain-modeling.md +41 -0
  631. package/pipeline/planning/implementation-tasks.md +57 -0
  632. package/pipeline/planning/review-tasks.md +38 -0
  633. package/pipeline/pre/create-prd.md +45 -0
  634. package/pipeline/pre/innovate-prd.md +47 -0
  635. package/pipeline/pre/innovate-user-stories.md +47 -0
  636. package/pipeline/pre/review-prd.md +44 -0
  637. package/pipeline/pre/review-user-stories.md +43 -0
  638. package/pipeline/pre/user-stories.md +48 -0
  639. package/pipeline/quality/operations.md +42 -0
  640. package/pipeline/quality/review-operations.md +37 -0
  641. package/pipeline/quality/review-security.md +40 -0
  642. package/pipeline/quality/review-testing.md +39 -0
  643. package/pipeline/quality/security.md +44 -0
  644. package/pipeline/quality/testing-strategy.md +42 -0
  645. package/pipeline/specification/api-contracts.md +44 -0
  646. package/pipeline/specification/database-schema.md +41 -0
  647. package/pipeline/specification/review-api.md +40 -0
  648. package/pipeline/specification/review-database.md +39 -0
  649. package/pipeline/specification/review-ux.md +38 -0
  650. package/pipeline/specification/ux-spec.md +43 -0
  651. package/pipeline/validation/critical-path-walkthrough.md +37 -0
  652. package/pipeline/validation/cross-phase-consistency.md +35 -0
  653. package/pipeline/validation/decision-completeness.md +36 -0
  654. package/pipeline/validation/dependency-graph-validation.md +36 -0
  655. package/pipeline/validation/implementability-dry-run.md +36 -0
  656. package/pipeline/validation/scope-creep-check.md +38 -0
  657. package/pipeline/validation/traceability-matrix.md +36 -0
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: prd-innovation
3
+ description: Techniques for discovering feature-level innovation opportunities in product requirements
4
+ topics: [innovation, prd, competitive-analysis, product-thinking, features]
5
+ ---
6
+
7
+ # PRD Innovation
8
+
9
+ This knowledge covers feature-level innovation — discovering new capabilities, competitive gaps, and defensive product improvements that belong in the PRD. It operates at the product scope level: should this feature exist at all?
10
+
11
+ This is distinct from user story innovation (`user-story-innovation.md`), which covers UX-level enhancements to existing features. If an idea doesn't require a new PRD section or feature entry, it belongs in user story innovation, not here.
12
+
13
+ ## Scope Boundary
14
+
15
+ **In scope:**
16
+ - New features users would expect based on competitive norms
17
+ - New user flows that address friction points in existing flows
18
+ - Competitive positioning — capabilities that differentiate the product
19
+ - Defensive product gaps — things users would complain about on day 1
20
+ - AI-native capabilities that wouldn't exist without AI
21
+
22
+ **Out of scope:**
23
+ - UX polish on existing features (smart defaults, inline validation, progressive disclosure) — belongs in user story innovation
24
+ - Implementation details (technology choices, architecture) — belongs in ADRs
25
+ - Non-functional improvements to existing features — belongs in user story innovation
26
+
27
+ ---
28
+
29
+ ## Competitive & Market Analysis
30
+
31
+ Research similar products to identify gaps and opportunities. The goal is actionable findings, not an exhaustive market report.
32
+
33
+ ### What to Research
34
+
35
+ - **Direct competitors** — Products solving the same problem for the same users. What do they do well? What do users complain about?
36
+ - **Adjacent products** — Products in the same space that solve related problems. What patterns do they use that users now expect?
37
+ - **Emerging patterns** — UX conventions that have become table stakes. Users don't request them, but their absence feels like a gap (e.g., dark mode, keyboard shortcuts, real-time collaboration).
38
+
39
+ ### How to Use Findings
40
+
41
+ For each competitive insight:
42
+ 1. Is this a table-stakes feature (users expect it)? → Must-have candidate
43
+ 2. Is this a differentiator (competitors don't have it, but users would love it)? → Evaluate cost/impact
44
+ 3. Is this a copied feature (competitors have it, but it doesn't serve our users' specific needs)? → Skip
45
+
46
+ ### Anti-Patterns
47
+
48
+ - **Feature parity obsession** — Copying every competitor feature dilutes focus. Only adopt features that serve your users' specific problem.
49
+ - **Exhaustive matrices** — A 50-row competitor comparison belongs in market research, not the PRD innovation pass. Focus on the 3-5 insights that actually affect product decisions.
50
+
51
+ ## User Experience Gaps
52
+
53
+ Look at the core user flows described in the PRD and ask: where would a real user get frustrated?
54
+
55
+ ### First 60 Seconds
56
+
57
+ The onboarding experience determines whether a user keeps the product:
58
+ - Can a new user understand the product's value within 60 seconds?
59
+ - Is there a clear first action? Or does the user land on an empty state with no guidance?
60
+ - How many steps between signup and the first "aha moment" where the product delivers value?
61
+
62
+ ### Flow Friction Points
63
+
64
+ For each core user flow:
65
+ - How many steps does it take? Can any be eliminated or combined?
66
+ - Are there unnecessary confirmation dialogs? (Prefer undo over "are you sure?")
67
+ - Does the user need to leave the flow to get information required by the flow?
68
+ - What's the "delightful" version of this flow versus the "functional" version?
69
+
70
+ ### Missing Flows
71
+
72
+ - Are there common user goals that the PRD doesn't address with a dedicated flow?
73
+ - Does the user have to work around the product to accomplish something obvious?
74
+
75
+ ## Missing Expected Features
76
+
77
+ Features that users would search for and be surprised are absent. These are not innovative — they're expected. Their absence feels like a bug.
78
+
79
+ ### Common Missing Features by Category
80
+
81
+ **Search & Discovery:**
82
+ - Text search across primary content types
83
+ - Filtering and sorting on list views
84
+ - Recently viewed / recently used items
85
+
86
+ **Data Management:**
87
+ - Bulk import/export (CSV, JSON)
88
+ - Undo for destructive actions
89
+ - Duplicate/clone for repetitive creation
90
+
91
+ **Communication:**
92
+ - Notification preferences (what, when, how)
93
+ - Email digests vs. real-time notifications
94
+ - In-app notification center
95
+
96
+ **Personalization:**
97
+ - User preferences / settings
98
+ - Saved views or filters
99
+ - Customizable dashboard or home screen
100
+
101
+ ### Detection Technique
102
+
103
+ For each persona in the PRD, walk through their typical week:
104
+ 1. What would they do daily? Weekly? Monthly?
105
+ 2. For each action, is there a feature that supports it?
106
+ 3. For each gap, would the user be surprised it's missing?
107
+
108
+ ## AI-Native Opportunities
109
+
110
+ Features that would be impractical to build without AI but become natural with it. These are not "AI bolted on" — they are capabilities that fundamentally change the user experience.
111
+
112
+ ### Categories
113
+
114
+ **Natural language interfaces:**
115
+ - Search that understands intent ("show me overdue invoices from last quarter") rather than requiring structured queries
116
+ - Data entry through conversation rather than forms for complex inputs
117
+ - Commands that understand context ("send the same email I sent to the last batch")
118
+
119
+ **Auto-categorization and tagging:**
120
+ - Content automatically categorized based on content analysis
121
+ - Suggested tags that learn from user corrections
122
+ - Smart folders or views that organize themselves
123
+
124
+ **Predictive behavior:**
125
+ - Pre-filled forms based on patterns ("you usually set this to X")
126
+ - Suggested next actions based on workflow patterns
127
+ - Anomaly detection ("this value is unusual — did you mean X?")
128
+
129
+ **Content generation:**
130
+ - Draft generation for repetitive writing (emails, descriptions, reports)
131
+ - Summarization of long content (meeting notes, documents, threads)
132
+ - Template suggestions based on context
133
+
134
+ ### Evaluation
135
+
136
+ AI features should pass the "magic vs. gimmick" test:
137
+ - **Magic:** User thinks "how did it know?" and saves meaningful time
138
+ - **Gimmick:** User thinks "that's cool" once and never uses it again
139
+ - Only propose features that pass the magic test
140
+
141
+ ## Defensive Product Thinking
142
+
143
+ Proactively identify what users would complain about. Fix the most likely complaints before they happen.
144
+
145
+ ### The 1-Star Review Technique
146
+
147
+ Write the most likely 1-star review for the v1 product. Common templates:
148
+ - "I can't believe it doesn't even have [obvious feature]."
149
+ - "I tried to [common action] and it just [broke/was confusing/lost my data]."
150
+ - "Great concept but unusable on [mobile/slow connection/screen reader]."
151
+ - "I wanted to [goal] but had to [painful workaround] because [missing capability]."
152
+
153
+ For each plausible 1-star review: is the complaint addressed in the PRD? If not, should it be?
154
+
155
+ ### Abandonment Analysis
156
+
157
+ Identify the most common reasons a user would try the product and stop using it:
158
+ 1. **Complexity barrier** — Too hard to learn. Is onboarding addressed?
159
+ 2. **Performance barrier** — Too slow. Are performance NFRs adequate?
160
+ 3. **Trust barrier** — Doesn't feel reliable. Is error handling comprehensive?
161
+ 4. **Value barrier** — Doesn't deliver on the promise fast enough. Is time-to-value minimized?
162
+ 5. **Integration barrier** — Doesn't connect to their existing tools. Are integrations addressed?
163
+
164
+ ### Accessibility & Inclusion
165
+
166
+ Gaps that alienate entire user segments:
167
+ - Keyboard-only navigation for users who can't use a mouse
168
+ - Screen reader support for visually impaired users
169
+ - Mobile responsiveness for users on phones
170
+ - Offline or degraded-mode support for users with unreliable connections
171
+ - Internationalization for non-English-speaking users
172
+
173
+ ## Evaluation Framework
174
+
175
+ For each innovation suggestion, evaluate before proposing to the user.
176
+
177
+ ### Cost Assessment
178
+
179
+ - **Trivial** (no new features): A small addition to an existing PRD feature section. No new user flows, no new data entities.
180
+ - **Moderate** (1-3 new features): Requires new PRD feature entries, possibly a new user flow. Contained within existing product scope.
181
+ - **Significant** (reshapes scope): Requires rethinking product boundaries, adding new personas, or fundamentally changing architecture assumptions.
182
+
183
+ ### Impact Assessment
184
+
185
+ - **Nice-to-have**: Users wouldn't notice if absent. Polishes the product but doesn't change adoption or satisfaction meaningfully.
186
+ - **Noticeable improvement**: Users would appreciate it. Reduces friction in common workflows or addresses a gap competitors have filled.
187
+ - **Significant differentiator**: Sets the product apart. Users would choose this product partly because of this capability.
188
+
189
+ ### Decision Framework
190
+
191
+ | | Trivial Cost | Moderate Cost | Significant Cost |
192
+ |---|---|---|---|
193
+ | **Differentiator** | Must-have v1 | Must-have v1 | Backlog (worth it but not now) |
194
+ | **Noticeable** | Must-have v1 | Backlog | Backlog |
195
+ | **Nice-to-have** | Include if free | Backlog | Reject |
196
+
197
+ ### Presenting to the User
198
+
199
+ Group related suggestions for efficient decision-making. For each group:
200
+ 1. Describe the enhancement and its user benefit (1-2 sentences)
201
+ 2. State the cost (trivial/moderate/significant)
202
+ 3. State your recommendation (must-have v1 / backlog / reject) with reasoning
203
+ 4. Wait for approval before integrating into the PRD
204
+ 5. Document approved innovations to the same standard as existing PRD features — full description, priority, business rules. No vague one-liners.
@@ -0,0 +1,203 @@
1
+ ---
2
+ name: review-adr
3
+ description: Failure modes and review passes specific to Architecture Decision Records
4
+ topics: [review, adr, decisions]
5
+ ---
6
+
7
+ # Review: Architecture Decision Records
8
+
9
+ ADRs encode the "why" behind the architecture. They must be complete (every significant decision recorded), honest (genuine trade-off analysis), and non-contradictory (no two ADRs making incompatible decisions). This review uses 7 passes targeting the specific ways ADR sets fail.
10
+
11
+ Follows the review process defined in `review-methodology.md`.
12
+
13
+ ---
14
+
15
+ ## Pass 1: Decision Coverage
16
+
17
+ ### What to Check
18
+
19
+ Every significant architectural decision has an ADR. Technology choices, pattern selections, component boundaries, integration strategies, and constraint trade-offs are all recorded.
20
+
21
+ ### Why This Matters
22
+
23
+ Unrecorded decisions become folklore — known to the original author but invisible to implementing agents. When an agent encounters an undocumented technology choice, it either assumes incorrectly or asks questions the ADR should have answered. At scale, unrecorded decisions are the primary source of "but why do we do it this way?" confusion.
24
+
25
+ ### How to Check
26
+
27
+ 1. Read through the domain models and architecture document (if it exists at this point)
28
+ 2. List every decision implied by the structure: technology choices (language, framework, database), architectural patterns (monolith vs. microservices, event-driven vs. request-response), component boundaries, integration mechanisms, data storage strategies
29
+ 3. For each identified decision, find the corresponding ADR
30
+ 4. Flag decisions that are visible in the artifacts but have no ADR
31
+ 5. Check that technology selection decisions cover: primary language/framework, database(s), key infrastructure (message queue, cache, CDN), deployment platform
32
+
33
+ ### What a Finding Looks Like
34
+
35
+ - P0: "The architecture uses PostgreSQL and Redis but there is no ADR recording why these were chosen over alternatives."
36
+ - P1: "The system uses event-driven communication between Order and Inventory services, but no ADR documents this pattern choice versus synchronous calls."
37
+ - P2: "The testing framework choice (Jest) is implied by package.json conventions but not recorded as a decision."
38
+
39
+ ---
40
+
41
+ ## Pass 2: Rationale Quality
42
+
43
+ ### What to Check
44
+
45
+ Each ADR has genuine alternatives that were seriously considered (not straw-manned). Consequences are honest — both positive and negative. The rationale explains why the chosen option was selected, not just what was selected.
46
+
47
+ ### Why This Matters
48
+
49
+ Straw-manned alternatives ("we could do nothing" or obviously bad options) indicate the decision was made before the analysis. This means the real reasoning is undocumented. When conditions change, the team has no basis for re-evaluating because they do not know why the decision was actually made.
50
+
51
+ ### How to Check
52
+
53
+ 1. For each ADR, read the alternatives section
54
+ 2. Check that at least 2-3 alternatives are genuinely viable — would a reasonable engineer consider them?
55
+ 3. Verify each alternative has honest pros and cons (not just cons)
56
+ 4. Read the consequences section: are there negative consequences? (Every decision has trade-offs — all-positive consequences indicate dishonest analysis)
57
+ 5. Check the rationale: does it explain why the chosen option's trade-offs are acceptable, or does it just restate the decision?
58
+ 6. Look for evaluation criteria: what dimensions were the options compared on?
59
+
60
+ ### What a Finding Looks Like
61
+
62
+ - P0: "ADR-003 lists 'do nothing' and 'use an obviously unsuitable technology' as alternatives. The real alternatives (comparable frameworks) are missing."
63
+ - P1: "ADR-007 consequences section lists only benefits. A REST API decision always has trade-offs (chatty calls, over-fetching, versioning complexity) — these are absent."
64
+ - P2: "ADR-012 explains what was chosen but not why. The rationale section reads 'We chose React' without explaining what made it the best fit."
65
+
66
+ ---
67
+
68
+ ## Pass 3: Contradiction Detection
69
+
70
+ ### What to Check
71
+
72
+ No two ADRs make contradictory decisions without explicit acknowledgment. When one ADR supersedes or modifies another, the relationship is documented.
73
+
74
+ ### Why This Matters
75
+
76
+ Contradictory ADRs give implementing agents conflicting instructions. If ADR-005 says "use REST for all APIs" and ADR-012 says "use GraphQL for the dashboard API" without referencing ADR-005, an agent reading both does not know which takes precedence. Contradictions that are intentional (scoped exceptions) must be explicit.
77
+
78
+ ### How to Check
79
+
80
+ 1. Build a decision matrix: for each ADR, note what it decides and what domain it constrains
81
+ 2. Look for overlapping constraints: two ADRs that affect the same architectural concern
82
+ 3. For each overlap, determine: do they agree, or do they contradict?
83
+ 4. For contradictions, check: does the later ADR reference the earlier one and explain the exception?
84
+ 5. Check for implicit contradictions: ADR-A says "minimize external dependencies" while ADR-B adds three new external services
85
+ 6. Verify supersession chains: if ADR-X supersedes ADR-Y, is ADR-Y marked as superseded?
86
+
87
+ ### What a Finding Looks Like
88
+
89
+ - P0: "ADR-005 specifies 'all state in PostgreSQL' but ADR-011 introduces Redis for session management without referencing ADR-005 or explaining the exception."
90
+ - P1: "ADR-003 (monolith-first) and ADR-009 (separate auth service) contradict. ADR-009 should reference ADR-003 and explain why auth is the exception."
91
+ - P2: "ADR-015 supersedes ADR-008 but ADR-008 status is still 'accepted'. Update to 'superseded by ADR-015'."
92
+
93
+ ---
94
+
95
+ ## Pass 4: Implied Decision Mining
96
+
97
+ ### What to Check
98
+
99
+ Decisions visible in domain models, architecture, or code that were never formally recorded as ADRs. These are the "everyone knows" decisions that new team members do not know.
100
+
101
+ ### Why This Matters
102
+
103
+ Implied decisions are the most dangerous gap in an ADR set. They represent consensus that was never examined or documented. When an implementing agent encounters an implied decision, it has no rationale to evaluate whether the decision still applies. Implied decisions also tend to be the decisions most likely to be wrong — they were never subjected to alternatives analysis.
104
+
105
+ ### How to Check
106
+
107
+ 1. Read domain models looking for architectural assumptions: "the system uses X" statements embedded in narrative
108
+ 2. Read architecture documents for technology mentions without corresponding ADRs
109
+ 3. Check for pattern assumptions: "RESTful API" assumed without an ADR choosing REST over alternatives
110
+ 4. Look for constraint assumptions: "single database" or "multi-tenant" assumed without formal analysis
111
+ 5. Check for deployment assumptions: cloud provider, containerization, CI/CD tool — all are decisions
112
+ 6. Review domain event patterns: synchronous vs. asynchronous, at-least-once vs. exactly-once — these are decisions
113
+
114
+ ### What a Finding Looks Like
115
+
116
+ - P0: "The domain models assume multi-tenancy (tenant_id on entities) but there is no ADR analyzing single-tenant vs. multi-tenant trade-offs."
117
+ - P1: "The architecture assumes containerized deployment (Docker references throughout) but no ADR records this decision."
118
+ - P2: "TypeScript is used throughout code examples in domain models but no ADR formally selects TypeScript over JavaScript."
119
+
120
+ ---
121
+
122
+ ## Pass 5: Status Hygiene
123
+
124
+ ### What to Check
125
+
126
+ ADR statuses reflect reality. No stale "proposed" ADRs (should be accepted or rejected). Supersession chains are clean. Deprecated ADRs point to their replacements.
127
+
128
+ ### Why This Matters
129
+
130
+ Stale statuses create confusion about which decisions are in effect. A "proposed" ADR that was accepted months ago but never updated looks like an undecided question. Broken supersession chains mean both the old and new ADR appear active, leading to the contradiction problems in Pass 3.
131
+
132
+ ### How to Check
133
+
134
+ 1. List all ADRs and their statuses
135
+ 2. Flag any "proposed" or "draft" ADRs — are these genuinely pending, or were they accepted but not updated?
136
+ 3. For "superseded" or "deprecated" ADRs, verify they reference their replacement
137
+ 4. For "accepted" ADRs, verify they are still current — has a later ADR effectively superseded them?
138
+ 5. Check for "rejected" ADRs — are the rejections still valid, or have circumstances changed?
139
+ 6. Verify ADR numbering is sequential and has no gaps (gaps suggest deleted ADRs, which violates ADR principles)
140
+
141
+ ### What a Finding Looks Like
142
+
143
+ - P1: "ADR-004 has status 'proposed' but is referenced by three other ADRs as if it were accepted. Update status."
144
+ - P1: "ADR-006 status is 'deprecated' but does not reference which ADR replaces it."
145
+ - P2: "ADR numbering jumps from 008 to 010. If ADR-009 was removed, it should exist as 'rejected' or 'withdrawn', not deleted."
146
+
147
+ ---
148
+
149
+ ## Pass 6: Cross-Reference Integrity
150
+
151
+ ### What to Check
152
+
153
+ ADRs that reference each other do so correctly. Cross-references point to real ADRs, the referenced content matches what is claimed, and no circular reference chains create logical loops.
154
+
155
+ ### Why This Matters
156
+
157
+ Broken cross-references make it impossible to follow decision chains. When ADR-015 says "as decided in ADR-007," but ADR-007 does not actually address that topic, the rationale chain is broken. Implementing agents cannot trace why decisions were made.
158
+
159
+ ### How to Check
160
+
161
+ 1. For each ADR, extract all references to other ADRs
162
+ 2. Verify each referenced ADR exists
163
+ 3. Verify the referenced ADR actually says what the referencing ADR claims it says
164
+ 4. Check for circular reference chains (A references B references C references A)
165
+ 5. Verify "supersedes" relationships are bidirectional (superseding ADR says "supersedes X"; X says "superseded by Y")
166
+ 6. Check that references to domain models and architecture documents are also accurate
167
+
168
+ ### What a Finding Looks Like
169
+
170
+ - P1: "ADR-012 says 'per ADR-007, we use event-driven communication' but ADR-007 actually decides on synchronous REST. Wrong cross-reference."
171
+ - P1: "ADR-015 supersedes ADR-008, but ADR-008 does not mention being superseded."
172
+ - P2: "ADR-020 references 'the data model in Section 3' without specifying which document's Section 3."
173
+
174
+ ---
175
+
176
+ ## Pass 7: Downstream Readiness
177
+
178
+ ### What to Check
179
+
180
+ The system architecture step needs technology choices and pattern decisions finalized. All architecture-constraining decisions must be in "accepted" status with clear rationale.
181
+
182
+ ### Why This Matters
183
+
184
+ The architecture document translates ADR decisions into component structure. If technology choices are unresolved, the architect must either make the decision inline (bypassing the ADR process) or leave the architecture ambiguous. Both lead to rework.
185
+
186
+ ### How to Check
187
+
188
+ The system architecture step specifically needs:
189
+ 1. **Technology stack decisions** — Language, framework, database, key infrastructure, all accepted
190
+ 2. **Architectural pattern decisions** — Monolith vs. services, synchronous vs. asynchronous, state management approach
191
+ 3. **Integration pattern decisions** — How components communicate, what protocols, what data formats
192
+ 4. **Deployment topology decisions** — Where the system runs, how many environments, how deploys work
193
+ 5. **Cross-cutting concern decisions** — Logging, monitoring, authentication, error handling patterns
194
+ 6. **Data management decisions** — Single vs. multiple databases, caching strategy, data consistency model
195
+
196
+ For each category, verify at least one accepted ADR covers it. If a category is intentionally deferred, verify the deferral is documented with a timeline.
197
+
198
+ ### What a Finding Looks Like
199
+
200
+ - P0: "No accepted ADR covers database technology selection. The system architecture step cannot design data storage components without this decision."
201
+ - P0: "The monolith-vs-services question has two proposed ADRs (ADR-003, ADR-004) but neither is accepted. The system architecture step cannot define component boundaries."
202
+ - P1: "Authentication approach is not covered by any ADR. The system architecture step needs to know the auth pattern to design the auth component."
203
+ - P2: "Monitoring strategy has no ADR. This could be deferred to the operations step but should be noted."
@@ -0,0 +1,233 @@
1
+ ---
2
+ name: review-api-contracts
3
+ description: Failure modes and review passes specific to API contract specifications
4
+ topics: [review, api, contracts, rest, graphql]
5
+ ---
6
+
7
+ # Review: API Contracts
8
+
9
+ API contracts define the system's external and internal interfaces. They must cover every domain operation that crosses a boundary, handle errors explicitly, enforce authentication and authorization, and align with both the domain model and the database schema. This review uses 8 passes targeting the specific ways API contracts fail.
10
+
11
+ Follows the review process defined in `review-methodology.md`.
12
+
13
+ ---
14
+
15
+ ## Pass 1: Operation Coverage
16
+
17
+ ### What to Check
18
+
19
+ Every domain operation that crosses a component boundary has a corresponding API endpoint (or GraphQL query/mutation, gRPC method, etc.). No cross-boundary operation is left without an API contract.
20
+
21
+ ### Why This Matters
22
+
23
+ Missing endpoints mean entire features cannot be accessed through the API. Implementing agents discover the gap when they need to wire up a frontend component or integration — they either invent an endpoint (diverging from the contract) or block waiting for design. Operation coverage gaps are the most common API contract failure.
24
+
25
+ ### How to Check
26
+
27
+ 1. List every component interaction from the architecture's data flows
28
+ 2. For each interaction that crosses a component or service boundary, verify a corresponding API endpoint exists
29
+ 3. Cross-reference domain model operations: every aggregate command (create, update, delete) that is exposed beyond its owning service needs an endpoint
30
+ 4. Check for read operations: every query pattern identified in the architecture needs a corresponding GET endpoint or query
31
+ 5. Verify that domain events that trigger cross-service operations have corresponding webhook or event subscription endpoints if applicable
32
+ 6. Check for administrative operations: user management, configuration, health checks, metrics
33
+
34
+ ### What a Finding Looks Like
35
+
36
+ - P0: "Architecture data flow shows 'Frontend requests user's order history' but no GET /users/{id}/orders endpoint exists in the API contract."
37
+ - P1: "Domain model defines 'cancel order' as a command on the Order aggregate, but no PATCH/DELETE endpoint covers order cancellation."
38
+ - P2: "Health check endpoint is not documented. Implementation will need one for deployment orchestration."
39
+
40
+ ---
41
+
42
+ ## Pass 2: Error Contract Completeness
43
+
44
+ ### What to Check
45
+
46
+ Every endpoint has explicit error responses defined. Error responses include status codes, error body structure, and conditions under which each error occurs.
47
+
48
+ ### Why This Matters
49
+
50
+ Undocumented errors are the primary source of poor error handling in client code. When the API returns a 422 that is not in the contract, the frontend falls back to a generic "something went wrong" message. Complete error contracts enable clients to handle every failure mode gracefully.
51
+
52
+ ### How to Check
53
+
54
+ 1. For each endpoint, list the documented error responses
55
+ 2. Check for standard errors every endpoint should handle: 400 (bad input), 401 (unauthenticated), 403 (unauthorized), 404 (not found), 500 (server error)
56
+ 3. Check for domain-specific errors: business rule violations (e.g., "insufficient inventory"), state transition errors (e.g., "cannot cancel a shipped order"), constraint violations (e.g., "duplicate email")
57
+ 4. Verify error response bodies have a consistent structure across all endpoints (error code, message, details)
58
+ 5. Check for rate limiting errors (429) if the API has rate limits
59
+ 6. Verify that error responses do not leak internal details (stack traces, database errors, internal IDs)
60
+
61
+ ### What a Finding Looks Like
62
+
63
+ - P0: "POST /orders endpoint documents only 201 (success) and 400 (bad request). Missing: 401 (unauthenticated), 403 (not authorized to create orders), 409 (duplicate order reference), 422 (validation errors like 'inventory unavailable')."
64
+ - P1: "Error response format varies between endpoints. /users returns {error: string} while /orders returns {code: number, message: string, details: object}. Standardize."
65
+ - P2: "No endpoint documents a 429 (rate limited) response, but the architecture mentions rate limiting as a requirement."
66
+
67
+ ---
68
+
69
+ ## Pass 3: Auth/AuthZ Coverage
70
+
71
+ ### What to Check
72
+
73
+ Every endpoint specifies its authentication requirements (who can call it) and authorization rules (what permissions are needed). No endpoint is left with ambiguous access control.
74
+
75
+ ### Why This Matters
76
+
77
+ Endpoints without documented auth requirements default to "anyone can call this" in implementation. This is a security vulnerability when the endpoint should be restricted. Even internal service-to-service endpoints need auth documentation — "internal only, requires service token" is a valid auth specification.
78
+
79
+ ### How to Check
80
+
81
+ 1. For each endpoint, check for authentication specification: unauthenticated, user token, service token, API key, etc.
82
+ 2. For authenticated endpoints, check for authorization specification: what role, permission, or ownership is required?
83
+ 3. Verify that resource-ownership authorization is documented: "users can only access their own orders" (not just "requires user role")
84
+ 4. Check for admin/superuser endpoints: are they clearly distinguished from regular user endpoints?
85
+ 5. Verify that public endpoints are explicitly marked as public (not just missing auth — intentional vs. accidental)
86
+ 6. Check for cross-service authentication: how do services authenticate to each other?
87
+
88
+ ### What a Finding Looks Like
89
+
90
+ - P0: "DELETE /users/{id} has no auth specification. Can any authenticated user delete any user? Only admins? Only the user themselves?"
91
+ - P1: "GET /orders/{id} requires authentication but does not specify authorization. Can any authenticated user view any order, or only their own?"
92
+ - P2: "Service-to-service endpoints (e.g., /internal/inventory/reserve) do not document the authentication mechanism. Are they protected by network isolation, service tokens, or mTLS?"
93
+
94
+ ---
95
+
96
+ ## Pass 4: Versioning Consistency
97
+
98
+ ### What to Check
99
+
100
+ API versioning strategy is consistent across all endpoints and aligns with the ADR on API versioning. Version handling is explicit, not assumed.
101
+
102
+ ### Why This Matters
103
+
104
+ Inconsistent versioning makes it impossible for clients to know which version they are consuming. If some endpoints use URL versioning (/v1/), others use header versioning (Accept: application/vnd.api.v1+json), and others have no versioning, client SDK generation and API gateway configuration become fragmented.
105
+
106
+ ### How to Check
107
+
108
+ 1. Find the ADR on API versioning strategy
109
+ 2. Verify every endpoint follows the same versioning scheme
110
+ 3. Check for endpoints with no version indicator — are they intentionally unversioned (health checks, root) or accidentally unversioned?
111
+ 4. If URL versioning is used, verify all paths include the version prefix
112
+ 5. Check for backward compatibility commitments: what changes are considered breaking?
113
+ 6. Verify that the contract documents how clients should handle version upgrades
114
+
115
+ ### What a Finding Looks Like
116
+
117
+ - P1: "ADR-008 specifies URL-based versioning (/v1/), but three endpoints omit the version prefix: /health, /orders/webhook, /auth/token."
118
+ - P1: "Some endpoints use /v1/ prefix and others use /api/v1/ prefix. Inconsistent path structure."
119
+ - P2: "No documentation on what constitutes a breaking change versus a backward-compatible change. Clients do not know when to expect a version bump."
120
+
121
+ ---
122
+
123
+ ## Pass 5: Payload Shape vs Domain Entities
124
+
125
+ ### What to Check
126
+
127
+ Request and response payloads align with domain model entities. Field names match domain terminology. Field types match domain attribute types. Payload structure reflects domain relationships.
128
+
129
+ ### Why This Matters
130
+
131
+ Misalignment between API payloads and domain entities creates a translation layer that implementing agents must build and maintain. If the domain entity uses "orderedAt" but the API returns "created_date," every consumer must know about the mapping. Alignment reduces cognitive load and bug surface.
132
+
133
+ ### How to Check
134
+
135
+ 1. For each endpoint, compare request/response fields to the corresponding domain entity attributes
136
+ 2. Check field names: do they match domain terminology (ubiquitous language)?
137
+ 3. Check field types: if the domain model says "Money" (amount + currency), does the API represent it the same way or split/merge fields?
138
+ 4. Check nested structures: do response shapes reflect domain aggregate boundaries?
139
+ 5. Verify that API responses do not expose internal database fields (auto-increment IDs, internal status codes, audit columns) unless intentional
140
+ 6. Check for missing fields: domain entity attributes that are absent from the API response (may be intentional for security, or may be a gap)
141
+
142
+ ### What a Finding Looks Like
143
+
144
+ - P1: "Domain entity 'Order' uses 'placedAt' (DateTime) but API response uses 'createdDate' (string). Name mismatch and type mismatch."
145
+ - P1: "Domain entity 'Product' has a 'price' attribute modeled as Money (amount + currency), but the API returns 'price' as a plain number with no currency. Multi-currency support will break."
146
+ - P2: "API response includes 'internal_status_code' field which is a database implementation detail, not a domain concept."
147
+
148
+ ---
149
+
150
+ ## Pass 6: Idempotency
151
+
152
+ ### What to Check
153
+
154
+ Mutating operations (POST, PUT, PATCH, DELETE) document their idempotency behavior. Operations that should be idempotent specify the mechanism (idempotency keys, natural idempotency).
155
+
156
+ ### Why This Matters
157
+
158
+ Non-idempotent operations cause duplicate side effects on retry. If a client retries a failed POST /orders (network timeout, unclear response), the system may create two orders. Idempotency documentation tells client developers whether they can safely retry and how to do so.
159
+
160
+ ### How to Check
161
+
162
+ 1. For each POST endpoint, check: is it idempotent? If yes, what mechanism (idempotency key header, natural deduplication by business key)?
163
+ 2. For each PUT endpoint, verify it is naturally idempotent (same PUT produces the same result)
164
+ 3. For each PATCH endpoint, check if idempotency depends on the specific operation (appending to a list is not idempotent; setting a value is)
165
+ 4. For each DELETE endpoint, verify behavior on repeated calls (first call deletes, subsequent calls return 404 or 204?)
166
+ 5. Check for operations with side effects (sending emails, charging payments) — these must be idempotent or explicitly documented as non-idempotent
167
+ 6. Verify that the idempotency mechanism is documented for clients: what header to send, how long the idempotency key is valid, what happens on key reuse
168
+
169
+ ### What a Finding Looks Like
170
+
171
+ - P0: "POST /payments/charge has no idempotency specification. A client retry could charge the customer twice."
172
+ - P1: "POST /orders documents an idempotency key mechanism but does not specify the header name, key format, or expiration window."
173
+ - P2: "DELETE /orders/{id} does not specify behavior on repeated calls. Does the second DELETE return 404 (resource not found) or 204 (success, already deleted)?"
174
+
175
+ ---
176
+
177
+ ## Pass 7: Pagination/Filtering
178
+
179
+ ### What to Check
180
+
181
+ List endpoints have pagination designed. Filter and sort parameters are documented. Response includes pagination metadata.
182
+
183
+ ### Why This Matters
184
+
185
+ Unpaginated list endpoints return unbounded result sets. In development this works fine; in production with thousands of records, a single unpaginated call can crash the server or the client. Pagination must be designed, not retrofitted — retrofitting changes the API contract and breaks existing clients.
186
+
187
+ ### How to Check
188
+
189
+ 1. Identify every list/collection endpoint (GET endpoints returning arrays)
190
+ 2. Verify each has pagination parameters documented (page/size, cursor-based, or offset/limit)
191
+ 3. Check that pagination response includes metadata: total count (or has-next indicator), current page/cursor, page size
192
+ 4. Verify that filter parameters are documented for common query patterns (identified in architecture data flows)
193
+ 5. Check sort parameters: which fields can be sorted on? What is the default sort order?
194
+ 6. Verify maximum page size is specified and enforced (prevents clients requesting 10,000 records)
195
+ 7. For cursor-based pagination, check that cursor format and stability guarantees are documented
196
+
197
+ ### What a Finding Looks Like
198
+
199
+ - P0: "GET /orders returns all orders with no pagination parameters. With 100,000 orders, this endpoint will timeout or crash."
200
+ - P1: "GET /products has pagination (page, size) but no filter parameters. The architecture's data flow shows 'search products by category and price range' as a primary use case."
201
+ - P2: "Pagination response includes 'total_count' but does not specify whether this is an exact count or an estimate (important for large datasets)."
202
+
203
+ ---
204
+
205
+ ## Pass 8: Downstream Readiness
206
+
207
+ ### What to Check
208
+
209
+ The UX spec and implementation tasks steps can proceed with these API contracts. The API provides everything needed to build frontend interactions and define backend tasks.
210
+
211
+ ### Why This Matters
212
+
213
+ The UX spec needs to know what data is available from the API to design screens. Implementation tasks need to know the API surface to scope work. Gaps in the API contract create ambiguity in both downstream phases.
214
+
215
+ ### How to Check
216
+
217
+ The UX spec step needs:
218
+ 1. Every user-facing action has a corresponding API endpoint
219
+ 2. Response shapes are detailed enough to design screen layouts (know what fields are available)
220
+ 3. Error responses are documented enough to design error states
221
+ 4. Loading states are inferable: which operations are fast (synchronous) vs. slow (async with polling)?
222
+
223
+ The implementation tasks step needs:
224
+ 1. Endpoint complexity is visible: which endpoints are simple CRUD, which require complex business logic?
225
+ 2. Dependencies between endpoints are clear: which endpoints must be built first?
226
+ 3. Integration points with external services are specified
227
+ 4. Authentication/authorization requirements are detailed enough to implement
228
+
229
+ ### What a Finding Looks Like
230
+
231
+ - P0: "The UX wireframe shows a 'user dashboard' with order count, recent orders, and account balance, but the API has no endpoint that provides this aggregated data. The frontend would need to make 3+ separate calls."
232
+ - P1: "Several endpoints are marked as 'async' (returns 202) but there is no documented polling or webhook mechanism for the frontend to get the result."
233
+ - P2: "API response examples do not include null/empty cases. The UX spec needs to know what an empty order list or a user with no profile photo looks like in API terms."