okstra 0.146.0 → 0.147.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 (65) hide show
  1. package/README.md +2 -2
  2. package/docs/architecture/storage-model.md +8 -7
  3. package/docs/architecture.md +18 -12
  4. package/docs/cli.md +3 -3
  5. package/docs/project-structure-overview.md +16 -14
  6. package/package.json +1 -1
  7. package/runtime/BUILD.json +2 -2
  8. package/runtime/agents/workers/report-writer-worker.md +10 -10
  9. package/runtime/bin/okstra-render-final-report.py +4 -4
  10. package/runtime/bin/okstra-render-report-views.py +100 -12
  11. package/runtime/bin/okstra-trace-cleanup.sh +13 -9
  12. package/runtime/prompts/lead/okstra-lead-contract.md +4 -4
  13. package/runtime/prompts/lead/report-writer.md +15 -11
  14. package/runtime/prompts/profiles/_common-contract.md +13 -7
  15. package/runtime/prompts/profiles/improvement-discovery.md +3 -1
  16. package/runtime/python/okstra_ctl/final_report_schema.py +37 -12
  17. package/runtime/python/okstra_ctl/render_final_report.py +136 -28
  18. package/runtime/python/okstra_ctl/report_contract.py +124 -0
  19. package/runtime/python/okstra_ctl/report_finalize.py +1 -1
  20. package/runtime/python/okstra_ctl/report_html/__init__.py +10 -0
  21. package/runtime/python/okstra_ctl/report_html/common.py +50 -0
  22. package/runtime/python/okstra_ctl/report_html/models.py +59 -0
  23. package/runtime/python/okstra_ctl/report_html/render.py +69 -0
  24. package/runtime/python/okstra_ctl/report_html/router.py +40 -0
  25. package/runtime/python/okstra_ctl/report_html/view_models/__init__.py +1 -0
  26. package/runtime/python/okstra_ctl/report_html/view_models/change_impact_analysis.py +38 -0
  27. package/runtime/python/okstra_ctl/report_html/view_models/error_analysis.py +48 -0
  28. package/runtime/python/okstra_ctl/report_html/view_models/feature_analysis.py +38 -0
  29. package/runtime/python/okstra_ctl/report_html/view_models/final_verification.py +46 -0
  30. package/runtime/python/okstra_ctl/report_html/view_models/implementation.py +46 -0
  31. package/runtime/python/okstra_ctl/report_html/view_models/implementation_planning.py +102 -0
  32. package/runtime/python/okstra_ctl/report_html/view_models/improvement_discovery.py +42 -0
  33. package/runtime/python/okstra_ctl/report_html/view_models/project_analysis.py +54 -0
  34. package/runtime/python/okstra_ctl/report_html/view_models/release_handoff.py +53 -0
  35. package/runtime/python/okstra_ctl/report_html/view_models/requirements_discovery.py +54 -0
  36. package/runtime/python/okstra_ctl/report_html/visualizations.py +113 -0
  37. package/runtime/python/okstra_ctl/report_view_artifacts.py +4 -1
  38. package/runtime/python/okstra_ctl/report_views.py +15 -43
  39. package/runtime/python/okstra_ctl/run.py +12 -6
  40. package/runtime/python/okstra_ctl/schema_excerpt.py +7 -17
  41. package/runtime/schemas/final-report-v2.0.schema.json +3923 -0
  42. package/runtime/templates/reports/final-report-v2.template.md +66 -0
  43. package/runtime/templates/reports/html/assets/base.css +38 -0
  44. package/runtime/templates/reports/html/assets/base.js +5 -0
  45. package/runtime/templates/reports/html/base.template.html +65 -0
  46. package/runtime/templates/reports/html/macros/forms.html +47 -0
  47. package/runtime/templates/reports/html/macros/layout.html +19 -0
  48. package/runtime/templates/reports/html/macros/visualizations.html +17 -0
  49. package/runtime/templates/reports/html/tasks/change-impact-analysis.template.html +40 -0
  50. package/runtime/templates/reports/html/tasks/error-analysis.template.html +40 -0
  51. package/runtime/templates/reports/html/tasks/feature-analysis.template.html +40 -0
  52. package/runtime/templates/reports/html/tasks/final-verification.template.html +39 -0
  53. package/runtime/templates/reports/html/tasks/implementation-planning.template.html +47 -0
  54. package/runtime/templates/reports/html/tasks/implementation.template.html +40 -0
  55. package/runtime/templates/reports/html/tasks/improvement-discovery.template.html +29 -0
  56. package/runtime/templates/reports/html/tasks/project-analysis.template.html +57 -0
  57. package/runtime/templates/reports/html/tasks/release-handoff.template.html +36 -0
  58. package/runtime/templates/reports/html/tasks/requirements-discovery.template.html +37 -0
  59. package/runtime/validators/validate-report-views.py +86 -4
  60. package/runtime/validators/validate-run.py +62 -9
  61. package/runtime/validators/validate_improvement_report.py +55 -0
  62. package/src/commands/lifecycle/install.mjs +18 -13
  63. package/src/commands/report/finalize.mjs +2 -3
  64. package/src/commands/report/render-final-report.mjs +4 -2
  65. package/src/commands/report/render-views.mjs +8 -8
@@ -0,0 +1,3923 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://okstra.dev/schemas/final-report-v2.0.json",
4
+ "title": "OKSTRA Final Report Data (v2.0)",
5
+ "description": "JSON SSOT for okstra final reports. Written by report-writer-worker in Phase 6, then consumed independently by the AI handoff Markdown renderer and the task-specific human HTML renderer.",
6
+ "type": "object",
7
+ "required": [
8
+ "schemaVersion",
9
+ "humanSummary",
10
+ "meta",
11
+ "frontmatter",
12
+ "header",
13
+ "verdictCard",
14
+ "rationale",
15
+ "summary",
16
+ "executionStatus",
17
+ "tokenUsage",
18
+ "crossVerification",
19
+ "finalVerdict",
20
+ "evidence",
21
+ "missingInformation",
22
+ "clarificationItems",
23
+ "recommendedNextSteps",
24
+ "followUpTasks"
25
+ ],
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "schemaVersion": {
29
+ "const": "2.0",
30
+ "description": "Schema version. Renderer refuses to process unknown versions."
31
+ },
32
+
33
+ "humanSummary": { "$ref": "#/$defs/HumanSummary" },
34
+
35
+ "meta": {
36
+ "type": "object",
37
+ "additionalProperties": true,
38
+ "required": ["reportLanguage"],
39
+ "properties": {
40
+ "reportLanguage": {
41
+ "type": "string",
42
+ "enum": ["en", "ko"],
43
+ "description": "Resolved language used for prose + i18n dictionary. 'auto' must be resolved to 'en' or 'ko' by the lead before the report-writer worker writes data.json."
44
+ }
45
+ }
46
+ },
47
+
48
+ "frontmatter": {
49
+ "type": "object",
50
+ "required": [
51
+ "title",
52
+ "id",
53
+ "tags",
54
+ "status",
55
+ "aliases",
56
+ "date",
57
+ "taskId",
58
+ "taskGroup",
59
+ "projectId",
60
+ "taskType",
61
+ "workerId",
62
+ "approved"
63
+ ],
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "title": { "type": "string", "minLength": 1 },
67
+ "id": { "type": "string", "minLength": 1 },
68
+ "tags": {
69
+ "type": "array",
70
+ "items": { "type": "string" },
71
+ "minItems": 1
72
+ },
73
+ "status": { "enum": ["in-progress", "completed", "draft"] },
74
+ "aliases": {
75
+ "type": "array",
76
+ "items": { "type": "string" }
77
+ },
78
+ "date": {
79
+ "type": "string",
80
+ "description": "ISO 8601 date or datetime. Renderer emits verbatim."
81
+ },
82
+ "taskId": { "type": "string", "minLength": 1 },
83
+ "taskGroup": { "type": "string", "minLength": 1 },
84
+ "projectId": { "type": "string", "minLength": 1 },
85
+ "taskType": { "$ref": "#/$defs/TaskType" },
86
+ "workerId": { "const": "report-writer" },
87
+ "approved": {
88
+ "type": "boolean",
89
+ "description": "사용자 승인 플래그. report-writer 는 항상 false 로 발행하고, 사용자가 `--approve` 또는 직접 편집으로 true 로 토글합니다. `implementation` task-type 의 prepare 단계가 `--approved-plan` 으로 지정된 보고서의 이 필드를 읽어 진입 여부를 결정합니다. 다른 task-type 에서는 의미 없이 false 로 유지됩니다."
90
+ },
91
+ "implementationOption": {
92
+ "type": "string",
93
+ "description": "유저가 implementation-planning final-report 에서 고른 Option Candidate 이름. report-writer 는 항상 빈 문자열로 발행하고, 사용자가 `--implementation-option <name>` 또는 직접 편집으로 채웁니다. `implementation` task-type 이 이 값으로 진행하며, 비어 있으면 plan 의 `Recommended Option` 으로 폴백합니다. 다른 task-type 에서는 의미 없이 빈 값으로 유지됩니다."
94
+ }
95
+ }
96
+ },
97
+
98
+ "header": {
99
+ "type": "object",
100
+ "required": [
101
+ "taskKey",
102
+ "createdAt",
103
+ "taskType",
104
+ "reportOwner",
105
+ "reportAuthor",
106
+ "leadModel",
107
+ "okstraVersion"
108
+ ],
109
+ "additionalProperties": false,
110
+ "properties": {
111
+ "taskKey": { "type": "string", "minLength": 1 },
112
+ "createdAt": { "type": "string", "minLength": 1 },
113
+ "taskType": { "$ref": "#/$defs/TaskType" },
114
+ "reportOwner": { "const": "Claude lead" },
115
+ "reportAuthor": {
116
+ "enum": ["Report writer worker", "Claude lead"],
117
+ "description": "Lead-authored fallback is only valid for release-handoff or recorded report-writer dispatch failure."
118
+ },
119
+ "leadModel": { "type": "string", "minLength": 1 },
120
+ "okstraVersion": { "type": "string", "minLength": 1 }
121
+ }
122
+ },
123
+
124
+ "verificationScope": { "enum": ["whole-task", "single-stage"] },
125
+
126
+ "clarificationCarryIn": {
127
+ "type": "object",
128
+ "description": "RENDER_IF non-empty. Carry-in clarifications from the previous run.",
129
+ "required": ["sourceFile"],
130
+ "additionalProperties": false,
131
+ "properties": {
132
+ "sourceFile": {
133
+ "type": "string",
134
+ "minLength": 1,
135
+ "description": "Project-relative path to the prior run's clarification-response sidecar."
136
+ }
137
+ }
138
+ },
139
+
140
+ "verdictCard": {
141
+ "type": "object",
142
+ "description": "Top-of-report at-a-glance card. Values MUST byte-match finalVerdict and recommendedNextSteps[0]; renderer fills both from this data structure so divergence is impossible.",
143
+ "required": [
144
+ "finalConclusion",
145
+ "verdictToken",
146
+ "direction",
147
+ "approvalRequired",
148
+ "nextStep"
149
+ ],
150
+ "additionalProperties": false,
151
+ "properties": {
152
+ "finalConclusion": { "type": "string", "minLength": 1, "description": "Conclusion SSOT for the whole report: at most 3 sentences. Other prose blocks reference this instead of restating it." },
153
+ "verdictToken": { "$ref": "#/$defs/VerdictToken" },
154
+ "direction": { "$ref": "#/$defs/Direction" },
155
+ "approvalRequired": { "type": "boolean" },
156
+ "nextStep": { "type": "string", "minLength": 1 }
157
+ }
158
+ },
159
+
160
+ "rationale": {
161
+ "type": "object",
162
+ "description": "## 작업 배경과 근거 — reviewer-facing narrative answering the four questions in order. Each field is prose (not a table) and MUST carry at least one evidence reference (path:line, a report ID such as C-001/F-013/§5.4, or another cited source) OR an explicit insufficiency marker (e.g. '근거 불충분'). validate-run.py fails a field with neither. Required for every task-type. Prose budget: at most 2 sentences per field; reference verdictCard.finalConclusion and row IDs instead of restating them.",
163
+ "required": ["motivation", "problem", "approach", "justification"],
164
+ "additionalProperties": false,
165
+ "properties": {
166
+ "motivation": { "type": "string", "minLength": 1, "description": "왜 이 작업을 하는가 — 목표·맥락. ≤2 sentences." },
167
+ "problem": { "type": "string", "minLength": 1, "description": "왜 이게 문제인가 — 현재 상태의 결함을 증거로. ≤2 sentences." },
168
+ "approach": { "type": "string", "minLength": 1, "description": "그래서 어떤 작업이 필요한가 — 택한 방향. ≤2 sentences." },
169
+ "justification": { "type": "string", "minLength": 1, "description": "왜 이게 합리적 선택인가 — 대안 대비 근거. ≤2 sentences." }
170
+ }
171
+ },
172
+
173
+ "summary": {
174
+ "type": "array",
175
+ "description": "## Summary of the Problem or Verification Target. 3-5 rows.",
176
+ "minItems": 1,
177
+ "maxItems": 8,
178
+ "items": { "$ref": "#/$defs/SummaryRow" }
179
+ },
180
+
181
+ "ticketCoverage": {
182
+ "oneOf": [
183
+ {
184
+ "type": "object",
185
+ "description": "Single-ticket run: one-line `- Single ticket run: <ticket>`.",
186
+ "required": ["singleTicket"],
187
+ "additionalProperties": false,
188
+ "properties": {
189
+ "singleTicket": { "type": "string", "minLength": 1 }
190
+ }
191
+ },
192
+ {
193
+ "type": "object",
194
+ "description": "Multi-ticket run: reverse index table.",
195
+ "required": ["rows"],
196
+ "additionalProperties": false,
197
+ "properties": {
198
+ "rows": {
199
+ "type": "array",
200
+ "minItems": 1,
201
+ "items": { "$ref": "#/$defs/TicketCoverageRow" }
202
+ }
203
+ }
204
+ },
205
+ {
206
+ "type": "object",
207
+ "description": "Omit Ticket Coverage entirely (release-handoff / final-verification).",
208
+ "required": ["omit"],
209
+ "additionalProperties": false,
210
+ "properties": {
211
+ "omit": { "const": true }
212
+ }
213
+ }
214
+ ]
215
+ },
216
+
217
+ "executionStatus": {
218
+ "type": "array",
219
+ "description": "## Execution Status by Agent. One row per worker incl. lead. Token cells stay null until Phase 7 token-usage step fills them.",
220
+ "minItems": 1,
221
+ "items": { "$ref": "#/$defs/ExecutionStatusRow" }
222
+ },
223
+
224
+ "tokenUsage": {
225
+ "type": "object",
226
+ "description": "## Token Usage Summary. All numeric cells are null in Phase 6 and filled by Phase 7 token-usage step.",
227
+ "required": ["lead", "worker", "grand", "cli"],
228
+ "additionalProperties": false,
229
+ "properties": {
230
+ "lead": { "$ref": "#/$defs/TokenUsageRow" },
231
+ "worker": { "$ref": "#/$defs/TokenUsageRow" },
232
+ "grand": { "$ref": "#/$defs/TokenUsageRow" },
233
+ "workerDetails": {
234
+ "type": "array",
235
+ "description": "Optional Phase 7 expansion rows rendered under the Worker subtotal.",
236
+ "items": { "$ref": "#/$defs/TokenUsageWorkerDetailRow" }
237
+ },
238
+ "cli": {
239
+ "type": "object",
240
+ "additionalProperties": false,
241
+ "required": ["costUsd"],
242
+ "properties": {
243
+ "costUsd": {
244
+ "oneOf": [
245
+ { "type": "number", "minimum": 0 },
246
+ { "type": "null" }
247
+ ]
248
+ }
249
+ }
250
+ }
251
+ }
252
+ },
253
+
254
+ "crossVerification": {
255
+ "type": "object",
256
+ "required": ["consensus", "differences"],
257
+ "additionalProperties": false,
258
+ "properties": {
259
+ "roundHistory": {
260
+ "oneOf": [
261
+ {
262
+ "type": "object",
263
+ "description": "Convergence-enabled run.",
264
+ "required": ["rounds", "round2SkippedReason"],
265
+ "additionalProperties": false,
266
+ "properties": {
267
+ "rounds": {
268
+ "type": "array",
269
+ "items": { "$ref": "#/$defs/RoundHistoryRow" }
270
+ },
271
+ "round2SkippedReason": {
272
+ "enum": [
273
+ "queue-empty",
274
+ "max-rounds-1",
275
+ "all-reverify-non-result",
276
+ "not-skipped",
277
+ "convergence-disabled",
278
+ "single-analyser-only"
279
+ ]
280
+ }
281
+ }
282
+ },
283
+ {
284
+ "type": "object",
285
+ "description": "Convergence disabled (omit the sub-table entirely).",
286
+ "required": ["disabled"],
287
+ "additionalProperties": false,
288
+ "properties": {
289
+ "disabled": { "const": true }
290
+ }
291
+ }
292
+ ]
293
+ },
294
+ "criticGaps": {
295
+ "type": "object",
296
+ "description": "Coverage-critic gap accounting. `proposed - merged - unverified` is the count the voters judged and rejected, so a gap that vanished shows up as a mismatch instead of as nothing. Every `unverified` gap needs a matching `missingInformation` row with source `critic-unverified` (prompts/lead/convergence.md \"Gap verification\").",
297
+ "required": ["proposed", "merged", "unverified"],
298
+ "additionalProperties": false,
299
+ "properties": {
300
+ "proposed": { "type": "integer", "minimum": 0 },
301
+ "merged": { "type": "integer", "minimum": 0 },
302
+ "unverified": { "type": "integer", "minimum": 0 }
303
+ }
304
+ },
305
+ "consensus": {
306
+ "type": "array",
307
+ "items": { "$ref": "#/$defs/ConsensusRow" }
308
+ },
309
+ "differences": {
310
+ "type": "array",
311
+ "items": { "$ref": "#/$defs/DifferenceRow" }
312
+ }
313
+ }
314
+ },
315
+
316
+ "finalVerdict": {
317
+ "type": "object",
318
+ "required": [
319
+ "finalConclusion",
320
+ "verdictToken",
321
+ "direction",
322
+ "rationaleRowIds",
323
+ "nextStep"
324
+ ],
325
+ "additionalProperties": false,
326
+ "properties": {
327
+ "finalConclusion": { "type": "string", "minLength": 1 },
328
+ "verdictToken": { "$ref": "#/$defs/VerdictToken" },
329
+ "direction": { "$ref": "#/$defs/Direction" },
330
+ "rationaleRowIds": {
331
+ "type": "array",
332
+ "items": { "type": "string" },
333
+ "minItems": 1
334
+ },
335
+ "nextStep": { "type": "string", "minLength": 1 },
336
+ "conditionalAcceptanceConditions": {
337
+ "type": "array",
338
+ "items": { "$ref": "#/$defs/ConditionalAcceptanceConditionRow" }
339
+ }
340
+ }
341
+ },
342
+
343
+ "evidence": {
344
+ "type": "object",
345
+ "required": ["primary"],
346
+ "additionalProperties": false,
347
+ "properties": {
348
+ "primary": {
349
+ "type": "array",
350
+ "items": { "$ref": "#/$defs/PrimaryEvidenceRow" }
351
+ },
352
+ "secondary": {
353
+ "type": "array",
354
+ "items": { "$ref": "#/$defs/SecondaryEvidenceRow" }
355
+ }
356
+ }
357
+ },
358
+
359
+ "endStateCoverage": {
360
+ "type": "array",
361
+ "items": { "$ref": "#/$defs/EndStateCoverageRow" },
362
+ "description": "One row per brief end-state id. Optional at the schema layer; validate-run.py requires it when the run's brief carries the end-state sections."
363
+ },
364
+
365
+ "missingInformation": {
366
+ "type": "array",
367
+ "items": { "$ref": "#/$defs/RiskRow" }
368
+ },
369
+
370
+ "requirementsDiscovery": { "$ref": "#/$defs/RequirementsDiscovery" },
371
+
372
+ "improvementDiscovery": { "$ref": "#/$defs/ImprovementDiscovery" },
373
+
374
+ "errorAnalysis": { "$ref": "#/$defs/ErrorAnalysis" },
375
+
376
+ "analysisCommon": {
377
+ "$ref": "#/$defs/AnalysisCommon"
378
+ },
379
+
380
+ "projectAnalysis": {
381
+ "$ref": "#/$defs/ProjectAnalysis"
382
+ },
383
+
384
+ "featureAnalysis": {
385
+ "$ref": "#/$defs/FeatureAnalysis"
386
+ },
387
+
388
+ "changeImpactAnalysis": {
389
+ "$ref": "#/$defs/ChangeImpactAnalysis"
390
+ },
391
+
392
+ "implementationPlanning": {
393
+ "type": "object",
394
+ "description": "RENDER_IF taskType == implementation-planning. §5.5 deliverables.",
395
+ "required": [
396
+ "optionCandidates",
397
+ "tradeoffMatrix",
398
+ "recommendedOption",
399
+ "stageMap",
400
+ "stages",
401
+ "dependencyMigrationRisk",
402
+ "validationChecklist",
403
+ "rollbackStrategy",
404
+ "requirementCoverage",
405
+ "planBodyVerification",
406
+ "crossProjectDependencies",
407
+ "decisionDrafts",
408
+ "skippedAdrCandidates",
409
+ "variationPointAnalysis",
410
+ "userNarrative"
411
+ ],
412
+ "additionalProperties": false,
413
+ "properties": {
414
+ "optionCandidates": {
415
+ "type": "array",
416
+ "minItems": 2,
417
+ "items": { "$ref": "#/$defs/OptionCandidate" }
418
+ },
419
+ "tradeoffMatrix": {
420
+ "type": "array",
421
+ "minItems": 1,
422
+ "items": { "$ref": "#/$defs/TradeoffRow" }
423
+ },
424
+ "recommendedOption": { "$ref": "#/$defs/RecommendedOption" },
425
+ "userNarrative": { "$ref": "#/$defs/PlanningUserNarrative" },
426
+ "stageMap": {
427
+ "type": "array",
428
+ "minItems": 1,
429
+ "items": { "$ref": "#/$defs/StageMapRow" }
430
+ },
431
+ "stages": {
432
+ "type": "array",
433
+ "minItems": 1,
434
+ "items": { "$ref": "#/$defs/ImplementationPlanStage" }
435
+ },
436
+ "designPreparation": { "$ref": "#/$defs/DesignPreparation" },
437
+ "variationPointAnalysis": { "$ref": "#/$defs/VariationPointAnalysis" },
438
+ "stepwiseExecution": {
439
+ "description": "Legacy flat summary kept for compatibility only. New reports use stageMap/stages.",
440
+ "type": "array",
441
+ "minItems": 1,
442
+ "items": { "$ref": "#/$defs/StepRow" }
443
+ },
444
+ "dependencyMigrationRisk": {
445
+ "type": "array",
446
+ "items": { "$ref": "#/$defs/DependencyRow" }
447
+ },
448
+ "validationChecklist": {
449
+ "type": "array",
450
+ "minItems": 1,
451
+ "items": { "$ref": "#/$defs/ValidationCheckRow" }
452
+ },
453
+ "rollbackStrategy": {
454
+ "type": "array",
455
+ "minItems": 1,
456
+ "items": { "$ref": "#/$defs/RollbackRow" }
457
+ },
458
+ "requirementCoverage": {
459
+ "type": "array",
460
+ "minItems": 1,
461
+ "items": { "$ref": "#/$defs/ImplementationRequirementCoverageRow" }
462
+ },
463
+ "planBodyVerification": { "$ref": "#/$defs/PlanBodyVerification" },
464
+ "supersessionLedger": {
465
+ "type": "array",
466
+ "description": "One entry per clarification this run answered, recording which plan statements the answer invalidated. Incorporating an answer by adding the new decision while leaving the contradicting sentence in place is what produces two opposite instructions for the same symbol in one plan.",
467
+ "items": { "$ref": "#/$defs/SupersessionEntry" }
468
+ },
469
+ "crossProjectDependencies": {
470
+ "type": "array",
471
+ "items": { "$ref": "#/$defs/CrossProjectDependency" }
472
+ },
473
+ "decisionDrafts": {
474
+ "type": "array",
475
+ "items": { "$ref": "#/$defs/DecisionDraft" }
476
+ },
477
+ "skippedAdrCandidates": {
478
+ "type": "array",
479
+ "items": { "$ref": "#/$defs/SkippedAdrCandidate" }
480
+ },
481
+ "incrementalDecision": {
482
+ "type": "object",
483
+ "description": "Verbatim `okstra incremental-scope` output for a clarification re-run. Present only when this implementation-planning run scoped itself against a prior run; drives the Section 0 incremental audit block.",
484
+ "required": ["mode", "reverifyStages", "carryStages", "reason"],
485
+ "additionalProperties": false,
486
+ "properties": {
487
+ "mode": { "type": "string", "enum": ["incremental", "full"] },
488
+ "reverifyStages": {
489
+ "type": "array",
490
+ "items": { "type": "integer" }
491
+ },
492
+ "carryStages": {
493
+ "type": "array",
494
+ "items": { "type": "integer" }
495
+ },
496
+ "reason": { "type": "string", "minLength": 1 }
497
+ }
498
+ }
499
+ }
500
+ },
501
+
502
+ "releaseHandoff": {
503
+ "type": "object",
504
+ "description": "RENDER_IF taskType == release-handoff. §5.6 deliverables.",
505
+ "required": [
506
+ "sourceVerificationReport",
507
+ "featureBranchState",
508
+ "userSelections",
509
+ "executedCommands",
510
+ "commitList",
511
+ "mergeConflictProbe",
512
+ "pullRequestOutcome",
513
+ "routingRecommendation",
514
+ "userNarrative"
515
+ ],
516
+ "additionalProperties": false,
517
+ "properties": {
518
+ "sourceVerificationReport": {
519
+ "type": "object",
520
+ "required": ["path", "verdictTokenQuote"],
521
+ "additionalProperties": false,
522
+ "properties": {
523
+ "path": { "type": "string", "minLength": 1 },
524
+ "verdictTokenQuote": { "type": "string", "minLength": 1 }
525
+ }
526
+ },
527
+ "featureBranchState": {
528
+ "type": "object",
529
+ "required": ["branchName", "gitStatusShort", "existingPrUrl"],
530
+ "additionalProperties": false,
531
+ "properties": {
532
+ "branchName": { "type": "string", "minLength": 1 },
533
+ "gitStatusShort": { "type": "string" },
534
+ "existingPrUrl": { "type": "string" }
535
+ }
536
+ },
537
+ "userSelections": {
538
+ "type": "object",
539
+ "required": ["h1", "h2b", "h3"],
540
+ "additionalProperties": false,
541
+ "properties": {
542
+ "h1": { "enum": ["local checkout", "push + PR", "skip"] },
543
+ "h1c": { "type": "string" },
544
+ "h2": { "type": "string" },
545
+ "h2b": {
546
+ "enum": ["not-run", "clean", "proceed anyway", "change base branch", "cancel"]
547
+ },
548
+ "h3": { "enum": ["use as-is", "edit then proceed", "cancel"] }
549
+ }
550
+ },
551
+ "executedCommands": {
552
+ "type": "array",
553
+ "items": { "$ref": "#/$defs/ExecutedCommandRow" }
554
+ },
555
+ "commitList": {
556
+ "oneOf": [
557
+ {
558
+ "type": "array",
559
+ "items": { "$ref": "#/$defs/CommitRow" }
560
+ },
561
+ {
562
+ "type": "object",
563
+ "required": ["empty"],
564
+ "additionalProperties": false,
565
+ "properties": { "empty": { "const": true } }
566
+ }
567
+ ]
568
+ },
569
+ "mergeConflictProbe": {
570
+ "type": "object",
571
+ "required": ["kind"],
572
+ "additionalProperties": false,
573
+ "properties": {
574
+ "kind": {
575
+ "enum": ["not-run", "clean", "conflicts"]
576
+ },
577
+ "baseBranch": { "type": "string" },
578
+ "baseSha": { "type": "string" },
579
+ "userChoice": { "type": "string" },
580
+ "conflictingPaths": {
581
+ "type": "array",
582
+ "items": { "type": "string" }
583
+ }
584
+ }
585
+ },
586
+ "pullRequestOutcome": {
587
+ "type": "object",
588
+ "required": ["kind"],
589
+ "additionalProperties": false,
590
+ "properties": {
591
+ "kind": {
592
+ "enum": ["no-action", "created", "reused", "skipped"]
593
+ },
594
+ "url": { "type": "string" },
595
+ "title": { "type": "string" },
596
+ "baseBranch": { "type": "string" },
597
+ "reason": { "type": "string" }
598
+ }
599
+ },
600
+ "routingRecommendation": { "type": "string", "minLength": 1 },
601
+ "userNarrative": { "$ref": "#/$defs/ReleaseHandoffUserNarrative" }
602
+ }
603
+ },
604
+
605
+ "implementation": {
606
+ "type": "object",
607
+ "description": "RENDER_IF taskType == implementation. §5.7 deliverables.",
608
+ "required": [
609
+ "approvedPlanReference",
610
+ "commitList",
611
+ "diffSummary",
612
+ "outOfPlanEdits",
613
+ "stageSidecarEvidence",
614
+ "validationEvidence",
615
+ "verifierResults",
616
+ "rollbackVerification",
617
+ "manualUserTest",
618
+ "requirementCoverage",
619
+ "routingRecommendation",
620
+ "userNarrative"
621
+ ],
622
+ "additionalProperties": false,
623
+ "properties": {
624
+ "approvedPlanReference": {
625
+ "type": "object",
626
+ "required": ["planFile", "approvalEvidence", "executorWorktreePath", "baseRefSha"],
627
+ "additionalProperties": false,
628
+ "properties": {
629
+ "planFile": { "type": "string", "minLength": 1 },
630
+ "approvalEvidence": { "type": "string", "minLength": 1 },
631
+ "executorWorktreePath": { "type": "string", "minLength": 1 },
632
+ "baseRefSha": { "type": "string", "minLength": 1 }
633
+ }
634
+ },
635
+ "commitList": {
636
+ "type": "array",
637
+ "items": { "$ref": "#/$defs/CommitWithStepRow" }
638
+ },
639
+ "diffSummary": {
640
+ "type": "object",
641
+ "required": ["rawStat", "files"],
642
+ "additionalProperties": false,
643
+ "properties": {
644
+ "rawStat": { "type": "string" },
645
+ "files": {
646
+ "type": "array",
647
+ "items": { "$ref": "#/$defs/DiffFileRow" }
648
+ }
649
+ },
650
+ "$comment": "rawStat(git diff --stat 원문)이 비어있지 않으면(=변경 있음) files 표는 최소 1행이어야 한다. 변경을 stat 으로는 보고하면서 files 표를 비워 미선언-surface conformance 게이트를 우회하는 fail-open(SUSP-1)을 차단. 0파일 변경은 rawStat 이 빈 문자열이라 허용된다.",
651
+ "if": { "required": ["rawStat"], "properties": { "rawStat": { "minLength": 1 } } },
652
+ "then": { "properties": { "files": { "minItems": 1 } } }
653
+ },
654
+ "outOfPlanEdits": {
655
+ "type": "array",
656
+ "items": { "$ref": "#/$defs/OutOfPlanEditRow" }
657
+ },
658
+ "stageSidecarEvidence": { "$ref": "#/$defs/StageSidecarEvidence" },
659
+ "validationEvidence": {
660
+ "type": "array",
661
+ "minItems": 1,
662
+ "items": { "$ref": "#/$defs/ValidationEvidenceRow" }
663
+ },
664
+ "verifierResults": {
665
+ "type": "array",
666
+ "minItems": 1,
667
+ "items": { "$ref": "#/$defs/VerifierResultBlock" }
668
+ },
669
+ "rollbackVerification": {
670
+ "type": "array",
671
+ "minItems": 1,
672
+ "items": { "$ref": "#/$defs/RollbackVerificationRow" }
673
+ },
674
+ "manualUserTest": {
675
+ "type": "object",
676
+ "additionalProperties": false,
677
+ "required": ["applicable"],
678
+ "properties": {
679
+ "applicable": { "type": "boolean" },
680
+ "exemptionReason": { "type": "string" },
681
+ "items": {
682
+ "type": "array",
683
+ "items": {
684
+ "type": "object",
685
+ "additionalProperties": false,
686
+ "required": ["target", "environmentSetup", "steps", "expectedResult"],
687
+ "properties": {
688
+ "target": { "type": "string" },
689
+ "environmentSetup": { "type": "string" },
690
+ "steps": { "type": "array", "items": { "type": "string" } },
691
+ "expectedResult": { "type": "string" }
692
+ }
693
+ }
694
+ }
695
+ }
696
+ },
697
+ "requirementCoverage": {
698
+ "type": "array",
699
+ "minItems": 1,
700
+ "items": { "$ref": "#/$defs/ImplementationRequirementCoverageRow" }
701
+ },
702
+ "routingRecommendation": { "type": "string", "minLength": 1 },
703
+ "userNarrative": { "$ref": "#/$defs/ImplementationUserNarrative" }
704
+ }
705
+ },
706
+
707
+ "finalVerification": {
708
+ "type": "object",
709
+ "description": "RENDER_IF taskType == final-verification. §5.8 deliverables.",
710
+ "required": [
711
+ "sourceImplementationReport",
712
+ "acceptanceBlockers",
713
+ "residualRisk",
714
+ "validationEvidence",
715
+ "readonlyCommandLog",
716
+ "manualUserTest",
717
+ "routingRecommendation",
718
+ "userNarrative"
719
+ ],
720
+ "additionalProperties": false,
721
+ "properties": {
722
+ "sourceImplementationReport": {
723
+ "type": "object",
724
+ "required": ["path", "commitListQuote", "diffSummaryQuote", "worktreePath", "implementationBaseRef", "capturedHeadSha", "gitStatusShort", "gitDiffStat"],
725
+ "additionalProperties": false,
726
+ "properties": {
727
+ "path": { "type": "string" },
728
+ "commitListQuote": { "type": "string" },
729
+ "diffSummaryQuote": { "type": "string" },
730
+ "worktreePath": { "type": "string" },
731
+ "implementationBaseRef": { "type": "string" },
732
+ "capturedHeadSha": { "type": "string" },
733
+ "gitStatusShort": { "type": "string" },
734
+ "gitDiffStat": { "type": "string" }
735
+ }
736
+ },
737
+ "stageReports": {
738
+ "type": "array",
739
+ "items": {
740
+ "type": "object",
741
+ "additionalProperties": false,
742
+ "required": ["stage", "reportPath"],
743
+ "properties": {
744
+ "stage": { "type": "integer" },
745
+ "reportPath": { "type": "string" }
746
+ }
747
+ }
748
+ },
749
+ "acceptanceBlockers": {
750
+ "type": "array",
751
+ "items": { "$ref": "#/$defs/AcceptanceBlockerRow" }
752
+ },
753
+ "residualRisk": {
754
+ "type": "array",
755
+ "items": { "$ref": "#/$defs/ResidualRiskRow" }
756
+ },
757
+ "validationEvidence": {
758
+ "type": "array",
759
+ "items": { "$ref": "#/$defs/RequirementCoverageRow" }
760
+ },
761
+ "readonlyCommandLog": {
762
+ "type": "array",
763
+ "items": { "$ref": "#/$defs/ReadonlyCommandRow" }
764
+ },
765
+ "manualUserTest": {
766
+ "type": "object",
767
+ "additionalProperties": false,
768
+ "required": ["applicable"],
769
+ "properties": {
770
+ "applicable": { "type": "boolean" },
771
+ "exemptionReaffirm": { "type": "string" },
772
+ "results": {
773
+ "type": "array",
774
+ "items": {
775
+ "type": "object",
776
+ "additionalProperties": false,
777
+ "required": ["target", "performed", "result", "observed"],
778
+ "properties": {
779
+ "target": { "type": "string" },
780
+ "performed": { "type": "string" },
781
+ "result": { "enum": ["pass", "fail", "blocked"] },
782
+ "observed": { "type": "string" }
783
+ }
784
+ }
785
+ }
786
+ }
787
+ },
788
+ "routingRecommendation": { "type": "string", "minLength": 1 },
789
+ "userNarrative": { "$ref": "#/$defs/FinalVerificationUserNarrative" }
790
+ }
791
+ },
792
+
793
+ "fixCycle": {
794
+ "type": "object",
795
+ "description": "RENDER_IF fixCycle present — the post-release bug-fix cycle this run belongs to.",
796
+ "required": ["cycle", "targetReport", "symptom"],
797
+ "additionalProperties": false,
798
+ "properties": {
799
+ "cycle": { "type": "string", "pattern": "^fc-[0-9]{2,}$" },
800
+ "targetReport": { "type": "string" },
801
+ "symptom": { "type": "string" },
802
+ "runs": {
803
+ "type": "array",
804
+ "items": {
805
+ "type": "object",
806
+ "required": ["taskType", "runSeq"],
807
+ "additionalProperties": false,
808
+ "properties": {
809
+ "taskType": { "type": "string" },
810
+ "runSeq": { "type": "integer" },
811
+ "runManifest": { "type": "string" }
812
+ }
813
+ }
814
+ }
815
+ }
816
+ },
817
+
818
+ "clarificationItems": {
819
+ "type": "array",
820
+ "items": { "$ref": "#/$defs/ClarificationRow" }
821
+ },
822
+
823
+ "recommendedNextSteps": {
824
+ "type": "array",
825
+ "minItems": 1,
826
+ "items": { "$ref": "#/$defs/RecommendedStep" }
827
+ },
828
+
829
+ "followUpTasks": {
830
+ "type": "array",
831
+ "items": { "$ref": "#/$defs/FollowUpRow" }
832
+ }
833
+ },
834
+
835
+ "allOf": [
836
+ {
837
+ "description": "requirements-discovery requires a structured requirements block.",
838
+ "if": {
839
+ "properties": { "header": { "properties": { "taskType": { "const": "requirements-discovery" } } } },
840
+ "required": ["header"]
841
+ },
842
+ "then": { "required": ["requirementsDiscovery"] }
843
+ },
844
+ {
845
+ "description": "improvement-discovery requires a structured improvement block.",
846
+ "if": {
847
+ "properties": { "header": { "properties": { "taskType": { "const": "improvement-discovery" } } } },
848
+ "required": ["header"]
849
+ },
850
+ "then": { "required": ["improvementDiscovery"] }
851
+ },
852
+ {
853
+ "description": "error-analysis task-type requires a structured diagnosis block.",
854
+ "if": {
855
+ "properties": { "header": { "properties": { "taskType": { "const": "error-analysis" } } } },
856
+ "required": ["header"]
857
+ },
858
+ "then": {
859
+ "required": ["errorAnalysis"]
860
+ }
861
+ },
862
+ {
863
+ "description": "project-analysis requires analysisCommon and only projectAnalysis.",
864
+ "if": {
865
+ "properties": { "header": { "properties": { "taskType": { "const": "project-analysis" } } } },
866
+ "required": ["header"]
867
+ },
868
+ "then": {
869
+ "required": ["analysisCommon", "projectAnalysis"],
870
+ "allOf": [
871
+ { "not": { "required": ["featureAnalysis"] } },
872
+ { "not": { "required": ["changeImpactAnalysis"] } }
873
+ ]
874
+ }
875
+ },
876
+ {
877
+ "description": "feature-analysis requires analysisCommon and only featureAnalysis.",
878
+ "if": {
879
+ "properties": { "header": { "properties": { "taskType": { "const": "feature-analysis" } } } },
880
+ "required": ["header"]
881
+ },
882
+ "then": {
883
+ "required": ["analysisCommon", "featureAnalysis"],
884
+ "allOf": [
885
+ { "not": { "required": ["projectAnalysis"] } },
886
+ { "not": { "required": ["changeImpactAnalysis"] } }
887
+ ]
888
+ }
889
+ },
890
+ {
891
+ "description": "change-impact-analysis requires analysisCommon and only changeImpactAnalysis.",
892
+ "if": {
893
+ "properties": { "header": { "properties": { "taskType": { "const": "change-impact-analysis" } } } },
894
+ "required": ["header"]
895
+ },
896
+ "then": {
897
+ "required": ["analysisCommon", "changeImpactAnalysis"],
898
+ "allOf": [
899
+ { "not": { "required": ["projectAnalysis"] } },
900
+ { "not": { "required": ["featureAnalysis"] } }
901
+ ]
902
+ }
903
+ },
904
+ {
905
+ "description": "implementation-planning task-type requires §5.5 block.",
906
+ "if": {
907
+ "properties": { "header": { "properties": { "taskType": { "const": "implementation-planning" } } } },
908
+ "required": ["header"]
909
+ },
910
+ "then": {
911
+ "required": ["implementationPlanning"]
912
+ }
913
+ },
914
+ {
915
+ "description": "release-handoff task-type requires §5.6 block.",
916
+ "if": {
917
+ "properties": { "header": { "properties": { "taskType": { "const": "release-handoff" } } } },
918
+ "required": ["header"]
919
+ },
920
+ "then": {
921
+ "required": ["releaseHandoff"]
922
+ }
923
+ },
924
+ {
925
+ "description": "implementation task-type requires §5.7 block.",
926
+ "if": {
927
+ "properties": { "header": { "properties": { "taskType": { "const": "implementation" } } } },
928
+ "required": ["header"]
929
+ },
930
+ "then": {
931
+ "required": ["implementation"]
932
+ }
933
+ },
934
+ {
935
+ "description": "final-verification task-type requires §5.8 block.",
936
+ "if": {
937
+ "properties": { "header": { "properties": { "taskType": { "const": "final-verification" } } } },
938
+ "required": ["header"]
939
+ },
940
+ "then": {
941
+ "required": ["finalVerification"]
942
+ }
943
+ },
944
+ {
945
+ "description": "Non-terminal task-types MUST emit one phase-continuation row in followUpTasks.",
946
+ "if": {
947
+ "properties": {
948
+ "header": {
949
+ "properties": {
950
+ "taskType": {
951
+ "enum": [
952
+ "requirements-discovery",
953
+ "project-analysis",
954
+ "feature-analysis",
955
+ "change-impact-analysis",
956
+ "implementation-planning",
957
+ "error-analysis",
958
+ "implementation",
959
+ "final-verification"
960
+ ]
961
+ }
962
+ }
963
+ }
964
+ },
965
+ "required": ["header"]
966
+ },
967
+ "then": {
968
+ "properties": {
969
+ "followUpTasks": {
970
+ "type": "array",
971
+ "minItems": 1,
972
+ "contains": {
973
+ "type": "object",
974
+ "properties": {
975
+ "origin": { "const": "phase-continuation" }
976
+ },
977
+ "required": ["origin"]
978
+ }
979
+ }
980
+ }
981
+ }
982
+ },
983
+ {
984
+ "description": "Analysis verdict tokens describe analysis completeness, not user acceptance.",
985
+ "if": {
986
+ "properties": {
987
+ "header": {
988
+ "properties": {
989
+ "taskType": {
990
+ "enum": [
991
+ "project-analysis",
992
+ "feature-analysis",
993
+ "change-impact-analysis"
994
+ ]
995
+ }
996
+ }
997
+ }
998
+ },
999
+ "required": ["header"]
1000
+ },
1001
+ "then": {
1002
+ "properties": {
1003
+ "verdictCard": {
1004
+ "properties": {
1005
+ "verdictToken": {
1006
+ "enum": ["analysis-complete", "analysis-partial", "blocked"]
1007
+ }
1008
+ }
1009
+ },
1010
+ "finalVerdict": {
1011
+ "not": { "required": ["conditionalAcceptanceConditions"] },
1012
+ "properties": {
1013
+ "verdictToken": {
1014
+ "enum": ["analysis-complete", "analysis-partial", "blocked"]
1015
+ }
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ },
1021
+ {
1022
+ "description": "final-verification verdict token must be one of accepted / conditional-accept / blocked and must explicitly list conditional acceptance conditions.",
1023
+ "if": {
1024
+ "properties": { "header": { "properties": { "taskType": { "const": "final-verification" } } } },
1025
+ "required": ["header"]
1026
+ },
1027
+ "then": {
1028
+ "properties": {
1029
+ "finalVerdict": {
1030
+ "required": ["conditionalAcceptanceConditions"],
1031
+ "properties": {
1032
+ "verdictToken": { "enum": ["accepted", "conditional-accept", "blocked"] }
1033
+ }
1034
+ }
1035
+ }
1036
+ }
1037
+ },
1038
+ {
1039
+ "description": "Non-analysis, non-final-verification verdict token must be `not-applicable`.",
1040
+ "if": {
1041
+ "properties": {
1042
+ "header": {
1043
+ "properties": {
1044
+ "taskType": {
1045
+ "enum": [
1046
+ "requirements-discovery",
1047
+ "error-analysis",
1048
+ "implementation-planning",
1049
+ "implementation",
1050
+ "release-handoff",
1051
+ "quick"
1052
+ ]
1053
+ }
1054
+ }
1055
+ }
1056
+ },
1057
+ "required": ["header"]
1058
+ },
1059
+ "then": {
1060
+ "properties": {
1061
+ "finalVerdict": {
1062
+ "not": { "required": ["conditionalAcceptanceConditions"] },
1063
+ "properties": {
1064
+ "verdictToken": { "const": "not-applicable" }
1065
+ }
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ ],
1071
+
1072
+ "oneOf": [
1073
+ {
1074
+ "required": ["requirementsDiscovery"],
1075
+ "allOf": [
1076
+ { "not": { "required": ["improvementDiscovery"] } },
1077
+ { "not": { "required": ["errorAnalysis"] } },
1078
+ { "not": { "required": ["projectAnalysis"] } },
1079
+ { "not": { "required": ["featureAnalysis"] } },
1080
+ { "not": { "required": ["changeImpactAnalysis"] } },
1081
+ { "not": { "required": ["implementationPlanning"] } },
1082
+ { "not": { "required": ["implementation"] } },
1083
+ { "not": { "required": ["finalVerification"] } },
1084
+ { "not": { "required": ["releaseHandoff"] } }
1085
+ ]
1086
+ },
1087
+ {
1088
+ "required": ["improvementDiscovery"],
1089
+ "allOf": [
1090
+ { "not": { "required": ["requirementsDiscovery"] } },
1091
+ { "not": { "required": ["errorAnalysis"] } },
1092
+ { "not": { "required": ["projectAnalysis"] } },
1093
+ { "not": { "required": ["featureAnalysis"] } },
1094
+ { "not": { "required": ["changeImpactAnalysis"] } },
1095
+ { "not": { "required": ["implementationPlanning"] } },
1096
+ { "not": { "required": ["implementation"] } },
1097
+ { "not": { "required": ["finalVerification"] } },
1098
+ { "not": { "required": ["releaseHandoff"] } }
1099
+ ]
1100
+ },
1101
+ {
1102
+ "required": ["errorAnalysis"],
1103
+ "allOf": [
1104
+ { "not": { "required": ["requirementsDiscovery"] } },
1105
+ { "not": { "required": ["improvementDiscovery"] } },
1106
+ { "not": { "required": ["projectAnalysis"] } },
1107
+ { "not": { "required": ["featureAnalysis"] } },
1108
+ { "not": { "required": ["changeImpactAnalysis"] } },
1109
+ { "not": { "required": ["implementationPlanning"] } },
1110
+ { "not": { "required": ["implementation"] } },
1111
+ { "not": { "required": ["finalVerification"] } },
1112
+ { "not": { "required": ["releaseHandoff"] } }
1113
+ ]
1114
+ },
1115
+ {
1116
+ "required": ["projectAnalysis"],
1117
+ "allOf": [
1118
+ { "not": { "required": ["requirementsDiscovery"] } },
1119
+ { "not": { "required": ["improvementDiscovery"] } },
1120
+ { "not": { "required": ["errorAnalysis"] } },
1121
+ { "not": { "required": ["featureAnalysis"] } },
1122
+ { "not": { "required": ["changeImpactAnalysis"] } },
1123
+ { "not": { "required": ["implementationPlanning"] } },
1124
+ { "not": { "required": ["implementation"] } },
1125
+ { "not": { "required": ["finalVerification"] } },
1126
+ { "not": { "required": ["releaseHandoff"] } }
1127
+ ]
1128
+ },
1129
+ {
1130
+ "required": ["featureAnalysis"],
1131
+ "allOf": [
1132
+ { "not": { "required": ["requirementsDiscovery"] } },
1133
+ { "not": { "required": ["improvementDiscovery"] } },
1134
+ { "not": { "required": ["errorAnalysis"] } },
1135
+ { "not": { "required": ["projectAnalysis"] } },
1136
+ { "not": { "required": ["changeImpactAnalysis"] } },
1137
+ { "not": { "required": ["implementationPlanning"] } },
1138
+ { "not": { "required": ["implementation"] } },
1139
+ { "not": { "required": ["finalVerification"] } },
1140
+ { "not": { "required": ["releaseHandoff"] } }
1141
+ ]
1142
+ },
1143
+ {
1144
+ "required": ["changeImpactAnalysis"],
1145
+ "allOf": [
1146
+ { "not": { "required": ["requirementsDiscovery"] } },
1147
+ { "not": { "required": ["improvementDiscovery"] } },
1148
+ { "not": { "required": ["errorAnalysis"] } },
1149
+ { "not": { "required": ["projectAnalysis"] } },
1150
+ { "not": { "required": ["featureAnalysis"] } },
1151
+ { "not": { "required": ["implementationPlanning"] } },
1152
+ { "not": { "required": ["implementation"] } },
1153
+ { "not": { "required": ["finalVerification"] } },
1154
+ { "not": { "required": ["releaseHandoff"] } }
1155
+ ]
1156
+ },
1157
+ {
1158
+ "required": ["implementationPlanning"],
1159
+ "allOf": [
1160
+ { "not": { "required": ["requirementsDiscovery"] } },
1161
+ { "not": { "required": ["improvementDiscovery"] } },
1162
+ { "not": { "required": ["errorAnalysis"] } },
1163
+ { "not": { "required": ["projectAnalysis"] } },
1164
+ { "not": { "required": ["featureAnalysis"] } },
1165
+ { "not": { "required": ["changeImpactAnalysis"] } },
1166
+ { "not": { "required": ["implementation"] } },
1167
+ { "not": { "required": ["finalVerification"] } },
1168
+ { "not": { "required": ["releaseHandoff"] } }
1169
+ ]
1170
+ },
1171
+ {
1172
+ "required": ["implementation"],
1173
+ "allOf": [
1174
+ { "not": { "required": ["requirementsDiscovery"] } },
1175
+ { "not": { "required": ["improvementDiscovery"] } },
1176
+ { "not": { "required": ["errorAnalysis"] } },
1177
+ { "not": { "required": ["projectAnalysis"] } },
1178
+ { "not": { "required": ["featureAnalysis"] } },
1179
+ { "not": { "required": ["changeImpactAnalysis"] } },
1180
+ { "not": { "required": ["implementationPlanning"] } },
1181
+ { "not": { "required": ["finalVerification"] } },
1182
+ { "not": { "required": ["releaseHandoff"] } }
1183
+ ]
1184
+ },
1185
+ {
1186
+ "required": ["finalVerification"],
1187
+ "allOf": [
1188
+ { "not": { "required": ["requirementsDiscovery"] } },
1189
+ { "not": { "required": ["improvementDiscovery"] } },
1190
+ { "not": { "required": ["errorAnalysis"] } },
1191
+ { "not": { "required": ["projectAnalysis"] } },
1192
+ { "not": { "required": ["featureAnalysis"] } },
1193
+ { "not": { "required": ["changeImpactAnalysis"] } },
1194
+ { "not": { "required": ["implementationPlanning"] } },
1195
+ { "not": { "required": ["implementation"] } },
1196
+ { "not": { "required": ["releaseHandoff"] } }
1197
+ ]
1198
+ },
1199
+ {
1200
+ "required": ["releaseHandoff"],
1201
+ "allOf": [
1202
+ { "not": { "required": ["requirementsDiscovery"] } },
1203
+ { "not": { "required": ["improvementDiscovery"] } },
1204
+ { "not": { "required": ["errorAnalysis"] } },
1205
+ { "not": { "required": ["projectAnalysis"] } },
1206
+ { "not": { "required": ["featureAnalysis"] } },
1207
+ { "not": { "required": ["changeImpactAnalysis"] } },
1208
+ { "not": { "required": ["implementationPlanning"] } },
1209
+ { "not": { "required": ["implementation"] } },
1210
+ { "not": { "required": ["finalVerification"] } }
1211
+ ]
1212
+ }
1213
+ ],
1214
+
1215
+ "$defs": {
1216
+ "TaskType": {
1217
+ "enum": [
1218
+ "requirements-discovery",
1219
+ "improvement-discovery",
1220
+ "error-analysis",
1221
+ "project-analysis",
1222
+ "feature-analysis",
1223
+ "change-impact-analysis",
1224
+ "implementation-planning",
1225
+ "implementation",
1226
+ "final-verification",
1227
+ "release-handoff"
1228
+ ]
1229
+ },
1230
+
1231
+ "HumanSummary": {
1232
+ "type": "object",
1233
+ "required": ["headline", "outcome", "whyItMatters", "decisions", "actions", "blockers"],
1234
+ "additionalProperties": false,
1235
+ "properties": {
1236
+ "headline": { "type": "string", "minLength": 1 },
1237
+ "outcome": { "type": "string", "minLength": 1 },
1238
+ "whyItMatters": {
1239
+ "type": "array",
1240
+ "minItems": 1,
1241
+ "items": { "type": "string", "minLength": 1 }
1242
+ },
1243
+ "decisions": {
1244
+ "type": "array",
1245
+ "items": { "type": "string", "minLength": 1 }
1246
+ },
1247
+ "actions": {
1248
+ "type": "array",
1249
+ "minItems": 1,
1250
+ "items": { "type": "string", "minLength": 1 }
1251
+ },
1252
+ "blockers": {
1253
+ "type": "array",
1254
+ "items": { "type": "string", "minLength": 1 }
1255
+ }
1256
+ }
1257
+ },
1258
+
1259
+ "HumanNarrative": {
1260
+ "type": "object",
1261
+ "required": ["text", "evidenceRefs"],
1262
+ "additionalProperties": false,
1263
+ "properties": {
1264
+ "text": { "type": "string", "minLength": 1 },
1265
+ "evidenceRefs": {
1266
+ "type": "array",
1267
+ "minItems": 1,
1268
+ "items": { "type": "string", "minLength": 1 }
1269
+ }
1270
+ }
1271
+ },
1272
+
1273
+ "ProjectUserNarrative": {
1274
+ "type": "object",
1275
+ "required": ["projectOverview", "architectureExplanation", "hotspotExplanation", "qualityExplanation"],
1276
+ "additionalProperties": false,
1277
+ "properties": {
1278
+ "projectOverview": { "$ref": "#/$defs/HumanNarrative" },
1279
+ "architectureExplanation": { "$ref": "#/$defs/HumanNarrative" },
1280
+ "hotspotExplanation": { "$ref": "#/$defs/HumanNarrative" },
1281
+ "qualityExplanation": { "$ref": "#/$defs/HumanNarrative" }
1282
+ }
1283
+ },
1284
+
1285
+ "RequirementsUserNarrative": {
1286
+ "type": "object",
1287
+ "required": ["requestUnderstanding", "confirmedRequirements", "unresolvedRequirements", "routingExplanation"],
1288
+ "additionalProperties": false,
1289
+ "properties": {
1290
+ "requestUnderstanding": { "$ref": "#/$defs/HumanNarrative" },
1291
+ "confirmedRequirements": { "$ref": "#/$defs/HumanNarrative" },
1292
+ "unresolvedRequirements": { "$ref": "#/$defs/HumanNarrative" },
1293
+ "routingExplanation": { "$ref": "#/$defs/HumanNarrative" }
1294
+ }
1295
+ },
1296
+
1297
+ "ImprovementUserNarrative": {
1298
+ "type": "object",
1299
+ "required": ["opportunityOverview", "prioritizationExplanation", "selectionGuidance"],
1300
+ "additionalProperties": false,
1301
+ "properties": {
1302
+ "opportunityOverview": { "$ref": "#/$defs/HumanNarrative" },
1303
+ "prioritizationExplanation": { "$ref": "#/$defs/HumanNarrative" },
1304
+ "selectionGuidance": { "$ref": "#/$defs/HumanNarrative" }
1305
+ }
1306
+ },
1307
+
1308
+ "ErrorUserNarrative": {
1309
+ "type": "object",
1310
+ "required": ["symptomExplanation", "causeExplanation", "uncertaintyExplanation", "diagnosticGuidance"],
1311
+ "additionalProperties": false,
1312
+ "properties": {
1313
+ "symptomExplanation": { "$ref": "#/$defs/HumanNarrative" },
1314
+ "causeExplanation": { "$ref": "#/$defs/HumanNarrative" },
1315
+ "uncertaintyExplanation": { "$ref": "#/$defs/HumanNarrative" },
1316
+ "diagnosticGuidance": { "$ref": "#/$defs/HumanNarrative" }
1317
+ }
1318
+ },
1319
+
1320
+ "FeatureUserNarrative": {
1321
+ "type": "object",
1322
+ "required": ["userBehaviorExplanation", "flowExplanation", "rulesAndStateExplanation", "testGapExplanation"],
1323
+ "additionalProperties": false,
1324
+ "properties": {
1325
+ "userBehaviorExplanation": { "$ref": "#/$defs/HumanNarrative" },
1326
+ "flowExplanation": { "$ref": "#/$defs/HumanNarrative" },
1327
+ "rulesAndStateExplanation": { "$ref": "#/$defs/HumanNarrative" },
1328
+ "testGapExplanation": { "$ref": "#/$defs/HumanNarrative" }
1329
+ }
1330
+ },
1331
+
1332
+ "ChangeImpactUserNarrative": {
1333
+ "type": "object",
1334
+ "required": ["changeExplanation", "impactExplanation", "unaffectedExplanation", "planningReadiness"],
1335
+ "additionalProperties": false,
1336
+ "properties": {
1337
+ "changeExplanation": { "$ref": "#/$defs/HumanNarrative" },
1338
+ "impactExplanation": { "$ref": "#/$defs/HumanNarrative" },
1339
+ "unaffectedExplanation": { "$ref": "#/$defs/HumanNarrative" },
1340
+ "planningReadiness": { "$ref": "#/$defs/HumanNarrative" }
1341
+ }
1342
+ },
1343
+
1344
+ "PlanningUserNarrative": {
1345
+ "type": "object",
1346
+ "required": ["optionExplanation", "recommendationExplanation", "stageStrategy", "validationAndRollback"],
1347
+ "additionalProperties": false,
1348
+ "properties": {
1349
+ "optionExplanation": { "$ref": "#/$defs/HumanNarrative" },
1350
+ "recommendationExplanation": { "$ref": "#/$defs/HumanNarrative" },
1351
+ "stageStrategy": { "$ref": "#/$defs/HumanNarrative" },
1352
+ "validationAndRollback": { "$ref": "#/$defs/HumanNarrative" }
1353
+ }
1354
+ },
1355
+
1356
+ "ImplementationUserNarrative": {
1357
+ "type": "object",
1358
+ "required": ["deliveredOutcome", "changeExplanation", "validationExplanation", "remainingIssues"],
1359
+ "additionalProperties": false,
1360
+ "properties": {
1361
+ "deliveredOutcome": { "$ref": "#/$defs/HumanNarrative" },
1362
+ "changeExplanation": { "$ref": "#/$defs/HumanNarrative" },
1363
+ "validationExplanation": { "$ref": "#/$defs/HumanNarrative" },
1364
+ "remainingIssues": { "$ref": "#/$defs/HumanNarrative" }
1365
+ }
1366
+ },
1367
+
1368
+ "FinalVerificationUserNarrative": {
1369
+ "type": "object",
1370
+ "required": ["verdictExplanation", "coverageExplanation", "blockerExplanation", "releaseReadiness"],
1371
+ "additionalProperties": false,
1372
+ "properties": {
1373
+ "verdictExplanation": { "$ref": "#/$defs/HumanNarrative" },
1374
+ "coverageExplanation": { "$ref": "#/$defs/HumanNarrative" },
1375
+ "blockerExplanation": { "$ref": "#/$defs/HumanNarrative" },
1376
+ "releaseReadiness": { "$ref": "#/$defs/HumanNarrative" }
1377
+ }
1378
+ },
1379
+
1380
+ "ReleaseHandoffUserNarrative": {
1381
+ "type": "object",
1382
+ "required": ["handoffOutcome", "branchAndPrExplanation", "conflictExplanation", "nextAction"],
1383
+ "additionalProperties": false,
1384
+ "properties": {
1385
+ "handoffOutcome": { "$ref": "#/$defs/HumanNarrative" },
1386
+ "branchAndPrExplanation": { "$ref": "#/$defs/HumanNarrative" },
1387
+ "conflictExplanation": { "$ref": "#/$defs/HumanNarrative" },
1388
+ "nextAction": { "$ref": "#/$defs/HumanNarrative" }
1389
+ }
1390
+ },
1391
+
1392
+ "RequirementDiscoveryRow": {
1393
+ "type": "object",
1394
+ "required": ["id", "statement", "evidenceRefs"],
1395
+ "additionalProperties": true,
1396
+ "properties": {
1397
+ "id": { "type": "string", "minLength": 1 },
1398
+ "statement": { "type": "string", "minLength": 1 },
1399
+ "evidenceRefs": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
1400
+ }
1401
+ },
1402
+
1403
+ "RequirementsDiscovery": {
1404
+ "type": "object",
1405
+ "required": ["requestVerbatim", "systemInterpretation", "classification", "confirmedRequirements", "unresolvedRequirements", "routing", "taskDependencies", "userNarrative"],
1406
+ "additionalProperties": false,
1407
+ "properties": {
1408
+ "requestVerbatim": { "type": "string", "minLength": 1 },
1409
+ "systemInterpretation": { "type": "string", "minLength": 1 },
1410
+ "classification": {
1411
+ "type": "object",
1412
+ "required": ["requestKind", "scope", "complexity"],
1413
+ "additionalProperties": false,
1414
+ "properties": {
1415
+ "requestKind": { "type": "string", "minLength": 1 },
1416
+ "scope": { "type": "string", "minLength": 1 },
1417
+ "complexity": { "type": "string", "minLength": 1 }
1418
+ }
1419
+ },
1420
+ "confirmedRequirements": { "type": "array", "items": { "$ref": "#/$defs/RequirementDiscoveryRow" } },
1421
+ "unresolvedRequirements": { "type": "array", "items": { "$ref": "#/$defs/RequirementDiscoveryRow" } },
1422
+ "routing": {
1423
+ "type": "object",
1424
+ "required": ["nextTaskType", "readyWhen", "rationale"],
1425
+ "additionalProperties": false,
1426
+ "properties": {
1427
+ "nextTaskType": { "enum": ["error-analysis", "implementation-planning"] },
1428
+ "readyWhen": { "type": "string", "minLength": 1 },
1429
+ "rationale": { "type": "string", "minLength": 1 }
1430
+ }
1431
+ },
1432
+ "taskDependencies": {
1433
+ "type": "array",
1434
+ "items": {
1435
+ "type": "object",
1436
+ "required": ["fromTaskKey", "toTaskKey", "relation", "evidenceRefs"],
1437
+ "additionalProperties": false,
1438
+ "properties": {
1439
+ "fromTaskKey": { "type": "string", "minLength": 1 },
1440
+ "toTaskKey": { "type": "string", "minLength": 1 },
1441
+ "relation": { "type": "string", "minLength": 1 },
1442
+ "evidenceRefs": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
1443
+ }
1444
+ }
1445
+ },
1446
+ "userNarrative": { "$ref": "#/$defs/RequirementsUserNarrative" }
1447
+ }
1448
+ },
1449
+
1450
+ "ImprovementCandidate": {
1451
+ "type": "object",
1452
+ "required": ["id", "lens", "title", "scope", "severity", "effort", "consensus", "sourceWorkers", "recommendedNextPhase", "expectedBehaviorAfter", "evidence"],
1453
+ "additionalProperties": false,
1454
+ "properties": {
1455
+ "id": { "type": "string", "pattern": "^I-[0-9]{3}$" },
1456
+ "lens": { "type": "array", "minItems": 1, "maxItems": 2, "items": { "type": "string", "minLength": 1 } },
1457
+ "title": { "type": "string", "minLength": 1 },
1458
+ "scope": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
1459
+ "severity": { "enum": ["high", "medium", "low"] },
1460
+ "effort": { "enum": ["S", "M", "L", "XL"] },
1461
+ "consensus": { "enum": ["full", "partial", "contested", "worker-unique"] },
1462
+ "sourceWorkers": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
1463
+ "recommendedNextPhase": { "enum": ["requirements-discovery", "implementation-planning", "error-analysis"] },
1464
+ "expectedBehaviorAfter": { "type": "string", "minLength": 1 },
1465
+ "evidence": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
1466
+ }
1467
+ },
1468
+
1469
+ "ImprovementDiscovery": {
1470
+ "type": "object",
1471
+ "required": ["candidates", "lensCoverage", "selectionLimit", "userNarrative"],
1472
+ "additionalProperties": false,
1473
+ "properties": {
1474
+ "candidates": { "type": "array", "items": { "$ref": "#/$defs/ImprovementCandidate" } },
1475
+ "lensCoverage": {
1476
+ "type": "array",
1477
+ "minItems": 1,
1478
+ "items": {
1479
+ "type": "object",
1480
+ "required": ["lens", "status", "rationale", "evidence"],
1481
+ "additionalProperties": false,
1482
+ "properties": {
1483
+ "lens": { "type": "string", "minLength": 1 },
1484
+ "status": { "enum": ["candidate-found", "no-candidate"] },
1485
+ "rationale": { "type": "string", "minLength": 1 },
1486
+ "evidence": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
1487
+ }
1488
+ }
1489
+ },
1490
+ "selectionLimit": { "type": "integer", "minimum": 1 },
1491
+ "userNarrative": { "$ref": "#/$defs/ImprovementUserNarrative" }
1492
+ }
1493
+ },
1494
+
1495
+ "VerdictToken": {
1496
+ "enum": [
1497
+ "accepted",
1498
+ "conditional-accept",
1499
+ "analysis-complete",
1500
+ "analysis-partial",
1501
+ "blocked",
1502
+ "not-applicable"
1503
+ ]
1504
+ },
1505
+
1506
+ "Direction": {
1507
+ "enum": [
1508
+ "continue-investigation",
1509
+ "begin-planning",
1510
+ "begin-implementation",
1511
+ "approve",
1512
+ "reject",
1513
+ "hold"
1514
+ ]
1515
+ },
1516
+
1517
+ "ErrorAnalysis": {
1518
+ "type": "object",
1519
+ "additionalProperties": false,
1520
+ "required": [
1521
+ "symptomVerbatim",
1522
+ "observableFailure",
1523
+ "reproduction",
1524
+ "causeCandidates",
1525
+ "nextDiagnostic",
1526
+ "routing",
1527
+ "userNarrative"
1528
+ ],
1529
+ "properties": {
1530
+ "symptomVerbatim": { "type": "string" },
1531
+ "userNarrative": { "$ref": "#/$defs/ErrorUserNarrative" },
1532
+ "observableFailure": { "type": "string" },
1533
+ "reproduction": {
1534
+ "type": "object",
1535
+ "additionalProperties": false,
1536
+ "required": ["status", "evidence", "blockedReason"],
1537
+ "properties": {
1538
+ "status": {
1539
+ "enum": ["reproduced", "not-reproduced", "blocked-before-repro"]
1540
+ },
1541
+ "evidence": {
1542
+ "type": "array",
1543
+ "minItems": 1,
1544
+ "items": { "type": "string" }
1545
+ },
1546
+ "blockedReason": { "type": "string" }
1547
+ }
1548
+ },
1549
+ "causeCandidates": {
1550
+ "type": "array",
1551
+ "items": {
1552
+ "type": "object",
1553
+ "additionalProperties": false,
1554
+ "required": [
1555
+ "id",
1556
+ "statement",
1557
+ "supportingEvidence",
1558
+ "falsifyingEvidenceChecked",
1559
+ "confidence",
1560
+ "disproveWith"
1561
+ ],
1562
+ "properties": {
1563
+ "id": { "type": "string", "pattern": "^EA-\\d{3,}$" },
1564
+ "statement": { "type": "string" },
1565
+ "supportingEvidence": {
1566
+ "type": "array",
1567
+ "minItems": 1,
1568
+ "items": { "type": "string" }
1569
+ },
1570
+ "falsifyingEvidenceChecked": {
1571
+ "type": "array",
1572
+ "minItems": 1,
1573
+ "items": { "type": "string" }
1574
+ },
1575
+ "confidence": { "enum": ["low", "medium", "high"] },
1576
+ "disproveWith": { "type": "string", "minLength": 1 }
1577
+ }
1578
+ }
1579
+ },
1580
+ "nextDiagnostic": {
1581
+ "type": "object",
1582
+ "additionalProperties": false,
1583
+ "required": ["action", "confirmingSignal", "rejectingSignal"],
1584
+ "properties": {
1585
+ "action": { "type": "string", "minLength": 1 },
1586
+ "confirmingSignal": { "type": "string", "minLength": 1 },
1587
+ "rejectingSignal": { "type": "string", "minLength": 1 }
1588
+ }
1589
+ },
1590
+ "routing": {
1591
+ "type": "object",
1592
+ "additionalProperties": false,
1593
+ "required": ["nextTaskType", "leadingCauseId", "rationale"],
1594
+ "properties": {
1595
+ "nextTaskType": {
1596
+ "enum": ["error-analysis", "implementation-planning"]
1597
+ },
1598
+ "leadingCauseId": { "type": "string" },
1599
+ "rationale": { "type": "string", "minLength": 1 }
1600
+ }
1601
+ }
1602
+ }
1603
+ },
1604
+
1605
+ "TicketId": {
1606
+ "type": "string",
1607
+ "minLength": 1,
1608
+ "description": "Ticket key (external) or task-fallback (task-id verbatim) or literal `unknown` when truly unidentified. Empty string is never valid."
1609
+ },
1610
+
1611
+ "Priority": {
1612
+ "enum": ["P0", "P1", "P2"]
1613
+ },
1614
+
1615
+ "FollowUpOrigin": {
1616
+ "enum": [
1617
+ "phase-continuation",
1618
+ "out-of-plan",
1619
+ "verifier-concern",
1620
+ "scope-boundary",
1621
+ "open-question",
1622
+ "manual"
1623
+ ]
1624
+ },
1625
+
1626
+ "ClarificationKind": {
1627
+ "enum": ["material", "decision", "data-point"]
1628
+ },
1629
+
1630
+ "ClarificationBlocks": {
1631
+ "enum": ["approval", "next-phase", "none"]
1632
+ },
1633
+
1634
+ "ClarificationStatus": {
1635
+ "enum": ["open", "answered", "resolved", "obsolete"]
1636
+ },
1637
+
1638
+ "WorkerStatus": {
1639
+ "enum": ["completed", "error", "timeout", "not-run", "synthesis-only"]
1640
+ },
1641
+
1642
+ "CurrentCodeEvidence": {
1643
+ "type": "object",
1644
+ "required": ["path", "line", "claim"],
1645
+ "additionalProperties": false,
1646
+ "properties": {
1647
+ "path": { "type": "string", "minLength": 1 },
1648
+ "line": { "type": "integer", "minimum": 1 },
1649
+ "claim": { "type": "string", "minLength": 1 }
1650
+ }
1651
+ },
1652
+
1653
+ "AnalysisEvidenceInput": {
1654
+ "type": "object",
1655
+ "required": [
1656
+ "taskKey",
1657
+ "taskType",
1658
+ "reportPath",
1659
+ "runSeq",
1660
+ "sourceCommit",
1661
+ "relation",
1662
+ "freshness",
1663
+ "reviewStatus"
1664
+ ],
1665
+ "additionalProperties": false,
1666
+ "properties": {
1667
+ "taskKey": { "type": "string", "minLength": 1 },
1668
+ "taskType": { "enum": ["project-analysis", "feature-analysis"] },
1669
+ "reportPath": { "type": "string", "minLength": 1 },
1670
+ "runSeq": { "type": "string", "pattern": "^[0-9]{3}$" },
1671
+ "sourceCommit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
1672
+ "relation": { "enum": ["project-context", "feature-baseline"] },
1673
+ "freshness": { "enum": ["exact", "stale"] },
1674
+ "reviewStatus": { "enum": ["accepted", "user-unverified"] }
1675
+ }
1676
+ },
1677
+
1678
+ "AnalysisRepresentativeEntryPoint": {
1679
+ "type": "object",
1680
+ "required": ["path", "symbol"],
1681
+ "additionalProperties": false,
1682
+ "properties": {
1683
+ "path": { "type": "string", "minLength": 1 },
1684
+ "symbol": { "type": "string", "minLength": 1 }
1685
+ }
1686
+ },
1687
+
1688
+ "AnalysisFeatureIndexRow": {
1689
+ "type": "object",
1690
+ "required": [
1691
+ "id",
1692
+ "name",
1693
+ "description",
1694
+ "representativeEntryPoint",
1695
+ "componentIds",
1696
+ "currentCodeEvidence"
1697
+ ],
1698
+ "additionalProperties": false,
1699
+ "properties": {
1700
+ "id": { "type": "string", "pattern": "^PF-[0-9]{3}$" },
1701
+ "name": { "type": "string", "minLength": 1 },
1702
+ "description": { "type": "string", "minLength": 1 },
1703
+ "representativeEntryPoint": {
1704
+ "$ref": "#/$defs/AnalysisRepresentativeEntryPoint"
1705
+ },
1706
+ "componentIds": {
1707
+ "type": "array",
1708
+ "items": { "type": "string", "pattern": "^PC-[0-9]{3}$" }
1709
+ },
1710
+ "currentCodeEvidence": {
1711
+ "type": "array",
1712
+ "minItems": 1,
1713
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1714
+ }
1715
+ }
1716
+ },
1717
+
1718
+ "AnalysisResolvedTarget": {
1719
+ "type": "object",
1720
+ "additionalProperties": false,
1721
+ "properties": {
1722
+ "inputMode": { "enum": ["feature-index", "free-text"] },
1723
+ "requestedValue": { "type": "string", "minLength": 1 },
1724
+ "feature": { "$ref": "#/$defs/AnalysisFeatureIndexRow" }
1725
+ },
1726
+ "allOf": [
1727
+ {
1728
+ "if": { "required": ["inputMode"] },
1729
+ "then": {
1730
+ "required": ["requestedValue"],
1731
+ "allOf": [
1732
+ {
1733
+ "if": {
1734
+ "properties": { "inputMode": { "const": "feature-index" } },
1735
+ "required": ["inputMode"]
1736
+ },
1737
+ "then": { "required": ["feature"] },
1738
+ "else": { "not": { "required": ["feature"] } }
1739
+ }
1740
+ ]
1741
+ },
1742
+ "else": {
1743
+ "allOf": [
1744
+ { "not": { "required": ["requestedValue"] } },
1745
+ { "not": { "required": ["feature"] } }
1746
+ ]
1747
+ }
1748
+ }
1749
+ ]
1750
+ },
1751
+
1752
+ "AnalysisScope": {
1753
+ "type": "object",
1754
+ "required": [
1755
+ "includedPaths",
1756
+ "excludedPaths",
1757
+ "unscannedPaths",
1758
+ "resolvedTarget"
1759
+ ],
1760
+ "additionalProperties": false,
1761
+ "properties": {
1762
+ "includedPaths": {
1763
+ "type": "array",
1764
+ "minItems": 1,
1765
+ "items": { "type": "string", "minLength": 1 }
1766
+ },
1767
+ "excludedPaths": {
1768
+ "type": "array",
1769
+ "items": { "type": "string", "minLength": 1 }
1770
+ },
1771
+ "unscannedPaths": {
1772
+ "type": "array",
1773
+ "items": { "type": "string", "minLength": 1 }
1774
+ },
1775
+ "resolvedTarget": { "$ref": "#/$defs/AnalysisResolvedTarget" }
1776
+ }
1777
+ },
1778
+
1779
+ "AnalysisReviewResolution": {
1780
+ "type": "object",
1781
+ "required": ["affectedId", "outcome", "resolution", "evidence"],
1782
+ "additionalProperties": false,
1783
+ "properties": {
1784
+ "affectedId": { "type": "string", "pattern": "^[A-Z]{2}-[0-9]{3}$" },
1785
+ "outcome": {
1786
+ "enum": [
1787
+ "revised",
1788
+ "retained-with-evidence",
1789
+ "removed",
1790
+ "still-unresolved"
1791
+ ]
1792
+ },
1793
+ "resolution": { "type": "string", "minLength": 1 },
1794
+ "evidence": {
1795
+ "type": "array",
1796
+ "minItems": 1,
1797
+ "items": { "type": "string", "minLength": 1 }
1798
+ }
1799
+ }
1800
+ },
1801
+
1802
+ "AnalysisConfirmedFact": {
1803
+ "type": "object",
1804
+ "required": ["id", "statement", "currentCodeEvidence"],
1805
+ "additionalProperties": false,
1806
+ "properties": {
1807
+ "id": { "type": "string", "pattern": "^AF-[0-9]{3}$" },
1808
+ "statement": { "type": "string", "minLength": 1 },
1809
+ "currentCodeEvidence": {
1810
+ "type": "array",
1811
+ "minItems": 1,
1812
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1813
+ },
1814
+ "sourceReportRefs": {
1815
+ "type": "array",
1816
+ "items": { "type": "string", "minLength": 1 }
1817
+ }
1818
+ }
1819
+ },
1820
+
1821
+ "AnalysisInference": {
1822
+ "type": "object",
1823
+ "required": ["id", "statement", "evidenceIds", "confidence"],
1824
+ "additionalProperties": false,
1825
+ "properties": {
1826
+ "id": { "type": "string", "pattern": "^AI-[0-9]{3}$" },
1827
+ "statement": { "type": "string", "minLength": 1 },
1828
+ "evidenceIds": {
1829
+ "type": "array",
1830
+ "minItems": 1,
1831
+ "items": { "type": "string", "minLength": 1 }
1832
+ },
1833
+ "confidence": { "enum": ["high", "medium", "low"] }
1834
+ }
1835
+ },
1836
+
1837
+ "AnalysisUnknown": {
1838
+ "type": "object",
1839
+ "required": ["id", "question", "reason", "affectsVerdict"],
1840
+ "additionalProperties": false,
1841
+ "properties": {
1842
+ "id": { "type": "string", "pattern": "^AU-[0-9]{3}$" },
1843
+ "question": { "type": "string", "minLength": 1 },
1844
+ "reason": { "type": "string", "minLength": 1 },
1845
+ "affectsVerdict": { "type": "boolean" }
1846
+ }
1847
+ },
1848
+
1849
+ "AnalysisCommon": {
1850
+ "type": "object",
1851
+ "required": [
1852
+ "runSeq",
1853
+ "sourceCommit",
1854
+ "scope",
1855
+ "evidenceInputs",
1856
+ "confirmedFacts",
1857
+ "inferences",
1858
+ "unknowns",
1859
+ "analysisReviewResolution"
1860
+ ],
1861
+ "additionalProperties": false,
1862
+ "properties": {
1863
+ "runSeq": { "type": "string", "pattern": "^[0-9]{3}$" },
1864
+ "sourceCommit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
1865
+ "scope": { "$ref": "#/$defs/AnalysisScope" },
1866
+ "evidenceInputs": {
1867
+ "type": "array",
1868
+ "items": { "$ref": "#/$defs/AnalysisEvidenceInput" }
1869
+ },
1870
+ "confirmedFacts": {
1871
+ "type": "array",
1872
+ "items": { "$ref": "#/$defs/AnalysisConfirmedFact" }
1873
+ },
1874
+ "inferences": {
1875
+ "type": "array",
1876
+ "items": { "$ref": "#/$defs/AnalysisInference" }
1877
+ },
1878
+ "unknowns": {
1879
+ "type": "array",
1880
+ "items": { "$ref": "#/$defs/AnalysisUnknown" }
1881
+ },
1882
+ "analysisReviewResolution": {
1883
+ "type": "array",
1884
+ "items": { "$ref": "#/$defs/AnalysisReviewResolution" }
1885
+ }
1886
+ }
1887
+ },
1888
+
1889
+ "ProjectComponent": {
1890
+ "type": "object",
1891
+ "required": ["id", "name", "responsibility", "paths", "currentCodeEvidence"],
1892
+ "additionalProperties": false,
1893
+ "properties": {
1894
+ "id": { "type": "string", "pattern": "^PC-[0-9]{3}$" },
1895
+ "name": { "type": "string", "minLength": 1 },
1896
+ "responsibility": { "type": "string", "minLength": 1 },
1897
+ "paths": {
1898
+ "type": "array",
1899
+ "minItems": 1,
1900
+ "items": { "type": "string", "minLength": 1 }
1901
+ },
1902
+ "currentCodeEvidence": {
1903
+ "type": "array",
1904
+ "minItems": 1,
1905
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1906
+ }
1907
+ }
1908
+ },
1909
+
1910
+ "ProjectDependency": {
1911
+ "type": "object",
1912
+ "required": ["fromComponentId", "toComponentId", "direction", "currentCodeEvidence"],
1913
+ "additionalProperties": false,
1914
+ "properties": {
1915
+ "fromComponentId": { "type": "string", "pattern": "^PC-[0-9]{3}$" },
1916
+ "toComponentId": { "type": "string", "pattern": "^PC-[0-9]{3}$" },
1917
+ "direction": { "type": "string", "minLength": 1 },
1918
+ "currentCodeEvidence": {
1919
+ "type": "array",
1920
+ "minItems": 1,
1921
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1922
+ }
1923
+ }
1924
+ },
1925
+
1926
+ "ProjectEntryPoint": {
1927
+ "type": "object",
1928
+ "required": ["kind", "path", "symbol", "role", "currentCodeEvidence"],
1929
+ "additionalProperties": false,
1930
+ "properties": {
1931
+ "kind": { "type": "string", "minLength": 1 },
1932
+ "path": { "type": "string", "minLength": 1 },
1933
+ "symbol": { "type": "string", "minLength": 1 },
1934
+ "role": { "type": "string", "minLength": 1 },
1935
+ "currentCodeEvidence": {
1936
+ "type": "array",
1937
+ "minItems": 1,
1938
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1939
+ }
1940
+ }
1941
+ },
1942
+
1943
+ "ProjectDataStore": {
1944
+ "type": "object",
1945
+ "required": ["name", "ownerComponentId", "readBoundary", "writeBoundary", "currentCodeEvidence"],
1946
+ "additionalProperties": false,
1947
+ "properties": {
1948
+ "name": { "type": "string", "minLength": 1 },
1949
+ "ownerComponentId": { "type": "string", "pattern": "^PC-[0-9]{3}$" },
1950
+ "readBoundary": { "type": "string", "minLength": 1 },
1951
+ "writeBoundary": { "type": "string", "minLength": 1 },
1952
+ "currentCodeEvidence": {
1953
+ "type": "array",
1954
+ "minItems": 1,
1955
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1956
+ }
1957
+ }
1958
+ },
1959
+
1960
+ "ProjectExternalSystem": {
1961
+ "type": "object",
1962
+ "required": ["name", "adapter", "direction", "currentCodeEvidence"],
1963
+ "additionalProperties": false,
1964
+ "properties": {
1965
+ "name": { "type": "string", "minLength": 1 },
1966
+ "adapter": { "type": "string", "minLength": 1 },
1967
+ "direction": { "type": "string", "minLength": 1 },
1968
+ "currentCodeEvidence": {
1969
+ "type": "array",
1970
+ "minItems": 1,
1971
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
1972
+ }
1973
+ }
1974
+ },
1975
+
1976
+ "ProjectScanCoverage": {
1977
+ "type": "object",
1978
+ "required": ["scannedPathCount", "unscannedPathCount", "reason"],
1979
+ "additionalProperties": false,
1980
+ "properties": {
1981
+ "scannedPathCount": { "type": "integer", "minimum": 0 },
1982
+ "unscannedPathCount": { "type": "integer", "minimum": 0 },
1983
+ "reason": { "type": "string", "minLength": 1 }
1984
+ }
1985
+ },
1986
+
1987
+ "ProjectHotspot": {
1988
+ "type": "object",
1989
+ "required": ["id", "title", "impact", "risk", "reason", "evidenceRefs"],
1990
+ "additionalProperties": false,
1991
+ "properties": {
1992
+ "id": { "type": "string", "pattern": "^PH-[0-9]{3}$" },
1993
+ "title": { "type": "string", "minLength": 1 },
1994
+ "impact": { "enum": ["high", "medium", "low"] },
1995
+ "risk": { "enum": ["high", "medium", "low"] },
1996
+ "reason": { "type": "string", "minLength": 1 },
1997
+ "evidenceRefs": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
1998
+ }
1999
+ },
2000
+
2001
+ "ProjectQualityCoverage": {
2002
+ "type": "object",
2003
+ "required": ["id", "area", "status", "summary", "evidenceRefs"],
2004
+ "additionalProperties": false,
2005
+ "properties": {
2006
+ "id": { "type": "string", "pattern": "^PQ-[0-9]{3}$" },
2007
+ "area": { "type": "string", "minLength": 1 },
2008
+ "status": { "enum": ["covered", "partial", "gap", "risk"] },
2009
+ "summary": { "type": "string", "minLength": 1 },
2010
+ "evidenceRefs": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
2011
+ }
2012
+ },
2013
+
2014
+ "ProjectAnalysis": {
2015
+ "type": "object",
2016
+ "required": [
2017
+ "components",
2018
+ "dependencies",
2019
+ "entryPoints",
2020
+ "dataStores",
2021
+ "externalSystems",
2022
+ "featureIndex",
2023
+ "scanCoverage",
2024
+ "rankedHotspots",
2025
+ "qualityCoverage",
2026
+ "userNarrative"
2027
+ ],
2028
+ "additionalProperties": false,
2029
+ "properties": {
2030
+ "components": {
2031
+ "type": "array",
2032
+ "items": { "$ref": "#/$defs/ProjectComponent" }
2033
+ },
2034
+ "dependencies": {
2035
+ "type": "array",
2036
+ "items": { "$ref": "#/$defs/ProjectDependency" }
2037
+ },
2038
+ "entryPoints": {
2039
+ "type": "array",
2040
+ "items": { "$ref": "#/$defs/ProjectEntryPoint" }
2041
+ },
2042
+ "dataStores": {
2043
+ "type": "array",
2044
+ "items": { "$ref": "#/$defs/ProjectDataStore" }
2045
+ },
2046
+ "externalSystems": {
2047
+ "type": "array",
2048
+ "items": { "$ref": "#/$defs/ProjectExternalSystem" }
2049
+ },
2050
+ "featureIndex": {
2051
+ "type": "array",
2052
+ "items": { "$ref": "#/$defs/AnalysisFeatureIndexRow" }
2053
+ },
2054
+ "rankedHotspots": {
2055
+ "type": "array",
2056
+ "minItems": 1,
2057
+ "items": { "$ref": "#/$defs/ProjectHotspot" }
2058
+ },
2059
+ "qualityCoverage": {
2060
+ "type": "array",
2061
+ "minItems": 1,
2062
+ "items": { "$ref": "#/$defs/ProjectQualityCoverage" }
2063
+ },
2064
+ "scanCoverage": { "$ref": "#/$defs/ProjectScanCoverage" },
2065
+ "userNarrative": { "$ref": "#/$defs/ProjectUserNarrative" }
2066
+ }
2067
+ },
2068
+
2069
+ "FeatureTarget": {
2070
+ "type": "object",
2071
+ "required": ["inputMode", "requestedValue", "entryPoints"],
2072
+ "additionalProperties": false,
2073
+ "properties": {
2074
+ "inputMode": { "enum": ["feature-index", "free-text"] },
2075
+ "requestedValue": { "type": "string", "minLength": 1 },
2076
+ "featureId": { "type": "string", "pattern": "^PF-[0-9]{3}$" },
2077
+ "entryPoints": {
2078
+ "type": "array",
2079
+ "minItems": 1,
2080
+ "items": { "$ref": "#/$defs/AnalysisRepresentativeEntryPoint" }
2081
+ }
2082
+ },
2083
+ "allOf": [
2084
+ {
2085
+ "if": {
2086
+ "properties": { "inputMode": { "const": "feature-index" } },
2087
+ "required": ["inputMode"]
2088
+ },
2089
+ "then": { "required": ["featureId"] },
2090
+ "else": { "not": { "required": ["featureId"] } }
2091
+ }
2092
+ ]
2093
+ },
2094
+
2095
+ "FeatureFlowStep": {
2096
+ "type": "object",
2097
+ "required": ["sequence", "action"],
2098
+ "additionalProperties": false,
2099
+ "properties": {
2100
+ "sequence": { "type": "integer", "minimum": 1 },
2101
+ "action": { "type": "string", "minLength": 1 }
2102
+ }
2103
+ },
2104
+
2105
+ "FeatureFlow": {
2106
+ "type": "object",
2107
+ "required": ["id", "kind", "steps", "currentCodeEvidence"],
2108
+ "additionalProperties": false,
2109
+ "properties": {
2110
+ "id": { "type": "string", "pattern": "^FF-[0-9]{3}$" },
2111
+ "kind": { "enum": ["normal", "alternative", "failure"] },
2112
+ "steps": {
2113
+ "type": "array",
2114
+ "minItems": 1,
2115
+ "items": { "$ref": "#/$defs/FeatureFlowStep" }
2116
+ },
2117
+ "currentCodeEvidence": {
2118
+ "type": "array",
2119
+ "minItems": 1,
2120
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2121
+ },
2122
+ "sourceReportRefs": {
2123
+ "type": "array",
2124
+ "items": { "type": "string", "minLength": 1 }
2125
+ }
2126
+ }
2127
+ },
2128
+
2129
+ "FeatureDomainRule": {
2130
+ "type": "object",
2131
+ "required": ["id", "condition", "outcome", "currentCodeEvidence"],
2132
+ "additionalProperties": false,
2133
+ "properties": {
2134
+ "id": { "type": "string", "pattern": "^FR-[0-9]{3}$" },
2135
+ "condition": { "type": "string", "minLength": 1 },
2136
+ "outcome": { "type": "string", "minLength": 1 },
2137
+ "currentCodeEvidence": {
2138
+ "type": "array",
2139
+ "minItems": 1,
2140
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2141
+ },
2142
+ "sourceReportRefs": {
2143
+ "type": "array",
2144
+ "items": { "type": "string", "minLength": 1 }
2145
+ }
2146
+ }
2147
+ },
2148
+
2149
+ "FeatureStateChange": {
2150
+ "type": "object",
2151
+ "required": [
2152
+ "id",
2153
+ "dataStore",
2154
+ "field",
2155
+ "change",
2156
+ "sideEffects",
2157
+ "currentCodeEvidence"
2158
+ ],
2159
+ "additionalProperties": false,
2160
+ "properties": {
2161
+ "id": { "type": "string", "pattern": "^FS-[0-9]{3}$" },
2162
+ "dataStore": { "type": "string", "minLength": 1 },
2163
+ "field": { "type": "string", "minLength": 1 },
2164
+ "change": { "type": "string", "minLength": 1 },
2165
+ "sideEffects": {
2166
+ "type": "array",
2167
+ "items": { "type": "string", "minLength": 1 }
2168
+ },
2169
+ "currentCodeEvidence": {
2170
+ "type": "array",
2171
+ "minItems": 1,
2172
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2173
+ },
2174
+ "sourceReportRefs": {
2175
+ "type": "array",
2176
+ "items": { "type": "string", "minLength": 1 }
2177
+ }
2178
+ }
2179
+ },
2180
+
2181
+ "FeatureExternalInteraction": {
2182
+ "type": "object",
2183
+ "required": ["target", "input", "output", "failureHandling", "currentCodeEvidence"],
2184
+ "additionalProperties": false,
2185
+ "properties": {
2186
+ "target": { "type": "string", "minLength": 1 },
2187
+ "input": { "type": "string", "minLength": 1 },
2188
+ "output": { "type": "string", "minLength": 1 },
2189
+ "failureHandling": { "type": "string", "minLength": 1 },
2190
+ "currentCodeEvidence": {
2191
+ "type": "array",
2192
+ "minItems": 1,
2193
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2194
+ }
2195
+ }
2196
+ },
2197
+
2198
+ "FeatureTestCoverage": {
2199
+ "type": "object",
2200
+ "required": ["id", "targetIds", "testPaths", "gaps"],
2201
+ "additionalProperties": false,
2202
+ "properties": {
2203
+ "id": { "type": "string", "pattern": "^FT-[0-9]{3}$" },
2204
+ "targetIds": {
2205
+ "type": "array",
2206
+ "minItems": 1,
2207
+ "items": { "type": "string", "pattern": "^F[FRS]-[0-9]{3}$" }
2208
+ },
2209
+ "testPaths": {
2210
+ "type": "array",
2211
+ "items": { "type": "string", "minLength": 1 }
2212
+ },
2213
+ "gaps": {
2214
+ "type": "array",
2215
+ "items": { "type": "string", "minLength": 1 }
2216
+ }
2217
+ }
2218
+ },
2219
+
2220
+ "FeatureConcern": {
2221
+ "type": "object",
2222
+ "required": ["description", "currentCodeEvidence"],
2223
+ "additionalProperties": false,
2224
+ "properties": {
2225
+ "description": { "type": "string", "minLength": 1 },
2226
+ "currentCodeEvidence": {
2227
+ "type": "array",
2228
+ "minItems": 1,
2229
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2230
+ }
2231
+ }
2232
+ },
2233
+
2234
+ "FeatureAnalysis": {
2235
+ "type": "object",
2236
+ "required": [
2237
+ "target",
2238
+ "flows",
2239
+ "domainRules",
2240
+ "stateChanges",
2241
+ "externalInteractions",
2242
+ "testCoverage",
2243
+ "actors",
2244
+ "preconditions",
2245
+ "postconditions",
2246
+ "permissionsAndFlags",
2247
+ "nonFunctionalConcerns",
2248
+ "userNarrative"
2249
+ ],
2250
+ "additionalProperties": false,
2251
+ "properties": {
2252
+ "target": { "$ref": "#/$defs/FeatureTarget" },
2253
+ "userNarrative": { "$ref": "#/$defs/FeatureUserNarrative" },
2254
+ "flows": {
2255
+ "type": "array",
2256
+ "items": { "$ref": "#/$defs/FeatureFlow" }
2257
+ },
2258
+ "domainRules": {
2259
+ "type": "array",
2260
+ "items": { "$ref": "#/$defs/FeatureDomainRule" }
2261
+ },
2262
+ "stateChanges": {
2263
+ "type": "array",
2264
+ "items": { "$ref": "#/$defs/FeatureStateChange" }
2265
+ },
2266
+ "externalInteractions": {
2267
+ "type": "array",
2268
+ "items": { "$ref": "#/$defs/FeatureExternalInteraction" }
2269
+ },
2270
+ "testCoverage": {
2271
+ "type": "array",
2272
+ "items": { "$ref": "#/$defs/FeatureTestCoverage" }
2273
+ },
2274
+ "actors": {
2275
+ "type": "array",
2276
+ "items": { "$ref": "#/$defs/FeatureConcern" }
2277
+ },
2278
+ "preconditions": {
2279
+ "type": "array",
2280
+ "items": { "$ref": "#/$defs/FeatureConcern" }
2281
+ },
2282
+ "postconditions": {
2283
+ "type": "array",
2284
+ "items": { "$ref": "#/$defs/FeatureConcern" }
2285
+ },
2286
+ "permissionsAndFlags": {
2287
+ "type": "array",
2288
+ "items": { "$ref": "#/$defs/FeatureConcern" }
2289
+ },
2290
+ "nonFunctionalConcerns": {
2291
+ "type": "array",
2292
+ "items": { "$ref": "#/$defs/FeatureConcern" }
2293
+ }
2294
+ }
2295
+ },
2296
+
2297
+ "ChangeRequest": {
2298
+ "type": "object",
2299
+ "required": ["summary", "briefEvidence"],
2300
+ "additionalProperties": false,
2301
+ "properties": {
2302
+ "summary": { "type": "string", "minLength": 1 },
2303
+ "briefEvidence": { "type": "string", "minLength": 1 }
2304
+ }
2305
+ },
2306
+
2307
+ "PreservedBehavior": {
2308
+ "type": "object",
2309
+ "required": ["statement", "currentCodeEvidence"],
2310
+ "additionalProperties": false,
2311
+ "properties": {
2312
+ "statement": { "type": "string", "minLength": 1 },
2313
+ "currentCodeEvidence": {
2314
+ "type": "array",
2315
+ "minItems": 1,
2316
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2317
+ }
2318
+ }
2319
+ },
2320
+
2321
+ "ChangeImpactItem": {
2322
+ "type": "object",
2323
+ "required": [
2324
+ "id",
2325
+ "target",
2326
+ "impactKind",
2327
+ "level",
2328
+ "confidence",
2329
+ "sourceReportRefs",
2330
+ "currentCodeEvidence"
2331
+ ],
2332
+ "additionalProperties": false,
2333
+ "properties": {
2334
+ "id": { "type": "string", "pattern": "^CI-[0-9]{3}$" },
2335
+ "target": { "type": "string", "minLength": 1 },
2336
+ "impactKind": { "type": "string", "minLength": 1 },
2337
+ "level": { "enum": ["high", "medium", "low"] },
2338
+ "confidence": { "enum": ["high", "medium", "low"] },
2339
+ "sourceReportRefs": {
2340
+ "type": "array",
2341
+ "items": { "type": "string", "minLength": 1 }
2342
+ },
2343
+ "currentCodeEvidence": {
2344
+ "type": "array",
2345
+ "minItems": 1,
2346
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2347
+ }
2348
+ }
2349
+ },
2350
+
2351
+ "DependencyBlastRadius": {
2352
+ "type": "object",
2353
+ "required": ["sourceImpactId", "affectedTarget", "direction", "currentCodeEvidence"],
2354
+ "additionalProperties": false,
2355
+ "properties": {
2356
+ "sourceImpactId": { "type": "string", "pattern": "^CI-[0-9]{3}$" },
2357
+ "affectedTarget": { "type": "string", "minLength": 1 },
2358
+ "direction": { "type": "string", "minLength": 1 },
2359
+ "currentCodeEvidence": {
2360
+ "type": "array",
2361
+ "minItems": 1,
2362
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2363
+ }
2364
+ }
2365
+ },
2366
+
2367
+ "ChangeTestImpact": {
2368
+ "type": "object",
2369
+ "required": ["scope", "action", "testPaths", "currentCodeEvidence"],
2370
+ "additionalProperties": false,
2371
+ "properties": {
2372
+ "scope": { "type": "string", "minLength": 1 },
2373
+ "action": { "enum": ["preserve", "modify", "add"] },
2374
+ "testPaths": {
2375
+ "type": "array",
2376
+ "items": { "type": "string", "minLength": 1 }
2377
+ },
2378
+ "currentCodeEvidence": {
2379
+ "type": "array",
2380
+ "minItems": 1,
2381
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2382
+ }
2383
+ }
2384
+ },
2385
+
2386
+ "OperationalImpact": {
2387
+ "type": "object",
2388
+ "required": ["area", "impact", "currentCodeEvidence"],
2389
+ "additionalProperties": false,
2390
+ "properties": {
2391
+ "area": { "type": "string", "minLength": 1 },
2392
+ "impact": { "type": "string", "minLength": 1 },
2393
+ "currentCodeEvidence": {
2394
+ "type": "array",
2395
+ "minItems": 1,
2396
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2397
+ }
2398
+ }
2399
+ },
2400
+
2401
+ "AnalysisPlanningInput": {
2402
+ "type": "object",
2403
+ "required": ["constraint", "unknown"],
2404
+ "additionalProperties": false,
2405
+ "properties": {
2406
+ "constraint": { "type": "string", "minLength": 1 },
2407
+ "unknown": { "type": "boolean" }
2408
+ }
2409
+ },
2410
+
2411
+ "ChangeImpactConcern": {
2412
+ "type": "object",
2413
+ "required": ["summary", "currentCodeEvidence"],
2414
+ "additionalProperties": false,
2415
+ "properties": {
2416
+ "summary": { "type": "string", "minLength": 1 },
2417
+ "currentCodeEvidence": {
2418
+ "type": "array",
2419
+ "minItems": 1,
2420
+ "items": { "$ref": "#/$defs/CurrentCodeEvidence" }
2421
+ }
2422
+ }
2423
+ },
2424
+
2425
+ "ChangeImpactAnalysis": {
2426
+ "type": "object",
2427
+ "required": [
2428
+ "changeRequest",
2429
+ "preservedBehaviors",
2430
+ "impactItems",
2431
+ "dependencyBlastRadius",
2432
+ "testImpact",
2433
+ "operationalImpact",
2434
+ "planningInputs",
2435
+ "unaffectedBoundaries",
2436
+ "compatibilityImpact",
2437
+ "migrationImpact",
2438
+ "rollbackImpact",
2439
+ "securityAndPerformanceImpact",
2440
+ "userNarrative"
2441
+ ],
2442
+ "additionalProperties": false,
2443
+ "properties": {
2444
+ "changeRequest": { "$ref": "#/$defs/ChangeRequest" },
2445
+ "userNarrative": { "$ref": "#/$defs/ChangeImpactUserNarrative" },
2446
+ "preservedBehaviors": {
2447
+ "type": "array",
2448
+ "items": { "$ref": "#/$defs/PreservedBehavior" }
2449
+ },
2450
+ "impactItems": {
2451
+ "type": "array",
2452
+ "items": { "$ref": "#/$defs/ChangeImpactItem" }
2453
+ },
2454
+ "dependencyBlastRadius": {
2455
+ "type": "array",
2456
+ "items": { "$ref": "#/$defs/DependencyBlastRadius" }
2457
+ },
2458
+ "testImpact": {
2459
+ "type": "array",
2460
+ "items": { "$ref": "#/$defs/ChangeTestImpact" }
2461
+ },
2462
+ "operationalImpact": {
2463
+ "type": "array",
2464
+ "items": { "$ref": "#/$defs/OperationalImpact" }
2465
+ },
2466
+ "planningInputs": {
2467
+ "type": "array",
2468
+ "items": { "$ref": "#/$defs/AnalysisPlanningInput" }
2469
+ },
2470
+ "unaffectedBoundaries": {
2471
+ "type": "array",
2472
+ "items": { "$ref": "#/$defs/ChangeImpactConcern" }
2473
+ },
2474
+ "compatibilityImpact": {
2475
+ "type": "array",
2476
+ "items": { "$ref": "#/$defs/ChangeImpactConcern" }
2477
+ },
2478
+ "migrationImpact": {
2479
+ "type": "array",
2480
+ "items": { "$ref": "#/$defs/ChangeImpactConcern" }
2481
+ },
2482
+ "rollbackImpact": {
2483
+ "type": "array",
2484
+ "items": { "$ref": "#/$defs/ChangeImpactConcern" }
2485
+ },
2486
+ "securityAndPerformanceImpact": {
2487
+ "type": "array",
2488
+ "items": { "$ref": "#/$defs/ChangeImpactConcern" }
2489
+ }
2490
+ }
2491
+ },
2492
+
2493
+ "SourceItem": {
2494
+ "type": "string",
2495
+ "pattern": "^[a-z][a-z-]*:[A-Za-z0-9._-]+$",
2496
+ "description": "Source-item reference in the form `<worker>:<item-id>`, e.g. `claude:F-001`, `codex:1.1`, `lead:mcp-1`. Bare worker-name lists are deprecated; every source must carry its origin item ID."
2497
+ },
2498
+
2499
+ "SummaryRow": {
2500
+ "type": "object",
2501
+ "required": ["id", "ticketId", "summary", "source"],
2502
+ "additionalProperties": false,
2503
+ "properties": {
2504
+ "id": { "type": "string", "pattern": "^P-\\d{3,}$" },
2505
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2506
+ "summary": { "type": "string", "minLength": 1 },
2507
+ "source": { "type": "string", "minLength": 1 }
2508
+ }
2509
+ },
2510
+
2511
+ "TicketCoverageRow": {
2512
+ "type": "object",
2513
+ "required": ["ticketId", "sections", "relatedIds"],
2514
+ "additionalProperties": false,
2515
+ "properties": {
2516
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2517
+ "sections": { "type": "string", "minLength": 1 },
2518
+ "relatedIds": { "type": "string", "minLength": 1 }
2519
+ }
2520
+ },
2521
+
2522
+ "ExecutionStatusRow": {
2523
+ "type": "object",
2524
+ "required": ["agent", "role", "model", "status", "summary"],
2525
+ "additionalProperties": false,
2526
+ "properties": {
2527
+ "agent": { "enum": ["Claude Code", "Codex", "Antigravity"] },
2528
+ "role": { "type": "string", "minLength": 1 },
2529
+ "model": { "type": "string", "minLength": 1 },
2530
+ "status": { "$ref": "#/$defs/WorkerStatus" },
2531
+ "summary": { "type": "string", "minLength": 1 },
2532
+ "totalTokens": {
2533
+ "oneOf": [
2534
+ { "type": "integer", "minimum": 0 },
2535
+ { "type": "null" }
2536
+ ]
2537
+ },
2538
+ "billableTokens": {
2539
+ "oneOf": [
2540
+ { "type": "integer", "minimum": 0 },
2541
+ { "type": "null" }
2542
+ ]
2543
+ },
2544
+ "costUsd": {
2545
+ "oneOf": [
2546
+ { "type": "number", "minimum": 0 },
2547
+ { "type": "null" }
2548
+ ]
2549
+ },
2550
+ "cliTotalTokens": {
2551
+ "oneOf": [
2552
+ { "type": "integer", "minimum": 0 },
2553
+ { "type": "null" }
2554
+ ]
2555
+ },
2556
+ "cliCostUsd": {
2557
+ "oneOf": [
2558
+ { "type": "number", "minimum": 0 },
2559
+ { "type": "null" }
2560
+ ]
2561
+ },
2562
+ "durationMs": {
2563
+ "oneOf": [
2564
+ { "type": "integer", "minimum": 0 },
2565
+ { "type": "null" }
2566
+ ]
2567
+ }
2568
+ }
2569
+ },
2570
+
2571
+ "TokenUsageRow": {
2572
+ "type": "object",
2573
+ "required": ["totalTokens", "billableTokens", "costUsd"],
2574
+ "additionalProperties": false,
2575
+ "properties": {
2576
+ "totalTokens": {
2577
+ "oneOf": [
2578
+ { "type": "integer", "minimum": 0 },
2579
+ { "type": "null" }
2580
+ ]
2581
+ },
2582
+ "billableTokens": {
2583
+ "oneOf": [
2584
+ { "type": "integer", "minimum": 0 },
2585
+ { "type": "null" }
2586
+ ]
2587
+ },
2588
+ "costUsd": {
2589
+ "oneOf": [
2590
+ { "type": "number", "minimum": 0 },
2591
+ { "type": "null" }
2592
+ ]
2593
+ }
2594
+ }
2595
+ },
2596
+
2597
+ "TokenUsageWorkerDetailRow": {
2598
+ "type": "object",
2599
+ "required": [
2600
+ "label",
2601
+ "totalTokens",
2602
+ "billableTokens",
2603
+ "costUsd",
2604
+ "cliTotalTokens",
2605
+ "cliCostUsd"
2606
+ ],
2607
+ "additionalProperties": false,
2608
+ "properties": {
2609
+ "label": { "type": "string", "minLength": 1 },
2610
+ "totalTokens": {
2611
+ "oneOf": [
2612
+ { "type": "integer", "minimum": 0 },
2613
+ { "type": "null" }
2614
+ ]
2615
+ },
2616
+ "billableTokens": {
2617
+ "oneOf": [
2618
+ { "type": "integer", "minimum": 0 },
2619
+ { "type": "null" }
2620
+ ]
2621
+ },
2622
+ "costUsd": {
2623
+ "oneOf": [
2624
+ { "type": "number", "minimum": 0 },
2625
+ { "type": "null" }
2626
+ ]
2627
+ },
2628
+ "cliTotalTokens": {
2629
+ "oneOf": [
2630
+ { "type": "integer", "minimum": 0 },
2631
+ { "type": "null" }
2632
+ ]
2633
+ },
2634
+ "cliCostUsd": {
2635
+ "oneOf": [
2636
+ { "type": "number", "minimum": 0 },
2637
+ { "type": "null" }
2638
+ ]
2639
+ }
2640
+ }
2641
+ },
2642
+
2643
+ "RoundHistoryRow": {
2644
+ "type": "object",
2645
+ "required": [
2646
+ "round",
2647
+ "inputQueueSize",
2648
+ "resolvedCount",
2649
+ "carriedForwardCount",
2650
+ "dispatches",
2651
+ "skippedWorkers"
2652
+ ],
2653
+ "additionalProperties": false,
2654
+ "properties": {
2655
+ "round": { "type": "integer", "minimum": 0 },
2656
+ "inputQueueSize": { "type": "integer", "minimum": 0 },
2657
+ "resolvedCount": { "type": "integer", "minimum": 0 },
2658
+ "carriedForwardCount": { "type": "integer", "minimum": 0 },
2659
+ "dispatches": { "type": "string" },
2660
+ "skippedWorkers": { "type": "string" }
2661
+ }
2662
+ },
2663
+
2664
+ "ConsensusRow": {
2665
+ "type": "object",
2666
+ "required": ["id", "ticketId", "statement", "sourceItems", "evidence"],
2667
+ "additionalProperties": false,
2668
+ "properties": {
2669
+ "id": { "type": "string", "pattern": "^C-\\d{3,}$" },
2670
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2671
+ "statement": { "type": "string", "minLength": 1 },
2672
+ "sourceItems": {
2673
+ "type": "array",
2674
+ "minItems": 1,
2675
+ "items": { "$ref": "#/$defs/SourceItem" }
2676
+ },
2677
+ "evidence": { "type": "string", "minLength": 1 }
2678
+ }
2679
+ },
2680
+
2681
+ "DifferenceRow": {
2682
+ "type": "object",
2683
+ "required": ["id", "ticketId", "disagreement", "workersPosition", "evidence"],
2684
+ "additionalProperties": false,
2685
+ "properties": {
2686
+ "id": { "type": "string", "pattern": "^D-\\d{3,}$" },
2687
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2688
+ "disagreement": { "type": "string", "minLength": 1 },
2689
+ "workersPosition": {
2690
+ "type": "array",
2691
+ "minItems": 1,
2692
+ "items": {
2693
+ "type": "object",
2694
+ "required": ["worker", "itemId", "position"],
2695
+ "additionalProperties": false,
2696
+ "properties": {
2697
+ "worker": { "type": "string", "minLength": 1 },
2698
+ "itemId": { "type": "string" },
2699
+ "position": { "type": "string", "minLength": 1 }
2700
+ }
2701
+ }
2702
+ },
2703
+ "evidence": { "type": "string", "minLength": 1 }
2704
+ }
2705
+ },
2706
+
2707
+ "PrimaryEvidenceRow": {
2708
+ "type": "object",
2709
+ "required": ["id", "ticketId", "evidence", "sourceItems", "source"],
2710
+ "additionalProperties": false,
2711
+ "properties": {
2712
+ "id": { "type": "string", "pattern": "^E-\\d{3,}$" },
2713
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2714
+ "evidence": { "type": "string", "minLength": 1 },
2715
+ "sourceItems": {
2716
+ "type": "array",
2717
+ "minItems": 1,
2718
+ "items": { "$ref": "#/$defs/SourceItem" }
2719
+ },
2720
+ "source": { "type": "string", "minLength": 1 }
2721
+ }
2722
+ },
2723
+
2724
+ "SecondaryEvidenceRow": {
2725
+ "type": "object",
2726
+ "required": ["id", "ticketId", "hypothesis", "confidence"],
2727
+ "additionalProperties": false,
2728
+ "properties": {
2729
+ "id": { "type": "string", "pattern": "^S-\\d{3,}$" },
2730
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2731
+ "hypothesis": { "type": "string", "minLength": 1 },
2732
+ "confidence": { "type": "string", "minLength": 1 }
2733
+ }
2734
+ },
2735
+
2736
+ "RiskRow": {
2737
+ "type": "object",
2738
+ "required": ["id", "ticketId", "item", "risk", "owner"],
2739
+ "additionalProperties": false,
2740
+ "properties": {
2741
+ "id": { "type": "string", "pattern": "^R-\\d{3,}$" },
2742
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2743
+ "item": { "type": "string", "minLength": 1 },
2744
+ "risk": { "type": "string", "minLength": 1 },
2745
+ "owner": { "type": "string", "minLength": 1 },
2746
+ "source": { "type": "string" }
2747
+ }
2748
+ },
2749
+
2750
+ "OptionCandidate": {
2751
+ "type": "object",
2752
+ "required": ["name", "fileStructure", "interfaces", "blastRadius"],
2753
+ "additionalProperties": false,
2754
+ "properties": {
2755
+ "name": { "type": "string", "minLength": 1 },
2756
+ "fileStructure": {
2757
+ "type": "array",
2758
+ "items": {
2759
+ "type": "object",
2760
+ "required": ["id", "ticketId", "action", "path", "summary"],
2761
+ "additionalProperties": false,
2762
+ "properties": {
2763
+ "id": { "type": "string", "pattern": "^OF-\\d{3,}$" },
2764
+ "ticketId": { "$ref": "#/$defs/TicketId" },
2765
+ "action": { "enum": ["Create", "Modify", "Delete"] },
2766
+ "path": { "type": "string", "minLength": 1 },
2767
+ "summary": { "type": "string", "minLength": 1, "maxLength": 120 },
2768
+ "details": { "type": "string", "minLength": 1 }
2769
+ }
2770
+ }
2771
+ },
2772
+ "interfaces": { "type": "string" },
2773
+ "blastRadius": { "type": "string" }
2774
+ }
2775
+ },
2776
+
2777
+ "TradeoffRow": {
2778
+ "type": "object",
2779
+ "required": ["option", "complexity", "risk", "reversibility", "testCoverageCost", "rolloutCost"],
2780
+ "additionalProperties": false,
2781
+ "properties": {
2782
+ "option": { "type": "string", "minLength": 1 },
2783
+ "complexity": { "type": "string", "minLength": 1 },
2784
+ "risk": { "type": "string", "minLength": 1 },
2785
+ "reversibility": { "type": "string", "minLength": 1 },
2786
+ "testCoverageCost": { "type": "string", "minLength": 1 },
2787
+ "rolloutCost": { "type": "string", "minLength": 1 }
2788
+ }
2789
+ },
2790
+
2791
+ "RecommendedOption": {
2792
+ "type": "object",
2793
+ "required": ["name", "coreReason", "rationale", "rejectedSummary", "testSeams"],
2794
+ "additionalProperties": false,
2795
+ "properties": {
2796
+ "name": { "type": "string", "minLength": 1 },
2797
+ "coreReason": { "type": "string", "minLength": 1 },
2798
+ "rationale": { "type": "string", "minLength": 1 },
2799
+ "rejectedSummary": { "type": "string", "minLength": 1 },
2800
+ "testSeams": {
2801
+ "type": "array",
2802
+ "description": "Boundaries a test injects and replaces. An empty array is a deliberate declaration that no seam is needed (the plan body must justify it).",
2803
+ "items": {
2804
+ "type": "object",
2805
+ "required": ["boundary", "injectedAs", "replacedInTest"],
2806
+ "additionalProperties": false,
2807
+ "properties": {
2808
+ "boundary": { "type": "string", "minLength": 1 },
2809
+ "injectedAs": { "type": "string", "minLength": 1 },
2810
+ "replacedInTest": { "type": "string", "minLength": 1 }
2811
+ }
2812
+ }
2813
+ }
2814
+ }
2815
+ },
2816
+
2817
+ "VariationPointAnalysis": {
2818
+ "type": "object",
2819
+ "required": ["hasMultipleImplementations", "noVariationRationale", "points"],
2820
+ "additionalProperties": false,
2821
+ "properties": {
2822
+ "hasMultipleImplementations": { "type": "boolean" },
2823
+ "noVariationRationale": {
2824
+ "type": "string",
2825
+ "description": "Why no variation point exists when hasMultipleImplementations is false. Empty string when it is true."
2826
+ },
2827
+ "points": {
2828
+ "type": "array",
2829
+ "items": { "$ref": "#/$defs/VariationPoint" }
2830
+ }
2831
+ }
2832
+ },
2833
+
2834
+ "VariationPoint": {
2835
+ "type": "object",
2836
+ "required": ["behavior", "implementations", "evidence", "extractionDecision"],
2837
+ "additionalProperties": false,
2838
+ "properties": {
2839
+ "behavior": { "type": "string", "minLength": 1 },
2840
+ "implementations": {
2841
+ "type": "array",
2842
+ "minItems": 2,
2843
+ "items": { "type": "string", "minLength": 1 }
2844
+ },
2845
+ "evidence": { "type": "string", "minLength": 1 },
2846
+ "extractionDecision": {
2847
+ "type": "object",
2848
+ "required": ["extract", "interfaceKind", "coveredBy", "rationale"],
2849
+ "additionalProperties": false,
2850
+ "properties": {
2851
+ "extract": { "type": "boolean" },
2852
+ "interfaceKind": { "type": "string" },
2853
+ "coveredBy": { "type": "string" },
2854
+ "rationale": { "type": "string", "minLength": 1 }
2855
+ }
2856
+ }
2857
+ }
2858
+ },
2859
+
2860
+ "StageMapRow": {
2861
+ "type": "object",
2862
+ "required": ["stage", "title", "dependsOn", "stepCount", "exitContractSummary"],
2863
+ "additionalProperties": false,
2864
+ "properties": {
2865
+ "stage": { "type": "integer", "minimum": 1 },
2866
+ "title": { "type": "string", "minLength": 1 },
2867
+ "dependsOn": {
2868
+ "type": "string",
2869
+ "minLength": 1,
2870
+ "description": "Literal Stage Map depends-on cell: `(none)` or a comma-separated stage number list."
2871
+ },
2872
+ "stepCount": { "type": "integer", "minimum": 0, "maximum": 6 },
2873
+ "exitContractSummary": { "type": "string", "minLength": 1 }
2874
+ }
2875
+ },
2876
+
2877
+ "DesignPreparation": {
2878
+ "type": "object",
2879
+ "required": ["mode", "reason", "items"],
2880
+ "additionalProperties": false,
2881
+ "properties": {
2882
+ "mode": { "enum": ["assessed", "no-design-inputs"] },
2883
+ "reason": { "type": "string", "minLength": 1 },
2884
+ "items": {
2885
+ "type": "array",
2886
+ "items": { "$ref": "#/$defs/DesignPrepItem" }
2887
+ }
2888
+ },
2889
+ "allOf": [
2890
+ {
2891
+ "if": {
2892
+ "properties": { "mode": { "const": "no-design-inputs" } }
2893
+ },
2894
+ "then": { "properties": { "items": { "maxItems": 0 } } }
2895
+ }
2896
+ ]
2897
+ },
2898
+
2899
+ "DesignPrepKnownFact": {
2900
+ "type": "object",
2901
+ "required": ["statement", "evidence"],
2902
+ "additionalProperties": false,
2903
+ "properties": {
2904
+ "statement": { "type": "string", "minLength": 1 },
2905
+ "evidence": { "type": "string", "minLength": 1 }
2906
+ }
2907
+ },
2908
+
2909
+ "DesignPrepProposal": {
2910
+ "type": "object",
2911
+ "required": ["summary", "details", "assumptions", "evidence", "confidence"],
2912
+ "additionalProperties": false,
2913
+ "properties": {
2914
+ "summary": { "type": "string", "minLength": 1 },
2915
+ "details": {
2916
+ "type": "array",
2917
+ "items": { "type": "string", "minLength": 1 }
2918
+ },
2919
+ "assumptions": {
2920
+ "type": "array",
2921
+ "items": { "type": "string", "minLength": 1 }
2922
+ },
2923
+ "evidence": {
2924
+ "type": "array",
2925
+ "items": { "type": "string", "minLength": 1 }
2926
+ },
2927
+ "confidence": { "enum": ["low", "medium", "high"] }
2928
+ }
2929
+ },
2930
+
2931
+ "DesignPrepHumanConfirmation": {
2932
+ "type": "object",
2933
+ "required": ["required", "reason", "suggestedAction"],
2934
+ "additionalProperties": false,
2935
+ "properties": {
2936
+ "required": { "type": "boolean" },
2937
+ "reason": { "type": "string", "minLength": 1 },
2938
+ "suggestedAction": { "type": "string", "minLength": 1 }
2939
+ }
2940
+ },
2941
+
2942
+ "DesignPrepReviewPoint": {
2943
+ "type": "object",
2944
+ "required": ["phase"],
2945
+ "additionalProperties": false,
2946
+ "properties": {
2947
+ "phase": { "enum": ["implementation", "final-verification"] },
2948
+ "stage": { "type": "integer", "minimum": 1 }
2949
+ },
2950
+ "allOf": [
2951
+ {
2952
+ "if": { "properties": { "phase": { "const": "implementation" } } },
2953
+ "then": { "required": ["stage"] }
2954
+ }
2955
+ ]
2956
+ },
2957
+
2958
+ "DesignPrepItem": {
2959
+ "type": "object",
2960
+ "required": [
2961
+ "id",
2962
+ "kind",
2963
+ "title",
2964
+ "stageRefs",
2965
+ "status",
2966
+ "need",
2967
+ "knownFacts",
2968
+ "openQuestions",
2969
+ "aiProposal",
2970
+ "humanConfirmation"
2971
+ ],
2972
+ "additionalProperties": false,
2973
+ "properties": {
2974
+ "id": { "type": "string", "pattern": "^PREP-[0-9]{3}$" },
2975
+ "kind": {
2976
+ "enum": [
2977
+ "domain-contract",
2978
+ "persistence-schema",
2979
+ "external-interface",
2980
+ "transaction-consistency",
2981
+ "transformation-mapping",
2982
+ "lifecycle-state-machine",
2983
+ "rollout-observability",
2984
+ "manual-user-test",
2985
+ "other"
2986
+ ]
2987
+ },
2988
+ "title": { "type": "string", "minLength": 1 },
2989
+ "stageRefs": {
2990
+ "type": "array",
2991
+ "minItems": 1,
2992
+ "uniqueItems": true,
2993
+ "items": { "type": "integer", "minimum": 1 }
2994
+ },
2995
+ "status": {
2996
+ "enum": ["ready", "provisional", "blocked", "not-applicable"]
2997
+ },
2998
+ "need": { "type": "string", "minLength": 1 },
2999
+ "knownFacts": {
3000
+ "type": "array",
3001
+ "items": { "$ref": "#/$defs/DesignPrepKnownFact" }
3002
+ },
3003
+ "openQuestions": {
3004
+ "type": "array",
3005
+ "items": { "type": "string", "minLength": 1 }
3006
+ },
3007
+ "aiProposal": { "$ref": "#/$defs/DesignPrepProposal" },
3008
+ "humanConfirmation": {
3009
+ "$ref": "#/$defs/DesignPrepHumanConfirmation"
3010
+ },
3011
+ "workingAssumption": { "type": "string", "minLength": 1 },
3012
+ "guardrails": {
3013
+ "type": "array",
3014
+ "minItems": 1,
3015
+ "items": { "type": "string", "minLength": 1 }
3016
+ },
3017
+ "reviewAt": { "$ref": "#/$defs/DesignPrepReviewPoint" },
3018
+ "ifStillOpen": { "enum": ["block", "follow-up"] },
3019
+ "requestPath": {
3020
+ "type": "string",
3021
+ "pattern": "^design-prep-requests/design-prep-request-[0-9]+-PREP-[0-9]{3}\\.md$"
3022
+ },
3023
+ "blockReason": { "type": "string", "minLength": 1 },
3024
+ "requiredDecision": { "type": "string", "minLength": 1 },
3025
+ "notApplicableReason": { "type": "string", "minLength": 1 },
3026
+ "replanTriggerFields": {
3027
+ "type": "array",
3028
+ "uniqueItems": true,
3029
+ "items": {
3030
+ "type": "string",
3031
+ "pattern": "^[^.\\s]+(\\.[^.\\s]+)*$"
3032
+ }
3033
+ }
3034
+ },
3035
+ "oneOf": [
3036
+ {
3037
+ "properties": { "status": { "const": "ready" } },
3038
+ "allOf": [
3039
+ { "not": { "required": ["workingAssumption"] } },
3040
+ { "not": { "required": ["blockReason"] } },
3041
+ { "not": { "required": ["requiredDecision"] } },
3042
+ { "not": { "required": ["notApplicableReason"] } },
3043
+ { "not": { "required": ["requestPath"] } }
3044
+ ]
3045
+ },
3046
+ {
3047
+ "properties": { "status": { "const": "provisional" } },
3048
+ "required": [
3049
+ "workingAssumption",
3050
+ "guardrails",
3051
+ "reviewAt",
3052
+ "ifStillOpen",
3053
+ "requestPath"
3054
+ ],
3055
+ "allOf": [
3056
+ { "not": { "required": ["blockReason"] } },
3057
+ { "not": { "required": ["requiredDecision"] } },
3058
+ { "not": { "required": ["notApplicableReason"] } }
3059
+ ]
3060
+ },
3061
+ {
3062
+ "properties": {
3063
+ "status": { "const": "blocked" },
3064
+ "humanConfirmation": {
3065
+ "properties": { "required": { "const": true } }
3066
+ }
3067
+ },
3068
+ "required": [
3069
+ "blockReason",
3070
+ "requiredDecision",
3071
+ "reviewAt",
3072
+ "ifStillOpen",
3073
+ "requestPath"
3074
+ ],
3075
+ "allOf": [
3076
+ { "not": { "required": ["workingAssumption"] } },
3077
+ { "not": { "required": ["guardrails"] } },
3078
+ { "not": { "required": ["notApplicableReason"] } }
3079
+ ]
3080
+ },
3081
+ {
3082
+ "properties": { "status": { "const": "not-applicable" } },
3083
+ "required": ["notApplicableReason"],
3084
+ "allOf": [
3085
+ { "not": { "required": ["workingAssumption"] } },
3086
+ { "not": { "required": ["guardrails"] } },
3087
+ { "not": { "required": ["reviewAt"] } },
3088
+ { "not": { "required": ["ifStillOpen"] } },
3089
+ { "not": { "required": ["blockReason"] } },
3090
+ { "not": { "required": ["requiredDecision"] } },
3091
+ { "not": { "required": ["requestPath"] } }
3092
+ ]
3093
+ }
3094
+ ]
3095
+ },
3096
+
3097
+ "TriggerEvidence": {
3098
+ "type": "object",
3099
+ "required": ["step", "field", "match"],
3100
+ "additionalProperties": false,
3101
+ "properties": {
3102
+ "step": {
3103
+ "type": ["integer", "null"],
3104
+ "minimum": 1
3105
+ },
3106
+ "field": { "enum": ["files", "action"] },
3107
+ "match": { "type": "string", "minLength": 1 }
3108
+ }
3109
+ },
3110
+
3111
+ "InlineDesignContract": {
3112
+ "type": "object",
3113
+ "required": ["summary", "details", "evidence"],
3114
+ "additionalProperties": false,
3115
+ "properties": {
3116
+ "summary": { "type": "string", "minLength": 1 },
3117
+ "details": {
3118
+ "type": "array",
3119
+ "minItems": 1,
3120
+ "items": { "type": "string", "minLength": 1 }
3121
+ },
3122
+ "evidence": {
3123
+ "type": "array",
3124
+ "minItems": 1,
3125
+ "items": { "type": "string", "minLength": 1 }
3126
+ }
3127
+ }
3128
+ },
3129
+
3130
+ "EndStateCoverageRow": {
3131
+ "type": "object",
3132
+ "additionalProperties": false,
3133
+ "required": ["id", "disposition"],
3134
+ "properties": {
3135
+ "id": {
3136
+ "type": "string",
3137
+ "pattern": "^(EB|PB|EO)-\\d{3}$",
3138
+ "description": "The brief end-state id this row accounts for."
3139
+ },
3140
+ "disposition": {
3141
+ "type": "string",
3142
+ "enum": ["addressed", "deferred", "not-applicable", "blocked"]
3143
+ },
3144
+ "coveredBy": {
3145
+ "type": "string",
3146
+ "description": "Anchor in THIS phase's deliverable that accounts for the id — a routing decision, a root-cause candidate, an R-NNN row, or a C-NNN clarification."
3147
+ },
3148
+ "evidence": {
3149
+ "type": "array",
3150
+ "items": { "type": "string" },
3151
+ "description": "path:line references backing the mapping."
3152
+ },
3153
+ "rationale": {
3154
+ "type": "string",
3155
+ "description": "Required when disposition is not `addressed`: why this phase does not account for the id."
3156
+ }
3157
+ }
3158
+ },
3159
+
3160
+ "DesignSurfaceCoverage": {
3161
+ "type": "object",
3162
+ "required": ["kind", "triggerEvidence", "disposition"],
3163
+ "additionalProperties": false,
3164
+ "properties": {
3165
+ "kind": {
3166
+ "enum": [
3167
+ "domain-contract",
3168
+ "persistence-schema",
3169
+ "external-interface",
3170
+ "transaction-consistency",
3171
+ "transformation-mapping",
3172
+ "lifecycle-state-machine",
3173
+ "rollout-observability",
3174
+ "manual-user-test",
3175
+ "other"
3176
+ ]
3177
+ },
3178
+ "triggerEvidence": {
3179
+ "type": "array",
3180
+ "minItems": 1,
3181
+ "items": { "$ref": "#/$defs/TriggerEvidence" }
3182
+ },
3183
+ "disposition": {
3184
+ "enum": ["inline-contract", "prep-item", "not-applicable"]
3185
+ },
3186
+ "inlineContract": { "$ref": "#/$defs/InlineDesignContract" },
3187
+ "prepItemId": {
3188
+ "type": "string",
3189
+ "pattern": "^PREP-[0-9]{3}$"
3190
+ },
3191
+ "prepItemIds": {
3192
+ "type": "array",
3193
+ "minItems": 1,
3194
+ "uniqueItems": true,
3195
+ "items": { "type": "string", "pattern": "^PREP-[0-9]{3}$" }
3196
+ },
3197
+ "rationale": { "type": "string", "minLength": 1 }
3198
+ },
3199
+ "oneOf": [
3200
+ {
3201
+ "properties": { "disposition": { "const": "inline-contract" } },
3202
+ "required": ["inlineContract"],
3203
+ "allOf": [
3204
+ { "not": { "required": ["prepItemId"] } },
3205
+ { "not": { "required": ["prepItemIds"] } },
3206
+ { "not": { "required": ["rationale"] } }
3207
+ ]
3208
+ },
3209
+ {
3210
+ "properties": { "disposition": { "const": "prep-item" } },
3211
+ "allOf": [
3212
+ { "not": { "required": ["inlineContract"] } },
3213
+ { "not": { "required": ["rationale"] } }
3214
+ ],
3215
+ "oneOf": [
3216
+ {
3217
+ "required": ["prepItemId"],
3218
+ "not": { "required": ["prepItemIds"] }
3219
+ },
3220
+ {
3221
+ "required": ["prepItemIds"],
3222
+ "not": { "required": ["prepItemId"] }
3223
+ }
3224
+ ]
3225
+ },
3226
+ {
3227
+ "properties": { "disposition": { "const": "not-applicable" } },
3228
+ "required": ["rationale"],
3229
+ "allOf": [
3230
+ { "not": { "required": ["inlineContract"] } },
3231
+ { "not": { "required": ["prepItemId"] } },
3232
+ { "not": { "required": ["prepItemIds"] } }
3233
+ ]
3234
+ }
3235
+ ]
3236
+ },
3237
+
3238
+ "ImplementationPlanStage": {
3239
+ "type": "object",
3240
+ "required": [
3241
+ "stage",
3242
+ "title",
3243
+ "sliceValue",
3244
+ "acceptance",
3245
+ "carryIn",
3246
+ "stepwiseExecution",
3247
+ "exitContract",
3248
+ "stageValidation"
3249
+ ],
3250
+ "additionalProperties": false,
3251
+ "oneOf": [
3252
+ {
3253
+ "required": ["conformanceTests"],
3254
+ "not": { "required": ["conformanceExemption"] }
3255
+ },
3256
+ {
3257
+ "required": ["conformanceExemption"],
3258
+ "not": { "required": ["conformanceTests"] }
3259
+ }
3260
+ ],
3261
+ "if": { "not": { "required": ["tddExemption"] } },
3262
+ "then": {
3263
+ "required": ["testCaseSuccess", "testCaseBoundary", "testCaseFailure"]
3264
+ },
3265
+ "properties": {
3266
+ "stage": { "type": "integer", "minimum": 1 },
3267
+ "title": { "type": "string", "minLength": 1 },
3268
+ "sliceValue": { "type": "string", "minLength": 1 },
3269
+ "acceptance": { "type": "string", "minLength": 1 },
3270
+ "testCaseSuccess": {
3271
+ "type": "string",
3272
+ "minLength": 1,
3273
+ "description": "Happy-path test case proving the slice works for valid input. Text after the `Test case (success):` prefix."
3274
+ },
3275
+ "testCaseBoundary": {
3276
+ "type": "string",
3277
+ "minLength": 1,
3278
+ "description": "Boundary/edge test case (empty, min/max, missing). Text after the `Test case (boundary):` prefix. Use `N/A — <reason>` only when no boundary genuinely exists."
3279
+ },
3280
+ "testCaseFailure": {
3281
+ "type": "string",
3282
+ "minLength": 1,
3283
+ "description": "Failure/negative test case (invalid input, error path). Text after the `Test case (failure):` prefix."
3284
+ },
3285
+ "conformanceTests": {
3286
+ "type": "string",
3287
+ "minLength": 1,
3288
+ "description": "Text after the `Conformance tests: stage-N — ...` prefix."
3289
+ },
3290
+ "conformanceExemption": {
3291
+ "type": "string",
3292
+ "minLength": 1,
3293
+ "description": "Text after the `Conformance exemption:` prefix."
3294
+ },
3295
+ "tddExemption": {
3296
+ "type": "string",
3297
+ "description": "Optional text after the `TDD exemption:` prefix."
3298
+ },
3299
+ "carryIn": { "type": "string", "minLength": 1 },
3300
+ "stepwiseExecution": {
3301
+ "type": "array",
3302
+ "minItems": 1,
3303
+ "maxItems": 6,
3304
+ "items": { "$ref": "#/$defs/StageStepRow" }
3305
+ },
3306
+ "designSurfaceCoverage": {
3307
+ "type": "array",
3308
+ "items": { "$ref": "#/$defs/DesignSurfaceCoverage" }
3309
+ },
3310
+ "exitContract": { "type": "string", "minLength": 1 },
3311
+ "stageValidation": { "type": "string", "minLength": 1 }
3312
+ }
3313
+ },
3314
+
3315
+ "StageStepRow": {
3316
+ "type": "object",
3317
+ "required": ["step", "action", "files", "command", "expected"],
3318
+ "additionalProperties": false,
3319
+ "properties": {
3320
+ "step": { "type": "integer", "minimum": 1 },
3321
+ "action": { "type": "string", "minLength": 1 },
3322
+ "files": { "type": "string", "minLength": 1 },
3323
+ "command": { "type": "string", "minLength": 1 },
3324
+ "expected": { "type": "string", "minLength": 1 }
3325
+ }
3326
+ },
3327
+
3328
+ "StepRow": {
3329
+ "type": "object",
3330
+ "required": ["step", "ticketId", "action", "files", "commandOrTest", "expectedOutcome"],
3331
+ "additionalProperties": false,
3332
+ "properties": {
3333
+ "step": { "type": "integer", "minimum": 1 },
3334
+ "ticketId": { "$ref": "#/$defs/TicketId" },
3335
+ "action": { "type": "string", "minLength": 1 },
3336
+ "files": { "type": "string", "minLength": 1 },
3337
+ "commandOrTest": { "type": "string", "minLength": 1 },
3338
+ "expectedOutcome": { "type": "string", "minLength": 1 }
3339
+ }
3340
+ },
3341
+
3342
+ "StageSidecarEvidence": {
3343
+ "type": "object",
3344
+ "required": ["stageNumber", "stageTitle", "carryJson", "consumerRows"],
3345
+ "additionalProperties": false,
3346
+ "properties": {
3347
+ "stageNumber": { "type": "integer", "minimum": 1 },
3348
+ "stageTitle": { "type": "string", "minLength": 1 },
3349
+ "carryJson": { "type": "string", "minLength": 1 },
3350
+ "consumerRows": {
3351
+ "type": "array",
3352
+ "minItems": 1,
3353
+ "items": { "type": "string", "minLength": 1 }
3354
+ }
3355
+ }
3356
+ },
3357
+
3358
+ "DependencyRow": {
3359
+ "type": "object",
3360
+ "required": ["id", "kind", "item", "impact", "mitigation"],
3361
+ "additionalProperties": false,
3362
+ "properties": {
3363
+ "id": { "type": "string", "pattern": "^DM-\\d{3,}$" },
3364
+ "kind": {
3365
+ "enum": ["order", "backfill", "flag-precondition", "repo-sequencing", "cross-project", "other"]
3366
+ },
3367
+ "item": { "type": "string", "minLength": 1 },
3368
+ "impact": { "type": "string", "minLength": 1 },
3369
+ "mitigation": { "type": "string", "minLength": 1 }
3370
+ }
3371
+ },
3372
+
3373
+ "CrossProjectDependency": {
3374
+ "type": "object",
3375
+ "required": ["id", "direction", "project", "requiredWork", "verificationSignal", "linkedWork", "howToStart"],
3376
+ "additionalProperties": false,
3377
+ "properties": {
3378
+ "id": { "type": "string", "pattern": "^XP-\\d{3,}$" },
3379
+ "direction": { "enum": ["upstream-precondition", "downstream-carry"] },
3380
+ "project": { "type": "string", "minLength": 1 },
3381
+ "requiredWork": { "type": "string", "minLength": 1 },
3382
+ "verificationSignal": { "type": "string", "minLength": 1 },
3383
+ "linkedWork": { "type": "string", "minLength": 1 },
3384
+ "howToStart": { "type": "string", "minLength": 1 }
3385
+ }
3386
+ },
3387
+
3388
+ "DecisionDraft": {
3389
+ "type": "object",
3390
+ "required": ["number", "slug", "status", "context", "decision", "consequences", "alternativesConsidered"],
3391
+ "additionalProperties": false,
3392
+ "properties": {
3393
+ "number": { "type": "string", "pattern": "^\\d{4,}$" },
3394
+ "slug": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" },
3395
+ "status": { "enum": ["Proposed"] },
3396
+ "context": { "type": "string", "minLength": 1 },
3397
+ "decision": { "type": "string", "minLength": 1 },
3398
+ "consequences": { "type": "string", "minLength": 1 },
3399
+ "alternativesConsidered": { "type": "string", "minLength": 1 }
3400
+ }
3401
+ },
3402
+
3403
+ "SkippedAdrCandidate": {
3404
+ "type": "object",
3405
+ "required": ["topic", "reason"],
3406
+ "additionalProperties": false,
3407
+ "properties": {
3408
+ "topic": { "type": "string", "minLength": 1 },
3409
+ "reason": { "type": "string", "minLength": 1 }
3410
+ }
3411
+ },
3412
+
3413
+ "ValidationCheckRow": {
3414
+ "type": "object",
3415
+ "required": ["id", "phase", "ticketId", "check", "commandOrObservation", "expectedOutcome"],
3416
+ "additionalProperties": false,
3417
+ "properties": {
3418
+ "id": { "type": "string", "pattern": "^VC-\\d{3,}$" },
3419
+ "phase": { "enum": ["pre", "mid", "post"] },
3420
+ "ticketId": { "$ref": "#/$defs/TicketId" },
3421
+ "check": { "type": "string", "minLength": 1 },
3422
+ "commandOrObservation": { "type": "string", "minLength": 1 },
3423
+ "expectedOutcome": { "type": "string", "minLength": 1 }
3424
+ }
3425
+ },
3426
+
3427
+ "RollbackRow": {
3428
+ "type": "object",
3429
+ "required": ["id", "step", "action", "triggerSignal", "verificationMethod"],
3430
+ "additionalProperties": false,
3431
+ "properties": {
3432
+ "id": { "type": "string", "pattern": "^RB-\\d{3,}$" },
3433
+ "step": { "type": "integer", "minimum": 1 },
3434
+ "action": { "type": "string", "minLength": 1 },
3435
+ "triggerSignal": { "type": "string", "minLength": 1 },
3436
+ "verificationMethod": { "type": "string", "minLength": 1 }
3437
+ }
3438
+ },
3439
+
3440
+ "SelfFixGroup": {
3441
+ "type": "object",
3442
+ "required": ["round", "causeSummary", "itemIds"],
3443
+ "additionalProperties": false,
3444
+ "properties": {
3445
+ "round": { "type": "integer", "minimum": 1 },
3446
+ "causeSummary": { "type": "string", "minLength": 1 },
3447
+ "itemIds": {
3448
+ "type": "array",
3449
+ "minItems": 1,
3450
+ "uniqueItems": true,
3451
+ "items": { "type": "string", "minLength": 1 }
3452
+ },
3453
+ "rewrittenPaths": {
3454
+ "type": "array",
3455
+ "description": "data.json paths this round actually rewrote for this cause group. A self-fix round is contractually a targeted correction, not a full draft regeneration; recording the reach is what makes that claim checkable later.",
3456
+ "uniqueItems": true,
3457
+ "items": { "type": "string", "minLength": 1 }
3458
+ },
3459
+ "outsideScopePaths": {
3460
+ "type": "array",
3461
+ "description": "The subset of rewrittenPaths that lies outside the sections this group's itemIds point at. Carrying a correction to its contradictions legitimately reaches further than the flagged item, so this is a measurement, not a violation.",
3462
+ "uniqueItems": true,
3463
+ "items": { "type": "string", "minLength": 1 }
3464
+ }
3465
+ }
3466
+ },
3467
+
3468
+ "SupersessionEntry": {
3469
+ "type": "object",
3470
+ "required": ["clarificationId", "disposition"],
3471
+ "additionalProperties": false,
3472
+ "properties": {
3473
+ "clarificationId": { "type": "string", "pattern": "^C-\\d+$" },
3474
+ "disposition": { "enum": ["superseded", "no-dependent-statement"] },
3475
+ "revisedSections": {
3476
+ "type": "array",
3477
+ "items": { "type": "string", "minLength": 1 }
3478
+ },
3479
+ "supersededStatement": { "type": "string", "minLength": 1 },
3480
+ "replacedWith": { "type": "string", "minLength": 1 },
3481
+ "rationale": { "type": "string", "minLength": 1 }
3482
+ },
3483
+ "allOf": [
3484
+ {
3485
+ "if": {
3486
+ "properties": { "disposition": { "const": "superseded" } },
3487
+ "required": ["disposition"]
3488
+ },
3489
+ "then": {
3490
+ "required": ["revisedSections", "supersededStatement", "replacedWith"],
3491
+ "properties": { "revisedSections": { "minItems": 1 } }
3492
+ }
3493
+ },
3494
+ {
3495
+ "if": {
3496
+ "properties": {
3497
+ "disposition": { "const": "no-dependent-statement" }
3498
+ },
3499
+ "required": ["disposition"]
3500
+ },
3501
+ "then": { "required": ["rationale"] }
3502
+ }
3503
+ ]
3504
+ },
3505
+
3506
+ "PlanBodyVerification": {
3507
+ "type": "object",
3508
+ "required": ["roundCount", "gateResult", "planItems", "dissentLog"],
3509
+ "additionalProperties": false,
3510
+ "properties": {
3511
+ "roundCount": { "type": "integer", "minimum": 0 },
3512
+ "gateResult": {
3513
+ "enum": [
3514
+ "passed",
3515
+ "passed-with-dissent",
3516
+ "blocked-by-disagreement",
3517
+ "aborted-non-result"
3518
+ ]
3519
+ },
3520
+ "gateBlockedBy": {
3521
+ "type": "array",
3522
+ "uniqueItems": true,
3523
+ "items": {
3524
+ "enum": ["majority-disagree", "coverage-gap", "non-result"]
3525
+ }
3526
+ },
3527
+ "participatingAnalysers": {
3528
+ "type": "object",
3529
+ "description": "How many rostered analysers actually cast a non-error vote in this round. The gate arithmetic is unchanged; this records the base it ran on, because a majority over two votes is a different claim than a majority over three.",
3530
+ "properties": {
3531
+ "rostered": { "type": "integer", "minimum": 0 },
3532
+ "voting": { "type": "integer", "minimum": 0 }
3533
+ },
3534
+ "required": ["rostered", "voting"],
3535
+ "additionalProperties": false
3536
+ },
3537
+ "selfFixRoundsApplied": { "type": "integer", "minimum": 0 },
3538
+ "selfFixGroups": {
3539
+ "type": "array",
3540
+ "description": "How each self-fix round's targets were grouped by common cause before being handed to report-writer. Several blocked items are usually one defect's derivatives; instructing them as a flat list makes each patch leave its siblings' contradictions standing, so the same family reappears next round.",
3541
+ "items": { "$ref": "#/$defs/SelfFixGroup" }
3542
+ },
3543
+ "selfFixStopReason": {
3544
+ "enum": [
3545
+ "not-attempted",
3546
+ "all-resolved",
3547
+ "no-progress",
3548
+ "max-rounds-reached",
3549
+ "cause-group-recurrence"
3550
+ ]
3551
+ },
3552
+ "planItems": {
3553
+ "type": "array",
3554
+ "items": {
3555
+ "type": "object",
3556
+ "required": ["id", "subject", "verdicts"],
3557
+ "additionalProperties": false,
3558
+ "properties": {
3559
+ "id": { "type": "string", "minLength": 1 },
3560
+ "subject": { "type": "string", "minLength": 1 },
3561
+ "sourceSection": { "type": "string" },
3562
+ "carriedForwardFromSeq": { "type": "string" },
3563
+ "clarificationId": {
3564
+ "anyOf": [
3565
+ { "type": "null" },
3566
+ { "type": "string", "pattern": "^C-\\d{3,}$" }
3567
+ ]
3568
+ },
3569
+ "selfFixNote": { "type": "string" },
3570
+ "verdicts": {
3571
+ "type": "array",
3572
+ "items": {
3573
+ "type": "object",
3574
+ "required": ["worker", "verdict"],
3575
+ "additionalProperties": false,
3576
+ "properties": {
3577
+ "worker": { "type": "string", "minLength": 1 },
3578
+ "verdict": {
3579
+ "enum": ["AGREE", "DISAGREE", "SUPPLEMENT", "verification-error"]
3580
+ },
3581
+ "breakageKind": {
3582
+ "description": "Set only on DISAGREE. `null` and absent are equivalent, matching the sibling `votes.<worker>.disagreeBasis` contract in prompts/lead/convergence.md.",
3583
+ "type": ["string", "null"]
3584
+ },
3585
+ "fixability": {
3586
+ "description": "Set only on DISAGREE. `null` and absent are equivalent.",
3587
+ "enum": ["planner-fixable", "needs-user-input", null]
3588
+ },
3589
+ "note": { "type": "string" }
3590
+ }
3591
+ }
3592
+ }
3593
+ }
3594
+ }
3595
+ },
3596
+ "dissentLog": {
3597
+ "type": "array",
3598
+ "items": {
3599
+ "type": "object",
3600
+ "required": ["planItem", "workerRole", "body"],
3601
+ "additionalProperties": false,
3602
+ "properties": {
3603
+ "planItem": { "type": "string", "minLength": 1 },
3604
+ "workerRole": { "type": "string", "minLength": 1 },
3605
+ "body": { "type": "string", "minLength": 1 }
3606
+ }
3607
+ }
3608
+ }
3609
+ }
3610
+ },
3611
+
3612
+ "ExecutedCommandRow": {
3613
+ "type": "object",
3614
+ "required": ["number", "command", "exitCode", "outputSummary"],
3615
+ "additionalProperties": false,
3616
+ "properties": {
3617
+ "number": { "type": "integer", "minimum": 1 },
3618
+ "command": { "type": "string", "minLength": 1 },
3619
+ "exitCode": { "type": "integer" },
3620
+ "outputSummary": { "type": "string" }
3621
+ }
3622
+ },
3623
+
3624
+ "CommitRow": {
3625
+ "type": "object",
3626
+ "required": ["shortSha", "fullSha", "subject", "files"],
3627
+ "additionalProperties": false,
3628
+ "properties": {
3629
+ "shortSha": { "type": "string", "minLength": 7 },
3630
+ "fullSha": { "type": "string", "minLength": 40 },
3631
+ "subject": { "type": "string", "minLength": 1 },
3632
+ "files": { "type": "string" }
3633
+ }
3634
+ },
3635
+
3636
+ "CommitWithStepRow": {
3637
+ "type": "object",
3638
+ "required": ["number", "shortSha", "fullSha", "planStep", "subject", "files"],
3639
+ "additionalProperties": false,
3640
+ "properties": {
3641
+ "number": { "type": "integer", "minimum": 1 },
3642
+ "shortSha": { "type": "string", "minLength": 7 },
3643
+ "fullSha": { "type": "string", "minLength": 40 },
3644
+ "planStep": { "type": "string", "minLength": 1 },
3645
+ "subject": { "type": "string", "minLength": 1 },
3646
+ "files": { "type": "string" }
3647
+ }
3648
+ },
3649
+
3650
+ "DiffFileRow": {
3651
+ "type": "object",
3652
+ "required": ["file", "action", "lines", "planStep"],
3653
+ "additionalProperties": false,
3654
+ "properties": {
3655
+ "file": { "type": "string", "minLength": 1 },
3656
+ "action": { "enum": ["created", "modified", "deleted"] },
3657
+ "lines": { "type": "string", "minLength": 1 },
3658
+ "planStep": { "type": "string", "minLength": 1 }
3659
+ }
3660
+ },
3661
+
3662
+ "OutOfPlanEditRow": {
3663
+ "type": "object",
3664
+ "required": ["id", "file", "rationale", "trigger"],
3665
+ "additionalProperties": false,
3666
+ "properties": {
3667
+ "id": { "type": "string", "pattern": "^OOP-\\d{3,}$" },
3668
+ "file": { "type": "string", "minLength": 1 },
3669
+ "rationale": { "type": "string", "minLength": 1 },
3670
+ "trigger": { "type": "string", "minLength": 1 }
3671
+ }
3672
+ },
3673
+
3674
+ "ValidationEvidenceRow": {
3675
+ "type": "object",
3676
+ "required": ["phase", "command", "exitCode", "outputTail"],
3677
+ "additionalProperties": false,
3678
+ "properties": {
3679
+ "phase": { "enum": ["pre", "mid", "post"] },
3680
+ "command": { "type": "string", "minLength": 1 },
3681
+ "exitCode": { "type": "integer" },
3682
+ "outputTail": { "type": "string" },
3683
+ "tddEvidence": { "type": "string" }
3684
+ }
3685
+ },
3686
+
3687
+ "VerifierResultBlock": {
3688
+ "type": "object",
3689
+ "required": ["verifier", "verdict", "readOnlyCommandLog", "independentValidationRerun"],
3690
+ "additionalProperties": false,
3691
+ "properties": {
3692
+ "verifier": { "type": "string", "minLength": 1 },
3693
+ "verdict": { "enum": ["PASS", "CONCERNS", "FAIL"] },
3694
+ "readOnlyCommandLog": { "type": "string" },
3695
+ "independentValidationRerun": { "type": "string" },
3696
+ "styleLintTypecheck": { "type": "string" },
3697
+ "declinedFixRecommendations": { "type": "string" },
3698
+ "discrepancy": { "type": "string" }
3699
+ }
3700
+ },
3701
+
3702
+ "RollbackVerificationRow": {
3703
+ "type": "object",
3704
+ "required": ["category", "rollbackCommand", "verification", "result"],
3705
+ "additionalProperties": false,
3706
+ "properties": {
3707
+ "category": {
3708
+ "enum": ["Pure code", "Feature-flag-gated", "Schema/config/stateful"]
3709
+ },
3710
+ "rollbackCommand": { "type": "string", "minLength": 1 },
3711
+ "verification": { "type": "string", "minLength": 1 },
3712
+ "result": {
3713
+ "enum": ["ok", "not-applicable", "advisory — human-run"]
3714
+ }
3715
+ }
3716
+ },
3717
+
3718
+ "AcceptanceBlockerRow": {
3719
+ "type": "object",
3720
+ "required": ["id", "severity", "statement", "evidence", "followUpPhase"],
3721
+ "additionalProperties": false,
3722
+ "properties": {
3723
+ "id": { "type": "string", "pattern": "^AB-\\d{3,}$" },
3724
+ "severity": { "enum": ["critical", "major", "minor"] },
3725
+ "statement": { "type": "string", "minLength": 1 },
3726
+ "evidence": { "type": "string", "minLength": 1 },
3727
+ "followUpPhase": { "type": "string", "minLength": 1 }
3728
+ }
3729
+ },
3730
+
3731
+ "ResidualRiskRow": {
3732
+ "type": "object",
3733
+ "required": ["id", "item", "owner", "escalationTrigger"],
3734
+ "additionalProperties": false,
3735
+ "properties": {
3736
+ "id": { "type": "string", "pattern": "^RR-\\d{3,}$" },
3737
+ "item": { "type": "string", "minLength": 1 },
3738
+ "owner": { "type": "string", "minLength": 1 },
3739
+ "escalationTrigger": { "type": "string", "minLength": 1 }
3740
+ }
3741
+ },
3742
+
3743
+ "RequirementCoverageRow": {
3744
+ "type": "object",
3745
+ "required": ["id", "requirement", "artifact", "status"],
3746
+ "additionalProperties": false,
3747
+ "properties": {
3748
+ "id": { "type": "string", "pattern": "^VE-\\d{3,}$" },
3749
+ "requirement": { "type": "string", "minLength": 1 },
3750
+ "artifact": { "type": "string", "minLength": 1 },
3751
+ "status": {
3752
+ "type": "string",
3753
+ "pattern": "^(covered|blocker AB-\\d{3,}|gap)$"
3754
+ }
3755
+ }
3756
+ },
3757
+
3758
+ "ImplementationRequirementCoverageRow": {
3759
+ "type": "object",
3760
+ "required": ["id", "source", "requirement", "coveredBy", "status"],
3761
+ "additionalProperties": false,
3762
+ "properties": {
3763
+ "id": { "type": "string", "pattern": "^R-\\d{3,}$" },
3764
+ "source": { "type": "string", "minLength": 1 },
3765
+ "requirement": { "type": "string", "minLength": 1 },
3766
+ "coveredBy": { "type": "string", "minLength": 1 },
3767
+ "status": {
3768
+ "type": "string",
3769
+ "pattern": "^(covered|gap|blocked C-\\d{3,}|documented-deviation)$"
3770
+ },
3771
+ "decisionRefs": {
3772
+ "type": "array",
3773
+ "minItems": 1,
3774
+ "uniqueItems": true,
3775
+ "items": { "type": "string", "minLength": 1 }
3776
+ },
3777
+ "approvalDisposition": {
3778
+ "type": "string",
3779
+ "pattern": "^(accepted|blocked C-\\d{3,})$"
3780
+ }
3781
+ },
3782
+ "allOf": [
3783
+ {
3784
+ "if": {
3785
+ "properties": { "status": { "const": "documented-deviation" } },
3786
+ "required": ["status"]
3787
+ },
3788
+ "then": { "required": ["decisionRefs", "approvalDisposition"] }
3789
+ }
3790
+ ]
3791
+ },
3792
+
3793
+ "ReadonlyCommandRow": {
3794
+ "type": "object",
3795
+ "required": ["number", "tier", "command", "status", "exitCode", "outputTail"],
3796
+ "additionalProperties": false,
3797
+ "properties": {
3798
+ "number": { "type": "integer", "minimum": 1 },
3799
+ "tier": { "enum": [1, 2, 3] },
3800
+ "command": { "type": "string", "minLength": 1 },
3801
+ "status": { "enum": ["executed", "rejected", "not-configured", "env-unavailable", "advisory"] },
3802
+ "exitCode": { "type": ["integer", "null"] },
3803
+ "statusReason": { "type": ["string", "null"] },
3804
+ "outputTail": { "type": "string" }
3805
+ },
3806
+ "allOf": [
3807
+ { "if": { "properties": { "status": { "const": "executed" } } },
3808
+ "then": { "properties": { "exitCode": { "type": "integer" } } } },
3809
+ { "if": { "properties": { "status": { "const": "rejected" } } },
3810
+ "then": { "required": ["statusReason"] } },
3811
+ { "if": { "properties": { "status": { "const": "env-unavailable" } } },
3812
+ "then": { "required": ["statusReason"] } },
3813
+ {
3814
+ "if": {
3815
+ "properties": { "status": { "const": "advisory" } },
3816
+ "required": ["status"]
3817
+ },
3818
+ "then": {
3819
+ "required": ["statusReason"],
3820
+ "properties": {
3821
+ "tier": { "const": 3 },
3822
+ "statusReason": {
3823
+ "type": "string",
3824
+ "minLength": 1,
3825
+ "pattern": ".*\\S.*"
3826
+ }
3827
+ }
3828
+ }
3829
+ }
3830
+ ]
3831
+ },
3832
+
3833
+ "ConditionalAcceptanceConditionRow": {
3834
+ "type": "object",
3835
+ "required": ["id", "condition", "evidenceRequired", "blocksReleaseHandoff"],
3836
+ "additionalProperties": false,
3837
+ "properties": {
3838
+ "id": { "type": "string", "pattern": "^CA-\\d{3,}$" },
3839
+ "condition": { "type": "string", "minLength": 1 },
3840
+ "evidenceRequired": { "type": "string", "minLength": 1 },
3841
+ "blocksReleaseHandoff": { "type": "boolean" }
3842
+ }
3843
+ },
3844
+
3845
+ "ClarificationRow": {
3846
+ "type": "object",
3847
+ "required": ["id", "ticketId", "kind", "statement", "expectedForm", "blocks", "status"],
3848
+ "additionalProperties": false,
3849
+ "properties": {
3850
+ "id": { "type": "string", "pattern": "^C-\\d{3,}$" },
3851
+ "ticketId": { "$ref": "#/$defs/TicketId" },
3852
+ "kind": { "$ref": "#/$defs/ClarificationKind" },
3853
+ "statement": { "type": "string", "minLength": 1 },
3854
+ "expectedForm": { "type": "string", "minLength": 1 },
3855
+ "blocks": { "$ref": "#/$defs/ClarificationBlocks" },
3856
+ "status": { "$ref": "#/$defs/ClarificationStatus" },
3857
+ "userInput": { "type": "string" }
3858
+ }
3859
+ },
3860
+
3861
+ "RecommendedStep": {
3862
+ "type": "object",
3863
+ "required": ["text"],
3864
+ "additionalProperties": false,
3865
+ "properties": {
3866
+ "text": { "type": "string", "minLength": 1 },
3867
+ "commands": {
3868
+ "type": "array",
3869
+ "items": {
3870
+ "type": "object",
3871
+ "required": ["label", "claudeCode", "terminal"],
3872
+ "additionalProperties": false,
3873
+ "properties": {
3874
+ "label": { "type": "string", "minLength": 1 },
3875
+ "claudeCode": { "type": "string", "minLength": 1 },
3876
+ "terminal": { "type": "string", "minLength": 1 }
3877
+ }
3878
+ }
3879
+ }
3880
+ }
3881
+ },
3882
+
3883
+ "FollowUpRow": {
3884
+ "type": "object",
3885
+ "required": [
3886
+ "id",
3887
+ "ticketId",
3888
+ "origin",
3889
+ "newTaskId",
3890
+ "title",
3891
+ "suggestedTaskType",
3892
+ "scope",
3893
+ "reason",
3894
+ "priority",
3895
+ "autoSpawn"
3896
+ ],
3897
+ "additionalProperties": false,
3898
+ "properties": {
3899
+ "id": { "type": "string", "pattern": "^FU-\\d{3,}$" },
3900
+ "ticketId": { "$ref": "#/$defs/TicketId" },
3901
+ "origin": { "$ref": "#/$defs/FollowUpOrigin" },
3902
+ "newTaskId": { "type": "string", "minLength": 1 },
3903
+ "title": { "type": "string", "minLength": 1 },
3904
+ "suggestedTaskType": { "$ref": "#/$defs/TaskType" },
3905
+ "scope": { "type": "string", "minLength": 1 },
3906
+ "reason": { "type": "string", "minLength": 1 },
3907
+ "priority": { "$ref": "#/$defs/Priority" },
3908
+ "autoSpawn": { "enum": ["yes", "no"] }
3909
+ },
3910
+ "allOf": [
3911
+ {
3912
+ "description": "phase-continuation rows MUST have autoSpawn=no (advances via /okstra-run, no new dir).",
3913
+ "if": {
3914
+ "properties": { "origin": { "const": "phase-continuation" } }
3915
+ },
3916
+ "then": {
3917
+ "properties": { "autoSpawn": { "const": "no" } }
3918
+ }
3919
+ }
3920
+ ]
3921
+ }
3922
+ }
3923
+ }