@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,611 +1,611 @@
1
- ---
2
- name: step-03c-compile
3
- description: Module specification compilation - actors, use cases, FRs, permissions, navigation, seed data, Gherkin, i18n
4
- model: opus
5
- next_step: steps/step-03d-validate.md
6
- ---
7
-
8
- > **Context files:** `_shared.md` | `_module-loop.md`
9
-
10
- # Step 3c: Specification Compilation
11
-
12
- ## MANDATORY EXECUTION RULES
13
-
14
- - ALWAYS use ULTRATHINK mode
15
- - This step COMPILES the specification from the interactive phase (step-03a) into feature.json
16
- - ALWAYS validate specification completeness before writing
17
- - ALL communication in `{language}`
18
- - NEVER skip per-module validation
19
- - **ID NAMING RULE (MANDATORY, NO EXCEPTION):**
20
- All IDs MUST include a module prefix to guarantee application-wide uniqueness.
21
- The prefix is derived from the module code initials (2-4 chars):
22
- UserManagement → UM | VehicleManagement → VM | PartsInventory → PI
23
- RepairManagement → RM | MaintenanceSchedule → MS | DataSync → DS
24
- Notifications → NT | Dashboard → DB | Orders → OR | Customers → CU
25
-
26
- Patterns:
27
- UC-{PREFIX}-{NNN} → UC-RM-001, UC-PI-003
28
- BR-{CAT}-{PREFIX}-{NNN} → BR-VAL-RM-001, BR-CALC-PI-002
29
- FR-{PREFIX}-{NNN} → FR-RM-001
30
- OBJ-{PREFIX}-{NNN} → OBJ-RM-001
31
- AC-{PREFIX}-{NNN} → AC-RM-001
32
- RISK-{PREFIX}-{NNN} → RISK-RM-001
33
-
34
- NEVER use bare IDs (UC-001, BR-VAL-001) in multi-module mode.
35
- - **SCHEMA CONFORMITY RULE:**
36
- ALL data MUST fit within the defined feature-schema.json structure.
37
- NEVER create custom top-level fields (KPIDefinitions, ChartConfigurations, etc.)
38
- Dashboard modules MUST use specification.dashboards[] (it exists in the schema).
39
- If truly needed, use specification.extensions: {} (additionalProperties: true).
40
-
41
- ## YOUR TASK
42
-
43
- Compile all data collected in step-03a (data) and step-03b (UI) into the module specification: generate actors, use cases, functional requirements, permission matrix, navigation, seed data, Gherkin scenarios, validations, messages, lifecycle, API endpoints, and i18n keys.
44
-
45
- ---
46
-
47
- ### 8. Full Specification
48
-
49
- Generate the complete specification for this module. **Each subsection below includes a STRUCTURE CARD showing the EXACT JSON format. Follow them precisely.**
50
-
51
- > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions and type inference guidance.
52
-
53
- #### ENTITY ATTRIBUTE SCHEMA (MANDATORY — applies to ALL entities in section 6b of step-03a)
54
-
55
- > **CRITICAL:** Entity attributes MUST use STRUCTURED properties, not free-text validation strings.
56
- > The ralph-loop needs parseable types to generate correct C# code.
57
-
58
- **MANDATORY fields:** `name`, `type`
59
- **type values:** `string`, `int`, `long`, `decimal`, `double`, `bool`, `DateTime`, `DateOnly`, `TimeOnly`, `Guid`, `enum:{EnumName}`, `byte[]`
60
-
61
- The reference includes:
62
- - Detailed STRUCTURE CARD for entity attributes (with FK examples)
63
- - Type inference priority table for auto-fixing missing types
64
- - BaseEntity inheritance rules (tenantId, createdAt, updatedAt, createdBy, updatedBy)
65
-
66
- #### ENTITY ATTRIBUTE FORMAT POST-CHECK (BLOCKING — runs for EVERY module including the first)
67
-
68
- > **CRITICAL:** This check ensures EVERY entity attribute has a structured `type` field.
69
- > It runs for ALL modules, not just modules 2+. The first module is NOT exempt.
70
- > Without `type`, ralph-loop cannot generate correct C# properties, EF configurations, or validators.
71
-
72
- **Reference:** Load `references/compilation-structure-cards.md` § "Type Inference Priority Table" for the complete auto-fix logic and inference patterns.
73
-
74
- After compiling entities for this module:
75
- 1. Verify every entity attribute has a `type` field (not free-text only)
76
- 2. Apply auto-fix logic (infer from validation string or attribute name patterns)
77
- 3. Normalize free-text validation into structured maxLength/validation properties
78
- 4. Ensure required defaults to true if absent
79
-
80
- ---
81
-
82
- #### 8a-8l. Specification Structure Cards
83
-
84
- > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions.
85
-
86
- The reference includes detailed JSON templates for:
87
- - **8a. Actors** — role and permissions mapping
88
- - **8b. Use Cases** — UC-{PREFIX}-NNN format with scenarios
89
- - **8c. Functional Requirements** — FR-{PREFIX}-NNN format
90
- - **8d. Permission Matrix** — role assignments and paths
91
- - **8e. Navigation** — module, sections, and resources
92
- - **8f. SeedData Core** — 9 mandatory arrays
93
- - **8g. Gherkin Scenarios** — BDD format (MUST be array)
94
- - **8h. Validations** — field rules and error keys
95
- - **8i. Messages** — success/error/warning/info types
96
- - **8j. Entity Lifecycle** — state machines
97
- - **8k. API Endpoints** — RESTful routes
98
- - **8l. i18n Keys** — 4 languages (fr, en, it, de)
99
-
100
- #### 8b. Use Cases (UC-{PREFIX}-NNN)
101
-
102
- Per section: list, create, read, update, delete, approve, etc.
103
-
104
- > **STRUCTURE CARD: specification.useCases[]**
105
- > ```json
106
- > {
107
- > "id": "UC-{PREFIX}-001",
108
- > "name": "Create Order",
109
- > "primaryActor": "Sales Representative",
110
- > "permission": "{app}.{module}.create",
111
- > "preconditions": ["Customer exists", "Products in stock"],
112
- > "postconditions": ["Order created with Draft status"],
113
- > "mainScenario": [
114
- > "1. User navigates to creation form",
115
- > "2. User fills in required fields",
116
- > "3. System validates data (BR-VAL-{PREFIX}-001)",
117
- > "4. System creates the record",
118
- > "5. System displays confirmation"
119
- > ],
120
- > "alternativeScenarios": [
121
- > { "name": "Validation failure", "steps": ["1. System detects invalid data", "2. System highlights errors"] }
122
- > ],
123
- > "errorScenarios": [
124
- > { "name": "Server error", "steps": ["1. System shows error message", "2. Data preserved for retry"] }
125
- > ],
126
- > "linkedRules": ["BR-VAL-{PREFIX}-001", "BR-WF-{PREFIX}-002"]
127
- > }
128
- > ```
129
- > **MANDATORY fields:** `id`, `name`, `primaryActor`, `permission`, `mainScenario`, `linkedRules`
130
- > **FORBIDDEN fields:** Do NOT use `actor` (use `primaryActor`), `linkedBRs` (use `linkedRules`), `linkedFRs` (not in UC, FRs link to UCs instead)
131
-
132
- #### 8c. Functional Requirements (FR-{PREFIX}-NNN)
133
-
134
- Linked to BRs and UCs.
135
-
136
- > **STRUCTURE CARD: specification.functionalRequirements[]**
137
- > ```json
138
- > {
139
- > "id": "FR-{PREFIX}-001",
140
- > "statement": "System MUST validate customer budget before order creation",
141
- > "priority": "must|should|could",
142
- > "linkedRules": ["BR-VAL-{PREFIX}-001"],
143
- > "linkedUseCases": ["UC-{PREFIX}-001"],
144
- > "acceptanceCriteria": [
145
- > "Order rejected if total > budget",
146
- > "Error message displayed with remaining budget"
147
- > ]
148
- > }
149
- > ```
150
- > **MANDATORY fields:** `id`, `statement`, `priority`, `linkedUseCases`
151
- > **FORBIDDEN fields:** Do NOT use `name`/`description` (use `statement` with System MUST/SHOULD/COULD format), `linkedUCs` (use `linkedUseCases`), `linkedBRs` (use `linkedRules`)
152
-
153
- #### 8d. Permission Matrix
154
-
155
- Roles × resources × operations with full paths.
156
-
157
- > **STRUCTURE CARD: specification.permissionMatrix**
158
- > ```json
159
- > {
160
- > "permissions": [
161
- > { "path": "{app}.{module}.read", "action": "read", "description": "View records" },
162
- > { "path": "{app}.{module}.create", "action": "create", "description": "Create new records" },
163
- > { "path": "{app}.{module}.update", "action": "update", "description": "Update existing records" },
164
- > { "path": "{app}.{module}.delete", "action": "delete", "description": "Delete records" },
165
- > { "path": "{app}.{module}.export", "action": "export", "description": "Export data" },
166
- > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View dashboard (section-level)" }
167
- > ],
168
- > "roleAssignments": [
169
- > { "role": "{App} Admin", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.delete", "{app}.{module}.export", "{app}.{module}.dashboard.read"] },
170
- > { "role": "{App} Manager", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.dashboard.read"] },
171
- > { "role": "{App} Viewer", "permissions": ["{app}.{module}.read"] }
172
- > ]
173
- > }
174
- > ```
175
- > **STRUCTURE:** Object with 2 arrays: `permissions[]` and `roleAssignments[]`
176
- > **Permission levels:** Module-level = `{app}.{module}.{action}` (3 segments). Section-level = `{app}.{module}.{section}.{action}` (4 segments, for sections needing distinct access like dashboard, approve, import).
177
- > **FORBIDDEN:** Do NOT use a flat array with `resource`/`roles` fields. Always use the nested structure above.
178
-
179
- #### 8e. Navigation
180
-
181
- Module → Sections → Resources (levels 2-3-4 of the hierarchy).
182
-
183
- > **STRUCTURE CARD: specification.navigation**
184
- > ```json
185
- > {
186
- > "entries": [
187
- > { "level": "module", "code": "{module}", "labels": {"fr": "...", "en": "...", "it": "...", "de": "..."}, "route": "/{app}/{module}", "icon": "list" },
188
- > { "level": "section", "code": "list", "labels": {"fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste"}, "route": "/{app}/{module}", "icon": "list" },
189
- > { "level": "section", "code": "dashboard", "labels": {"fr": "Tableau de bord", "en": "Dashboard", "it": "Cruscotto", "de": "Dashboard"}, "route": "/{app}/{module}/dashboard", "icon": "chart-bar", "isNew": true }
190
- > ]
191
- > }
192
- > ```
193
-
194
- #### 8e-POST-CHECK: Navigation Enforcement (BLOCKING)
195
-
196
- > **CRITICAL:** `specification.navigation.entries[]` is MANDATORY. If absent, auto-generate from sections.
197
-
198
- ```javascript
199
- const nav = specification.navigation;
200
- if (!nav || !nav.entries || nav.entries.length === 0) {
201
- console.warn('AUTO-FIX: navigation.entries is empty — generating from sections');
202
- const sections = specification.sections || [];
203
- const entries = [
204
- { level: "module", code: "{module}", labels: {fr: "{ModuleName}", en: "{ModuleName}", it: "{ModuleName}", de: "{ModuleName}"}, route: "/{app}/{module}", icon: "list" }
205
- ];
206
- for (const section of sections) {
207
- entries.push({
208
- level: "section",
209
- code: section.code,
210
- labels: {fr: section.name || section.code, en: section.name || section.code, it: section.name || section.code, de: section.name || section.code},
211
- route: section.route || `/{app}/{module}/${section.code}`,
212
- icon: section.icon || "file-text"
213
- });
214
- }
215
- specification.navigation = { entries };
216
- }
217
- // Verify ALL entries have 4 languages
218
- for (const entry of specification.navigation.entries) {
219
- for (const lang of ['fr', 'en', 'it', 'de']) {
220
- if (!entry.labels[lang]) {
221
- entry.labels[lang] = entry.labels['en'] || entry.labels['fr'] || entry.code;
222
- console.warn(`AUTO-FIX: navigation entry "${entry.code}" missing ${lang} label — copied from fallback`);
223
- }
224
- }
225
- }
226
- ```
227
-
228
- #### 8f. SeedData Core
229
-
230
- 9 MANDATORY typed arrays — each with structured objects, NOT flat strings or objects.
231
-
232
- > **STRUCTURE CARD: specification.seedDataCore**
233
- > ```json
234
- > {
235
- > "navigationApplications": [
236
- > { "code": "{app}", "label": "{Application Name}", "icon": "{icon}", "route": "/{app-kebab}", "sort": 1 }
237
- > ],
238
- > "applicationRoles": [
239
- > { "code": "admin", "name": "{App} Admin", "permissions": "*" },
240
- > { "code": "manager", "name": "{App} Manager", "permissions": "CRU" },
241
- > { "code": "contributor", "name": "{App} Contributor", "permissions": "CR" },
242
- > { "code": "viewer", "name": "{App} Viewer", "permissions": "R" }
243
- > ],
244
- > "navigationModules": [
245
- > { "code": "{module}", "label": "{Module Name}", "icon": "list", "route": "/{app}/{module}", "parentCode": "{app}", "sort": 1 }
246
- > ],
247
- > "navigationSections": [
248
- > { "code": "list", "label": "Liste", "icon": "List", "route": "/{app}/{module}", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 1 },
249
- > { "code": "detail", "label": "Détail", "icon": "FileText", "route": "/{app}/{module}/:id", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 2, "navigation": "hidden" },
250
- > { "code": "dashboard", "label": "Dashboard", "icon": "BarChart", "route": "/{app}/{module}/dashboard", "parentCode": "{module}", "permission": "{app}.{module}.dashboard.read", "sort": 3 }
251
- > ],
252
- > "navigationResources": [
253
- > { "code": "{module}-grid", "type": "SmartTable", "entity": "{Entity}", "parentCode": "list", "permission": "{app}.{module}.read" },
254
- > { "code": "{module}-detail-card", "type": "DetailCard", "entity": "{Entity}", "parentCode": "detail", "permission": "{app}.{module}.read" }
255
- > ],
256
- > "navigationTranslations": [
257
- > { "moduleCode": "{module}", "language": "fr", "label": "..." },
258
- > { "moduleCode": "{module}", "language": "en", "label": "..." },
259
- > { "moduleCode": "{module}", "language": "it", "label": "..." },
260
- > { "moduleCode": "{module}", "language": "de", "label": "..." }
261
- > ],
262
- > "permissions": [
263
- > { "path": "{app}.{module}.read", "action": "read", "description": "View {module}" },
264
- > { "path": "{app}.{module}.create", "action": "create", "description": "Create {module}" },
265
- > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View {module} dashboard (section-level)" }
266
- > ],
267
- > "rolePermissions": [
268
- > { "role": "{App} Admin", "permissionPath": "{app}.{module}.*" },
269
- > { "role": "{App} Manager", "permissionPath": "{app}.{module}.read" }
270
- > ],
271
- > "permissionConstants": [
272
- > { "constantName": "{Module}Read", "path": "{app}.{module}.read" },
273
- > { "constantName": "{Module}Create", "path": "{app}.{module}.create" }
274
- > ]
275
- > }
276
- > ```
277
- > **MANDATORY:** All 9 arrays must be present. Each element must be an object, NOT a string.
278
- > **NOTE:** `navigationApplications` and `applicationRoles` are populated from the application identity confirmed in step-01b. They are written ONCE for the first module processed and remain empty `[]` for subsequent modules.
279
- > **CRITICAL:** `navigationSections` and `navigationResources` are DERIVED from `specification.sections[]` — use the transform algorithm below (section 8f-bis).
280
- > **IMPORTANT:** `create` and `edit` are NEVER sections — they are action pages reached via buttons. Do NOT include them in `navigationSections`. Only include actual sidebar sections (list, dashboard, approve, import, etc.) and hidden route sections (detail).
281
- > **FORBIDDEN:** Do NOT use `navigationModule` (singular string), `permissions` as flat string array, `rolePermissions` as flat object, `permissionsConstants` as comma-separated string.
282
- >
283
- > **FORBIDDEN in navigation routes:**
284
- > - `/{app}/{module}/list` → use `/{app}/{module}` (list IS the module route)
285
- > - `/{app}/{module}/detail/:id` → use `/{app}/{module}/:id`
286
- > - Navigation routes must match React Router paths exactly
287
-
288
- #### 8f-bis. Transform Sections into Navigation SeedData
289
-
290
- > **CRITICAL:** `navigationSections` and `navigationResources` must be generated from `specification.sections[]`.
291
- > This ensures the navigation hierarchy (Module → Section → Resource) is complete in the database.
292
-
293
- **Transform algorithm:**
294
-
295
- ```javascript
296
- // 1. Transform specification.sections[] into navigationSections
297
- const navigationSections = specification.sections.map((section, index) => ({
298
- code: section.code, // e.g., "list", "detail", "dashboard"
299
- label: section.labels.fr, // Default language (fr)
300
- icon: section.icon, // Lucide icon name
301
- route: section.route, // Full route path
302
- parentCode: metadata.module, // Module code (parent)
303
- permission: section.permission, // Required permission
304
- sort: index + 1 // Display order (1-based)
305
- }));
306
-
307
- // 2. Transform specification.sections[].resources[] into navigationResources
308
- const navigationResources = specification.sections.flatMap(section =>
309
- section.resources.map(resource => ({
310
- code: resource.code, // e.g., "employees-grid"
311
- type: resource.type, // e.g., "SmartTable", "SmartForm"
312
- entity: resource.entity, // e.g., "Employee"
313
- parentCode: section.code, // Section code (parent)
314
- permission: resource.permission // Optional (can inherit from section)
315
- }))
316
- );
317
- ```
318
-
319
- **Write seedDataCore to specification:**
320
-
321
- ```
322
- ba-writer.enrichSection({
323
- feature_id,
324
- section: "specification",
325
- data: {
326
- seedDataCore: {
327
- navigationApplications: [ ... ], // FROM step-01b identity (only for first module, else [])
328
- applicationRoles: [ ... ], // FROM cadrage.applicationRoles (only for first module, else [])
329
- navigationModules: [ ... ],
330
- navigationSections: navigationSections, // DERIVED
331
- navigationResources: navigationResources, // DERIVED
332
- navigationTranslations: [ ... ],
333
- permissions: [ ... ],
334
- rolePermissions: [ ... ],
335
- permissionConstants: [ ... ]
336
- }
337
- }
338
- })
339
- ```
340
-
341
- > **NOTE:** This step writes ONLY seedDataCore. The FULL specification write (actors, useCases, wireframes, sections, etc.) happens in step-03d section 11.
342
- > ALL data from 8a-8l MUST be carried forward to step-03d. Do NOT discard in-memory data.
343
-
344
- **Validation:**
345
-
346
- - EVERY section in `specification.sections[]` MUST appear in `navigationSections`
347
- - EVERY resource in `specification.sections[].resources[]` MUST appear in `navigationResources`
348
- - Total count: `navigationSections.length === specification.sections.length`
349
- - Total count: `navigationResources.length === sum(sections[].resources.length)`
350
-
351
- #### 8g. Gherkin Scenarios
352
-
353
- BDD acceptance tests per UC.
354
-
355
- > **STRUCTURE CARD: specification.gherkinScenarios[]**
356
- > ```json
357
- > {
358
- > "feature": "{Module} Management",
359
- > "scenarios": [
360
- > {
361
- > "name": "Create a new record with valid data",
362
- > "tags": ["@{module}", "@create", "@smoke"],
363
- > "given": ["An authenticated user with role Manager", "No existing record with code 'TEST-001'"],
364
- > "when": ["The user fills the creation form", "The user submits the form"],
365
- > "then": ["The record is created with Draft status", "A success message is displayed"]
366
- > }
367
- > ]
368
- > }
369
- > ```
370
- > **STRUCTURE:** MUST be an ARRAY of objects (NOT a single object). Each object has `feature` string + `scenarios[]` array. Each scenario has `given`, `when`, `then` as ARRAYS of strings.
371
- > **FORBIDDEN:** Do NOT use flat arrays of `{uc, scenario, given, when, then}` where given/when/then are single strings.
372
- > **FORBIDDEN:** Do NOT use a single object `{feature, scenarios}` — MUST be an ARRAY `[{feature, scenarios}]` even with one feature.
373
-
374
- #### 8h. Validations
375
-
376
- Field validation rules per entity.
377
-
378
- > **STRUCTURE CARD: specification.validations[]**
379
- > ```json
380
- > {
381
- > "entity": "Order",
382
- > "field": "amount",
383
- > "rules": ["required", "decimal", "min:0.01", "max:999999.99"],
384
- > "errorMessageKey": "validation.{module}.amount.invalid"
385
- > }
386
- > ```
387
- > **MANDATORY fields:** `entity`, `field`, `rules` (array), `errorMessageKey`
388
- > **FORBIDDEN fields:** Do NOT use `rule` (singular string) or `message` (use `errorMessageKey`).
389
-
390
- #### 8i. Business Messages
391
-
392
- Minimum 4: success, error CRUD, error validation, error permission.
393
-
394
- > **STRUCTURE CARD: specification.messages[]**
395
- > ```json
396
- > {
397
- > "code": "{MODULE}-SUCCESS-CREATE",
398
- > "type": "success|error|warning|info",
399
- > "title": "Record Created",
400
- > "message": "The record {code} has been created successfully.",
401
- > "i18nKey": "message.{module}.created"
402
- > }
403
- > ```
404
- > **MANDATORY fields:** `code`, `type`, `message`, `i18nKey`
405
- > **FORBIDDEN:** Do NOT omit `title` or `i18nKey`. Every message MUST have an i18n key.
406
-
407
- #### 8j. Entity Lifecycle
408
-
409
- State machines for entities with status/state.
410
- **Note:** If depth = full and 3a-state was executed, lifeCycles are already defined. Verify completeness and add any missing states/transitions.
411
-
412
- > **STRUCTURE CARD: specification.lifeCycles[]**
413
- > ```json
414
- > {
415
- > "entity": "Order",
416
- > "field": "status",
417
- > "initialState": "draft",
418
- > "states": [
419
- > { "id": "draft", "displayName": "Brouillon", "color": "gray", "allowedTransitions": ["submitted"], "isTerminal": false },
420
- > { "id": "submitted", "displayName": "Soumis", "color": "blue", "allowedTransitions": ["approved", "rejected"], "isTerminal": false },
421
- > { "id": "approved", "displayName": "Approuvé", "color": "green", "allowedTransitions": ["archived"], "isTerminal": false },
422
- > { "id": "rejected", "displayName": "Rejeté", "color": "red", "allowedTransitions": [], "isTerminal": true },
423
- > { "id": "archived", "displayName": "Archivé", "color": "purple", "allowedTransitions": [], "isTerminal": true }
424
- > ],
425
- > "transitions": [
426
- > {
427
- > "from": "draft", "to": "submitted", "action": "submit",
428
- > "label": { "fr": "Soumettre", "en": "Submit" },
429
- > "permission": "{app}.{module}.update",
430
- > "guards": ["BR-VAL-{PREFIX}-001"],
431
- > "effects": [{ "type": "notification", "target": "role:manager", "template": "{module}-submitted" }],
432
- > "confirm": true
433
- > }
434
- > ]
435
- > }
436
- > ```
437
- > **MANDATORY:** `states` MUST be an array of OBJECTS with `id`, `displayName`, `color`, `allowedTransitions`, `isTerminal`. NEVER use flat string arrays.
438
- > **Colors:** gray (draft/new), blue (in-progress), green (active/approved), yellow (warning/pending), orange (review), red (error/rejected), purple (archived/terminal)
439
- > **FORBIDDEN:** Do NOT use `states: ["Active", "Inactive"]` (flat strings), `terminalStates` (use `isTerminal: true` on each state).
440
-
441
- #### 8k. API Endpoints
442
-
443
- RESTful routes following SmartStack patterns.
444
-
445
- > **STRUCTURE CARD: specification.apiEndpoints[]**
446
- > ```json
447
- > {
448
- > "method": "GET|POST|PUT|PATCH|DELETE",
449
- > "path": "/api/{app}/{module}",
450
- > "permission": "{app}.{module}.read",
451
- > "requestDto": "Get{Module}Query",
452
- > "responseDto": "{Module}Dto[]",
453
- > "description": "List all records with pagination and filters"
454
- > }
455
- > ```
456
- > **MANDATORY fields:** `method`, `path`, `permission`, `description`
457
- > **Recommended:** Include `requestDto` and `responseDto` for implementation clarity.
458
-
459
- #### 8l. i18n Keys
460
-
461
- Translation keys for all UI text (4 languages: fr, en, it, de).
462
-
463
- > **STRUCTURE CARD: specification.i18nKeys**
464
- > **CRITICAL:** ALL leaf translation keys MUST have 4 languages (fr, en, it, de). IT/DE can use shorter translations but MUST exist.
465
- > ```json
466
- > {
467
- > "title": { "fr": "{Module}", "en": "{Module}", "it": "{Module}", "de": "{Module}" },
468
- > "list": {
469
- > "title": { "fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste" },
470
- > "empty": { "fr": "Aucun enregistrement", "en": "No records", "it": "Nessun record", "de": "Keine Einträge" }
471
- > },
472
- > "create": { "title": { "fr": "Nouveau", "en": "New", "it": "Nuovo", "de": "Neu" } },
473
- > "detail": { "title": { "fr": "Détail", "en": "Detail", "it": "Dettaglio", "de": "Detail" } },
474
- > "buttons": {
475
- > "create": { "fr": "Créer", "en": "Create", "it": "Crea", "de": "Erstellen" },
476
- > "edit": { "fr": "Modifier", "en": "Edit", "it": "Modifica", "de": "Bearbeiten" },
477
- > "delete": { "fr": "Supprimer", "en": "Delete", "it": "Elimina", "de": "Löschen" },
478
- > "save": { "fr": "Enregistrer", "en": "Save", "it": "Salva", "de": "Speichern" },
479
- > "cancel": { "fr": "Annuler", "en": "Cancel", "it": "Annulla", "de": "Abbrechen" }
480
- > },
481
- > "validation": {
482
- > "required": { "fr": "Ce champ est requis", "en": "This field is required", "it": "Campo obbligatorio", "de": "Pflichtfeld" }
483
- > }
484
- > }
485
- > ```
486
-
487
- #### 8l-POST-CHECK: i18n 4 Languages Enforcement (BLOCKING)
488
-
489
- > **CRITICAL:** i18n keys with missing IT/DE translations are a recurring issue.
490
- > This POST-CHECK walks ALL leaf keys and auto-fills missing translations.
491
-
492
- ```javascript
493
- const i18n = specification.i18nKeys || {};
494
- const REQUIRED_LANGS = ['fr', 'en', 'it', 'de'];
495
- let missingCount = 0;
496
-
497
- function walkI18n(obj, path) {
498
- if (typeof obj !== 'object' || obj === null) return;
499
- // Leaf node: has at least 'fr' or 'en' as direct string properties
500
- const hasLangKey = REQUIRED_LANGS.some(l => typeof obj[l] === 'string');
501
- if (hasLangKey) {
502
- for (const lang of REQUIRED_LANGS) {
503
- if (!obj[lang] || typeof obj[lang] !== 'string') {
504
- // Fallback: copy from en > fr > first available
505
- obj[lang] = obj['en'] || obj['fr'] || Object.values(obj).find(v => typeof v === 'string') || path;
506
- missingCount++;
507
- }
508
- }
509
- } else {
510
- // Branch node: recurse
511
- for (const key of Object.keys(obj)) {
512
- walkI18n(obj[key], `${path}.${key}`);
513
- }
514
- }
515
- }
516
- walkI18n(i18n, 'i18nKeys');
517
- if (missingCount > 0) {
518
- console.warn(`AUTO-FIX: filled ${missingCount} missing i18n translations (IT/DE fallbacks from EN/FR)`);
519
- }
520
- ```
521
-
522
- ---
523
-
524
- ## SELF-VERIFICATION (MANDATORY before loading next step)
525
-
526
- Before loading step-03d-validate, verify all 12 subsections (8a-8l) are populated:
527
-
528
- 1. **8a. Actors** - At least 2 roles with permissions
529
- 2. **8b. Use Cases** - At least 2 UCs with complete structure
530
- 3. **8c. Functional Requirements** - At least 4 FRs with linked UCs and BRs
531
- 4. **8d. Permission Matrix** - Resources and role assignments defined
532
- 5. **8e. Navigation** - Module, sections, and resource routes specified
533
- 6. **8f. SeedData Core** - All 7 arrays populated with structured objects (navigationModules, navigationSections, navigationResources, navigationTranslations, permissions, rolePermissions, permissionConstants)
534
- 7. **8g. Gherkin Scenarios** - BDD scenarios for each major UC
535
- 8. **8h. Validations** - Field rules with error message keys
536
- 9. **8i. Business Messages** - Minimum 4 messages (success, error CRUD, validation, permission)
537
- 10. **8j. Entity Lifecycle** - State machines with transitions if entity has status
538
- 11. **8k. API Endpoints** - RESTful routes with permissions
539
- 12. **8l. i18n Keys** - Translation keys in 4 languages (fr, en, it, de)
540
-
541
- 13. **Wireframes present** — `(specification.uiWireframes || specification.wireframes || []).length >= 1` (BLOCKING)
542
- Quick check: the wireframe data from step-03b MUST still be in memory OR persisted to feature.json
543
-
544
- 14. **Wireframes create/edit** — For each data-centric section with a create form, a wireframe `{section}-create` MUST exist (BLOCKING).
545
- For each modifiable entity, a wireframe `{section}-edit` SHOULD exist (WARNING if absent).
546
- Create/edit wireframes are action-page wireframes — they are NOT separate navigation sections.
547
- They describe the full-page form layout (fields, validation, submit/cancel buttons).
548
- (step-03b now writes wireframes intermediately). If wireframes are empty:
549
- - First, re-read the module feature.json to check if step-03b wrote them
550
- - If present in file but not in memory → load them from file
551
- - If absent everywhere → **STOP** and reload step-03b to regenerate wireframes
552
-
553
- **IF any subsection is missing → STOP and request the missing data before proceeding.**
554
-
555
- **ABSOLUTE FORMAT CHECKS (apply to ALL modules, including the first):**
556
-
557
- > These checks validate against the canonical schema — NOT comparatively against another module.
558
- > They run BEFORE the SCHEMA UNIFORMITY comparative check, ensuring the first module has the
559
- > correct format before being used as baseline for subsequent modules.
560
-
561
- ```javascript
562
- // Gherkin MUST be array (not single object)
563
- if (!Array.isArray(specification.gherkinScenarios)) {
564
- console.warn('AUTO-FIX: gherkinScenarios is object, wrapping in array');
565
- specification.gherkinScenarios = [specification.gherkinScenarios];
566
- }
567
-
568
- // Validations[].rules MUST be array (not singular rule string)
569
- for (const v of specification.validations || []) {
570
- if (typeof v.rules === 'string') { v.rules = [v.rules]; }
571
- if (v.rule && !v.rules) {
572
- v.rules = Array.isArray(v.rule) ? v.rule : [v.rule];
573
- delete v.rule;
574
- }
575
- }
576
-
577
- // Messages MUST have "message" field (not only "description")
578
- for (const m of specification.messages || []) {
579
- if (!m.message && m.description) { m.message = m.description; }
580
- }
581
-
582
- // Wireframes MUST use canonical field names
583
- const wireframes = specification.uiWireframes || specification.wireframes || [];
584
- for (const wf of wireframes) {
585
- if (wf.title && !wf.screen) { wf.screen = wf.title; delete wf.title; }
586
- if (wf.ascii && !wf.mockup) { wf.mockup = wf.ascii; delete wf.ascii; }
587
- if (wf.content && !wf.mockup) { wf.mockup = wf.content; delete wf.content; }
588
- if (wf.name && !wf.screen) { wf.screen = wf.name; delete wf.name; }
589
- }
590
- specification.uiWireframes = wireframes;
591
-
592
- // Entity attributes MUST have "type" field (already checked in ENTITY ATTRIBUTE FORMAT POST-CHECK above)
593
- ```
594
-
595
- **SCHEMA UNIFORMITY CHECK (multi-module mode):**
596
- IF this is NOT the first module in moduleOrder:
597
- Compare THIS module's specification structure against the FIRST specified module:
598
- - `gherkinScenarios` MUST be array (not object) in ALL modules
599
- - `validations[].rules` MUST be array (not singular `rule`) in ALL modules
600
- - `messages[]` MUST have `message` field in ALL modules
601
- - `specification.apiEndpoints[]` MUST be present in ALL modules
602
- - `specification.i18nKeys` MUST be present in ALL modules
603
- - `analysis.entities[].attributes[].type` MUST be present on ALL attributes in ALL modules
604
- - IF first module has free-text-only attributes without `type` field → AUTO-FIX with type inference
605
- IF any structural divergence detected → AUTO-FIX to match the canonical format before proceeding.
606
-
607
- ---
608
-
609
- ## NEXT STEP
610
-
611
- Load: `steps/step-03d-validate.md`
1
+ ---
2
+ name: step-03c-compile
3
+ description: Module specification compilation - actors, use cases, FRs, permissions, navigation, seed data, Gherkin, i18n
4
+ model: opus
5
+ next_step: steps/step-03d-validate.md
6
+ ---
7
+
8
+ > **Context files:** `_shared.md` | `_module-loop.md`
9
+
10
+ # Step 3c: Specification Compilation
11
+
12
+ ## MANDATORY EXECUTION RULES
13
+
14
+ - ALWAYS use ULTRATHINK mode
15
+ - This step COMPILES the specification from the interactive phase (step-03a) into feature.json
16
+ - ALWAYS validate specification completeness before writing
17
+ - ALL communication in `{language}`
18
+ - NEVER skip per-module validation
19
+ - **ID NAMING RULE (MANDATORY, NO EXCEPTION):**
20
+ All IDs MUST include a module prefix to guarantee application-wide uniqueness.
21
+ The prefix is derived from the module code initials (2-4 chars):
22
+ UserManagement → UM | VehicleManagement → VM | PartsInventory → PI
23
+ RepairManagement → RM | MaintenanceSchedule → MS | DataSync → DS
24
+ Notifications → NT | Dashboard → DB | Orders → OR | Customers → CU
25
+
26
+ Patterns:
27
+ UC-{PREFIX}-{NNN} → UC-RM-001, UC-PI-003
28
+ BR-{CAT}-{PREFIX}-{NNN} → BR-VAL-RM-001, BR-CALC-PI-002
29
+ FR-{PREFIX}-{NNN} → FR-RM-001
30
+ OBJ-{PREFIX}-{NNN} → OBJ-RM-001
31
+ AC-{PREFIX}-{NNN} → AC-RM-001
32
+ RISK-{PREFIX}-{NNN} → RISK-RM-001
33
+
34
+ NEVER use bare IDs (UC-001, BR-VAL-001) in multi-module mode.
35
+ - **SCHEMA CONFORMITY RULE:**
36
+ ALL data MUST fit within the defined feature-schema.json structure.
37
+ NEVER create custom top-level fields (KPIDefinitions, ChartConfigurations, etc.)
38
+ Dashboard modules MUST use specification.dashboards[] (it exists in the schema).
39
+ If truly needed, use specification.extensions: {} (additionalProperties: true).
40
+
41
+ ## YOUR TASK
42
+
43
+ Compile all data collected in step-03a (data) and step-03b (UI) into the module specification: generate actors, use cases, functional requirements, permission matrix, navigation, seed data, Gherkin scenarios, validations, messages, lifecycle, API endpoints, and i18n keys.
44
+
45
+ ---
46
+
47
+ ### 8. Full Specification
48
+
49
+ Generate the complete specification for this module. **Each subsection below includes a STRUCTURE CARD showing the EXACT JSON format. Follow them precisely.**
50
+
51
+ > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions and type inference guidance.
52
+
53
+ #### ENTITY ATTRIBUTE SCHEMA (MANDATORY — applies to ALL entities in section 6b of step-03a)
54
+
55
+ > **CRITICAL:** Entity attributes MUST use STRUCTURED properties, not free-text validation strings.
56
+ > The ralph-loop needs parseable types to generate correct C# code.
57
+
58
+ **MANDATORY fields:** `name`, `type`
59
+ **type values:** `string`, `int`, `long`, `decimal`, `double`, `bool`, `DateTime`, `DateOnly`, `TimeOnly`, `Guid`, `enum:{EnumName}`, `byte[]`
60
+
61
+ The reference includes:
62
+ - Detailed STRUCTURE CARD for entity attributes (with FK examples)
63
+ - Type inference priority table for auto-fixing missing types
64
+ - BaseEntity inheritance rules (tenantId, createdAt, updatedAt, createdBy, updatedBy)
65
+
66
+ #### ENTITY ATTRIBUTE FORMAT POST-CHECK (BLOCKING — runs for EVERY module including the first)
67
+
68
+ > **CRITICAL:** This check ensures EVERY entity attribute has a structured `type` field.
69
+ > It runs for ALL modules, not just modules 2+. The first module is NOT exempt.
70
+ > Without `type`, ralph-loop cannot generate correct C# properties, EF configurations, or validators.
71
+
72
+ **Reference:** Load `references/compilation-structure-cards.md` § "Type Inference Priority Table" for the complete auto-fix logic and inference patterns.
73
+
74
+ After compiling entities for this module:
75
+ 1. Verify every entity attribute has a `type` field (not free-text only)
76
+ 2. Apply auto-fix logic (infer from validation string or attribute name patterns)
77
+ 3. Normalize free-text validation into structured maxLength/validation properties
78
+ 4. Ensure required defaults to true if absent
79
+
80
+ ---
81
+
82
+ #### 8a-8l. Specification Structure Cards
83
+
84
+ > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions.
85
+
86
+ The reference includes detailed JSON templates for:
87
+ - **8a. Actors** — role and permissions mapping
88
+ - **8b. Use Cases** — UC-{PREFIX}-NNN format with scenarios
89
+ - **8c. Functional Requirements** — FR-{PREFIX}-NNN format
90
+ - **8d. Permission Matrix** — role assignments and paths
91
+ - **8e. Navigation** — module, sections, and resources
92
+ - **8f. SeedData Core** — 9 mandatory arrays
93
+ - **8g. Gherkin Scenarios** — BDD format (MUST be array)
94
+ - **8h. Validations** — field rules and error keys
95
+ - **8i. Messages** — success/error/warning/info types
96
+ - **8j. Entity Lifecycle** — state machines
97
+ - **8k. API Endpoints** — RESTful routes
98
+ - **8l. i18n Keys** — 4 languages (fr, en, it, de)
99
+
100
+ #### 8b. Use Cases (UC-{PREFIX}-NNN)
101
+
102
+ Per section: list, create, read, update, delete, approve, etc.
103
+
104
+ > **STRUCTURE CARD: specification.useCases[]**
105
+ > ```json
106
+ > {
107
+ > "id": "UC-{PREFIX}-001",
108
+ > "name": "Create Order",
109
+ > "primaryActor": "Sales Representative",
110
+ > "permission": "{app}.{module}.create",
111
+ > "preconditions": ["Customer exists", "Products in stock"],
112
+ > "postconditions": ["Order created with Draft status"],
113
+ > "mainScenario": [
114
+ > "1. User navigates to creation form",
115
+ > "2. User fills in required fields",
116
+ > "3. System validates data (BR-VAL-{PREFIX}-001)",
117
+ > "4. System creates the record",
118
+ > "5. System displays confirmation"
119
+ > ],
120
+ > "alternativeScenarios": [
121
+ > { "name": "Validation failure", "steps": ["1. System detects invalid data", "2. System highlights errors"] }
122
+ > ],
123
+ > "errorScenarios": [
124
+ > { "name": "Server error", "steps": ["1. System shows error message", "2. Data preserved for retry"] }
125
+ > ],
126
+ > "linkedRules": ["BR-VAL-{PREFIX}-001", "BR-WF-{PREFIX}-002"]
127
+ > }
128
+ > ```
129
+ > **MANDATORY fields:** `id`, `name`, `primaryActor`, `permission`, `mainScenario`, `linkedRules`
130
+ > **FORBIDDEN fields:** Do NOT use `actor` (use `primaryActor`), `linkedBRs` (use `linkedRules`), `linkedFRs` (not in UC, FRs link to UCs instead)
131
+
132
+ #### 8c. Functional Requirements (FR-{PREFIX}-NNN)
133
+
134
+ Linked to BRs and UCs.
135
+
136
+ > **STRUCTURE CARD: specification.functionalRequirements[]**
137
+ > ```json
138
+ > {
139
+ > "id": "FR-{PREFIX}-001",
140
+ > "statement": "System MUST validate customer budget before order creation",
141
+ > "priority": "must|should|could",
142
+ > "linkedRules": ["BR-VAL-{PREFIX}-001"],
143
+ > "linkedUseCases": ["UC-{PREFIX}-001"],
144
+ > "acceptanceCriteria": [
145
+ > "Order rejected if total > budget",
146
+ > "Error message displayed with remaining budget"
147
+ > ]
148
+ > }
149
+ > ```
150
+ > **MANDATORY fields:** `id`, `statement`, `priority`, `linkedUseCases`
151
+ > **FORBIDDEN fields:** Do NOT use `name`/`description` (use `statement` with System MUST/SHOULD/COULD format), `linkedUCs` (use `linkedUseCases`), `linkedBRs` (use `linkedRules`)
152
+
153
+ #### 8d. Permission Matrix
154
+
155
+ Roles × resources × operations with full paths.
156
+
157
+ > **STRUCTURE CARD: specification.permissionMatrix**
158
+ > ```json
159
+ > {
160
+ > "permissions": [
161
+ > { "path": "{app}.{module}.read", "action": "read", "description": "View records" },
162
+ > { "path": "{app}.{module}.create", "action": "create", "description": "Create new records" },
163
+ > { "path": "{app}.{module}.update", "action": "update", "description": "Update existing records" },
164
+ > { "path": "{app}.{module}.delete", "action": "delete", "description": "Delete records" },
165
+ > { "path": "{app}.{module}.export", "action": "export", "description": "Export data" },
166
+ > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View dashboard (section-level)" }
167
+ > ],
168
+ > "roleAssignments": [
169
+ > { "role": "{App} Admin", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.delete", "{app}.{module}.export", "{app}.{module}.dashboard.read"] },
170
+ > { "role": "{App} Manager", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.dashboard.read"] },
171
+ > { "role": "{App} Viewer", "permissions": ["{app}.{module}.read"] }
172
+ > ]
173
+ > }
174
+ > ```
175
+ > **STRUCTURE:** Object with 2 arrays: `permissions[]` and `roleAssignments[]`
176
+ > **Permission levels:** Module-level = `{app}.{module}.{action}` (3 segments). Section-level = `{app}.{module}.{section}.{action}` (4 segments, for sections needing distinct access like dashboard, approve, import).
177
+ > **FORBIDDEN:** Do NOT use a flat array with `resource`/`roles` fields. Always use the nested structure above.
178
+
179
+ #### 8e. Navigation
180
+
181
+ Module → Sections → Resources (levels 2-3-4 of the hierarchy).
182
+
183
+ > **STRUCTURE CARD: specification.navigation**
184
+ > ```json
185
+ > {
186
+ > "entries": [
187
+ > { "level": "module", "code": "{module}", "labels": {"fr": "...", "en": "...", "it": "...", "de": "..."}, "route": "/{app}/{module}", "icon": "list" },
188
+ > { "level": "section", "code": "list", "labels": {"fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste"}, "route": "/{app}/{module}", "icon": "list" },
189
+ > { "level": "section", "code": "dashboard", "labels": {"fr": "Tableau de bord", "en": "Dashboard", "it": "Cruscotto", "de": "Dashboard"}, "route": "/{app}/{module}/dashboard", "icon": "chart-bar", "isNew": true }
190
+ > ]
191
+ > }
192
+ > ```
193
+
194
+ #### 8e-POST-CHECK: Navigation Enforcement (BLOCKING)
195
+
196
+ > **CRITICAL:** `specification.navigation.entries[]` is MANDATORY. If absent, auto-generate from sections.
197
+
198
+ ```javascript
199
+ const nav = specification.navigation;
200
+ if (!nav || !nav.entries || nav.entries.length === 0) {
201
+ console.warn('AUTO-FIX: navigation.entries is empty — generating from sections');
202
+ const sections = specification.sections || [];
203
+ const entries = [
204
+ { level: "module", code: "{module}", labels: {fr: "{ModuleName}", en: "{ModuleName}", it: "{ModuleName}", de: "{ModuleName}"}, route: "/{app}/{module}", icon: "list" }
205
+ ];
206
+ for (const section of sections) {
207
+ entries.push({
208
+ level: "section",
209
+ code: section.code,
210
+ labels: {fr: section.name || section.code, en: section.name || section.code, it: section.name || section.code, de: section.name || section.code},
211
+ route: section.route || `/{app}/{module}/${section.code}`,
212
+ icon: section.icon || "file-text"
213
+ });
214
+ }
215
+ specification.navigation = { entries };
216
+ }
217
+ // Verify ALL entries have 4 languages
218
+ for (const entry of specification.navigation.entries) {
219
+ for (const lang of ['fr', 'en', 'it', 'de']) {
220
+ if (!entry.labels[lang]) {
221
+ entry.labels[lang] = entry.labels['en'] || entry.labels['fr'] || entry.code;
222
+ console.warn(`AUTO-FIX: navigation entry "${entry.code}" missing ${lang} label — copied from fallback`);
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ #### 8f. SeedData Core
229
+
230
+ 9 MANDATORY typed arrays — each with structured objects, NOT flat strings or objects.
231
+
232
+ > **STRUCTURE CARD: specification.seedDataCore**
233
+ > ```json
234
+ > {
235
+ > "navigationApplications": [
236
+ > { "code": "{app}", "label": "{Application Name}", "icon": "{icon}", "route": "/{app-kebab}", "sort": 1 }
237
+ > ],
238
+ > "applicationRoles": [
239
+ > { "code": "admin", "name": "{App} Admin", "permissions": "*" },
240
+ > { "code": "manager", "name": "{App} Manager", "permissions": "CRU" },
241
+ > { "code": "contributor", "name": "{App} Contributor", "permissions": "CR" },
242
+ > { "code": "viewer", "name": "{App} Viewer", "permissions": "R" }
243
+ > ],
244
+ > "navigationModules": [
245
+ > { "code": "{module}", "label": "{Module Name}", "icon": "list", "route": "/{app}/{module}", "parentCode": "{app}", "sort": 1 }
246
+ > ],
247
+ > "navigationSections": [
248
+ > { "code": "list", "label": "Liste", "icon": "List", "route": "/{app}/{module}", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 1 },
249
+ > { "code": "detail", "label": "Détail", "icon": "FileText", "route": "/{app}/{module}/:id", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 2, "navigation": "hidden" },
250
+ > { "code": "dashboard", "label": "Dashboard", "icon": "BarChart", "route": "/{app}/{module}/dashboard", "parentCode": "{module}", "permission": "{app}.{module}.dashboard.read", "sort": 3 }
251
+ > ],
252
+ > "navigationResources": [
253
+ > { "code": "{module}-grid", "type": "SmartTable", "entity": "{Entity}", "parentCode": "list", "permission": "{app}.{module}.read" },
254
+ > { "code": "{module}-detail-card", "type": "DetailCard", "entity": "{Entity}", "parentCode": "detail", "permission": "{app}.{module}.read" }
255
+ > ],
256
+ > "navigationTranslations": [
257
+ > { "moduleCode": "{module}", "language": "fr", "label": "..." },
258
+ > { "moduleCode": "{module}", "language": "en", "label": "..." },
259
+ > { "moduleCode": "{module}", "language": "it", "label": "..." },
260
+ > { "moduleCode": "{module}", "language": "de", "label": "..." }
261
+ > ],
262
+ > "permissions": [
263
+ > { "path": "{app}.{module}.read", "action": "read", "description": "View {module}" },
264
+ > { "path": "{app}.{module}.create", "action": "create", "description": "Create {module}" },
265
+ > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View {module} dashboard (section-level)" }
266
+ > ],
267
+ > "rolePermissions": [
268
+ > { "role": "{App} Admin", "permissionPath": "{app}.{module}.*" },
269
+ > { "role": "{App} Manager", "permissionPath": "{app}.{module}.read" }
270
+ > ],
271
+ > "permissionConstants": [
272
+ > { "constantName": "{Module}Read", "path": "{app}.{module}.read" },
273
+ > { "constantName": "{Module}Create", "path": "{app}.{module}.create" }
274
+ > ]
275
+ > }
276
+ > ```
277
+ > **MANDATORY:** All 9 arrays must be present. Each element must be an object, NOT a string.
278
+ > **NOTE:** `navigationApplications` and `applicationRoles` are populated from the application identity confirmed in step-01b. They are written ONCE for the first module processed and remain empty `[]` for subsequent modules.
279
+ > **CRITICAL:** `navigationSections` and `navigationResources` are DERIVED from `specification.sections[]` — use the transform algorithm below (section 8f-bis).
280
+ > **IMPORTANT:** `create` and `edit` are NEVER sections — they are action pages reached via buttons. Do NOT include them in `navigationSections`. Only include actual sidebar sections (list, dashboard, approve, import, etc.) and hidden route sections (detail).
281
+ > **FORBIDDEN:** Do NOT use `navigationModule` (singular string), `permissions` as flat string array, `rolePermissions` as flat object, `permissionsConstants` as comma-separated string.
282
+ >
283
+ > **FORBIDDEN in navigation routes:**
284
+ > - `/{app}/{module}/list` → use `/{app}/{module}` (list IS the module route)
285
+ > - `/{app}/{module}/detail/:id` → use `/{app}/{module}/:id`
286
+ > - Navigation routes must match React Router paths exactly
287
+
288
+ #### 8f-bis. Transform Sections into Navigation SeedData
289
+
290
+ > **CRITICAL:** `navigationSections` and `navigationResources` must be generated from `specification.sections[]`.
291
+ > This ensures the navigation hierarchy (Module → Section → Resource) is complete in the database.
292
+
293
+ **Transform algorithm:**
294
+
295
+ ```javascript
296
+ // 1. Transform specification.sections[] into navigationSections
297
+ const navigationSections = specification.sections.map((section, index) => ({
298
+ code: section.code, // e.g., "list", "detail", "dashboard"
299
+ label: section.labels.fr, // Default language (fr)
300
+ icon: section.icon, // Lucide icon name
301
+ route: section.route, // Full route path
302
+ parentCode: metadata.module, // Module code (parent)
303
+ permission: section.permission, // Required permission
304
+ sort: index + 1 // Display order (1-based)
305
+ }));
306
+
307
+ // 2. Transform specification.sections[].resources[] into navigationResources
308
+ const navigationResources = specification.sections.flatMap(section =>
309
+ section.resources.map(resource => ({
310
+ code: resource.code, // e.g., "employees-grid"
311
+ type: resource.type, // e.g., "SmartTable", "SmartForm"
312
+ entity: resource.entity, // e.g., "Employee"
313
+ parentCode: section.code, // Section code (parent)
314
+ permission: resource.permission // Optional (can inherit from section)
315
+ }))
316
+ );
317
+ ```
318
+
319
+ **Write seedDataCore to specification:**
320
+
321
+ ```
322
+ ba-writer.enrichSection({
323
+ feature_id,
324
+ section: "specification",
325
+ data: {
326
+ seedDataCore: {
327
+ navigationApplications: [ ... ], // FROM step-01b identity (only for first module, else [])
328
+ applicationRoles: [ ... ], // FROM cadrage.applicationRoles (only for first module, else [])
329
+ navigationModules: [ ... ],
330
+ navigationSections: navigationSections, // DERIVED
331
+ navigationResources: navigationResources, // DERIVED
332
+ navigationTranslations: [ ... ],
333
+ permissions: [ ... ],
334
+ rolePermissions: [ ... ],
335
+ permissionConstants: [ ... ]
336
+ }
337
+ }
338
+ })
339
+ ```
340
+
341
+ > **NOTE:** This step writes ONLY seedDataCore. The FULL specification write (actors, useCases, wireframes, sections, etc.) happens in step-03d section 11.
342
+ > ALL data from 8a-8l MUST be carried forward to step-03d. Do NOT discard in-memory data.
343
+
344
+ **Validation:**
345
+
346
+ - EVERY section in `specification.sections[]` MUST appear in `navigationSections`
347
+ - EVERY resource in `specification.sections[].resources[]` MUST appear in `navigationResources`
348
+ - Total count: `navigationSections.length === specification.sections.length`
349
+ - Total count: `navigationResources.length === sum(sections[].resources.length)`
350
+
351
+ #### 8g. Gherkin Scenarios
352
+
353
+ BDD acceptance tests per UC.
354
+
355
+ > **STRUCTURE CARD: specification.gherkinScenarios[]**
356
+ > ```json
357
+ > {
358
+ > "feature": "{Module} Management",
359
+ > "scenarios": [
360
+ > {
361
+ > "name": "Create a new record with valid data",
362
+ > "tags": ["@{module}", "@create", "@smoke"],
363
+ > "given": ["An authenticated user with role Manager", "No existing record with code 'TEST-001'"],
364
+ > "when": ["The user fills the creation form", "The user submits the form"],
365
+ > "then": ["The record is created with Draft status", "A success message is displayed"]
366
+ > }
367
+ > ]
368
+ > }
369
+ > ```
370
+ > **STRUCTURE:** MUST be an ARRAY of objects (NOT a single object). Each object has `feature` string + `scenarios[]` array. Each scenario has `given`, `when`, `then` as ARRAYS of strings.
371
+ > **FORBIDDEN:** Do NOT use flat arrays of `{uc, scenario, given, when, then}` where given/when/then are single strings.
372
+ > **FORBIDDEN:** Do NOT use a single object `{feature, scenarios}` — MUST be an ARRAY `[{feature, scenarios}]` even with one feature.
373
+
374
+ #### 8h. Validations
375
+
376
+ Field validation rules per entity.
377
+
378
+ > **STRUCTURE CARD: specification.validations[]**
379
+ > ```json
380
+ > {
381
+ > "entity": "Order",
382
+ > "field": "amount",
383
+ > "rules": ["required", "decimal", "min:0.01", "max:999999.99"],
384
+ > "errorMessageKey": "validation.{module}.amount.invalid"
385
+ > }
386
+ > ```
387
+ > **MANDATORY fields:** `entity`, `field`, `rules` (array), `errorMessageKey`
388
+ > **FORBIDDEN fields:** Do NOT use `rule` (singular string) or `message` (use `errorMessageKey`).
389
+
390
+ #### 8i. Business Messages
391
+
392
+ Minimum 4: success, error CRUD, error validation, error permission.
393
+
394
+ > **STRUCTURE CARD: specification.messages[]**
395
+ > ```json
396
+ > {
397
+ > "code": "{MODULE}-SUCCESS-CREATE",
398
+ > "type": "success|error|warning|info",
399
+ > "title": "Record Created",
400
+ > "message": "The record {code} has been created successfully.",
401
+ > "i18nKey": "message.{module}.created"
402
+ > }
403
+ > ```
404
+ > **MANDATORY fields:** `code`, `type`, `message`, `i18nKey`
405
+ > **FORBIDDEN:** Do NOT omit `title` or `i18nKey`. Every message MUST have an i18n key.
406
+
407
+ #### 8j. Entity Lifecycle
408
+
409
+ State machines for entities with status/state.
410
+ **Note:** If depth = full and 3a-state was executed, lifeCycles are already defined. Verify completeness and add any missing states/transitions.
411
+
412
+ > **STRUCTURE CARD: specification.lifeCycles[]**
413
+ > ```json
414
+ > {
415
+ > "entity": "Order",
416
+ > "field": "status",
417
+ > "initialState": "draft",
418
+ > "states": [
419
+ > { "id": "draft", "displayName": "Brouillon", "color": "gray", "allowedTransitions": ["submitted"], "isTerminal": false },
420
+ > { "id": "submitted", "displayName": "Soumis", "color": "blue", "allowedTransitions": ["approved", "rejected"], "isTerminal": false },
421
+ > { "id": "approved", "displayName": "Approuvé", "color": "green", "allowedTransitions": ["archived"], "isTerminal": false },
422
+ > { "id": "rejected", "displayName": "Rejeté", "color": "red", "allowedTransitions": [], "isTerminal": true },
423
+ > { "id": "archived", "displayName": "Archivé", "color": "purple", "allowedTransitions": [], "isTerminal": true }
424
+ > ],
425
+ > "transitions": [
426
+ > {
427
+ > "from": "draft", "to": "submitted", "action": "submit",
428
+ > "label": { "fr": "Soumettre", "en": "Submit" },
429
+ > "permission": "{app}.{module}.update",
430
+ > "guards": ["BR-VAL-{PREFIX}-001"],
431
+ > "effects": [{ "type": "notification", "target": "role:manager", "template": "{module}-submitted" }],
432
+ > "confirm": true
433
+ > }
434
+ > ]
435
+ > }
436
+ > ```
437
+ > **MANDATORY:** `states` MUST be an array of OBJECTS with `id`, `displayName`, `color`, `allowedTransitions`, `isTerminal`. NEVER use flat string arrays.
438
+ > **Colors:** gray (draft/new), blue (in-progress), green (active/approved), yellow (warning/pending), orange (review), red (error/rejected), purple (archived/terminal)
439
+ > **FORBIDDEN:** Do NOT use `states: ["Active", "Inactive"]` (flat strings), `terminalStates` (use `isTerminal: true` on each state).
440
+
441
+ #### 8k. API Endpoints
442
+
443
+ RESTful routes following SmartStack patterns.
444
+
445
+ > **STRUCTURE CARD: specification.apiEndpoints[]**
446
+ > ```json
447
+ > {
448
+ > "method": "GET|POST|PUT|PATCH|DELETE",
449
+ > "path": "/api/{app}/{module}",
450
+ > "permission": "{app}.{module}.read",
451
+ > "requestDto": "Get{Module}Query",
452
+ > "responseDto": "{Module}Dto[]",
453
+ > "description": "List all records with pagination and filters"
454
+ > }
455
+ > ```
456
+ > **MANDATORY fields:** `method`, `path`, `permission`, `description`
457
+ > **Recommended:** Include `requestDto` and `responseDto` for implementation clarity.
458
+
459
+ #### 8l. i18n Keys
460
+
461
+ Translation keys for all UI text (4 languages: fr, en, it, de).
462
+
463
+ > **STRUCTURE CARD: specification.i18nKeys**
464
+ > **CRITICAL:** ALL leaf translation keys MUST have 4 languages (fr, en, it, de). IT/DE can use shorter translations but MUST exist.
465
+ > ```json
466
+ > {
467
+ > "title": { "fr": "{Module}", "en": "{Module}", "it": "{Module}", "de": "{Module}" },
468
+ > "list": {
469
+ > "title": { "fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste" },
470
+ > "empty": { "fr": "Aucun enregistrement", "en": "No records", "it": "Nessun record", "de": "Keine Einträge" }
471
+ > },
472
+ > "create": { "title": { "fr": "Nouveau", "en": "New", "it": "Nuovo", "de": "Neu" } },
473
+ > "detail": { "title": { "fr": "Détail", "en": "Detail", "it": "Dettaglio", "de": "Detail" } },
474
+ > "buttons": {
475
+ > "create": { "fr": "Créer", "en": "Create", "it": "Crea", "de": "Erstellen" },
476
+ > "edit": { "fr": "Modifier", "en": "Edit", "it": "Modifica", "de": "Bearbeiten" },
477
+ > "delete": { "fr": "Supprimer", "en": "Delete", "it": "Elimina", "de": "Löschen" },
478
+ > "save": { "fr": "Enregistrer", "en": "Save", "it": "Salva", "de": "Speichern" },
479
+ > "cancel": { "fr": "Annuler", "en": "Cancel", "it": "Annulla", "de": "Abbrechen" }
480
+ > },
481
+ > "validation": {
482
+ > "required": { "fr": "Ce champ est requis", "en": "This field is required", "it": "Campo obbligatorio", "de": "Pflichtfeld" }
483
+ > }
484
+ > }
485
+ > ```
486
+
487
+ #### 8l-POST-CHECK: i18n 4 Languages Enforcement (BLOCKING)
488
+
489
+ > **CRITICAL:** i18n keys with missing IT/DE translations are a recurring issue.
490
+ > This POST-CHECK walks ALL leaf keys and auto-fills missing translations.
491
+
492
+ ```javascript
493
+ const i18n = specification.i18nKeys || {};
494
+ const REQUIRED_LANGS = ['fr', 'en', 'it', 'de'];
495
+ let missingCount = 0;
496
+
497
+ function walkI18n(obj, path) {
498
+ if (typeof obj !== 'object' || obj === null) return;
499
+ // Leaf node: has at least 'fr' or 'en' as direct string properties
500
+ const hasLangKey = REQUIRED_LANGS.some(l => typeof obj[l] === 'string');
501
+ if (hasLangKey) {
502
+ for (const lang of REQUIRED_LANGS) {
503
+ if (!obj[lang] || typeof obj[lang] !== 'string') {
504
+ // Fallback: copy from en > fr > first available
505
+ obj[lang] = obj['en'] || obj['fr'] || Object.values(obj).find(v => typeof v === 'string') || path;
506
+ missingCount++;
507
+ }
508
+ }
509
+ } else {
510
+ // Branch node: recurse
511
+ for (const key of Object.keys(obj)) {
512
+ walkI18n(obj[key], `${path}.${key}`);
513
+ }
514
+ }
515
+ }
516
+ walkI18n(i18n, 'i18nKeys');
517
+ if (missingCount > 0) {
518
+ console.warn(`AUTO-FIX: filled ${missingCount} missing i18n translations (IT/DE fallbacks from EN/FR)`);
519
+ }
520
+ ```
521
+
522
+ ---
523
+
524
+ ## SELF-VERIFICATION (MANDATORY before loading next step)
525
+
526
+ Before loading step-03d-validate, verify all 12 subsections (8a-8l) are populated:
527
+
528
+ 1. **8a. Actors** - At least 2 roles with permissions
529
+ 2. **8b. Use Cases** - At least 2 UCs with complete structure
530
+ 3. **8c. Functional Requirements** - At least 4 FRs with linked UCs and BRs
531
+ 4. **8d. Permission Matrix** - Resources and role assignments defined
532
+ 5. **8e. Navigation** - Module, sections, and resource routes specified
533
+ 6. **8f. SeedData Core** - All 7 arrays populated with structured objects (navigationModules, navigationSections, navigationResources, navigationTranslations, permissions, rolePermissions, permissionConstants)
534
+ 7. **8g. Gherkin Scenarios** - BDD scenarios for each major UC
535
+ 8. **8h. Validations** - Field rules with error message keys
536
+ 9. **8i. Business Messages** - Minimum 4 messages (success, error CRUD, validation, permission)
537
+ 10. **8j. Entity Lifecycle** - State machines with transitions if entity has status
538
+ 11. **8k. API Endpoints** - RESTful routes with permissions
539
+ 12. **8l. i18n Keys** - Translation keys in 4 languages (fr, en, it, de)
540
+
541
+ 13. **Wireframes present** — `(specification.uiWireframes || specification.wireframes || []).length >= 1` (BLOCKING)
542
+ Quick check: the wireframe data from step-03b MUST still be in memory OR persisted to feature.json
543
+
544
+ 14. **Wireframes create/edit** — For each data-centric section with a create form, a wireframe `{section}-create` MUST exist (BLOCKING).
545
+ For each modifiable entity, a wireframe `{section}-edit` SHOULD exist (WARNING if absent).
546
+ Create/edit wireframes are action-page wireframes — they are NOT separate navigation sections.
547
+ They describe the full-page form layout (fields, validation, submit/cancel buttons).
548
+ (step-03b now writes wireframes intermediately). If wireframes are empty:
549
+ - First, re-read the module feature.json to check if step-03b wrote them
550
+ - If present in file but not in memory → load them from file
551
+ - If absent everywhere → **STOP** and reload step-03b to regenerate wireframes
552
+
553
+ **IF any subsection is missing → STOP and request the missing data before proceeding.**
554
+
555
+ **ABSOLUTE FORMAT CHECKS (apply to ALL modules, including the first):**
556
+
557
+ > These checks validate against the canonical schema — NOT comparatively against another module.
558
+ > They run BEFORE the SCHEMA UNIFORMITY comparative check, ensuring the first module has the
559
+ > correct format before being used as baseline for subsequent modules.
560
+
561
+ ```javascript
562
+ // Gherkin MUST be array (not single object)
563
+ if (!Array.isArray(specification.gherkinScenarios)) {
564
+ console.warn('AUTO-FIX: gherkinScenarios is object, wrapping in array');
565
+ specification.gherkinScenarios = [specification.gherkinScenarios];
566
+ }
567
+
568
+ // Validations[].rules MUST be array (not singular rule string)
569
+ for (const v of specification.validations || []) {
570
+ if (typeof v.rules === 'string') { v.rules = [v.rules]; }
571
+ if (v.rule && !v.rules) {
572
+ v.rules = Array.isArray(v.rule) ? v.rule : [v.rule];
573
+ delete v.rule;
574
+ }
575
+ }
576
+
577
+ // Messages MUST have "message" field (not only "description")
578
+ for (const m of specification.messages || []) {
579
+ if (!m.message && m.description) { m.message = m.description; }
580
+ }
581
+
582
+ // Wireframes MUST use canonical field names
583
+ const wireframes = specification.uiWireframes || specification.wireframes || [];
584
+ for (const wf of wireframes) {
585
+ if (wf.title && !wf.screen) { wf.screen = wf.title; delete wf.title; }
586
+ if (wf.ascii && !wf.mockup) { wf.mockup = wf.ascii; delete wf.ascii; }
587
+ if (wf.content && !wf.mockup) { wf.mockup = wf.content; delete wf.content; }
588
+ if (wf.name && !wf.screen) { wf.screen = wf.name; delete wf.name; }
589
+ }
590
+ specification.uiWireframes = wireframes;
591
+
592
+ // Entity attributes MUST have "type" field (already checked in ENTITY ATTRIBUTE FORMAT POST-CHECK above)
593
+ ```
594
+
595
+ **SCHEMA UNIFORMITY CHECK (multi-module mode):**
596
+ IF this is NOT the first module in moduleOrder:
597
+ Compare THIS module's specification structure against the FIRST specified module:
598
+ - `gherkinScenarios` MUST be array (not object) in ALL modules
599
+ - `validations[].rules` MUST be array (not singular `rule`) in ALL modules
600
+ - `messages[]` MUST have `message` field in ALL modules
601
+ - `specification.apiEndpoints[]` MUST be present in ALL modules
602
+ - `specification.i18nKeys` MUST be present in ALL modules
603
+ - `analysis.entities[].attributes[].type` MUST be present on ALL attributes in ALL modules
604
+ - IF first module has free-text-only attributes without `type` field → AUTO-FIX with type inference
605
+ IF any structural divergence detected → AUTO-FIX to match the canonical format before proceeding.
606
+
607
+ ---
608
+
609
+ ## NEXT STEP
610
+
611
+ Load: `steps/step-03d-validate.md`