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