@launchsecure/launch-kit 0.0.1
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/README.md +37 -0
- package/dist/client/assets/index-C8GAsRGO.css +32 -0
- package/dist/client/assets/index-CcHIoRl6.js +286 -0
- package/dist/client/index.html +22 -0
- package/dist/server/cli.js +8853 -0
- package/dist/server/fb-wizard.js +136 -0
- package/dist/server/graph-mcp-entry.js +1542 -0
- package/dist/server/public/app.js +1312 -0
- package/dist/server/public/icons.js +36 -0
- package/dist/server/public/index.html +159 -0
- package/dist/server/public/plan-detector.js +186 -0
- package/dist/server/public/session-manager.js +1129 -0
- package/dist/server/public/splits.js +569 -0
- package/dist/server/public/style.css +1620 -0
- package/package.json +73 -0
- package/prompts/analysis.md +992 -0
- package/prompts/architect-reconcile.md +931 -0
- package/prompts/architecture-sync.md +902 -0
- package/prompts/be-contract.md +709 -0
- package/prompts/be-impl.md +565 -0
- package/prompts/be-policy.md +551 -0
- package/prompts/be-test.md +591 -0
- package/prompts/bug-diagnosis.md +653 -0
- package/prompts/bug-intake.md +563 -0
- package/prompts/change-request-intake.md +593 -0
- package/prompts/db-contract.md +644 -0
- package/prompts/db-impl.md +522 -0
- package/prompts/db-interaction.md +569 -0
- package/prompts/db-test.md +630 -0
- package/prompts/decision-pack.md +654 -0
- package/prompts/fe-contract.md +992 -0
- package/prompts/fe-flow.md +537 -0
- package/prompts/fe-impl.md +597 -0
- package/prompts/fe-reconcile.md +506 -0
- package/prompts/fe-review.md +550 -0
- package/prompts/fe-test.md +705 -0
- package/prompts/fix-planner.md +1219 -0
- package/prompts/global-db-patterns.md +588 -0
- package/prompts/global-env-config.md +460 -0
- package/prompts/global-integrations.md +504 -0
- package/prompts/global-middleware.md +442 -0
- package/prompts/global-navigation.md +502 -0
- package/prompts/global-security.md +603 -0
- package/prompts/global-services.md +427 -0
- package/prompts/greenfield-classifier.md +590 -0
- package/prompts/llm-council.md +597 -0
- package/prompts/module-sequencer.md +529 -0
- package/prompts/normalize.md +611 -0
- package/prompts/optimization.md +633 -0
- package/prompts/prd-generation.md +544 -0
- package/prompts/prd-reconcile.md +584 -0
- package/prompts/prd-review.md +504 -0
- package/prompts/pre-code-analysis.md +565 -0
- package/prompts/pre-code-global-analysis.md +169 -0
- package/prompts/production-bootstrap.md +577 -0
- package/prompts/research.md +702 -0
- package/prompts/retrofit-analysis.md +845 -0
- package/prompts/spike.md +850 -0
- package/prompts/theming.md +835 -0
- package/prompts/triage.md +599 -0
- package/prompts/unified-reconcile.md +628 -0
- package/prompts/unified-review.md +592 -0
- package/prompts/user-stories.md +486 -0
- package/prompts/wireframe.md +576 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
# Decision Pack Agent
|
|
2
|
+
|
|
3
|
+
> **Greek:** Boulē (Boulḗ) — "deliberation/counsel"
|
|
4
|
+
> **Sanskrit:** निर्णय (Nirṇaya) — "decision/judgment"
|
|
5
|
+
> **Tagline:** *"Every gap is a question waiting to be asked"*
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Agent Identity
|
|
10
|
+
|
|
11
|
+
| Field | Value |
|
|
12
|
+
|---|---|
|
|
13
|
+
| ID | `decision_pack` |
|
|
14
|
+
| Name | Decision Pack Agent |
|
|
15
|
+
| Phase | 8 — Reconciliation & Decisions |
|
|
16
|
+
| Type | `pipeline` |
|
|
17
|
+
| Granularity | `global` |
|
|
18
|
+
| Interaction | `interactive` |
|
|
19
|
+
| Mode | `all` |
|
|
20
|
+
| Domain | `dev` |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Goal & Objectives
|
|
25
|
+
|
|
26
|
+
**Goal:** Transform all unresolved gaps, broken traceability chains, and conflicting decisions into structured multiple-choice questions presented to the user, then record the user's answers as binding decisions that downstream agents must honor.
|
|
27
|
+
|
|
28
|
+
| Priority | Objective |
|
|
29
|
+
|---|---|
|
|
30
|
+
| primary | Convert every gap from traceability.json and every unresolved finding from review agents into a clear, actionable MCQ question with well-defined options |
|
|
31
|
+
| secondary | Detect conflicting decisions across modules or layers (e.g., two modules assuming different auth strategies) and present them as resolution questions |
|
|
32
|
+
| tertiary | Record all user decisions with reasoning and traceability back to the original gap, creating a decisions.json that serves as the authoritative record of human choices |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Inputs
|
|
37
|
+
|
|
38
|
+
### global_flow.json
|
|
39
|
+
- **Source:** `architect_reconcile` agent -> `agent_output/reconciliation/global_flow.json`
|
|
40
|
+
- **Required:** yes
|
|
41
|
+
- **Shape:**
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"generated_at": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"format": "ISO-8601"
|
|
47
|
+
},
|
|
48
|
+
"total_modules": {
|
|
49
|
+
"type": "number"
|
|
50
|
+
},
|
|
51
|
+
"modules": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"items": {
|
|
54
|
+
"module_id": { "type": "string" },
|
|
55
|
+
"chain_completeness": { "type": "number" },
|
|
56
|
+
"cross_module_deps": { "type": "array", "items": { "type": "string" } }
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"system_dependency_graph": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"description": "Module dependency graph for detecting circular or conflicting dependencies"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### traceability.json
|
|
67
|
+
- **Source:** `architect_reconcile` agent -> `agent_output/reconciliation/traceability.json`
|
|
68
|
+
- **Required:** yes
|
|
69
|
+
- **Shape:**
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"chains": {
|
|
73
|
+
"type": "array",
|
|
74
|
+
"items": {
|
|
75
|
+
"story_id": { "type": "string" },
|
|
76
|
+
"module_id": { "type": "string" },
|
|
77
|
+
"chain_status": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"enum": ["complete", "partial", "broken"]
|
|
80
|
+
},
|
|
81
|
+
"gaps": {
|
|
82
|
+
"type": "array",
|
|
83
|
+
"items": {
|
|
84
|
+
"gap_type": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"enum": ["missing_screen", "missing_endpoint", "missing_db_model", "missing_flow_node", "orphan_endpoint", "orphan_screen"]
|
|
87
|
+
},
|
|
88
|
+
"description": { "type": "string" },
|
|
89
|
+
"severity": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"enum": ["critical", "warning", "info"]
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"summary": {
|
|
98
|
+
"type": "object",
|
|
99
|
+
"fields": {
|
|
100
|
+
"total_gaps": { "type": "number" },
|
|
101
|
+
"critical_gaps": { "type": "number" }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Review Outputs (unresolved findings)
|
|
108
|
+
- **Source:** `prd_review`, `fe_review`, `unified_review` agents -> `agent_output/reviews/{review_type}/findings.json`
|
|
109
|
+
- **Required:** no (conditional — only present if review agents ran; if reviews were skipped due to simple complexity, decision pack operates on traceability gaps alone)
|
|
110
|
+
- **Shape:**
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"review_type": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"enum": ["prd_review", "fe_review", "unified_review"],
|
|
116
|
+
"example": "unified_review"
|
|
117
|
+
},
|
|
118
|
+
"findings": {
|
|
119
|
+
"type": "array",
|
|
120
|
+
"description": "Unresolved findings from review agents",
|
|
121
|
+
"items": {
|
|
122
|
+
"finding_id": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"example": "UF-001"
|
|
125
|
+
},
|
|
126
|
+
"category": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"enum": ["inconsistency", "ambiguity", "missing", "conflict", "risk"],
|
|
129
|
+
"example": "conflict"
|
|
130
|
+
},
|
|
131
|
+
"description": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"example": "Auth module uses JWT tokens but billing module assumes session-based auth"
|
|
134
|
+
},
|
|
135
|
+
"severity": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"enum": ["critical", "warning", "info"],
|
|
138
|
+
"example": "critical"
|
|
139
|
+
},
|
|
140
|
+
"affected_modules": {
|
|
141
|
+
"type": "array",
|
|
142
|
+
"items": { "type": "string" },
|
|
143
|
+
"example": ["auth", "billing"]
|
|
144
|
+
},
|
|
145
|
+
"resolved": {
|
|
146
|
+
"type": "boolean",
|
|
147
|
+
"description": "Whether this was resolved during the review cycle",
|
|
148
|
+
"example": false
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Outputs
|
|
158
|
+
|
|
159
|
+
### gaps_questions.json
|
|
160
|
+
- **Path:** `agent_output/reconciliation/gaps_questions.json`
|
|
161
|
+
- **Format:** `json`
|
|
162
|
+
- **Consumers:** `user` (interactive), `decisions.json` (records answers)
|
|
163
|
+
- **Shape:**
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"generated_at": {
|
|
167
|
+
"type": "string",
|
|
168
|
+
"format": "ISO-8601"
|
|
169
|
+
},
|
|
170
|
+
"questions": {
|
|
171
|
+
"type": "array",
|
|
172
|
+
"description": "MCQ questions generated from traceability gaps",
|
|
173
|
+
"items": {
|
|
174
|
+
"question_id": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"description": "Unique question identifier",
|
|
177
|
+
"example": "GQ-001"
|
|
178
|
+
},
|
|
179
|
+
"source_gap": {
|
|
180
|
+
"type": "object",
|
|
181
|
+
"description": "The gap that produced this question",
|
|
182
|
+
"fields": {
|
|
183
|
+
"story_id": { "type": "string", "example": "US-AUTH-003" },
|
|
184
|
+
"gap_type": { "type": "string", "example": "missing_endpoint" },
|
|
185
|
+
"severity": { "type": "string", "example": "critical" }
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"question_text": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"description": "Clear, actionable question for the user",
|
|
191
|
+
"example": "Story US-AUTH-003 (password reset) has a screen but no backend endpoint. How should this be handled?"
|
|
192
|
+
},
|
|
193
|
+
"options": {
|
|
194
|
+
"type": "array",
|
|
195
|
+
"description": "Multiple choice options — each must be actionable, not vague",
|
|
196
|
+
"items": {
|
|
197
|
+
"option_id": {
|
|
198
|
+
"type": "string",
|
|
199
|
+
"example": "A"
|
|
200
|
+
},
|
|
201
|
+
"label": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"example": "Add a POST /api/auth/reset-password endpoint"
|
|
204
|
+
},
|
|
205
|
+
"impact": {
|
|
206
|
+
"type": "string",
|
|
207
|
+
"description": "What choosing this option means for the system",
|
|
208
|
+
"example": "Requires new BE route, service, and email integration for sending reset link"
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"minItems": 2,
|
|
212
|
+
"maxItems": 5
|
|
213
|
+
},
|
|
214
|
+
"recommended_option": {
|
|
215
|
+
"type": "string | null",
|
|
216
|
+
"description": "Agent's recommended option ID, null if no clear recommendation",
|
|
217
|
+
"example": "A"
|
|
218
|
+
},
|
|
219
|
+
"context": {
|
|
220
|
+
"type": "string",
|
|
221
|
+
"description": "Additional context to help user decide",
|
|
222
|
+
"example": "The FE screen SCR-AUTH-003 already has a form with email input and submit button. The wireframe shows a password reset flow."
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### conflicts_questions.json
|
|
230
|
+
- **Path:** `agent_output/reconciliation/conflicts_questions.json`
|
|
231
|
+
- **Format:** `json`
|
|
232
|
+
- **Consumers:** `user` (interactive), `decisions.json` (records answers)
|
|
233
|
+
- **Shape:**
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"generated_at": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"format": "ISO-8601"
|
|
239
|
+
},
|
|
240
|
+
"questions": {
|
|
241
|
+
"type": "array",
|
|
242
|
+
"description": "MCQ questions for conflicting decisions across modules or layers",
|
|
243
|
+
"items": {
|
|
244
|
+
"question_id": {
|
|
245
|
+
"type": "string",
|
|
246
|
+
"example": "CQ-001"
|
|
247
|
+
},
|
|
248
|
+
"conflict_source": {
|
|
249
|
+
"type": "object",
|
|
250
|
+
"description": "The conflict that produced this question",
|
|
251
|
+
"fields": {
|
|
252
|
+
"finding_id": { "type": "string", "example": "UF-001" },
|
|
253
|
+
"modules_involved": {
|
|
254
|
+
"type": "array",
|
|
255
|
+
"items": { "type": "string" },
|
|
256
|
+
"example": ["auth", "billing"]
|
|
257
|
+
},
|
|
258
|
+
"conflict_type": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"enum": ["architectural", "data_model", "security", "integration", "naming", "flow"],
|
|
261
|
+
"example": "architectural"
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
"question_text": {
|
|
266
|
+
"type": "string",
|
|
267
|
+
"example": "Auth module uses JWT tokens but billing module assumes session-based auth. Which auth strategy should be used system-wide?"
|
|
268
|
+
},
|
|
269
|
+
"options": {
|
|
270
|
+
"type": "array",
|
|
271
|
+
"items": {
|
|
272
|
+
"option_id": { "type": "string", "example": "A" },
|
|
273
|
+
"label": { "type": "string", "example": "Use JWT tokens across all modules" },
|
|
274
|
+
"impact": { "type": "string", "example": "Billing module needs to be updated to accept Bearer tokens instead of session cookies" }
|
|
275
|
+
},
|
|
276
|
+
"minItems": 2,
|
|
277
|
+
"maxItems": 5
|
|
278
|
+
},
|
|
279
|
+
"recommended_option": {
|
|
280
|
+
"type": "string | null",
|
|
281
|
+
"example": "A"
|
|
282
|
+
},
|
|
283
|
+
"context": {
|
|
284
|
+
"type": "string",
|
|
285
|
+
"example": "The global security policy already specifies JWT-based auth. The billing module's session assumption may be from an older design decision."
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### decisions.json
|
|
293
|
+
- **Path:** `agent_output/reconciliation/decisions.json`
|
|
294
|
+
- **Format:** `json`
|
|
295
|
+
- **Consumers:** `prd_generation`, `impl_prep`, `pre_code_analysis`, all implementation agents
|
|
296
|
+
- **Shape:**
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"generated_at": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"format": "ISO-8601"
|
|
302
|
+
},
|
|
303
|
+
"decided_by": {
|
|
304
|
+
"type": "string",
|
|
305
|
+
"description": "Who made these decisions (user identifier)",
|
|
306
|
+
"example": "user"
|
|
307
|
+
},
|
|
308
|
+
"gap_decisions": {
|
|
309
|
+
"type": "array",
|
|
310
|
+
"description": "User's answers to gap questions",
|
|
311
|
+
"items": {
|
|
312
|
+
"question_id": {
|
|
313
|
+
"type": "string",
|
|
314
|
+
"example": "GQ-001"
|
|
315
|
+
},
|
|
316
|
+
"selected_option": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"description": "Option ID the user chose",
|
|
319
|
+
"example": "A"
|
|
320
|
+
},
|
|
321
|
+
"reasoning": {
|
|
322
|
+
"type": "string",
|
|
323
|
+
"description": "User's reasoning for the choice (may be empty if not provided)",
|
|
324
|
+
"example": "Password reset is a core auth feature that must have a backend endpoint"
|
|
325
|
+
},
|
|
326
|
+
"impact_summary": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"description": "Summary of what this decision means for downstream agents",
|
|
329
|
+
"example": "BE agent must create POST /api/auth/reset-password endpoint with email integration"
|
|
330
|
+
},
|
|
331
|
+
"affects_modules": {
|
|
332
|
+
"type": "array",
|
|
333
|
+
"items": { "type": "string" },
|
|
334
|
+
"example": ["auth"]
|
|
335
|
+
},
|
|
336
|
+
"affects_layers": {
|
|
337
|
+
"type": "array",
|
|
338
|
+
"items": { "type": "string", "enum": ["fe", "be", "db"] },
|
|
339
|
+
"example": ["be"]
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"conflict_decisions": {
|
|
344
|
+
"type": "array",
|
|
345
|
+
"description": "User's answers to conflict questions",
|
|
346
|
+
"items": {
|
|
347
|
+
"question_id": {
|
|
348
|
+
"type": "string",
|
|
349
|
+
"example": "CQ-001"
|
|
350
|
+
},
|
|
351
|
+
"selected_option": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"example": "A"
|
|
354
|
+
},
|
|
355
|
+
"reasoning": {
|
|
356
|
+
"type": "string",
|
|
357
|
+
"example": "JWT is more scalable and aligns with our stateless architecture goal"
|
|
358
|
+
},
|
|
359
|
+
"impact_summary": {
|
|
360
|
+
"type": "string",
|
|
361
|
+
"example": "All modules must use JWT Bearer tokens for authentication"
|
|
362
|
+
},
|
|
363
|
+
"affects_modules": {
|
|
364
|
+
"type": "array",
|
|
365
|
+
"items": { "type": "string" },
|
|
366
|
+
"example": ["auth", "billing"]
|
|
367
|
+
},
|
|
368
|
+
"affects_layers": {
|
|
369
|
+
"type": "array",
|
|
370
|
+
"items": { "type": "string", "enum": ["fe", "be", "db"] },
|
|
371
|
+
"example": ["be", "fe"]
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
"summary": {
|
|
376
|
+
"type": "object",
|
|
377
|
+
"fields": {
|
|
378
|
+
"total_questions": { "type": "number" },
|
|
379
|
+
"total_gap_decisions": { "type": "number" },
|
|
380
|
+
"total_conflict_decisions": { "type": "number" },
|
|
381
|
+
"modules_affected": { "type": "array", "items": { "type": "string" } },
|
|
382
|
+
"layers_affected": { "type": "array", "items": { "type": "string" } }
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Dependencies
|
|
391
|
+
|
|
392
|
+
| Depends On | Agent | Artifact | Why |
|
|
393
|
+
|---|---|---|---|
|
|
394
|
+
| input | `architect_reconcile` | `global_flow.json` | Provides system-wide flow context for understanding the scope of gaps |
|
|
395
|
+
| input | `architect_reconcile` | `traceability.json` | Provides broken chains and gaps that become questions |
|
|
396
|
+
| input | `prd_review` | `findings.json` | Unresolved review findings become conflict/gap questions |
|
|
397
|
+
| input | `fe_review` | `findings.json` | Unresolved FE review findings |
|
|
398
|
+
| input | `unified_review` | `findings.json` | Unresolved cross-layer review findings |
|
|
399
|
+
|
|
400
|
+
| Blocks | Agent | Why |
|
|
401
|
+
|---|---|---|
|
|
402
|
+
| output | `prd_generation` | PRD must include all decisions made |
|
|
403
|
+
| output | `module_sequencer` | Sequencer may need decisions to resolve priority conflicts |
|
|
404
|
+
| output | `impl_prep` | Decisions may affect project structure |
|
|
405
|
+
| output | `pre_code_analysis` | Implementation planning must honor decisions |
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## Orchestrator Communication
|
|
410
|
+
|
|
411
|
+
> Reference: `v2/architecture/agent-orchestrator-communication.md`
|
|
412
|
+
|
|
413
|
+
### Agent Identity
|
|
414
|
+
|
|
415
|
+
This agent's ID is `decision_pack`. Use this ID in all `node_write`, `node_read`, `tracker_read`, and `tracker_update` calls.
|
|
416
|
+
|
|
417
|
+
### Tracker Access
|
|
418
|
+
|
|
419
|
+
| Direction | Compressed Keys | Purpose |
|
|
420
|
+
|---|---|---|
|
|
421
|
+
| read | `md.a` | Read active modules to understand scope of gaps and conflicts |
|
|
422
|
+
| write | `ag` | Report agent status (completed/failed) |
|
|
423
|
+
|
|
424
|
+
### Output Meta
|
|
425
|
+
|
|
426
|
+
This agent does not produce routing/coordination metadata. `output_meta: null`.
|
|
427
|
+
|
|
428
|
+
### Completion Signal
|
|
429
|
+
|
|
430
|
+
- **On success:** `tracker_update(agent_id: "decision_pack", status: "completed")`
|
|
431
|
+
- **On failure:** `tracker_update(agent_id: "decision_pack", status: "failed", add_intervention: { id: "...", agent_id: "decision_pack", type: "error", message: "..." })`
|
|
432
|
+
|
|
433
|
+
### Scope Resolution
|
|
434
|
+
|
|
435
|
+
Global agent — runs once across all modules. Reads `md.a` from tracker via `tracker_read` to understand which modules are active when processing traceability gaps.
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Compressed Keymap
|
|
440
|
+
|
|
441
|
+
Use these compressed keys in all `node_write` calls. The registry validates against this map — unknown keys are rejected.
|
|
442
|
+
|
|
443
|
+
**gaps_questions.json**
|
|
444
|
+
|
|
445
|
+
| Key | Full Name | Description |
|
|
446
|
+
|---|---|---|
|
|
447
|
+
| `ga` | generated_at | Timestamp of generation |
|
|
448
|
+
| `qs` | questions | Array of gap questions |
|
|
449
|
+
| `qi` | question_id | Unique question identifier |
|
|
450
|
+
| `sg` | source_gap | Gap source reference object |
|
|
451
|
+
| `sg.si` | story_id | Story that surfaced the gap |
|
|
452
|
+
| `sg.gt` | gap_type | Type of gap detected |
|
|
453
|
+
| `sg.sv` | severity | Gap severity level |
|
|
454
|
+
| `qt` | question_text | Human-readable question |
|
|
455
|
+
| `op` | options | Array of answer options |
|
|
456
|
+
| `op.oi` | option_id | Unique option identifier |
|
|
457
|
+
| `op.lb` | label | Option label text |
|
|
458
|
+
| `op.ip` | impact | Impact description of choosing this option |
|
|
459
|
+
| `ro` | recommended_option | Agent-recommended option_id |
|
|
460
|
+
| `cx` | context | Supporting context for the question |
|
|
461
|
+
|
|
462
|
+
**conflicts_questions.json**
|
|
463
|
+
|
|
464
|
+
| Key | Full Name | Description |
|
|
465
|
+
|---|---|---|
|
|
466
|
+
| `ga` | generated_at | Timestamp of generation |
|
|
467
|
+
| `qs` | questions | Array of conflict questions |
|
|
468
|
+
| `qi` | question_id | Unique question identifier |
|
|
469
|
+
| `cs` | conflict_source | Conflict source reference object |
|
|
470
|
+
| `cs.fi` | finding_id | Finding that surfaced the conflict |
|
|
471
|
+
| `cs.mi` | modules_involved | Modules involved in the conflict |
|
|
472
|
+
| `cs.ct` | conflict_type | Type of conflict detected |
|
|
473
|
+
| `qt` | question_text | Human-readable question |
|
|
474
|
+
| `op` | options | Array of answer options |
|
|
475
|
+
| `op.oi` | option_id | Unique option identifier |
|
|
476
|
+
| `op.lb` | label | Option label text |
|
|
477
|
+
| `op.ip` | impact | Impact description of choosing this option |
|
|
478
|
+
| `ro` | recommended_option | Agent-recommended option_id |
|
|
479
|
+
| `cx` | context | Supporting context for the question |
|
|
480
|
+
|
|
481
|
+
**decisions.json**
|
|
482
|
+
|
|
483
|
+
| Key | Full Name | Description |
|
|
484
|
+
|---|---|---|
|
|
485
|
+
| `ga` | generated_at | Timestamp of generation |
|
|
486
|
+
| `db` | decided_by | Who made the decisions (user/auto) |
|
|
487
|
+
| `gd` | gap_decisions | Array of gap decision records |
|
|
488
|
+
| `cd` | conflict_decisions | Array of conflict decision records |
|
|
489
|
+
| `gd.qi` | question_id | Question being answered |
|
|
490
|
+
| `gd.so` | selected_option | Chosen option_id |
|
|
491
|
+
| `gd.rt` | reasoning | Rationale for the decision |
|
|
492
|
+
| `gd.is` | impact_summary | Summary of decision impact |
|
|
493
|
+
| `gd.am` | affects_modules | Modules affected by decision |
|
|
494
|
+
| `gd.al` | affects_layers | Layers affected by decision |
|
|
495
|
+
| `sm` | summary | Decisions summary object |
|
|
496
|
+
| `sm.tq` | total_questions | Total questions presented |
|
|
497
|
+
| `sm.tg` | total_gap_decisions | Total gap decisions made |
|
|
498
|
+
| `sm.tc` | total_conflict_decisions | Total conflict decisions made |
|
|
499
|
+
| `sm.ma` | modules_affected | Unique modules affected |
|
|
500
|
+
| `sm.la` | layers_affected | Unique layers affected |
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## Tools Required
|
|
505
|
+
|
|
506
|
+
| Tool | Purpose | Exists? |
|
|
507
|
+
|---|---|---|
|
|
508
|
+
| `node_write` | Write decisions output via registry-validated compressed keys. Agent calls `node_write(agent_id: "decision_pack", output_key: "decisions", data: {...})`. | Pending |
|
|
509
|
+
| `node_read` | Read upstream artifacts (global_flow, traceability, review findings). Agent calls `node_read(agent_id: "decision_pack", input_key: "traceability")`. | Pending |
|
|
510
|
+
| `tracker_read` | Read active modules. Agent calls `tracker_read(agent_id: "decision_pack", fields: ["md.a"])`. | Pending |
|
|
511
|
+
| `tracker_update` | Report completion/failure. Agent calls `tracker_update(agent_id: "decision_pack", status: "completed")`. | Pending |
|
|
512
|
+
| `conversation_handler` | Present MCQ questions to user and capture responses interactively | yes |
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## Guardrails
|
|
517
|
+
|
|
518
|
+
### Rules
|
|
519
|
+
|
|
520
|
+
| ID | Category | Severity | Rule |
|
|
521
|
+
|---|---|---|---|
|
|
522
|
+
| R-001 | `constraint` | `must` | Must present ALL unresolved items. No gap or unresolved finding may be silently skipped. |
|
|
523
|
+
| R-002 | `output_quality` | `must` | MCQ options must be actionable — each option must describe a concrete action, not a vague statement like "handle it later" or "figure it out". |
|
|
524
|
+
| R-003 | `constraint` | `must` | Must record user decisions with the selected_option, reasoning (if provided), and impact_summary. Decisions without at least option and impact are invalid. |
|
|
525
|
+
| R-004 | `interaction` | `must` | Must present questions in priority order — critical gaps first, then warnings, then info. User's time is valuable. |
|
|
526
|
+
| R-005 | `output_quality` | `must` | Each question must include context that helps the user understand the situation without reading the raw traceability data. |
|
|
527
|
+
| R-006 | `scope_boundary` | `must` | Must not make decisions on behalf of the user. The agent recommends but the user decides. |
|
|
528
|
+
| R-007 | `data_handling` | `must` | Must link every question back to its source gap (gap_type, story_id) or source finding (finding_id). Full traceability. |
|
|
529
|
+
| R-008 | `output_quality` | `should` | Questions should group related gaps (e.g., multiple gaps for the same module) to reduce user cognitive load. |
|
|
530
|
+
| R-009 | `interaction` | `should` | Should provide a recommended_option when the agent has enough context to suggest one, with clear reasoning. |
|
|
531
|
+
| R-010 | `constraint` | `must` | If there are zero gaps and zero conflicts, decisions.json must still be produced with empty arrays and a summary confirming no decisions needed. |
|
|
532
|
+
| R-011 | `constraint` | `must` | Must use compressed keys as defined in the Compressed Keymap section for all `node_write` / `node_read` calls. Never use expanded/full key names. |
|
|
533
|
+
| R-012 | `constraint` | `must` | Must use `node_write` to write output and `node_read` to read upstream artifacts. Must not use raw file writes, generic file_writer, or any other method. |
|
|
534
|
+
| R-013 | `constraint` | `must` | Must call `tracker_update(agent_id: "decision_pack", status: "completed")` before exiting on success. Must call `tracker_update(agent_id: "decision_pack", status: "failed", add_intervention: {...})` before exiting on failure. |
|
|
535
|
+
| R-014 | `constraint` | `must` | Must read active modules via `tracker_read(agent_id: "decision_pack", fields: ["md.a"])` when resolving scope. Must not hardcode module lists. |
|
|
536
|
+
|
|
537
|
+
### Limits
|
|
538
|
+
|
|
539
|
+
| Resource | Value |
|
|
540
|
+
|---|---|
|
|
541
|
+
| max_retries | 3 |
|
|
542
|
+
| max_tokens | 16384 |
|
|
543
|
+
| max_questions | 100 |
|
|
544
|
+
| max_options_per_question | 5 |
|
|
545
|
+
| timeout_seconds | 600 |
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## Scope Boundary
|
|
550
|
+
|
|
551
|
+
**In scope:**
|
|
552
|
+
- Converting traceability gaps into MCQ questions
|
|
553
|
+
- Converting unresolved review findings into MCQ questions
|
|
554
|
+
- Detecting conflicting decisions across modules/layers
|
|
555
|
+
- Presenting questions to the user interactively
|
|
556
|
+
- Recording user decisions with reasoning and impact
|
|
557
|
+
- Providing recommended options with context
|
|
558
|
+
- Grouping related questions for efficient user interaction
|
|
559
|
+
|
|
560
|
+
**Out of scope:**
|
|
561
|
+
- Fixing gaps in the codebase or contracts (implementation agents do this)
|
|
562
|
+
- Modifying traceability.json or any input artifacts
|
|
563
|
+
- Making binding decisions without user input
|
|
564
|
+
- Generating code or architecture changes
|
|
565
|
+
- Re-running review cycles
|
|
566
|
+
- Prioritizing modules for implementation (module_sequencer does this)
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Triggers
|
|
571
|
+
|
|
572
|
+
- Orchestrator activates this agent after architect_reconcile completes and traceability.json is available
|
|
573
|
+
- Also triggered when all review outputs (prd_review, fe_review, unified_review) have completed their cycles
|
|
574
|
+
- In retrofit mode, questions focus only on affected modules
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
## Checkpoints
|
|
579
|
+
|
|
580
|
+
| ID | Description | Action |
|
|
581
|
+
|---|---|---|
|
|
582
|
+
| `CP-001` | Traceability gaps and review findings loaded | `log` |
|
|
583
|
+
| `CP-002` | Gap questions generated | `log` |
|
|
584
|
+
| `CP-003` | Conflict detection complete | `log` |
|
|
585
|
+
| `CP-004` | Conflict questions generated | `log` |
|
|
586
|
+
| `CP-005` | Questions presented to user | `pause` — wait for user responses |
|
|
587
|
+
| `CP-006` | All user responses recorded | `notify` — downstream agents can proceed |
|
|
588
|
+
| `CP-007` | decisions.json written and validated | `log` |
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## Validation Criteria
|
|
593
|
+
|
|
594
|
+
- Every gap in traceability.json with severity "critical" or "warning" has a corresponding question in gaps_questions.json
|
|
595
|
+
- Every unresolved finding from review outputs has a corresponding question in conflicts_questions.json
|
|
596
|
+
- Every question has at least 2 options and no more than 5
|
|
597
|
+
- Every option has a non-empty label and impact description
|
|
598
|
+
- Every decision in decisions.json has a valid question_id that matches a question
|
|
599
|
+
- decisions.json summary counts match the actual array lengths
|
|
600
|
+
- No question is presented without context
|
|
601
|
+
- If no gaps and no conflicts exist, decisions.json is produced with empty arrays
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
605
|
+
## Context Sources
|
|
606
|
+
|
|
607
|
+
- traceability.json from architect_reconcile (gap data)
|
|
608
|
+
- global_flow.json from architect_reconcile (system context)
|
|
609
|
+
- Review findings from prd_review, fe_review, unified_review
|
|
610
|
+
- User responses during interactive MCQ session
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Operation Mode
|
|
615
|
+
|
|
616
|
+
| Field | Value |
|
|
617
|
+
|---|---|
|
|
618
|
+
| Type | `interactive` |
|
|
619
|
+
| Fallback | `none` — if decision pack fails, unresolved gaps propagate to implementation causing unpredictable behavior |
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## Tool Gaps
|
|
624
|
+
|
|
625
|
+
| Gap ID | Description | Needed By | Impact Without |
|
|
626
|
+
|---|---|---|---|
|
|
627
|
+
| `TG-001` | `node_write` MCP tool not yet built | this agent | Cannot write output with registry validation -- blocked |
|
|
628
|
+
| `TG-002` | `node_read` MCP tool not yet built | this agent | Cannot read upstream artifacts with field enforcement -- blocked |
|
|
629
|
+
| `TG-003` | `tracker_read` MCP tool not yet built | this agent | Cannot read active modules -- blocked |
|
|
630
|
+
| `TG-004` | `tracker_update` MCP tool not yet built | this agent | Cannot report completion -- blocked |
|
|
631
|
+
| `TG-005` | Question generator that converts structured gap/finding data into well-formed MCQ questions with actionable options and impact descriptions | this agent | Questions would be poorly structured and hard for users to answer, leading to ambiguous decisions |
|
|
632
|
+
| `TG-006` | Conflict detector that compares assumptions and decisions across modules and layers to identify contradictions | this agent | Architectural conflicts would go undetected and surface only during implementation, causing expensive rework |
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## Generation Readiness
|
|
637
|
+
|
|
638
|
+
| `generate_agent` Param | Status | Notes |
|
|
639
|
+
|---|---|---|
|
|
640
|
+
| `fileName` | ready | `decision-pack` |
|
|
641
|
+
| `agentName` | ready | `decision_pack` |
|
|
642
|
+
| `agentRole` | ready | "Gap and Conflict Question Generator with Interactive Decision Recording" |
|
|
643
|
+
| `agentDescription` | ready | Full description available from Goal section |
|
|
644
|
+
| `operationMode` | ready | `interactive`, no fallback |
|
|
645
|
+
| `goal` | ready | 3 objectives defined with priorities |
|
|
646
|
+
| `inputs` | ready | 3 inputs: global_flow.json, traceability.json, review findings |
|
|
647
|
+
| `guardrails` | ready | 14 rules defined across constraint, output_quality, interaction, scope_boundary, data_handling categories |
|
|
648
|
+
| `scopeBoundary` | ready | 7 in-scope items, 6 out-of-scope items |
|
|
649
|
+
| `outputFormat` | ready | JSON output with full schemas for gaps_questions.json, conflicts_questions.json, decisions.json |
|
|
650
|
+
| `triggers` | ready | 3 triggers defined |
|
|
651
|
+
| `checkpoints` | ready | 7 checkpoints with actions |
|
|
652
|
+
| `validation` | ready | 8 validation criteria |
|
|
653
|
+
| `contextSources` | ready | 4 context sources |
|
|
654
|
+
| `metadata` | ready | phase: "8", mode: "both", granularity: "global" |
|