@atlashub/smartstack-cli 3.53.0 → 4.0.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.
@@ -95,83 +95,11 @@ Web → Application (via API clients)
95
95
 
96
96
  ---
97
97
 
98
- ## Layer 1 — Application (parallel with API)
99
-
100
- **Services:** `Application/Services/{App}/{Module}/` (interface)
101
- **Service impls:** `Infrastructure/Services/{App}/{Module}/` (implementation)
102
- **DTOs:** `Application/DTOs/{App}/{Module}/`
103
- **Validators:** `Application/Validators/{App}/{Module}/`
104
-
105
- | Action | Tool |
106
- |--------|------|
107
- | Create service/DTO | MCP `scaffold_extension` |
108
- | Complex service logic | /application skill |
109
- | Validate | MCP `validate_conventions` |
110
-
111
- **Rules:**
112
- - **Tenant injection depends on entity tenant mode** (see entity rules below):
113
- - **strict mode (default):** Inject `ICurrentTenantService` + guard clause: `var tenantId = _currentTenant.TenantId ?? throw new TenantContextRequiredException();` (mandatory, returns 400)
114
- - **optional mode:** Inject `ICurrentTenantService`, no guard: `var tenantId = _currentTenant.TenantId;` (nullable). EF global filter handles shared+tenant data.
115
- - **scoped mode:** Inject `ICurrentTenantService`, validate Scope + TenantId consistency. Tenant scope requires TenantId.
116
- - **none mode:** No `ICurrentTenantService` injection needed (cross-tenant data, no filtering)
117
- - **ALL services MUST inject `ICurrentUserService`** for audit trails
118
- - **ALL services MUST inject `ILogger<T>`** for production diagnostics
119
- - CQRS with MediatR
120
- - FluentValidation for all commands — **MUST register validators via DI:**
121
- `services.AddValidatorsFromAssemblyContaining<Create{Entity}DtoValidator>();`
122
- Without DI registration, `[FromBody]` DTOs are never validated (POST-CHECK 38)
123
- - **Date fields in DTOs MUST use `DateOnly`**, not `string` (POST-CHECK 39). See `smartstack-api.md` DTO Type Mapping.
124
- - DTOs separate from domain entities
125
- - Service interfaces in Application, implementations in Infrastructure
126
- - **FORBIDDEN:** `tenantId: Guid.Empty`, `TenantId!.Value`, queries without TenantId filter, `ICurrentUser` (does not exist — use `ICurrentUserService` + `ICurrentTenantService`), `string` type for date fields
127
- - **Person Extension services:** If entity has `personRoleConfig`:
128
- - `Include(x => x.User)` on ALL queries (mandatory)
129
- - Inject `ICoreDbContext` for User existence checks
130
- - Mandatory: search on `User.FirstName`, `User.LastName`, `User.Email`
131
- - Optional: search fallback `User.FirstName ?? x.FirstName`
132
- - CreateAsync: verify User exists + no duplicate `(TenantId, UserId)`
133
- - ResponseDto: include `Display*` fields resolved from User join
134
-
135
- ---
136
-
137
- ## Layer 1 — API (parallel with Application)
138
-
139
- **Controllers:** `Api/Controllers/{AppPascal}/{Entity}Controller.cs`
140
-
141
- | Action | Tool |
142
- |--------|------|
143
- | Simple CRUD controller | MCP `scaffold_extension` |
144
- | Complex controller | /controller skill |
145
- | Validate | MCP `validate_security` |
146
-
147
- **Rules:**
148
- - `[RequirePermission(Permissions.{Module}.{Action})]` on EVERY endpoint
149
- - **NavRoute minimum 2 segments** (application.module):
150
- - `[NavRoute("human-resources.employees")]` (CORRECT — module-level, 2 segments)
151
- - `[NavRoute("human-resources.employees.departments")]` (CORRECT — section-level, 3 segments)
152
- - `[NavRoute("administration.ai", Suffix = "prompts")]` (CORRECT — sub-resource with Suffix)
153
- - **NavRoute values MUST use kebab-case for ALL multi-word segments:**
154
- - `[NavRoute("human-resources.employees")]` (CORRECT)
155
- - `[NavRoute("humanresources.employees")]` (WRONG — missing hyphens)
156
- - `[NavRoute("project-management.projects")]` (CORRECT)
157
- - `[NavRoute("projectmanagement.projects")]` (WRONG)
158
- - Permission paths MUST use kebab-case matching NavRoute codes (e.g., `human-resources.employees.read`)
159
- - FORBIDDEN: concatenated segments like `humanresources` — must be `human-resources`
160
- - POST-CHECK 32 detects non-kebab-case NavRoute values. POST-CHECK 33 detects non-kebab-case permissions
161
- - **FORBIDDEN:** `[Route("api/...")]` alongside `[NavRoute]` — causes 404s (POST-CHECK 41)
162
- - `[NavRoute]` is the ONLY route attribute needed — resolves routes from DB at startup
163
- - NEVER use `[Authorize]` without specific permission
164
- - Swagger XML documentation
165
- - Return DTOs, never domain entities
166
- - **Person Extension DTOs:** ResponseDto MUST include `Display*` fields (`DisplayFirstName`, `DisplayLastName`, `DisplayEmail`) resolved from User join. Mandatory CreateDto: `Guid UserId` only. Optional CreateDto: `Guid? UserId` + person fields.
167
-
168
- ---
169
-
170
- ## Layer 1 — Seed Data (parallel)
98
+ ## Layer 1 — Seed Data (DEDICATED LAYER — sequential)
171
99
 
172
100
  **Folder:** `Infrastructure/Persistence/Seeding/Data/{ModulePascal}/`
173
101
 
174
- > **Detailed templates:** See ralph-loop `references/core-seed-data.md` for complete C# code templates.
102
+ > **Detailed templates:** See `references/core-seed-data.md` for complete C# code templates.
175
103
  > Navigation hierarchy: Application → Module → Section → Resource (ALL levels need seed data).
176
104
 
177
105
  | Action | Tool |
@@ -268,7 +196,79 @@ var sectionRoute = $"{moduleRoute}/{ToKebabCase(sectionCode)}";
268
196
 
269
197
  ---
270
198
 
271
- ## Layer 2 — Frontend (parallel with I18n)
199
+ ## Layer 2 — Application (parallel with API within layer)
200
+
201
+ **Services:** `Application/Services/{App}/{Module}/` (interface)
202
+ **Service impls:** `Infrastructure/Services/{App}/{Module}/` (implementation)
203
+ **DTOs:** `Application/DTOs/{App}/{Module}/`
204
+ **Validators:** `Application/Validators/{App}/{Module}/`
205
+
206
+ | Action | Tool |
207
+ |--------|------|
208
+ | Create service/DTO | MCP `scaffold_extension` |
209
+ | Complex service logic | /application skill |
210
+ | Validate | MCP `validate_conventions` |
211
+
212
+ **Rules:**
213
+ - **Tenant injection depends on entity tenant mode** (see entity rules below):
214
+ - **strict mode (default):** Inject `ICurrentTenantService` + guard clause: `var tenantId = _currentTenant.TenantId ?? throw new TenantContextRequiredException();` (mandatory, returns 400)
215
+ - **optional mode:** Inject `ICurrentTenantService`, no guard: `var tenantId = _currentTenant.TenantId;` (nullable). EF global filter handles shared+tenant data.
216
+ - **scoped mode:** Inject `ICurrentTenantService`, validate Scope + TenantId consistency. Tenant scope requires TenantId.
217
+ - **none mode:** No `ICurrentTenantService` injection needed (cross-tenant data, no filtering)
218
+ - **ALL services MUST inject `ICurrentUserService`** for audit trails
219
+ - **ALL services MUST inject `ILogger<T>`** for production diagnostics
220
+ - CQRS with MediatR
221
+ - FluentValidation for all commands — **MUST register validators via DI:**
222
+ `services.AddValidatorsFromAssemblyContaining<Create{Entity}DtoValidator>();`
223
+ Without DI registration, `[FromBody]` DTOs are never validated (POST-CHECK 38)
224
+ - **Date fields in DTOs MUST use `DateOnly`**, not `string` (POST-CHECK 39). See `smartstack-api.md` DTO Type Mapping.
225
+ - DTOs separate from domain entities
226
+ - Service interfaces in Application, implementations in Infrastructure
227
+ - **FORBIDDEN:** `tenantId: Guid.Empty`, `TenantId!.Value`, queries without TenantId filter, `ICurrentUser` (does not exist — use `ICurrentUserService` + `ICurrentTenantService`), `string` type for date fields
228
+ - **Person Extension services:** If entity has `personRoleConfig`:
229
+ - `Include(x => x.User)` on ALL queries (mandatory)
230
+ - Inject `ICoreDbContext` for User existence checks
231
+ - Mandatory: search on `User.FirstName`, `User.LastName`, `User.Email`
232
+ - Optional: search fallback `User.FirstName ?? x.FirstName`
233
+ - CreateAsync: verify User exists + no duplicate `(TenantId, UserId)`
234
+ - ResponseDto: include `Display*` fields resolved from User join
235
+
236
+ ---
237
+
238
+ ## Layer 2 — API (parallel with Application within layer)
239
+
240
+ **Controllers:** `Api/Controllers/{AppPascal}/{Entity}Controller.cs`
241
+
242
+ | Action | Tool |
243
+ |--------|------|
244
+ | Simple CRUD controller | MCP `scaffold_extension` |
245
+ | Complex controller | /controller skill |
246
+ | Validate | MCP `validate_security` |
247
+
248
+ **Rules:**
249
+ - `[RequirePermission(Permissions.{Module}.{Action})]` on EVERY endpoint
250
+ - **NavRoute minimum 2 segments** (application.module):
251
+ - `[NavRoute("human-resources.employees")]` (CORRECT — module-level, 2 segments)
252
+ - `[NavRoute("human-resources.employees.departments")]` (CORRECT — section-level, 3 segments)
253
+ - `[NavRoute("administration.ai", Suffix = "prompts")]` (CORRECT — sub-resource with Suffix)
254
+ - **NavRoute values MUST use kebab-case for ALL multi-word segments:**
255
+ - `[NavRoute("human-resources.employees")]` (CORRECT)
256
+ - `[NavRoute("humanresources.employees")]` (WRONG — missing hyphens)
257
+ - `[NavRoute("project-management.projects")]` (CORRECT)
258
+ - `[NavRoute("projectmanagement.projects")]` (WRONG)
259
+ - Permission paths MUST use kebab-case matching NavRoute codes (e.g., `human-resources.employees.read`)
260
+ - FORBIDDEN: concatenated segments like `humanresources` — must be `human-resources`
261
+ - POST-CHECK 32 detects non-kebab-case NavRoute values. POST-CHECK 33 detects non-kebab-case permissions
262
+ - **FORBIDDEN:** `[Route("api/...")]` alongside `[NavRoute]` — causes 404s (POST-CHECK 41)
263
+ - `[NavRoute]` is the ONLY route attribute needed — resolves routes from DB at startup
264
+ - NEVER use `[Authorize]` without specific permission
265
+ - Swagger XML documentation
266
+ - Return DTOs, never domain entities
267
+ - **Person Extension DTOs:** ResponseDto MUST include `Display*` fields (`DisplayFirstName`, `DisplayLastName`, `DisplayEmail`) resolved from User join. Mandatory CreateDto: `Guid UserId` only. Optional CreateDto: `Guid? UserId` + person fields.
268
+
269
+ ---
270
+
271
+ ## Layer 3 — Frontend (parallel with I18n within layer)
272
272
 
273
273
  > **Detailed patterns:** See `references/smartstack-frontend.md` for complete code templates.
274
274
 
@@ -390,7 +390,7 @@ See `references/smartstack-frontend.md` section 6 for the full `EntityLookup` co
390
390
 
391
391
  ---
392
392
 
393
- ## Layer 2 — I18n
393
+ ## Layer 3 — I18n
394
394
 
395
395
  > **Template:** See `references/smartstack-frontend.md` Section 2 for complete JSON template.
396
396
 
@@ -409,7 +409,7 @@ t('{module}:actions.create', 'Create entity') // ALWAYS with namespace prefix
409
409
 
410
410
  ---
411
411
 
412
- ## Layer 2b — Documentation (after frontend pages exist)
412
+ ## Layer 3 — Documentation (after frontend pages exist)
413
413
 
414
414
  > **After frontend pages are created, generate module documentation.**
415
415
 
@@ -428,19 +428,19 @@ See `references/smartstack-frontend.md` section 7 for the component pattern.
428
428
 
429
429
  ---
430
430
 
431
- ## Layer 3Tests (sequential)
431
+ ## Layer 4DevData (optional)
432
+
433
+ **Folder:** `Infrastructure/Persistence/Seeding/DevData/`
432
434
 
433
435
  | Action | Tool |
434
436
  |--------|------|
435
- | Unit tests (domain) | MCP `scaffold_tests` (target_layer: domain) |
436
- | Unit tests (app) | MCP `scaffold_tests` (target_layer: application) |
437
- | Integration tests (api) | MCP `scaffold_tests` (target_layer: api, type: integration) |
438
- | Security tests | MCP `scaffold_tests` (type: security) |
439
- | Coverage check | MCP `analyze_test_coverage` |
440
- | Scenarios | MCP `suggest_test_scenarios` |
437
+ | Create DevDataSeeder | Manual / template |
441
438
 
442
- **Target:** >= 80% coverage, 100% pass rate.
443
- **Fix CODE, not tests.**
439
+ **Rules:**
440
+ - Business test data for development/demo environments
441
+ - ALL DevData entities MUST include `TenantId`
442
+ - DevData depends on seed data (navigation, permissions) being in place
443
+ - Optional — skip if no meaningful test data needed
444
444
 
445
445
  ---
446
446
 
@@ -466,23 +466,28 @@ For EACH file in the plan, specify HOW it will be created/modified:
466
466
  | 2 | Infrastructure/.../EntityConfiguration.cs | create | MCP scaffold_extension |
467
467
  | 3 | Infrastructure/Migrations/ | create | MCP suggest_migration + dotnet ef |
468
468
 
469
- **Layer 1 — Application + API + Seed Data (parallel):**
469
+ **Layer 1 — Seed Data (sequential):**
470
+
471
+ | # | File | Action | Tool |
472
+ |---|------|--------|------|
473
+ | 4 | Seeding/Data/NavigationApplicationSeedData.cs | create | Reference core-seed-data.md (once per app) |
474
+ | 4b | Seeding/Data/ApplicationRolesSeedData.cs | create | Reference core-seed-data.md (once per app) |
475
+ | 5 | Seeding/Data/.../NavigationModuleSeedData.cs | create | Reference core-seed-data.md (4 langs) |
476
+ | 5b | Application/Authorization/Permissions.cs | create | MCP generate_permissions |
477
+ | 6 | Seeding/Data/.../PermissionsSeedData.cs | create | MCP generate_permissions |
478
+ | 7 | Seeding/Data/.../RolesSeedData.cs | create | Reference core-seed-data.md |
479
+ | 7b | Seeding/{App}SeedDataProvider.cs | create | Reference core-seed-data.md (IClientSeedDataProvider + DI) |
480
+
481
+ **Layer 2 — Backend (parallel within layer):**
470
482
 
471
483
  | # | File | Action | Tool |
472
484
  |---|------|--------|------|
473
- | 4 | Application/Services/.../Service.cs | create | MCP scaffold_extension |
474
- | 5 | Application/DTOs/.../Dto.cs | create | MCP scaffold_extension |
475
- | 6 | Api/Controllers/.../Controller.cs | create | /controller skill or MCP scaffold_extension |
476
- | 7 | Seeding/Data/NavigationApplicationSeedData.cs | create | Reference Layer 1 Seed Data (once per app) |
477
- | 7b | Seeding/Data/ApplicationRolesSeedData.cs | create | Reference Layer 1 Seed Data (once per app) |
478
- | 7c | Infrastructure/Services/CodeGeneration/ | create | Reference code-generation.md (if codePattern != manual) |
479
- | 8 | Seeding/Data/.../NavigationModuleSeedData.cs | create | Reference core-seed-data.md (4 langs) |
480
- | 8b | Application/Authorization/Permissions.cs | create | MCP generate_permissions |
481
- | 9 | Seeding/Data/.../PermissionsSeedData.cs | create | MCP generate_permissions |
482
- | 10 | Seeding/Data/.../RolesSeedData.cs | create | Reference Layer 1 Seed Data |
483
- | 10b | Seeding/{App}SeedDataProvider.cs | create | Reference core-seed-data.md (IClientSeedDataProvider + DI) |
484
-
485
- **Layer 1 — Frontend (parallel):**
485
+ | 8 | Application/Services/.../Service.cs | create | MCP scaffold_extension |
486
+ | 9 | Application/DTOs/.../Dto.cs | create | MCP scaffold_extension |
487
+ | 9b | Infrastructure/Services/CodeGeneration/ | create | Reference code-generation.md (if codePattern != manual) |
488
+ | 10 | Api/Controllers/.../Controller.cs | create | /controller skill or MCP scaffold_extension |
489
+
490
+ **Layer 3 Frontend + I18n + Documentation (parallel within layer):**
486
491
 
487
492
  | # | File | Action | Tool |
488
493
  |---|------|--------|------|
@@ -492,30 +497,32 @@ For EACH file in the plan, specify HOW it will be created/modified:
492
497
  | 12 | src/services/api/{module}Api.ts | create | MCP scaffold_api_client |
493
498
  | 13 | src/routes/{module}.tsx | create | MCP scaffold_routes |
494
499
  | 14 | src/i18n/locales/{lang}/{module}.json | create | Reference smartstack-frontend.md (4 languages) |
495
-
496
- **Layer 2b — Documentation (after frontend):**
497
-
498
- | # | File | Action | Tool |
499
- |---|------|--------|------|
500
500
  | 14b | src/pages/docs/business/{app}/{module}/doc-data.ts | create | /documentation skill |
501
501
  | 14c | src/pages/docs/business/{app}/{module}/index.tsx | create | /documentation skill |
502
502
 
503
- **Layer 3 — Tests (sequential):**
504
-
505
- | # | File | Action | Tool |
506
- |---|------|--------|------|
507
- | 15 | tests/.../EntityTests.cs | create | MCP scaffold_tests |
508
- | 16 | tests/.../ServiceTests.cs | create | MCP scaffold_tests |
509
-
510
503
  **FK Field Guidance:** If step-01 identified `fkFields[]`, every Create/Edit page MUST use `EntityLookup` for those fields (see `smartstack-frontend.md` section 6).
511
504
 
512
505
  ---
513
506
 
514
507
  ## Parallelization Strategy (Agent Teams)
515
508
 
516
- If NOT economy_mode AND Layer 1 has both backend and frontend work:
509
+ > **Cross-layer parallelism is FORBIDDEN.** Layers execute sequentially: 0 → 1 2 3 4.
510
+ > Agent teams are used **within** a layer to parallelize multi-entity work.
511
+
512
+ If NOT economy_mode AND a layer has multiple entities to process:
513
+
514
+ **Create agent teams WITHIN the layer to parallelize multi-entity work.**
515
+
516
+ - **Layer 2 (Backend):** If multiple entities, spawn entity-specific teammates (each handles service + controller for one entity)
517
+ - **Layer 3 (Frontend):** If multiple entities, spawn entity-specific teammates (each handles pages + i18n for one entity)
517
518
 
518
- **Create agent teams to execute Layer 1 backend and frontend in parallel.**
519
+ | Condition | Action |
520
+ |-----------|--------|
521
+ | economy_mode = true | NO teams, all sequential |
522
+ | Single entity | NO teams, agent principal handles all layers |
523
+ | Multiple entities, Layer 2 | Teams: one teammate per entity (service + controller) |
524
+ | Multiple entities, Layer 3 | Teams: one teammate per entity (pages + i18n) |
525
+ | Analysis phase (step-01) | Teams: scan-backend + scan-frontend + scan-context |
519
526
 
520
527
  See `references/agent-teams-protocol.md` for team creation, teammate spawning, task coordination, and shutdown.
521
528
 
@@ -528,10 +535,10 @@ When `/ralph-loop` invokes `/apex -d {prd_path}`, PRD tasks already define the s
528
535
  Map each PRD task to a layer based on `task.category`:
529
536
  - `domain` → Layer 0
530
537
  - `infrastructure` → Layer 0
531
- - `application` → Layer 1
532
- - `api` → Layer 1
533
538
  - `seedData` → Layer 1
534
- - `frontend` → Layer 2
535
- - `test` → Layer 3
539
+ - `application` → Layer 2
540
+ - `api` → Layer 2
541
+ - `frontend` → Layer 3
542
+ - `test` → inline (Layer 2 backend tests, Layer 3 frontend tests)
536
543
 
537
544
  For each task: infer file_path, action, and tool from category. SKIP user checkpoint. Jump to "Estimated Commits" section.
@@ -28,11 +28,11 @@ IF delegate_mode:
28
28
  Map each PRD task to a layer based on task.category:
29
29
  domain → Layer 0
30
30
  infrastructure → Layer 0
31
- application → Layer 1
32
- api → Layer 1
33
31
  seedData → Layer 1
34
- frontend → Layer 2
35
- test → Layer 3
32
+ application → Layer 2
33
+ api → Layer 2
34
+ frontend → Layer 3
35
+ test → inline (Layer 2 backend tests, Layer 3 frontend tests)
36
36
 
37
37
  For each task:
38
38
  file_path = task.files_changed.created[0] (primary file)
@@ -56,12 +56,12 @@ IF delegate_mode:
56
56
  ## 1-3. Layer Mapping, Skill Assignment, Parallelization
57
57
 
58
58
  > **Reference:** All planning procedures are now in `references/smartstack-layers.md` (already loaded above):
59
- > - Layer assignment matrix (Domain/Infrastructure/Application/API/Seed/Frontend/Tests)
59
+ > - Layer assignment matrix (Domain/Infrastructure/Seed/Application/API/Frontend/DevData)
60
60
  > - Entity definition template (tenantMode, codePattern, fkFields, ACs)
61
61
  > - Skill/MCP assignment table (per file, per layer)
62
- > - Layer 0/1/2b/3 file lists with tools (see "Planning Template" section)
62
+ > - Layer 0/1/2/3/4 file lists with tools (see "Planning Template" section)
63
63
  > - FK field guidance (EntityLookup + backend ?search= parameter)
64
- > - Parallelization strategy (Agent Teams for Layer 1 backend+frontend)
64
+ > - Parallelization strategy (Agent Teams within Layer 2/3 for multi-entity)
65
65
  > - Delegate mode fast path (PRD task mapping to layers)
66
66
 
67
67
  ```
@@ -69,12 +69,22 @@ Layer 0: SEQUENTIAL (agent principal)
69
69
  → domain + infra + migration
70
70
  → dotnet build --no-restore (BLOCKING)
71
71
 
72
- Layer 1: PARALLEL (Agent Teams)
73
- exec-backend: application + api + seed data
74
- exec-frontend: frontend + i18n
72
+ Layer 1: SEQUENTIAL (agent principal)
73
+ seed data (navigation, permissions, roles)
74
+ dotnet build (BLOCKING)
75
75
 
76
- Layer 2: SEQUENTIAL (agent principal)
77
- final validation + tests
76
+ Layer 2: PARALLEL WITHIN LAYER (Agent Teams if multi-entity)
77
+ services + controllers
78
+ → dotnet build (BLOCKING)
79
+ → backend tests inline (scaffold + run + fix max 3)
80
+
81
+ Layer 3: PARALLEL WITHIN LAYER (Agent Teams if multi-entity)
82
+ → pages + i18n + documentation
83
+ → compliance gate (BLOCKING)
84
+ → frontend tests inline (scaffold + run + fix max 3)
85
+
86
+ Layer 4: OPTIONAL (agent principal)
87
+ → DevData seeder
78
88
  ```
79
89
 
80
90
  If economy_mode: ALL layers sequential, agent principal only.
@@ -87,14 +97,15 @@ Verify the plan respects dependencies:
87
97
 
88
98
  ```
89
99
  - Migration AFTER EF configs (always)
100
+ - Seed data AFTER migration (Layer 1 depends on Layer 0 build gate)
90
101
  - Application services AFTER domain entities (always)
91
102
  - Code generator service AFTER entity + EF config (needs DbSet for sequence query)
92
103
  - CreateDto adjustments AFTER code pattern decision (remove Code property if auto-generated)
93
104
  - Controllers AFTER application services (always)
105
+ - Backend tests AFTER services + controllers (inline in Layer 2)
94
106
  - Frontend AFTER API controllers (API contract needed)
95
- - Seed data AFTER navigation module exists
96
- - Tests AFTER all code layers complete
97
- - Build check between Layer 0 and Layer 1 (BLOCKING)
107
+ - Frontend tests AFTER pages created (inline in Layer 3)
108
+ - Build gate between EVERY layer (BLOCKING): Layer 0 → 1 → 2 → 3 → 4
98
109
  ```
99
110
 
100
111
  ---
@@ -103,12 +114,16 @@ Verify the plan respects dependencies:
103
114
 
104
115
  ```
105
116
  feat({module}): [domain+infra] {description}
117
+ feat({module}): [seed] navigation, permissions, roles
106
118
  feat({module}): [app+api] {description}
107
- feat({module}): [frontend] {description}
108
- feat({module}): [seed] {description}
109
- feat({module}): [tests] {description}
119
+ test({module}): backend unit and integration tests
120
+ feat({module}): [frontend] pages, routes, i18n, documentation
121
+ test({module}): frontend form tests
122
+ feat({module}): [devdata] test data for development # if applicable
110
123
  ```
111
124
 
125
+ **Maximum 7 commits per module.**
126
+
112
127
  ---
113
128
 
114
129
  ## 6. User Checkpoint (if NOT auto_mode)