@atlashub/smartstack-cli 2.6.3 → 2.7.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/agents.html +1 -1
- package/.documentation/apex.html +1 -1
- package/.documentation/business-analyse.html +749 -1419
- package/.documentation/cli-commands.html +1 -1
- package/.documentation/commands.html +1 -1
- package/.documentation/css/styles.css +160 -0
- package/.documentation/efcore.html +1 -1
- package/.documentation/gitflow.html +3 -453
- package/.documentation/hooks.html +1 -1
- package/.documentation/index.html +177 -68
- package/.documentation/init.html +747 -290
- package/.documentation/installation.html +63 -8
- package/.documentation/ralph-loop.html +1 -1
- package/.documentation/test-web.html +1 -1
- package/dist/index.js +534 -294
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/agents/ba-reader.md +23 -0
- package/templates/agents/ba-writer.md +63 -4
- package/templates/skills/business-analyse/questionnaire/00-application.md +1 -1
- package/templates/skills/business-analyse/questionnaire/03-scope.md +2 -2
- package/templates/skills/business-analyse/questionnaire.md +1 -1
- package/templates/skills/business-analyse/react/application-viewer.md +1 -1
- package/templates/skills/business-analyse/react/schema.md +88 -1
- package/templates/skills/business-analyse/schemas/application-schema.json +16 -1
- package/templates/skills/business-analyse/schemas/feature-schema.json +19 -986
- package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +157 -0
- package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +82 -0
- package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +80 -0
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +69 -0
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +445 -0
- package/templates/skills/business-analyse/schemas/sections/validation-schema.json +93 -0
- package/templates/skills/business-analyse/schemas/shared/common-defs.json +133 -0
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +22 -3
- package/templates/skills/business-analyse/steps/step-03-specify.md +129 -0
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +38 -5
- package/templates/skills/business-analyse/steps/step-05-handoff.md +94 -218
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "feature.json",
|
|
4
|
-
"title": "SmartStack Business Analysis Feature",
|
|
5
|
-
"description": "
|
|
4
|
+
"title": "SmartStack Business Analysis Feature v5.0",
|
|
5
|
+
"description": "Root schema for module-level feature.json. References sub-schemas in sections/ and shared/. Each BA step loads only the sub-schema(s) it needs.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["id", "version", "status", "metadata"],
|
|
8
8
|
"properties": {
|
|
@@ -16,1005 +16,38 @@
|
|
|
16
16
|
"pattern": "^\\d+\\.\\d+$",
|
|
17
17
|
"description": "Document version (e.g., 1.0, 1.1)"
|
|
18
18
|
},
|
|
19
|
-
"status": {
|
|
20
|
-
"type": "string",
|
|
21
|
-
"enum": ["draft", "framed", "analysed", "specified", "approved", "consolidated", "handed-off"],
|
|
22
|
-
"description": "Current lifecycle status, enriched by each step"
|
|
23
|
-
},
|
|
19
|
+
"status": { "$ref": "shared/common-defs.json#/$defs/moduleStatus" },
|
|
24
20
|
"scope": {
|
|
25
21
|
"type": "string",
|
|
26
22
|
"enum": ["application", "module"],
|
|
27
|
-
"default": "module"
|
|
28
|
-
"description": "Scope of this feature.json: application (master) or module (detailed)"
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
"metadata": {
|
|
32
|
-
"type": "object",
|
|
33
|
-
"required": ["createdAt", "updatedAt", "application", "module", "context", "language", "featureDescription"],
|
|
34
|
-
"properties": {
|
|
35
|
-
"createdAt": { "type": "string", "format": "date-time" },
|
|
36
|
-
"updatedAt": { "type": "string", "format": "date-time" },
|
|
37
|
-
"application": { "type": "string", "description": "Application name (PascalCase)" },
|
|
38
|
-
"module": { "type": "string", "description": "Module name (PascalCase)" },
|
|
39
|
-
"context": { "type": "string", "const": "business" },
|
|
40
|
-
"language": { "type": "string", "enum": ["fr", "en", "it", "de"] },
|
|
41
|
-
"featureDescription": { "type": "string" },
|
|
42
|
-
"featureType": {
|
|
43
|
-
"type": "string",
|
|
44
|
-
"enum": ["data-centric", "integration", "ui-centric", "workflow", "reporting", "full-module", "micro"],
|
|
45
|
-
"description": "Auto-classified from feature description"
|
|
46
|
-
},
|
|
47
|
-
"useCase": {
|
|
48
|
-
"type": "string",
|
|
49
|
-
"enum": ["new", "refactoring", "micro"],
|
|
50
|
-
"description": "Which use case triggered this analysis"
|
|
51
|
-
},
|
|
52
|
-
"permissionBase": {
|
|
53
|
-
"type": "string",
|
|
54
|
-
"description": "e.g., business.sales.orders"
|
|
55
|
-
},
|
|
56
|
-
"previousVersion": {
|
|
57
|
-
"type": ["string", "null"],
|
|
58
|
-
"description": "Reference to previous version (for refactoring)"
|
|
59
|
-
},
|
|
60
|
-
"changeReason": {
|
|
61
|
-
"type": ["string", "null"],
|
|
62
|
-
"description": "Why this version was created (refactoring delta)"
|
|
63
|
-
},
|
|
64
|
-
"mcpAvailable": { "type": "boolean" },
|
|
65
|
-
"economyMode": { "type": "boolean" },
|
|
66
|
-
"scope": {
|
|
67
|
-
"type": "string",
|
|
68
|
-
"enum": ["application", "module"],
|
|
69
|
-
"default": "module",
|
|
70
|
-
"description": "Explicitly marks this as module-scope"
|
|
71
|
-
},
|
|
72
|
-
"applicationRef": {
|
|
73
|
-
"type": ["string", "null"],
|
|
74
|
-
"description": "Reference to parent application feature ID (FEAT-XXX) when part of multi-module analysis"
|
|
75
|
-
},
|
|
76
|
-
"applicationPath": {
|
|
77
|
-
"type": ["string", "null"],
|
|
78
|
-
"description": "Path to the parent application-level feature.json"
|
|
79
|
-
},
|
|
80
|
-
"moduleIndex": {
|
|
81
|
-
"type": ["integer", "null"],
|
|
82
|
-
"description": "Position in topological order within the application (0-based)"
|
|
83
|
-
},
|
|
84
|
-
"inheritsRoles": {
|
|
85
|
-
"type": "boolean",
|
|
86
|
-
"default": false,
|
|
87
|
-
"description": "Whether roles are inherited from application-level (true for multi-module)"
|
|
88
|
-
},
|
|
89
|
-
"steps": {
|
|
90
|
-
"type": "object",
|
|
91
|
-
"description": "Progress tracking per step",
|
|
92
|
-
"properties": {
|
|
93
|
-
"init": { "$ref": "#/$defs/stepStatus" },
|
|
94
|
-
"cadrage": { "$ref": "#/$defs/stepStatus" },
|
|
95
|
-
"specify": { "$ref": "#/$defs/stepStatus" },
|
|
96
|
-
"validate": { "$ref": "#/$defs/stepStatus" },
|
|
97
|
-
"handoff": { "$ref": "#/$defs/stepStatus" }
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
"applicationContext": {
|
|
104
|
-
"type": "object",
|
|
105
|
-
"description": "Inherited from parent application feature.json when part of multi-module analysis",
|
|
106
|
-
"properties": {
|
|
107
|
-
"applicationRoles": {
|
|
108
|
-
"type": "array",
|
|
109
|
-
"description": "Copied from master feature.json for reference",
|
|
110
|
-
"items": {
|
|
111
|
-
"type": "object",
|
|
112
|
-
"properties": {
|
|
113
|
-
"role": { "type": "string" },
|
|
114
|
-
"description": { "type": "string" },
|
|
115
|
-
"level": { "type": "string", "enum": ["admin", "manager", "contributor", "viewer"] },
|
|
116
|
-
"permissionPattern": { "type": "string" }
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
"permissionBase": {
|
|
121
|
-
"type": "string",
|
|
122
|
-
"description": "Application-level permission base (e.g., business.sales)"
|
|
123
|
-
},
|
|
124
|
-
"relatedModules": {
|
|
125
|
-
"type": "array",
|
|
126
|
-
"items": { "type": "string" },
|
|
127
|
-
"description": "Other modules in the same application"
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
"discovery": {
|
|
133
|
-
"type": "object",
|
|
134
|
-
"description": "Enriched by step-01-analyse (discovery part)",
|
|
135
|
-
"properties": {
|
|
136
|
-
"problem": { "type": "string", "description": "Q1.1 - Business problem to solve" },
|
|
137
|
-
"asIs": { "type": "string", "description": "Q1.2 - Current situation" },
|
|
138
|
-
"toBe": { "type": "string", "description": "Q1.3 - Target situation" },
|
|
139
|
-
"trigger": { "type": "string", "description": "Q1.4 - What triggered this need" },
|
|
140
|
-
"stakeholders": {
|
|
141
|
-
"type": "array",
|
|
142
|
-
"items": {
|
|
143
|
-
"type": "object",
|
|
144
|
-
"required": ["role"],
|
|
145
|
-
"properties": {
|
|
146
|
-
"role": { "type": "string" },
|
|
147
|
-
"function": { "type": "string" },
|
|
148
|
-
"involvement": { "type": "string", "enum": ["approver", "decision-maker", "consulted", "informed", "end-user"] },
|
|
149
|
-
"tasks": { "type": "array", "items": { "type": "string" } },
|
|
150
|
-
"frequency": { "type": "string" },
|
|
151
|
-
"painPoints": { "type": "array", "items": { "type": "string" } }
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
"scope": {
|
|
156
|
-
"type": "object",
|
|
157
|
-
"properties": {
|
|
158
|
-
"mustHave": { "type": "array", "items": { "type": "string" } },
|
|
159
|
-
"shouldHave": { "type": "array", "items": { "type": "string" } },
|
|
160
|
-
"couldHave": { "type": "array", "items": { "type": "string" } },
|
|
161
|
-
"outOfScope": { "type": "array", "items": { "type": "string" } },
|
|
162
|
-
"mainFlow": { "type": "string" },
|
|
163
|
-
"decisionPoints": { "type": "array", "items": { "type": "string" } },
|
|
164
|
-
"alternativeFlows": { "type": "array", "items": { "type": "string" } },
|
|
165
|
-
"errorCases": { "type": "array", "items": { "type": "string" } }
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
"risks": {
|
|
169
|
-
"type": "array",
|
|
170
|
-
"items": {
|
|
171
|
-
"type": "object",
|
|
172
|
-
"required": ["id", "type", "description"],
|
|
173
|
-
"properties": {
|
|
174
|
-
"id": { "type": "string", "pattern": "^RISK-\\d{3}$" },
|
|
175
|
-
"type": { "type": "string", "enum": ["business", "technical", "organizational"] },
|
|
176
|
-
"description": { "type": "string" },
|
|
177
|
-
"probability": { "type": "string", "enum": ["high", "medium", "low"] },
|
|
178
|
-
"impact": { "type": "string", "enum": ["high", "medium", "low"] },
|
|
179
|
-
"priority": { "type": "string", "enum": ["critical", "medium", "low"] },
|
|
180
|
-
"mitigation": { "type": "string" }
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
"acceptanceCriteria": {
|
|
185
|
-
"type": "array",
|
|
186
|
-
"items": {
|
|
187
|
-
"type": "object",
|
|
188
|
-
"required": ["id", "criterion"],
|
|
189
|
-
"properties": {
|
|
190
|
-
"id": { "type": "string", "pattern": "^AC-\\d{3}$" },
|
|
191
|
-
"criterion": { "type": "string" },
|
|
192
|
-
"validated": { "type": "boolean", "default": false }
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
},
|
|
196
|
-
"codebaseContext": {
|
|
197
|
-
"type": "string",
|
|
198
|
-
"description": "Summary of existing modules/patterns found during pre-research"
|
|
199
|
-
},
|
|
200
|
-
"openQuestions": {
|
|
201
|
-
"type": "array",
|
|
202
|
-
"items": {
|
|
203
|
-
"type": "object",
|
|
204
|
-
"properties": {
|
|
205
|
-
"id": { "type": "string" },
|
|
206
|
-
"question": { "type": "string" },
|
|
207
|
-
"answer": { "type": ["string", "null"] },
|
|
208
|
-
"status": { "type": "string", "enum": ["pending", "answered", "deferred"] }
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
|
|
215
|
-
"analysis": {
|
|
216
|
-
"type": "object",
|
|
217
|
-
"description": "Enriched by step-01-analyse (analysis part, merged from old business requirements step)",
|
|
218
|
-
"properties": {
|
|
219
|
-
"objectives": {
|
|
220
|
-
"type": "array",
|
|
221
|
-
"items": {
|
|
222
|
-
"type": "object",
|
|
223
|
-
"required": ["id", "objective"],
|
|
224
|
-
"properties": {
|
|
225
|
-
"id": { "type": "string", "pattern": "^OBJ-\\d{3}$" },
|
|
226
|
-
"objective": { "type": "string" },
|
|
227
|
-
"metric": { "type": "string" },
|
|
228
|
-
"target": { "type": "string" }
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
"businessRules": {
|
|
233
|
-
"type": "array",
|
|
234
|
-
"items": {
|
|
235
|
-
"type": "object",
|
|
236
|
-
"required": ["id", "name", "category", "statement"],
|
|
237
|
-
"properties": {
|
|
238
|
-
"id": { "type": "string", "pattern": "^BR-(VAL|CALC|WF|SEC|DATA)-\\d{3}$" },
|
|
239
|
-
"name": { "type": "string" },
|
|
240
|
-
"category": { "type": "string", "enum": ["validation", "calculation", "workflow", "security", "data"] },
|
|
241
|
-
"statement": { "type": "string", "description": "IF ... THEN ... ELSE ..." },
|
|
242
|
-
"priority": { "type": "string", "enum": ["must", "should", "could"] },
|
|
243
|
-
"conditions": { "type": "array", "items": { "type": "string" } },
|
|
244
|
-
"examples": {
|
|
245
|
-
"type": "array",
|
|
246
|
-
"items": {
|
|
247
|
-
"type": "object",
|
|
248
|
-
"properties": {
|
|
249
|
-
"input": { "type": "string" },
|
|
250
|
-
"expected": { "type": "string" }
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
"testability": { "type": "string" }
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
},
|
|
258
|
-
"entities": {
|
|
259
|
-
"type": "array",
|
|
260
|
-
"description": "Business-view entities only. NO technical fields (Id, TenantId, CreatedBy, etc.)",
|
|
261
|
-
"items": {
|
|
262
|
-
"type": "object",
|
|
263
|
-
"required": ["name"],
|
|
264
|
-
"properties": {
|
|
265
|
-
"name": { "type": "string", "description": "PascalCase entity name" },
|
|
266
|
-
"description": { "type": "string" },
|
|
267
|
-
"attributes": {
|
|
268
|
-
"type": "array",
|
|
269
|
-
"items": {
|
|
270
|
-
"type": "object",
|
|
271
|
-
"required": ["name"],
|
|
272
|
-
"properties": {
|
|
273
|
-
"name": { "type": "string" },
|
|
274
|
-
"description": { "type": "string" },
|
|
275
|
-
"required": { "type": "boolean", "default": false },
|
|
276
|
-
"unique": { "type": "boolean", "default": false },
|
|
277
|
-
"validation": { "type": "string" }
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
"relationships": {
|
|
282
|
-
"type": "array",
|
|
283
|
-
"items": {
|
|
284
|
-
"type": "object",
|
|
285
|
-
"required": ["target", "type"],
|
|
286
|
-
"properties": {
|
|
287
|
-
"target": { "type": "string" },
|
|
288
|
-
"type": { "type": "string", "enum": ["1:1", "1:N", "N:1", "N:M"] },
|
|
289
|
-
"description": { "type": "string" }
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
},
|
|
296
|
-
"processFlow": {
|
|
297
|
-
"type": "object",
|
|
298
|
-
"properties": {
|
|
299
|
-
"entryPoints": { "type": "array", "items": { "type": "string" } },
|
|
300
|
-
"mainFlow": {
|
|
301
|
-
"type": "array",
|
|
302
|
-
"items": {
|
|
303
|
-
"type": "object",
|
|
304
|
-
"properties": {
|
|
305
|
-
"step": { "type": "integer" },
|
|
306
|
-
"actor": { "type": "string" },
|
|
307
|
-
"action": { "type": "string" },
|
|
308
|
-
"system": { "type": "string" }
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
},
|
|
312
|
-
"decisionPoints": {
|
|
313
|
-
"type": "array",
|
|
314
|
-
"items": {
|
|
315
|
-
"type": "object",
|
|
316
|
-
"properties": {
|
|
317
|
-
"condition": { "type": "string" },
|
|
318
|
-
"ifTrue": { "type": "string" },
|
|
319
|
-
"ifFalse": { "type": "string" },
|
|
320
|
-
"rule": { "type": "string", "description": "Reference to BR-XXX" }
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
"alternativeFlows": { "type": "array", "items": { "type": "object" } }
|
|
325
|
-
}
|
|
326
|
-
},
|
|
327
|
-
"integrations": {
|
|
328
|
-
"type": "array",
|
|
329
|
-
"items": {
|
|
330
|
-
"type": "object",
|
|
331
|
-
"properties": {
|
|
332
|
-
"system": { "type": "string" },
|
|
333
|
-
"direction": { "type": "string", "enum": ["in", "out", "bidirectional"] },
|
|
334
|
-
"data": { "type": "string" },
|
|
335
|
-
"frequency": { "type": "string" },
|
|
336
|
-
"errorStrategy": { "type": "string" }
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
},
|
|
340
|
-
"dataLifecycle": {
|
|
341
|
-
"type": "object",
|
|
342
|
-
"properties": {
|
|
343
|
-
"retentionPeriod": { "type": "string" },
|
|
344
|
-
"archiveStrategy": { "type": "string" },
|
|
345
|
-
"gdprCompliance": { "type": "string" },
|
|
346
|
-
"states": {
|
|
347
|
-
"type": "array",
|
|
348
|
-
"items": {
|
|
349
|
-
"type": "object",
|
|
350
|
-
"properties": {
|
|
351
|
-
"name": { "type": "string" },
|
|
352
|
-
"transitions": { "type": "array", "items": { "type": "string" } }
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
},
|
|
358
|
-
"crossModuleImpact": {
|
|
359
|
-
"type": "object",
|
|
360
|
-
"properties": {
|
|
361
|
-
"existingModules": { "type": "array", "items": { "type": "string" } },
|
|
362
|
-
"sharedData": { "type": "array", "items": { "type": "string" } },
|
|
363
|
-
"events": { "type": "array", "items": { "type": "string" } },
|
|
364
|
-
"modifications": { "type": "array", "items": { "type": "string" } }
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
23
|
+
"default": "module"
|
|
368
24
|
},
|
|
369
25
|
|
|
370
|
-
"
|
|
371
|
-
|
|
372
|
-
"description": "Enriched by step-02-specify",
|
|
373
|
-
"properties": {
|
|
374
|
-
"actors": {
|
|
375
|
-
"type": "array",
|
|
376
|
-
"items": {
|
|
377
|
-
"type": "object",
|
|
378
|
-
"required": ["role", "permissions"],
|
|
379
|
-
"properties": {
|
|
380
|
-
"role": { "type": "string" },
|
|
381
|
-
"description": { "type": "string" },
|
|
382
|
-
"permissions": { "type": "array", "items": { "type": "string" } }
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
},
|
|
386
|
-
"useCases": {
|
|
387
|
-
"type": "array",
|
|
388
|
-
"items": {
|
|
389
|
-
"type": "object",
|
|
390
|
-
"required": ["id", "name", "primaryActor", "permission"],
|
|
391
|
-
"properties": {
|
|
392
|
-
"id": { "type": "string", "pattern": "^UC-\\d{3}$" },
|
|
393
|
-
"name": { "type": "string" },
|
|
394
|
-
"primaryActor": { "type": "string" },
|
|
395
|
-
"permission": { "type": "string", "description": "business.{app}.{module}.{action}" },
|
|
396
|
-
"preconditions": { "type": "array", "items": { "type": "string" } },
|
|
397
|
-
"postconditions": { "type": "array", "items": { "type": "string" } },
|
|
398
|
-
"mainScenario": { "type": "array", "items": { "type": "string" } },
|
|
399
|
-
"alternativeScenarios": {
|
|
400
|
-
"type": "array",
|
|
401
|
-
"items": {
|
|
402
|
-
"type": "object",
|
|
403
|
-
"properties": {
|
|
404
|
-
"name": { "type": "string" },
|
|
405
|
-
"steps": { "type": "array", "items": { "type": "string" } }
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
},
|
|
409
|
-
"errorScenarios": {
|
|
410
|
-
"type": "array",
|
|
411
|
-
"items": {
|
|
412
|
-
"type": "object",
|
|
413
|
-
"properties": {
|
|
414
|
-
"name": { "type": "string" },
|
|
415
|
-
"steps": { "type": "array", "items": { "type": "string" } }
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
},
|
|
419
|
-
"linkedRules": {
|
|
420
|
-
"type": "array",
|
|
421
|
-
"items": { "type": "string" },
|
|
422
|
-
"description": "Cross-references to BR-XXX in analysis.businessRules"
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
},
|
|
427
|
-
"functionalRequirements": {
|
|
428
|
-
"type": "array",
|
|
429
|
-
"items": {
|
|
430
|
-
"type": "object",
|
|
431
|
-
"required": ["id", "statement", "priority"],
|
|
432
|
-
"properties": {
|
|
433
|
-
"id": { "type": "string", "pattern": "^FR-\\d{3}$" },
|
|
434
|
-
"statement": { "type": "string", "description": "System MUST/SHOULD/COULD ..." },
|
|
435
|
-
"priority": { "type": "string", "enum": ["must", "should", "could"] },
|
|
436
|
-
"linkedRules": {
|
|
437
|
-
"type": "array",
|
|
438
|
-
"items": { "type": "string" },
|
|
439
|
-
"description": "Cross-references to BR-XXX"
|
|
440
|
-
},
|
|
441
|
-
"linkedUseCases": {
|
|
442
|
-
"type": "array",
|
|
443
|
-
"items": { "type": "string" },
|
|
444
|
-
"description": "Cross-references to UC-XXX"
|
|
445
|
-
},
|
|
446
|
-
"acceptanceCriteria": { "type": "array", "items": { "type": "string" } }
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
},
|
|
450
|
-
"permissionMatrix": {
|
|
451
|
-
"type": "object",
|
|
452
|
-
"properties": {
|
|
453
|
-
"permissions": {
|
|
454
|
-
"type": "array",
|
|
455
|
-
"description": "All permissions for this module",
|
|
456
|
-
"items": {
|
|
457
|
-
"type": "object",
|
|
458
|
-
"required": ["path", "action"],
|
|
459
|
-
"properties": {
|
|
460
|
-
"path": { "type": "string", "description": "business.{app}.{module}.{action}" },
|
|
461
|
-
"action": { "type": "string", "enum": ["read", "create", "update", "delete", "export", "import", "admin", "*"] },
|
|
462
|
-
"description": { "type": "string" }
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
},
|
|
466
|
-
"roleAssignments": {
|
|
467
|
-
"type": "array",
|
|
468
|
-
"description": "Role-to-permission mapping (SeedData source)",
|
|
469
|
-
"items": {
|
|
470
|
-
"type": "object",
|
|
471
|
-
"required": ["role", "permissions"],
|
|
472
|
-
"properties": {
|
|
473
|
-
"role": { "type": "string" },
|
|
474
|
-
"permissions": {
|
|
475
|
-
"type": "array",
|
|
476
|
-
"items": { "type": "string" },
|
|
477
|
-
"description": "Permission paths assigned to this role"
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
},
|
|
484
|
-
"navigation": {
|
|
485
|
-
"type": "object",
|
|
486
|
-
"description": "Navigation hierarchy for SeedData generation",
|
|
487
|
-
"properties": {
|
|
488
|
-
"entries": {
|
|
489
|
-
"type": "array",
|
|
490
|
-
"items": {
|
|
491
|
-
"type": "object",
|
|
492
|
-
"required": ["level", "code", "route"],
|
|
493
|
-
"properties": {
|
|
494
|
-
"level": { "type": "string", "enum": ["context", "application", "module", "section", "resource"] },
|
|
495
|
-
"code": { "type": "string" },
|
|
496
|
-
"labels": {
|
|
497
|
-
"type": "object",
|
|
498
|
-
"properties": {
|
|
499
|
-
"fr": { "type": "string" },
|
|
500
|
-
"en": { "type": "string" },
|
|
501
|
-
"it": { "type": "string" },
|
|
502
|
-
"de": { "type": "string" }
|
|
503
|
-
}
|
|
504
|
-
},
|
|
505
|
-
"route": { "type": "string" },
|
|
506
|
-
"icon": { "type": "string" },
|
|
507
|
-
"isNew": { "type": "boolean" }
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
},
|
|
513
|
-
"gherkinScenarios": {
|
|
514
|
-
"type": "array",
|
|
515
|
-
"items": {
|
|
516
|
-
"type": "object",
|
|
517
|
-
"properties": {
|
|
518
|
-
"feature": { "type": "string" },
|
|
519
|
-
"scenarios": {
|
|
520
|
-
"type": "array",
|
|
521
|
-
"items": {
|
|
522
|
-
"type": "object",
|
|
523
|
-
"properties": {
|
|
524
|
-
"name": { "type": "string" },
|
|
525
|
-
"tags": { "type": "array", "items": { "type": "string" } },
|
|
526
|
-
"given": { "type": "array", "items": { "type": "string" } },
|
|
527
|
-
"when": { "type": "array", "items": { "type": "string" } },
|
|
528
|
-
"then": { "type": "array", "items": { "type": "string" } }
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
},
|
|
535
|
-
"validations": {
|
|
536
|
-
"type": "array",
|
|
537
|
-
"description": "Field-level validations for entities",
|
|
538
|
-
"items": {
|
|
539
|
-
"type": "object",
|
|
540
|
-
"properties": {
|
|
541
|
-
"entity": { "type": "string" },
|
|
542
|
-
"field": { "type": "string" },
|
|
543
|
-
"rules": { "type": "array", "items": { "type": "string" } },
|
|
544
|
-
"errorMessageKey": { "type": "string" }
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
},
|
|
548
|
-
"apiEndpoints": {
|
|
549
|
-
"type": "array",
|
|
550
|
-
"items": {
|
|
551
|
-
"type": "object",
|
|
552
|
-
"properties": {
|
|
553
|
-
"method": { "type": "string", "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"] },
|
|
554
|
-
"path": { "type": "string" },
|
|
555
|
-
"permission": { "type": "string" },
|
|
556
|
-
"requestDto": { "type": "string" },
|
|
557
|
-
"responseDto": { "type": "string" },
|
|
558
|
-
"description": { "type": "string" }
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
},
|
|
562
|
-
"i18nKeys": {
|
|
563
|
-
"type": "object",
|
|
564
|
-
"description": "Translation keys organized by section",
|
|
565
|
-
"additionalProperties": {
|
|
566
|
-
"type": "object",
|
|
567
|
-
"additionalProperties": { "type": "string" }
|
|
568
|
-
}
|
|
569
|
-
},
|
|
570
|
-
"uiWireframes": {
|
|
571
|
-
"type": "array",
|
|
572
|
-
"description": "MANDATORY wireframes for every module section. Each section MUST have at least one wireframe validated by the client. These wireframes are traced through to frontend implementation via linkedWireframes in handoff.filesToCreate.",
|
|
573
|
-
"items": {
|
|
574
|
-
"type": "object",
|
|
575
|
-
"required": ["screen", "mockup", "elements", "section"],
|
|
576
|
-
"properties": {
|
|
577
|
-
"screen": { "type": "string", "description": "Unique screen identifier: {module}-{section} (e.g., orders-list, orders-detail)" },
|
|
578
|
-
"description": { "type": "string" },
|
|
579
|
-
"elements": {
|
|
580
|
-
"type": "array",
|
|
581
|
-
"items": { "type": "string" },
|
|
582
|
-
"description": "UI components in this wireframe (DataGrid, FilterBar, Form, etc.). Used for component mapping."
|
|
583
|
-
},
|
|
584
|
-
"actions": { "type": "array", "items": { "type": "string" } },
|
|
585
|
-
"permissionsRequired": { "type": "array", "items": { "type": "string" } },
|
|
586
|
-
"mockupFormat": {
|
|
587
|
-
"type": "string",
|
|
588
|
-
"enum": ["ascii", "svg"],
|
|
589
|
-
"description": "Format of the mockup: ascii (rendered in <pre>) or svg (rendered as inline SVG)"
|
|
590
|
-
},
|
|
591
|
-
"mockup": {
|
|
592
|
-
"type": "string",
|
|
593
|
-
"description": "ASCII art or SVG markup of the wireframe. MANDATORY: captures the layout validated by the client."
|
|
594
|
-
},
|
|
595
|
-
"section": {
|
|
596
|
-
"type": "string",
|
|
597
|
-
"description": "Navigation section this wireframe belongs to (e.g., list, detail, create, dashboard)"
|
|
598
|
-
},
|
|
599
|
-
"componentMapping": {
|
|
600
|
-
"type": "array",
|
|
601
|
-
"description": "Mapping of wireframe elements to SmartStack React components",
|
|
602
|
-
"items": {
|
|
603
|
-
"type": "object",
|
|
604
|
-
"properties": {
|
|
605
|
-
"wireframeElement": { "type": "string", "description": "Element name from the wireframe (e.g., DataGrid)" },
|
|
606
|
-
"reactComponent": { "type": "string", "description": "SmartStack React component to use (e.g., SmartTable)" }
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
},
|
|
613
|
-
"dashboards": {
|
|
614
|
-
"type": "array",
|
|
615
|
-
"description": "Dashboard specifications with KPIs and chart configurations. Captured during step-03 when a 'dashboard' section is selected.",
|
|
616
|
-
"items": {
|
|
617
|
-
"type": "object",
|
|
618
|
-
"required": ["code", "title", "kpis"],
|
|
619
|
-
"properties": {
|
|
620
|
-
"code": { "type": "string", "description": "Dashboard identifier (kebab-case, e.g., fleet-dashboard)" },
|
|
621
|
-
"title": { "type": "string" },
|
|
622
|
-
"description": { "type": "string" },
|
|
623
|
-
"linkedUCs": { "type": "array", "items": { "type": "string" } },
|
|
624
|
-
"refreshMode": { "type": "string", "enum": ["static", "polling", "signalr"], "default": "static" },
|
|
625
|
-
"defaultPeriod": { "type": "string", "enum": ["day", "week", "month", "quarter", "year"], "default": "month" },
|
|
626
|
-
"filters": {
|
|
627
|
-
"type": "array",
|
|
628
|
-
"items": {
|
|
629
|
-
"type": "object",
|
|
630
|
-
"properties": {
|
|
631
|
-
"field": { "type": "string" },
|
|
632
|
-
"type": { "type": "string", "enum": ["dateRange", "select", "multiselect", "search"] },
|
|
633
|
-
"label": { "type": "string" }
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
},
|
|
637
|
-
"kpis": {
|
|
638
|
-
"type": "array",
|
|
639
|
-
"items": {
|
|
640
|
-
"type": "object",
|
|
641
|
-
"required": ["code", "label", "metric", "visualization"],
|
|
642
|
-
"properties": {
|
|
643
|
-
"code": { "type": "string" },
|
|
644
|
-
"label": { "type": "string" },
|
|
645
|
-
"metric": { "type": "string", "description": "Description of calculation (e.g. COUNT(vehicles WHERE status=active))" },
|
|
646
|
-
"format": { "type": "string", "enum": ["number", "currency", "percent", "duration"], "default": "number" },
|
|
647
|
-
"visualization": { "type": "string", "enum": ["kpi-card", "bar", "line", "pie", "area", "donut", "stacked-bar"] },
|
|
648
|
-
"dataSource": { "type": "string", "description": "Entity or endpoint providing data" },
|
|
649
|
-
"dimensions": { "type": "array", "items": { "type": "string" }, "description": "Grouping dimensions (e.g. status, month)" },
|
|
650
|
-
"thresholds": {
|
|
651
|
-
"type": "object",
|
|
652
|
-
"properties": {
|
|
653
|
-
"warning": { "type": "number" },
|
|
654
|
-
"critical": { "type": "number" }
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
},
|
|
660
|
-
"permissionsRequired": { "type": "array", "items": { "type": "string" } }
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
},
|
|
664
|
-
"messages": {
|
|
665
|
-
"type": "array",
|
|
666
|
-
"description": "Business messages (success, error, warning, info) with i18n keys. MANDATORY: ≥4 messages.",
|
|
667
|
-
"items": {
|
|
668
|
-
"type": "object",
|
|
669
|
-
"required": ["code", "type", "i18nKey"],
|
|
670
|
-
"properties": {
|
|
671
|
-
"code": { "type": "string", "description": "SCREAMING_SNAKE_CASE identifier (e.g., VEHICLE_CREATED_SUCCESS)" },
|
|
672
|
-
"type": { "type": "string", "enum": ["success", "error", "warning", "info"] },
|
|
673
|
-
"title": { "type": "string" },
|
|
674
|
-
"message": { "type": "string", "description": "User-facing message with {placeholders}" },
|
|
675
|
-
"i18nKey": { "type": "string", "description": "Dot-separated i18n key (e.g., freebike.messages.vehicleCreated)" }
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
},
|
|
679
|
-
"lifeCycles": {
|
|
680
|
-
"type": "array",
|
|
681
|
-
"description": "Per-entity state machines for entities with Status fields. MANDATORY: ≥1 entity.",
|
|
682
|
-
"items": {
|
|
683
|
-
"type": "object",
|
|
684
|
-
"required": ["entity", "states"],
|
|
685
|
-
"properties": {
|
|
686
|
-
"entity": { "type": "string", "description": "PascalCase entity name" },
|
|
687
|
-
"states": {
|
|
688
|
-
"type": "array",
|
|
689
|
-
"items": {
|
|
690
|
-
"type": "object",
|
|
691
|
-
"required": ["id", "allowedTransitions"],
|
|
692
|
-
"properties": {
|
|
693
|
-
"id": { "type": "string", "description": "State code (e.g., Draft, Active, Completed)" },
|
|
694
|
-
"displayName": { "type": "string" },
|
|
695
|
-
"description": { "type": "string" },
|
|
696
|
-
"allowedTransitions": { "type": "array", "items": { "type": "string" } },
|
|
697
|
-
"isTerminal": { "type": "boolean", "default": false }
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
},
|
|
704
|
-
"seedDataCore": {
|
|
705
|
-
"type": "object",
|
|
706
|
-
"description": "5 mandatory SmartStack core SeedData definitions derived from navigation + permissionMatrix. CRITICAL: without these, module is invisible (403).",
|
|
707
|
-
"properties": {
|
|
708
|
-
"navigationModules": {
|
|
709
|
-
"type": "array",
|
|
710
|
-
"description": "Entries for nav_Modules table (HasData). Derived from navigation.entries.",
|
|
711
|
-
"items": {
|
|
712
|
-
"type": "object",
|
|
713
|
-
"required": ["code", "label", "icon", "route"],
|
|
714
|
-
"properties": {
|
|
715
|
-
"code": { "type": "string" },
|
|
716
|
-
"label": { "type": "string" },
|
|
717
|
-
"icon": { "type": "string" },
|
|
718
|
-
"route": { "type": "string" },
|
|
719
|
-
"parentCode": { "type": ["string", "null"] },
|
|
720
|
-
"sort": { "type": "integer" }
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
},
|
|
724
|
-
"navigationTranslations": {
|
|
725
|
-
"type": "array",
|
|
726
|
-
"description": "Translations for nav_Translations table (HasData). One entry per module per language.",
|
|
727
|
-
"items": {
|
|
728
|
-
"type": "object",
|
|
729
|
-
"required": ["moduleCode", "language", "label"],
|
|
730
|
-
"properties": {
|
|
731
|
-
"moduleCode": { "type": "string" },
|
|
732
|
-
"language": { "type": "string", "enum": ["fr", "en", "it", "de"] },
|
|
733
|
-
"label": { "type": "string" }
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
},
|
|
737
|
-
"permissions": {
|
|
738
|
-
"type": "array",
|
|
739
|
-
"description": "Entries for nav_Permissions table (HasData). Full paths from permissionMatrix.permissions.",
|
|
740
|
-
"items": {
|
|
741
|
-
"type": "object",
|
|
742
|
-
"required": ["path", "action"],
|
|
743
|
-
"properties": {
|
|
744
|
-
"path": { "type": "string", "description": "Full permission path (business.{app}.{module}.{resource}.{action})" },
|
|
745
|
-
"action": { "type": "string" },
|
|
746
|
-
"description": { "type": "string" }
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
},
|
|
750
|
-
"rolePermissions": {
|
|
751
|
-
"type": "array",
|
|
752
|
-
"description": "Entries for auth_RolePermissions table (HasData). Derived from permissionMatrix.roleAssignments.",
|
|
753
|
-
"items": {
|
|
754
|
-
"type": "object",
|
|
755
|
-
"required": ["role", "permissionPath"],
|
|
756
|
-
"properties": {
|
|
757
|
-
"role": { "type": "string" },
|
|
758
|
-
"permissionPath": { "type": "string", "description": "Full permission path (must match permissions[].path)" }
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
},
|
|
762
|
-
"permissionConstants": {
|
|
763
|
-
"type": "array",
|
|
764
|
-
"description": "Compile-time constants for Permissions.cs (Application layer). Used in [RequirePermission] attributes.",
|
|
765
|
-
"items": {
|
|
766
|
-
"type": "object",
|
|
767
|
-
"required": ["constantName", "path"],
|
|
768
|
-
"properties": {
|
|
769
|
-
"constantName": { "type": "string", "description": "PascalCase constant (e.g., VehiclesRead)" },
|
|
770
|
-
"path": { "type": "string", "description": "Matching permission path" }
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
},
|
|
778
|
-
|
|
779
|
-
"validation": {
|
|
780
|
-
"type": "object",
|
|
781
|
-
"description": "Enriched by step-03-validate",
|
|
782
|
-
"properties": {
|
|
783
|
-
"validatedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
784
|
-
"completenessChecks": {
|
|
785
|
-
"type": "array",
|
|
786
|
-
"description": "Per-section completeness verification",
|
|
787
|
-
"items": {
|
|
788
|
-
"type": "object",
|
|
789
|
-
"properties": {
|
|
790
|
-
"section": { "type": "string" },
|
|
791
|
-
"count": { "type": "integer" },
|
|
792
|
-
"minimum": { "type": "integer" },
|
|
793
|
-
"status": { "type": "string", "enum": ["PASS", "FAIL", "WARNING"] }
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
},
|
|
797
|
-
"consistencyChecks": {
|
|
798
|
-
"type": "array",
|
|
799
|
-
"description": "Cross-reference consistency checks (UC↔FR, FR↔BR, Actor↔Matrix, etc.)",
|
|
800
|
-
"items": {
|
|
801
|
-
"type": "object",
|
|
802
|
-
"properties": {
|
|
803
|
-
"check": { "type": "string" },
|
|
804
|
-
"passed": { "type": "integer" },
|
|
805
|
-
"warnings": { "type": "integer" },
|
|
806
|
-
"errors": { "type": "integer" },
|
|
807
|
-
"status": { "type": "string", "enum": ["PASS", "FAIL", "WARNING"] }
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
},
|
|
811
|
-
"conventionChecks": {
|
|
812
|
-
"type": "array",
|
|
813
|
-
"description": "SmartStack convention validation (naming, permissions, routes, etc.)",
|
|
814
|
-
"items": {
|
|
815
|
-
"type": "object",
|
|
816
|
-
"properties": {
|
|
817
|
-
"check": { "type": "string" },
|
|
818
|
-
"status": { "type": "string", "enum": ["PASS", "FAIL", "WARNING"] },
|
|
819
|
-
"details": { "type": "string" }
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
},
|
|
823
|
-
"riskAssessments": {
|
|
824
|
-
"type": "array",
|
|
825
|
-
"description": "Scope and complexity risk evaluation",
|
|
826
|
-
"items": {
|
|
827
|
-
"type": "object",
|
|
828
|
-
"properties": {
|
|
829
|
-
"risk": { "type": "string" },
|
|
830
|
-
"value": { "type": "integer" },
|
|
831
|
-
"threshold": { "type": "integer" },
|
|
832
|
-
"status": { "type": "string", "enum": ["ACCEPTABLE", "WARNING", "CRITICAL", "MONITORED"] }
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
},
|
|
836
|
-
"warnings": {
|
|
837
|
-
"type": "array",
|
|
838
|
-
"description": "Non-blocking warnings and observations",
|
|
839
|
-
"items": { "type": "string" }
|
|
840
|
-
},
|
|
841
|
-
"decision": {
|
|
842
|
-
"type": "object",
|
|
843
|
-
"description": "Final approval decision",
|
|
844
|
-
"properties": {
|
|
845
|
-
"approved": { "type": "boolean" },
|
|
846
|
-
"reason": { "type": "string" },
|
|
847
|
-
"approvalMode": { "type": "string", "enum": ["standard", "micro", "delta", "force"] },
|
|
848
|
-
"approvedBy": { "type": "string" },
|
|
849
|
-
"approvedAt": { "type": "string", "format": "date-time" }
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
},
|
|
854
|
-
|
|
855
|
-
"handoff": {
|
|
856
|
-
"type": "object",
|
|
857
|
-
"description": "Enriched by step-04-handoff",
|
|
858
|
-
"properties": {
|
|
859
|
-
"complexity": { "type": "string", "enum": ["simple", "medium", "complex"] },
|
|
860
|
-
"filesToCreate": {
|
|
861
|
-
"type": "object",
|
|
862
|
-
"properties": {
|
|
863
|
-
"domain": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
864
|
-
"application": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
865
|
-
"infrastructure": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
866
|
-
"api": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
867
|
-
"frontend": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
868
|
-
"seedData": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } },
|
|
869
|
-
"tests": { "type": "array", "items": { "$ref": "#/$defs/fileSpec" } }
|
|
870
|
-
}
|
|
871
|
-
},
|
|
872
|
-
"brToCodeMapping": {
|
|
873
|
-
"type": "array",
|
|
874
|
-
"description": "Maps each business rule to its implementation points across layers. Derived from analysis.businessRules[].",
|
|
875
|
-
"items": {
|
|
876
|
-
"type": "object",
|
|
877
|
-
"required": ["ruleId", "implementationPoints"],
|
|
878
|
-
"properties": {
|
|
879
|
-
"ruleId": { "type": "string", "description": "BR-XXX identifier from analysis.businessRules" },
|
|
880
|
-
"title": { "type": "string", "description": "Business rule title" },
|
|
881
|
-
"implementationPoints": {
|
|
882
|
-
"type": "array",
|
|
883
|
-
"items": {
|
|
884
|
-
"type": "object",
|
|
885
|
-
"required": ["layer", "component"],
|
|
886
|
-
"properties": {
|
|
887
|
-
"layer": { "type": "string", "description": "Architecture layer (Domain, Application, Infrastructure, API, Frontend)" },
|
|
888
|
-
"component": { "type": "string", "description": "File name (e.g., Order.cs, OrdersController.cs)" },
|
|
889
|
-
"method": { "type": "string", "description": "Method or attribute (e.g., Validate(), [Authorize])" },
|
|
890
|
-
"implementation": { "type": "string", "description": "How the rule is enforced" }
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
},
|
|
897
|
-
"apiEndpointSummary": {
|
|
898
|
-
"type": "array",
|
|
899
|
-
"description": "Subset of specification.apiEndpoints enriched with linkedUC. MUST use EXACT same routes as specification.",
|
|
900
|
-
"items": {
|
|
901
|
-
"type": "object",
|
|
902
|
-
"properties": {
|
|
903
|
-
"operation": { "type": "string" },
|
|
904
|
-
"method": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE", "PATCH"] },
|
|
905
|
-
"route": { "type": "string", "description": "MUST match specification.apiEndpoints[].path exactly" },
|
|
906
|
-
"linkedUC": { "type": "string" },
|
|
907
|
-
"permissions": { "type": "string" }
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
},
|
|
911
|
-
"ralphPrd": {
|
|
912
|
-
"type": "object",
|
|
913
|
-
"description": "Embedded Ralph Loop task breakdown (also exported to .ralph/prd.json)",
|
|
914
|
-
"properties": {
|
|
915
|
-
"tasks": {
|
|
916
|
-
"type": "array",
|
|
917
|
-
"items": {
|
|
918
|
-
"type": "object",
|
|
919
|
-
"properties": {
|
|
920
|
-
"id": { "type": "integer" },
|
|
921
|
-
"description": { "type": "string" },
|
|
922
|
-
"category": { "type": "string", "enum": ["domain", "seedData", "seedDataCore", "application", "infrastructure", "api", "frontend", "i18n", "test", "validation"] },
|
|
923
|
-
"dependencies": { "type": "array", "items": { "type": "integer" } },
|
|
924
|
-
"acceptanceCriteria": { "type": "string" }
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
},
|
|
26
|
+
"metadata": { "$ref": "sections/metadata-schema.json#/properties/metadata" },
|
|
27
|
+
"applicationContext": { "$ref": "sections/metadata-schema.json#/properties/applicationContext" },
|
|
932
28
|
|
|
933
|
-
"
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
"techDocRequired": { "type": "boolean", "default": false, "description": "Whether technical documentation (ERD, API) should be generated" },
|
|
939
|
-
"generatedAt": { "type": ["string", "null"], "format": "date-time", "description": "Timestamp when documentation was last generated" },
|
|
940
|
-
"status": { "type": "string", "enum": ["pending", "generated", "skipped"], "default": "pending" }
|
|
941
|
-
}
|
|
942
|
-
},
|
|
29
|
+
"discovery": { "$ref": "sections/discovery-schema.json" },
|
|
30
|
+
"analysis": { "$ref": "sections/analysis-schema.json" },
|
|
31
|
+
"specification": { "$ref": "sections/specification-schema.json" },
|
|
32
|
+
"validation": { "$ref": "sections/validation-schema.json" },
|
|
33
|
+
"handoff": { "$ref": "sections/handoff-schema.json" },
|
|
943
34
|
|
|
35
|
+
"documentation": { "$ref": "shared/common-defs.json#/$defs/documentation" },
|
|
944
36
|
"suggestions": {
|
|
945
37
|
"type": "array",
|
|
946
|
-
"
|
|
947
|
-
"items": {
|
|
948
|
-
"type": "object",
|
|
949
|
-
"required": ["type", "code", "reason"],
|
|
950
|
-
"properties": {
|
|
951
|
-
"type": {
|
|
952
|
-
"type": "string",
|
|
953
|
-
"enum": ["module", "section", "integration", "enhancement"]
|
|
954
|
-
},
|
|
955
|
-
"code": { "type": "string", "description": "Suggested module/section code (PascalCase)" },
|
|
956
|
-
"title": { "type": "string" },
|
|
957
|
-
"reason": { "type": "string", "description": "Why this is suggested based on the current analysis" },
|
|
958
|
-
"accepted": {
|
|
959
|
-
"type": ["boolean", "null"],
|
|
960
|
-
"description": "null = not yet answered, true = accepted, false = rejected"
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
}
|
|
38
|
+
"items": { "$ref": "shared/common-defs.json#/$defs/suggestion" }
|
|
964
39
|
},
|
|
965
|
-
|
|
966
40
|
"changelog": {
|
|
967
41
|
"type": "array",
|
|
968
|
-
"
|
|
969
|
-
"items": {
|
|
970
|
-
"type": "object",
|
|
971
|
-
"required": ["timestamp", "changes"],
|
|
972
|
-
"properties": {
|
|
973
|
-
"step": { "type": "string", "description": "Step identifier (e.g., step-01-analyse, step-02-specify, step-03-validate, step-04-handoff)" },
|
|
974
|
-
"version": { "type": "string", "description": "Feature version at this point" },
|
|
975
|
-
"timestamp": { "type": "string", "format": "date-time" },
|
|
976
|
-
"author": { "type": "string" },
|
|
977
|
-
"changes": { "type": "array", "items": { "type": "string" } },
|
|
978
|
-
"warnings": { "type": "array", "items": { "type": "string" }, "description": "Non-blocking warnings from this step" },
|
|
979
|
-
"decision": { "type": "string", "description": "Step decision outcome (e.g., approved, rejected)" }
|
|
980
|
-
}
|
|
981
|
-
}
|
|
42
|
+
"items": { "$ref": "shared/common-defs.json#/$defs/changelogEntry" }
|
|
982
43
|
}
|
|
983
44
|
},
|
|
984
45
|
|
|
46
|
+
"$comment": "Sub-schema loading guide per BA step: step-00-init → metadata-schema.json | step-01-cadrage → discovery-schema.json (module) OR application-schema.json (master) | step-02-decomposition → application-schema.json (modules[], dependencyGraph) | step-03-specify → analysis-schema.json + specification-schema.json | step-04-consolidation → validation-schema.json + application-schema.json (consolidation) | step-05-handoff → handoff-schema.json",
|
|
47
|
+
|
|
985
48
|
"$defs": {
|
|
986
|
-
"stepStatus": {
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
"status": { "type": "string", "enum": ["pending", "in-progress", "completed", "skipped"] },
|
|
990
|
-
"startedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
991
|
-
"completedAt": { "type": ["string", "null"], "format": "date-time" }
|
|
992
|
-
}
|
|
993
|
-
},
|
|
994
|
-
"fileSpec": {
|
|
995
|
-
"type": "object",
|
|
996
|
-
"required": ["path", "type"],
|
|
997
|
-
"properties": {
|
|
998
|
-
"path": { "type": "string", "description": "Relative file path" },
|
|
999
|
-
"type": { "type": "string", "description": "File type (Entity, Service, DTO, Repository, Migration, HasData, Constants, ApiController, Page, DashboardPage, Component, ApiClient, ReduxSlice, UnitTests, IntegrationTests, Enum)" },
|
|
1000
|
-
"linkedFRs": { "type": "array", "items": { "type": "string" }, "description": "Linked functional requirement IDs (FR-XXX)" },
|
|
1001
|
-
"linkedUCs": { "type": "array", "items": { "type": "string" }, "description": "Linked use case IDs (UC-XXX)" },
|
|
1002
|
-
"linkedWireframes": {
|
|
1003
|
-
"type": "array",
|
|
1004
|
-
"items": { "type": "string" },
|
|
1005
|
-
"description": "Linked wireframe screen identifiers from specification.uiWireframes[].screen. MANDATORY for Page and DashboardPage types. Ensures BA mockups are traced to implementation."
|
|
1006
|
-
},
|
|
1007
|
-
"wireframeAcceptanceCriteria": {
|
|
1008
|
-
"type": "string",
|
|
1009
|
-
"description": "Acceptance criteria describing how the implementation must match the wireframe layout. MANDATORY for Page and DashboardPage types."
|
|
1010
|
-
},
|
|
1011
|
-
"category": { "type": "string", "enum": ["core", "business"], "description": "SeedData category: core (navigation/permissions) or business (lookup tables)" },
|
|
1012
|
-
"source": { "type": "string", "description": "Source path in feature.json for derivation (e.g., specification.seedDataCore.permissions)" },
|
|
1013
|
-
"description": { "type": "string" },
|
|
1014
|
-
"pattern": { "type": "string", "description": "Reference pattern from existing codebase" },
|
|
1015
|
-
"instructions": { "type": "string" },
|
|
1016
|
-
"dashboardRef": { "type": "string", "description": "Reference to specification.dashboards[].code for DashboardPage type files" }
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
49
|
+
"stepStatus": { "$ref": "shared/common-defs.json#/$defs/stepStatus" },
|
|
50
|
+
"fileSpec": { "$ref": "shared/common-defs.json#/$defs/fileSpec" },
|
|
51
|
+
"resource": { "$ref": "shared/common-defs.json#/$defs/resource" }
|
|
1019
52
|
}
|
|
1020
53
|
}
|