@atlashub/smartstack-cli 3.39.0 → 3.41.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 (472) hide show
  1. package/.documentation/apex.html +644 -644
  2. package/.documentation/css/styles.css +2320 -2320
  3. package/.documentation/init.html +1377 -1377
  4. package/.documentation/js/app.js +780 -780
  5. package/.documentation/prd-json-v2.0.0.md +396 -396
  6. package/.documentation/testing-ba-e2e.md +462 -462
  7. package/config/default-config.json +95 -95
  8. package/config/mcp-defaults.json +62 -62
  9. package/config/settings.json +53 -53
  10. package/config/settings.local.example.json +16 -16
  11. package/dist/index.js +6 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp-entry.mjs +6 -4
  14. package/dist/mcp-entry.mjs.map +1 -1
  15. package/package.json +115 -115
  16. package/scripts/extract-api-endpoints.ts +325 -325
  17. package/scripts/extract-business-rules.ts +440 -440
  18. package/scripts/generate-doc-with-mock-ui.ts +804 -804
  19. package/scripts/health-check.sh +168 -168
  20. package/scripts/postinstall.js +18 -18
  21. package/templates/agents/action.md +37 -37
  22. package/templates/agents/ba-reader.md +378 -378
  23. package/templates/agents/ba-writer.md +861 -861
  24. package/templates/agents/code-reviewer.md +163 -163
  25. package/templates/agents/db-reader.md +149 -149
  26. package/templates/agents/docs-context-reader.md +143 -143
  27. package/templates/agents/docs-sync-checker.md +122 -122
  28. package/templates/agents/efcore/conflicts.md +95 -84
  29. package/templates/agents/efcore/db-deploy.md +85 -74
  30. package/templates/agents/efcore/db-reset.md +96 -85
  31. package/templates/agents/efcore/db-seed.md +72 -61
  32. package/templates/agents/efcore/db-status.md +97 -86
  33. package/templates/agents/efcore/migration.md +197 -186
  34. package/templates/agents/efcore/rebase-snapshot.md +119 -108
  35. package/templates/agents/efcore/scan.md +103 -92
  36. package/templates/agents/efcore/squash.md +172 -161
  37. package/templates/agents/explore-codebase.md +66 -66
  38. package/templates/agents/explore-docs.md +98 -98
  39. package/templates/agents/fix-grammar.md +50 -50
  40. package/templates/agents/gitflow/abort.md +45 -45
  41. package/templates/agents/gitflow/cleanup.md +96 -96
  42. package/templates/agents/gitflow/commit.md +236 -236
  43. package/templates/agents/gitflow/exec.md +48 -48
  44. package/templates/agents/gitflow/finish.md +146 -146
  45. package/templates/agents/gitflow/init-clone.md +199 -199
  46. package/templates/agents/gitflow/init-detect.md +137 -137
  47. package/templates/agents/gitflow/init-validate.md +225 -225
  48. package/templates/agents/gitflow/init.md +340 -340
  49. package/templates/agents/gitflow/merge.md +145 -145
  50. package/templates/agents/gitflow/plan.md +42 -42
  51. package/templates/agents/gitflow/pr.md +191 -191
  52. package/templates/agents/gitflow/review.md +49 -49
  53. package/templates/agents/gitflow/start.md +147 -147
  54. package/templates/agents/gitflow/status.md +95 -95
  55. package/templates/agents/mcp-healthcheck.md +163 -163
  56. package/templates/agents/snipper.md +37 -37
  57. package/templates/agents/websearch.md +46 -46
  58. package/templates/hooks/appsettings-guard.sh +76 -76
  59. package/templates/hooks/docs-drift-check.md +96 -96
  60. package/templates/hooks/ef-migration-check.md +139 -139
  61. package/templates/hooks/hooks.json +58 -58
  62. package/templates/hooks/mcp-check.md +64 -64
  63. package/templates/hooks/ralph-mcp-logger.sh +46 -46
  64. package/templates/hooks/ralph-session-end.sh +69 -69
  65. package/templates/hooks/stop-hook.sh +177 -177
  66. package/templates/hooks/wsl-dotnet-cleanup.sh +24 -24
  67. package/templates/mcp-scaffolding/component.tsx.hbs +318 -318
  68. package/templates/mcp-scaffolding/controller.cs.hbs +192 -192
  69. package/templates/mcp-scaffolding/entity-extension.cs.hbs +239 -239
  70. package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +116 -116
  71. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -133
  72. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -126
  73. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +261 -261
  74. package/templates/mcp-scaffolding/service-extension.cs.hbs +53 -53
  75. package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +436 -436
  76. package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +239 -239
  77. package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +441 -441
  78. package/templates/mcp-scaffolding/tests/security.test.cs.hbs +442 -442
  79. package/templates/mcp-scaffolding/tests/service.test.cs.hbs +402 -402
  80. package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +428 -428
  81. package/templates/project/DependencyInjection.Application.cs.template +25 -25
  82. package/templates/project/DependencyInjection.Infrastructure.cs.template +61 -61
  83. package/templates/project/DesignTimeExtensionsDbContextFactory.cs.template +70 -70
  84. package/templates/project/ExampleEntity.cs.template +116 -116
  85. package/templates/project/ExampleEntityConfiguration.cs.template +64 -64
  86. package/templates/project/ExampleService.cs.template +146 -146
  87. package/templates/project/ExtensionsDbContext.cs.template +41 -41
  88. package/templates/project/IExtensionsDbContext.cs.template +22 -22
  89. package/templates/project/Program.cs.template +47 -47
  90. package/templates/project/README.md +79 -79
  91. package/templates/project/api.ts.template +12 -12
  92. package/templates/project/appsettings.json.template +170 -170
  93. package/templates/project/claude-settings.json.template +5 -5
  94. package/templates/project/test-frontend/msw/handlers.ts +58 -58
  95. package/templates/project/test-frontend/msw/server.ts +25 -25
  96. package/templates/project/test-frontend/setup.ts +16 -16
  97. package/templates/project/test-frontend/test-utils.tsx +59 -59
  98. package/templates/project/test-frontend/vitest.config.ts +31 -31
  99. package/templates/ralph/README.md +93 -93
  100. package/templates/ralph/ralph.config.yaml +113 -113
  101. package/templates/scripts/setup-ralph-loop.sh +173 -173
  102. package/templates/skills/_resources/config-safety.md +61 -61
  103. package/templates/skills/_resources/context-digest-template.md +53 -53
  104. package/templates/skills/_resources/doc-context-cache.md +60 -60
  105. package/templates/skills/_resources/docs-manifest-schema.md +155 -155
  106. package/templates/skills/_resources/formatting-guide.md +124 -124
  107. package/templates/skills/_resources/mcp-validate-documentation-spec.md +181 -181
  108. package/templates/skills/_shared.md +228 -228
  109. package/templates/skills/admin/SKILL.md +48 -48
  110. package/templates/skills/ai-prompt/SKILL.md +107 -107
  111. package/templates/skills/ai-prompt/steps/step-00-init.md +47 -47
  112. package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -122
  113. package/templates/skills/apex/SKILL.md +168 -168
  114. package/templates/skills/apex/_shared.md +141 -141
  115. package/templates/skills/apex/references/agent-teams-protocol.md +164 -164
  116. package/templates/skills/apex/references/analysis-methods.md +141 -141
  117. package/templates/skills/apex/references/challenge-questions.md +145 -145
  118. package/templates/skills/apex/references/code-generation.md +412 -412
  119. package/templates/skills/apex/references/core-seed-data.md +1437 -1437
  120. package/templates/skills/apex/references/error-classification.md +144 -144
  121. package/templates/skills/apex/references/examine-build-validation.md +82 -82
  122. package/templates/skills/apex/references/execution-frontend-gates.md +177 -177
  123. package/templates/skills/apex/references/execution-frontend-patterns.md +105 -105
  124. package/templates/skills/apex/references/execution-layer1-rules.md +96 -96
  125. package/templates/skills/apex/references/initialization-challenge-flow.md +110 -110
  126. package/templates/skills/apex/references/planning-layer-mapping.md +151 -151
  127. package/templates/skills/apex/references/post-checks.md +1584 -1584
  128. package/templates/skills/apex/references/smartstack-api.md +1053 -1053
  129. package/templates/skills/apex/references/smartstack-frontend.md +1571 -1571
  130. package/templates/skills/apex/references/smartstack-layers.md +402 -402
  131. package/templates/skills/apex/steps/step-00-init.md +307 -307
  132. package/templates/skills/apex/steps/step-01-analyze.md +165 -165
  133. package/templates/skills/apex/steps/step-02-plan.md +144 -144
  134. package/templates/skills/apex/steps/step-03-execute.md +328 -328
  135. package/templates/skills/apex/steps/step-04-examine.md +263 -263
  136. package/templates/skills/apex/steps/step-05-deep-review.md +129 -129
  137. package/templates/skills/apex/steps/step-06-resolve.md +101 -101
  138. package/templates/skills/apex/steps/step-07-tests.md +238 -238
  139. package/templates/skills/apex/steps/step-08-run-tests.md +125 -125
  140. package/templates/skills/application/SKILL.md +4 -4
  141. package/templates/skills/application/references/application-roles-template.md +227 -227
  142. package/templates/skills/application/references/backend-controller-hierarchy.md +58 -58
  143. package/templates/skills/application/references/backend-entity-seeding.md +72 -72
  144. package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -83
  145. package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -79
  146. package/templates/skills/application/references/backend-verification.md +88 -88
  147. package/templates/skills/application/references/frontend-i18n-and-output.md +67 -67
  148. package/templates/skills/application/references/frontend-route-naming.md +117 -117
  149. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -107
  150. package/templates/skills/application/references/frontend-verification.md +156 -156
  151. package/templates/skills/application/references/migration-checklist-troubleshooting.md +1 -1
  152. package/templates/skills/application/references/provider-template.md +177 -177
  153. package/templates/skills/application/references/roles-client-project-handling.md +55 -55
  154. package/templates/skills/application/references/roles-fallback-procedure.md +149 -149
  155. package/templates/skills/application/references/test-coverage-requirements.md +213 -213
  156. package/templates/skills/application/references/test-frontend.md +73 -73
  157. package/templates/skills/application/references/test-prerequisites.md +72 -72
  158. package/templates/skills/application/steps/step-05-frontend.md +176 -176
  159. package/templates/skills/application/steps/step-06-migration.md +193 -193
  160. package/templates/skills/application/steps/step-07-tests.md +356 -356
  161. package/templates/skills/application/steps/step-08-documentation.md +137 -137
  162. package/templates/skills/application/templates-backend.md +463 -463
  163. package/templates/skills/application/templates-frontend.md +685 -685
  164. package/templates/skills/application/templates-i18n.md +520 -520
  165. package/templates/skills/application/templates-seed.md +1096 -1096
  166. package/templates/skills/business-analyse/SKILL.md +327 -327
  167. package/templates/skills/business-analyse/_architecture.md +123 -123
  168. package/templates/skills/business-analyse/_elicitation.md +206 -206
  169. package/templates/skills/business-analyse/_module-loop.md +115 -115
  170. package/templates/skills/business-analyse/_shared.md +383 -383
  171. package/templates/skills/business-analyse/_suggestions.md +34 -34
  172. package/templates/skills/business-analyse/html/ba-interactive.html +4477 -4477
  173. package/templates/skills/business-analyse/html/build-html.js +77 -77
  174. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +150 -150
  175. package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +227 -227
  176. package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +199 -199
  177. package/templates/skills/business-analyse/html/src/scripts/04-render-modules.js +205 -205
  178. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +647 -647
  179. package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +195 -195
  180. package/templates/skills/business-analyse/html/src/scripts/07-render-handoff.js +92 -92
  181. package/templates/skills/business-analyse/html/src/scripts/08-editing.js +135 -135
  182. package/templates/skills/business-analyse/html/src/scripts/09-export.js +168 -168
  183. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +171 -171
  184. package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +166 -166
  185. package/templates/skills/business-analyse/html/src/styles/01-variables.css +38 -38
  186. package/templates/skills/business-analyse/html/src/styles/02-layout.css +101 -101
  187. package/templates/skills/business-analyse/html/src/styles/03-navigation.css +120 -120
  188. package/templates/skills/business-analyse/html/src/styles/04-cards.css +196 -196
  189. package/templates/skills/business-analyse/html/src/styles/05-modules.css +454 -454
  190. package/templates/skills/business-analyse/html/src/styles/06-wireframes.css +272 -272
  191. package/templates/skills/business-analyse/html/src/styles/07-comments.css +184 -184
  192. package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +241 -241
  193. package/templates/skills/business-analyse/html/src/template.html +516 -516
  194. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +546 -546
  195. package/templates/skills/business-analyse/questionnaire/00-application.md +160 -160
  196. package/templates/skills/business-analyse/questionnaire/00b-project.md +85 -85
  197. package/templates/skills/business-analyse/questionnaire/01-context.md +185 -185
  198. package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +189 -189
  199. package/templates/skills/business-analyse/questionnaire/03-scope.md +164 -164
  200. package/templates/skills/business-analyse/questionnaire/04-data.md +88 -88
  201. package/templates/skills/business-analyse/questionnaire/05-integrations.md +58 -58
  202. package/templates/skills/business-analyse/questionnaire/06-security.md +68 -68
  203. package/templates/skills/business-analyse/questionnaire/07-ui.md +76 -76
  204. package/templates/skills/business-analyse/questionnaire/08-performance.md +42 -42
  205. package/templates/skills/business-analyse/questionnaire/09-constraints.md +45 -45
  206. package/templates/skills/business-analyse/questionnaire/10-documentation.md +43 -43
  207. package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +59 -59
  208. package/templates/skills/business-analyse/questionnaire/12-migration.md +58 -58
  209. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +69 -69
  210. package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +135 -135
  211. package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +136 -136
  212. package/templates/skills/business-analyse/questionnaire.md +337 -337
  213. package/templates/skills/business-analyse/react/application-viewer.md +242 -242
  214. package/templates/skills/business-analyse/react/components.md +551 -551
  215. package/templates/skills/business-analyse/react/i18n-template.md +306 -306
  216. package/templates/skills/business-analyse/references/acceptance-criteria.md +169 -169
  217. package/templates/skills/business-analyse/references/agent-module-prompt.md +362 -362
  218. package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +557 -557
  219. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -190
  220. package/templates/skills/business-analyse/references/cache-warming-strategy.md +566 -566
  221. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -41
  222. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -74
  223. package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +115 -115
  224. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +68 -69
  225. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +85 -85
  226. package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -297
  227. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +107 -107
  228. package/templates/skills/business-analyse/references/deploy-data-build.md +180 -180
  229. package/templates/skills/business-analyse/references/deploy-modes.md +118 -118
  230. package/templates/skills/business-analyse/references/detection-strategies.md +424 -424
  231. package/templates/skills/business-analyse/references/entity-architecture-decision.md +218 -218
  232. package/templates/skills/business-analyse/references/handoff-file-templates.md +120 -120
  233. package/templates/skills/business-analyse/references/handoff-mappings.md +81 -81
  234. package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -312
  235. package/templates/skills/business-analyse/references/html-data-mapping.md +299 -299
  236. package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -65
  237. package/templates/skills/business-analyse/references/naming-conventions.md +243 -243
  238. package/templates/skills/business-analyse/references/prd-generation.md +258 -258
  239. package/templates/skills/business-analyse/references/review-data-mapping.md +363 -363
  240. package/templates/skills/business-analyse/references/robustness-checks.md +542 -542
  241. package/templates/skills/business-analyse/references/spec-auto-inference.md +111 -111
  242. package/templates/skills/business-analyse/references/team-orchestration.md +1022 -1022
  243. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -85
  244. package/templates/skills/business-analyse/references/ui-resource-cards.md +259 -259
  245. package/templates/skills/business-analyse/references/validate-incremental-html.md +121 -121
  246. package/templates/skills/business-analyse/references/validation-checklist.md +347 -347
  247. package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +335 -335
  248. package/templates/skills/business-analyse/schemas/application-schema.json +453 -453
  249. package/templates/skills/business-analyse/schemas/feature-schema.json +53 -53
  250. package/templates/skills/business-analyse/schemas/project-schema.json +485 -485
  251. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +201 -201
  252. package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +82 -82
  253. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +80 -80
  254. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +70 -70
  255. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +547 -547
  256. package/templates/skills/business-analyse/schemas/sections/validation-schema.json +93 -93
  257. package/templates/skills/business-analyse/schemas/shared/common-defs.json +226 -226
  258. package/templates/skills/business-analyse/steps/step-00-init.md +575 -576
  259. package/templates/skills/business-analyse/steps/step-01-cadrage.md +767 -767
  260. package/templates/skills/business-analyse/steps/step-01b-applications.md +419 -419
  261. package/templates/skills/business-analyse/steps/step-02-decomposition.md +387 -387
  262. package/templates/skills/business-analyse/steps/step-03a-data.md +16 -16
  263. package/templates/skills/business-analyse/steps/step-03a1-setup.md +506 -506
  264. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +252 -252
  265. package/templates/skills/business-analyse/steps/step-03b-ui.md +425 -425
  266. package/templates/skills/business-analyse/steps/step-03c-compile.md +611 -611
  267. package/templates/skills/business-analyse/steps/step-03d-validate.md +783 -783
  268. package/templates/skills/business-analyse/steps/step-04-consolidation.md +17 -17
  269. package/templates/skills/business-analyse/steps/step-04a-collect.md +415 -415
  270. package/templates/skills/business-analyse/steps/step-04b-analyze.md +163 -163
  271. package/templates/skills/business-analyse/steps/step-04c-decide.md +186 -186
  272. package/templates/skills/business-analyse/steps/step-05a-handoff.md +840 -840
  273. package/templates/skills/business-analyse/steps/step-05b-deploy.md +522 -522
  274. package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +703 -703
  275. package/templates/skills/business-analyse/steps/step-06-review.md +278 -278
  276. package/templates/skills/business-analyse/templates/tpl-frd.md +168 -168
  277. package/templates/skills/business-analyse/templates/tpl-handoff.md +186 -186
  278. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +59 -59
  279. package/templates/skills/business-analyse/templates/tpl-progress.md +172 -172
  280. package/templates/skills/business-analyse/templates-frd.md +476 -476
  281. package/templates/skills/business-analyse/templates-react.md +574 -574
  282. package/templates/skills/cc-agent/SKILL.md +129 -129
  283. package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -95
  284. package/templates/skills/cc-agent/references/agent-frontmatter.md +213 -213
  285. package/templates/skills/cc-agent/references/permission-modes.md +102 -102
  286. package/templates/skills/cc-agent/references/tools-reference.md +144 -144
  287. package/templates/skills/cc-agent/steps/step-00-init.md +134 -134
  288. package/templates/skills/cc-agent/steps/step-01-design.md +186 -186
  289. package/templates/skills/cc-agent/steps/step-02-generate.md +131 -131
  290. package/templates/skills/cc-agent/steps/step-03-validate.md +130 -130
  291. package/templates/skills/cc-agent/templates/agent-categorized.md +67 -67
  292. package/templates/skills/cc-agent/templates/agent-standalone.md +56 -56
  293. package/templates/skills/cc-agent/templates/agent-with-skills.md +94 -94
  294. package/templates/skills/cc-audit/SKILL.md +108 -108
  295. package/templates/skills/cc-audit/references/agent-checklist.md +91 -91
  296. package/templates/skills/cc-audit/references/hook-checklist.md +110 -110
  297. package/templates/skills/cc-audit/references/skill-checklist.md +70 -70
  298. package/templates/skills/cc-audit/steps/step-00-init.md +98 -98
  299. package/templates/skills/cc-audit/steps/step-01-scan.md +142 -142
  300. package/templates/skills/cc-audit/steps/step-02-analyze.md +158 -158
  301. package/templates/skills/cc-audit/steps/step-03-report.md +142 -142
  302. package/templates/skills/cc-skill/SKILL.md +134 -134
  303. package/templates/skills/cc-skill/references/best-practices.md +167 -167
  304. package/templates/skills/cc-skill/references/frontmatter-reference.md +182 -182
  305. package/templates/skills/cc-skill/references/skill-patterns.md +199 -199
  306. package/templates/skills/cc-skill/steps/step-00-init.md +119 -119
  307. package/templates/skills/cc-skill/steps/step-01-design.md +199 -199
  308. package/templates/skills/cc-skill/steps/step-02-generate.md +145 -145
  309. package/templates/skills/cc-skill/steps/step-03-steps.md +151 -151
  310. package/templates/skills/cc-skill/steps/step-04-validate.md +124 -124
  311. package/templates/skills/cc-skill/templates/skill-forked.md +85 -85
  312. package/templates/skills/cc-skill/templates/skill-progressive.md +102 -102
  313. package/templates/skills/cc-skill/templates/skill-simple.md +75 -75
  314. package/templates/skills/cc-skill/templates/step-template.md +82 -82
  315. package/templates/skills/check-version/SKILL.md +196 -196
  316. package/templates/skills/controller/SKILL.md +162 -162
  317. package/templates/skills/controller/postman-templates.md +614 -614
  318. package/templates/skills/controller/references/controller-code-templates.md +159 -159
  319. package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -209
  320. package/templates/skills/controller/references/permission-sync-templates.md +149 -149
  321. package/templates/skills/controller/steps/step-00-init.md +193 -191
  322. package/templates/skills/controller/steps/step-01-analyze.md +146 -146
  323. package/templates/skills/controller/steps/step-02-plan.md +176 -176
  324. package/templates/skills/controller/steps/step-03-generate.md +189 -189
  325. package/templates/skills/controller/steps/step-04-perms.md +80 -80
  326. package/templates/skills/controller/steps/step-05-validate.md +107 -107
  327. package/templates/skills/controller/templates.md +1555 -1555
  328. package/templates/skills/debug/SKILL.md +70 -70
  329. package/templates/skills/debug/references/team-protocol.md +232 -232
  330. package/templates/skills/debug/steps/step-00-init.md +57 -57
  331. package/templates/skills/debug/steps/step-01-analyze.md +219 -219
  332. package/templates/skills/debug/steps/step-02-resolve.md +85 -85
  333. package/templates/skills/documentation/SKILL.md +132 -132
  334. package/templates/skills/documentation/data-schema.md +227 -227
  335. package/templates/skills/documentation/steps/step-00-init.md +70 -70
  336. package/templates/skills/documentation/steps/step-01-scan.md +113 -113
  337. package/templates/skills/documentation/steps/step-02-generate.md +231 -231
  338. package/templates/skills/documentation/steps/step-03-validate.md +251 -238
  339. package/templates/skills/documentation/templates.md +662 -663
  340. package/templates/skills/efcore/SKILL.md +168 -167
  341. package/templates/skills/efcore/references/both-contexts.md +32 -32
  342. package/templates/skills/efcore/references/database-operations.md +67 -67
  343. package/templates/skills/efcore/references/destructive-operations.md +38 -38
  344. package/templates/skills/efcore/references/reset-operations.md +81 -81
  345. package/templates/skills/efcore/references/seed-methods.md +86 -86
  346. package/templates/skills/efcore/references/shared-init-functions.md +250 -250
  347. package/templates/skills/efcore/references/sql-objects-injection.md +61 -61
  348. package/templates/skills/efcore/references/troubleshooting.md +81 -81
  349. package/templates/skills/efcore/references/zero-downtime-patterns.md +227 -227
  350. package/templates/skills/efcore/steps/db/step-deploy.md +217 -217
  351. package/templates/skills/efcore/steps/db/step-reset.md +186 -186
  352. package/templates/skills/efcore/steps/db/step-seed.md +166 -166
  353. package/templates/skills/efcore/steps/db/step-status.md +173 -173
  354. package/templates/skills/efcore/steps/migration/step-00-init.md +102 -102
  355. package/templates/skills/efcore/steps/migration/step-01-check.md +164 -164
  356. package/templates/skills/efcore/steps/migration/step-02-create.md +160 -160
  357. package/templates/skills/efcore/steps/migration/step-03-validate.md +168 -168
  358. package/templates/skills/efcore/steps/rebase-snapshot/step-00-init.md +173 -173
  359. package/templates/skills/efcore/steps/rebase-snapshot/step-01-backup.md +100 -100
  360. package/templates/skills/efcore/steps/rebase-snapshot/step-02-fetch.md +115 -115
  361. package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +112 -112
  362. package/templates/skills/efcore/steps/rebase-snapshot/step-04-validate.md +157 -157
  363. package/templates/skills/efcore/steps/shared/step-00-init.md +131 -131
  364. package/templates/skills/efcore/steps/squash/step-00-init.md +141 -141
  365. package/templates/skills/efcore/steps/squash/step-01-backup.md +120 -120
  366. package/templates/skills/efcore/steps/squash/step-02-fetch.md +168 -168
  367. package/templates/skills/efcore/steps/squash/step-03-create.md +184 -184
  368. package/templates/skills/efcore/steps/squash/step-04-validate.md +174 -174
  369. package/templates/skills/explore/SKILL.md +98 -98
  370. package/templates/skills/feature-full/SKILL.md +111 -111
  371. package/templates/skills/feature-full/steps/step-00-init.md +57 -57
  372. package/templates/skills/feature-full/steps/step-01-implementation.md +120 -120
  373. package/templates/skills/gitflow/SKILL.md +377 -377
  374. package/templates/skills/gitflow/_shared.md +620 -620
  375. package/templates/skills/gitflow/phases/abort.md +189 -189
  376. package/templates/skills/gitflow/phases/cleanup.md +234 -234
  377. package/templates/skills/gitflow/phases/status.md +192 -192
  378. package/templates/skills/gitflow/references/commit-message-generation.md +58 -58
  379. package/templates/skills/gitflow/references/commit-migration-validation.md +49 -49
  380. package/templates/skills/gitflow/references/finish-cleanup.md +55 -55
  381. package/templates/skills/gitflow/references/finish-version-bumping.md +45 -45
  382. package/templates/skills/gitflow/references/init-config-template.md +135 -135
  383. package/templates/skills/gitflow/references/init-environment-detection.md +41 -41
  384. package/templates/skills/gitflow/references/init-name-normalization.md +103 -103
  385. package/templates/skills/gitflow/references/init-questions.md +185 -185
  386. package/templates/skills/gitflow/references/init-structure-creation.md +75 -75
  387. package/templates/skills/gitflow/references/init-version-detection.md +21 -21
  388. package/templates/skills/gitflow/references/init-workspace-detection.md +43 -43
  389. package/templates/skills/gitflow/references/merge-ci-status.md +36 -36
  390. package/templates/skills/gitflow/references/merge-execution.md +62 -62
  391. package/templates/skills/gitflow/references/merge-pr-context.md +76 -76
  392. package/templates/skills/gitflow/references/plan-template.md +69 -69
  393. package/templates/skills/gitflow/references/pr-build-checks.md +60 -60
  394. package/templates/skills/gitflow/references/pr-generation.md +58 -58
  395. package/templates/skills/gitflow/references/start-branch-normalization.md +28 -28
  396. package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -70
  397. package/templates/skills/gitflow/references/start-local-config.md +113 -113
  398. package/templates/skills/gitflow/references/start-worktree-creation.md +50 -50
  399. package/templates/skills/gitflow/references/sync-push-verify.md +44 -44
  400. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -38
  401. package/templates/skills/gitflow/steps/step-commit.md +199 -199
  402. package/templates/skills/gitflow/steps/step-finish.md +147 -147
  403. package/templates/skills/gitflow/steps/step-init.md +190 -190
  404. package/templates/skills/gitflow/steps/step-merge.md +85 -85
  405. package/templates/skills/gitflow/steps/step-plan.md +151 -151
  406. package/templates/skills/gitflow/steps/step-pr.md +199 -199
  407. package/templates/skills/gitflow/steps/step-start.md +195 -195
  408. package/templates/skills/gitflow/steps/step-sync.md +161 -161
  409. package/templates/skills/gitflow/templates/config.json +72 -72
  410. package/templates/skills/mcp/SKILL.md +62 -62
  411. package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -108
  412. package/templates/skills/mcp/steps/step-02-tools.md +73 -73
  413. package/templates/skills/notification/SKILL.md +173 -173
  414. package/templates/skills/quick-search/SKILL.md +99 -99
  415. package/templates/skills/ralph-loop/SKILL.md +234 -234
  416. package/templates/skills/ralph-loop/references/category-completeness.md +185 -185
  417. package/templates/skills/ralph-loop/references/category-rules.md +96 -96
  418. package/templates/skills/ralph-loop/references/compact-loop.md +300 -300
  419. package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -127
  420. package/templates/skills/ralph-loop/references/module-transition.md +151 -151
  421. package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -171
  422. package/templates/skills/ralph-loop/references/parallel-execution.md +246 -246
  423. package/templates/skills/ralph-loop/references/section-splitting.md +439 -439
  424. package/templates/skills/ralph-loop/references/task-transform-legacy.md +256 -256
  425. package/templates/skills/ralph-loop/references/team-orchestration.md +547 -547
  426. package/templates/skills/ralph-loop/steps/step-00-init.md +150 -150
  427. package/templates/skills/ralph-loop/steps/step-01-task.md +174 -174
  428. package/templates/skills/ralph-loop/steps/step-02-execute.md +177 -177
  429. package/templates/skills/ralph-loop/steps/step-03-commit.md +92 -92
  430. package/templates/skills/ralph-loop/steps/step-04-check.md +207 -207
  431. package/templates/skills/ralph-loop/steps/step-05-report.md +175 -175
  432. package/templates/skills/refactor/SKILL.md +56 -56
  433. package/templates/skills/refactor/steps/step-01-discover.md +60 -60
  434. package/templates/skills/refactor/steps/step-02-execute.md +67 -67
  435. package/templates/skills/review-code/SKILL.md +95 -94
  436. package/templates/skills/review-code/references/clean-code-principles.md +292 -292
  437. package/templates/skills/review-code/references/code-quality-metrics.md +174 -174
  438. package/templates/skills/review-code/references/feedback-patterns.md +149 -149
  439. package/templates/skills/review-code/references/owasp-api-top10.md +243 -243
  440. package/templates/skills/review-code/references/security-checklist.md +212 -212
  441. package/templates/skills/review-code/steps/step-01-smartstack.md +96 -96
  442. package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -80
  443. package/templates/skills/review-code/steps/step-03-react.md +44 -44
  444. package/templates/skills/ui-components/SKILL.md +137 -137
  445. package/templates/skills/ui-components/accessibility.md +170 -170
  446. package/templates/skills/ui-components/patterns/dashboard-chart.md +327 -327
  447. package/templates/skills/ui-components/patterns/data-table.md +39 -39
  448. package/templates/skills/ui-components/patterns/entity-card.md +77 -77
  449. package/templates/skills/ui-components/patterns/grid-layout.md +91 -91
  450. package/templates/skills/ui-components/patterns/kanban.md +43 -43
  451. package/templates/skills/ui-components/responsive-guidelines.md +278 -278
  452. package/templates/skills/ui-components/style-guide.md +113 -113
  453. package/templates/skills/utils/SKILL.md +44 -44
  454. package/templates/skills/utils/subcommands/test-web-config.md +152 -152
  455. package/templates/skills/utils/subcommands/test-web.md +123 -123
  456. package/templates/skills/validate/SKILL.md +181 -181
  457. package/templates/skills/validate-feature/SKILL.md +101 -101
  458. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
  459. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
  460. package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
  461. package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
  462. package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
  463. package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
  464. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
  465. package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
  466. package/templates/skills/workflow/SKILL.md +127 -127
  467. package/templates/skills/workflow/steps/step-00-init.md +57 -57
  468. package/templates/skills/workflow/steps/step-01-implementation.md +84 -84
  469. package/templates/test-web/api-health.json +38 -38
  470. package/templates/test-web/minimal.json +19 -19
  471. package/templates/test-web/npm-package.json +46 -46
  472. package/templates/test-web/seo-check.json +54 -54
@@ -1,783 +1,783 @@
1
- ---
2
- name: step-03d-validate
3
- description: Per-module validation, write feature.json, incremental HTML deploy, loop decision
4
- model: sonnet
5
- next_step: steps/step-03a1-setup.md OR steps/step-04a-collect.md (conditional)
6
- ---
7
-
8
- > **Context files:** `_shared.md` | `_module-loop.md`
9
-
10
- # Step 3d: Validation & Loop
11
-
12
- ## MANDATORY EXECUTION RULES
13
-
14
- - ALWAYS use ULTRATHINK mode
15
- - This step VALIDATES the specification from step-03c, writes it to feature.json, and decides loop continuation
16
- - ALWAYS verify specification completeness before writing
17
- - ALL communication in `{language}`
18
-
19
- ## MODE DETECTION (inherited from step-03a1)
20
-
21
- > **CRITICAL: Re-check your execution mode before proceeding.**
22
-
23
- **IF you are running as a TEAM AGENT** (your prompt contains `PROPOSE & REVIEW` or `team-lead` as recipient):
24
- → **NEVER** use `AskUserQuestion` in ANY section below (sections 9d, 10, 12)
25
- → Section 9d: if validation fails, AUTO-CORRECT silently (no user options)
26
- → Section 12: **SKIP ENTIRELY** — go directly to section 12-bis (Agent Mode)
27
- → After writing feature.json, send `PROPOSAL_READY` to team lead via SendMessage
28
- → NEVER present options/menus to the user — you are an autonomous agent
29
-
30
- **IF you are running in the MAIN CONVERSATION** (classic inline mode):
31
- → Normal interactive mode — use `AskUserQuestion` as documented
32
- → Section 12-bis does NOT apply to you
33
- - **ID NAMING RULE (MANDATORY, NO EXCEPTION):**
34
- All IDs MUST include a module prefix to guarantee application-wide uniqueness.
35
- The prefix is derived from the module code initials (2-4 chars):
36
- UserManagement → UM | VehicleManagement → VM | PartsInventory → PI
37
- RepairManagement → RM | MaintenanceSchedule → MS | DataSync → DS
38
- Notifications → NT | Dashboard → DB | Orders → OR | Customers → CU
39
-
40
- NEVER use bare IDs (UC-001, BR-VAL-001) in multi-module mode.
41
-
42
- ## YOUR TASK
43
-
44
- Validate the module specification for completeness and consistency, write to feature.json, deploy incremental HTML, and decide whether to loop to the next module or proceed to consolidation.
45
-
46
- ---
47
-
48
- ### 9. Per-Module Validation
49
-
50
- #### 9a. Completeness Checks
51
-
52
- > **CRITICAL:** Checks MUST count ACTUAL elements in arrays, NOT declarative values.
53
- > A check that reports PASS when the array is empty is a LIE and BLOCKS downstream quality.
54
-
55
- | Section | Minimum | How to verify | Status |
56
- |---------|---------|---------------|--------|
57
- | actors | 2 | `specification.actors.length >= 2` | PASS/FAIL |
58
- | useCases | 2 | `specification.useCases.length >= 2` | PASS/FAIL |
59
- | functionalRequirements | 4 | `specification.functionalRequirements.length >= 4` | PASS/FAIL |
60
- | permissionMatrix | 1 resource × 2 roles | `specification.permissionMatrix.permissions.length >= 1 && specification.permissionMatrix.roleAssignments.length >= 2` | PASS/FAIL |
61
- | entities | 1 | `analysis.entities.length >= 1` | PASS/FAIL |
62
- | entitySchemaFormat | attributes[] not fields[] (BLOCKING) | `analysis.entities.every(e => e.attributes?.length > 0)` | PASS/FAIL |
63
- | entityAttributeTypes | ALL attributes have `type` field (BLOCKING) | `analysis.entities.every(e => e.attributes.every(a => a.type))` — **NOTE:** Entities in analysis phase may NOT have `type`. Step-03c auto-fix MUST have run first. If types are missing, RE-RUN step-03c auto-fix algorithm. | PASS/FAIL |
64
- | navigation | entries[] present (BLOCKING) | `specification.navigation?.entries?.length >= 1` | PASS/FAIL |
65
- | dataLifecycle | present in analysis (BLOCKING) | `analysis.dataLifecycle !== undefined` | PASS/FAIL |
66
- | wireframes | 1 per section (BLOCKING) | `(specification.uiWireframes \|\| specification.wireframes \|\| []).length >= (specification.sections \|\| []).length` (count REAL elements, check BOTH key names) | PASS/FAIL |
67
- | wireframeSchema | All required fields present (BLOCKING) | `(specification.uiWireframes \|\| specification.wireframes \|\| []).every(w => (w.screen \|\| w.title) && w.section && (w.mockup \|\| w.ascii \|\| w.content))` | PASS/FAIL |
68
- | sections | 1 (BLOCKING) | `specification.sections.length >= 1` (EVERY module needs at least 1 section) | PASS/FAIL |
69
- | gherkinScenarios | 1 array entry | `Array.isArray(specification.gherkinScenarios) && specification.gherkinScenarios.length >= 1` | PASS/FAIL |
70
- | gherkinFormat | Array not object (BLOCKING) | `Array.isArray(specification.gherkinScenarios)` (NOT a single object) | PASS/FAIL |
71
- | validations | 1 | `specification.validations.length >= 1` | PASS/FAIL |
72
- | validationFormat | rules[] array (BLOCKING) | `specification.validations.every(v => Array.isArray(v.rules))` (NOT singular `rule`) | PASS/FAIL |
73
- | messages | 4 | `specification.messages.length >= 4` | PASS/FAIL |
74
- | messageFormat | `message` field present (BLOCKING) | `specification.messages.every(m => m.message)` | PASS/FAIL |
75
- | lifeCycles | 1 (if entity has status) | `specification.lifeCycles.length >= 1` (if any entity has status/state field) | PASS/FAIL |
76
- | seedDataCore | 9 arrays present with content | See detailed check below | PASS/FAIL (BLOCKING) |
77
- | apiEndpoints | 1 | `specification.apiEndpoints.length >= 1` | PASS/FAIL |
78
- | i18nKeys | present | `specification.i18nKeys !== undefined && specification.i18nKeys !== null` | PASS/FAIL |
79
- | navigationIcons | non-null | `specification.seedDataCore.navigationModules.every(m => m.icon !== null)` | PASS/FAIL |
80
-
81
- **seedDataCore detailed check (BLOCKING):**
82
- ```javascript
83
- const sdc = specification.seedDataCore;
84
- const currentModuleIndex = metadata.workflow?.currentModuleIndex || 0;
85
- const checks = [
86
- // navigationApplications and applicationRoles: required for first module (index 0), can be empty for subsequent modules
87
- { key: "navigationApplications", actual: sdc.navigationApplications?.length || 0, min: currentModuleIndex === 0 ? 1 : 0 },
88
- { key: "applicationRoles", actual: sdc.applicationRoles?.length || 0, min: currentModuleIndex === 0 ? 1 : 0 },
89
- { key: "navigationModules", actual: sdc.navigationModules?.length || 0, min: 1 },
90
- { key: "navigationSections", actual: sdc.navigationSections?.length || 0, min: 1 }, // EVERY module needs ≥1 section
91
- { key: "navigationResources", actual: sdc.navigationResources?.length || 0, min: 1 },
92
- { key: "navigationTranslations", actual: sdc.navigationTranslations?.length || 0, min: 2 }, // min fr+en
93
- { key: "permissions", actual: sdc.permissions?.length || 0, min: 1 },
94
- { key: "rolePermissions", actual: sdc.rolePermissions?.length || 0, min: 1 },
95
- { key: "permissionConstants", actual: sdc.permissionConstants?.length || 0, min: 1 }
96
- ];
97
- const failures = checks.filter(c => c.actual < c.min);
98
- IF failures.length > 0:
99
- BLOCKING ERROR: "seedDataCore incomplete — empty arrays: {failures.map(f => f.key).join(', ')}"
100
- → Fix: Ensure specification.sections[] has ≥1 entry, then re-run 8f-bis transform
101
- ```
102
-
103
- #### 9b. Consistency Checks
104
-
105
- - Every UC has ≥1 linked FR
106
- - Every FR has ≥1 linked BR
107
- - All BR references exist in analysis.businessRules
108
- - All actors appear in permissionMatrix
109
- - Permission paths use correct format: module-level `{app}.{module}.{action}` or section-level `{app}.{module}.{section}.{action}`
110
- - rolePermissions paths match permissions paths
111
- - API routes use consistent prefix
112
-
113
- #### 9c. Convention Checks
114
-
115
- - UC-NNN format
116
- - FR-NNN format
117
- - BR-{CATEGORY}-NNN format
118
- - Entity names PascalCase
119
- - Field names camelCase
120
- - Entity attribute format: `attributes[]` with {name, description}, NOT `fields[]` with {name, type} — entities must NOT have tableName or primaryKey
121
- - Wireframe structure: `screen` (not `name`/`title`), `mockup` (not `ascii`/`content`), `componentMapping` is array of {wireframeElement, reactComponent} (not plain key-value object), `layout` is object with regions (not string)
122
- - Wireframe field naming: uses `screen` (not `title`), `mockup` (not `ascii`) — auto-fix if wrong (see 9c-fix below)
123
- - Permission paths dot-separated lowercase
124
-
125
- #### 9c-fix. Auto-Fix Wireframe Field Names (MANDATORY before writing)
126
-
127
- > **CRITICAL:** The agent may use non-canonical field names (`title`, `ascii`, `name`, `content`).
128
- > These MUST be normalized to canonical names before writing to feature.json.
129
-
130
- ```javascript
131
- // AUTO-FIX: Normalize wireframe field names before writing
132
- const wireframes = specification.uiWireframes || specification.wireframes || [];
133
- for (const wf of wireframes) {
134
- if (wf.title && !wf.screen) { wf.screen = wf.title; delete wf.title; }
135
- if (wf.ascii && !wf.mockup) { wf.mockup = wf.ascii; delete wf.ascii; }
136
- if (wf.content && !wf.mockup) { wf.mockup = wf.content; delete wf.content; }
137
- if (wf.name && !wf.screen) { wf.screen = wf.name; delete wf.name; }
138
- }
139
- // Store normalized wireframes back under canonical key
140
- specification.uiWireframes = wireframes;
141
- ```
142
-
143
- #### 9c-fix-entities. Auto-Fix Entity Attribute Types (MANDATORY before writing)
144
-
145
- > **DEFENSE-IN-DEPTH:** step-03c POST-CHECK should catch attributes without `type`,
146
- > but if any slip through to step-03d, auto-fix them here before writing to feature.json.
147
- > Uses the same type inference algorithm as step-03c POST-CHECK.
148
-
149
- ```javascript
150
- // AUTO-FIX: Ensure all entity attributes have structured type
151
- const entities = analysis.entities || [];
152
- let entityAutoFixCount = 0;
153
- for (const entity of entities) {
154
- for (const attr of entity.attributes || []) {
155
- if (!attr.type) {
156
- // Infer type from attribute name pattern
157
- if (attr.validation?.match(/max\s*\d+/i) || attr.name.match(/name|title|code|description|label|email|phone|address/i)) {
158
- attr.type = "string";
159
- const maxMatch = attr.validation?.match(/max\s*(\d+)/i);
160
- if (maxMatch) attr.maxLength = parseInt(maxMatch[1]);
161
- } else if (attr.name.match(/id$/i)) {
162
- attr.type = "Guid";
163
- } else if (attr.name.match(/date|At$/i)) {
164
- attr.type = "DateTime";
165
- } else if (attr.name.match(/is[A-Z]|has[A-Z]|active|enabled/)) {
166
- attr.type = "bool";
167
- } else if (attr.name.match(/amount|salary|rate|price|total/i)) {
168
- attr.type = "decimal";
169
- } else if (attr.name.match(/count|number|order|sort|index/i)) {
170
- attr.type = "int";
171
- } else {
172
- attr.type = "string"; // safe default
173
- }
174
- // Normalize free-text maxLength
175
- if (typeof attr.validation === 'string' && !attr.maxLength) {
176
- const m = attr.validation.match(/max\s*(\d+)/i);
177
- if (m) attr.maxLength = parseInt(m[1]);
178
- }
179
- if (attr.required === undefined) attr.required = true;
180
- entityAutoFixCount++;
181
- }
182
- }
183
- }
184
- if (entityAutoFixCount > 0) {
185
- console.warn(`DEFENSE-IN-DEPTH: auto-fixed ${entityAutoFixCount} attributes without type in step-03d`);
186
- }
187
- ```
188
-
189
- #### 9d. Decision
190
-
191
- > **TEAM AGENT MODE:** If running as team agent, SKIP AskUserQuestion. On FAIL → auto-correct silently. On PASS → proceed directly to section 11 (write). NEVER present options to the user.
192
-
193
- **INLINE MODE ONLY (main conversation):**
194
-
195
- IF validation PASS:
196
- Display summary, ask client for confirmation
197
-
198
- IF validation FAIL:
199
- Display errors, offer:
200
- ```
201
- options:
202
- - label: "Auto-corriger"
203
- description: "Corriger automatiquement les erreurs détectées"
204
- - label: "Réviser manuellement"
205
- description: "Revenir aux sections problématiques"
206
- - label: "Forcer la validation"
207
- description: "Accepter malgré les erreurs (risqué)"
208
- ```
209
-
210
- #### 9e. Write Module Validation Section (MANDATORY)
211
-
212
- > **The module feature.json MUST have a `validation` section recording the results of steps 9a-9d.**
213
-
214
- ```
215
- ba-writer.enrichSection({
216
- featureId: {module_feature_id},
217
- section: "validation",
218
- data: {
219
- validatedAt: "{ISO timestamp}",
220
- completenessChecks: [
221
- { "section": "useCases", "count": {count}, "minimum": 2, "status": "PASS|FAIL" },
222
- { "section": "functionalRequirements", "count": {count}, "minimum": 4, "status": "PASS|FAIL" },
223
- { "section": "wireframes", "count": {count}, "minimum": {section_count}, "status": "PASS|FAIL" },
224
- { "section": "seedDataCore", "count": 7, "minimum": 7, "status": "PASS|FAIL" }
225
- ],
226
- consistencyChecks: [
227
- { "check": "UC-FR linkage", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" },
228
- { "check": "BR references valid", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" },
229
- { "check": "Permission path format", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" }
230
- ],
231
- conventionChecks: [
232
- { "check": "ID naming with module prefix", "status": "PASS|FAIL", "details": "..." },
233
- { "check": "Entity names PascalCase", "status": "PASS|FAIL", "details": "..." }
234
- ],
235
- semanticChecks: [
236
- { "check": "orphan-permissions", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false },
237
- { "check": "uc-sans-fr", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false },
238
- { "check": "missing-wireframes", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false }
239
- ],
240
- warnings: ["List of non-blocking warnings"],
241
- decision: {
242
- "approved": true,
243
- "reason": "All checks passed",
244
- "approvalMode": "standard",
245
- "approvedBy": "Client",
246
- "approvedAt": "{ISO timestamp}"
247
- }
248
- }
249
- })
250
- ```
251
-
252
- #### 9e-POST-CHECK: Validation Section Persistence (BLOCKING)
253
-
254
- > **CRITICAL:** The `validation` section MUST be persisted to feature.json. Without it, consolidation checks fail.
255
-
256
- ```bash
257
- MODULE_JSON="{module_feature_json_path}"
258
- node -e "const d=JSON.parse(require('fs').readFileSync(process.argv[1],'utf-8'));
259
- if(!d.validation||!d.validation.decision) { console.error('FAIL: validation section missing or incomplete'); process.exit(1); }
260
- console.log('PASS: validation section present with decision');" "$MODULE_JSON"
261
- ```
262
-
263
- IF this check FAILS → re-execute section 9e write and re-run this check.
264
-
265
- #### 9f. Module Specification Checklist (BLOCKING)
266
-
267
- > **CRITICAL:** This checklist MUST be FULLY COMPLETED before marking module status = "specified".
268
-
269
- **Execute the comprehensive validation checklist:**
270
-
271
- Run the 29-check validation process across 10 categories:
272
- - Data Model (4 checks) | Business Rules (3 checks) | Use Cases & FRs (4 checks)
273
- - Permissions (3 checks) | UI & Navigation (4 checks) | I18N & Messages (3 checks)
274
- - Seed Data (2 checks) | API Endpoints (2 checks) | Validations (1 check) | Gherkin (3 checks)
275
-
276
- ```javascript
277
- const blockingFailures = checks.filter(c => c.blocking && c.status === "FAIL");
278
-
279
- IF blockingFailures.length > 0:
280
- // CONDITIONAL LOAD: Only load detailed checklist on validation failure
281
- Read references/validation-checklist.md
282
- Display:
283
- - Full validation logic for FAILED checks
284
- - Exact requirements (minimums, patterns, formats)
285
- - Fix recommendations for each failure
286
-
287
- BLOCKING ERROR: Module specification incomplete
288
- → Fix all failures before proceeding
289
-
290
- ELSE:
291
- All blocking checks passed ✓
292
- Display: "{warnings_count} warnings (non-blocking)"
293
- → Proceed to mark module as "specified"
294
- ```
295
-
296
- **Optimization:** The detailed 280-line validation-checklist.md is loaded **only when validation fails** (saves ~10,000 tokens on success path).
297
-
298
- ---
299
-
300
- ### 9g. Anti-Premature-Completion Guard (MANDATORY)
301
-
302
- > **CRITICAL — NEVER say "the analysis is complete" or "ready for /ralph-loop" at this point.**
303
- > Step-03d is the END of SPECIFICATION, NOT the end of the BA workflow.
304
- > Steps 04a → 04b → 04c (consolidation) + 05a → 05b → 05c (handoff) are STILL REQUIRED.
305
- > Without handoff, /ralph-loop will generate an INCOMPLETE PRD (no frontend, no tests).
306
-
307
- **FORBIDDEN phrases in step-03d output:**
308
- - "L'analyse métier est complète" / "The business analysis is complete"
309
- - "Prêt pour /ralph-loop" / "Ready for /ralph-loop"
310
- - "Vous pouvez maintenant lancer /ralph-loop"
311
- - Any variation suggesting the BA is finished or /ralph-loop can be invoked
312
-
313
- **REQUIRED phrasing:**
314
- - "Module {name} spécifié. {Remaining} modules restants." (if more modules)
315
- - "Tous les modules spécifiés. Passage à la consolidation (étapes 04a-04c)..." (if last module)
316
- - NEVER mention /ralph-loop — only step-05c (ralph readiness) validates the handoff
317
-
318
- ### 10. Module Summary with Roles & Permissions
319
-
320
- Display comprehensive summary:
321
-
322
- ```
323
- ═══════════════════════════════════════════════════════════
324
- MODULE SPÉCIFIÉ: {currentModule} ({currentModuleIndex + 1}/{total})
325
- ═══════════════════════════════════════════════════════════
326
-
327
- | Aspect | Valeur |
328
- |--------|--------|
329
- | Entités | {count} ({entity names}) |
330
- | Business Rules | {count} (VAL: X, CALC: Y, WF: Z) |
331
- | Use Cases | {count} (UC-001 → UC-NNN) |
332
- | Exigences | {count} FRs |
333
- | Sections | {count} ({section names}) |
334
- | Maquettes | {count} wireframes |
335
- | Permissions | {count} paths |
336
- | Tests Gherkin | {count} scénarios |
337
- | Messages | {count} |
338
-
339
- ### Rôles & Permissions pour {currentModule}
340
- | Rôle | Permissions |
341
- |------|------------|
342
- | {App} Admin | {app}.{module}.* |
343
- | {App} Manager | read, create, update, assign |
344
- | {App} Contributor | read, create, update |
345
- | {App} Viewer | read |
346
-
347
- → Validation: {PASS/FAIL}
348
- ═══════════════════════════════════════════════════════════
349
-
350
- {IF validation PASS}:
351
- → Module validé automatiquement
352
- → Passage automatique au module suivant (section 12)
353
-
354
- {IF validation FAIL}:
355
- → Afficher les erreurs et offrir les options de correction (section 9d)
356
- ```
357
-
358
- ---
359
-
360
- ### 11. Write Module Feature.json
361
-
362
- ```
363
- // Write analysis section with ALL subsections
364
- ba-writer.enrichSection({
365
- featureId: {module_feature_id},
366
- section: "analysis",
367
- data: {
368
- objectives: [{id, objective, metric, target}], // from 6a
369
- entities: [{name, description, attributes, relationships}], // from 6b — SCHEMA FORMAT
370
- businessRules: [{id, name, category, statement, priority, conditions, examples, testability}], // from 7 — SCHEMA FORMAT
371
- processFlow: {entryPoints, mainFlow, decisionPoints, alternativeFlows}, // from 6c
372
- dataLifecycle: {retentionPeriod, archiveStrategy, gdprCompliance, states} // from 6d
373
- }
374
- })
375
-
376
- // Write specification section with ALL subsections
377
- ba-writer.enrichSection({
378
- featureId: {module_feature_id},
379
- section: "specification",
380
- data: {
381
- actors: [{role, description, permissions}], // 8a
382
- useCases: [{id, name, primaryActor, permission, mainScenario, linkedRules}], // 8b
383
- functionalRequirements: [{id, statement, priority, linkedRules, linkedUseCases, acceptanceCriteria}], // 8c
384
- permissionMatrix: {permissions: [], roleAssignments: []}, // 8d
385
- navigation: {entries: []}, // 8e
386
- seedDataCore: {navigationModules, navigationSections, navigationResources, navigationTranslations, permissions, rolePermissions, permissionConstants}, // 8f (7 arrays)
387
- gherkinScenarios: [{feature, scenarios: [{name, tags, given, when, then}]}], // 8g
388
- validations: [{entity, field, rules, errorMessageKey}], // 8h
389
- messages: [{code, type, title, message, i18nKey}], // 8i
390
- lifeCycles: [{entity, field, initialState, states: [{id, displayName, color, allowedTransitions, isTerminal}], transitions}], // 8j
391
- apiEndpoints: [{method, path, permission, requestDto, responseDto, description}], // 8k
392
- i18nKeys: {...}, // 8l
393
- sections: [{code, labels, route, icon, permission, wireframe, useCases, businessRules, resources}], // from 3a-bis
394
- dashboards: [{code, title, kpis, filters, refreshMode}], // from 3d
395
- uiWireframes: [{screen, section, mockup, elements, actions, componentMapping, layout}] // from 3b
396
- }
397
- })
398
-
399
- // Write validation results from step 9
400
- // (Already written in step 9e above)
401
-
402
- ba-writer.updateStatus({module_feature_id}, "specified")
403
-
404
- // Update master
405
- ba-writer.updateModuleStatus({feature_id}, {currentModule.code}, "specified")
406
- ```
407
-
408
- #### 11-POST-CHECK: Verify Written Data (BLOCKING)
409
-
410
- > **CRITICAL — Data loss prevention.** After writing, READ BACK the module feature.json and verify the following arrays are **non-empty**:
411
-
412
- ```javascript
413
- // READ BACK the written feature.json
414
- const written = ba-reader.read({module_feature_id});
415
-
416
- // BLOCKING checks — if ANY fails, the write was incomplete
417
- const checks = [
418
- { key: "specification.actors", actual: written.specification?.actors?.length, min: 2 },
419
- { key: "specification.useCases", actual: written.specification?.useCases?.length, min: 2 },
420
- { key: "specification.wireframes", actual: (written.specification?.uiWireframes?.length || written.specification?.wireframes?.length || 0), min: 1 },
421
- { key: "specification.sections", actual: written.specification?.sections?.length, min: 1 },
422
- { key: "specification.seedDataCore", actual: Object.keys(written.specification?.seedDataCore || {}).length, min: 7 },
423
- { key: "specification.lifeCycles", actual: written.specification?.lifeCycles?.length, min: 0 },
424
- { key: "specification.gherkinScenarios",actual: written.specification?.gherkinScenarios?.length,min: 1 },
425
- { key: "specification.apiEndpoints", actual: written.specification?.apiEndpoints?.length, min: 1 }
426
- ];
427
-
428
- const failures = checks.filter(c => (c.actual || 0) < c.min);
429
-
430
- IF failures.length > 0:
431
- BLOCKING ERROR: "Feature.json write INCOMPLETE — missing data in: {failures.map(f => f.key).join(', ')}"
432
- → Re-execute section 11 write with ALL specification data
433
- → DO NOT proceed to next module until ALL checks pass
434
-
435
- // SPECIAL CHECK: wireframes content verification (check BOTH key names)
436
- const wireframes = written.specification?.uiWireframes || written.specification?.wireframes || [];
437
- IF wireframes.length > 0:
438
- const emptyMockups = wireframes.filter(wf => !wf.mockup && !wf.ascii && !wf.content);
439
- IF emptyMockups.length > 0:
440
- WARNING: "{emptyMockups.length} wireframes have empty mockup content — verify step-03b data"
441
-
442
- // SPECIAL CHECK: wireframes >= sections
443
- const sectionCount = written.specification?.sections?.length || 0;
444
- IF wireframes.length < sectionCount:
445
- BLOCKING ERROR: "{wireframes.length} wireframes < {sectionCount} sections — wireframes MISSING for some sections"
446
- → Re-read wireframes from conversation context and re-write to feature.json
447
- ```
448
-
449
- #### 11-POST-CHECK-BASH: Acceptance Criteria Verification (BLOCKING)
450
-
451
- > **CRITICAL:** The pseudocode checks above are interpreted by the model — they can be "passed" incorrectly.
452
- > This bash check reads the REAL file on disk and provides an objective verification.
453
- > See [references/acceptance-criteria.md](../references/acceptance-criteria.md) for the full acceptance criteria definition.
454
-
455
- ```bash
456
- MODULE_JSON="{module_feature_json_path}"
457
- node -e "
458
- const fs = require('fs');
459
- const data = JSON.parse(fs.readFileSync(process.argv[1], 'utf-8'));
460
- const spec = data.specification || {};
461
- const analysis = data.analysis || {};
462
- const wf = spec.uiWireframes || spec.wireframes || [];
463
- const sections = spec.sections || [];
464
- const checks = [
465
- ['entities >= 1', (analysis.entities||[]).length, 1],
466
- ['useCases >= 2', (spec.useCases||[]).length, 2],
467
- ['FRs >= 4', (spec.functionalRequirements||[]).length,4],
468
- ['wireframes >= 1', wf.length, 1],
469
- ['wireframes >= sections', wf.length, sections.length],
470
- ['sections >= 1', sections.length, 1],
471
- ['seedDataCore 7 arrays', Object.keys(spec.seedDataCore||{}).filter(k=>(spec.seedDataCore||{})[k]&&(spec.seedDataCore||{})[k].length>0).length, 7],
472
- ['gherkin is array', Array.isArray(spec.gherkinScenarios)?1:0, 1],
473
- ['apiEndpoints >= 1', (spec.apiEndpoints||[]).length, 1],
474
- ['messages >= 4', (spec.messages||[]).length, 4],
475
- ['validations >= 1', (spec.validations||[]).length, 1],
476
- ['navigation entries', (spec.navigation?.entries||[]).length, 1],
477
- ['dataLifecycle', analysis.dataLifecycle ? 1 : 0, 1],
478
- ['validation section', data.validation ? 1 : 0, 1]
479
- ];
480
- // AC-18: i18n 4 languages check
481
- const i18n = spec.i18nKeys || {};
482
- const i18nLangs = ['fr','en','it','de'];
483
- let i18nMissing = 0;
484
- function checkI18nLeaf(obj) {
485
- if (typeof obj !== 'object' || obj === null) return;
486
- const hasLang = i18nLangs.some(l => typeof obj[l] === 'string');
487
- if (hasLang) { i18nLangs.forEach(l => { if (!obj[l]) i18nMissing++; }); }
488
- else { Object.values(obj).forEach(v => checkI18nLeaf(v)); }
489
- }
490
- checkI18nLeaf(i18n);
491
- checks.push(['i18n 4 languages (missing keys)', 0, i18nMissing > 10 ? 1 : 0]);
492
-
493
- const fails = checks.filter(c => c[1] < c[2]);
494
- fails.forEach(f => console.error('FAIL: ' + f[0] + ' = ' + f[1] + ' (min: ' + f[2] + ')'));
495
- if (i18nMissing > 0 && i18nMissing <= 10) { console.warn('WARNING: ' + i18nMissing + ' i18n leaf keys missing translations (IT/DE)'); }
496
- // Check wireframe content
497
- const emptyWf = wf.filter(w => !w.mockup && !w.ascii && !w.content);
498
- if (emptyWf.length > 0) { fails.push(['wireframe content', 0, 1]); console.error('FAIL: ' + emptyWf.length + ' wireframes have EMPTY content'); }
499
- // Check entity attribute types
500
- const badAttrs = (analysis.entities||[]).flatMap(e => (e.attributes||[]).filter(a => !a.type).map(a => e.name+'.'+a.name));
501
- if (badAttrs.length > 0) { fails.push(['attr.type', 0, 1]); console.error('FAIL: attributes without type: ' + badAttrs.join(', ')); }
502
- // AC-15: Validation rules format
503
- const badRules = (spec.validations||[]).filter(v => v.rules && !Array.isArray(v.rules));
504
- if (badRules.length > 0) { fails.push(['AC-15: rules not array', badRules.length, 0]); console.error('FAIL: AC-15: ' + badRules.length + ' validations have rules as string'); }
505
- // AC-16: Messages must have message field
506
- const noMsg = (spec.messages||[]).filter(m => !m.message);
507
- if (noMsg.length > 0) { fails.push(['AC-16: message missing', noMsg.length, 0]); console.error('FAIL: AC-16: ' + noMsg.length + ' messages missing message field'); }
508
- // AC-17: Gherkin content structure
509
- if (Array.isArray(spec.gherkinScenarios)) { const badG = spec.gherkinScenarios.filter(g => !g.feature || !Array.isArray(g.scenarios)); if (badG.length > 0) { fails.push(['AC-17: gherkin content', badG.length, 0]); console.error('FAIL: AC-17: ' + badG.length + ' gherkin entries invalid'); } }
510
- if (fails.length > 0) { console.error('BLOCKING: ' + fails.length + ' acceptance criteria failed'); process.exit(1); }
511
- console.log('PASS: All acceptance criteria met');
512
- " "$MODULE_JSON"
513
- ```
514
-
515
- IF this check FAILS:
516
- - Identify which criteria failed from the output
517
- - Fix the corresponding data (re-read from conversation context, re-generate, or re-run the step that produces it)
518
- - Re-write to feature.json
519
- - Re-run the POST-CHECK until PASS
520
-
521
- > **WHY:** Step-03b now writes wireframes intermediately (since fix), but step-03d section 11 does the FULL write.
522
- > This bash POST-CHECK is the ultimate safety net — it reads the REAL file and verifies ALL acceptance criteria.
523
- > The pseudocode checks (section 9a) catch issues early; this bash check catches anything the model missed.
524
-
525
- ---
526
-
527
- ### 11-bis. Deploy Incremental Interactive HTML (MANDATORY)
528
-
529
- > **After each module is specified, deploy/update the interactive HTML document with all available data.**
530
- > The client can review completed modules while the next module is being specified.
531
-
532
- See [references/validate-incremental-html.md](../references/validate-incremental-html.md) for the complete deployment process (read sources, build FEATURE_DATA, replace placeholders, write HTML).
533
-
534
- Uses the **same mapping** as step-05b-deploy.md — only difference is `moduleSpecs` only includes completed modules.
535
-
536
- ---
537
-
538
- ### 12. Loop Decision
539
-
540
- > **TEAM AGENT MODE: SKIP THIS ENTIRE SECTION.** If you are a team agent (your prompt contains `PROPOSE & REVIEW`), go directly to **section 12-bis** below. Section 12 is for inline mode ONLY. You MUST NOT load the next step or advance the module loop — the team lead handles orchestration.
541
-
542
- **INLINE MODE ONLY (main conversation):**
543
-
544
- ```
545
- ba-writer.advanceModuleLoop({feature_id})
546
- → Increments currentModuleIndex
547
- → Updates completedModules
548
- → Updates currentModule
549
-
550
- IF currentModuleIndex < moduleOrder.length:
551
- Display: "→ Module suivant: {nextModule} ({currentModuleIndex + 1}/{total})"
552
- Load: steps/step-03a1-setup.md
553
-
554
- IF currentModuleIndex >= moduleOrder.length:
555
- ba-writer.updateStatus({feature_id}, "specified")
556
-
557
- // CHECKPOINT: Save progress BEFORE transition (protects against context exhaustion)
558
- ba-writer.enrichSection({
559
- featureId: {feature_id},
560
- section: "metadata.workflow",
561
- data: {
562
- lastCompletedStep: "step-03d-validate",
563
- allModulesSpecified: true
564
- }
565
- })
566
-
567
- // CHECK: Are we in project mode (multi-application)?
568
- IF workflow.mode === "project":
569
- // APPLICATION LOOP: Check if more applications remain
570
- projectFeature = ba-reader.findProjectFeature()
571
- ba-writer.updateApplicationStatus(projectId, currentApp.code, "specified")
572
- ba-writer.advanceApplicationLoop(projectId)
573
-
574
- IF projectFeature.metadata.workflow.currentApplicationIndex + 1 < projectFeature.metadata.workflow.applicationOrder.length:
575
- nextApp = projectFeature.metadata.workflow.applicationOrder[currentApplicationIndex + 1]
576
- Display: "═══ Application {currentApp.name} terminée ({N}/{total}). Prochaine : {nextApp} ═══"
577
- Display: "⚠ NE PAS lancer /ralph-loop — d'autres applications et la consolidation sont encore nécessaires."
578
- // Load step-02 for next application's module decomposition
579
- Load: steps/step-02-decomposition.md
580
- ELSE:
581
- Display: "═══ Toutes les applications spécifiées! Passage à la consolidation cross-application... ═══"
582
- Display: "⚠ NE PAS lancer /ralph-loop — la consolidation et le handoff sont encore nécessaires."
583
- ba-writer.updateStatus(projectId, "specified")
584
- Load: steps/step-04a-collect.md
585
- ELSE:
586
- // SINGLE APPLICATION: Current behavior
587
- Display: "═══ Tous les modules spécifiés! Passage à la consolidation (04a→04c) puis handoff (05a→05c)... ═══"
588
- Display: "⚠ NE PAS lancer /ralph-loop — la consolidation et le handoff sont encore nécessaires."
589
-
590
- // MANDATORY TRANSITION — DO NOT STOP HERE
591
- // If context is near exhaustion, the checkpoint above ensures the user
592
- // can resume with /business-analyse and it will route to step-04a automatically.
593
- Load: steps/step-04a-collect.md
594
- ```
595
-
596
- ---
597
-
598
- ## 12-bis. Agent Mode: Send Proposal to Team Lead
599
-
600
- **IF running as TEAM AGENT (autonomous mode — detected in step-03a1 MODE DETECTION):**
601
-
602
- After all validation checks PASS and module feature.json is written:
603
-
604
- ### A. Build Structured Summary
605
-
606
- Read the written module feature.json via ba-reader and build:
607
-
608
- ```
609
- ## Module: {moduleCode} — Specification Summary
610
-
611
- ### Entities ({count})
612
- | Entity | Key Attributes | Relationships |
613
- |--------|---------------|---------------|
614
- | {name} | {attr1} ({type}), {attr2} ({type}), ... | → {relatedEntity} (FK) |
615
-
616
- ### Sections ({count})
617
- | Section | Description | Resources |
618
- |---------|-------------|-----------|
619
- | {code} | {description} | {resource1}, {resource2}, ... |
620
-
621
- ### Use Cases ({count})
622
- - {UC-ID}: {title}
623
-
624
- ### Business Rules ({count})
625
- - {BR-ID}: {title} ({category})
626
-
627
- ### Permissions
628
- - {permission.path}: {roles with access}
629
-
630
- ### Seed Data Counts
631
- - Modules: {n} | Sections: {n} | Resources: {n}
632
- - Translations: {n} | Permissions: {n} | Role mappings: {n} | Constants: {n}
633
-
634
- ### Wireframes
635
- - {section}: {1-line description of layout and key components}
636
- ```
637
-
638
- ### B. Send Proposal
639
-
640
- ```
641
- SendMessage({
642
- type: "message",
643
- recipient: "team-lead",
644
- content: "PROPOSAL_READY:{moduleCode}\n\n{structured_summary}",
645
- summary: "{moduleCode} specification ready for review"
646
- })
647
- ```
648
-
649
- ### C. Wait for Response
650
-
651
- **WAIT** for team lead to respond:
652
-
653
- - **`APPROVED:{moduleCode}`** → Proceed to step D (Module Complete)
654
- - **`REVISION:{moduleCode}\n{feedback}`** → Apply changes:
655
- 1. Read the feedback
656
- 2. Update the relevant sections in feature.json via ba-writer
657
- 3. Re-run validation checks (section 9)
658
- 4. Re-build summary and send new `PROPOSAL_READY`
659
- 5. Max **3 revision cycles** — after 3, send `ERROR:{moduleCode}:Max revisions reached` and stop
660
-
661
- ### D. Module Complete
662
-
663
- After approval:
664
-
665
- ```
666
- ba-writer.updateModuleStatus({feature_id}, {moduleCode}, "specified")
667
- ```
668
-
669
- ```
670
- SendMessage({
671
- type: "message",
672
- recipient: "team-lead",
673
- content: "MODULE_COMPLETE:{moduleCode}",
674
- summary: "{moduleCode} module complete"
675
- })
676
- ```
677
-
678
- Then WAIT — the team lead will send you a `shutdown_request`.
679
- Do NOT loop to next module. The team lead handles module ordering and will spawn a new agent for the next module.
680
-
681
- ### E. Shutdown (MANDATORY)
682
-
683
- When you receive a `shutdown_request` from the team lead:
684
-
685
- ```
686
- SendMessage({
687
- type: "shutdown_response",
688
- request_id: "{requestId from the shutdown_request message}",
689
- approve: true
690
- })
691
- ```
692
-
693
- This terminates your process. Do NOT output any text after `shutdown_response`.
694
-
695
- **Sequence reminder:** APPROVED → MODULE_COMPLETE → shutdown_request → shutdown_response (4 separate steps, never skip).
696
-
697
- ---
698
-
699
- ## SELF-VERIFICATION (MANDATORY before loading next step)
700
-
701
- Before proceeding to step-03a (next module) or step-04 (consolidation), VERIFY:
702
-
703
- 1. **Module feature.json has specification section** with ALL sub-sections (actors, useCases, functionalRequirements, permissionMatrix, navigation, seedDataCore, gherkinScenarios, validations, messages, lifeCycles, apiEndpoints, i18nKeys, sections, uiWireframes)
704
- 2. **Module feature.json status** = "specified" (set by section 11)
705
- 3. **Master modules[].status** for this module = "specified" (set by section 11)
706
- 4. **ba-interactive.html exists** and includes data for this module (set by section 11-bis)
707
-
708
- **IF any check fails → FIX before proceeding.** Do NOT advance the module loop with incomplete data.
709
-
710
- ---
711
-
712
- ## SINGLE-MODULE MODE
713
-
714
- When only 1 module in moduleOrder:
715
-
716
- - Same full validation flow
717
- - Skip cross-module references (section 5)
718
- - After validation → direct to step-04a-collect.md (auto-consolidation)
719
-
720
- ---
721
-
722
- ## RESUME SUPPORT
723
-
724
- IF the step is resumed (e.g., after interruption):
725
-
726
- ```
727
- Read metadata.workflow.currentModuleIndex
728
- Read metadata.workflow.currentModule
729
- → Resume at the correct module
730
- → If module has partial data, show what exists and continue from there
731
- ```
732
-
733
- ---
734
-
735
- ## CONTEXT MANAGEMENT
736
-
737
- | Loaded | Not Loaded |
738
- |--------|------------|
739
- | _shared.md | Other module feature.json (full) |
740
- | feature-schema.json | Questionnaires not needed |
741
- | Questionnaires for this module | Templates |
742
- | Completed modules summary (100 lines max) | React viewer files |
743
-
744
- ---
745
-
746
- ## STATE VARIABLES
747
-
748
- | Variable | Description |
749
- |----------|-------------|
750
- | `{currentModule}` | Current module being specified |
751
- | `{currentModuleIndex}` | Index in moduleOrder |
752
- | `{completedModules}` | Array of already specified module codes |
753
- | `{module_feature_id}` | Feature ID for the module-level feature.json |
754
-
755
- ---
756
-
757
- ## SUCCESS METRICS
758
-
759
- - Module specification validation PASS
760
- - Per-module validation results recorded in feature.json
761
- - Client confirmed module specification
762
- - Module feature.json written with all sections
763
- - Master updated with module status
764
- - Interactive HTML deployed/updated with completed module data (incremental)
765
- - Loop advanced correctly or consolidation phase initiated
766
-
767
- ---
768
-
769
- ## FAILURE MODES
770
-
771
- - Validation FAIL → offer auto-correct / manual revise / force
772
- - Client rejects → revise specific sections via step-03a or step-03b
773
- - Cross-module reference error → clarify with client
774
- - Interruption → resumable via workflow state
775
-
776
- ---
777
-
778
- ## NEXT STEP
779
-
780
- Conditional:
781
-
782
- - IF modules remaining → Load `steps/step-03a1-setup.md`
783
- - IF all modules done → Load `steps/step-04a-collect.md`
1
+ ---
2
+ name: step-03d-validate
3
+ description: Per-module validation, write feature.json, incremental HTML deploy, loop decision
4
+ model: sonnet
5
+ next_step: steps/step-03a1-setup.md OR steps/step-04a-collect.md (conditional)
6
+ ---
7
+
8
+ > **Context files:** `_shared.md` | `_module-loop.md`
9
+
10
+ # Step 3d: Validation & Loop
11
+
12
+ ## MANDATORY EXECUTION RULES
13
+
14
+ - ALWAYS use ULTRATHINK mode
15
+ - This step VALIDATES the specification from step-03c, writes it to feature.json, and decides loop continuation
16
+ - ALWAYS verify specification completeness before writing
17
+ - ALL communication in `{language}`
18
+
19
+ ## MODE DETECTION (inherited from step-03a1)
20
+
21
+ > **CRITICAL: Re-check your execution mode before proceeding.**
22
+
23
+ **IF you are running as a TEAM AGENT** (your prompt contains `PROPOSE & REVIEW` or `team-lead` as recipient):
24
+ → **NEVER** use `AskUserQuestion` in ANY section below (sections 9d, 10, 12)
25
+ → Section 9d: if validation fails, AUTO-CORRECT silently (no user options)
26
+ → Section 12: **SKIP ENTIRELY** — go directly to section 12-bis (Agent Mode)
27
+ → After writing feature.json, send `PROPOSAL_READY` to team lead via SendMessage
28
+ → NEVER present options/menus to the user — you are an autonomous agent
29
+
30
+ **IF you are running in the MAIN CONVERSATION** (classic inline mode):
31
+ → Normal interactive mode — use `AskUserQuestion` as documented
32
+ → Section 12-bis does NOT apply to you
33
+ - **ID NAMING RULE (MANDATORY, NO EXCEPTION):**
34
+ All IDs MUST include a module prefix to guarantee application-wide uniqueness.
35
+ The prefix is derived from the module code initials (2-4 chars):
36
+ UserManagement → UM | VehicleManagement → VM | PartsInventory → PI
37
+ RepairManagement → RM | MaintenanceSchedule → MS | DataSync → DS
38
+ Notifications → NT | Dashboard → DB | Orders → OR | Customers → CU
39
+
40
+ NEVER use bare IDs (UC-001, BR-VAL-001) in multi-module mode.
41
+
42
+ ## YOUR TASK
43
+
44
+ Validate the module specification for completeness and consistency, write to feature.json, deploy incremental HTML, and decide whether to loop to the next module or proceed to consolidation.
45
+
46
+ ---
47
+
48
+ ### 9. Per-Module Validation
49
+
50
+ #### 9a. Completeness Checks
51
+
52
+ > **CRITICAL:** Checks MUST count ACTUAL elements in arrays, NOT declarative values.
53
+ > A check that reports PASS when the array is empty is a LIE and BLOCKS downstream quality.
54
+
55
+ | Section | Minimum | How to verify | Status |
56
+ |---------|---------|---------------|--------|
57
+ | actors | 2 | `specification.actors.length >= 2` | PASS/FAIL |
58
+ | useCases | 2 | `specification.useCases.length >= 2` | PASS/FAIL |
59
+ | functionalRequirements | 4 | `specification.functionalRequirements.length >= 4` | PASS/FAIL |
60
+ | permissionMatrix | 1 resource × 2 roles | `specification.permissionMatrix.permissions.length >= 1 && specification.permissionMatrix.roleAssignments.length >= 2` | PASS/FAIL |
61
+ | entities | 1 | `analysis.entities.length >= 1` | PASS/FAIL |
62
+ | entitySchemaFormat | attributes[] not fields[] (BLOCKING) | `analysis.entities.every(e => e.attributes?.length > 0)` | PASS/FAIL |
63
+ | entityAttributeTypes | ALL attributes have `type` field (BLOCKING) | `analysis.entities.every(e => e.attributes.every(a => a.type))` — **NOTE:** Entities in analysis phase may NOT have `type`. Step-03c auto-fix MUST have run first. If types are missing, RE-RUN step-03c auto-fix algorithm. | PASS/FAIL |
64
+ | navigation | entries[] present (BLOCKING) | `specification.navigation?.entries?.length >= 1` | PASS/FAIL |
65
+ | dataLifecycle | present in analysis (BLOCKING) | `analysis.dataLifecycle !== undefined` | PASS/FAIL |
66
+ | wireframes | 1 per section (BLOCKING) | `(specification.uiWireframes \|\| specification.wireframes \|\| []).length >= (specification.sections \|\| []).length` (count REAL elements, check BOTH key names) | PASS/FAIL |
67
+ | wireframeSchema | All required fields present (BLOCKING) | `(specification.uiWireframes \|\| specification.wireframes \|\| []).every(w => (w.screen \|\| w.title) && w.section && (w.mockup \|\| w.ascii \|\| w.content))` | PASS/FAIL |
68
+ | sections | 1 (BLOCKING) | `specification.sections.length >= 1` (EVERY module needs at least 1 section) | PASS/FAIL |
69
+ | gherkinScenarios | 1 array entry | `Array.isArray(specification.gherkinScenarios) && specification.gherkinScenarios.length >= 1` | PASS/FAIL |
70
+ | gherkinFormat | Array not object (BLOCKING) | `Array.isArray(specification.gherkinScenarios)` (NOT a single object) | PASS/FAIL |
71
+ | validations | 1 | `specification.validations.length >= 1` | PASS/FAIL |
72
+ | validationFormat | rules[] array (BLOCKING) | `specification.validations.every(v => Array.isArray(v.rules))` (NOT singular `rule`) | PASS/FAIL |
73
+ | messages | 4 | `specification.messages.length >= 4` | PASS/FAIL |
74
+ | messageFormat | `message` field present (BLOCKING) | `specification.messages.every(m => m.message)` | PASS/FAIL |
75
+ | lifeCycles | 1 (if entity has status) | `specification.lifeCycles.length >= 1` (if any entity has status/state field) | PASS/FAIL |
76
+ | seedDataCore | 9 arrays present with content | See detailed check below | PASS/FAIL (BLOCKING) |
77
+ | apiEndpoints | 1 | `specification.apiEndpoints.length >= 1` | PASS/FAIL |
78
+ | i18nKeys | present | `specification.i18nKeys !== undefined && specification.i18nKeys !== null` | PASS/FAIL |
79
+ | navigationIcons | non-null | `specification.seedDataCore.navigationModules.every(m => m.icon !== null)` | PASS/FAIL |
80
+
81
+ **seedDataCore detailed check (BLOCKING):**
82
+ ```javascript
83
+ const sdc = specification.seedDataCore;
84
+ const currentModuleIndex = metadata.workflow?.currentModuleIndex || 0;
85
+ const checks = [
86
+ // navigationApplications and applicationRoles: required for first module (index 0), can be empty for subsequent modules
87
+ { key: "navigationApplications", actual: sdc.navigationApplications?.length || 0, min: currentModuleIndex === 0 ? 1 : 0 },
88
+ { key: "applicationRoles", actual: sdc.applicationRoles?.length || 0, min: currentModuleIndex === 0 ? 1 : 0 },
89
+ { key: "navigationModules", actual: sdc.navigationModules?.length || 0, min: 1 },
90
+ { key: "navigationSections", actual: sdc.navigationSections?.length || 0, min: 1 }, // EVERY module needs ≥1 section
91
+ { key: "navigationResources", actual: sdc.navigationResources?.length || 0, min: 1 },
92
+ { key: "navigationTranslations", actual: sdc.navigationTranslations?.length || 0, min: 2 }, // min fr+en
93
+ { key: "permissions", actual: sdc.permissions?.length || 0, min: 1 },
94
+ { key: "rolePermissions", actual: sdc.rolePermissions?.length || 0, min: 1 },
95
+ { key: "permissionConstants", actual: sdc.permissionConstants?.length || 0, min: 1 }
96
+ ];
97
+ const failures = checks.filter(c => c.actual < c.min);
98
+ IF failures.length > 0:
99
+ BLOCKING ERROR: "seedDataCore incomplete — empty arrays: {failures.map(f => f.key).join(', ')}"
100
+ → Fix: Ensure specification.sections[] has ≥1 entry, then re-run 8f-bis transform
101
+ ```
102
+
103
+ #### 9b. Consistency Checks
104
+
105
+ - Every UC has ≥1 linked FR
106
+ - Every FR has ≥1 linked BR
107
+ - All BR references exist in analysis.businessRules
108
+ - All actors appear in permissionMatrix
109
+ - Permission paths use correct format: module-level `{app}.{module}.{action}` or section-level `{app}.{module}.{section}.{action}`
110
+ - rolePermissions paths match permissions paths
111
+ - API routes use consistent prefix
112
+
113
+ #### 9c. Convention Checks
114
+
115
+ - UC-NNN format
116
+ - FR-NNN format
117
+ - BR-{CATEGORY}-NNN format
118
+ - Entity names PascalCase
119
+ - Field names camelCase
120
+ - Entity attribute format: `attributes[]` with {name, description}, NOT `fields[]` with {name, type} — entities must NOT have tableName or primaryKey
121
+ - Wireframe structure: `screen` (not `name`/`title`), `mockup` (not `ascii`/`content`), `componentMapping` is array of {wireframeElement, reactComponent} (not plain key-value object), `layout` is object with regions (not string)
122
+ - Wireframe field naming: uses `screen` (not `title`), `mockup` (not `ascii`) — auto-fix if wrong (see 9c-fix below)
123
+ - Permission paths dot-separated lowercase
124
+
125
+ #### 9c-fix. Auto-Fix Wireframe Field Names (MANDATORY before writing)
126
+
127
+ > **CRITICAL:** The agent may use non-canonical field names (`title`, `ascii`, `name`, `content`).
128
+ > These MUST be normalized to canonical names before writing to feature.json.
129
+
130
+ ```javascript
131
+ // AUTO-FIX: Normalize wireframe field names before writing
132
+ const wireframes = specification.uiWireframes || specification.wireframes || [];
133
+ for (const wf of wireframes) {
134
+ if (wf.title && !wf.screen) { wf.screen = wf.title; delete wf.title; }
135
+ if (wf.ascii && !wf.mockup) { wf.mockup = wf.ascii; delete wf.ascii; }
136
+ if (wf.content && !wf.mockup) { wf.mockup = wf.content; delete wf.content; }
137
+ if (wf.name && !wf.screen) { wf.screen = wf.name; delete wf.name; }
138
+ }
139
+ // Store normalized wireframes back under canonical key
140
+ specification.uiWireframes = wireframes;
141
+ ```
142
+
143
+ #### 9c-fix-entities. Auto-Fix Entity Attribute Types (MANDATORY before writing)
144
+
145
+ > **DEFENSE-IN-DEPTH:** step-03c POST-CHECK should catch attributes without `type`,
146
+ > but if any slip through to step-03d, auto-fix them here before writing to feature.json.
147
+ > Uses the same type inference algorithm as step-03c POST-CHECK.
148
+
149
+ ```javascript
150
+ // AUTO-FIX: Ensure all entity attributes have structured type
151
+ const entities = analysis.entities || [];
152
+ let entityAutoFixCount = 0;
153
+ for (const entity of entities) {
154
+ for (const attr of entity.attributes || []) {
155
+ if (!attr.type) {
156
+ // Infer type from attribute name pattern
157
+ if (attr.validation?.match(/max\s*\d+/i) || attr.name.match(/name|title|code|description|label|email|phone|address/i)) {
158
+ attr.type = "string";
159
+ const maxMatch = attr.validation?.match(/max\s*(\d+)/i);
160
+ if (maxMatch) attr.maxLength = parseInt(maxMatch[1]);
161
+ } else if (attr.name.match(/id$/i)) {
162
+ attr.type = "Guid";
163
+ } else if (attr.name.match(/date|At$/i)) {
164
+ attr.type = "DateTime";
165
+ } else if (attr.name.match(/is[A-Z]|has[A-Z]|active|enabled/)) {
166
+ attr.type = "bool";
167
+ } else if (attr.name.match(/amount|salary|rate|price|total/i)) {
168
+ attr.type = "decimal";
169
+ } else if (attr.name.match(/count|number|order|sort|index/i)) {
170
+ attr.type = "int";
171
+ } else {
172
+ attr.type = "string"; // safe default
173
+ }
174
+ // Normalize free-text maxLength
175
+ if (typeof attr.validation === 'string' && !attr.maxLength) {
176
+ const m = attr.validation.match(/max\s*(\d+)/i);
177
+ if (m) attr.maxLength = parseInt(m[1]);
178
+ }
179
+ if (attr.required === undefined) attr.required = true;
180
+ entityAutoFixCount++;
181
+ }
182
+ }
183
+ }
184
+ if (entityAutoFixCount > 0) {
185
+ console.warn(`DEFENSE-IN-DEPTH: auto-fixed ${entityAutoFixCount} attributes without type in step-03d`);
186
+ }
187
+ ```
188
+
189
+ #### 9d. Decision
190
+
191
+ > **TEAM AGENT MODE:** If running as team agent, SKIP AskUserQuestion. On FAIL → auto-correct silently. On PASS → proceed directly to section 11 (write). NEVER present options to the user.
192
+
193
+ **INLINE MODE ONLY (main conversation):**
194
+
195
+ IF validation PASS:
196
+ Display summary, ask client for confirmation
197
+
198
+ IF validation FAIL:
199
+ Display errors, offer:
200
+ ```
201
+ options:
202
+ - label: "Auto-corriger"
203
+ description: "Corriger automatiquement les erreurs détectées"
204
+ - label: "Réviser manuellement"
205
+ description: "Revenir aux sections problématiques"
206
+ - label: "Forcer la validation"
207
+ description: "Accepter malgré les erreurs (risqué)"
208
+ ```
209
+
210
+ #### 9e. Write Module Validation Section (MANDATORY)
211
+
212
+ > **The module feature.json MUST have a `validation` section recording the results of steps 9a-9d.**
213
+
214
+ ```
215
+ ba-writer.enrichSection({
216
+ featureId: {module_feature_id},
217
+ section: "validation",
218
+ data: {
219
+ validatedAt: "{ISO timestamp}",
220
+ completenessChecks: [
221
+ { "section": "useCases", "count": {count}, "minimum": 2, "status": "PASS|FAIL" },
222
+ { "section": "functionalRequirements", "count": {count}, "minimum": 4, "status": "PASS|FAIL" },
223
+ { "section": "wireframes", "count": {count}, "minimum": {section_count}, "status": "PASS|FAIL" },
224
+ { "section": "seedDataCore", "count": 7, "minimum": 7, "status": "PASS|FAIL" }
225
+ ],
226
+ consistencyChecks: [
227
+ { "check": "UC-FR linkage", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" },
228
+ { "check": "BR references valid", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" },
229
+ { "check": "Permission path format", "passed": {n}, "warnings": {n}, "errors": {n}, "status": "PASS|FAIL" }
230
+ ],
231
+ conventionChecks: [
232
+ { "check": "ID naming with module prefix", "status": "PASS|FAIL", "details": "..." },
233
+ { "check": "Entity names PascalCase", "status": "PASS|FAIL", "details": "..." }
234
+ ],
235
+ semanticChecks: [
236
+ { "check": "orphan-permissions", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false },
237
+ { "check": "uc-sans-fr", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false },
238
+ { "check": "missing-wireframes", "module": "{currentModule}", "status": "PASS|WARNING|ERROR", "details": "...", "autoFixed": false }
239
+ ],
240
+ warnings: ["List of non-blocking warnings"],
241
+ decision: {
242
+ "approved": true,
243
+ "reason": "All checks passed",
244
+ "approvalMode": "standard",
245
+ "approvedBy": "Client",
246
+ "approvedAt": "{ISO timestamp}"
247
+ }
248
+ }
249
+ })
250
+ ```
251
+
252
+ #### 9e-POST-CHECK: Validation Section Persistence (BLOCKING)
253
+
254
+ > **CRITICAL:** The `validation` section MUST be persisted to feature.json. Without it, consolidation checks fail.
255
+
256
+ ```bash
257
+ MODULE_JSON="{module_feature_json_path}"
258
+ node -e "const d=JSON.parse(require('fs').readFileSync(process.argv[1],'utf-8'));
259
+ if(!d.validation||!d.validation.decision) { console.error('FAIL: validation section missing or incomplete'); process.exit(1); }
260
+ console.log('PASS: validation section present with decision');" "$MODULE_JSON"
261
+ ```
262
+
263
+ IF this check FAILS → re-execute section 9e write and re-run this check.
264
+
265
+ #### 9f. Module Specification Checklist (BLOCKING)
266
+
267
+ > **CRITICAL:** This checklist MUST be FULLY COMPLETED before marking module status = "specified".
268
+
269
+ **Execute the comprehensive validation checklist:**
270
+
271
+ Run the 29-check validation process across 10 categories:
272
+ - Data Model (4 checks) | Business Rules (3 checks) | Use Cases & FRs (4 checks)
273
+ - Permissions (3 checks) | UI & Navigation (4 checks) | I18N & Messages (3 checks)
274
+ - Seed Data (2 checks) | API Endpoints (2 checks) | Validations (1 check) | Gherkin (3 checks)
275
+
276
+ ```javascript
277
+ const blockingFailures = checks.filter(c => c.blocking && c.status === "FAIL");
278
+
279
+ IF blockingFailures.length > 0:
280
+ // CONDITIONAL LOAD: Only load detailed checklist on validation failure
281
+ Read references/validation-checklist.md
282
+ Display:
283
+ - Full validation logic for FAILED checks
284
+ - Exact requirements (minimums, patterns, formats)
285
+ - Fix recommendations for each failure
286
+
287
+ BLOCKING ERROR: Module specification incomplete
288
+ → Fix all failures before proceeding
289
+
290
+ ELSE:
291
+ All blocking checks passed ✓
292
+ Display: "{warnings_count} warnings (non-blocking)"
293
+ → Proceed to mark module as "specified"
294
+ ```
295
+
296
+ **Optimization:** The detailed 280-line validation-checklist.md is loaded **only when validation fails** (saves ~10,000 tokens on success path).
297
+
298
+ ---
299
+
300
+ ### 9g. Anti-Premature-Completion Guard (MANDATORY)
301
+
302
+ > **CRITICAL — NEVER say "the analysis is complete" or "ready for /ralph-loop" at this point.**
303
+ > Step-03d is the END of SPECIFICATION, NOT the end of the BA workflow.
304
+ > Steps 04a → 04b → 04c (consolidation) + 05a → 05b → 05c (handoff) are STILL REQUIRED.
305
+ > Without handoff, /ralph-loop will generate an INCOMPLETE PRD (no frontend, no tests).
306
+
307
+ **FORBIDDEN phrases in step-03d output:**
308
+ - "L'analyse métier est complète" / "The business analysis is complete"
309
+ - "Prêt pour /ralph-loop" / "Ready for /ralph-loop"
310
+ - "Vous pouvez maintenant lancer /ralph-loop"
311
+ - Any variation suggesting the BA is finished or /ralph-loop can be invoked
312
+
313
+ **REQUIRED phrasing:**
314
+ - "Module {name} spécifié. {Remaining} modules restants." (if more modules)
315
+ - "Tous les modules spécifiés. Passage à la consolidation (étapes 04a-04c)..." (if last module)
316
+ - NEVER mention /ralph-loop — only step-05c (ralph readiness) validates the handoff
317
+
318
+ ### 10. Module Summary with Roles & Permissions
319
+
320
+ Display comprehensive summary:
321
+
322
+ ```
323
+ ═══════════════════════════════════════════════════════════
324
+ MODULE SPÉCIFIÉ: {currentModule} ({currentModuleIndex + 1}/{total})
325
+ ═══════════════════════════════════════════════════════════
326
+
327
+ | Aspect | Valeur |
328
+ |--------|--------|
329
+ | Entités | {count} ({entity names}) |
330
+ | Business Rules | {count} (VAL: X, CALC: Y, WF: Z) |
331
+ | Use Cases | {count} (UC-001 → UC-NNN) |
332
+ | Exigences | {count} FRs |
333
+ | Sections | {count} ({section names}) |
334
+ | Maquettes | {count} wireframes |
335
+ | Permissions | {count} paths |
336
+ | Tests Gherkin | {count} scénarios |
337
+ | Messages | {count} |
338
+
339
+ ### Rôles & Permissions pour {currentModule}
340
+ | Rôle | Permissions |
341
+ |------|------------|
342
+ | {App} Admin | {app}.{module}.* |
343
+ | {App} Manager | read, create, update, assign |
344
+ | {App} Contributor | read, create, update |
345
+ | {App} Viewer | read |
346
+
347
+ → Validation: {PASS/FAIL}
348
+ ═══════════════════════════════════════════════════════════
349
+
350
+ {IF validation PASS}:
351
+ → Module validé automatiquement
352
+ → Passage automatique au module suivant (section 12)
353
+
354
+ {IF validation FAIL}:
355
+ → Afficher les erreurs et offrir les options de correction (section 9d)
356
+ ```
357
+
358
+ ---
359
+
360
+ ### 11. Write Module Feature.json
361
+
362
+ ```
363
+ // Write analysis section with ALL subsections
364
+ ba-writer.enrichSection({
365
+ featureId: {module_feature_id},
366
+ section: "analysis",
367
+ data: {
368
+ objectives: [{id, objective, metric, target}], // from 6a
369
+ entities: [{name, description, attributes, relationships}], // from 6b — SCHEMA FORMAT
370
+ businessRules: [{id, name, category, statement, priority, conditions, examples, testability}], // from 7 — SCHEMA FORMAT
371
+ processFlow: {entryPoints, mainFlow, decisionPoints, alternativeFlows}, // from 6c
372
+ dataLifecycle: {retentionPeriod, archiveStrategy, gdprCompliance, states} // from 6d
373
+ }
374
+ })
375
+
376
+ // Write specification section with ALL subsections
377
+ ba-writer.enrichSection({
378
+ featureId: {module_feature_id},
379
+ section: "specification",
380
+ data: {
381
+ actors: [{role, description, permissions}], // 8a
382
+ useCases: [{id, name, primaryActor, permission, mainScenario, linkedRules}], // 8b
383
+ functionalRequirements: [{id, statement, priority, linkedRules, linkedUseCases, acceptanceCriteria}], // 8c
384
+ permissionMatrix: {permissions: [], roleAssignments: []}, // 8d
385
+ navigation: {entries: []}, // 8e
386
+ seedDataCore: {navigationModules, navigationSections, navigationResources, navigationTranslations, permissions, rolePermissions, permissionConstants}, // 8f (7 arrays)
387
+ gherkinScenarios: [{feature, scenarios: [{name, tags, given, when, then}]}], // 8g
388
+ validations: [{entity, field, rules, errorMessageKey}], // 8h
389
+ messages: [{code, type, title, message, i18nKey}], // 8i
390
+ lifeCycles: [{entity, field, initialState, states: [{id, displayName, color, allowedTransitions, isTerminal}], transitions}], // 8j
391
+ apiEndpoints: [{method, path, permission, requestDto, responseDto, description}], // 8k
392
+ i18nKeys: {...}, // 8l
393
+ sections: [{code, labels, route, icon, permission, wireframe, useCases, businessRules, resources}], // from 3a-bis
394
+ dashboards: [{code, title, kpis, filters, refreshMode}], // from 3d
395
+ uiWireframes: [{screen, section, mockup, elements, actions, componentMapping, layout}] // from 3b
396
+ }
397
+ })
398
+
399
+ // Write validation results from step 9
400
+ // (Already written in step 9e above)
401
+
402
+ ba-writer.updateStatus({module_feature_id}, "specified")
403
+
404
+ // Update master
405
+ ba-writer.updateModuleStatus({feature_id}, {currentModule.code}, "specified")
406
+ ```
407
+
408
+ #### 11-POST-CHECK: Verify Written Data (BLOCKING)
409
+
410
+ > **CRITICAL — Data loss prevention.** After writing, READ BACK the module feature.json and verify the following arrays are **non-empty**:
411
+
412
+ ```javascript
413
+ // READ BACK the written feature.json
414
+ const written = ba-reader.read({module_feature_id});
415
+
416
+ // BLOCKING checks — if ANY fails, the write was incomplete
417
+ const checks = [
418
+ { key: "specification.actors", actual: written.specification?.actors?.length, min: 2 },
419
+ { key: "specification.useCases", actual: written.specification?.useCases?.length, min: 2 },
420
+ { key: "specification.wireframes", actual: (written.specification?.uiWireframes?.length || written.specification?.wireframes?.length || 0), min: 1 },
421
+ { key: "specification.sections", actual: written.specification?.sections?.length, min: 1 },
422
+ { key: "specification.seedDataCore", actual: Object.keys(written.specification?.seedDataCore || {}).length, min: 7 },
423
+ { key: "specification.lifeCycles", actual: written.specification?.lifeCycles?.length, min: 0 },
424
+ { key: "specification.gherkinScenarios",actual: written.specification?.gherkinScenarios?.length,min: 1 },
425
+ { key: "specification.apiEndpoints", actual: written.specification?.apiEndpoints?.length, min: 1 }
426
+ ];
427
+
428
+ const failures = checks.filter(c => (c.actual || 0) < c.min);
429
+
430
+ IF failures.length > 0:
431
+ BLOCKING ERROR: "Feature.json write INCOMPLETE — missing data in: {failures.map(f => f.key).join(', ')}"
432
+ → Re-execute section 11 write with ALL specification data
433
+ → DO NOT proceed to next module until ALL checks pass
434
+
435
+ // SPECIAL CHECK: wireframes content verification (check BOTH key names)
436
+ const wireframes = written.specification?.uiWireframes || written.specification?.wireframes || [];
437
+ IF wireframes.length > 0:
438
+ const emptyMockups = wireframes.filter(wf => !wf.mockup && !wf.ascii && !wf.content);
439
+ IF emptyMockups.length > 0:
440
+ WARNING: "{emptyMockups.length} wireframes have empty mockup content — verify step-03b data"
441
+
442
+ // SPECIAL CHECK: wireframes >= sections
443
+ const sectionCount = written.specification?.sections?.length || 0;
444
+ IF wireframes.length < sectionCount:
445
+ BLOCKING ERROR: "{wireframes.length} wireframes < {sectionCount} sections — wireframes MISSING for some sections"
446
+ → Re-read wireframes from conversation context and re-write to feature.json
447
+ ```
448
+
449
+ #### 11-POST-CHECK-BASH: Acceptance Criteria Verification (BLOCKING)
450
+
451
+ > **CRITICAL:** The pseudocode checks above are interpreted by the model — they can be "passed" incorrectly.
452
+ > This bash check reads the REAL file on disk and provides an objective verification.
453
+ > See [references/acceptance-criteria.md](../references/acceptance-criteria.md) for the full acceptance criteria definition.
454
+
455
+ ```bash
456
+ MODULE_JSON="{module_feature_json_path}"
457
+ node -e "
458
+ const fs = require('fs');
459
+ const data = JSON.parse(fs.readFileSync(process.argv[1], 'utf-8'));
460
+ const spec = data.specification || {};
461
+ const analysis = data.analysis || {};
462
+ const wf = spec.uiWireframes || spec.wireframes || [];
463
+ const sections = spec.sections || [];
464
+ const checks = [
465
+ ['entities >= 1', (analysis.entities||[]).length, 1],
466
+ ['useCases >= 2', (spec.useCases||[]).length, 2],
467
+ ['FRs >= 4', (spec.functionalRequirements||[]).length,4],
468
+ ['wireframes >= 1', wf.length, 1],
469
+ ['wireframes >= sections', wf.length, sections.length],
470
+ ['sections >= 1', sections.length, 1],
471
+ ['seedDataCore 7 arrays', Object.keys(spec.seedDataCore||{}).filter(k=>(spec.seedDataCore||{})[k]&&(spec.seedDataCore||{})[k].length>0).length, 7],
472
+ ['gherkin is array', Array.isArray(spec.gherkinScenarios)?1:0, 1],
473
+ ['apiEndpoints >= 1', (spec.apiEndpoints||[]).length, 1],
474
+ ['messages >= 4', (spec.messages||[]).length, 4],
475
+ ['validations >= 1', (spec.validations||[]).length, 1],
476
+ ['navigation entries', (spec.navigation?.entries||[]).length, 1],
477
+ ['dataLifecycle', analysis.dataLifecycle ? 1 : 0, 1],
478
+ ['validation section', data.validation ? 1 : 0, 1]
479
+ ];
480
+ // AC-18: i18n 4 languages check
481
+ const i18n = spec.i18nKeys || {};
482
+ const i18nLangs = ['fr','en','it','de'];
483
+ let i18nMissing = 0;
484
+ function checkI18nLeaf(obj) {
485
+ if (typeof obj !== 'object' || obj === null) return;
486
+ const hasLang = i18nLangs.some(l => typeof obj[l] === 'string');
487
+ if (hasLang) { i18nLangs.forEach(l => { if (!obj[l]) i18nMissing++; }); }
488
+ else { Object.values(obj).forEach(v => checkI18nLeaf(v)); }
489
+ }
490
+ checkI18nLeaf(i18n);
491
+ checks.push(['i18n 4 languages (missing keys)', 0, i18nMissing > 10 ? 1 : 0]);
492
+
493
+ const fails = checks.filter(c => c[1] < c[2]);
494
+ fails.forEach(f => console.error('FAIL: ' + f[0] + ' = ' + f[1] + ' (min: ' + f[2] + ')'));
495
+ if (i18nMissing > 0 && i18nMissing <= 10) { console.warn('WARNING: ' + i18nMissing + ' i18n leaf keys missing translations (IT/DE)'); }
496
+ // Check wireframe content
497
+ const emptyWf = wf.filter(w => !w.mockup && !w.ascii && !w.content);
498
+ if (emptyWf.length > 0) { fails.push(['wireframe content', 0, 1]); console.error('FAIL: ' + emptyWf.length + ' wireframes have EMPTY content'); }
499
+ // Check entity attribute types
500
+ const badAttrs = (analysis.entities||[]).flatMap(e => (e.attributes||[]).filter(a => !a.type).map(a => e.name+'.'+a.name));
501
+ if (badAttrs.length > 0) { fails.push(['attr.type', 0, 1]); console.error('FAIL: attributes without type: ' + badAttrs.join(', ')); }
502
+ // AC-15: Validation rules format
503
+ const badRules = (spec.validations||[]).filter(v => v.rules && !Array.isArray(v.rules));
504
+ if (badRules.length > 0) { fails.push(['AC-15: rules not array', badRules.length, 0]); console.error('FAIL: AC-15: ' + badRules.length + ' validations have rules as string'); }
505
+ // AC-16: Messages must have message field
506
+ const noMsg = (spec.messages||[]).filter(m => !m.message);
507
+ if (noMsg.length > 0) { fails.push(['AC-16: message missing', noMsg.length, 0]); console.error('FAIL: AC-16: ' + noMsg.length + ' messages missing message field'); }
508
+ // AC-17: Gherkin content structure
509
+ if (Array.isArray(spec.gherkinScenarios)) { const badG = spec.gherkinScenarios.filter(g => !g.feature || !Array.isArray(g.scenarios)); if (badG.length > 0) { fails.push(['AC-17: gherkin content', badG.length, 0]); console.error('FAIL: AC-17: ' + badG.length + ' gherkin entries invalid'); } }
510
+ if (fails.length > 0) { console.error('BLOCKING: ' + fails.length + ' acceptance criteria failed'); process.exit(1); }
511
+ console.log('PASS: All acceptance criteria met');
512
+ " "$MODULE_JSON"
513
+ ```
514
+
515
+ IF this check FAILS:
516
+ - Identify which criteria failed from the output
517
+ - Fix the corresponding data (re-read from conversation context, re-generate, or re-run the step that produces it)
518
+ - Re-write to feature.json
519
+ - Re-run the POST-CHECK until PASS
520
+
521
+ > **WHY:** Step-03b now writes wireframes intermediately (since fix), but step-03d section 11 does the FULL write.
522
+ > This bash POST-CHECK is the ultimate safety net — it reads the REAL file and verifies ALL acceptance criteria.
523
+ > The pseudocode checks (section 9a) catch issues early; this bash check catches anything the model missed.
524
+
525
+ ---
526
+
527
+ ### 11-bis. Deploy Incremental Interactive HTML (MANDATORY)
528
+
529
+ > **After each module is specified, deploy/update the interactive HTML document with all available data.**
530
+ > The client can review completed modules while the next module is being specified.
531
+
532
+ See [references/validate-incremental-html.md](../references/validate-incremental-html.md) for the complete deployment process (read sources, build FEATURE_DATA, replace placeholders, write HTML).
533
+
534
+ Uses the **same mapping** as step-05b-deploy.md — only difference is `moduleSpecs` only includes completed modules.
535
+
536
+ ---
537
+
538
+ ### 12. Loop Decision
539
+
540
+ > **TEAM AGENT MODE: SKIP THIS ENTIRE SECTION.** If you are a team agent (your prompt contains `PROPOSE & REVIEW`), go directly to **section 12-bis** below. Section 12 is for inline mode ONLY. You MUST NOT load the next step or advance the module loop — the team lead handles orchestration.
541
+
542
+ **INLINE MODE ONLY (main conversation):**
543
+
544
+ ```
545
+ ba-writer.advanceModuleLoop({feature_id})
546
+ → Increments currentModuleIndex
547
+ → Updates completedModules
548
+ → Updates currentModule
549
+
550
+ IF currentModuleIndex < moduleOrder.length:
551
+ Display: "→ Module suivant: {nextModule} ({currentModuleIndex + 1}/{total})"
552
+ Load: steps/step-03a1-setup.md
553
+
554
+ IF currentModuleIndex >= moduleOrder.length:
555
+ ba-writer.updateStatus({feature_id}, "specified")
556
+
557
+ // CHECKPOINT: Save progress BEFORE transition (protects against context exhaustion)
558
+ ba-writer.enrichSection({
559
+ featureId: {feature_id},
560
+ section: "metadata.workflow",
561
+ data: {
562
+ lastCompletedStep: "step-03d-validate",
563
+ allModulesSpecified: true
564
+ }
565
+ })
566
+
567
+ // CHECK: Are we in project mode (multi-application)?
568
+ IF workflow.mode === "project":
569
+ // APPLICATION LOOP: Check if more applications remain
570
+ projectFeature = ba-reader.findProjectFeature()
571
+ ba-writer.updateApplicationStatus(projectId, currentApp.code, "specified")
572
+ ba-writer.advanceApplicationLoop(projectId)
573
+
574
+ IF projectFeature.metadata.workflow.currentApplicationIndex + 1 < projectFeature.metadata.workflow.applicationOrder.length:
575
+ nextApp = projectFeature.metadata.workflow.applicationOrder[currentApplicationIndex + 1]
576
+ Display: "═══ Application {currentApp.name} terminée ({N}/{total}). Prochaine : {nextApp} ═══"
577
+ Display: "⚠ NE PAS lancer /ralph-loop — d'autres applications et la consolidation sont encore nécessaires."
578
+ // Load step-02 for next application's module decomposition
579
+ Load: steps/step-02-decomposition.md
580
+ ELSE:
581
+ Display: "═══ Toutes les applications spécifiées! Passage à la consolidation cross-application... ═══"
582
+ Display: "⚠ NE PAS lancer /ralph-loop — la consolidation et le handoff sont encore nécessaires."
583
+ ba-writer.updateStatus(projectId, "specified")
584
+ Load: steps/step-04a-collect.md
585
+ ELSE:
586
+ // SINGLE APPLICATION: Current behavior
587
+ Display: "═══ Tous les modules spécifiés! Passage à la consolidation (04a→04c) puis handoff (05a→05c)... ═══"
588
+ Display: "⚠ NE PAS lancer /ralph-loop — la consolidation et le handoff sont encore nécessaires."
589
+
590
+ // MANDATORY TRANSITION — DO NOT STOP HERE
591
+ // If context is near exhaustion, the checkpoint above ensures the user
592
+ // can resume with /business-analyse and it will route to step-04a automatically.
593
+ Load: steps/step-04a-collect.md
594
+ ```
595
+
596
+ ---
597
+
598
+ ## 12-bis. Agent Mode: Send Proposal to Team Lead
599
+
600
+ **IF running as TEAM AGENT (autonomous mode — detected in step-03a1 MODE DETECTION):**
601
+
602
+ After all validation checks PASS and module feature.json is written:
603
+
604
+ ### A. Build Structured Summary
605
+
606
+ Read the written module feature.json via ba-reader and build:
607
+
608
+ ```
609
+ ## Module: {moduleCode} — Specification Summary
610
+
611
+ ### Entities ({count})
612
+ | Entity | Key Attributes | Relationships |
613
+ |--------|---------------|---------------|
614
+ | {name} | {attr1} ({type}), {attr2} ({type}), ... | → {relatedEntity} (FK) |
615
+
616
+ ### Sections ({count})
617
+ | Section | Description | Resources |
618
+ |---------|-------------|-----------|
619
+ | {code} | {description} | {resource1}, {resource2}, ... |
620
+
621
+ ### Use Cases ({count})
622
+ - {UC-ID}: {title}
623
+
624
+ ### Business Rules ({count})
625
+ - {BR-ID}: {title} ({category})
626
+
627
+ ### Permissions
628
+ - {permission.path}: {roles with access}
629
+
630
+ ### Seed Data Counts
631
+ - Modules: {n} | Sections: {n} | Resources: {n}
632
+ - Translations: {n} | Permissions: {n} | Role mappings: {n} | Constants: {n}
633
+
634
+ ### Wireframes
635
+ - {section}: {1-line description of layout and key components}
636
+ ```
637
+
638
+ ### B. Send Proposal
639
+
640
+ ```
641
+ SendMessage({
642
+ type: "message",
643
+ recipient: "team-lead",
644
+ content: "PROPOSAL_READY:{moduleCode}\n\n{structured_summary}",
645
+ summary: "{moduleCode} specification ready for review"
646
+ })
647
+ ```
648
+
649
+ ### C. Wait for Response
650
+
651
+ **WAIT** for team lead to respond:
652
+
653
+ - **`APPROVED:{moduleCode}`** → Proceed to step D (Module Complete)
654
+ - **`REVISION:{moduleCode}\n{feedback}`** → Apply changes:
655
+ 1. Read the feedback
656
+ 2. Update the relevant sections in feature.json via ba-writer
657
+ 3. Re-run validation checks (section 9)
658
+ 4. Re-build summary and send new `PROPOSAL_READY`
659
+ 5. Max **3 revision cycles** — after 3, send `ERROR:{moduleCode}:Max revisions reached` and stop
660
+
661
+ ### D. Module Complete
662
+
663
+ After approval:
664
+
665
+ ```
666
+ ba-writer.updateModuleStatus({feature_id}, {moduleCode}, "specified")
667
+ ```
668
+
669
+ ```
670
+ SendMessage({
671
+ type: "message",
672
+ recipient: "team-lead",
673
+ content: "MODULE_COMPLETE:{moduleCode}",
674
+ summary: "{moduleCode} module complete"
675
+ })
676
+ ```
677
+
678
+ Then WAIT — the team lead will send you a `shutdown_request`.
679
+ Do NOT loop to next module. The team lead handles module ordering and will spawn a new agent for the next module.
680
+
681
+ ### E. Shutdown (MANDATORY)
682
+
683
+ When you receive a `shutdown_request` from the team lead:
684
+
685
+ ```
686
+ SendMessage({
687
+ type: "shutdown_response",
688
+ request_id: "{requestId from the shutdown_request message}",
689
+ approve: true
690
+ })
691
+ ```
692
+
693
+ This terminates your process. Do NOT output any text after `shutdown_response`.
694
+
695
+ **Sequence reminder:** APPROVED → MODULE_COMPLETE → shutdown_request → shutdown_response (4 separate steps, never skip).
696
+
697
+ ---
698
+
699
+ ## SELF-VERIFICATION (MANDATORY before loading next step)
700
+
701
+ Before proceeding to step-03a (next module) or step-04 (consolidation), VERIFY:
702
+
703
+ 1. **Module feature.json has specification section** with ALL sub-sections (actors, useCases, functionalRequirements, permissionMatrix, navigation, seedDataCore, gherkinScenarios, validations, messages, lifeCycles, apiEndpoints, i18nKeys, sections, uiWireframes)
704
+ 2. **Module feature.json status** = "specified" (set by section 11)
705
+ 3. **Master modules[].status** for this module = "specified" (set by section 11)
706
+ 4. **ba-interactive.html exists** and includes data for this module (set by section 11-bis)
707
+
708
+ **IF any check fails → FIX before proceeding.** Do NOT advance the module loop with incomplete data.
709
+
710
+ ---
711
+
712
+ ## SINGLE-MODULE MODE
713
+
714
+ When only 1 module in moduleOrder:
715
+
716
+ - Same full validation flow
717
+ - Skip cross-module references (section 5)
718
+ - After validation → direct to step-04a-collect.md (auto-consolidation)
719
+
720
+ ---
721
+
722
+ ## RESUME SUPPORT
723
+
724
+ IF the step is resumed (e.g., after interruption):
725
+
726
+ ```
727
+ Read metadata.workflow.currentModuleIndex
728
+ Read metadata.workflow.currentModule
729
+ → Resume at the correct module
730
+ → If module has partial data, show what exists and continue from there
731
+ ```
732
+
733
+ ---
734
+
735
+ ## CONTEXT MANAGEMENT
736
+
737
+ | Loaded | Not Loaded |
738
+ |--------|------------|
739
+ | _shared.md | Other module feature.json (full) |
740
+ | feature-schema.json | Questionnaires not needed |
741
+ | Questionnaires for this module | Templates |
742
+ | Completed modules summary (100 lines max) | React viewer files |
743
+
744
+ ---
745
+
746
+ ## STATE VARIABLES
747
+
748
+ | Variable | Description |
749
+ |----------|-------------|
750
+ | `{currentModule}` | Current module being specified |
751
+ | `{currentModuleIndex}` | Index in moduleOrder |
752
+ | `{completedModules}` | Array of already specified module codes |
753
+ | `{module_feature_id}` | Feature ID for the module-level feature.json |
754
+
755
+ ---
756
+
757
+ ## SUCCESS METRICS
758
+
759
+ - Module specification validation PASS
760
+ - Per-module validation results recorded in feature.json
761
+ - Client confirmed module specification
762
+ - Module feature.json written with all sections
763
+ - Master updated with module status
764
+ - Interactive HTML deployed/updated with completed module data (incremental)
765
+ - Loop advanced correctly or consolidation phase initiated
766
+
767
+ ---
768
+
769
+ ## FAILURE MODES
770
+
771
+ - Validation FAIL → offer auto-correct / manual revise / force
772
+ - Client rejects → revise specific sections via step-03a or step-03b
773
+ - Cross-module reference error → clarify with client
774
+ - Interruption → resumable via workflow state
775
+
776
+ ---
777
+
778
+ ## NEXT STEP
779
+
780
+ Conditional:
781
+
782
+ - IF modules remaining → Load `steps/step-03a1-setup.md`
783
+ - IF all modules done → Load `steps/step-04a-collect.md`