@agent-delivery-harness/conformance 0.1.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 (101) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +159 -0
  4. package/fixtures/repo-config-adapter.ts +250 -0
  5. package/package.json +24 -0
  6. package/src/generate.ts +1013 -0
  7. package/src/index.ts +36 -0
  8. package/src/json-schema.ts +222 -0
  9. package/src/runner.ts +687 -0
  10. package/vectors/context/environment.json +21 -0
  11. package/vectors/context/repo-config.json +22 -0
  12. package/vectors/kit.json +1250 -0
  13. package/vectors/vectors/accept/a-completed-order-differs.json +112 -0
  14. package/vectors/vectors/accept/a-cost-fractional.json +116 -0
  15. package/vectors/vectors/accept/a-cost-tokens.json +120 -0
  16. package/vectors/vectors/accept/a-deferred-expansion.json +124 -0
  17. package/vectors/vectors/accept/a-idempotent-resubmission.json +115 -0
  18. package/vectors/vectors/accept/a-minimal-green.json +97 -0
  19. package/vectors/vectors/accept/a-resolved-and-advisory.json +129 -0
  20. package/vectors/vectors/accept/a-three-reviewers.json +113 -0
  21. package/vectors/vectors/reject/env-1-unregistered-provider.json +114 -0
  22. package/vectors/vectors/reject/env-10-artifact-duplicate.json +103 -0
  23. package/vectors/vectors/reject/env-10-artifact-missing-file.json +104 -0
  24. package/vectors/vectors/reject/env-10-artifact-traversal.json +99 -0
  25. package/vectors/vectors/reject/env-11-artifact-digest-mismatch.json +98 -0
  26. package/vectors/vectors/reject/env-12-unknown-attestation-level.json +114 -0
  27. package/vectors/vectors/reject/env-13-nonempty-signatures.json +118 -0
  28. package/vectors/vectors/reject/env-14-duplicate-claim.json +149 -0
  29. package/vectors/vectors/reject/env-14-no-claims.json +78 -0
  30. package/vectors/vectors/reject/env-14-unconfigured-obligation.json +114 -0
  31. package/vectors/vectors/reject/env-14-unsupported-payload-spec.json +114 -0
  32. package/vectors/vectors/reject/env-2-run-id-1.json +114 -0
  33. package/vectors/vectors/reject/env-2-run-id-2.json +114 -0
  34. package/vectors/vectors/reject/env-2-run-id-3.json +114 -0
  35. package/vectors/vectors/reject/env-2-run-id-4.json +114 -0
  36. package/vectors/vectors/reject/env-2-run-id-5.json +114 -0
  37. package/vectors/vectors/reject/env-4-unsupported-vcs.json +114 -0
  38. package/vectors/vectors/reject/env-5-malformed-object-id.json +114 -0
  39. package/vectors/vectors/reject/env-6-missing-identity.json +111 -0
  40. package/vectors/vectors/reject/env-6-unknown-identity-version.json +114 -0
  41. package/vectors/vectors/reject/env-8-repository-required.json +116 -0
  42. package/vectors/vectors/reject/env-9-empty-run-history.json +107 -0
  43. package/vectors/vectors/reject/env-9-final-pass-mismatch.json +110 -0
  44. package/vectors/vectors/reject/env-9-final-tree-mismatch.json +110 -0
  45. package/vectors/vectors/reject/gen-1-legacy-count-field.json +115 -0
  46. package/vectors/vectors/reject/gen-1-unknown-envelope-member.json +117 -0
  47. package/vectors/vectors/reject/gen-2-unsupported-spec.json +114 -0
  48. package/vectors/vectors/reject/rg-1-edited-after-final-pass.json +114 -0
  49. package/vectors/vectors/reject/rg-1-not-finalized.json +114 -0
  50. package/vectors/vectors/reject/rg-1-verdict-not-green.json +114 -0
  51. package/vectors/vectors/reject/rg-10-cost-by-reviewer-exceeds-total.json +115 -0
  52. package/vectors/vectors/reject/rg-10-cost-empty-reported-by.json +111 -0
  53. package/vectors/vectors/reject/rg-10-cost-empty-unit.json +111 -0
  54. package/vectors/vectors/reject/rg-10-cost-missing-unit.json +110 -0
  55. package/vectors/vectors/reject/rg-10-cost-negative-by-reviewer.json +114 -0
  56. package/vectors/vectors/reject/rg-10-cost-negative-total.json +111 -0
  57. package/vectors/vectors/reject/rg-10-cost-null-total.json +111 -0
  58. package/vectors/vectors/reject/rg-10-cost-unknown-reviewer-in-breakdown.json +114 -0
  59. package/vectors/vectors/reject/rg-2-duplicate-selected.json +99 -0
  60. package/vectors/vectors/reject/rg-3-completed-missing.json +96 -0
  61. package/vectors/vectors/reject/rg-3-completed-unrelated.json +99 -0
  62. package/vectors/vectors/reject/rg-3-failed-reviewer.json +100 -0
  63. package/vectors/vectors/reject/rg-3-timed-out-reviewer.json +100 -0
  64. package/vectors/vectors/reject/rg-4-approval-extra.json +104 -0
  65. package/vectors/vectors/reject/rg-4-approval-malformed.json +98 -0
  66. package/vectors/vectors/reject/rg-4-approval-missing.json +100 -0
  67. package/vectors/vectors/reject/rg-4-approval-not-approved.json +98 -0
  68. package/vectors/vectors/reject/rg-4-approval-wrong-candidate.json +98 -0
  69. package/vectors/vectors/reject/rg-4-approval-wrong-pass.json +98 -0
  70. package/vectors/vectors/reject/rg-4-approval-wrong-provider.json +98 -0
  71. package/vectors/vectors/reject/rg-4-approval-wrong-reviewer.json +98 -0
  72. package/vectors/vectors/reject/rg-4-approval-wrong-run.json +98 -0
  73. package/vectors/vectors/reject/rg-4-approval-wrong-workspace.json +98 -0
  74. package/vectors/vectors/reject/rg-5-duplicate-finding-id.json +131 -0
  75. package/vectors/vectors/reject/rg-5-unknown-disposition.json +123 -0
  76. package/vectors/vectors/reject/rg-5-unknown-scope.json +123 -0
  77. package/vectors/vectors/reject/rg-5-unknown-severity.json +123 -0
  78. package/vectors/vectors/reject/rg-6-actionable-ignored.json +123 -0
  79. package/vectors/vectors/reject/rg-6-actionable-unresolved.json +123 -0
  80. package/vectors/vectors/reject/rg-6-blocking-finding.json +123 -0
  81. package/vectors/vectors/reject/rg-7-defer-adjacent.json +126 -0
  82. package/vectors/vectors/reject/rg-7-defer-blocking.json +126 -0
  83. package/vectors/vectors/reject/rg-7-defer-in-contract.json +126 -0
  84. package/vectors/vectors/reject/rg-7-defer-lowercase-issue-id.json +126 -0
  85. package/vectors/vectors/reject/rg-7-defer-missing-issue-id.json +125 -0
  86. package/vectors/vectors/reject/rg-7-defer-non-actionable.json +126 -0
  87. package/vectors/vectors/reject/rg-7-defer-p0.json +126 -0
  88. package/vectors/vectors/reject/rg-7-defer-p1.json +126 -0
  89. package/vectors/vectors/reject/rg-7-defer-placeholder-issue-id.json +126 -0
  90. package/vectors/vectors/reject/rg-7-issue-id-on-resolved.json +124 -0
  91. package/vectors/vectors/reject/rg-8-counts-contradict-findings.json +126 -0
  92. package/vectors/vectors/reject/rg-8-deferral-count-disagrees.json +124 -0
  93. package/vectors/vectors/reject/rg-8-deferral-ids-disagree.json +126 -0
  94. package/vectors/vectors/reject/rg-9-iteration-count-mismatch.json +114 -0
  95. package/vectors/vectors/reject/sub-1-base-tip-moved.json +131 -0
  96. package/vectors/vectors/reject/sub-1-deliverable-changed.json +131 -0
  97. package/vectors/vectors/reject/sub-1-merge-base-moved.json +131 -0
  98. package/vectors/vectors/reject/sub-1-raw-tree-changed.json +131 -0
  99. package/vectors/vectors/reject/sub-2-unprepared.json +117 -0
  100. package/vectors/vectors/reject/sub-3-manifest-outside-run-root.json +117 -0
  101. package/vectors/vectors/reject/sub-4-record-conflict.json +220 -0
@@ -0,0 +1,1250 @@
1
+ {
2
+ "kit": "delivery-evidence-conformance/1",
3
+ "spec": "delivery-evidence/1",
4
+ "payloadSpecs": [
5
+ "review.green/1"
6
+ ],
7
+ "counts": {
8
+ "total": 89,
9
+ "accept": 8,
10
+ "reject": 81
11
+ },
12
+ "vectors": [
13
+ {
14
+ "id": "a-minimal-green",
15
+ "file": "vectors/accept/a-minimal-green.json",
16
+ "title": "Minimal green manifest with one reviewer",
17
+ "rules": [
18
+ "GEN-2",
19
+ "ENV-9",
20
+ "RG-1"
21
+ ],
22
+ "expect": {
23
+ "result": "accepted"
24
+ }
25
+ },
26
+ {
27
+ "id": "a-three-reviewers",
28
+ "file": "vectors/accept/a-three-reviewers.json",
29
+ "title": "Green manifest with a three-reviewer set",
30
+ "rules": [
31
+ "RG-2",
32
+ "RG-3",
33
+ "RG-4"
34
+ ],
35
+ "expect": {
36
+ "result": "accepted"
37
+ }
38
+ },
39
+ {
40
+ "id": "a-completed-order-differs",
41
+ "file": "vectors/accept/a-completed-order-differs.json",
42
+ "title": "completed lists the same reviewers in a different order",
43
+ "rules": [
44
+ "RG-3"
45
+ ],
46
+ "expect": {
47
+ "result": "accepted",
48
+ "notes": "Set equality, not sequence equality."
49
+ }
50
+ },
51
+ {
52
+ "id": "a-deferred-expansion",
53
+ "file": "vectors/accept/a-deferred-expansion.json",
54
+ "title": "Deferred P2 expansion finding with a tracker id and matching telemetry",
55
+ "rules": [
56
+ "RG-7",
57
+ "RG-8"
58
+ ],
59
+ "expect": {
60
+ "result": "accepted"
61
+ }
62
+ },
63
+ {
64
+ "id": "a-resolved-and-advisory",
65
+ "file": "vectors/accept/a-resolved-and-advisory.json",
66
+ "title": "Resolved P1 and advisory non-actionable finding",
67
+ "rules": [
68
+ "RG-5",
69
+ "RG-6"
70
+ ],
71
+ "expect": {
72
+ "result": "accepted"
73
+ }
74
+ },
75
+ {
76
+ "id": "a-cost-tokens",
77
+ "file": "vectors/accept/a-cost-tokens.json",
78
+ "title": "Self-reported token cost with per-reviewer breakdown summing below total",
79
+ "rules": [
80
+ "RG-10"
81
+ ],
82
+ "expect": {
83
+ "result": "accepted"
84
+ }
85
+ },
86
+ {
87
+ "id": "a-cost-fractional",
88
+ "file": "vectors/accept/a-cost-fractional.json",
89
+ "title": "Fractional cost units from a platform's own metering",
90
+ "rules": [
91
+ "RG-10"
92
+ ],
93
+ "expect": {
94
+ "result": "accepted"
95
+ }
96
+ },
97
+ {
98
+ "id": "a-idempotent-resubmission",
99
+ "file": "vectors/accept/a-idempotent-resubmission.json",
100
+ "title": "Identical resubmission is an idempotent success with the same record ids",
101
+ "rules": [
102
+ "SUB-4"
103
+ ],
104
+ "expect": {
105
+ "result": "accepted",
106
+ "notes": "Submit twice; both succeed and record ids are identical across submissions."
107
+ }
108
+ },
109
+ {
110
+ "id": "gen-1-unknown-envelope-member",
111
+ "file": "vectors/reject/gen-1-unknown-envelope-member.json",
112
+ "title": "Unknown member at the envelope root",
113
+ "rules": [
114
+ "GEN-1"
115
+ ],
116
+ "expect": {
117
+ "result": "rejected",
118
+ "codes": [
119
+ "unknown_member"
120
+ ]
121
+ }
122
+ },
123
+ {
124
+ "id": "gen-1-legacy-count-field",
125
+ "file": "vectors/reject/gen-1-legacy-count-field.json",
126
+ "title": "Legacy summary-count field from the pre-spec contract",
127
+ "rules": [
128
+ "GEN-1"
129
+ ],
130
+ "expect": {
131
+ "result": "rejected",
132
+ "codes": [
133
+ "unknown_member"
134
+ ]
135
+ }
136
+ },
137
+ {
138
+ "id": "gen-2-unsupported-spec",
139
+ "file": "vectors/reject/gen-2-unsupported-spec.json",
140
+ "title": "Unsupported envelope spec version",
141
+ "rules": [
142
+ "GEN-2"
143
+ ],
144
+ "expect": {
145
+ "result": "rejected",
146
+ "codes": [
147
+ "unsupported_envelope_spec"
148
+ ]
149
+ }
150
+ },
151
+ {
152
+ "id": "env-1-unregistered-provider",
153
+ "file": "vectors/reject/env-1-unregistered-provider.json",
154
+ "title": "Provider not registered for the claimed obligation",
155
+ "rules": [
156
+ "ENV-1"
157
+ ],
158
+ "expect": {
159
+ "result": "rejected",
160
+ "codes": [
161
+ "unregistered_provider"
162
+ ]
163
+ }
164
+ },
165
+ {
166
+ "id": "env-2-run-id-1",
167
+ "file": "vectors/reject/env-2-run-id-1.json",
168
+ "title": "Unsafe or non-single-component run id \"../run-a\"",
169
+ "rules": [
170
+ "ENV-2"
171
+ ],
172
+ "expect": {
173
+ "result": "rejected",
174
+ "codes": [
175
+ "invalid_run_id"
176
+ ]
177
+ }
178
+ },
179
+ {
180
+ "id": "env-2-run-id-2",
181
+ "file": "vectors/reject/env-2-run-id-2.json",
182
+ "title": "Unsafe or non-single-component run id \"nested/run-a\"",
183
+ "rules": [
184
+ "ENV-2"
185
+ ],
186
+ "expect": {
187
+ "result": "rejected",
188
+ "codes": [
189
+ "invalid_run_id"
190
+ ]
191
+ }
192
+ },
193
+ {
194
+ "id": "env-2-run-id-3",
195
+ "file": "vectors/reject/env-2-run-id-3.json",
196
+ "title": "Unsafe or non-single-component run id \"nested\\\\run-a\"",
197
+ "rules": [
198
+ "ENV-2"
199
+ ],
200
+ "expect": {
201
+ "result": "rejected",
202
+ "codes": [
203
+ "invalid_run_id"
204
+ ]
205
+ }
206
+ },
207
+ {
208
+ "id": "env-2-run-id-4",
209
+ "file": "vectors/reject/env-2-run-id-4.json",
210
+ "title": "Unsafe or non-single-component run id \".\"",
211
+ "rules": [
212
+ "ENV-2"
213
+ ],
214
+ "expect": {
215
+ "result": "rejected",
216
+ "codes": [
217
+ "invalid_run_id"
218
+ ]
219
+ }
220
+ },
221
+ {
222
+ "id": "env-2-run-id-5",
223
+ "file": "vectors/reject/env-2-run-id-5.json",
224
+ "title": "Unsafe or non-single-component run id \"..\"",
225
+ "rules": [
226
+ "ENV-2"
227
+ ],
228
+ "expect": {
229
+ "result": "rejected",
230
+ "codes": [
231
+ "invalid_run_id"
232
+ ]
233
+ }
234
+ },
235
+ {
236
+ "id": "env-4-unsupported-vcs",
237
+ "file": "vectors/reject/env-4-unsupported-vcs.json",
238
+ "title": "Non-git vcs value",
239
+ "rules": [
240
+ "ENV-4"
241
+ ],
242
+ "expect": {
243
+ "result": "rejected",
244
+ "codes": [
245
+ "unsupported_vcs"
246
+ ]
247
+ }
248
+ },
249
+ {
250
+ "id": "env-5-malformed-object-id",
251
+ "file": "vectors/reject/env-5-malformed-object-id.json",
252
+ "title": "treeSha that is not a 40-hex git object id",
253
+ "rules": [
254
+ "ENV-5"
255
+ ],
256
+ "expect": {
257
+ "result": "rejected",
258
+ "codes": [
259
+ "invalid_object_id"
260
+ ]
261
+ }
262
+ },
263
+ {
264
+ "id": "env-6-unknown-identity-version",
265
+ "file": "vectors/reject/env-6-unknown-identity-version.json",
266
+ "title": "Unknown deliverable identity version fails closed",
267
+ "rules": [
268
+ "ENV-6"
269
+ ],
270
+ "expect": {
271
+ "result": "rejected",
272
+ "codes": [
273
+ "unsupported_identity_version"
274
+ ]
275
+ }
276
+ },
277
+ {
278
+ "id": "env-6-missing-identity",
279
+ "file": "vectors/reject/env-6-missing-identity.json",
280
+ "title": "Candidate missing the deliverable identity block",
281
+ "rules": [
282
+ "ENV-6",
283
+ "GEN-4"
284
+ ],
285
+ "expect": {
286
+ "result": "rejected",
287
+ "codes": [
288
+ "malformed_field"
289
+ ]
290
+ }
291
+ },
292
+ {
293
+ "id": "env-8-repository-required",
294
+ "file": "vectors/reject/env-8-repository-required.json",
295
+ "title": "provider-signed attestation without a repository identifier",
296
+ "rules": [
297
+ "ENV-8",
298
+ "ENV-13"
299
+ ],
300
+ "expect": {
301
+ "result": "rejected",
302
+ "codes": [
303
+ "repository_required",
304
+ "unsupported_attestation"
305
+ ]
306
+ }
307
+ },
308
+ {
309
+ "id": "env-9-final-pass-mismatch",
310
+ "file": "vectors/reject/env-9-final-pass-mismatch.json",
311
+ "title": "runHistory's final entry names an earlier pass",
312
+ "rules": [
313
+ "ENV-9"
314
+ ],
315
+ "expect": {
316
+ "result": "rejected",
317
+ "codes": [
318
+ "run_history_final_mismatch"
319
+ ]
320
+ }
321
+ },
322
+ {
323
+ "id": "env-9-final-tree-mismatch",
324
+ "file": "vectors/reject/env-9-final-tree-mismatch.json",
325
+ "title": "runHistory's final entry names an earlier tree",
326
+ "rules": [
327
+ "ENV-9"
328
+ ],
329
+ "expect": {
330
+ "result": "rejected",
331
+ "codes": [
332
+ "run_history_final_mismatch"
333
+ ]
334
+ }
335
+ },
336
+ {
337
+ "id": "env-9-empty-run-history",
338
+ "file": "vectors/reject/env-9-empty-run-history.json",
339
+ "title": "Empty runHistory",
340
+ "rules": [
341
+ "ENV-9",
342
+ "RG-9"
343
+ ],
344
+ "expect": {
345
+ "result": "rejected",
346
+ "codes": [
347
+ "run_history_final_mismatch",
348
+ "iteration_count_mismatch"
349
+ ]
350
+ }
351
+ },
352
+ {
353
+ "id": "env-10-artifact-traversal",
354
+ "file": "vectors/reject/env-10-artifact-traversal.json",
355
+ "title": "Artifact path traversing outside the run root",
356
+ "rules": [
357
+ "ENV-10"
358
+ ],
359
+ "expect": {
360
+ "result": "rejected",
361
+ "codes": [
362
+ "artifact_path_invalid"
363
+ ]
364
+ }
365
+ },
366
+ {
367
+ "id": "env-10-artifact-duplicate",
368
+ "file": "vectors/reject/env-10-artifact-duplicate.json",
369
+ "title": "Duplicate artifact path entries",
370
+ "rules": [
371
+ "ENV-10"
372
+ ],
373
+ "expect": {
374
+ "result": "rejected",
375
+ "codes": [
376
+ "artifact_path_duplicate"
377
+ ]
378
+ }
379
+ },
380
+ {
381
+ "id": "env-10-artifact-missing-file",
382
+ "file": "vectors/reject/env-10-artifact-missing-file.json",
383
+ "title": "Artifact entry whose file does not exist in the run root",
384
+ "rules": [
385
+ "ENV-10",
386
+ "ENV-11"
387
+ ],
388
+ "expect": {
389
+ "result": "rejected",
390
+ "codes": [
391
+ "artifact_digest_mismatch"
392
+ ]
393
+ }
394
+ },
395
+ {
396
+ "id": "env-11-artifact-digest-mismatch",
397
+ "file": "vectors/reject/env-11-artifact-digest-mismatch.json",
398
+ "title": "Artifact digest that does not match the file bytes",
399
+ "rules": [
400
+ "ENV-11"
401
+ ],
402
+ "expect": {
403
+ "result": "rejected",
404
+ "codes": [
405
+ "artifact_digest_mismatch"
406
+ ]
407
+ }
408
+ },
409
+ {
410
+ "id": "env-12-unknown-attestation-level",
411
+ "file": "vectors/reject/env-12-unknown-attestation-level.json",
412
+ "title": "Unknown attestation level",
413
+ "rules": [
414
+ "ENV-12"
415
+ ],
416
+ "expect": {
417
+ "result": "rejected",
418
+ "codes": [
419
+ "unsupported_attestation"
420
+ ]
421
+ }
422
+ },
423
+ {
424
+ "id": "env-13-nonempty-signatures",
425
+ "file": "vectors/reject/env-13-nonempty-signatures.json",
426
+ "title": "Non-empty signatures array before a signing profile exists",
427
+ "rules": [
428
+ "ENV-13"
429
+ ],
430
+ "expect": {
431
+ "result": "rejected",
432
+ "codes": [
433
+ "unsupported_attestation"
434
+ ]
435
+ }
436
+ },
437
+ {
438
+ "id": "env-14-no-claims",
439
+ "file": "vectors/reject/env-14-no-claims.json",
440
+ "title": "Empty claims array",
441
+ "rules": [
442
+ "ENV-14"
443
+ ],
444
+ "expect": {
445
+ "result": "rejected",
446
+ "codes": [
447
+ "no_claims"
448
+ ]
449
+ }
450
+ },
451
+ {
452
+ "id": "env-14-duplicate-claim",
453
+ "file": "vectors/reject/env-14-duplicate-claim.json",
454
+ "title": "Two claims for the same obligation",
455
+ "rules": [
456
+ "ENV-14"
457
+ ],
458
+ "expect": {
459
+ "result": "rejected",
460
+ "codes": [
461
+ "duplicate_claim"
462
+ ]
463
+ }
464
+ },
465
+ {
466
+ "id": "env-14-unconfigured-obligation",
467
+ "file": "vectors/reject/env-14-unconfigured-obligation.json",
468
+ "title": "Claim for an obligation the repository has not configured",
469
+ "rules": [
470
+ "ENV-14"
471
+ ],
472
+ "expect": {
473
+ "result": "rejected",
474
+ "codes": [
475
+ "obligation_not_configured"
476
+ ]
477
+ }
478
+ },
479
+ {
480
+ "id": "env-14-unsupported-payload-spec",
481
+ "file": "vectors/reject/env-14-unsupported-payload-spec.json",
482
+ "title": "Payload spec version the repository does not accept",
483
+ "rules": [
484
+ "ENV-14"
485
+ ],
486
+ "expect": {
487
+ "result": "rejected",
488
+ "codes": [
489
+ "unsupported_payload_spec"
490
+ ]
491
+ }
492
+ },
493
+ {
494
+ "id": "sub-1-deliverable-changed",
495
+ "file": "vectors/reject/sub-1-deliverable-changed.json",
496
+ "title": "Current candidate no longer matches: deliverable changed after review",
497
+ "rules": [
498
+ "SUB-1"
499
+ ],
500
+ "expect": {
501
+ "result": "rejected",
502
+ "codes": [
503
+ "candidate_mismatch"
504
+ ]
505
+ }
506
+ },
507
+ {
508
+ "id": "sub-1-raw-tree-changed",
509
+ "file": "vectors/reject/sub-1-raw-tree-changed.json",
510
+ "title": "Current candidate no longer matches: raw tree changed after review",
511
+ "rules": [
512
+ "SUB-1"
513
+ ],
514
+ "expect": {
515
+ "result": "rejected",
516
+ "codes": [
517
+ "candidate_mismatch"
518
+ ]
519
+ }
520
+ },
521
+ {
522
+ "id": "sub-1-base-tip-moved",
523
+ "file": "vectors/reject/sub-1-base-tip-moved.json",
524
+ "title": "Current candidate no longer matches: base tip changed after review",
525
+ "rules": [
526
+ "SUB-1"
527
+ ],
528
+ "expect": {
529
+ "result": "rejected",
530
+ "codes": [
531
+ "candidate_mismatch"
532
+ ]
533
+ }
534
+ },
535
+ {
536
+ "id": "sub-1-merge-base-moved",
537
+ "file": "vectors/reject/sub-1-merge-base-moved.json",
538
+ "title": "Current candidate no longer matches: merge base changed after review",
539
+ "rules": [
540
+ "SUB-1"
541
+ ],
542
+ "expect": {
543
+ "result": "rejected",
544
+ "codes": [
545
+ "candidate_mismatch"
546
+ ]
547
+ }
548
+ },
549
+ {
550
+ "id": "sub-2-unprepared",
551
+ "file": "vectors/reject/sub-2-unprepared.json",
552
+ "title": "Submission without a current preparation (dirty or unprepared tree)",
553
+ "rules": [
554
+ "SUB-2"
555
+ ],
556
+ "expect": {
557
+ "result": "rejected",
558
+ "codes": [
559
+ "candidate_unprepared"
560
+ ]
561
+ }
562
+ },
563
+ {
564
+ "id": "sub-3-manifest-outside-run-root",
565
+ "file": "vectors/reject/sub-3-manifest-outside-run-root.json",
566
+ "title": "Manifest copied outside the recorder-allocated run root",
567
+ "rules": [
568
+ "SUB-3"
569
+ ],
570
+ "expect": {
571
+ "result": "rejected",
572
+ "codes": [
573
+ "manifest_outside_run_root"
574
+ ]
575
+ }
576
+ },
577
+ {
578
+ "id": "sub-4-record-conflict",
579
+ "file": "vectors/reject/sub-4-record-conflict.json",
580
+ "title": "Resubmission with identical record identity but different content",
581
+ "rules": [
582
+ "SUB-4"
583
+ ],
584
+ "expect": {
585
+ "result": "rejected",
586
+ "codes": [
587
+ "record_conflict"
588
+ ]
589
+ }
590
+ },
591
+ {
592
+ "id": "rg-1-verdict-not-green",
593
+ "file": "vectors/reject/rg-1-verdict-not-green.json",
594
+ "title": "Non-green verdict",
595
+ "rules": [
596
+ "RG-1"
597
+ ],
598
+ "expect": {
599
+ "result": "rejected",
600
+ "codes": [
601
+ "verdict_not_green"
602
+ ]
603
+ }
604
+ },
605
+ {
606
+ "id": "rg-1-not-finalized",
607
+ "file": "vectors/reject/rg-1-not-finalized.json",
608
+ "title": "Unfinalized manifest",
609
+ "rules": [
610
+ "RG-1"
611
+ ],
612
+ "expect": {
613
+ "result": "rejected",
614
+ "codes": [
615
+ "not_finalized"
616
+ ]
617
+ }
618
+ },
619
+ {
620
+ "id": "rg-1-edited-after-final-pass",
621
+ "file": "vectors/reject/rg-1-edited-after-final-pass.json",
622
+ "title": "Post-final-pass edits admitted by the provider",
623
+ "rules": [
624
+ "RG-1"
625
+ ],
626
+ "expect": {
627
+ "result": "rejected",
628
+ "codes": [
629
+ "edited_after_final_pass"
630
+ ]
631
+ }
632
+ },
633
+ {
634
+ "id": "rg-2-duplicate-selected",
635
+ "file": "vectors/reject/rg-2-duplicate-selected.json",
636
+ "title": "Duplicate reviewer in selected",
637
+ "rules": [
638
+ "RG-2"
639
+ ],
640
+ "expect": {
641
+ "result": "rejected",
642
+ "codes": [
643
+ "reviewer_set_invalid"
644
+ ]
645
+ }
646
+ },
647
+ {
648
+ "id": "rg-3-completed-missing",
649
+ "file": "vectors/reject/rg-3-completed-missing.json",
650
+ "title": "Selected reviewer missing from completed",
651
+ "rules": [
652
+ "RG-3"
653
+ ],
654
+ "expect": {
655
+ "result": "rejected",
656
+ "codes": [
657
+ "reviewer_set_incomplete"
658
+ ]
659
+ }
660
+ },
661
+ {
662
+ "id": "rg-3-completed-unrelated",
663
+ "file": "vectors/reject/rg-3-completed-unrelated.json",
664
+ "title": "Completed reviewer never selected",
665
+ "rules": [
666
+ "RG-3"
667
+ ],
668
+ "expect": {
669
+ "result": "rejected",
670
+ "codes": [
671
+ "reviewer_set_incomplete"
672
+ ]
673
+ }
674
+ },
675
+ {
676
+ "id": "rg-3-failed-reviewer",
677
+ "file": "vectors/reject/rg-3-failed-reviewer.json",
678
+ "title": "A failed reviewer in a green manifest",
679
+ "rules": [
680
+ "RG-3"
681
+ ],
682
+ "expect": {
683
+ "result": "rejected",
684
+ "codes": [
685
+ "reviewer_set_incomplete"
686
+ ]
687
+ }
688
+ },
689
+ {
690
+ "id": "rg-3-timed-out-reviewer",
691
+ "file": "vectors/reject/rg-3-timed-out-reviewer.json",
692
+ "title": "A timed-out reviewer in a green manifest",
693
+ "rules": [
694
+ "RG-3"
695
+ ],
696
+ "expect": {
697
+ "result": "rejected",
698
+ "codes": [
699
+ "reviewer_set_incomplete"
700
+ ]
701
+ }
702
+ },
703
+ {
704
+ "id": "rg-4-approval-missing",
705
+ "file": "vectors/reject/rg-4-approval-missing.json",
706
+ "title": "Selected reviewer with no reviewer-approval artifact",
707
+ "rules": [
708
+ "RG-4"
709
+ ],
710
+ "expect": {
711
+ "result": "rejected",
712
+ "codes": [
713
+ "approval_missing"
714
+ ]
715
+ }
716
+ },
717
+ {
718
+ "id": "rg-4-approval-extra",
719
+ "file": "vectors/reject/rg-4-approval-extra.json",
720
+ "title": "More reviewer-approval artifacts than selected reviewers",
721
+ "rules": [
722
+ "RG-4"
723
+ ],
724
+ "expect": {
725
+ "result": "rejected",
726
+ "codes": [
727
+ "approval_mismatch"
728
+ ]
729
+ }
730
+ },
731
+ {
732
+ "id": "rg-4-approval-wrong-run",
733
+ "file": "vectors/reject/rg-4-approval-wrong-run.json",
734
+ "title": "Reviewer approval stamp with wrong run",
735
+ "rules": [
736
+ "RG-4"
737
+ ],
738
+ "expect": {
739
+ "result": "rejected",
740
+ "codes": [
741
+ "approval_mismatch"
742
+ ]
743
+ }
744
+ },
745
+ {
746
+ "id": "rg-4-approval-wrong-pass",
747
+ "file": "vectors/reject/rg-4-approval-wrong-pass.json",
748
+ "title": "Reviewer approval stamp with wrong pass",
749
+ "rules": [
750
+ "RG-4"
751
+ ],
752
+ "expect": {
753
+ "result": "rejected",
754
+ "codes": [
755
+ "approval_mismatch"
756
+ ]
757
+ }
758
+ },
759
+ {
760
+ "id": "rg-4-approval-wrong-workspace",
761
+ "file": "vectors/reject/rg-4-approval-wrong-workspace.json",
762
+ "title": "Reviewer approval stamp with wrong workspace",
763
+ "rules": [
764
+ "RG-4"
765
+ ],
766
+ "expect": {
767
+ "result": "rejected",
768
+ "codes": [
769
+ "approval_mismatch"
770
+ ]
771
+ }
772
+ },
773
+ {
774
+ "id": "rg-4-approval-wrong-candidate",
775
+ "file": "vectors/reject/rg-4-approval-wrong-candidate.json",
776
+ "title": "Reviewer approval stamp with wrong candidate",
777
+ "rules": [
778
+ "RG-4"
779
+ ],
780
+ "expect": {
781
+ "result": "rejected",
782
+ "codes": [
783
+ "approval_mismatch"
784
+ ]
785
+ }
786
+ },
787
+ {
788
+ "id": "rg-4-approval-wrong-reviewer",
789
+ "file": "vectors/reject/rg-4-approval-wrong-reviewer.json",
790
+ "title": "Reviewer approval stamp with wrong reviewer",
791
+ "rules": [
792
+ "RG-4"
793
+ ],
794
+ "expect": {
795
+ "result": "rejected",
796
+ "codes": [
797
+ "approval_mismatch"
798
+ ]
799
+ }
800
+ },
801
+ {
802
+ "id": "rg-4-approval-not-approved",
803
+ "file": "vectors/reject/rg-4-approval-not-approved.json",
804
+ "title": "Reviewer approval stamp with not approved",
805
+ "rules": [
806
+ "RG-4"
807
+ ],
808
+ "expect": {
809
+ "result": "rejected",
810
+ "codes": [
811
+ "approval_mismatch"
812
+ ]
813
+ }
814
+ },
815
+ {
816
+ "id": "rg-4-approval-wrong-provider",
817
+ "file": "vectors/reject/rg-4-approval-wrong-provider.json",
818
+ "title": "Reviewer approval stamp with wrong provider",
819
+ "rules": [
820
+ "RG-4"
821
+ ],
822
+ "expect": {
823
+ "result": "rejected",
824
+ "codes": [
825
+ "approval_mismatch"
826
+ ]
827
+ }
828
+ },
829
+ {
830
+ "id": "rg-4-approval-malformed",
831
+ "file": "vectors/reject/rg-4-approval-malformed.json",
832
+ "title": "Reviewer approval artifact that is not JSON",
833
+ "rules": [
834
+ "RG-4"
835
+ ],
836
+ "expect": {
837
+ "result": "rejected",
838
+ "codes": [
839
+ "approval_mismatch"
840
+ ]
841
+ }
842
+ },
843
+ {
844
+ "id": "rg-5-unknown-severity",
845
+ "file": "vectors/reject/rg-5-unknown-severity.json",
846
+ "title": "Finding with unknown severity",
847
+ "rules": [
848
+ "RG-5"
849
+ ],
850
+ "expect": {
851
+ "result": "rejected",
852
+ "codes": [
853
+ "finding_invalid"
854
+ ]
855
+ }
856
+ },
857
+ {
858
+ "id": "rg-5-unknown-scope",
859
+ "file": "vectors/reject/rg-5-unknown-scope.json",
860
+ "title": "Finding with unknown scope",
861
+ "rules": [
862
+ "RG-5"
863
+ ],
864
+ "expect": {
865
+ "result": "rejected",
866
+ "codes": [
867
+ "finding_invalid"
868
+ ]
869
+ }
870
+ },
871
+ {
872
+ "id": "rg-5-unknown-disposition",
873
+ "file": "vectors/reject/rg-5-unknown-disposition.json",
874
+ "title": "Finding with unknown disposition",
875
+ "rules": [
876
+ "RG-5"
877
+ ],
878
+ "expect": {
879
+ "result": "rejected",
880
+ "codes": [
881
+ "finding_invalid"
882
+ ]
883
+ }
884
+ },
885
+ {
886
+ "id": "rg-5-duplicate-finding-id",
887
+ "file": "vectors/reject/rg-5-duplicate-finding-id.json",
888
+ "title": "Two findings sharing an id",
889
+ "rules": [
890
+ "RG-5"
891
+ ],
892
+ "expect": {
893
+ "result": "rejected",
894
+ "codes": [
895
+ "finding_invalid"
896
+ ]
897
+ }
898
+ },
899
+ {
900
+ "id": "rg-6-blocking-finding",
901
+ "file": "vectors/reject/rg-6-blocking-finding.json",
902
+ "title": "A blocking finding in a green manifest",
903
+ "rules": [
904
+ "RG-6"
905
+ ],
906
+ "expect": {
907
+ "result": "rejected",
908
+ "codes": [
909
+ "blocking_finding_present"
910
+ ]
911
+ }
912
+ },
913
+ {
914
+ "id": "rg-6-actionable-unresolved",
915
+ "file": "vectors/reject/rg-6-actionable-unresolved.json",
916
+ "title": "Actionable finding left unresolved despite green verdict",
917
+ "rules": [
918
+ "RG-6"
919
+ ],
920
+ "expect": {
921
+ "result": "rejected",
922
+ "codes": [
923
+ "actionable_unresolved"
924
+ ]
925
+ }
926
+ },
927
+ {
928
+ "id": "rg-6-actionable-ignored",
929
+ "file": "vectors/reject/rg-6-actionable-ignored.json",
930
+ "title": "Actionable finding left ignored despite green verdict",
931
+ "rules": [
932
+ "RG-6"
933
+ ],
934
+ "expect": {
935
+ "result": "rejected",
936
+ "codes": [
937
+ "actionable_unresolved"
938
+ ]
939
+ }
940
+ },
941
+ {
942
+ "id": "rg-7-defer-p0",
943
+ "file": "vectors/reject/rg-7-defer-p0.json",
944
+ "title": "Illegal deferral: p0",
945
+ "rules": [
946
+ "RG-7"
947
+ ],
948
+ "expect": {
949
+ "result": "rejected",
950
+ "codes": [
951
+ "illegal_deferral"
952
+ ]
953
+ }
954
+ },
955
+ {
956
+ "id": "rg-7-defer-p1",
957
+ "file": "vectors/reject/rg-7-defer-p1.json",
958
+ "title": "Illegal deferral: p1",
959
+ "rules": [
960
+ "RG-7"
961
+ ],
962
+ "expect": {
963
+ "result": "rejected",
964
+ "codes": [
965
+ "illegal_deferral"
966
+ ]
967
+ }
968
+ },
969
+ {
970
+ "id": "rg-7-defer-in-contract",
971
+ "file": "vectors/reject/rg-7-defer-in-contract.json",
972
+ "title": "Illegal deferral: in contract",
973
+ "rules": [
974
+ "RG-7"
975
+ ],
976
+ "expect": {
977
+ "result": "rejected",
978
+ "codes": [
979
+ "illegal_deferral"
980
+ ]
981
+ }
982
+ },
983
+ {
984
+ "id": "rg-7-defer-adjacent",
985
+ "file": "vectors/reject/rg-7-defer-adjacent.json",
986
+ "title": "Illegal deferral: adjacent",
987
+ "rules": [
988
+ "RG-7"
989
+ ],
990
+ "expect": {
991
+ "result": "rejected",
992
+ "codes": [
993
+ "illegal_deferral"
994
+ ]
995
+ }
996
+ },
997
+ {
998
+ "id": "rg-7-defer-placeholder-issue-id",
999
+ "file": "vectors/reject/rg-7-defer-placeholder-issue-id.json",
1000
+ "title": "Illegal deferral: placeholder issue id",
1001
+ "rules": [
1002
+ "RG-7"
1003
+ ],
1004
+ "expect": {
1005
+ "result": "rejected",
1006
+ "codes": [
1007
+ "illegal_deferral"
1008
+ ]
1009
+ }
1010
+ },
1011
+ {
1012
+ "id": "rg-7-defer-lowercase-issue-id",
1013
+ "file": "vectors/reject/rg-7-defer-lowercase-issue-id.json",
1014
+ "title": "Illegal deferral: lowercase issue id",
1015
+ "rules": [
1016
+ "RG-7"
1017
+ ],
1018
+ "expect": {
1019
+ "result": "rejected",
1020
+ "codes": [
1021
+ "illegal_deferral"
1022
+ ]
1023
+ }
1024
+ },
1025
+ {
1026
+ "id": "rg-7-defer-missing-issue-id",
1027
+ "file": "vectors/reject/rg-7-defer-missing-issue-id.json",
1028
+ "title": "Illegal deferral: missing issue id",
1029
+ "rules": [
1030
+ "RG-7"
1031
+ ],
1032
+ "expect": {
1033
+ "result": "rejected",
1034
+ "codes": [
1035
+ "illegal_deferral"
1036
+ ]
1037
+ }
1038
+ },
1039
+ {
1040
+ "id": "rg-7-defer-blocking",
1041
+ "file": "vectors/reject/rg-7-defer-blocking.json",
1042
+ "title": "Illegal deferral: blocking",
1043
+ "rules": [
1044
+ "RG-7"
1045
+ ],
1046
+ "expect": {
1047
+ "result": "rejected",
1048
+ "codes": [
1049
+ "illegal_deferral"
1050
+ ]
1051
+ }
1052
+ },
1053
+ {
1054
+ "id": "rg-7-defer-non-actionable",
1055
+ "file": "vectors/reject/rg-7-defer-non-actionable.json",
1056
+ "title": "Illegal deferral: non actionable",
1057
+ "rules": [
1058
+ "RG-7"
1059
+ ],
1060
+ "expect": {
1061
+ "result": "rejected",
1062
+ "codes": [
1063
+ "illegal_deferral"
1064
+ ]
1065
+ }
1066
+ },
1067
+ {
1068
+ "id": "rg-7-issue-id-on-resolved",
1069
+ "file": "vectors/reject/rg-7-issue-id-on-resolved.json",
1070
+ "title": "deferredIssueId present on a non-deferred finding",
1071
+ "rules": [
1072
+ "RG-7"
1073
+ ],
1074
+ "expect": {
1075
+ "result": "rejected",
1076
+ "codes": [
1077
+ "illegal_deferral"
1078
+ ]
1079
+ }
1080
+ },
1081
+ {
1082
+ "id": "rg-8-counts-contradict-findings",
1083
+ "file": "vectors/reject/rg-8-counts-contradict-findings.json",
1084
+ "title": "findingCounts claiming zero over findings with real severities",
1085
+ "rules": [
1086
+ "RG-8"
1087
+ ],
1088
+ "expect": {
1089
+ "result": "rejected",
1090
+ "codes": [
1091
+ "telemetry_mismatch"
1092
+ ]
1093
+ }
1094
+ },
1095
+ {
1096
+ "id": "rg-8-deferral-count-disagrees",
1097
+ "file": "vectors/reject/rg-8-deferral-count-disagrees.json",
1098
+ "title": "Deferral count disagreeing with the findings",
1099
+ "rules": [
1100
+ "RG-8"
1101
+ ],
1102
+ "expect": {
1103
+ "result": "rejected",
1104
+ "codes": [
1105
+ "telemetry_mismatch"
1106
+ ]
1107
+ }
1108
+ },
1109
+ {
1110
+ "id": "rg-8-deferral-ids-disagree",
1111
+ "file": "vectors/reject/rg-8-deferral-ids-disagree.json",
1112
+ "title": "Deferred issue ids disagreeing with the findings",
1113
+ "rules": [
1114
+ "RG-8"
1115
+ ],
1116
+ "expect": {
1117
+ "result": "rejected",
1118
+ "codes": [
1119
+ "telemetry_mismatch"
1120
+ ]
1121
+ }
1122
+ },
1123
+ {
1124
+ "id": "rg-9-iteration-count-mismatch",
1125
+ "file": "vectors/reject/rg-9-iteration-count-mismatch.json",
1126
+ "title": "iterationCount disagreeing with runHistory length",
1127
+ "rules": [
1128
+ "RG-9"
1129
+ ],
1130
+ "expect": {
1131
+ "result": "rejected",
1132
+ "codes": [
1133
+ "iteration_count_mismatch"
1134
+ ]
1135
+ }
1136
+ },
1137
+ {
1138
+ "id": "rg-10-cost-missing-unit",
1139
+ "file": "vectors/reject/rg-10-cost-missing-unit.json",
1140
+ "title": "Cost with missing unit",
1141
+ "rules": [
1142
+ "RG-10"
1143
+ ],
1144
+ "expect": {
1145
+ "result": "rejected",
1146
+ "codes": [
1147
+ "invalid_cost"
1148
+ ]
1149
+ }
1150
+ },
1151
+ {
1152
+ "id": "rg-10-cost-empty-unit",
1153
+ "file": "vectors/reject/rg-10-cost-empty-unit.json",
1154
+ "title": "Cost with empty unit",
1155
+ "rules": [
1156
+ "RG-10"
1157
+ ],
1158
+ "expect": {
1159
+ "result": "rejected",
1160
+ "codes": [
1161
+ "invalid_cost"
1162
+ ]
1163
+ }
1164
+ },
1165
+ {
1166
+ "id": "rg-10-cost-negative-total",
1167
+ "file": "vectors/reject/rg-10-cost-negative-total.json",
1168
+ "title": "Cost with negative total",
1169
+ "rules": [
1170
+ "RG-10"
1171
+ ],
1172
+ "expect": {
1173
+ "result": "rejected",
1174
+ "codes": [
1175
+ "invalid_cost"
1176
+ ]
1177
+ }
1178
+ },
1179
+ {
1180
+ "id": "rg-10-cost-null-total",
1181
+ "file": "vectors/reject/rg-10-cost-null-total.json",
1182
+ "title": "Cost with null total",
1183
+ "rules": [
1184
+ "RG-10"
1185
+ ],
1186
+ "expect": {
1187
+ "result": "rejected",
1188
+ "codes": [
1189
+ "invalid_cost"
1190
+ ]
1191
+ }
1192
+ },
1193
+ {
1194
+ "id": "rg-10-cost-by-reviewer-exceeds-total",
1195
+ "file": "vectors/reject/rg-10-cost-by-reviewer-exceeds-total.json",
1196
+ "title": "Cost with by reviewer exceeds total",
1197
+ "rules": [
1198
+ "RG-10"
1199
+ ],
1200
+ "expect": {
1201
+ "result": "rejected",
1202
+ "codes": [
1203
+ "invalid_cost"
1204
+ ]
1205
+ }
1206
+ },
1207
+ {
1208
+ "id": "rg-10-cost-negative-by-reviewer",
1209
+ "file": "vectors/reject/rg-10-cost-negative-by-reviewer.json",
1210
+ "title": "Cost with negative by reviewer",
1211
+ "rules": [
1212
+ "RG-10"
1213
+ ],
1214
+ "expect": {
1215
+ "result": "rejected",
1216
+ "codes": [
1217
+ "invalid_cost"
1218
+ ]
1219
+ }
1220
+ },
1221
+ {
1222
+ "id": "rg-10-cost-empty-reported-by",
1223
+ "file": "vectors/reject/rg-10-cost-empty-reported-by.json",
1224
+ "title": "Cost with empty reported by",
1225
+ "rules": [
1226
+ "RG-10"
1227
+ ],
1228
+ "expect": {
1229
+ "result": "rejected",
1230
+ "codes": [
1231
+ "invalid_cost"
1232
+ ]
1233
+ }
1234
+ },
1235
+ {
1236
+ "id": "rg-10-cost-unknown-reviewer-in-breakdown",
1237
+ "file": "vectors/reject/rg-10-cost-unknown-reviewer-in-breakdown.json",
1238
+ "title": "Cost with unknown reviewer in breakdown",
1239
+ "rules": [
1240
+ "RG-10"
1241
+ ],
1242
+ "expect": {
1243
+ "result": "rejected",
1244
+ "codes": [
1245
+ "invalid_cost"
1246
+ ]
1247
+ }
1248
+ }
1249
+ ]
1250
+ }