@atlashub/smartstack-cli 3.39.0 → 3.40.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 (471) 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.map +1 -1
  12. package/dist/mcp-entry.mjs +6 -4
  13. package/dist/mcp-entry.mjs.map +1 -1
  14. package/package.json +115 -115
  15. package/scripts/extract-api-endpoints.ts +325 -325
  16. package/scripts/extract-business-rules.ts +440 -440
  17. package/scripts/generate-doc-with-mock-ui.ts +804 -804
  18. package/scripts/health-check.sh +168 -168
  19. package/scripts/postinstall.js +18 -18
  20. package/templates/agents/action.md +37 -37
  21. package/templates/agents/ba-reader.md +378 -378
  22. package/templates/agents/ba-writer.md +861 -861
  23. package/templates/agents/code-reviewer.md +163 -163
  24. package/templates/agents/db-reader.md +149 -149
  25. package/templates/agents/docs-context-reader.md +143 -143
  26. package/templates/agents/docs-sync-checker.md +122 -122
  27. package/templates/agents/efcore/conflicts.md +84 -84
  28. package/templates/agents/efcore/db-deploy.md +74 -74
  29. package/templates/agents/efcore/db-reset.md +85 -85
  30. package/templates/agents/efcore/db-seed.md +61 -61
  31. package/templates/agents/efcore/db-status.md +86 -86
  32. package/templates/agents/efcore/migration.md +186 -186
  33. package/templates/agents/efcore/rebase-snapshot.md +108 -108
  34. package/templates/agents/efcore/scan.md +92 -92
  35. package/templates/agents/efcore/squash.md +161 -161
  36. package/templates/agents/explore-codebase.md +66 -66
  37. package/templates/agents/explore-docs.md +98 -98
  38. package/templates/agents/fix-grammar.md +50 -50
  39. package/templates/agents/gitflow/abort.md +45 -45
  40. package/templates/agents/gitflow/cleanup.md +96 -96
  41. package/templates/agents/gitflow/commit.md +236 -236
  42. package/templates/agents/gitflow/exec.md +48 -48
  43. package/templates/agents/gitflow/finish.md +146 -146
  44. package/templates/agents/gitflow/init-clone.md +199 -199
  45. package/templates/agents/gitflow/init-detect.md +137 -137
  46. package/templates/agents/gitflow/init-validate.md +225 -225
  47. package/templates/agents/gitflow/init.md +340 -340
  48. package/templates/agents/gitflow/merge.md +145 -145
  49. package/templates/agents/gitflow/plan.md +42 -42
  50. package/templates/agents/gitflow/pr.md +191 -191
  51. package/templates/agents/gitflow/review.md +49 -49
  52. package/templates/agents/gitflow/start.md +147 -147
  53. package/templates/agents/gitflow/status.md +95 -95
  54. package/templates/agents/mcp-healthcheck.md +163 -163
  55. package/templates/agents/snipper.md +37 -37
  56. package/templates/agents/websearch.md +46 -46
  57. package/templates/hooks/appsettings-guard.sh +76 -76
  58. package/templates/hooks/docs-drift-check.md +96 -96
  59. package/templates/hooks/ef-migration-check.md +139 -139
  60. package/templates/hooks/hooks.json +58 -58
  61. package/templates/hooks/mcp-check.md +64 -64
  62. package/templates/hooks/ralph-mcp-logger.sh +46 -46
  63. package/templates/hooks/ralph-session-end.sh +69 -69
  64. package/templates/hooks/stop-hook.sh +177 -177
  65. package/templates/hooks/wsl-dotnet-cleanup.sh +24 -24
  66. package/templates/mcp-scaffolding/component.tsx.hbs +318 -318
  67. package/templates/mcp-scaffolding/controller.cs.hbs +192 -192
  68. package/templates/mcp-scaffolding/entity-extension.cs.hbs +239 -239
  69. package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +116 -116
  70. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -133
  71. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -126
  72. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +261 -261
  73. package/templates/mcp-scaffolding/service-extension.cs.hbs +53 -53
  74. package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +436 -436
  75. package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +239 -239
  76. package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +441 -441
  77. package/templates/mcp-scaffolding/tests/security.test.cs.hbs +442 -442
  78. package/templates/mcp-scaffolding/tests/service.test.cs.hbs +402 -402
  79. package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +428 -428
  80. package/templates/project/DependencyInjection.Application.cs.template +25 -25
  81. package/templates/project/DependencyInjection.Infrastructure.cs.template +61 -61
  82. package/templates/project/DesignTimeExtensionsDbContextFactory.cs.template +70 -70
  83. package/templates/project/ExampleEntity.cs.template +116 -116
  84. package/templates/project/ExampleEntityConfiguration.cs.template +64 -64
  85. package/templates/project/ExampleService.cs.template +146 -146
  86. package/templates/project/ExtensionsDbContext.cs.template +41 -41
  87. package/templates/project/IExtensionsDbContext.cs.template +22 -22
  88. package/templates/project/Program.cs.template +47 -47
  89. package/templates/project/README.md +79 -79
  90. package/templates/project/api.ts.template +12 -12
  91. package/templates/project/appsettings.json.template +170 -170
  92. package/templates/project/claude-settings.json.template +5 -5
  93. package/templates/project/test-frontend/msw/handlers.ts +58 -58
  94. package/templates/project/test-frontend/msw/server.ts +25 -25
  95. package/templates/project/test-frontend/setup.ts +16 -16
  96. package/templates/project/test-frontend/test-utils.tsx +59 -59
  97. package/templates/project/test-frontend/vitest.config.ts +31 -31
  98. package/templates/ralph/README.md +93 -93
  99. package/templates/ralph/ralph.config.yaml +113 -113
  100. package/templates/scripts/setup-ralph-loop.sh +173 -173
  101. package/templates/skills/_resources/config-safety.md +61 -61
  102. package/templates/skills/_resources/context-digest-template.md +53 -53
  103. package/templates/skills/_resources/doc-context-cache.md +60 -60
  104. package/templates/skills/_resources/docs-manifest-schema.md +155 -155
  105. package/templates/skills/_resources/formatting-guide.md +124 -124
  106. package/templates/skills/_resources/mcp-validate-documentation-spec.md +181 -181
  107. package/templates/skills/_shared.md +228 -228
  108. package/templates/skills/admin/SKILL.md +48 -48
  109. package/templates/skills/ai-prompt/SKILL.md +107 -107
  110. package/templates/skills/ai-prompt/steps/step-00-init.md +47 -47
  111. package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -122
  112. package/templates/skills/apex/SKILL.md +168 -168
  113. package/templates/skills/apex/_shared.md +141 -141
  114. package/templates/skills/apex/references/agent-teams-protocol.md +164 -164
  115. package/templates/skills/apex/references/analysis-methods.md +141 -141
  116. package/templates/skills/apex/references/challenge-questions.md +145 -145
  117. package/templates/skills/apex/references/code-generation.md +412 -412
  118. package/templates/skills/apex/references/core-seed-data.md +1437 -1437
  119. package/templates/skills/apex/references/error-classification.md +144 -144
  120. package/templates/skills/apex/references/examine-build-validation.md +82 -82
  121. package/templates/skills/apex/references/execution-frontend-gates.md +177 -177
  122. package/templates/skills/apex/references/execution-frontend-patterns.md +105 -105
  123. package/templates/skills/apex/references/execution-layer1-rules.md +96 -96
  124. package/templates/skills/apex/references/initialization-challenge-flow.md +110 -110
  125. package/templates/skills/apex/references/planning-layer-mapping.md +151 -151
  126. package/templates/skills/apex/references/post-checks.md +1584 -1584
  127. package/templates/skills/apex/references/smartstack-api.md +1053 -1053
  128. package/templates/skills/apex/references/smartstack-frontend.md +1571 -1571
  129. package/templates/skills/apex/references/smartstack-layers.md +402 -402
  130. package/templates/skills/apex/steps/step-00-init.md +307 -307
  131. package/templates/skills/apex/steps/step-01-analyze.md +165 -165
  132. package/templates/skills/apex/steps/step-02-plan.md +144 -144
  133. package/templates/skills/apex/steps/step-03-execute.md +328 -328
  134. package/templates/skills/apex/steps/step-04-examine.md +263 -263
  135. package/templates/skills/apex/steps/step-05-deep-review.md +129 -129
  136. package/templates/skills/apex/steps/step-06-resolve.md +101 -101
  137. package/templates/skills/apex/steps/step-07-tests.md +238 -238
  138. package/templates/skills/apex/steps/step-08-run-tests.md +125 -125
  139. package/templates/skills/application/SKILL.md +4 -4
  140. package/templates/skills/application/references/application-roles-template.md +227 -227
  141. package/templates/skills/application/references/backend-controller-hierarchy.md +58 -58
  142. package/templates/skills/application/references/backend-entity-seeding.md +72 -72
  143. package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -83
  144. package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -79
  145. package/templates/skills/application/references/backend-verification.md +88 -88
  146. package/templates/skills/application/references/frontend-i18n-and-output.md +67 -67
  147. package/templates/skills/application/references/frontend-route-naming.md +117 -117
  148. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -107
  149. package/templates/skills/application/references/frontend-verification.md +156 -156
  150. package/templates/skills/application/references/migration-checklist-troubleshooting.md +1 -1
  151. package/templates/skills/application/references/provider-template.md +177 -177
  152. package/templates/skills/application/references/roles-client-project-handling.md +55 -55
  153. package/templates/skills/application/references/roles-fallback-procedure.md +149 -149
  154. package/templates/skills/application/references/test-coverage-requirements.md +213 -213
  155. package/templates/skills/application/references/test-frontend.md +73 -73
  156. package/templates/skills/application/references/test-prerequisites.md +72 -72
  157. package/templates/skills/application/steps/step-05-frontend.md +176 -176
  158. package/templates/skills/application/steps/step-06-migration.md +193 -193
  159. package/templates/skills/application/steps/step-07-tests.md +356 -356
  160. package/templates/skills/application/steps/step-08-documentation.md +137 -137
  161. package/templates/skills/application/templates-backend.md +463 -463
  162. package/templates/skills/application/templates-frontend.md +685 -685
  163. package/templates/skills/application/templates-i18n.md +520 -520
  164. package/templates/skills/application/templates-seed.md +1096 -1096
  165. package/templates/skills/business-analyse/SKILL.md +327 -327
  166. package/templates/skills/business-analyse/_architecture.md +123 -123
  167. package/templates/skills/business-analyse/_elicitation.md +206 -206
  168. package/templates/skills/business-analyse/_module-loop.md +115 -115
  169. package/templates/skills/business-analyse/_shared.md +383 -383
  170. package/templates/skills/business-analyse/_suggestions.md +34 -34
  171. package/templates/skills/business-analyse/html/ba-interactive.html +4477 -4477
  172. package/templates/skills/business-analyse/html/build-html.js +77 -77
  173. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +150 -150
  174. package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +227 -227
  175. package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +199 -199
  176. package/templates/skills/business-analyse/html/src/scripts/04-render-modules.js +205 -205
  177. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +647 -647
  178. package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +195 -195
  179. package/templates/skills/business-analyse/html/src/scripts/07-render-handoff.js +92 -92
  180. package/templates/skills/business-analyse/html/src/scripts/08-editing.js +135 -135
  181. package/templates/skills/business-analyse/html/src/scripts/09-export.js +168 -168
  182. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +171 -171
  183. package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +166 -166
  184. package/templates/skills/business-analyse/html/src/styles/01-variables.css +38 -38
  185. package/templates/skills/business-analyse/html/src/styles/02-layout.css +101 -101
  186. package/templates/skills/business-analyse/html/src/styles/03-navigation.css +120 -120
  187. package/templates/skills/business-analyse/html/src/styles/04-cards.css +196 -196
  188. package/templates/skills/business-analyse/html/src/styles/05-modules.css +454 -454
  189. package/templates/skills/business-analyse/html/src/styles/06-wireframes.css +272 -272
  190. package/templates/skills/business-analyse/html/src/styles/07-comments.css +184 -184
  191. package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +241 -241
  192. package/templates/skills/business-analyse/html/src/template.html +516 -516
  193. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +546 -546
  194. package/templates/skills/business-analyse/questionnaire/00-application.md +160 -160
  195. package/templates/skills/business-analyse/questionnaire/00b-project.md +85 -85
  196. package/templates/skills/business-analyse/questionnaire/01-context.md +185 -185
  197. package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +189 -189
  198. package/templates/skills/business-analyse/questionnaire/03-scope.md +164 -164
  199. package/templates/skills/business-analyse/questionnaire/04-data.md +88 -88
  200. package/templates/skills/business-analyse/questionnaire/05-integrations.md +58 -58
  201. package/templates/skills/business-analyse/questionnaire/06-security.md +68 -68
  202. package/templates/skills/business-analyse/questionnaire/07-ui.md +76 -76
  203. package/templates/skills/business-analyse/questionnaire/08-performance.md +42 -42
  204. package/templates/skills/business-analyse/questionnaire/09-constraints.md +45 -45
  205. package/templates/skills/business-analyse/questionnaire/10-documentation.md +43 -43
  206. package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +59 -59
  207. package/templates/skills/business-analyse/questionnaire/12-migration.md +58 -58
  208. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +69 -69
  209. package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +135 -135
  210. package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +136 -136
  211. package/templates/skills/business-analyse/questionnaire.md +337 -337
  212. package/templates/skills/business-analyse/react/application-viewer.md +242 -242
  213. package/templates/skills/business-analyse/react/components.md +551 -551
  214. package/templates/skills/business-analyse/react/i18n-template.md +306 -306
  215. package/templates/skills/business-analyse/references/acceptance-criteria.md +169 -169
  216. package/templates/skills/business-analyse/references/agent-module-prompt.md +362 -362
  217. package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +557 -557
  218. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -190
  219. package/templates/skills/business-analyse/references/cache-warming-strategy.md +566 -566
  220. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -41
  221. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -74
  222. package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +115 -115
  223. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +68 -69
  224. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +85 -85
  225. package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -297
  226. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +107 -107
  227. package/templates/skills/business-analyse/references/deploy-data-build.md +180 -180
  228. package/templates/skills/business-analyse/references/deploy-modes.md +118 -118
  229. package/templates/skills/business-analyse/references/detection-strategies.md +424 -424
  230. package/templates/skills/business-analyse/references/entity-architecture-decision.md +218 -218
  231. package/templates/skills/business-analyse/references/handoff-file-templates.md +120 -120
  232. package/templates/skills/business-analyse/references/handoff-mappings.md +81 -81
  233. package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -312
  234. package/templates/skills/business-analyse/references/html-data-mapping.md +299 -299
  235. package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -65
  236. package/templates/skills/business-analyse/references/naming-conventions.md +243 -243
  237. package/templates/skills/business-analyse/references/prd-generation.md +258 -258
  238. package/templates/skills/business-analyse/references/review-data-mapping.md +363 -363
  239. package/templates/skills/business-analyse/references/robustness-checks.md +542 -542
  240. package/templates/skills/business-analyse/references/spec-auto-inference.md +111 -111
  241. package/templates/skills/business-analyse/references/team-orchestration.md +1022 -1022
  242. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -85
  243. package/templates/skills/business-analyse/references/ui-resource-cards.md +259 -259
  244. package/templates/skills/business-analyse/references/validate-incremental-html.md +121 -121
  245. package/templates/skills/business-analyse/references/validation-checklist.md +347 -347
  246. package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +335 -335
  247. package/templates/skills/business-analyse/schemas/application-schema.json +453 -453
  248. package/templates/skills/business-analyse/schemas/feature-schema.json +53 -53
  249. package/templates/skills/business-analyse/schemas/project-schema.json +485 -485
  250. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +201 -201
  251. package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +82 -82
  252. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +80 -80
  253. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +70 -70
  254. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +547 -547
  255. package/templates/skills/business-analyse/schemas/sections/validation-schema.json +93 -93
  256. package/templates/skills/business-analyse/schemas/shared/common-defs.json +226 -226
  257. package/templates/skills/business-analyse/steps/step-00-init.md +575 -576
  258. package/templates/skills/business-analyse/steps/step-01-cadrage.md +767 -767
  259. package/templates/skills/business-analyse/steps/step-01b-applications.md +419 -419
  260. package/templates/skills/business-analyse/steps/step-02-decomposition.md +387 -387
  261. package/templates/skills/business-analyse/steps/step-03a-data.md +16 -16
  262. package/templates/skills/business-analyse/steps/step-03a1-setup.md +506 -506
  263. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +252 -252
  264. package/templates/skills/business-analyse/steps/step-03b-ui.md +425 -425
  265. package/templates/skills/business-analyse/steps/step-03c-compile.md +611 -611
  266. package/templates/skills/business-analyse/steps/step-03d-validate.md +783 -783
  267. package/templates/skills/business-analyse/steps/step-04-consolidation.md +17 -17
  268. package/templates/skills/business-analyse/steps/step-04a-collect.md +415 -415
  269. package/templates/skills/business-analyse/steps/step-04b-analyze.md +163 -163
  270. package/templates/skills/business-analyse/steps/step-04c-decide.md +186 -186
  271. package/templates/skills/business-analyse/steps/step-05a-handoff.md +840 -840
  272. package/templates/skills/business-analyse/steps/step-05b-deploy.md +522 -522
  273. package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +703 -703
  274. package/templates/skills/business-analyse/steps/step-06-review.md +278 -278
  275. package/templates/skills/business-analyse/templates/tpl-frd.md +168 -168
  276. package/templates/skills/business-analyse/templates/tpl-handoff.md +186 -186
  277. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +59 -59
  278. package/templates/skills/business-analyse/templates/tpl-progress.md +172 -172
  279. package/templates/skills/business-analyse/templates-frd.md +476 -476
  280. package/templates/skills/business-analyse/templates-react.md +574 -574
  281. package/templates/skills/cc-agent/SKILL.md +129 -129
  282. package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -95
  283. package/templates/skills/cc-agent/references/agent-frontmatter.md +213 -213
  284. package/templates/skills/cc-agent/references/permission-modes.md +102 -102
  285. package/templates/skills/cc-agent/references/tools-reference.md +144 -144
  286. package/templates/skills/cc-agent/steps/step-00-init.md +134 -134
  287. package/templates/skills/cc-agent/steps/step-01-design.md +186 -186
  288. package/templates/skills/cc-agent/steps/step-02-generate.md +131 -131
  289. package/templates/skills/cc-agent/steps/step-03-validate.md +130 -130
  290. package/templates/skills/cc-agent/templates/agent-categorized.md +67 -67
  291. package/templates/skills/cc-agent/templates/agent-standalone.md +56 -56
  292. package/templates/skills/cc-agent/templates/agent-with-skills.md +94 -94
  293. package/templates/skills/cc-audit/SKILL.md +108 -108
  294. package/templates/skills/cc-audit/references/agent-checklist.md +91 -91
  295. package/templates/skills/cc-audit/references/hook-checklist.md +110 -110
  296. package/templates/skills/cc-audit/references/skill-checklist.md +70 -70
  297. package/templates/skills/cc-audit/steps/step-00-init.md +98 -98
  298. package/templates/skills/cc-audit/steps/step-01-scan.md +142 -142
  299. package/templates/skills/cc-audit/steps/step-02-analyze.md +158 -158
  300. package/templates/skills/cc-audit/steps/step-03-report.md +142 -142
  301. package/templates/skills/cc-skill/SKILL.md +134 -134
  302. package/templates/skills/cc-skill/references/best-practices.md +167 -167
  303. package/templates/skills/cc-skill/references/frontmatter-reference.md +182 -182
  304. package/templates/skills/cc-skill/references/skill-patterns.md +199 -199
  305. package/templates/skills/cc-skill/steps/step-00-init.md +119 -119
  306. package/templates/skills/cc-skill/steps/step-01-design.md +199 -199
  307. package/templates/skills/cc-skill/steps/step-02-generate.md +145 -145
  308. package/templates/skills/cc-skill/steps/step-03-steps.md +151 -151
  309. package/templates/skills/cc-skill/steps/step-04-validate.md +124 -124
  310. package/templates/skills/cc-skill/templates/skill-forked.md +85 -85
  311. package/templates/skills/cc-skill/templates/skill-progressive.md +102 -102
  312. package/templates/skills/cc-skill/templates/skill-simple.md +75 -75
  313. package/templates/skills/cc-skill/templates/step-template.md +82 -82
  314. package/templates/skills/check-version/SKILL.md +196 -196
  315. package/templates/skills/controller/SKILL.md +162 -162
  316. package/templates/skills/controller/postman-templates.md +614 -614
  317. package/templates/skills/controller/references/controller-code-templates.md +159 -159
  318. package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -209
  319. package/templates/skills/controller/references/permission-sync-templates.md +149 -149
  320. package/templates/skills/controller/steps/step-00-init.md +193 -191
  321. package/templates/skills/controller/steps/step-01-analyze.md +146 -146
  322. package/templates/skills/controller/steps/step-02-plan.md +176 -176
  323. package/templates/skills/controller/steps/step-03-generate.md +189 -189
  324. package/templates/skills/controller/steps/step-04-perms.md +80 -80
  325. package/templates/skills/controller/steps/step-05-validate.md +107 -107
  326. package/templates/skills/controller/templates.md +1555 -1555
  327. package/templates/skills/debug/SKILL.md +70 -70
  328. package/templates/skills/debug/references/team-protocol.md +232 -232
  329. package/templates/skills/debug/steps/step-00-init.md +57 -57
  330. package/templates/skills/debug/steps/step-01-analyze.md +219 -219
  331. package/templates/skills/debug/steps/step-02-resolve.md +85 -85
  332. package/templates/skills/documentation/SKILL.md +132 -132
  333. package/templates/skills/documentation/data-schema.md +227 -227
  334. package/templates/skills/documentation/steps/step-00-init.md +70 -70
  335. package/templates/skills/documentation/steps/step-01-scan.md +113 -113
  336. package/templates/skills/documentation/steps/step-02-generate.md +231 -231
  337. package/templates/skills/documentation/steps/step-03-validate.md +251 -238
  338. package/templates/skills/documentation/templates.md +662 -663
  339. package/templates/skills/efcore/SKILL.md +167 -167
  340. package/templates/skills/efcore/references/both-contexts.md +32 -32
  341. package/templates/skills/efcore/references/database-operations.md +67 -67
  342. package/templates/skills/efcore/references/destructive-operations.md +38 -38
  343. package/templates/skills/efcore/references/reset-operations.md +81 -81
  344. package/templates/skills/efcore/references/seed-methods.md +86 -86
  345. package/templates/skills/efcore/references/shared-init-functions.md +250 -250
  346. package/templates/skills/efcore/references/sql-objects-injection.md +61 -61
  347. package/templates/skills/efcore/references/troubleshooting.md +81 -81
  348. package/templates/skills/efcore/references/zero-downtime-patterns.md +227 -227
  349. package/templates/skills/efcore/steps/db/step-deploy.md +217 -217
  350. package/templates/skills/efcore/steps/db/step-reset.md +186 -186
  351. package/templates/skills/efcore/steps/db/step-seed.md +166 -166
  352. package/templates/skills/efcore/steps/db/step-status.md +173 -173
  353. package/templates/skills/efcore/steps/migration/step-00-init.md +102 -102
  354. package/templates/skills/efcore/steps/migration/step-01-check.md +164 -164
  355. package/templates/skills/efcore/steps/migration/step-02-create.md +160 -160
  356. package/templates/skills/efcore/steps/migration/step-03-validate.md +168 -168
  357. package/templates/skills/efcore/steps/rebase-snapshot/step-00-init.md +173 -173
  358. package/templates/skills/efcore/steps/rebase-snapshot/step-01-backup.md +100 -100
  359. package/templates/skills/efcore/steps/rebase-snapshot/step-02-fetch.md +115 -115
  360. package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +112 -112
  361. package/templates/skills/efcore/steps/rebase-snapshot/step-04-validate.md +157 -157
  362. package/templates/skills/efcore/steps/shared/step-00-init.md +131 -131
  363. package/templates/skills/efcore/steps/squash/step-00-init.md +141 -141
  364. package/templates/skills/efcore/steps/squash/step-01-backup.md +120 -120
  365. package/templates/skills/efcore/steps/squash/step-02-fetch.md +168 -168
  366. package/templates/skills/efcore/steps/squash/step-03-create.md +184 -184
  367. package/templates/skills/efcore/steps/squash/step-04-validate.md +174 -174
  368. package/templates/skills/explore/SKILL.md +98 -98
  369. package/templates/skills/feature-full/SKILL.md +111 -111
  370. package/templates/skills/feature-full/steps/step-00-init.md +57 -57
  371. package/templates/skills/feature-full/steps/step-01-implementation.md +120 -120
  372. package/templates/skills/gitflow/SKILL.md +377 -377
  373. package/templates/skills/gitflow/_shared.md +620 -620
  374. package/templates/skills/gitflow/phases/abort.md +189 -189
  375. package/templates/skills/gitflow/phases/cleanup.md +234 -234
  376. package/templates/skills/gitflow/phases/status.md +192 -192
  377. package/templates/skills/gitflow/references/commit-message-generation.md +58 -58
  378. package/templates/skills/gitflow/references/commit-migration-validation.md +49 -49
  379. package/templates/skills/gitflow/references/finish-cleanup.md +55 -55
  380. package/templates/skills/gitflow/references/finish-version-bumping.md +45 -45
  381. package/templates/skills/gitflow/references/init-config-template.md +135 -135
  382. package/templates/skills/gitflow/references/init-environment-detection.md +41 -41
  383. package/templates/skills/gitflow/references/init-name-normalization.md +103 -103
  384. package/templates/skills/gitflow/references/init-questions.md +185 -185
  385. package/templates/skills/gitflow/references/init-structure-creation.md +75 -75
  386. package/templates/skills/gitflow/references/init-version-detection.md +21 -21
  387. package/templates/skills/gitflow/references/init-workspace-detection.md +43 -43
  388. package/templates/skills/gitflow/references/merge-ci-status.md +36 -36
  389. package/templates/skills/gitflow/references/merge-execution.md +62 -62
  390. package/templates/skills/gitflow/references/merge-pr-context.md +76 -76
  391. package/templates/skills/gitflow/references/plan-template.md +69 -69
  392. package/templates/skills/gitflow/references/pr-build-checks.md +60 -60
  393. package/templates/skills/gitflow/references/pr-generation.md +58 -58
  394. package/templates/skills/gitflow/references/start-branch-normalization.md +28 -28
  395. package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -70
  396. package/templates/skills/gitflow/references/start-local-config.md +113 -113
  397. package/templates/skills/gitflow/references/start-worktree-creation.md +50 -50
  398. package/templates/skills/gitflow/references/sync-push-verify.md +44 -44
  399. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -38
  400. package/templates/skills/gitflow/steps/step-commit.md +199 -199
  401. package/templates/skills/gitflow/steps/step-finish.md +147 -147
  402. package/templates/skills/gitflow/steps/step-init.md +190 -190
  403. package/templates/skills/gitflow/steps/step-merge.md +85 -85
  404. package/templates/skills/gitflow/steps/step-plan.md +151 -151
  405. package/templates/skills/gitflow/steps/step-pr.md +199 -199
  406. package/templates/skills/gitflow/steps/step-start.md +195 -195
  407. package/templates/skills/gitflow/steps/step-sync.md +161 -161
  408. package/templates/skills/gitflow/templates/config.json +72 -72
  409. package/templates/skills/mcp/SKILL.md +62 -62
  410. package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -108
  411. package/templates/skills/mcp/steps/step-02-tools.md +73 -73
  412. package/templates/skills/notification/SKILL.md +173 -173
  413. package/templates/skills/quick-search/SKILL.md +99 -99
  414. package/templates/skills/ralph-loop/SKILL.md +234 -234
  415. package/templates/skills/ralph-loop/references/category-completeness.md +185 -185
  416. package/templates/skills/ralph-loop/references/category-rules.md +96 -96
  417. package/templates/skills/ralph-loop/references/compact-loop.md +300 -300
  418. package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -127
  419. package/templates/skills/ralph-loop/references/module-transition.md +151 -151
  420. package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -171
  421. package/templates/skills/ralph-loop/references/parallel-execution.md +246 -246
  422. package/templates/skills/ralph-loop/references/section-splitting.md +439 -439
  423. package/templates/skills/ralph-loop/references/task-transform-legacy.md +256 -256
  424. package/templates/skills/ralph-loop/references/team-orchestration.md +547 -547
  425. package/templates/skills/ralph-loop/steps/step-00-init.md +150 -150
  426. package/templates/skills/ralph-loop/steps/step-01-task.md +174 -174
  427. package/templates/skills/ralph-loop/steps/step-02-execute.md +177 -177
  428. package/templates/skills/ralph-loop/steps/step-03-commit.md +92 -92
  429. package/templates/skills/ralph-loop/steps/step-04-check.md +207 -207
  430. package/templates/skills/ralph-loop/steps/step-05-report.md +175 -175
  431. package/templates/skills/refactor/SKILL.md +56 -56
  432. package/templates/skills/refactor/steps/step-01-discover.md +60 -60
  433. package/templates/skills/refactor/steps/step-02-execute.md +67 -67
  434. package/templates/skills/review-code/SKILL.md +94 -94
  435. package/templates/skills/review-code/references/clean-code-principles.md +292 -292
  436. package/templates/skills/review-code/references/code-quality-metrics.md +174 -174
  437. package/templates/skills/review-code/references/feedback-patterns.md +149 -149
  438. package/templates/skills/review-code/references/owasp-api-top10.md +243 -243
  439. package/templates/skills/review-code/references/security-checklist.md +212 -212
  440. package/templates/skills/review-code/steps/step-01-smartstack.md +96 -96
  441. package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -80
  442. package/templates/skills/review-code/steps/step-03-react.md +44 -44
  443. package/templates/skills/ui-components/SKILL.md +137 -137
  444. package/templates/skills/ui-components/accessibility.md +170 -170
  445. package/templates/skills/ui-components/patterns/dashboard-chart.md +327 -327
  446. package/templates/skills/ui-components/patterns/data-table.md +39 -39
  447. package/templates/skills/ui-components/patterns/entity-card.md +77 -77
  448. package/templates/skills/ui-components/patterns/grid-layout.md +91 -91
  449. package/templates/skills/ui-components/patterns/kanban.md +43 -43
  450. package/templates/skills/ui-components/responsive-guidelines.md +278 -278
  451. package/templates/skills/ui-components/style-guide.md +113 -113
  452. package/templates/skills/utils/SKILL.md +44 -44
  453. package/templates/skills/utils/subcommands/test-web-config.md +152 -152
  454. package/templates/skills/utils/subcommands/test-web.md +123 -123
  455. package/templates/skills/validate/SKILL.md +181 -181
  456. package/templates/skills/validate-feature/SKILL.md +101 -101
  457. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
  458. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
  459. package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
  460. package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
  461. package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
  462. package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
  463. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
  464. package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
  465. package/templates/skills/workflow/SKILL.md +127 -127
  466. package/templates/skills/workflow/steps/step-00-init.md +57 -57
  467. package/templates/skills/workflow/steps/step-01-implementation.md +84 -84
  468. package/templates/test-web/api-health.json +38 -38
  469. package/templates/test-web/minimal.json +19 -19
  470. package/templates/test-web/npm-package.json +46 -46
  471. 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`