@bjoernrochel/sevro 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +159 -0
  2. package/README.md +71 -0
  3. package/docs/advisory-fixture.md +23 -0
  4. package/docs/builtin-graders-v1.md +77 -0
  5. package/docs/cache-ownership-validation.md +49 -0
  6. package/docs/claude-continuation-validation.md +47 -0
  7. package/docs/codex-host.md +134 -0
  8. package/docs/concurrency-validation.md +86 -0
  9. package/docs/configuration-root-validation.md +70 -0
  10. package/docs/development-cli.md +327 -0
  11. package/docs/engine-slice.md +114 -0
  12. package/docs/extension-protocol-v1.md +292 -0
  13. package/docs/fixture-cleanup-validation.md +70 -0
  14. package/docs/identity-v1.md +65 -0
  15. package/docs/native-controls.md +29 -0
  16. package/docs/releases.md +88 -0
  17. package/docs/report-v1.md +32 -0
  18. package/docs/results-v1.md +118 -0
  19. package/examples/basic/graded.json +13 -0
  20. package/examples/basic/host.ts +8 -0
  21. package/examples/basic/prompt-only.json +7 -0
  22. package/package.json +45 -0
  23. package/schemas/cli-result-v1.schema.json +184 -0
  24. package/schemas/extension-v1.schema.json +659 -0
  25. package/schemas/report-v1.schema.json +164 -0
  26. package/schemas/run-evidence-v1.schema.json +510 -0
  27. package/src/advisory-fixture.ts +282 -0
  28. package/src/advisory.ts +105 -0
  29. package/src/cli.ts +837 -0
  30. package/src/engine.ts +2341 -0
  31. package/src/extension-client.ts +257 -0
  32. package/src/extension-session.ts +335 -0
  33. package/src/fixture-bin.ts +87 -0
  34. package/src/fixture-cleanup.ts +38 -0
  35. package/src/fixture-setup.ts +163 -0
  36. package/src/generated-fixture.ts +220 -0
  37. package/src/git-hooks.ts +63 -0
  38. package/src/graders/git-head.ts +176 -0
  39. package/src/graders/output.ts +359 -0
  40. package/src/graders/semantic.ts +120 -0
  41. package/src/graders/shell.ts +277 -0
  42. package/src/hosts/claude-continuation.ts +94 -0
  43. package/src/hosts/claude-credential.ts +73 -0
  44. package/src/hosts/claude-events.ts +128 -0
  45. package/src/hosts/claude-nested-skills.ts +218 -0
  46. package/src/hosts/claude-repository-invocation.ts +239 -0
  47. package/src/hosts/claude-settings.ts +50 -0
  48. package/src/hosts/claude-tool-calls.ts +159 -0
  49. package/src/hosts/claude.ts +511 -0
  50. package/src/hosts/codex-configuration.ts +85 -0
  51. package/src/hosts/codex-events.ts +102 -0
  52. package/src/hosts/codex-native-calls.ts +702 -0
  53. package/src/hosts/codex-profile.ts +78 -0
  54. package/src/hosts/codex-skill-reads.ts +345 -0
  55. package/src/hosts/codex.ts +769 -0
  56. package/src/hosts/isolation-roots.ts +60 -0
  57. package/src/hosts/mac-sandbox.ts +108 -0
  58. package/src/hosts/native-controls.ts +124 -0
  59. package/src/hosts/protected-worktrees.ts +56 -0
  60. package/src/hosts/workspace-fingerprint.ts +55 -0
  61. package/src/identity.ts +156 -0
  62. package/src/instrumentation.ts +106 -0
  63. package/src/preparation.ts +211 -0
  64. package/src/provenance.ts +244 -0
  65. package/src/report.ts +351 -0
  66. package/src/repository-fixture.ts +286 -0
  67. package/src/results.ts +160 -0
  68. package/src/run-owner.ts +276 -0
  69. package/src/schema.ts +28 -0
  70. package/src/storage.ts +23 -0
  71. package/src/trial-scheduler.ts +27 -0
@@ -0,0 +1,659 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:sevro:schema:extension:v1",
4
+ "title": "Sevro extension exchange v1",
5
+ "type": "object",
6
+ "required": ["protocol", "id", "method"],
7
+ "properties": {
8
+ "protocol": {
9
+ "enum": ["sevro.discovery.v1", "sevro.extension.v1"]
10
+ },
11
+ "id": { "$ref": "#/$defs/id" },
12
+ "method": { "enum": ["describe", "resolve", "prepare", "evaluate"] },
13
+ "params": { "type": "object" },
14
+ "result": { "type": "object" },
15
+ "error": { "$ref": "#/$defs/error" }
16
+ },
17
+ "additionalProperties": false,
18
+ "oneOf": [
19
+ {
20
+ "properties": {
21
+ "protocol": { "const": "sevro.discovery.v1" },
22
+ "method": { "const": "describe" },
23
+ "params": { "$ref": "#/$defs/describeParams" }
24
+ },
25
+ "required": ["params"],
26
+ "not": {
27
+ "anyOf": [{ "required": ["result"] }, { "required": ["error"] }]
28
+ }
29
+ },
30
+ {
31
+ "properties": {
32
+ "protocol": { "const": "sevro.discovery.v1" },
33
+ "method": { "const": "describe" },
34
+ "result": { "$ref": "#/$defs/describeResult" }
35
+ },
36
+ "required": ["result"],
37
+ "not": {
38
+ "anyOf": [{ "required": ["params"] }, { "required": ["error"] }]
39
+ }
40
+ },
41
+ {
42
+ "properties": {
43
+ "protocol": { "const": "sevro.extension.v1" },
44
+ "method": { "const": "resolve" },
45
+ "params": { "$ref": "#/$defs/resolveParams" }
46
+ },
47
+ "required": ["params"],
48
+ "not": {
49
+ "anyOf": [{ "required": ["result"] }, { "required": ["error"] }]
50
+ }
51
+ },
52
+ {
53
+ "properties": {
54
+ "protocol": { "const": "sevro.extension.v1" },
55
+ "method": { "const": "resolve" },
56
+ "result": { "$ref": "#/$defs/resolveResult" }
57
+ },
58
+ "required": ["result"],
59
+ "not": {
60
+ "anyOf": [{ "required": ["params"] }, { "required": ["error"] }]
61
+ }
62
+ },
63
+ {
64
+ "properties": {
65
+ "protocol": { "const": "sevro.extension.v1" },
66
+ "method": { "const": "prepare" },
67
+ "params": { "$ref": "#/$defs/prepareParams" }
68
+ },
69
+ "required": ["params"],
70
+ "not": {
71
+ "anyOf": [{ "required": ["result"] }, { "required": ["error"] }]
72
+ }
73
+ },
74
+ {
75
+ "properties": {
76
+ "protocol": { "const": "sevro.extension.v1" },
77
+ "method": { "const": "prepare" },
78
+ "result": { "$ref": "#/$defs/prepareResult" }
79
+ },
80
+ "required": ["result"],
81
+ "not": {
82
+ "anyOf": [{ "required": ["params"] }, { "required": ["error"] }]
83
+ }
84
+ },
85
+ {
86
+ "properties": {
87
+ "protocol": { "const": "sevro.extension.v1" },
88
+ "method": { "const": "evaluate" },
89
+ "params": { "$ref": "#/$defs/evaluateParams" }
90
+ },
91
+ "required": ["params"],
92
+ "not": {
93
+ "anyOf": [{ "required": ["result"] }, { "required": ["error"] }]
94
+ }
95
+ },
96
+ {
97
+ "properties": {
98
+ "protocol": { "const": "sevro.extension.v1" },
99
+ "method": { "const": "evaluate" },
100
+ "result": { "$ref": "#/$defs/evaluateResult" }
101
+ },
102
+ "required": ["result"],
103
+ "not": {
104
+ "anyOf": [{ "required": ["params"] }, { "required": ["error"] }]
105
+ }
106
+ },
107
+ {
108
+ "required": ["error"],
109
+ "not": {
110
+ "anyOf": [{ "required": ["params"] }, { "required": ["result"] }]
111
+ },
112
+ "allOf": [
113
+ {
114
+ "if": { "properties": { "method": { "const": "describe" } } },
115
+ "then": {
116
+ "properties": { "protocol": { "const": "sevro.discovery.v1" } }
117
+ },
118
+ "else": {
119
+ "properties": { "protocol": { "const": "sevro.extension.v1" } }
120
+ }
121
+ }
122
+ ]
123
+ }
124
+ ],
125
+ "$defs": {
126
+ "id": { "type": "string", "minLength": 1, "maxLength": 128 },
127
+ "namespacedId": {
128
+ "type": "string",
129
+ "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$",
130
+ "maxLength": 128
131
+ },
132
+ "digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
133
+ "error": {
134
+ "type": "object",
135
+ "required": ["code", "message"],
136
+ "properties": {
137
+ "code": { "$ref": "#/$defs/namespacedId" },
138
+ "message": { "type": "string", "minLength": 1, "maxLength": 4096 }
139
+ },
140
+ "additionalProperties": false
141
+ },
142
+ "extensionData": {
143
+ "type": "object",
144
+ "propertyNames": { "$ref": "#/$defs/namespacedId" }
145
+ },
146
+ "describeParams": {
147
+ "type": "object",
148
+ "required": ["protocols", "engineCapabilities", "hostCapabilities"],
149
+ "properties": {
150
+ "protocols": {
151
+ "type": "array",
152
+ "items": {
153
+ "type": "string",
154
+ "pattern": "^sevro\\.extension\\.v[1-9][0-9]*$"
155
+ },
156
+ "minItems": 1,
157
+ "uniqueItems": true
158
+ },
159
+ "engineCapabilities": { "$ref": "#/$defs/capabilities" },
160
+ "hostCapabilities": { "$ref": "#/$defs/capabilities" }
161
+ },
162
+ "additionalProperties": false
163
+ },
164
+ "capabilities": {
165
+ "type": "array",
166
+ "items": { "$ref": "#/$defs/namespacedId" },
167
+ "uniqueItems": true
168
+ },
169
+ "describeResult": {
170
+ "type": "object",
171
+ "required": [
172
+ "extension",
173
+ "protocols",
174
+ "requiredCapabilities",
175
+ "optionalCapabilities",
176
+ "graders",
177
+ "taskVerdictPolicies"
178
+ ],
179
+ "properties": {
180
+ "extension": {
181
+ "type": "object",
182
+ "required": ["id", "version"],
183
+ "properties": {
184
+ "id": { "$ref": "#/$defs/namespacedId" },
185
+ "version": { "type": "string", "minLength": 1, "maxLength": 128 }
186
+ },
187
+ "additionalProperties": false
188
+ },
189
+ "protocols": {
190
+ "type": "array",
191
+ "items": {
192
+ "type": "string",
193
+ "pattern": "^sevro\\.extension\\.v[1-9][0-9]*$"
194
+ },
195
+ "minItems": 1,
196
+ "uniqueItems": true
197
+ },
198
+ "requiredCapabilities": { "$ref": "#/$defs/capabilities" },
199
+ "optionalCapabilities": { "$ref": "#/$defs/capabilities" },
200
+ "graders": { "$ref": "#/$defs/capabilities" },
201
+ "taskVerdictPolicies": { "$ref": "#/$defs/capabilities" }
202
+ },
203
+ "additionalProperties": false
204
+ },
205
+ "selector": {
206
+ "type": "object",
207
+ "properties": {
208
+ "caseIds": {
209
+ "type": "array",
210
+ "items": { "$ref": "#/$defs/id" },
211
+ "uniqueItems": true
212
+ },
213
+ "skill": { "$ref": "#/$defs/id" },
214
+ "plugin": { "$ref": "#/$defs/id" }
215
+ },
216
+ "additionalProperties": false
217
+ },
218
+ "resolveParams": {
219
+ "type": "object",
220
+ "required": ["projectRoot", "selectors", "configuration"],
221
+ "properties": {
222
+ "projectRoot": { "type": "string", "pattern": "^file:///" },
223
+ "selectors": { "$ref": "#/$defs/selector" },
224
+ "host": { "$ref": "#/$defs/hostRoute" },
225
+ "configuration": { "type": "object" }
226
+ },
227
+ "additionalProperties": false
228
+ },
229
+ "fixture": {
230
+ "oneOf": [
231
+ {
232
+ "type": "object",
233
+ "required": ["kind", "files"],
234
+ "properties": {
235
+ "kind": { "const": "inline" },
236
+ "files": {
237
+ "type": "object",
238
+ "additionalProperties": { "type": "string" }
239
+ }
240
+ },
241
+ "additionalProperties": false
242
+ },
243
+ {
244
+ "type": "object",
245
+ "required": ["kind", "sourceRef"],
246
+ "properties": {
247
+ "kind": { "const": "repository" },
248
+ "sourceRef": { "$ref": "#/$defs/id" },
249
+ "files": {
250
+ "type": "object",
251
+ "additionalProperties": { "type": "string" }
252
+ },
253
+ "staged": {
254
+ "type": "array",
255
+ "items": { "type": "string", "minLength": 1 },
256
+ "uniqueItems": true
257
+ },
258
+ "commitFiles": { "type": "boolean" },
259
+ "hooks": {
260
+ "type": "object",
261
+ "maxProperties": 32,
262
+ "additionalProperties": { "type": "string" }
263
+ },
264
+ "bin": {
265
+ "type": "object",
266
+ "maxProperties": 64,
267
+ "additionalProperties": { "type": "string" }
268
+ }
269
+ },
270
+ "additionalProperties": false
271
+ },
272
+ {
273
+ "type": "object",
274
+ "required": ["kind", "commits"],
275
+ "properties": {
276
+ "kind": { "const": "generated" },
277
+ "commits": {
278
+ "type": "array",
279
+ "maxItems": 128,
280
+ "items": {
281
+ "type": "object",
282
+ "required": ["message", "files"],
283
+ "properties": {
284
+ "message": { "type": "string", "minLength": 1 },
285
+ "files": {
286
+ "type": "object",
287
+ "minProperties": 1,
288
+ "additionalProperties": { "type": "string" }
289
+ }
290
+ },
291
+ "additionalProperties": false
292
+ }
293
+ },
294
+ "files": {
295
+ "type": "object",
296
+ "additionalProperties": { "type": "string" }
297
+ },
298
+ "staged": {
299
+ "type": "array",
300
+ "items": { "type": "string", "minLength": 1 },
301
+ "uniqueItems": true
302
+ },
303
+ "commitFiles": { "type": "boolean" },
304
+ "hooks": {
305
+ "type": "object",
306
+ "maxProperties": 32,
307
+ "additionalProperties": { "type": "string" }
308
+ },
309
+ "bin": {
310
+ "type": "object",
311
+ "maxProperties": 64,
312
+ "additionalProperties": { "type": "string" }
313
+ }
314
+ },
315
+ "additionalProperties": false
316
+ }
317
+ ]
318
+ },
319
+ "checkDeclaration": {
320
+ "type": "object",
321
+ "required": ["id", "grader", "configuration"],
322
+ "properties": {
323
+ "id": { "$ref": "#/$defs/id" },
324
+ "grader": { "$ref": "#/$defs/namespacedId" },
325
+ "configuration": { "type": "object" }
326
+ },
327
+ "additionalProperties": false
328
+ },
329
+ "case": {
330
+ "type": "object",
331
+ "required": [
332
+ "id",
333
+ "prompt",
334
+ "fixture",
335
+ "checks",
336
+ "requiredEvidence",
337
+ "extensionData"
338
+ ],
339
+ "properties": {
340
+ "id": { "$ref": "#/$defs/id" },
341
+ "prompt": { "type": "string", "minLength": 1 },
342
+ "followUpPrompt": { "type": "string", "minLength": 1 },
343
+ "fixture": { "$ref": "#/$defs/fixture" },
344
+ "checks": {
345
+ "type": "array",
346
+ "items": { "$ref": "#/$defs/checkDeclaration" }
347
+ },
348
+ "requiredEvidence": { "$ref": "#/$defs/capabilities" },
349
+ "extensionData": { "$ref": "#/$defs/extensionData" }
350
+ },
351
+ "additionalProperties": false
352
+ },
353
+ "resolveResult": {
354
+ "type": "object",
355
+ "required": ["cases"],
356
+ "properties": {
357
+ "cases": { "type": "array", "items": { "$ref": "#/$defs/case" } }
358
+ },
359
+ "additionalProperties": false
360
+ },
361
+ "hostRoute": {
362
+ "type": "object",
363
+ "required": ["id", "model", "effort", "capabilities"],
364
+ "properties": {
365
+ "id": { "$ref": "#/$defs/namespacedId" },
366
+ "model": { "type": "string", "minLength": 1 },
367
+ "effort": { "type": "string", "minLength": 1 },
368
+ "capabilities": { "$ref": "#/$defs/capabilities" }
369
+ },
370
+ "additionalProperties": false
371
+ },
372
+ "host": {
373
+ "type": "object",
374
+ "required": ["id", "capabilities"],
375
+ "properties": {
376
+ "id": { "$ref": "#/$defs/namespacedId" },
377
+ "capabilities": { "$ref": "#/$defs/capabilities" }
378
+ },
379
+ "additionalProperties": false
380
+ },
381
+ "prepareParams": {
382
+ "type": "object",
383
+ "required": ["case", "host", "condition", "configuration"],
384
+ "properties": {
385
+ "case": { "$ref": "#/$defs/case" },
386
+ "host": { "$ref": "#/$defs/host" },
387
+ "condition": { "enum": ["passive", "enforced"] },
388
+ "configuration": { "type": "object" }
389
+ },
390
+ "additionalProperties": false
391
+ },
392
+ "preparationArtifact": {
393
+ "type": "object",
394
+ "required": ["id", "relativePath", "sha256"],
395
+ "properties": {
396
+ "id": { "$ref": "#/$defs/id" },
397
+ "relativePath": { "type": "string", "minLength": 1 },
398
+ "sha256": { "$ref": "#/$defs/digest" },
399
+ "contentBase64": { "type": "string", "contentEncoding": "base64" },
400
+ "sourceRef": { "$ref": "#/$defs/id" },
401
+ "gitExclude": { "type": "boolean" },
402
+ "executable": { "type": "boolean" }
403
+ },
404
+ "oneOf": [
405
+ { "required": ["contentBase64"], "not": { "required": ["sourceRef"] } },
406
+ { "required": ["sourceRef"], "not": { "required": ["contentBase64"] } }
407
+ ],
408
+ "additionalProperties": false
409
+ },
410
+ "instrumentation": {
411
+ "type": "object",
412
+ "required": ["id", "configuration"],
413
+ "properties": {
414
+ "id": { "$ref": "#/$defs/namespacedId" },
415
+ "configuration": { "type": "object" }
416
+ },
417
+ "additionalProperties": false
418
+ },
419
+ "prepareResult": {
420
+ "type": "object",
421
+ "required": ["artifacts", "requestedInstrumentation", "extensionData"],
422
+ "properties": {
423
+ "artifacts": {
424
+ "type": "array",
425
+ "items": { "$ref": "#/$defs/preparationArtifact" }
426
+ },
427
+ "requestedInstrumentation": {
428
+ "type": "array",
429
+ "items": { "$ref": "#/$defs/instrumentation" }
430
+ },
431
+ "fixtureSetup": { "$ref": "#/$defs/fixtureSetup" },
432
+ "codexMarketplace": {
433
+ "type": "object",
434
+ "required": ["artifactRoot", "marketplaceName", "pluginNames"],
435
+ "properties": {
436
+ "artifactRoot": { "type": "string", "minLength": 1 },
437
+ "marketplaceName": { "type": "string", "minLength": 1 },
438
+ "pluginNames": {
439
+ "type": "array",
440
+ "minItems": 1,
441
+ "items": { "type": "string", "minLength": 1 }
442
+ }
443
+ },
444
+ "additionalProperties": false
445
+ },
446
+ "claudePluginDirs": {
447
+ "type": "object",
448
+ "required": ["artifactRoots"],
449
+ "properties": {
450
+ "artifactRoots": {
451
+ "type": "array",
452
+ "minItems": 1,
453
+ "items": { "type": "string", "minLength": 1 }
454
+ }
455
+ },
456
+ "additionalProperties": false
457
+ },
458
+ "codexSkillInvocation": {
459
+ "type": "object",
460
+ "required": ["pluginName", "skillName"],
461
+ "properties": {
462
+ "pluginName": { "type": "string", "minLength": 1 },
463
+ "skillName": { "type": "string", "minLength": 1 }
464
+ },
465
+ "additionalProperties": false
466
+ },
467
+ "codexRepositorySkillInvocation": {
468
+ "type": "object",
469
+ "required": ["skillName"],
470
+ "properties": {
471
+ "skillName": { "type": "string", "minLength": 1 }
472
+ },
473
+ "additionalProperties": false
474
+ },
475
+ "claudeSkillInvocation": {
476
+ "type": "object",
477
+ "required": ["pluginName", "skillName"],
478
+ "properties": {
479
+ "pluginName": { "type": "string", "minLength": 1 },
480
+ "skillName": { "type": "string", "minLength": 1 }
481
+ },
482
+ "additionalProperties": false
483
+ },
484
+ "claudeRepositorySkillInvocation": {
485
+ "type": "object",
486
+ "required": ["skillName"],
487
+ "properties": {
488
+ "skillName": { "type": "string", "minLength": 1 }
489
+ },
490
+ "additionalProperties": false
491
+ },
492
+ "extensionData": { "$ref": "#/$defs/extensionData" }
493
+ },
494
+ "additionalProperties": false
495
+ },
496
+ "fixtureSetup": {
497
+ "type": "object",
498
+ "required": ["command"],
499
+ "properties": {
500
+ "command": {
501
+ "type": "array",
502
+ "minItems": 1,
503
+ "maxItems": 16,
504
+ "items": { "type": "string", "minLength": 1 }
505
+ },
506
+ "environment": {
507
+ "type": "object",
508
+ "additionalProperties": { "type": "string" }
509
+ }
510
+ },
511
+ "additionalProperties": false
512
+ },
513
+ "execution": {
514
+ "type": "object",
515
+ "required": ["status"],
516
+ "properties": {
517
+ "status": { "enum": ["completed", "failed", "cancelled", "not_run"] },
518
+ "errorCode": { "$ref": "#/$defs/namespacedId" }
519
+ },
520
+ "additionalProperties": false
521
+ },
522
+ "observation": {
523
+ "type": "object",
524
+ "required": ["id", "source", "completeness", "data"],
525
+ "properties": {
526
+ "id": { "$ref": "#/$defs/namespacedId" },
527
+ "source": { "$ref": "#/$defs/id" },
528
+ "completeness": { "enum": ["complete", "partial", "unavailable"] },
529
+ "data": { "type": "object" }
530
+ },
531
+ "additionalProperties": false
532
+ },
533
+ "checkResult": {
534
+ "type": "object",
535
+ "required": ["id", "status", "evidenceRefs"],
536
+ "properties": {
537
+ "id": { "$ref": "#/$defs/id" },
538
+ "status": { "enum": ["passed", "failed", "unavailable"] },
539
+ "detail": { "type": "string", "maxLength": 4096 },
540
+ "evidenceRefs": {
541
+ "type": "array",
542
+ "items": { "$ref": "#/$defs/id" },
543
+ "uniqueItems": true
544
+ }
545
+ },
546
+ "additionalProperties": false
547
+ },
548
+ "extensionCheckResult": {
549
+ "type": "object",
550
+ "required": ["id", "status", "evidenceRefs"],
551
+ "properties": {
552
+ "id": { "$ref": "#/$defs/namespacedId" },
553
+ "status": { "enum": ["passed", "failed", "unavailable"] },
554
+ "detail": { "type": "string", "maxLength": 4096 },
555
+ "evidenceRefs": {
556
+ "type": "array",
557
+ "items": { "$ref": "#/$defs/id" },
558
+ "uniqueItems": true
559
+ }
560
+ },
561
+ "if": {
562
+ "properties": { "status": { "const": "passed" } }
563
+ },
564
+ "then": {
565
+ "properties": { "evidenceRefs": { "minItems": 1 } }
566
+ },
567
+ "additionalProperties": false
568
+ },
569
+ "domainOutcome": {
570
+ "type": "object",
571
+ "required": ["id", "status", "evidenceRefs"],
572
+ "properties": {
573
+ "id": { "$ref": "#/$defs/namespacedId" },
574
+ "status": { "enum": ["passed", "failed", "unavailable"] },
575
+ "detail": { "type": "string", "maxLength": 4096 },
576
+ "evidenceRefs": {
577
+ "type": "array",
578
+ "items": { "$ref": "#/$defs/id" },
579
+ "uniqueItems": true
580
+ },
581
+ "data": { "type": "object" }
582
+ },
583
+ "additionalProperties": false
584
+ },
585
+ "artifactRef": {
586
+ "type": "object",
587
+ "required": ["id", "path", "sha256"],
588
+ "properties": {
589
+ "id": { "$ref": "#/$defs/id" },
590
+ "path": { "type": "string", "pattern": "^file:///" },
591
+ "sha256": { "$ref": "#/$defs/digest" },
592
+ "gitExclude": { "type": "boolean" },
593
+ "executable": { "type": "boolean" }
594
+ },
595
+ "additionalProperties": false
596
+ },
597
+ "evaluateParams": {
598
+ "type": "object",
599
+ "required": [
600
+ "caseId",
601
+ "execution",
602
+ "observations",
603
+ "builtinChecks",
604
+ "artifacts",
605
+ "extensionData",
606
+ "configuration"
607
+ ],
608
+ "properties": {
609
+ "caseId": { "$ref": "#/$defs/id" },
610
+ "execution": { "$ref": "#/$defs/execution" },
611
+ "observations": {
612
+ "type": "array",
613
+ "items": { "$ref": "#/$defs/observation" }
614
+ },
615
+ "builtinChecks": {
616
+ "type": "array",
617
+ "items": { "$ref": "#/$defs/checkResult" }
618
+ },
619
+ "artifacts": {
620
+ "type": "array",
621
+ "items": { "$ref": "#/$defs/artifactRef" }
622
+ },
623
+ "extensionData": { "$ref": "#/$defs/extensionData" },
624
+ "selectedTaskVerdictPolicy": { "$ref": "#/$defs/namespacedId" },
625
+ "configuration": { "type": "object" }
626
+ },
627
+ "additionalProperties": false
628
+ },
629
+ "metric": {
630
+ "type": "object",
631
+ "required": ["id", "value", "unit"],
632
+ "properties": {
633
+ "id": { "$ref": "#/$defs/namespacedId" },
634
+ "value": { "type": ["number", "null"] },
635
+ "unit": { "$ref": "#/$defs/id" }
636
+ },
637
+ "additionalProperties": false
638
+ },
639
+ "evaluateResult": {
640
+ "type": "object",
641
+ "required": ["checks", "metrics"],
642
+ "properties": {
643
+ "checks": {
644
+ "type": "array",
645
+ "items": { "$ref": "#/$defs/extensionCheckResult" }
646
+ },
647
+ "metrics": { "type": "array", "items": { "$ref": "#/$defs/metric" } },
648
+ "domainOutcomes": {
649
+ "type": "array",
650
+ "items": { "$ref": "#/$defs/domainOutcome" }
651
+ },
652
+ "taskVerdictRecommendation": {
653
+ "enum": ["passed", "failed", "not_assessed"]
654
+ }
655
+ },
656
+ "additionalProperties": false
657
+ }
658
+ }
659
+ }