mustflow 1.31.0 → 2.11.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 (64) hide show
  1. package/README.md +23 -9
  2. package/dist/cli/commands/classify.js +61 -6
  3. package/dist/cli/commands/contract-lint.js +13 -4
  4. package/dist/cli/commands/dashboard.js +6 -0
  5. package/dist/cli/commands/index.js +5 -0
  6. package/dist/cli/commands/run.js +4 -1
  7. package/dist/cli/commands/verify.js +488 -43
  8. package/dist/cli/i18n/en.js +61 -10
  9. package/dist/cli/i18n/es.js +61 -10
  10. package/dist/cli/i18n/fr.js +61 -10
  11. package/dist/cli/i18n/hi.js +61 -10
  12. package/dist/cli/i18n/ko.js +61 -10
  13. package/dist/cli/i18n/zh.js +61 -10
  14. package/dist/cli/lib/dashboard-export.js +62 -12
  15. package/dist/cli/lib/dashboard-html/client-script.js +1936 -0
  16. package/dist/cli/lib/dashboard-html/locale-bootstrap.js +8 -0
  17. package/dist/cli/lib/dashboard-html/styles.js +572 -0
  18. package/dist/cli/lib/dashboard-html/template.js +134 -0
  19. package/dist/cli/lib/dashboard-html/types.js +1 -0
  20. package/dist/cli/lib/dashboard-html.js +1 -1907
  21. package/dist/cli/lib/dashboard-locale.js +37 -0
  22. package/dist/cli/lib/local-index/constants.js +48 -0
  23. package/dist/cli/lib/local-index/index.js +2256 -0
  24. package/dist/cli/lib/local-index/sql.js +15 -0
  25. package/dist/cli/lib/local-index/types.js +1 -0
  26. package/dist/cli/lib/local-index.js +1 -1911
  27. package/dist/cli/lib/run-plan.js +76 -1
  28. package/dist/cli/lib/templates.js +18 -1
  29. package/dist/cli/lib/validation/command-intents.js +11 -0
  30. package/dist/cli/lib/validation/constants.js +238 -0
  31. package/dist/cli/lib/validation/index.js +1384 -0
  32. package/dist/cli/lib/validation/primitives.js +198 -0
  33. package/dist/cli/lib/validation/test-selection.js +95 -0
  34. package/dist/cli/lib/validation/types.js +1 -0
  35. package/dist/cli/lib/validation.js +1 -1770
  36. package/dist/core/check-issues.js +6 -0
  37. package/dist/core/completion-verdict.js +209 -0
  38. package/dist/core/contract-lint.js +221 -6
  39. package/dist/core/external-evidence.js +9 -0
  40. package/dist/core/public-json-contracts.js +21 -0
  41. package/dist/core/repeated-failure.js +17 -0
  42. package/dist/core/repro-evidence.js +53 -0
  43. package/dist/core/scope-risk.js +64 -0
  44. package/dist/core/skill-route-alignment.js +20 -0
  45. package/dist/core/source-anchor-status.js +4 -1
  46. package/dist/core/test-selection.js +3 -0
  47. package/dist/core/validation-ratchet.js +52 -0
  48. package/dist/core/verification-evidence.js +249 -0
  49. package/examples/README.md +12 -4
  50. package/package.json +1 -1
  51. package/schemas/README.md +13 -3
  52. package/schemas/change-verification-report.schema.json +16 -2
  53. package/schemas/commands.schema.json +4 -0
  54. package/schemas/contract-lint-report.schema.json +29 -0
  55. package/schemas/dashboard-export.schema.json +227 -0
  56. package/schemas/latest-run-pointer.schema.json +384 -0
  57. package/schemas/run-receipt.schema.json +4 -0
  58. package/schemas/test-selection.schema.json +81 -0
  59. package/schemas/verify-report.schema.json +361 -1
  60. package/schemas/verify-run-manifest.schema.json +410 -0
  61. package/templates/default/i18n.toml +1 -1
  62. package/templates/default/locales/en/.mustflow/skills/INDEX.md +124 -29
  63. package/templates/default/locales/en/.mustflow/skills/routes.toml +289 -0
  64. package/templates/default/manifest.toml +29 -2
@@ -151,6 +151,229 @@
151
151
  "paths": { "$ref": "#/$defs/stringArray" }
152
152
  }
153
153
  },
154
+ "evidenceModel": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": [
158
+ "schema_version",
159
+ "source",
160
+ "verification_plan_id",
161
+ "requirements",
162
+ "coverage_matrix",
163
+ "receipts",
164
+ "skipped_checks",
165
+ "gaps",
166
+ "remaining_risks",
167
+ "explanation"
168
+ ],
169
+ "properties": {
170
+ "schema_version": { "const": "1" },
171
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
172
+ "verification_plan_id": {
173
+ "type": ["string", "null"],
174
+ "pattern": "^sha256:[0-9a-f]{64}$"
175
+ },
176
+ "requirements": {
177
+ "type": "array",
178
+ "items": { "$ref": "#/$defs/evidenceRequirement" }
179
+ },
180
+ "coverage_matrix": {
181
+ "type": "array",
182
+ "items": { "$ref": "#/$defs/evidenceCoverageCriterion" }
183
+ },
184
+ "receipts": {
185
+ "type": "array",
186
+ "items": { "$ref": "#/$defs/evidenceReceipt" }
187
+ },
188
+ "skipped_checks": {
189
+ "type": "array",
190
+ "items": { "$ref": "#/$defs/evidenceSkippedCheck" }
191
+ },
192
+ "gaps": {
193
+ "type": "array",
194
+ "items": { "$ref": "#/$defs/evidenceGap" }
195
+ },
196
+ "remaining_risks": {
197
+ "type": "array",
198
+ "items": { "$ref": "#/$defs/evidenceRemainingRisk" }
199
+ },
200
+ "explanation": { "$ref": "#/$defs/evidenceExplanation" }
201
+ }
202
+ },
203
+ "evidenceRequirement": {
204
+ "type": "object",
205
+ "additionalProperties": false,
206
+ "required": [
207
+ "reason",
208
+ "files",
209
+ "surfaces",
210
+ "candidate_intents",
211
+ "selected_intents",
212
+ "skipped_intents",
213
+ "gap_count",
214
+ "outcome"
215
+ ],
216
+ "properties": {
217
+ "reason": { "type": "string" },
218
+ "files": { "$ref": "#/$defs/stringArray" },
219
+ "surfaces": { "$ref": "#/$defs/stringArray" },
220
+ "candidate_intents": { "$ref": "#/$defs/stringArray" },
221
+ "selected_intents": { "$ref": "#/$defs/stringArray" },
222
+ "skipped_intents": { "$ref": "#/$defs/stringArray" },
223
+ "gap_count": { "type": "integer" },
224
+ "outcome": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] }
225
+ }
226
+ },
227
+ "evidenceCoverageCriterion": {
228
+ "type": "object",
229
+ "additionalProperties": false,
230
+ "required": ["criterion_id", "source", "statement", "status", "requirement_reason", "evidence"],
231
+ "properties": {
232
+ "criterion_id": { "type": "string" },
233
+ "source": { "enum": ["verification_requirement", "dashboard_snapshot"] },
234
+ "statement": { "type": "string" },
235
+ "status": { "enum": ["covered", "partially_covered", "uncovered", "blocked", "contradicted"] },
236
+ "requirement_reason": { "type": ["string", "null"] },
237
+ "evidence": { "$ref": "#/$defs/evidenceCoverageLinks" }
238
+ }
239
+ },
240
+ "evidenceCoverageLinks": {
241
+ "type": "object",
242
+ "additionalProperties": false,
243
+ "required": ["intents", "receipt_paths", "gap_reasons", "source_anchor_ids"],
244
+ "properties": {
245
+ "intents": { "$ref": "#/$defs/stringArray" },
246
+ "receipt_paths": { "$ref": "#/$defs/stringArray" },
247
+ "gap_reasons": { "$ref": "#/$defs/stringArray" },
248
+ "source_anchor_ids": { "$ref": "#/$defs/stringArray" }
249
+ }
250
+ },
251
+ "evidenceReceipt": {
252
+ "type": "object",
253
+ "additionalProperties": false,
254
+ "required": ["intent", "status", "skipped", "verification_plan_id", "receipt_path", "receipt_sha256"],
255
+ "properties": {
256
+ "intent": { "type": ["string", "null"] },
257
+ "status": { "type": "string" },
258
+ "skipped": { "type": "boolean" },
259
+ "verification_plan_id": {
260
+ "type": ["string", "null"],
261
+ "pattern": "^sha256:[0-9a-f]{64}$"
262
+ },
263
+ "receipt_path": { "type": ["string", "null"] },
264
+ "receipt_sha256": {
265
+ "type": ["string", "null"],
266
+ "pattern": "^sha256:[0-9a-f]{64}$"
267
+ }
268
+ }
269
+ },
270
+ "evidenceSkippedCheck": {
271
+ "type": "object",
272
+ "additionalProperties": false,
273
+ "required": ["intent", "reason", "detail"],
274
+ "properties": {
275
+ "intent": { "type": ["string", "null"] },
276
+ "reason": { "type": ["string", "null"] },
277
+ "detail": { "type": ["string", "null"] }
278
+ }
279
+ },
280
+ "evidenceGap": {
281
+ "type": "object",
282
+ "additionalProperties": false,
283
+ "required": ["reason", "intent", "status", "detail", "files", "surfaces"],
284
+ "properties": {
285
+ "reason": { "type": ["string", "null"] },
286
+ "intent": { "type": ["string", "null"] },
287
+ "status": { "type": ["string", "null"] },
288
+ "detail": { "type": ["string", "null"] },
289
+ "files": { "$ref": "#/$defs/stringArray" },
290
+ "surfaces": { "$ref": "#/$defs/stringArray" }
291
+ }
292
+ },
293
+ "evidenceRemainingRisk": {
294
+ "type": "object",
295
+ "additionalProperties": false,
296
+ "required": ["code", "severity", "detail"],
297
+ "properties": {
298
+ "code": { "type": "string" },
299
+ "severity": { "type": "string" },
300
+ "detail": { "type": "string" }
301
+ }
302
+ },
303
+ "evidenceExplanation": {
304
+ "type": "object",
305
+ "additionalProperties": false,
306
+ "required": ["verified_by", "downgraded_by", "blocked_by", "contradicted_by"],
307
+ "properties": {
308
+ "verified_by": { "$ref": "#/$defs/stringArray" },
309
+ "downgraded_by": { "$ref": "#/$defs/stringArray" },
310
+ "blocked_by": { "$ref": "#/$defs/stringArray" },
311
+ "contradicted_by": { "$ref": "#/$defs/stringArray" }
312
+ }
313
+ },
314
+ "completionVerdict": {
315
+ "type": "object",
316
+ "additionalProperties": false,
317
+ "required": ["schema_version", "status", "primary_reason", "evidence", "blockers", "contradictions", "limitations"],
318
+ "properties": {
319
+ "schema_version": { "const": "1" },
320
+ "status": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] },
321
+ "primary_reason": { "type": "string" },
322
+ "evidence": {
323
+ "type": "object",
324
+ "additionalProperties": false,
325
+ "required": [
326
+ "source",
327
+ "verification_plan_id",
328
+ "changed_file_count",
329
+ "matched_intents",
330
+ "ran_intents",
331
+ "passed_intents",
332
+ "failed_intents",
333
+ "skipped_intents",
334
+ "receipt_count",
335
+ "gap_count",
336
+ "source_anchor_risk_count",
337
+ "scope_diff_risk_count",
338
+ "repeated_failure_count",
339
+ "validation_ratchet_risk_count",
340
+ "latest_run_status"
341
+ ],
342
+ "properties": {
343
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
344
+ "verification_plan_id": {
345
+ "type": ["string", "null"],
346
+ "pattern": "^sha256:[0-9a-f]{64}$"
347
+ },
348
+ "changed_file_count": { "type": ["integer", "null"] },
349
+ "matched_intents": { "type": "integer" },
350
+ "ran_intents": { "type": "integer" },
351
+ "passed_intents": { "type": "integer" },
352
+ "failed_intents": { "type": "integer" },
353
+ "skipped_intents": { "type": "integer" },
354
+ "receipt_count": { "type": "integer" },
355
+ "gap_count": { "type": "integer" },
356
+ "source_anchor_risk_count": { "type": "integer" },
357
+ "scope_diff_risk_count": { "type": "integer" },
358
+ "repeated_failure_count": { "type": "integer" },
359
+ "validation_ratchet_risk_count": { "type": "integer" },
360
+ "latest_run_status": { "type": ["string", "null"] }
361
+ }
362
+ },
363
+ "blockers": {
364
+ "type": "array",
365
+ "items": { "type": "string" }
366
+ },
367
+ "contradictions": {
368
+ "type": "array",
369
+ "items": { "type": "string" }
370
+ },
371
+ "limitations": {
372
+ "type": "array",
373
+ "items": { "type": "string" }
374
+ }
375
+ }
376
+ },
154
377
  "harnessReport": {
155
378
  "type": "object",
156
379
  "additionalProperties": false,
@@ -183,6 +406,8 @@
183
406
  "type": "object",
184
407
  "additionalProperties": false,
185
408
  "required": [
409
+ "completion_verdict",
410
+ "evidence_model",
186
411
  "changed_file_count",
187
412
  "changed_surfaces",
188
413
  "decision_graph_summary",
@@ -191,6 +416,8 @@
191
416
  "gaps"
192
417
  ],
193
418
  "properties": {
419
+ "completion_verdict": { "$ref": "#/$defs/completionVerdict" },
420
+ "evidence_model": { "$ref": "#/$defs/evidenceModel" },
194
421
  "changed_file_count": { "type": "integer" },
195
422
  "changed_surfaces": { "$ref": "#/$defs/stringArray" },
196
423
  "decision_graph_summary": {
@@ -0,0 +1,384 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/latest-run-pointer.schema.json",
4
+ "title": "mustflow latest run pointer",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "kind",
11
+ "reason",
12
+ "reasons",
13
+ "plan_source",
14
+ "verification_plan_id",
15
+ "status",
16
+ "completion_verdict",
17
+ "evidence_model",
18
+ "summary",
19
+ "run_dir",
20
+ "manifest_path"
21
+ ],
22
+ "properties": {
23
+ "schema_version": { "const": "1" },
24
+ "command": { "const": "verify" },
25
+ "kind": { "const": "verify_run_summary" },
26
+ "reason": { "type": "string" },
27
+ "reasons": {
28
+ "type": "array",
29
+ "items": { "type": "string" }
30
+ },
31
+ "plan_source": { "type": ["string", "null"] },
32
+ "verification_plan_id": {
33
+ "type": "string",
34
+ "pattern": "^sha256:[0-9a-f]{64}$"
35
+ },
36
+ "status": { "enum": ["passed", "partial", "failed", "blocked"] },
37
+ "completion_verdict": { "$ref": "#/$defs/completionVerdict" },
38
+ "evidence_model": { "$ref": "#/$defs/evidenceModel" },
39
+ "summary": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["matched", "ran", "passed", "failed", "skipped"],
43
+ "properties": {
44
+ "matched": { "type": "integer" },
45
+ "ran": { "type": "integer" },
46
+ "passed": { "type": "integer" },
47
+ "failed": { "type": "integer" },
48
+ "skipped": { "type": "integer" }
49
+ }
50
+ },
51
+ "repro_evidence": { "$ref": "#/$defs/reproEvidence" },
52
+ "external_checks": {
53
+ "type": "array",
54
+ "items": { "$ref": "#/$defs/externalCheck" }
55
+ },
56
+ "run_dir": { "type": "string" },
57
+ "manifest_path": { "type": "string" }
58
+ },
59
+ "$defs": {
60
+ "completionVerdict": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["schema_version", "status", "primary_reason", "evidence", "blockers", "contradictions", "limitations"],
64
+ "properties": {
65
+ "schema_version": { "const": "1" },
66
+ "status": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] },
67
+ "primary_reason": { "type": "string" },
68
+ "evidence": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": [
72
+ "source",
73
+ "verification_plan_id",
74
+ "changed_file_count",
75
+ "matched_intents",
76
+ "ran_intents",
77
+ "passed_intents",
78
+ "failed_intents",
79
+ "skipped_intents",
80
+ "receipt_count",
81
+ "gap_count",
82
+ "source_anchor_risk_count",
83
+ "scope_diff_risk_count",
84
+ "repeated_failure_count",
85
+ "validation_ratchet_risk_count",
86
+ "latest_run_status"
87
+ ],
88
+ "properties": {
89
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
90
+ "verification_plan_id": {
91
+ "type": ["string", "null"],
92
+ "pattern": "^sha256:[0-9a-f]{64}$"
93
+ },
94
+ "changed_file_count": { "type": ["integer", "null"] },
95
+ "matched_intents": { "type": "integer" },
96
+ "ran_intents": { "type": "integer" },
97
+ "passed_intents": { "type": "integer" },
98
+ "failed_intents": { "type": "integer" },
99
+ "skipped_intents": { "type": "integer" },
100
+ "receipt_count": { "type": "integer" },
101
+ "gap_count": { "type": "integer" },
102
+ "source_anchor_risk_count": { "type": "integer" },
103
+ "scope_diff_risk_count": { "type": "integer" },
104
+ "repeated_failure_count": { "type": "integer" },
105
+ "validation_ratchet_risk_count": { "type": "integer" },
106
+ "latest_run_status": { "type": ["string", "null"] }
107
+ }
108
+ },
109
+ "blockers": {
110
+ "type": "array",
111
+ "items": { "type": "string" }
112
+ },
113
+ "contradictions": {
114
+ "type": "array",
115
+ "items": { "type": "string" }
116
+ },
117
+ "limitations": {
118
+ "type": "array",
119
+ "items": { "type": "string" }
120
+ }
121
+ }
122
+ },
123
+ "evidenceModel": {
124
+ "type": "object",
125
+ "additionalProperties": false,
126
+ "required": [
127
+ "schema_version",
128
+ "source",
129
+ "verification_plan_id",
130
+ "requirements",
131
+ "coverage_matrix",
132
+ "receipts",
133
+ "skipped_checks",
134
+ "gaps",
135
+ "remaining_risks",
136
+ "explanation"
137
+ ],
138
+ "properties": {
139
+ "schema_version": { "const": "1" },
140
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
141
+ "verification_plan_id": {
142
+ "type": ["string", "null"],
143
+ "pattern": "^sha256:[0-9a-f]{64}$"
144
+ },
145
+ "requirements": {
146
+ "type": "array",
147
+ "items": { "$ref": "#/$defs/evidenceRequirement" }
148
+ },
149
+ "coverage_matrix": {
150
+ "type": "array",
151
+ "items": { "$ref": "#/$defs/evidenceCoverageCriterion" }
152
+ },
153
+ "receipts": {
154
+ "type": "array",
155
+ "items": { "$ref": "#/$defs/evidenceReceipt" }
156
+ },
157
+ "skipped_checks": {
158
+ "type": "array",
159
+ "items": { "$ref": "#/$defs/evidenceSkippedCheck" }
160
+ },
161
+ "gaps": {
162
+ "type": "array",
163
+ "items": { "$ref": "#/$defs/evidenceGap" }
164
+ },
165
+ "remaining_risks": {
166
+ "type": "array",
167
+ "items": { "$ref": "#/$defs/evidenceRemainingRisk" }
168
+ },
169
+ "repro_evidence": { "$ref": "#/$defs/reproEvidence" },
170
+ "external_checks": {
171
+ "type": "array",
172
+ "items": { "$ref": "#/$defs/externalCheck" }
173
+ },
174
+ "explanation": { "$ref": "#/$defs/evidenceExplanation" }
175
+ }
176
+ },
177
+ "evidenceRequirement": {
178
+ "type": "object",
179
+ "additionalProperties": false,
180
+ "required": [
181
+ "reason",
182
+ "files",
183
+ "surfaces",
184
+ "candidate_intents",
185
+ "selected_intents",
186
+ "skipped_intents",
187
+ "gap_count",
188
+ "outcome"
189
+ ],
190
+ "properties": {
191
+ "reason": { "type": "string" },
192
+ "files": {
193
+ "type": "array",
194
+ "items": { "type": "string" }
195
+ },
196
+ "surfaces": {
197
+ "type": "array",
198
+ "items": { "type": "string" }
199
+ },
200
+ "candidate_intents": {
201
+ "type": "array",
202
+ "items": { "type": "string" }
203
+ },
204
+ "selected_intents": {
205
+ "type": "array",
206
+ "items": { "type": "string" }
207
+ },
208
+ "skipped_intents": {
209
+ "type": "array",
210
+ "items": { "type": "string" }
211
+ },
212
+ "gap_count": { "type": "integer" },
213
+ "outcome": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] }
214
+ }
215
+ },
216
+ "evidenceCoverageCriterion": {
217
+ "type": "object",
218
+ "additionalProperties": false,
219
+ "required": ["criterion_id", "source", "statement", "status", "requirement_reason", "evidence"],
220
+ "properties": {
221
+ "criterion_id": { "type": "string" },
222
+ "source": { "enum": ["verification_requirement", "dashboard_snapshot"] },
223
+ "statement": { "type": "string" },
224
+ "status": { "enum": ["covered", "partially_covered", "uncovered", "blocked", "contradicted"] },
225
+ "requirement_reason": { "type": ["string", "null"] },
226
+ "evidence": { "$ref": "#/$defs/evidenceCoverageLinks" }
227
+ }
228
+ },
229
+ "evidenceCoverageLinks": {
230
+ "type": "object",
231
+ "additionalProperties": false,
232
+ "required": ["intents", "receipt_paths", "gap_reasons", "source_anchor_ids"],
233
+ "properties": {
234
+ "intents": {
235
+ "type": "array",
236
+ "items": { "type": "string" }
237
+ },
238
+ "receipt_paths": {
239
+ "type": "array",
240
+ "items": { "type": "string" }
241
+ },
242
+ "gap_reasons": {
243
+ "type": "array",
244
+ "items": { "type": "string" }
245
+ },
246
+ "source_anchor_ids": {
247
+ "type": "array",
248
+ "items": { "type": "string" }
249
+ }
250
+ }
251
+ },
252
+ "evidenceReceipt": {
253
+ "type": "object",
254
+ "additionalProperties": false,
255
+ "required": ["intent", "status", "skipped", "verification_plan_id", "receipt_path", "receipt_sha256"],
256
+ "properties": {
257
+ "intent": { "type": ["string", "null"] },
258
+ "status": { "type": "string" },
259
+ "skipped": { "type": "boolean" },
260
+ "verification_plan_id": {
261
+ "type": ["string", "null"],
262
+ "pattern": "^sha256:[0-9a-f]{64}$"
263
+ },
264
+ "receipt_path": { "type": ["string", "null"] },
265
+ "receipt_sha256": {
266
+ "type": ["string", "null"],
267
+ "pattern": "^sha256:[0-9a-f]{64}$"
268
+ }
269
+ }
270
+ },
271
+ "evidenceSkippedCheck": {
272
+ "type": "object",
273
+ "additionalProperties": false,
274
+ "required": ["intent", "reason", "detail"],
275
+ "properties": {
276
+ "intent": { "type": ["string", "null"] },
277
+ "reason": { "type": ["string", "null"] },
278
+ "detail": { "type": ["string", "null"] }
279
+ }
280
+ },
281
+ "evidenceGap": {
282
+ "type": "object",
283
+ "additionalProperties": false,
284
+ "required": ["reason", "intent", "status", "detail", "files", "surfaces"],
285
+ "properties": {
286
+ "reason": { "type": ["string", "null"] },
287
+ "intent": { "type": ["string", "null"] },
288
+ "status": { "type": ["string", "null"] },
289
+ "detail": { "type": ["string", "null"] },
290
+ "files": {
291
+ "type": "array",
292
+ "items": { "type": "string" }
293
+ },
294
+ "surfaces": {
295
+ "type": "array",
296
+ "items": { "type": "string" }
297
+ }
298
+ }
299
+ },
300
+ "evidenceRemainingRisk": {
301
+ "type": "object",
302
+ "additionalProperties": false,
303
+ "required": ["code", "severity", "detail"],
304
+ "properties": {
305
+ "code": { "type": "string" },
306
+ "severity": { "type": "string" },
307
+ "detail": { "type": "string" }
308
+ }
309
+ },
310
+ "reproEvidence": {
311
+ "type": "object",
312
+ "additionalProperties": false,
313
+ "required": [
314
+ "source",
315
+ "authority",
316
+ "reported_symptom",
317
+ "expected_behavior",
318
+ "observed_behavior",
319
+ "original_reproduction",
320
+ "evidence_before_fix",
321
+ "evidence_after_fix",
322
+ "regression_guard"
323
+ ],
324
+ "properties": {
325
+ "source": { "const": "repro_first_debug" },
326
+ "authority": { "const": "claim_evidence" },
327
+ "reported_symptom": { "type": ["string", "null"] },
328
+ "expected_behavior": { "type": ["string", "null"] },
329
+ "observed_behavior": { "type": ["string", "null"] },
330
+ "original_reproduction": { "$ref": "#/$defs/reproEvidenceItem" },
331
+ "evidence_before_fix": { "$ref": "#/$defs/reproEvidenceItem" },
332
+ "evidence_after_fix": { "$ref": "#/$defs/reproEvidenceItem" },
333
+ "regression_guard": { "$ref": "#/$defs/reproEvidenceItem" }
334
+ }
335
+ },
336
+ "reproEvidenceItem": {
337
+ "type": "object",
338
+ "additionalProperties": false,
339
+ "required": ["status", "summary", "reason"],
340
+ "properties": {
341
+ "status": { "enum": ["present", "unavailable", "missing"] },
342
+ "summary": { "type": ["string", "null"] },
343
+ "reason": { "type": ["string", "null"] }
344
+ }
345
+ },
346
+ "externalCheck": {
347
+ "type": "object",
348
+ "additionalProperties": false,
349
+ "required": ["source", "authority", "provider", "name", "status", "url", "summary"],
350
+ "properties": {
351
+ "source": { "const": "external_ci" },
352
+ "authority": { "const": "supporting_only" },
353
+ "provider": { "type": "string", "minLength": 1 },
354
+ "name": { "type": "string", "minLength": 1 },
355
+ "status": { "enum": ["passed", "failed", "cancelled", "unknown"] },
356
+ "url": { "type": ["string", "null"] },
357
+ "summary": { "type": ["string", "null"] }
358
+ }
359
+ },
360
+ "evidenceExplanation": {
361
+ "type": "object",
362
+ "additionalProperties": false,
363
+ "required": ["verified_by", "downgraded_by", "blocked_by", "contradicted_by"],
364
+ "properties": {
365
+ "verified_by": {
366
+ "type": "array",
367
+ "items": { "type": "string" }
368
+ },
369
+ "downgraded_by": {
370
+ "type": "array",
371
+ "items": { "type": "string" }
372
+ },
373
+ "blocked_by": {
374
+ "type": "array",
375
+ "items": { "type": "string" }
376
+ },
377
+ "contradicted_by": {
378
+ "type": "array",
379
+ "items": { "type": "string" }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ }
@@ -69,6 +69,10 @@
69
69
  "write_drift": { "$ref": "#/$defs/writeDrift" },
70
70
  "performance": { "$ref": "#/$defs/performance" },
71
71
  "redaction": { "$ref": "#/$defs/redaction" },
72
+ "verification_plan_id": {
73
+ "type": "string",
74
+ "pattern": "^sha256:[0-9a-f]{64}$"
75
+ },
72
76
  "receipt_path": { "type": "string" }
73
77
  },
74
78
  "$defs": {