@crvouga/atlas 1.20.0 → 1.22.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 (114) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/dist/core/src/cli.d.ts +2 -2
  3. package/dist/core/src/cli.js +7 -1
  4. package/dist/critics/src/catalog-client.d.ts +91 -0
  5. package/dist/critics/src/catalog-client.js +194 -0
  6. package/dist/critics/src/cli-calibrate.d.ts +4 -0
  7. package/dist/critics/src/cli-calibrate.js +211 -0
  8. package/dist/critics/src/cli-common.d.ts +108 -0
  9. package/dist/critics/src/cli-common.js +155 -0
  10. package/dist/critics/src/cli-review.d.ts +4 -0
  11. package/dist/critics/src/cli-review.js +174 -0
  12. package/dist/critics/src/cli-watch.d.ts +4 -0
  13. package/dist/critics/src/cli-watch.js +191 -0
  14. package/dist/critics/src/cli.d.ts +13 -0
  15. package/dist/critics/src/cli.js +490 -0
  16. package/dist/critics/src/index.d.ts +3 -0
  17. package/dist/critics/src/index.js +3 -0
  18. package/dist/critics/src/judging.d.ts +8 -0
  19. package/dist/critics/src/llm.d.ts +120 -0
  20. package/dist/critics/src/llm.js +266 -0
  21. package/dist/critics/src/marks.d.ts +74 -0
  22. package/dist/critics/src/marks.js +76 -0
  23. package/dist/critics/src/registry.d.ts +125 -0
  24. package/dist/critics/src/registry.js +203 -0
  25. package/dist/critics/src/spool.d.ts +32 -0
  26. package/dist/critics/src/spool.js +129 -0
  27. package/dist/critics/src/uiclip.d.ts +82 -0
  28. package/dist/critics/src/uiclip.js +167 -0
  29. package/dist/reports/src/compose.d.ts +23 -1
  30. package/dist/reports/src/compose.js +29 -19
  31. package/dist/reports/src/critique-review.d.ts +111 -0
  32. package/dist/reports/src/critique-review.js +123 -0
  33. package/dist/reports/src/critique-row.d.ts +24 -0
  34. package/dist/reports/src/critique-row.js +39 -0
  35. package/dist/reports/src/evidence-types.d.ts +5 -0
  36. package/dist/reports/src/layer-merge.js +5 -0
  37. package/dist/reports/src/report-cli.d.ts +13 -0
  38. package/dist/reports/src/report-cli.js +6 -4
  39. package/dist/reports/src/report-index.d.ts +6 -0
  40. package/dist/reports/src/report-index.js +12 -0
  41. package/dist/reports/src/ui-catalog-cli.d.ts +10 -0
  42. package/dist/reports/src/ui-catalog-cli.js +391 -0
  43. package/dist/reports/src/ui-catalog-diff.d.ts +104 -0
  44. package/dist/reports/src/ui-catalog-diff.js +130 -0
  45. package/dist/reports/src/ui-catalog-entries.d.ts +147 -0
  46. package/dist/reports/src/ui-catalog-entries.js +190 -0
  47. package/dist/reports/src/ui-catalog-export.d.ts +82 -0
  48. package/dist/reports/src/ui-catalog-export.js +221 -0
  49. package/dist/reports/src/ui-catalog-publish.js +2 -2
  50. package/dist/reports/src/ui-catalog.d.ts +2 -0
  51. package/dist/reports/src/ui-catalog.js +1 -1
  52. package/dist/reports/src/ui-state.d.ts +2 -0
  53. package/dist/reports/src/ui-state.js +2 -2
  54. package/dist/schema/src/api.d.ts +653 -1
  55. package/dist/schema/src/api.js +44 -0
  56. package/dist/schema/src/cli-results.d.ts +991 -1
  57. package/dist/schema/src/cli-results.js +265 -1
  58. package/dist/schema/src/critique.d.ts +31 -0
  59. package/dist/schema/src/critique.js +26 -0
  60. package/dist/schema/src/server-config.d.ts +3 -3
  61. package/dist/server/src/app.js +28 -1
  62. package/dist/server/src/openapi.js +19 -2
  63. package/docs/agents.md +16 -2
  64. package/docs/critics.md +273 -9
  65. package/docs/extending.md +1 -1
  66. package/docs/reference/cli.md +126 -1
  67. package/docs/reference/core.md +1 -1
  68. package/docs/reference/critics.md +1131 -29
  69. package/docs/reference/http-api.md +40 -0
  70. package/docs/reference/reports.md +855 -0
  71. package/docs/reference/schema.md +197 -1
  72. package/docs/report-contract.md +2 -1
  73. package/docs/server.md +2 -0
  74. package/docs/ui-catalog.md +110 -13
  75. package/docs/ui.md +69 -2
  76. package/llms-full.txt +636 -26
  77. package/llms.txt +1 -1
  78. package/package.json +9 -1
  79. package/packages/critics/README.md +1 -0
  80. package/packages/schema/schemas/critic-calibrate-result.schema.json +274 -0
  81. package/packages/schema/schemas/critic-doctor-result.schema.json +74 -0
  82. package/packages/schema/schemas/critic-list-result.schema.json +90 -0
  83. package/packages/schema/schemas/critic-review-result.schema.json +397 -0
  84. package/packages/schema/schemas/critic-run-result.schema.json +249 -0
  85. package/packages/schema/schemas/critic-setup-result.schema.json +34 -0
  86. package/packages/schema/schemas/critic-watch-result.schema.json +211 -0
  87. package/packages/schema/schemas/critique-mark.schema.json +81 -0
  88. package/packages/schema/schemas/effective-delta.schema.json +337 -0
  89. package/packages/schema/schemas/effective-evidence.schema.json +337 -0
  90. package/packages/schema/schemas/layer-rows.schema.json +337 -0
  91. package/packages/schema/schemas/ui-catalog-diff-result.schema.json +201 -0
  92. package/packages/schema/schemas/ui-catalog-export-result.schema.json +83 -0
  93. package/packages/schema/schemas/ui-catalog-publish-result.schema.json +116 -0
  94. package/packages/schema/schemas/ui-catalog-status.schema.json +197 -0
  95. package/packages/server/openapi.json +6755 -4738
  96. package/packages/visualizer/src/app/AppShell.tsx +3 -1
  97. package/packages/visualizer/src/app/router.tsx +20 -7
  98. package/packages/visualizer/src/catalog/Picture.tsx +32 -0
  99. package/packages/visualizer/src/catalog/UiCatalogCompare.tsx +289 -0
  100. package/packages/visualizer/src/catalog/UiCatalogPage.tsx +18 -28
  101. package/packages/visualizer/src/catalog/history.ts +61 -0
  102. package/packages/visualizer/src/catalog/search.ts +14 -3
  103. package/packages/visualizer/src/components/Header.tsx +16 -4
  104. package/packages/visualizer/src/critiques/CritiquesPage.tsx +402 -0
  105. package/packages/visualizer/src/critiques/FindingOverlay.tsx +50 -0
  106. package/packages/visualizer/src/critiques/ranking.ts +54 -0
  107. package/packages/visualizer/src/critiques/search.ts +41 -0
  108. package/packages/visualizer/src/evidence/applicability-view.tsx +11 -7
  109. package/packages/visualizer/src/evidence/behaviors-page.tsx +22 -15
  110. package/packages/visualizer/src/evidence/evidence-context.tsx +2 -1
  111. package/packages/visualizer/src/explorer/Explorer.tsx +5 -0
  112. package/packages/visualizer/src/explorer/TestDetail.tsx +4 -1
  113. package/packages/visualizer/src/explorer/parts.tsx +19 -1
  114. package/packages/visualizer/src/explorer/playlist.tsx +11 -7
@@ -0,0 +1,397 @@
1
+ {
2
+ "$id": "https://github.com/crvouga/atlas/schemas/critic-review-result.schema.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "type": "boolean",
8
+ "const": true
9
+ },
10
+ "server": {
11
+ "type": "string"
12
+ },
13
+ "critic": {
14
+ "description": "The critic whose opinions are listed; null when none has judged anything",
15
+ "type": [
16
+ "string",
17
+ "null"
18
+ ]
19
+ },
20
+ "critics": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "string"
24
+ },
25
+ "description": "Every critic with an opinion, most opinions first"
26
+ },
27
+ "reviewer": {
28
+ "type": "string",
29
+ "description": "The name marks are recorded under"
30
+ },
31
+ "rankedBy": {
32
+ "type": "string",
33
+ "enum": [
34
+ "standing-within-kind",
35
+ "score"
36
+ ]
37
+ },
38
+ "summary": {
39
+ "type": "object",
40
+ "properties": {
41
+ "ranked": {
42
+ "type": "integer",
43
+ "minimum": 0,
44
+ "maximum": 9007199254740991
45
+ },
46
+ "unranked": {
47
+ "type": "integer",
48
+ "minimum": 0,
49
+ "maximum": 9007199254740991,
50
+ "description": "Judged at an earlier picture, or the critic could not judge"
51
+ },
52
+ "unjudged": {
53
+ "type": "integer",
54
+ "minimum": 0,
55
+ "maximum": 9007199254740991
56
+ }
57
+ },
58
+ "required": [
59
+ "ranked",
60
+ "unranked",
61
+ "unjudged"
62
+ ],
63
+ "additionalProperties": {}
64
+ },
65
+ "entries": {
66
+ "type": "array",
67
+ "items": {
68
+ "type": "object",
69
+ "properties": {
70
+ "rank": {
71
+ "anyOf": [
72
+ {
73
+ "type": "integer",
74
+ "exclusiveMinimum": 0,
75
+ "maximum": 9007199254740991
76
+ },
77
+ {
78
+ "type": "null"
79
+ }
80
+ ],
81
+ "description": "Null for an entry that is not ranked"
82
+ },
83
+ "key": {
84
+ "type": "string"
85
+ },
86
+ "title": {
87
+ "type": "string"
88
+ },
89
+ "state": {
90
+ "type": "string"
91
+ },
92
+ "imageSha256": {
93
+ "type": "string"
94
+ },
95
+ "score": {
96
+ "type": [
97
+ "number",
98
+ "null"
99
+ ]
100
+ },
101
+ "percentile": {
102
+ "description": "Standing among the scores of the same state kind, 0..100, higher is better",
103
+ "type": [
104
+ "number",
105
+ "null"
106
+ ]
107
+ },
108
+ "label": {
109
+ "type": [
110
+ "string",
111
+ "null"
112
+ ]
113
+ },
114
+ "currency": {
115
+ "type": "string",
116
+ "enum": [
117
+ "current",
118
+ "earlier-image"
119
+ ]
120
+ },
121
+ "failure": {
122
+ "description": "The reason code, when the critic could not judge it",
123
+ "type": "string"
124
+ },
125
+ "marks": {
126
+ "type": "object",
127
+ "properties": {
128
+ "state": {
129
+ "type": "string",
130
+ "enum": [
131
+ "accepted",
132
+ "dismissed",
133
+ "disputed",
134
+ "unmarked"
135
+ ],
136
+ "description": "`disputed`: reviewers disagree. `unmarked`: nobody has marked it at the current picture"
137
+ },
138
+ "accepted": {
139
+ "type": "array",
140
+ "items": {
141
+ "type": "string"
142
+ },
143
+ "description": "Reviewers who accepted it"
144
+ },
145
+ "dismissed": {
146
+ "type": "array",
147
+ "items": {
148
+ "type": "string"
149
+ },
150
+ "description": "Reviewers who dismissed it"
151
+ },
152
+ "earlier": {
153
+ "type": "integer",
154
+ "minimum": 0,
155
+ "maximum": 9007199254740991,
156
+ "description": "Marks made about an earlier picture, which count for nothing now"
157
+ },
158
+ "notes": {
159
+ "type": "array",
160
+ "items": {
161
+ "type": "string"
162
+ }
163
+ }
164
+ },
165
+ "required": [
166
+ "state",
167
+ "accepted",
168
+ "dismissed",
169
+ "earlier",
170
+ "notes"
171
+ ],
172
+ "additionalProperties": {},
173
+ "description": "The marks of the whole opinion"
174
+ },
175
+ "findings": {
176
+ "type": "array",
177
+ "items": {
178
+ "type": "object",
179
+ "properties": {
180
+ "id": {
181
+ "description": "A finding without an id cannot be marked on its own",
182
+ "type": [
183
+ "string",
184
+ "null"
185
+ ]
186
+ },
187
+ "category": {
188
+ "type": [
189
+ "string",
190
+ "null"
191
+ ]
192
+ },
193
+ "severity": {
194
+ "type": [
195
+ "string",
196
+ "null"
197
+ ]
198
+ },
199
+ "region": {
200
+ "type": "object",
201
+ "properties": {
202
+ "unit": {
203
+ "type": "string"
204
+ },
205
+ "x": {
206
+ "type": "number"
207
+ },
208
+ "y": {
209
+ "type": "number"
210
+ },
211
+ "w": {
212
+ "type": "number"
213
+ },
214
+ "h": {
215
+ "type": "number"
216
+ }
217
+ },
218
+ "required": [
219
+ "unit",
220
+ "x",
221
+ "y",
222
+ "w",
223
+ "h"
224
+ ],
225
+ "additionalProperties": {}
226
+ },
227
+ "rationale": {
228
+ "type": [
229
+ "string",
230
+ "null"
231
+ ]
232
+ },
233
+ "suggestion": {
234
+ "type": [
235
+ "string",
236
+ "null"
237
+ ]
238
+ },
239
+ "marks": {
240
+ "anyOf": [
241
+ {
242
+ "type": "object",
243
+ "properties": {
244
+ "state": {
245
+ "type": "string",
246
+ "enum": [
247
+ "accepted",
248
+ "dismissed",
249
+ "disputed",
250
+ "unmarked"
251
+ ],
252
+ "description": "`disputed`: reviewers disagree. `unmarked`: nobody has marked it at the current picture"
253
+ },
254
+ "accepted": {
255
+ "type": "array",
256
+ "items": {
257
+ "type": "string"
258
+ },
259
+ "description": "Reviewers who accepted it"
260
+ },
261
+ "dismissed": {
262
+ "type": "array",
263
+ "items": {
264
+ "type": "string"
265
+ },
266
+ "description": "Reviewers who dismissed it"
267
+ },
268
+ "earlier": {
269
+ "type": "integer",
270
+ "minimum": 0,
271
+ "maximum": 9007199254740991,
272
+ "description": "Marks made about an earlier picture, which count for nothing now"
273
+ },
274
+ "notes": {
275
+ "type": "array",
276
+ "items": {
277
+ "type": "string"
278
+ }
279
+ }
280
+ },
281
+ "required": [
282
+ "state",
283
+ "accepted",
284
+ "dismissed",
285
+ "earlier",
286
+ "notes"
287
+ ],
288
+ "additionalProperties": {}
289
+ },
290
+ {
291
+ "type": "null"
292
+ }
293
+ ]
294
+ }
295
+ },
296
+ "required": [
297
+ "id",
298
+ "category",
299
+ "severity",
300
+ "rationale",
301
+ "suggestion",
302
+ "marks"
303
+ ],
304
+ "additionalProperties": {}
305
+ }
306
+ }
307
+ },
308
+ "required": [
309
+ "rank",
310
+ "key",
311
+ "title",
312
+ "state",
313
+ "imageSha256",
314
+ "score",
315
+ "percentile",
316
+ "label",
317
+ "currency",
318
+ "marks",
319
+ "findings"
320
+ ],
321
+ "additionalProperties": {}
322
+ }
323
+ },
324
+ "marked": {
325
+ "description": "Present when this call recorded (or, with --dry-run, would record) marks",
326
+ "type": "object",
327
+ "properties": {
328
+ "dryRun": {
329
+ "type": "boolean"
330
+ },
331
+ "reviewer": {
332
+ "type": "string"
333
+ },
334
+ "layer": {
335
+ "description": "The layer the marks were published as; null on a dry run or when nothing was marked",
336
+ "type": [
337
+ "string",
338
+ "null"
339
+ ]
340
+ },
341
+ "marks": {
342
+ "type": "array",
343
+ "items": {
344
+ "type": "object",
345
+ "properties": {
346
+ "entry": {
347
+ "type": "string"
348
+ },
349
+ "critic": {
350
+ "type": "string"
351
+ },
352
+ "finding": {
353
+ "description": "Null: the whole opinion",
354
+ "type": [
355
+ "string",
356
+ "null"
357
+ ]
358
+ },
359
+ "decision": {
360
+ "type": "string",
361
+ "enum": [
362
+ "accept",
363
+ "dismiss"
364
+ ]
365
+ }
366
+ },
367
+ "required": [
368
+ "entry",
369
+ "critic",
370
+ "finding",
371
+ "decision"
372
+ ],
373
+ "additionalProperties": {}
374
+ }
375
+ }
376
+ },
377
+ "required": [
378
+ "dryRun",
379
+ "reviewer",
380
+ "layer",
381
+ "marks"
382
+ ],
383
+ "additionalProperties": {}
384
+ }
385
+ },
386
+ "required": [
387
+ "ok",
388
+ "server",
389
+ "critic",
390
+ "critics",
391
+ "reviewer",
392
+ "rankedBy",
393
+ "summary",
394
+ "entries"
395
+ ],
396
+ "additionalProperties": {}
397
+ }
@@ -0,0 +1,249 @@
1
+ {
2
+ "$id": "https://github.com/crvouga/atlas/schemas/critic-run-result.schema.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "type": "boolean",
8
+ "description": "False when a critic failed on any entry or a gate was crossed (the exit code is then 1)"
9
+ },
10
+ "dryRun": {
11
+ "type": "boolean"
12
+ },
13
+ "server": {
14
+ "type": "string"
15
+ },
16
+ "scope": {
17
+ "type": "object",
18
+ "propertyNames": {
19
+ "type": "string"
20
+ },
21
+ "additionalProperties": {
22
+ "type": "string"
23
+ },
24
+ "description": "The choices that narrowed the catalog, as given"
25
+ },
26
+ "critics": {
27
+ "type": "array",
28
+ "items": {
29
+ "type": "object",
30
+ "properties": {
31
+ "critic": {
32
+ "type": "string"
33
+ },
34
+ "version": {
35
+ "type": "string"
36
+ },
37
+ "sendsImagesTo": {
38
+ "type": [
39
+ "string",
40
+ "null"
41
+ ]
42
+ },
43
+ "entries": {
44
+ "type": "integer",
45
+ "minimum": 0,
46
+ "maximum": 9007199254740991,
47
+ "description": "Entries in the chosen scope"
48
+ },
49
+ "judged": {
50
+ "type": "integer",
51
+ "minimum": 0,
52
+ "maximum": 9007199254740991
53
+ },
54
+ "skipped": {
55
+ "type": "integer",
56
+ "minimum": 0,
57
+ "maximum": 9007199254740991,
58
+ "description": "Entries that already had a current critique of the same identity (critic, version, model, parameters, image hash): no call was made"
59
+ },
60
+ "failed": {
61
+ "type": "integer",
62
+ "minimum": 0,
63
+ "maximum": 9007199254740991,
64
+ "description": "Entries recorded as failed with a reason code; the next run retries them"
65
+ },
66
+ "waiting": {
67
+ "type": "integer",
68
+ "minimum": 0,
69
+ "maximum": 9007199254740991,
70
+ "description": "Entries left unjudged because the run stopped"
71
+ },
72
+ "stoppedBy": {
73
+ "type": "string",
74
+ "enum": [
75
+ "budget",
76
+ "aborted"
77
+ ]
78
+ },
79
+ "failures": {
80
+ "type": "array",
81
+ "items": {
82
+ "type": "object",
83
+ "properties": {
84
+ "entry": {
85
+ "type": "string"
86
+ },
87
+ "reason": {
88
+ "type": "string"
89
+ }
90
+ },
91
+ "required": [
92
+ "entry",
93
+ "reason"
94
+ ],
95
+ "additionalProperties": {}
96
+ },
97
+ "description": "Each failed entry and its reason code"
98
+ },
99
+ "spent": {
100
+ "type": "object",
101
+ "properties": {
102
+ "images": {
103
+ "type": "number"
104
+ },
105
+ "tokens": {
106
+ "type": "number"
107
+ },
108
+ "costUsd": {
109
+ "type": "number"
110
+ }
111
+ },
112
+ "required": [
113
+ "images",
114
+ "tokens",
115
+ "costUsd"
116
+ ],
117
+ "additionalProperties": {}
118
+ },
119
+ "published": {
120
+ "type": "object",
121
+ "properties": {
122
+ "layer": {
123
+ "description": "The layer id of the critiques, or null when nothing was published (a dry run, or nothing to publish)",
124
+ "type": [
125
+ "string",
126
+ "null"
127
+ ]
128
+ },
129
+ "critiques": {
130
+ "type": "integer",
131
+ "minimum": 0,
132
+ "maximum": 9007199254740991
133
+ }
134
+ },
135
+ "required": [
136
+ "layer",
137
+ "critiques"
138
+ ],
139
+ "additionalProperties": {}
140
+ },
141
+ "gate": {
142
+ "type": "object",
143
+ "properties": {
144
+ "mode": {
145
+ "type": "string",
146
+ "enum": [
147
+ "report",
148
+ "warn",
149
+ "gate"
150
+ ]
151
+ },
152
+ "exitCode": {
153
+ "type": "integer",
154
+ "minimum": -9007199254740991,
155
+ "maximum": 9007199254740991
156
+ },
157
+ "below": {
158
+ "type": "integer",
159
+ "minimum": 0,
160
+ "maximum": 9007199254740991,
161
+ "description": "Scores below their state kind's threshold"
162
+ },
163
+ "warnings": {
164
+ "type": "array",
165
+ "items": {
166
+ "type": "string"
167
+ }
168
+ },
169
+ "refusal": {
170
+ "type": "array",
171
+ "items": {
172
+ "type": "string"
173
+ },
174
+ "description": "Why `gate` was refused, when it was"
175
+ }
176
+ },
177
+ "required": [
178
+ "mode",
179
+ "exitCode",
180
+ "below",
181
+ "warnings",
182
+ "refusal"
183
+ ],
184
+ "additionalProperties": {}
185
+ }
186
+ },
187
+ "required": [
188
+ "critic",
189
+ "version",
190
+ "sendsImagesTo",
191
+ "entries",
192
+ "judged",
193
+ "skipped",
194
+ "failed",
195
+ "waiting",
196
+ "failures",
197
+ "spent",
198
+ "published"
199
+ ],
200
+ "additionalProperties": {}
201
+ }
202
+ },
203
+ "spool": {
204
+ "type": "object",
205
+ "properties": {
206
+ "flushed": {
207
+ "type": "integer",
208
+ "minimum": 0,
209
+ "maximum": 9007199254740991,
210
+ "description": "Objects from an earlier run that were sent now"
211
+ },
212
+ "spooled": {
213
+ "type": "integer",
214
+ "minimum": 0,
215
+ "maximum": 9007199254740991,
216
+ "description": "Objects of this run kept locally because the server could not be reached; the next invocation sends them"
217
+ },
218
+ "pending": {
219
+ "type": "integer",
220
+ "minimum": 0,
221
+ "maximum": 9007199254740991,
222
+ "description": "Objects still waiting in the spool"
223
+ }
224
+ },
225
+ "required": [
226
+ "flushed",
227
+ "spooled",
228
+ "pending"
229
+ ],
230
+ "additionalProperties": {}
231
+ },
232
+ "warnings": {
233
+ "type": "array",
234
+ "items": {
235
+ "type": "string"
236
+ }
237
+ }
238
+ },
239
+ "required": [
240
+ "ok",
241
+ "dryRun",
242
+ "server",
243
+ "scope",
244
+ "critics",
245
+ "spool",
246
+ "warnings"
247
+ ],
248
+ "additionalProperties": {}
249
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$id": "https://github.com/crvouga/atlas/schemas/critic-setup-result.schema.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "type": "boolean"
8
+ },
9
+ "critic": {
10
+ "type": "string"
11
+ },
12
+ "type": {
13
+ "type": "string"
14
+ },
15
+ "details": {
16
+ "type": "array",
17
+ "items": {
18
+ "type": "string"
19
+ },
20
+ "description": "What was provisioned or checked. A checkpoint is verified against its pinned SHA-256; inference never downloads anything"
21
+ },
22
+ "error": {
23
+ "description": "Why setup failed, with no credential in it. The exit code is then 1",
24
+ "type": "string"
25
+ }
26
+ },
27
+ "required": [
28
+ "ok",
29
+ "critic",
30
+ "type",
31
+ "details"
32
+ ],
33
+ "additionalProperties": {}
34
+ }