@atlashub/smartstack-cli 3.36.0 → 3.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/dist/index.js +16 -24
  2. package/dist/index.js.map +1 -1
  3. package/dist/mcp-entry.mjs +201 -256
  4. package/dist/mcp-entry.mjs.map +1 -1
  5. package/package.json +3 -2
  6. package/scripts/extract-api-endpoints.ts +325 -0
  7. package/scripts/extract-business-rules.ts +440 -0
  8. package/scripts/generate-doc-with-mock-ui.ts +804 -0
  9. package/scripts/health-check.sh +168 -0
  10. package/scripts/postinstall.js +18 -0
  11. package/templates/agents/ba-reader.md +9 -9
  12. package/templates/agents/ba-writer.md +12 -15
  13. package/templates/agents/code-reviewer.md +1 -1
  14. package/templates/agents/docs-context-reader.md +1 -1
  15. package/templates/agents/gitflow/merge.md +0 -4
  16. package/templates/agents/gitflow/pr.md +0 -4
  17. package/templates/agents/gitflow/start.md +30 -5
  18. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +20 -20
  19. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +16 -24
  20. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +2 -2
  21. package/templates/skills/_resources/mcp-validate-documentation-spec.md +3 -3
  22. package/templates/skills/_shared.md +15 -17
  23. package/templates/skills/ai-prompt/SKILL.md +1 -1
  24. package/templates/skills/ai-prompt/steps/step-00-init.md +47 -0
  25. package/templates/skills/apex/SKILL.md +3 -4
  26. package/templates/skills/apex/_shared.md +10 -20
  27. package/templates/skills/apex/references/analysis-methods.md +141 -0
  28. package/templates/skills/apex/references/challenge-questions.md +1 -21
  29. package/templates/skills/apex/references/core-seed-data.md +35 -57
  30. package/templates/skills/apex/references/examine-build-validation.md +87 -0
  31. package/templates/skills/apex/references/execution-frontend-gates.md +177 -0
  32. package/templates/skills/apex/references/execution-frontend-patterns.md +105 -0
  33. package/templates/skills/apex/references/execution-layer1-rules.md +96 -0
  34. package/templates/skills/apex/references/initialization-challenge-flow.md +110 -0
  35. package/templates/skills/apex/references/planning-layer-mapping.md +151 -0
  36. package/templates/skills/apex/references/post-checks.md +145 -40
  37. package/templates/skills/apex/references/smartstack-api.md +35 -51
  38. package/templates/skills/apex/references/smartstack-frontend.md +17 -17
  39. package/templates/skills/apex/references/smartstack-layers.md +38 -62
  40. package/templates/skills/apex/steps/step-00-init.md +14 -26
  41. package/templates/skills/apex/steps/step-01-analyze.md +10 -143
  42. package/templates/skills/apex/steps/step-02-plan.md +10 -92
  43. package/templates/skills/apex/steps/step-03-execute.md +47 -249
  44. package/templates/skills/apex/steps/step-04-examine.md +14 -78
  45. package/templates/skills/apex/steps/step-05-deep-review.md +2 -2
  46. package/templates/skills/apex/steps/step-08-run-tests.md +2 -0
  47. package/templates/skills/application/SKILL.md +6 -7
  48. package/templates/skills/application/references/backend-controller-hierarchy.md +16 -16
  49. package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -0
  50. package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -0
  51. package/templates/skills/application/references/backend-verification.md +1 -1
  52. package/templates/skills/application/references/frontend-i18n-and-output.md +67 -0
  53. package/templates/skills/application/references/frontend-route-naming.md +117 -0
  54. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -0
  55. package/templates/skills/application/references/frontend-verification.md +12 -12
  56. package/templates/skills/application/references/init-parameter-detection.md +120 -0
  57. package/templates/skills/application/references/migration-checklist-troubleshooting.md +100 -0
  58. package/templates/skills/application/references/nav-fallback-procedure.md +5 -6
  59. package/templates/skills/application/references/provider-template.md +2 -6
  60. package/templates/skills/application/references/roles-client-project-handling.md +55 -0
  61. package/templates/skills/application/references/roles-fallback-procedure.md +149 -0
  62. package/templates/skills/application/references/test-coverage-requirements.md +213 -0
  63. package/templates/skills/application/references/test-frontend.md +3 -3
  64. package/templates/skills/application/steps/step-00-init.md +11 -141
  65. package/templates/skills/application/steps/step-01-navigation.md +3 -3
  66. package/templates/skills/application/steps/step-02-permissions.md +4 -4
  67. package/templates/skills/application/steps/step-03-roles.md +18 -175
  68. package/templates/skills/application/steps/step-03b-provider.md +1 -2
  69. package/templates/skills/application/steps/step-04-backend.md +19 -110
  70. package/templates/skills/application/steps/step-05-frontend.md +17 -143
  71. package/templates/skills/application/steps/step-06-migration.md +12 -60
  72. package/templates/skills/application/steps/step-07-tests.md +9 -76
  73. package/templates/skills/application/templates-backend.md +29 -27
  74. package/templates/skills/application/templates-frontend.md +48 -48
  75. package/templates/skills/application/templates-seed.md +57 -131
  76. package/templates/skills/business-analyse/SKILL.md +27 -30
  77. package/templates/skills/business-analyse/_architecture.md +6 -6
  78. package/templates/skills/business-analyse/_shared.md +60 -88
  79. package/templates/skills/business-analyse/questionnaire/04-data.md +3 -3
  80. package/templates/skills/business-analyse/questionnaire/06-security.md +1 -1
  81. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +1 -1
  82. package/templates/skills/business-analyse/react/application-viewer.md +12 -12
  83. package/templates/skills/business-analyse/react/components.md +8 -12
  84. package/templates/skills/business-analyse/react/schema.md +11 -11
  85. package/templates/skills/business-analyse/references/agent-module-prompt.md +2 -3
  86. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -0
  87. package/templates/skills/business-analyse/references/cache-warming-strategy.md +2 -2
  88. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -0
  89. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -0
  90. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +69 -0
  91. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +1 -1
  92. package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -0
  93. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +2 -2
  94. package/templates/skills/business-analyse/references/deploy-modes.md +5 -5
  95. package/templates/skills/business-analyse/references/detection-strategies.md +7 -7
  96. package/templates/skills/business-analyse/references/handoff-file-templates.md +14 -22
  97. package/templates/skills/business-analyse/references/handoff-mappings.md +4 -4
  98. package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -0
  99. package/templates/skills/business-analyse/references/init-schema-deployment.md +3 -3
  100. package/templates/skills/business-analyse/references/naming-conventions.md +22 -24
  101. package/templates/skills/business-analyse/references/prd-generation.md +2 -2
  102. package/templates/skills/business-analyse/references/review-data-mapping.md +2 -2
  103. package/templates/skills/business-analyse/references/robustness-checks.md +1 -1
  104. package/templates/skills/business-analyse/references/spec-auto-inference.md +3 -3
  105. package/templates/skills/business-analyse/references/team-orchestration.md +49 -6
  106. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
  107. package/templates/skills/business-analyse/references/ui-resource-cards.md +18 -18
  108. package/templates/skills/business-analyse/references/validate-incremental-html.md +2 -2
  109. package/templates/skills/business-analyse/references/validation-checklist.md +2 -2
  110. package/templates/skills/business-analyse/schemas/application-schema.json +4 -5
  111. package/templates/skills/business-analyse/schemas/project-schema.json +1 -6
  112. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +2 -3
  113. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +4 -4
  114. package/templates/skills/business-analyse/steps/step-00-init.md +8 -17
  115. package/templates/skills/business-analyse/steps/step-01-cadrage.md +35 -198
  116. package/templates/skills/business-analyse/steps/step-01b-applications.md +16 -20
  117. package/templates/skills/business-analyse/steps/step-02-decomposition.md +1 -1
  118. package/templates/skills/business-analyse/steps/step-03a1-setup.md +4 -4
  119. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +1 -1
  120. package/templates/skills/business-analyse/steps/step-03b-ui.md +4 -4
  121. package/templates/skills/business-analyse/steps/step-03c-compile.md +66 -140
  122. package/templates/skills/business-analyse/steps/step-03d-validate.md +2 -2
  123. package/templates/skills/business-analyse/steps/step-04a-collect.md +2 -2
  124. package/templates/skills/business-analyse/steps/step-04b-analyze.md +42 -160
  125. package/templates/skills/business-analyse/steps/step-04c-decide.md +1 -1
  126. package/templates/skills/business-analyse/steps/step-05a-handoff.md +74 -104
  127. package/templates/skills/business-analyse/steps/step-05b-deploy.md +13 -11
  128. package/templates/skills/business-analyse/steps/step-06-review.md +3 -3
  129. package/templates/skills/business-analyse/templates/tpl-frd.md +13 -13
  130. package/templates/skills/business-analyse/templates/tpl-handoff.md +12 -12
  131. package/templates/skills/business-analyse/templates-frd.md +25 -25
  132. package/templates/skills/business-analyse/templates-react.md +15 -21
  133. package/templates/skills/controller/SKILL.md +1 -1
  134. package/templates/skills/controller/postman-templates.md +1 -1
  135. package/templates/skills/controller/references/controller-code-templates.md +2 -2
  136. package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -0
  137. package/templates/skills/controller/references/permission-sync-templates.md +13 -16
  138. package/templates/skills/controller/steps/step-00-init.md +11 -11
  139. package/templates/skills/controller/steps/step-03-generate.md +64 -103
  140. package/templates/skills/controller/templates.md +67 -71
  141. package/templates/skills/debug/SKILL.md +13 -218
  142. package/templates/skills/debug/steps/step-00-init.md +57 -0
  143. package/templates/skills/debug/steps/step-01-analyze.md +219 -0
  144. package/templates/skills/debug/steps/step-02-resolve.md +85 -0
  145. package/templates/skills/documentation/SKILL.md +49 -345
  146. package/templates/skills/documentation/data-schema.md +11 -8
  147. package/templates/skills/documentation/steps/step-00-init.md +70 -0
  148. package/templates/skills/documentation/steps/step-01-scan.md +113 -0
  149. package/templates/skills/documentation/steps/step-02-generate.md +231 -0
  150. package/templates/skills/documentation/steps/step-03-validate.md +238 -0
  151. package/templates/skills/documentation/templates.md +480 -322
  152. package/templates/skills/efcore/references/both-contexts.md +32 -0
  153. package/templates/skills/efcore/references/database-operations.md +67 -0
  154. package/templates/skills/efcore/references/destructive-operations.md +38 -0
  155. package/templates/skills/efcore/references/reset-operations.md +81 -0
  156. package/templates/skills/efcore/references/seed-methods.md +86 -0
  157. package/templates/skills/efcore/references/shared-init-functions.md +250 -0
  158. package/templates/skills/efcore/references/sql-objects-injection.md +61 -0
  159. package/templates/skills/efcore/references/troubleshooting.md +81 -0
  160. package/templates/skills/efcore/steps/db/step-deploy.md +1 -32
  161. package/templates/skills/efcore/steps/db/step-reset.md +7 -103
  162. package/templates/skills/efcore/steps/db/step-seed.md +10 -132
  163. package/templates/skills/efcore/steps/db/step-status.md +5 -44
  164. package/templates/skills/efcore/steps/migration/step-03-validate.md +8 -62
  165. package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +1 -57
  166. package/templates/skills/efcore/steps/shared/step-00-init.md +11 -254
  167. package/templates/skills/efcore/steps/squash/step-03-create.md +1 -58
  168. package/templates/skills/feature-full/SKILL.md +1 -1
  169. package/templates/skills/feature-full/steps/step-00-init.md +57 -0
  170. package/templates/skills/feature-full/steps/step-01-implementation.md +1 -1
  171. package/templates/skills/gitflow/SKILL.md +1 -1
  172. package/templates/skills/gitflow/_shared.md +23 -0
  173. package/templates/skills/gitflow/references/commit-message-generation.md +58 -0
  174. package/templates/skills/gitflow/references/commit-migration-validation.md +49 -0
  175. package/templates/skills/gitflow/references/finish-cleanup.md +51 -0
  176. package/templates/skills/gitflow/references/finish-version-bumping.md +45 -0
  177. package/templates/skills/gitflow/references/init-environment-detection.md +41 -0
  178. package/templates/skills/gitflow/references/init-questions.md +185 -0
  179. package/templates/skills/gitflow/references/init-structure-creation.md +71 -0
  180. package/templates/skills/gitflow/references/init-version-detection.md +21 -0
  181. package/templates/skills/gitflow/references/init-workspace-detection.md +43 -0
  182. package/templates/skills/gitflow/references/merge-ci-status.md +36 -0
  183. package/templates/skills/gitflow/references/merge-execution.md +62 -0
  184. package/templates/skills/gitflow/references/merge-pr-context.md +76 -0
  185. package/templates/skills/gitflow/references/pr-build-checks.md +60 -0
  186. package/templates/skills/gitflow/references/pr-generation.md +58 -0
  187. package/templates/skills/gitflow/references/start-branch-normalization.md +28 -0
  188. package/templates/skills/gitflow/references/start-worktree-creation.md +50 -0
  189. package/templates/skills/gitflow/references/sync-push-verify.md +44 -0
  190. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -0
  191. package/templates/skills/gitflow/steps/step-commit.md +12 -91
  192. package/templates/skills/gitflow/steps/step-finish.md +15 -159
  193. package/templates/skills/gitflow/steps/step-init.md +24 -326
  194. package/templates/skills/gitflow/steps/step-merge.md +17 -176
  195. package/templates/skills/gitflow/steps/step-pr.md +10 -116
  196. package/templates/skills/gitflow/steps/step-start.md +16 -109
  197. package/templates/skills/gitflow/steps/step-sync.md +6 -69
  198. package/templates/skills/ralph-loop/SKILL.md +6 -0
  199. package/templates/skills/ralph-loop/references/category-completeness.md +185 -0
  200. package/templates/skills/ralph-loop/references/compact-loop.md +1 -1
  201. package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -0
  202. package/templates/skills/ralph-loop/references/module-transition.md +151 -0
  203. package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -0
  204. package/templates/skills/ralph-loop/references/parallel-execution.md +246 -0
  205. package/templates/skills/ralph-loop/references/task-transform-legacy.md +6 -9
  206. package/templates/skills/ralph-loop/references/team-orchestration.md +45 -3
  207. package/templates/skills/ralph-loop/steps/step-00-init.md +36 -109
  208. package/templates/skills/ralph-loop/steps/step-01-task.md +15 -163
  209. package/templates/skills/ralph-loop/steps/step-02-execute.md +8 -154
  210. package/templates/skills/ralph-loop/steps/step-04-check.md +21 -73
  211. package/templates/skills/review-code/references/owasp-api-top10.md +5 -5
  212. package/templates/skills/review-code/references/smartstack-conventions.md +11 -11
  213. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -0
  214. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -0
  215. package/templates/skills/validate-feature/steps/step-01-compile.md +5 -2
  216. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +34 -145
  217. package/templates/skills/validate-feature/steps/step-05-db-validation.md +74 -260
  218. package/templates/skills/workflow/SKILL.md +1 -1
  219. package/templates/skills/workflow/steps/step-00-init.md +57 -0
@@ -0,0 +1,151 @@
1
+ # Planning — Layer Mapping, Skill Assignment, Parallelization Strategy
2
+
3
+ > **Loaded by:** step-02-plan.md (sections 1-4)
4
+ > **Purpose:** Map analyzed elements to layers, assign skills/MCP tools, and identify parallelization opportunities.
5
+
6
+ ---
7
+
8
+ ## Map Changes to Layers
9
+
10
+ For each element identified in step-01, assign to a SmartStack layer:
11
+
12
+ | Layer | Category | Order |
13
+ |-------|----------|-------|
14
+ | 0 | Domain (entities, enums, exceptions) | Sequential |
15
+ | 0 | Infrastructure - EF Configs | Sequential |
16
+ | 0 | Infrastructure - Migration (BLOCKING) | Sequential |
17
+ | 1 | Application (services, DTOs, validators) | Parallel |
18
+ | 1 | API (controllers) | Parallel |
19
+ | 1 | Infrastructure - Seed Data | Parallel |
20
+ | 2 | Frontend (pages, components) | Parallel |
21
+ | 2 | I18n (translations) | Parallel |
22
+ | 3 | Tests | Sequential |
23
+
24
+ ---
25
+
26
+ ## Entity Definition Template
27
+
28
+ Each entity in the plan MUST include:
29
+
30
+ ```yaml
31
+ Entity: {EntityName}
32
+ - tenantMode: strict | optional | scoped | none
33
+ - codePattern: auto-generated strategy (if applicable)
34
+ - fkFields: [{field, targetEntity}] (if applicable)
35
+ - acceptance criteria: [AC1, AC2, ...]
36
+ ```
37
+
38
+ The `tenantMode` decision (from step-01) drives:
39
+ - EF query filters
40
+ - Seed data approach
41
+ - API authorization
42
+
43
+ See `smartstack-layers.md` for tenant mode seed data strategies.
44
+
45
+ ---
46
+
47
+ ## Assign Skill/MCP per File
48
+
49
+ For EACH file in the plan, specify HOW it will be created/modified.
50
+
51
+ **Format:**
52
+
53
+ ```markdown
54
+ | # | File | Action | Tool |
55
+ |---|------|--------|------|
56
+ | 1 | Domain/Entities/.../MyEntity.cs | create | MCP scaffold_extension |
57
+ | 2 | Infrastructure/.../MyEntityConfiguration.cs | create | MCP scaffold_extension |
58
+ | 3 | Migration | create | MCP suggest_migration + dotnet ef |
59
+ ```
60
+
61
+ ---
62
+
63
+ ## Layer 0 — Domain + Infrastructure (sequential)
64
+
65
+ | # | File | Action | Tool |
66
+ |---|------|--------|------|
67
+ | 1 | Domain/Entities/.../Entity.cs | create | MCP scaffold_extension |
68
+ | 2 | Infrastructure/.../EntityConfiguration.cs | create | MCP scaffold_extension |
69
+ | 3 | Infrastructure/Migrations/ | create | MCP suggest_migration + dotnet ef |
70
+
71
+ ---
72
+
73
+ ## Layer 1 — Application + API + Seed Data (parallel)
74
+
75
+ **Backend:** Application/API/Seed Data
76
+
77
+ | # | File | Action | Tool |
78
+ |---|------|--------|------|
79
+ | 4 | Application/Services/.../Service.cs | create | MCP scaffold_extension |
80
+ | 5 | Application/DTOs/.../Dto.cs | create | MCP scaffold_extension |
81
+ | 6 | Api/Controllers/.../Controller.cs | create | /controller skill or MCP scaffold_extension |
82
+ | 7 | Seeding/Data/NavigationApplicationSeedData.cs | create | Reference smartstack-layers.md (once per app) |
83
+ | 7b | Seeding/Data/ApplicationRolesSeedData.cs | create | Reference smartstack-layers.md (once per app) |
84
+ | 7c | Infrastructure/Services/CodeGeneration/ | create | Reference code-generation.md (per entity with codePattern != manual) |
85
+ | 8 | Seeding/Data/.../NavigationModuleSeedData.cs | create | Reference core-seed-data.md (4 langs: fr, en, it, de) |
86
+ | 8c | ↳ (same file) Section methods | add | Reference core-seed-data.md §2b (if sections exist) |
87
+ | 8d | ↳ (same file) Resource methods | add | Reference core-seed-data.md §2b (if resources exist) |
88
+ | 8b | Application/Authorization/Permissions.cs | create | MCP generate_permissions |
89
+ | 9 | Seeding/Data/.../PermissionsSeedData.cs | create | MCP generate_permissions |
90
+ | 10 | Seeding/Data/.../RolesSeedData.cs | create | Reference smartstack-layers.md |
91
+ | 10b | Seeding/{App}SeedDataProvider.cs | create | Reference core-seed-data.md (IClientSeedDataProvider + DI) |
92
+
93
+ **Frontend:** API Client, Routes, Pages, I18n
94
+
95
+ | # | File | Action | Tool |
96
+ |---|------|--------|------|
97
+ | 11 | src/pages/{App}/{Mod}/ListPage.tsx | create | /ui-components skill |
98
+ | 11b | src/pages/{App}/{Mod}/CreatePage.tsx | create | /ui-components skill (FK: EntityLookup) |
99
+ | 11c | src/pages/{App}/{Mod}/EditPage.tsx | create | /ui-components skill (FK: EntityLookup) |
100
+ | 11d | src/pages/{App}/{Mod}/{Section}Page.tsx | create | /ui-components skill (per section in `{sections}`) |
101
+ | 11e | src/pages/{App}/{Mod}/{Section}DetailPage.tsx | create | /ui-components skill (per section) |
102
+ | 12 | src/services/api/{module}Api.ts | create | MCP scaffold_api_client |
103
+ | 13 | src/routes/{module}.tsx | create | MCP scaffold_routes |
104
+ | 14 | src/i18n/locales/{lang}/{module}.json | create | Reference smartstack-frontend.md (4 languages) |
105
+
106
+ **FK Field Guidance:** If step-01 identified `fkFields[]`, every Create/Edit page MUST use `EntityLookup` for those fields (see `smartstack-frontend.md` section 6). The corresponding backend GetAll endpoints (Layer 1) MUST support `?search=` parameter.
107
+
108
+ ---
109
+
110
+ ## Layer 2b — Documentation (after frontend pages exist)
111
+
112
+ | # | File | Action | Tool |
113
+ |---|------|--------|------|
114
+ | 14b | src/pages/docs/business/{app}/{module}/doc-data.ts | create | /documentation skill |
115
+ | 14c | src/pages/docs/business/{app}/{module}/index.tsx | create | /documentation skill |
116
+
117
+ ---
118
+
119
+ ## Layer 3 — Tests (sequential)
120
+
121
+ | # | File | Action | Tool |
122
+ |---|------|--------|------|
123
+ | 15 | tests/.../EntityTests.cs | create | MCP scaffold_tests |
124
+ | 16 | tests/.../ServiceTests.cs | create | MCP scaffold_tests |
125
+
126
+ ---
127
+
128
+ ## Identify Parallelization (Agent Teams)
129
+
130
+ If NOT economy_mode AND Layer 1 has both backend and frontend work:
131
+
132
+ **Create agent teams to execute Layer 1 backend and frontend in parallel.**
133
+
134
+ See `references/agent-teams-protocol.md` for team creation, teammate spawning, task coordination, and shutdown procedures.
135
+
136
+ ---
137
+
138
+ ## Delegate Mode Fast Path
139
+
140
+ When `/ralph-loop` invokes `/apex -d {prd_path}`, PRD tasks already define the scope:
141
+
142
+ Map each PRD task to a layer based on `task.category`:
143
+ - `domain` → Layer 0
144
+ - `infrastructure` → Layer 0
145
+ - `application` → Layer 1
146
+ - `api` → Layer 1
147
+ - `seedData` → Layer 1
148
+ - `frontend` → Layer 2
149
+ - `test` → Layer 3
150
+
151
+ For each task: infer file_path, action, and tool from category. SKIP user checkpoint. Jump to "Estimated Commits" section.
@@ -14,7 +14,7 @@ if [ -n "$SEED_FILES" ]; then
14
14
  if [ -n "$BAD_ROUTES" ]; then
15
15
  echo "BLOCKING: Navigation routes must be full paths starting with /"
16
16
  echo "$BAD_ROUTES"
17
- echo "Expected: \"/business/human-resources\" NOT \"humanresources\""
17
+ echo "Expected: \"/human-resources\" NOT \"humanresources\""
18
18
  exit 1
19
19
  fi
20
20
  fi
@@ -512,35 +512,7 @@ if [ -n "$CREATE_VALIDATORS" ]; then
512
512
  fi
513
513
  ```
514
514
 
515
- ### POST-CHECK 19: SeedConstants must NOT contain ContextId (pre-seeded by SmartStack core)
516
-
517
- ```bash
518
- # NavigationContext IDs (business, platform, personal) are pre-seeded by SmartStack core
519
- # with hardcoded GUIDs. Client code MUST look them up by code at runtime, NEVER generate them.
520
- SEED_CONST_FILES=$(find src/ -path "*/Seeding/*" -name "SeedConstants.cs" 2>/dev/null)
521
- SEED_ALL_FILES=$(find src/ -path "*/Seeding/Data/*" -name "*.cs" 2>/dev/null)
522
- if [ -n "$SEED_CONST_FILES" ]; then
523
- BAD_CONTEXT_ID=$(grep -Pn 'ContextId\s*=' $SEED_CONST_FILES 2>/dev/null)
524
- if [ -n "$BAD_CONTEXT_ID" ]; then
525
- echo "BLOCKING: SeedConstants must NOT contain a ContextId constant"
526
- echo "NavigationContext IDs are pre-seeded by SmartStack core with hardcoded GUIDs"
527
- echo "Fix: Remove ContextId from SeedConstants. In SeedDataProvider, query:"
528
- echo " var ctx = await db.NavigationContexts.FirstOrDefaultAsync(c => c.Code == \"business\", ct);"
529
- echo "$BAD_CONTEXT_ID"
530
- exit 1
531
- fi
532
- fi
533
- if [ -n "$SEED_ALL_FILES" ]; then
534
- BAD_CTX_GUID=$(grep -Pn 'DeterministicGuid\("nav:(business|platform|personal)"\)' $SEED_ALL_FILES 2>/dev/null)
535
- if [ -n "$BAD_CTX_GUID" ]; then
536
- echo "BLOCKING: Deterministic GUID for NavigationContext detected"
537
- echo "Context IDs (business, platform, personal) are pre-seeded by SmartStack core"
538
- echo "Fix: Look up context by code at runtime in SeedDataProvider.SeedNavigationAsync()"
539
- echo "$BAD_CTX_GUID"
540
- exit 1
541
- fi
542
- fi
543
- ```
515
+ ### POST-CHECK 19: (REMOVED Context level no longer exists in SmartStack navigation hierarchy)
544
516
 
545
517
  ### POST-CHECK 20: RolePermission seed data must NOT use deterministic role GUIDs
546
518
 
@@ -764,12 +736,12 @@ if [ -n "$PERM_FILES" ]; then
764
736
  PATH_VAL=$(echo "$line" | grep -oP '"[^"]*\.[^"]*"' | tr -d '"')
765
737
  if [ -n "$PATH_VAL" ]; then
766
738
  DOTS=$(echo "$PATH_VAL" | tr -cd '.' | wc -c)
767
- # Module permissions: 3 dots (context.app.module.action = 4 segments = 3+1)
768
- # Section permissions: 4 dots (context.app.module.section.action = 5 segments = 4+1)
739
+ # Module permissions: 2 dots (app.module.action = 3 segments = 2+1)
740
+ # Section permissions: 3 dots (app.module.section.action = 4 segments = 3+1)
769
741
  # Wildcard: ends with .* (valid at any level)
770
742
  if echo "$PATH_VAL" | grep -qP '\.\*$'; then
771
743
  continue # Wildcards are valid
772
- elif [ "$DOTS" -lt 3 ] || [ "$DOTS" -gt 5 ]; then
744
+ elif [ "$DOTS" -lt 2 ] || [ "$DOTS" -gt 4 ]; then
773
745
  echo "WARNING: Permission path has unexpected segment count ($((DOTS+1)) segments): $PATH_VAL"
774
746
  fi
775
747
  fi
@@ -1072,7 +1044,7 @@ fi
1072
1044
  ```bash
1073
1045
  # NavRoute segments are navigation entity Codes joined by dots.
1074
1046
  # Multi-word codes MUST use kebab-case (e.g., "human-resources", NOT "humanresources").
1075
- # Verified from SmartStack.app: "business.support-client.my-tickets", "platform.administration.access-requests"
1047
+ # Verified from SmartStack.app: "support-client.my-tickets", "administration.access-requests"
1076
1048
  CTRL_FILES=$(find src/ -path "*/Controllers/*" -name "*Controller.cs" 2>/dev/null)
1077
1049
  if [ -n "$CTRL_FILES" ]; then
1078
1050
  for f in $CTRL_FILES; do
@@ -1084,7 +1056,7 @@ if [ -n "$CTRL_FILES" ]; then
1084
1056
  echo "BLOCKING: NavRoute segment '$SEG' in $f appears to be concatenated multi-word without hyphens"
1085
1057
  echo " Full NavRoute: $NAVROUTE_VAL"
1086
1058
  echo " Fix: Use kebab-case: e.g., 'humanresources' → 'human-resources'"
1087
- echo " SmartStack convention (from SmartStack.app): 'business.support-client.my-tickets'"
1059
+ echo " SmartStack convention (from SmartStack.app): 'support-client.my-tickets'"
1088
1060
  exit 1
1089
1061
  fi
1090
1062
  done
@@ -1110,8 +1082,8 @@ fi
1110
1082
 
1111
1083
  ```bash
1112
1084
  # Permission codes in [RequirePermission] and Permissions.cs MUST use kebab-case for multi-word segments.
1113
- # SmartStack.app convention: "business.support-client.my-tickets.read" (kebab-case everywhere)
1114
- # FORBIDDEN: "business.humanresources.employees.read" — must be "business.human-resources.employees.read"
1085
+ # SmartStack.app convention: "support-client.my-tickets.read" (kebab-case everywhere)
1086
+ # FORBIDDEN: "humanresources.employees.read" — must be "human-resources.employees.read"
1115
1087
 
1116
1088
  # Check [RequirePermission] attributes in controllers
1117
1089
  CTRL_FILES=$(find src/ -path "*/Controllers/*" -name "*Controller.cs" 2>/dev/null)
@@ -1126,7 +1098,7 @@ if [ -n "$CTRL_FILES" ]; then
1126
1098
  echo "BLOCKING: Permission code segment '$SEG' in $f appears concatenated without hyphens"
1127
1099
  echo " Full permission: $PERM"
1128
1100
  echo " Fix: Use kebab-case: e.g., 'humanresources' → 'human-resources'"
1129
- echo " SmartStack convention: 'business.support-client.my-tickets.read'"
1101
+ echo " SmartStack convention: 'support-client.my-tickets.read'"
1130
1102
  exit 1
1131
1103
  fi
1132
1104
  done
@@ -1378,8 +1350,8 @@ fi
1378
1350
  ### POST-CHECK 48: NavRoute attribute values must use kebab-case (BLOCKING)
1379
1351
 
1380
1352
  ```bash
1381
- # Root cause (test-apex-007): Controllers had [NavRoute("business.humanresources.employees")]
1382
- # instead of [NavRoute("business.human-resources.employees")]. This causes route mismatch with
1353
+ # Root cause (test-apex-007): Controllers had [NavRoute("humanresources.employees")]
1354
+ # instead of [NavRoute("human-resources.employees")]. This causes route mismatch with
1383
1355
  # seed data and permission codes, resulting in 404s at runtime.
1384
1356
  CTRL_FILES=$(find src/ -path "*/Controllers/*" -name "*Controller.cs" 2>/dev/null)
1385
1357
  if [ -n "$CTRL_FILES" ]; then
@@ -1476,4 +1448,137 @@ if [ -n "$CTRL_FILES" ]; then
1476
1448
  fi
1477
1449
  ```
1478
1450
 
1451
+ ### POST-CHECK 51: RolesSeedData must map standard role-permission matrix (BLOCKING)
1452
+
1453
+ ```bash
1454
+ # SmartStack standard role-permission matrix:
1455
+ # Admin = wildcard (*) — full access
1456
+ # Manager = CRU (read + create + update) — no delete
1457
+ # Contributor = CR (read + create) — no update, no delete
1458
+ # Viewer = R (read only)
1459
+ # If RolesSeedData deviates from this matrix, the RBAC model is broken.
1460
+ ROLE_SEED_FILES=$(find src/ -path "*/Seeding/Data/*" -name "*RolesSeedData.cs" ! -name "ApplicationRolesSeedData.cs" 2>/dev/null)
1461
+ if [ -n "$ROLE_SEED_FILES" ]; then
1462
+ FAIL=false
1463
+ for f in $ROLE_SEED_FILES; do
1464
+ # Skip ApplicationRolesSeedData (defines roles, not mappings)
1465
+ BASENAME=$(basename "$f")
1466
+ if [ "$BASENAME" = "ApplicationRolesSeedData.cs" ]; then continue; fi
1467
+
1468
+ # Check Admin has wildcard
1469
+ HAS_ADMIN_WILDCARD=$(grep -Pc '(admin|Admin).*\*' "$f" 2>/dev/null)
1470
+ if [ "$HAS_ADMIN_WILDCARD" -eq 0 ]; then
1471
+ # Also accept .Access or wildcard pattern
1472
+ HAS_ADMIN_ACCESS=$(grep -Pc '(admin|Admin).*(Access|Wildcard|IsWildcard)' "$f" 2>/dev/null)
1473
+ if [ "$HAS_ADMIN_ACCESS" -eq 0 ]; then
1474
+ echo "BLOCKING: Admin role missing wildcard (*) permission in $f"
1475
+ echo "Fix: Admin must map to wildcard permission (navRoute.*) or use IsWildcard=true"
1476
+ FAIL=true
1477
+ fi
1478
+ fi
1479
+
1480
+ # Check Viewer has NO delete/create/update
1481
+ VIEWER_WRITE=$(grep -Pc '(viewer|Viewer).*(\.delete|\.create|\.update|Delete|Create|Update)' "$f" 2>/dev/null)
1482
+ if [ "$VIEWER_WRITE" -gt 0 ]; then
1483
+ echo "BLOCKING: Viewer role has write permissions (create/update/delete) in $f"
1484
+ echo "Fix: Viewer must only have read permission. Remove create/update/delete mappings."
1485
+ FAIL=true
1486
+ fi
1487
+
1488
+ # Check Manager has NO delete
1489
+ MANAGER_DELETE=$(grep -Pc '(manager|Manager).*(\.delete|Delete)' "$f" 2>/dev/null)
1490
+ if [ "$MANAGER_DELETE" -gt 0 ]; then
1491
+ echo "WARNING: Manager role has delete permission in $f"
1492
+ echo "SmartStack standard: Manager = CRU (no delete). Verify this is intentional."
1493
+ fi
1494
+ done
1495
+ if [ "$FAIL" = true ]; then
1496
+ exit 1
1497
+ fi
1498
+ fi
1499
+ ```
1500
+
1501
+ ### POST-CHECK 52: PermissionAction enum must use valid typed values only (BLOCKING)
1502
+
1503
+ ```bash
1504
+ # Valid PermissionAction enum values: Access(0), Read(1), Create(2), Update(3), Delete(4),
1505
+ # Export(5), Import(6), Approve(7), Reject(8), Assign(9), Execute(10)
1506
+ # FORBIDDEN: Enum.Parse<PermissionAction>("...") — runtime crash if value doesn't exist
1507
+ # FORBIDDEN: (PermissionAction)99 or any cast beyond 0-10
1508
+ SEED_FILES=$(find src/ -path "*/Seeding/Data/*" -name "*.cs" 2>/dev/null)
1509
+ if [ -n "$SEED_FILES" ]; then
1510
+ FAIL=false
1511
+ for f in $SEED_FILES; do
1512
+ # Check for Enum.Parse<PermissionAction> usage
1513
+ ENUM_PARSE=$(grep -Pn 'Enum\.Parse<PermissionAction>' "$f" 2>/dev/null)
1514
+ if [ -n "$ENUM_PARSE" ]; then
1515
+ echo "BLOCKING: Enum.Parse<PermissionAction> detected — runtime crash risk: $f"
1516
+ echo "$ENUM_PARSE"
1517
+ echo "Fix: Use typed enum directly: PermissionAction.Read (NOT Enum.Parse<PermissionAction>(\"Read\"))"
1518
+ FAIL=true
1519
+ fi
1520
+
1521
+ # Check for invalid cast values (PermissionAction)N where N > 10
1522
+ INVALID_CAST=$(grep -Pn '\(PermissionAction\)\s*([1-9]\d{1,}|[2-9]\d)' "$f" 2>/dev/null)
1523
+ if [ -n "$INVALID_CAST" ]; then
1524
+ echo "BLOCKING: Invalid PermissionAction cast detected (value > 10): $f"
1525
+ echo "$INVALID_CAST"
1526
+ echo "Valid values: Access(0), Read(1), Create(2), Update(3), Delete(4), Export(5), Import(6), Approve(7), Reject(8), Assign(9), Execute(10)"
1527
+ FAIL=true
1528
+ fi
1529
+ done
1530
+ if [ "$FAIL" = true ]; then
1531
+ exit 1
1532
+ fi
1533
+ fi
1534
+ ```
1535
+
1536
+ ### POST-CHECK 53: Navigation translation completeness — 4 languages per level (BLOCKING)
1537
+
1538
+ ```bash
1539
+ # Every navigation seed data file must provide translations for ALL 4 languages (fr, en, it, de).
1540
+ # If sections exist (GetSectionEntries), GetSectionTranslationEntries MUST also exist.
1541
+ # If resources exist (GetResourceEntries), resource translation entries MUST also exist.
1542
+ NAV_SEED_FILES=$(find src/ -path "*/Seeding/Data/*" -name "*NavigationSeedData.cs" ! -name "*Application*" 2>/dev/null)
1543
+ if [ -n "$NAV_SEED_FILES" ]; then
1544
+ FAIL=false
1545
+ for f in $NAV_SEED_FILES; do
1546
+ # Check module translations have all 4 languages
1547
+ LANG_COUNT=$(grep -c 'LanguageCode\s*=' "$f" 2>/dev/null)
1548
+ HAS_FR=$(grep -c '"fr"' "$f" 2>/dev/null)
1549
+ HAS_EN=$(grep -c '"en"' "$f" 2>/dev/null)
1550
+ HAS_IT=$(grep -c '"it"' "$f" 2>/dev/null)
1551
+ HAS_DE=$(grep -c '"de"' "$f" 2>/dev/null)
1552
+
1553
+ if [ "$HAS_FR" -eq 0 ] || [ "$HAS_EN" -eq 0 ] || [ "$HAS_IT" -eq 0 ] || [ "$HAS_DE" -eq 0 ]; then
1554
+ echo "BLOCKING: Missing language(s) in navigation translations: $f"
1555
+ echo " fr=$HAS_FR, en=$HAS_EN, it=$HAS_IT, de=$HAS_DE (all must be > 0)"
1556
+ echo "Fix: Add NavigationTranslationSeedEntry for all 4 languages (fr, en, it, de)"
1557
+ FAIL=true
1558
+ fi
1559
+
1560
+ # If sections exist, section translations MUST exist
1561
+ HAS_SECTION_ENTRIES=$(grep -c 'GetSectionEntries' "$f" 2>/dev/null)
1562
+ HAS_SECTION_TRANSLATIONS=$(grep -c 'GetSectionTranslationEntries' "$f" 2>/dev/null)
1563
+ if [ "$HAS_SECTION_ENTRIES" -gt 0 ] && [ "$HAS_SECTION_TRANSLATIONS" -eq 0 ]; then
1564
+ echo "BLOCKING: Sections defined but GetSectionTranslationEntries() missing: $f"
1565
+ echo "Fix: Add GetSectionTranslationEntries() with 4 languages per section (ref core-seed-data.md §2b)"
1566
+ FAIL=true
1567
+ fi
1568
+
1569
+ # If resources exist, resource translations MUST exist
1570
+ HAS_RESOURCE_ENTRIES=$(grep -c 'GetResourceEntries' "$f" 2>/dev/null)
1571
+ HAS_RESOURCE_TRANSLATIONS=$(grep -Pc 'ResourceTranslation|GetResourceTranslation|NavigationEntityType\.Resource.*LanguageCode' "$f" 2>/dev/null)
1572
+ if [ "$HAS_RESOURCE_ENTRIES" -gt 0 ] && [ "$HAS_RESOURCE_TRANSLATIONS" -eq 0 ]; then
1573
+ echo "BLOCKING: Resources defined but resource translations missing: $f"
1574
+ echo "Fix: Add resource translation entries with 4 languages per resource (ref core-seed-data.md §2b)"
1575
+ FAIL=true
1576
+ fi
1577
+ done
1578
+ if [ "$FAIL" = true ]; then
1579
+ exit 1
1580
+ fi
1581
+ fi
1582
+ ```
1583
+
1479
1584
  **If ANY POST-CHECK fails → fix in step-03, re-validate.**
@@ -79,7 +79,7 @@ public enum EntityScope
79
79
  ```csharp
80
80
  using SmartStack.Domain.Common;
81
81
 
82
- namespace {ProjectName}.Domain.Entities.{Context}.{App}.{Module};
82
+ namespace {ProjectName}.Domain.Entities.{App}.{Module};
83
83
 
84
84
  public class {Name} : BaseEntity, ITenantEntity, IAuditableEntity
85
85
  {
@@ -299,7 +299,7 @@ using SmartStack.Application.Common.Interfaces.Identity;
299
299
  using SmartStack.Application.Common.Interfaces.Tenants;
300
300
  using SmartStack.Application.Common.Interfaces.Persistence;
301
301
 
302
- namespace {ProjectName}.Infrastructure.Services.{Context}.{App}.{Module};
302
+ namespace {ProjectName}.Infrastructure.Services.{App}.{Module};
303
303
 
304
304
  public class {Name}Service : I{Name}Service
305
305
  {
@@ -432,10 +432,10 @@ using Microsoft.AspNetCore.Mvc;
432
432
  using SmartStack.Api.Routing;
433
433
  using SmartStack.Api.Authorization;
434
434
 
435
- namespace {ProjectName}.Api.Controllers.{Context}.{App};
435
+ namespace {ProjectName}.Api.Controllers.{App};
436
436
 
437
437
  [ApiController]
438
- [NavRoute("{context}.{app}.{module}")]
438
+ [NavRoute("{app}.{module}")]
439
439
  [Authorize]
440
440
  public class {Name}Controller : ControllerBase
441
441
  {
@@ -500,10 +500,10 @@ public class {Name}Controller : ControllerBase
500
500
  **CRITICAL:** Use `[RequirePermission(Permissions.{Module}.{Action})]` on EVERY endpoint — NEVER `[Authorize]` alone (no RBAC enforcement).
501
501
 
502
502
  **CRITICAL — Permission paths use IDENTICAL segments to NavRoute codes (kebab-case):**
503
- - NavRoute: `business.human-resources.employees` → Permission: `business.human-resources.employees.read`
504
- - NavRoute: `business.human-resources.employees.leaves` → Permission: `business.human-resources.employees.leaves.read`
505
- - FORBIDDEN: `business.humanresources.employees.read` (no kebab-case — mismatches NavRoute)
506
- - SmartStack.app convention: `business.support-client.my-tickets.read` (always kebab-case)
503
+ - NavRoute: `human-resources.employees` → Permission: `human-resources.employees.read`
504
+ - NavRoute: `human-resources.employees.leaves` → Permission: `human-resources.employees.leaves.read`
505
+ - FORBIDDEN: `humanresources.employees.read` (no kebab-case — mismatches NavRoute)
506
+ - SmartStack.app convention: `support-client.my-tickets.read` (always kebab-case)
507
507
 
508
508
  ### Section-Level Controller (NavRoute with 4 segments)
509
509
 
@@ -512,11 +512,11 @@ When a module has sections, each section gets its own controller with a 4-segmen
512
512
  ```csharp
513
513
  // Section-level controller: navRoute has 4 segments
514
514
  [ApiController]
515
- [NavRoute("{context}.{app}.{module}.{section}")]
515
+ [NavRoute("{app}.{module}.{section}")]
516
516
  [Authorize]
517
517
  public class {Section}Controller : ControllerBase
518
518
  {
519
- // Example: business.human-resources.employees.departments
519
+ // Example: human-resources.employees.departments
520
520
  [HttpGet]
521
521
  [RequirePermission(Permissions.{Section}.Read)]
522
522
  public async Task<ActionResult<PaginatedResult<{Section}ResponseDto>>> GetAll(
@@ -531,12 +531,12 @@ public class {Section}Controller : ControllerBase
531
531
  **NavRoute segment rules:**
532
532
  | Level | NavRoute format | Example |
533
533
  |-------|----------------|---------|
534
- | Module | `{context}.{app}.{module}` (3 segments) | `business.human-resources.employees` |
535
- | Section | `{context}.{app}.{module}.{section}` (4 segments) | `business.human-resources.employees.departments` |
534
+ | Module | `{app}.{module}` (2 segments) | `human-resources.employees` |
535
+ | Section | `{app}.{module}.{section}` (3 segments) | `human-resources.employees.departments` |
536
536
 
537
537
  **Namespace:** `SmartStack.Api.Routing` (NOT `SmartStack.Api.Core.Routing`)
538
538
 
539
- **NavRoute resolves at startup from DB:** `platform.administration.users` → `api/platform/administration/users`
539
+ **NavRoute resolves at startup from DB:** `administration.users` → `api/administration/users`
540
540
 
541
541
  ### Sub-Resource Pattern (NavRoute Suffix)
542
542
 
@@ -545,7 +545,7 @@ When an entity is a child of another entity (e.g., LeaveTypes under Leaves), use
545
545
  ```csharp
546
546
  // Sub-resource controller: types are nested under leaves
547
547
  [ApiController]
548
- [NavRoute("business.human-resources.employees.leaves", Suffix = "types")]
548
+ [NavRoute("human-resources.employees.leaves", Suffix = "types")]
549
549
  [Authorize]
550
550
  public class LeaveTypesController : ControllerBase
551
551
  {
@@ -582,22 +582,22 @@ public async Task<ActionResult<PaginatedResult<LeaveTypeResponseDto>>> GetAllLea
582
582
 
583
583
  | Level | Route Format | Example |
584
584
  |-------|-------------|---------|
585
- | Application | `/{context}/{app-kebab}` | `/business/human-resources` |
586
- | Module | `/{context}/{app-kebab}/{module-kebab}` | `/business/human-resources/employees` |
587
- | Section | `/{context}/{app-kebab}/{module-kebab}/{section-kebab}` | `/business/human-resources/employees/departments` |
588
- | Resource | `/{context}/{app-kebab}/{module-kebab}/{section-kebab}/{resource-kebab}` | `/business/human-resources/employees/departments/export` |
585
+ | Application | `/{app-kebab}` | `/human-resources` |
586
+ | Module | `/{app-kebab}/{module-kebab}` | `/human-resources/employees` |
587
+ | Section | `/{app-kebab}/{module-kebab}/{section-kebab}` | `/human-resources/employees/departments` |
588
+ | Resource | `/{app-kebab}/{module-kebab}/{section-kebab}/{resource-kebab}` | `/human-resources/employees/departments/export` |
589
589
 
590
590
  **ROUTE SPECIAL CASES (list and detail sections):**
591
591
  > The `list` and `detail` sections are NOT functional sub-areas — they are view modes of the module itself.
592
592
  > Their navigation routes MUST NOT add extra segments:
593
- > - `list` section route = module route (e.g., `/business/human-resources/employees`)
594
- > - `detail` section route = module route + `/:id` (e.g., `/business/human-resources/employees/:id`)
593
+ > - `list` section route = module route (e.g., `/human-resources/employees`)
594
+ > - `detail` section route = module route + `/:id` (e.g., `/human-resources/employees/:id`)
595
595
  > - FORBIDDEN: `/employees/list`, `/employees/detail/:id`
596
596
  > - Other sections (dashboard, approve, import, etc.) = module route + `/{section-kebab}` (normal behavior)
597
597
 
598
598
  **Rules:**
599
599
  - Routes ALWAYS start with `/`
600
- - Routes ALWAYS include the full hierarchy from context to current level
600
+ - Routes ALWAYS include the full hierarchy from application to current level
601
601
  - Routes ALWAYS use kebab-case (NOT PascalCase, NOT camelCase)
602
602
  - Code identifiers stay PascalCase in C# (`HumanResources`) but routes are kebab-case (`human-resources`)
603
603
 
@@ -612,24 +612,14 @@ private static string ToKebabCase(string value)
612
612
 
613
613
  ### SeedConstants Pattern
614
614
 
615
- > **CRITICAL — NavigationContext IDs are NEVER generated.**
616
- > Contexts (`business`, `platform`, `personal`) are pre-seeded by SmartStack core with hardcoded GUIDs.
617
- > You MUST query the context by code at runtime in the SeedDataProvider:
618
- > `var ctx = await db.NavigationContexts.FirstOrDefaultAsync(c => c.Code == "business", ct);`
619
- > **FORBIDDEN:** `DeterministicGuid("nav:business")` or any ContextId constant in SeedConstants.
620
-
621
615
  ```csharp
622
616
  public static class SeedConstants
623
617
  {
624
618
  // Deterministic GUIDs (SHA256-based, reproducible across environments)
625
619
  // NOTE: Application/Module/Section/Resource IDs are deterministic.
626
- // Context IDs are NOT they are pre-seeded by SmartStack core.
627
- public static readonly Guid ApplicationId = DeterministicGuid("nav:business.human-resources");
628
- public static readonly Guid ModuleId = DeterministicGuid("nav:business.human-resources.employees");
629
- public static readonly Guid SectionId = DeterministicGuid("nav:business.human-resources.employees.departments");
630
-
631
- // FORBIDDEN — Context IDs are NOT deterministic, they come from SmartStack core:
632
- // public static readonly Guid BusinessContextId = DeterministicGuid("nav:business"); // WRONG!
620
+ public static readonly Guid ApplicationId = DeterministicGuid("nav:human-resources");
621
+ public static readonly Guid ModuleId = DeterministicGuid("nav:human-resources.employees");
622
+ public static readonly Guid SectionId = DeterministicGuid("nav:human-resources.employees.departments");
633
623
 
634
624
  private static Guid DeterministicGuid(string input)
635
625
  {
@@ -647,30 +637,25 @@ public static class SeedConstants
647
637
  ### Navigation Seed Data Example
648
638
 
649
639
  ```csharp
650
- // CRITICAL: Look up the context by code — NEVER use a hardcoded/deterministic GUID
651
- var businessCtx = await db.NavigationContexts
652
- .FirstOrDefaultAsync(c => c.Code == "business", ct);
653
- if (businessCtx == null) return; // Context not yet seeded by SmartStack core
654
-
655
- // Application: /business/human-resources
640
+ // Application: /human-resources
656
641
  var app = NavigationApplication.Create(
657
- businessCtx.Id, "human-resources", "Human Resources", "HR Management",
642
+ "human-resources", "Human Resources", "HR Management",
658
643
  "Users", IconType.Lucide,
659
- "/business/human-resources", // FULL PATH — starts with /, kebab-case
644
+ "/human-resources", // FULL PATH — starts with /, kebab-case
660
645
  10);
661
646
 
662
- // Module: /business/human-resources/employees
647
+ // Module: /human-resources/employees
663
648
  var module = NavigationModule.Create(
664
649
  app.Id, "employees", "Employees", "Employee management",
665
650
  "UserCheck", IconType.Lucide,
666
- "/business/human-resources/employees", // FULL PATH — includes parent
651
+ "/human-resources/employees", // FULL PATH — includes parent
667
652
  10);
668
653
 
669
- // Section: /business/human-resources/employees/departments
654
+ // Section: /human-resources/employees/departments
670
655
  var section = NavigationSection.Create(
671
656
  module.Id, "departments", "Departments", "Manage departments",
672
657
  "Building2", IconType.Lucide,
673
- "/business/human-resources/employees/departments", // FULL PATH
658
+ "/human-resources/employees/departments", // FULL PATH
674
659
  10);
675
660
  ```
676
661
 
@@ -678,10 +663,9 @@ var section = NavigationSection.Create(
678
663
 
679
664
  | Mistake | Reality |
680
665
  |---------|---------|
681
- | `"humanresources"` as route | Must be `"/business/human-resources"` (full path, kebab-case) |
682
- | `"employees"` as route | Must be `"/business/human-resources/employees"` (includes parent) |
666
+ | `"humanresources"` as route | Must be `"/human-resources"` (full path, kebab-case) |
667
+ | `"employees"` as route | Must be `"/human-resources/employees"` (includes parent) |
683
668
  | `Guid.NewGuid()` in seed data | Must use deterministic GUIDs (SHA256) |
684
- | `DeterministicGuid("nav:business")` for ContextId | Context IDs are pre-seeded by SmartStack core — look up by code |
685
669
  | Missing translations | Must have 4 languages: fr, en, it, de |
686
670
  | Missing NavigationApplicationSeedData | Menu invisible without Application level |
687
671
 
@@ -747,9 +731,9 @@ services.AddValidatorsFromAssemblyContaining<Create{Name}DtoValidator>();
747
731
  | `ICurrentUser` in service code | Does NOT exist — use `ICurrentUserService` + `ICurrentTenantService` |
748
732
  | `_currentTenant.TenantId!.Value` | Crashes with 500 — use `?? throw new TenantContextRequiredException()` |
749
733
  | `UnauthorizedAccessException("Tenant context is required")` | Returns 401 → clears frontend token. Use `TenantContextRequiredException()` (400) |
750
- | Route `"humanresources"` in seed data | Must be full path `"/business/human-resources"` |
734
+ | Route `"humanresources"` in seed data | Must be full path `"/human-resources"` |
751
735
  | Route without leading `/` | All routes must start with `/` |
752
- | `business.humanresources.employees.read` in permissions | Permission segments MUST match NavRoute kebab-case: `business.human-resources.employees.read` |
736
+ | `humanresources.employees.read` in permissions | Permission segments MUST match NavRoute kebab-case: `human-resources.employees.read` |
753
737
  | `Permission.Create()` | Does NOT exist — use `CreateForModule()`, `CreateForSection()`, etc. |
754
738
  | `GetAllAsync()` without search param | ALL GetAll endpoints MUST support `?search=` for EntityLookup |
755
739
  | `string Date` in DTO | Date-only fields MUST use `DateOnly`, NEVER `string` |