mustflow 1.31.0 → 2.16.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 (66) 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 +77 -2
  5. package/dist/cli/commands/explain-verify.js +11 -1
  6. package/dist/cli/commands/index.js +14 -0
  7. package/dist/cli/commands/run.js +4 -1
  8. package/dist/cli/commands/verify.js +986 -43
  9. package/dist/cli/i18n/en.js +61 -10
  10. package/dist/cli/i18n/es.js +61 -10
  11. package/dist/cli/i18n/fr.js +61 -10
  12. package/dist/cli/i18n/hi.js +61 -10
  13. package/dist/cli/i18n/ko.js +61 -10
  14. package/dist/cli/i18n/zh.js +61 -10
  15. package/dist/cli/lib/dashboard-export.js +62 -12
  16. package/dist/cli/lib/dashboard-html/client-script.js +1936 -0
  17. package/dist/cli/lib/dashboard-html/locale-bootstrap.js +8 -0
  18. package/dist/cli/lib/dashboard-html/styles.js +572 -0
  19. package/dist/cli/lib/dashboard-html/template.js +134 -0
  20. package/dist/cli/lib/dashboard-html/types.js +1 -0
  21. package/dist/cli/lib/dashboard-html.js +1 -1907
  22. package/dist/cli/lib/dashboard-locale.js +37 -0
  23. package/dist/cli/lib/local-index/constants.js +48 -0
  24. package/dist/cli/lib/local-index/index.js +2951 -0
  25. package/dist/cli/lib/local-index/sql.js +15 -0
  26. package/dist/cli/lib/local-index/types.js +1 -0
  27. package/dist/cli/lib/local-index.js +1 -1911
  28. package/dist/cli/lib/run-plan.js +76 -1
  29. package/dist/cli/lib/templates.js +18 -1
  30. package/dist/cli/lib/validation/command-intents.js +11 -0
  31. package/dist/cli/lib/validation/constants.js +238 -0
  32. package/dist/cli/lib/validation/index.js +1384 -0
  33. package/dist/cli/lib/validation/primitives.js +198 -0
  34. package/dist/cli/lib/validation/test-selection.js +95 -0
  35. package/dist/cli/lib/validation/types.js +1 -0
  36. package/dist/cli/lib/validation.js +1 -1770
  37. package/dist/core/check-issues.js +6 -0
  38. package/dist/core/completion-verdict.js +341 -0
  39. package/dist/core/contract-lint.js +221 -6
  40. package/dist/core/external-evidence.js +9 -0
  41. package/dist/core/public-json-contracts.js +21 -0
  42. package/dist/core/repeated-failure.js +179 -0
  43. package/dist/core/repro-evidence.js +134 -0
  44. package/dist/core/scope-risk.js +64 -0
  45. package/dist/core/skill-route-alignment.js +20 -0
  46. package/dist/core/source-anchor-status.js +4 -1
  47. package/dist/core/test-selection.js +3 -0
  48. package/dist/core/validation-ratchet.js +196 -0
  49. package/dist/core/verification-evidence.js +249 -0
  50. package/examples/README.md +12 -4
  51. package/package.json +3 -3
  52. package/schemas/README.md +13 -3
  53. package/schemas/change-verification-report.schema.json +16 -2
  54. package/schemas/commands.schema.json +4 -0
  55. package/schemas/contract-lint-report.schema.json +29 -0
  56. package/schemas/dashboard-export.schema.json +310 -0
  57. package/schemas/explain-report.schema.json +173 -1
  58. package/schemas/latest-run-pointer.schema.json +601 -0
  59. package/schemas/run-receipt.schema.json +4 -0
  60. package/schemas/test-selection.schema.json +81 -0
  61. package/schemas/verify-report.schema.json +578 -1
  62. package/schemas/verify-run-manifest.schema.json +627 -0
  63. package/templates/default/i18n.toml +1 -1
  64. package/templates/default/locales/en/.mustflow/skills/INDEX.md +124 -29
  65. package/templates/default/locales/en/.mustflow/skills/routes.toml +289 -0
  66. package/templates/default/manifest.toml +29 -2
@@ -11,7 +11,12 @@
11
11
  "reason",
12
12
  "reasons",
13
13
  "plan_source",
14
+ "verification_plan_id",
14
15
  "status",
16
+ "completion_verdict",
17
+ "evidence_model",
18
+ "run_dir",
19
+ "manifest_path",
15
20
  "summary",
16
21
  "results"
17
22
  ],
@@ -25,7 +30,27 @@
25
30
  "items": { "type": "string" }
26
31
  },
27
32
  "plan_source": { "type": ["string", "null"] },
33
+ "verification_plan_id": {
34
+ "type": "string",
35
+ "pattern": "^sha256:[0-9a-f]{64}$"
36
+ },
28
37
  "status": { "enum": ["passed", "partial", "failed", "blocked"] },
38
+ "completion_verdict": { "$ref": "#/$defs/completionVerdict" },
39
+ "evidence_model": { "$ref": "#/$defs/evidenceModel" },
40
+ "failure_fingerprint": {
41
+ "anyOf": [
42
+ { "$ref": "#/$defs/failureFingerprint" },
43
+ { "type": "null" }
44
+ ]
45
+ },
46
+ "repeated_failure_summary": {
47
+ "anyOf": [
48
+ { "$ref": "#/$defs/repeatedFailureSummary" },
49
+ { "type": "null" }
50
+ ]
51
+ },
52
+ "run_dir": { "type": "string" },
53
+ "manifest_path": { "type": "string" },
29
54
  "summary": {
30
55
  "type": "object",
31
56
  "additionalProperties": false,
@@ -38,6 +63,11 @@
38
63
  "skipped": { "type": "integer" }
39
64
  }
40
65
  },
66
+ "repro_evidence": { "$ref": "#/$defs/reproEvidence" },
67
+ "external_checks": {
68
+ "type": "array",
69
+ "items": { "$ref": "#/$defs/externalCheck" }
70
+ },
41
71
  "results": {
42
72
  "type": "array",
43
73
  "items": {
@@ -50,6 +80,9 @@
50
80
  "reason",
51
81
  "detail",
52
82
  "exit_code",
83
+ "verification_plan_id",
84
+ "receipt_path",
85
+ "receipt_sha256",
53
86
  "receipt"
54
87
  ],
55
88
  "properties": {
@@ -59,7 +92,551 @@
59
92
  "reason": { "type": ["string", "null"] },
60
93
  "detail": { "type": ["string", "null"] },
61
94
  "exit_code": { "type": ["integer", "null"] },
62
- "receipt": { "type": ["object", "null"] }
95
+ "verification_plan_id": {
96
+ "type": ["string", "null"],
97
+ "pattern": "^sha256:[0-9a-f]{64}$"
98
+ },
99
+ "receipt_path": { "type": ["string", "null"] },
100
+ "receipt_sha256": {
101
+ "type": ["string", "null"],
102
+ "pattern": "^sha256:[0-9a-f]{64}$"
103
+ },
104
+ "receipt": {
105
+ "anyOf": [
106
+ { "$ref": "run-receipt.schema.json" },
107
+ { "type": "null" }
108
+ ]
109
+ }
110
+ }
111
+ }
112
+ }
113
+ },
114
+ "$defs": {
115
+ "failureFingerprint": {
116
+ "type": "object",
117
+ "additionalProperties": false,
118
+ "required": [
119
+ "schema_version",
120
+ "fingerprint",
121
+ "verification_plan_id",
122
+ "failed_intents_hash",
123
+ "exit_code_classes_hash",
124
+ "timeout_flags_hash",
125
+ "error_kinds_hash",
126
+ "diagnostic_hash",
127
+ "risk_codes_hash",
128
+ "affected_surfaces_hash",
129
+ "command_fingerprints_hash"
130
+ ],
131
+ "properties": {
132
+ "schema_version": { "const": "1" },
133
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
134
+ "verification_plan_id": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
135
+ "failed_intents_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
136
+ "exit_code_classes_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
137
+ "timeout_flags_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
138
+ "error_kinds_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
139
+ "diagnostic_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
140
+ "risk_codes_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
141
+ "affected_surfaces_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
142
+ "command_fingerprints_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
143
+ }
144
+ },
145
+ "repeatedFailureSummary": {
146
+ "type": "object",
147
+ "additionalProperties": false,
148
+ "required": [
149
+ "schema_version",
150
+ "fingerprint",
151
+ "verification_plan_id",
152
+ "status",
153
+ "failed_intents_hash",
154
+ "risk_codes_hash",
155
+ "affected_surfaces_hash",
156
+ "first_seen_at",
157
+ "last_seen_at",
158
+ "seen_count",
159
+ "requires_new_evidence"
160
+ ],
161
+ "properties": {
162
+ "schema_version": { "const": "1" },
163
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
164
+ "verification_plan_id": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
165
+ "status": { "type": "string" },
166
+ "failed_intents_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
167
+ "risk_codes_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
168
+ "affected_surfaces_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
169
+ "first_seen_at": { "type": "string" },
170
+ "last_seen_at": { "type": "string" },
171
+ "seen_count": { "type": "integer", "minimum": 1 },
172
+ "requires_new_evidence": { "type": "boolean" }
173
+ }
174
+ },
175
+ "completionVerdict": {
176
+ "type": "object",
177
+ "additionalProperties": false,
178
+ "required": ["schema_version", "status", "primary_reason", "evidence", "blockers", "contradictions", "limitations"],
179
+ "properties": {
180
+ "schema_version": { "const": "1" },
181
+ "status": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] },
182
+ "primary_reason": { "type": "string" },
183
+ "evidence": {
184
+ "type": "object",
185
+ "additionalProperties": false,
186
+ "required": [
187
+ "source",
188
+ "verification_plan_id",
189
+ "changed_file_count",
190
+ "criteria",
191
+ "matched_intents",
192
+ "ran_intents",
193
+ "passed_intents",
194
+ "failed_intents",
195
+ "skipped_intents",
196
+ "receipt_count",
197
+ "gap_count",
198
+ "source_anchor_risk_count",
199
+ "scope_diff_risk_count",
200
+ "repeated_failure_count",
201
+ "validation_ratchet_risk_count",
202
+ "repro_evidence_risk_count",
203
+ "external_evidence_risk_count",
204
+ "write_drift_risk_count",
205
+ "receipt_binding_risk_count",
206
+ "stale_receipt_count",
207
+ "plan_mismatch_count",
208
+ "risks",
209
+ "receipt_binding",
210
+ "latest_run_status"
211
+ ],
212
+ "properties": {
213
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
214
+ "verification_plan_id": {
215
+ "type": ["string", "null"],
216
+ "pattern": "^sha256:[0-9a-f]{64}$"
217
+ },
218
+ "changed_file_count": { "type": ["integer", "null"] },
219
+ "criteria": { "$ref": "#/$defs/completionVerdictCriteria" },
220
+ "matched_intents": { "type": "integer" },
221
+ "ran_intents": { "type": "integer" },
222
+ "passed_intents": { "type": "integer" },
223
+ "failed_intents": { "type": "integer" },
224
+ "skipped_intents": { "type": "integer" },
225
+ "receipt_count": { "type": "integer" },
226
+ "gap_count": { "type": "integer" },
227
+ "source_anchor_risk_count": { "type": "integer" },
228
+ "scope_diff_risk_count": { "type": "integer" },
229
+ "repeated_failure_count": { "type": "integer" },
230
+ "validation_ratchet_risk_count": { "type": "integer" },
231
+ "repro_evidence_risk_count": { "type": "integer" },
232
+ "external_evidence_risk_count": { "type": "integer" },
233
+ "write_drift_risk_count": { "type": "integer" },
234
+ "receipt_binding_risk_count": { "type": "integer" },
235
+ "stale_receipt_count": { "type": "integer" },
236
+ "plan_mismatch_count": { "type": "integer" },
237
+ "risks": { "$ref": "#/$defs/completionVerdictRisks" },
238
+ "receipt_binding": { "$ref": "#/$defs/completionVerdictReceiptBinding" },
239
+ "latest_run_status": { "type": ["string", "null"] }
240
+ }
241
+ },
242
+ "blockers": {
243
+ "type": "array",
244
+ "items": { "type": "string" }
245
+ },
246
+ "contradictions": {
247
+ "type": "array",
248
+ "items": { "type": "string" }
249
+ },
250
+ "limitations": {
251
+ "type": "array",
252
+ "items": { "type": "string" }
253
+ }
254
+ }
255
+ },
256
+ "completionVerdictCriteria": {
257
+ "type": "object",
258
+ "additionalProperties": false,
259
+ "required": ["total", "covered", "partially_covered", "uncovered", "blocked", "contradicted"],
260
+ "properties": {
261
+ "total": { "type": "integer" },
262
+ "covered": { "type": "integer" },
263
+ "partially_covered": { "type": "integer" },
264
+ "uncovered": { "type": "integer" },
265
+ "blocked": { "type": "integer" },
266
+ "contradicted": { "type": "integer" }
267
+ }
268
+ },
269
+ "completionVerdictRisks": {
270
+ "type": "object",
271
+ "additionalProperties": false,
272
+ "required": [
273
+ "source_anchor",
274
+ "scope_diff",
275
+ "repeated_failure",
276
+ "validation_ratchet",
277
+ "repro_evidence",
278
+ "external_evidence",
279
+ "write_drift",
280
+ "receipt_binding",
281
+ "stale_receipt",
282
+ "plan_mismatch"
283
+ ],
284
+ "properties": {
285
+ "source_anchor": { "type": "integer" },
286
+ "scope_diff": { "type": "integer" },
287
+ "repeated_failure": { "type": "integer" },
288
+ "validation_ratchet": { "type": "integer" },
289
+ "repro_evidence": { "type": "integer" },
290
+ "external_evidence": { "type": "integer" },
291
+ "write_drift": { "type": "integer" },
292
+ "receipt_binding": { "type": "integer" },
293
+ "stale_receipt": { "type": "integer" },
294
+ "plan_mismatch": { "type": "integer" }
295
+ }
296
+ },
297
+ "completionVerdictReceiptBinding": {
298
+ "type": "object",
299
+ "additionalProperties": false,
300
+ "required": [
301
+ "plan_bound_count",
302
+ "plan_unbound_count",
303
+ "fingerprint_bound_count",
304
+ "fingerprint_unbound_count",
305
+ "current_state_bound_count",
306
+ "current_state_unavailable_count",
307
+ "stale_count",
308
+ "plan_mismatch_count"
309
+ ],
310
+ "properties": {
311
+ "plan_bound_count": { "type": "integer" },
312
+ "plan_unbound_count": { "type": "integer" },
313
+ "fingerprint_bound_count": { "type": "integer" },
314
+ "fingerprint_unbound_count": { "type": "integer" },
315
+ "current_state_bound_count": { "type": "integer" },
316
+ "current_state_unavailable_count": { "type": "integer" },
317
+ "stale_count": { "type": "integer" },
318
+ "plan_mismatch_count": { "type": "integer" }
319
+ }
320
+ },
321
+ "evidenceModel": {
322
+ "type": "object",
323
+ "additionalProperties": false,
324
+ "required": [
325
+ "schema_version",
326
+ "source",
327
+ "verification_plan_id",
328
+ "requirements",
329
+ "coverage_matrix",
330
+ "receipts",
331
+ "skipped_checks",
332
+ "gaps",
333
+ "remaining_risks",
334
+ "explanation"
335
+ ],
336
+ "properties": {
337
+ "schema_version": { "const": "1" },
338
+ "source": { "enum": ["mf_verify", "dashboard_export"] },
339
+ "verification_plan_id": {
340
+ "type": ["string", "null"],
341
+ "pattern": "^sha256:[0-9a-f]{64}$"
342
+ },
343
+ "requirements": {
344
+ "type": "array",
345
+ "items": { "$ref": "#/$defs/evidenceRequirement" }
346
+ },
347
+ "coverage_matrix": {
348
+ "type": "array",
349
+ "items": { "$ref": "#/$defs/evidenceCoverageCriterion" }
350
+ },
351
+ "receipts": {
352
+ "type": "array",
353
+ "items": { "$ref": "#/$defs/evidenceReceipt" }
354
+ },
355
+ "skipped_checks": {
356
+ "type": "array",
357
+ "items": { "$ref": "#/$defs/evidenceSkippedCheck" }
358
+ },
359
+ "gaps": {
360
+ "type": "array",
361
+ "items": { "$ref": "#/$defs/evidenceGap" }
362
+ },
363
+ "remaining_risks": {
364
+ "type": "array",
365
+ "items": { "$ref": "#/$defs/evidenceRemainingRisk" }
366
+ },
367
+ "repro_evidence": { "$ref": "#/$defs/reproEvidence" },
368
+ "external_checks": {
369
+ "type": "array",
370
+ "items": { "$ref": "#/$defs/externalCheck" }
371
+ },
372
+ "explanation": { "$ref": "#/$defs/evidenceExplanation" }
373
+ }
374
+ },
375
+ "evidenceRequirement": {
376
+ "type": "object",
377
+ "additionalProperties": false,
378
+ "required": [
379
+ "reason",
380
+ "files",
381
+ "surfaces",
382
+ "candidate_intents",
383
+ "selected_intents",
384
+ "skipped_intents",
385
+ "gap_count",
386
+ "outcome"
387
+ ],
388
+ "properties": {
389
+ "reason": { "type": "string" },
390
+ "files": {
391
+ "type": "array",
392
+ "items": { "type": "string" }
393
+ },
394
+ "surfaces": {
395
+ "type": "array",
396
+ "items": { "type": "string" }
397
+ },
398
+ "candidate_intents": {
399
+ "type": "array",
400
+ "items": { "type": "string" }
401
+ },
402
+ "selected_intents": {
403
+ "type": "array",
404
+ "items": { "type": "string" }
405
+ },
406
+ "skipped_intents": {
407
+ "type": "array",
408
+ "items": { "type": "string" }
409
+ },
410
+ "gap_count": { "type": "integer" },
411
+ "outcome": { "enum": ["verified", "partially_verified", "unverified", "blocked", "contradicted"] }
412
+ }
413
+ },
414
+ "evidenceCoverageCriterion": {
415
+ "type": "object",
416
+ "additionalProperties": false,
417
+ "required": ["criterion_id", "source", "statement", "status", "requirement_reason", "evidence"],
418
+ "properties": {
419
+ "criterion_id": { "type": "string" },
420
+ "source": { "enum": ["verification_requirement", "dashboard_snapshot"] },
421
+ "statement": { "type": "string" },
422
+ "status": { "enum": ["covered", "partially_covered", "uncovered", "blocked", "contradicted"] },
423
+ "requirement_reason": { "type": ["string", "null"] },
424
+ "evidence": { "$ref": "#/$defs/evidenceCoverageLinks" }
425
+ }
426
+ },
427
+ "evidenceCoverageLinks": {
428
+ "type": "object",
429
+ "additionalProperties": false,
430
+ "required": ["intents", "receipt_paths", "gap_reasons", "source_anchor_ids"],
431
+ "properties": {
432
+ "intents": {
433
+ "type": "array",
434
+ "items": { "type": "string" }
435
+ },
436
+ "receipt_paths": {
437
+ "type": "array",
438
+ "items": { "type": "string" }
439
+ },
440
+ "gap_reasons": {
441
+ "type": "array",
442
+ "items": { "type": "string" }
443
+ },
444
+ "source_anchor_ids": {
445
+ "type": "array",
446
+ "items": { "type": "string" }
447
+ }
448
+ }
449
+ },
450
+ "evidenceReceipt": {
451
+ "type": "object",
452
+ "additionalProperties": false,
453
+ "required": ["intent", "status", "skipped", "verification_plan_id", "receipt_path", "receipt_sha256"],
454
+ "properties": {
455
+ "intent": { "type": ["string", "null"] },
456
+ "status": { "type": "string" },
457
+ "skipped": { "type": "boolean" },
458
+ "verification_plan_id": {
459
+ "type": ["string", "null"],
460
+ "pattern": "^sha256:[0-9a-f]{64}$"
461
+ },
462
+ "receipt_path": { "type": ["string", "null"] },
463
+ "receipt_sha256": {
464
+ "type": ["string", "null"],
465
+ "pattern": "^sha256:[0-9a-f]{64}$"
466
+ }
467
+ }
468
+ },
469
+ "evidenceSkippedCheck": {
470
+ "type": "object",
471
+ "additionalProperties": false,
472
+ "required": ["intent", "reason", "detail"],
473
+ "properties": {
474
+ "intent": { "type": ["string", "null"] },
475
+ "reason": { "type": ["string", "null"] },
476
+ "detail": { "type": ["string", "null"] }
477
+ }
478
+ },
479
+ "evidenceGap": {
480
+ "type": "object",
481
+ "additionalProperties": false,
482
+ "required": ["reason", "intent", "status", "detail", "files", "surfaces"],
483
+ "properties": {
484
+ "reason": { "type": ["string", "null"] },
485
+ "intent": { "type": ["string", "null"] },
486
+ "status": { "type": ["string", "null"] },
487
+ "detail": { "type": ["string", "null"] },
488
+ "files": {
489
+ "type": "array",
490
+ "items": { "type": "string" }
491
+ },
492
+ "surfaces": {
493
+ "type": "array",
494
+ "items": { "type": "string" }
495
+ }
496
+ }
497
+ },
498
+ "evidenceRemainingRisk": {
499
+ "type": "object",
500
+ "additionalProperties": false,
501
+ "required": ["code", "severity", "detail"],
502
+ "properties": {
503
+ "code": { "type": "string" },
504
+ "severity": { "type": "string" },
505
+ "detail": { "type": "string" }
506
+ }
507
+ },
508
+ "reproEvidence": {
509
+ "type": "object",
510
+ "additionalProperties": false,
511
+ "required": [
512
+ "source",
513
+ "authority",
514
+ "reported_symptom",
515
+ "expected_behavior",
516
+ "observed_behavior",
517
+ "reproduction_route",
518
+ "before_fix",
519
+ "after_fix",
520
+ "regression_guard"
521
+ ],
522
+ "properties": {
523
+ "source": { "const": "repro_first_debug" },
524
+ "authority": { "const": "claim_evidence" },
525
+ "reported_symptom": { "type": ["string", "null"] },
526
+ "expected_behavior": { "type": ["string", "null"] },
527
+ "observed_behavior": { "type": ["string", "null"] },
528
+ "reproduction_route": { "$ref": "#/$defs/reproRouteIdentity" },
529
+ "before_fix": { "$ref": "#/$defs/reproBeforeFixEvidence" },
530
+ "after_fix": { "$ref": "#/$defs/reproAfterFixEvidence" },
531
+ "regression_guard": { "$ref": "#/$defs/reproRegressionGuardEvidence" }
532
+ }
533
+ },
534
+ "reproRouteIdentity": {
535
+ "type": "object",
536
+ "additionalProperties": false,
537
+ "required": ["route_id", "route_kind", "route_digest", "failure_oracle_hash", "steps"],
538
+ "properties": {
539
+ "route_id": { "type": ["string", "null"] },
540
+ "route_kind": { "enum": ["test", "cli", "browser", "api", "manual", "unknown", null] },
541
+ "route_digest": { "type": ["string", "null"] },
542
+ "failure_oracle_hash": { "type": ["string", "null"] },
543
+ "steps": {
544
+ "type": "array",
545
+ "items": { "$ref": "#/$defs/reproRouteStep" }
546
+ }
547
+ }
548
+ },
549
+ "reproRouteStep": {
550
+ "type": "object",
551
+ "additionalProperties": false,
552
+ "required": ["ordinal", "action", "target", "input_digest", "observation_digest", "summary"],
553
+ "properties": {
554
+ "ordinal": { "type": "integer", "minimum": 1 },
555
+ "action": { "type": ["string", "null"] },
556
+ "target": { "type": ["string", "null"] },
557
+ "input_digest": { "type": ["string", "null"] },
558
+ "observation_digest": { "type": ["string", "null"] },
559
+ "summary": { "type": ["string", "null"] }
560
+ }
561
+ },
562
+ "reproBeforeFixEvidence": {
563
+ "type": "object",
564
+ "additionalProperties": false,
565
+ "required": ["status", "outcome", "receipt_path", "receipt_sha256", "verification_plan_id", "summary", "reason"],
566
+ "properties": {
567
+ "status": { "enum": ["reproduced", "unavailable", "missing"] },
568
+ "outcome": { "enum": ["failed_as_expected", "failed_differently", "passed_unexpectedly", null] },
569
+ "receipt_path": { "type": ["string", "null"] },
570
+ "receipt_sha256": { "type": ["string", "null"] },
571
+ "verification_plan_id": { "type": ["string", "null"] },
572
+ "summary": { "type": ["string", "null"] },
573
+ "reason": { "type": ["string", "null"] }
574
+ }
575
+ },
576
+ "reproAfterFixEvidence": {
577
+ "type": "object",
578
+ "additionalProperties": false,
579
+ "required": ["status", "outcome", "same_route_as", "receipt_path", "receipt_sha256", "verification_plan_id", "summary", "reason"],
580
+ "properties": {
581
+ "status": { "enum": ["passed", "failed", "unavailable", "missing"] },
582
+ "outcome": { "enum": ["passed_expected_behavior", "failed_same_route", "failed_differently", null] },
583
+ "same_route_as": { "type": ["string", "null"] },
584
+ "receipt_path": { "type": ["string", "null"] },
585
+ "receipt_sha256": { "type": ["string", "null"] },
586
+ "verification_plan_id": { "type": ["string", "null"] },
587
+ "summary": { "type": ["string", "null"] },
588
+ "reason": { "type": ["string", "null"] }
589
+ }
590
+ },
591
+ "reproRegressionGuardEvidence": {
592
+ "type": "object",
593
+ "additionalProperties": false,
594
+ "required": ["status", "intent", "test_path", "receipt_path", "receipt_sha256", "verification_plan_id", "summary", "reason"],
595
+ "properties": {
596
+ "status": { "enum": ["passed", "failed", "unavailable", "missing"] },
597
+ "intent": { "type": ["string", "null"] },
598
+ "test_path": { "type": ["string", "null"] },
599
+ "receipt_path": { "type": ["string", "null"] },
600
+ "receipt_sha256": { "type": ["string", "null"] },
601
+ "verification_plan_id": { "type": ["string", "null"] },
602
+ "summary": { "type": ["string", "null"] },
603
+ "reason": { "type": ["string", "null"] }
604
+ }
605
+ },
606
+ "externalCheck": {
607
+ "type": "object",
608
+ "additionalProperties": false,
609
+ "required": ["source", "authority", "provider", "name", "status", "url", "summary"],
610
+ "properties": {
611
+ "source": { "const": "external_ci" },
612
+ "authority": { "const": "supporting_only" },
613
+ "provider": { "type": "string", "minLength": 1 },
614
+ "name": { "type": "string", "minLength": 1 },
615
+ "status": { "enum": ["passed", "failed", "cancelled", "unknown"] },
616
+ "url": { "type": ["string", "null"] },
617
+ "summary": { "type": ["string", "null"] }
618
+ }
619
+ },
620
+ "evidenceExplanation": {
621
+ "type": "object",
622
+ "additionalProperties": false,
623
+ "required": ["verified_by", "downgraded_by", "blocked_by", "contradicted_by"],
624
+ "properties": {
625
+ "verified_by": {
626
+ "type": "array",
627
+ "items": { "type": "string" }
628
+ },
629
+ "downgraded_by": {
630
+ "type": "array",
631
+ "items": { "type": "string" }
632
+ },
633
+ "blocked_by": {
634
+ "type": "array",
635
+ "items": { "type": "string" }
636
+ },
637
+ "contradicted_by": {
638
+ "type": "array",
639
+ "items": { "type": "string" }
63
640
  }
64
641
  }
65
642
  }