@crvouga/atlas 0.16.0 → 0.17.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 (38) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/reports/src/attachment-files.d.ts +3 -1
  3. package/dist/reports/src/attachment-files.js +14 -4
  4. package/dist/reports/src/evidence-types.d.ts +22 -0
  5. package/dist/reports/src/layer-merge.js +5 -0
  6. package/dist/reports/src/layer-types.d.ts +1 -1
  7. package/dist/reports/src/publish-checks.js +11 -3
  8. package/dist/reports/src/recording-receipt.d.ts +48 -0
  9. package/dist/reports/src/recording-receipt.js +103 -0
  10. package/dist/reports/src/report-cli.d.ts +1 -1
  11. package/dist/reports/src/report-cli.js +20 -2
  12. package/dist/reports/src/report-status.d.ts +2 -0
  13. package/dist/reports/src/report-status.js +17 -1
  14. package/dist/reports/src/reports-explorer-route.d.ts +8 -0
  15. package/dist/reports/src/reports-route.d.ts +8 -0
  16. package/dist/schema/src/api.d.ts +65 -0
  17. package/dist/schema/src/api.js +7 -2
  18. package/dist/schema/src/cli-results.d.ts +107 -2
  19. package/dist/schema/src/cli-results.js +11 -3
  20. package/dist/schema/src/layer.d.ts +165 -0
  21. package/dist/schema/src/layer.js +72 -1
  22. package/docs/reference/cli.md +5 -0
  23. package/docs/reference/reports.md +94 -2
  24. package/docs/reference/schema.md +59 -0
  25. package/docs/rich-evidence.md +29 -0
  26. package/llms-full.txt +34 -0
  27. package/package.json +1 -1
  28. package/packages/schema/schemas/check-detail.schema.json +20 -0
  29. package/packages/schema/schemas/effective-delta.schema.json +61 -0
  30. package/packages/schema/schemas/effective-evidence.schema.json +61 -0
  31. package/packages/schema/schemas/evidence-page.schema.json +45 -0
  32. package/packages/schema/schemas/layer-rows.schema.json +16 -0
  33. package/packages/schema/schemas/layer.schema.json +153 -0
  34. package/packages/schema/schemas/publish-checks.schema.json +24 -0
  35. package/packages/schema/schemas/publish-result.schema.json +161 -1
  36. package/packages/schema/schemas/report-status.schema.json +104 -0
  37. package/packages/server/openapi.json +331 -0
  38. package/packages/visualizer/src/evidence/marks.tsx +16 -0
@@ -120,6 +120,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
120
120
  height?: number | undefined;
121
121
  durationMs?: number | undefined;
122
122
  description?: string | undefined;
123
+ omitted?: string | undefined;
123
124
  tags?: string[] | undefined;
124
125
  at?: {
125
126
  [x: string]: import("hono/utils/types").JSONValue;
@@ -164,6 +165,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
164
165
  height?: number | undefined;
165
166
  durationMs?: number | undefined;
166
167
  description?: string | undefined;
168
+ omitted?: string | undefined;
167
169
  tags?: string[] | undefined;
168
170
  at?: {
169
171
  [x: string]: import("hono/utils/types").JSONValue;
@@ -221,6 +223,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
221
223
  height?: number | undefined;
222
224
  durationMs?: number | undefined;
223
225
  description?: string | undefined;
226
+ omitted?: string | undefined;
224
227
  tags?: string[] | undefined;
225
228
  at?: {
226
229
  [x: string]: import("hono/utils/types").JSONValue;
@@ -288,6 +291,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
288
291
  height?: number | undefined;
289
292
  durationMs?: number | undefined;
290
293
  description?: string | undefined;
294
+ omitted?: string | undefined;
291
295
  tags?: string[] | undefined;
292
296
  at?: {
293
297
  [x: string]: import("hono/utils/types").JSONValue;
@@ -394,6 +398,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
394
398
  height?: number | undefined;
395
399
  durationMs?: number | undefined;
396
400
  description?: string | undefined;
401
+ omitted?: string | undefined;
397
402
  tags?: string[] | undefined;
398
403
  at?: {
399
404
  [x: string]: import("hono/utils/types").JSONValue;
@@ -438,6 +443,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
438
443
  height?: number | undefined;
439
444
  durationMs?: number | undefined;
440
445
  description?: string | undefined;
446
+ omitted?: string | undefined;
441
447
  tags?: string[] | undefined;
442
448
  at?: {
443
449
  [x: string]: import("hono/utils/types").JSONValue;
@@ -495,6 +501,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
495
501
  height?: number | undefined;
496
502
  durationMs?: number | undefined;
497
503
  description?: string | undefined;
504
+ omitted?: string | undefined;
498
505
  tags?: string[] | undefined;
499
506
  at?: {
500
507
  [x: string]: import("hono/utils/types").JSONValue;
@@ -562,6 +569,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
562
569
  height?: number | undefined;
563
570
  durationMs?: number | undefined;
564
571
  description?: string | undefined;
572
+ omitted?: string | undefined;
565
573
  tags?: string[] | undefined;
566
574
  at?: {
567
575
  [x: string]: import("hono/utils/types").JSONValue;
@@ -165,6 +165,14 @@ export declare const LayerHeaderSchema: z.ZodObject<{
165
165
  available: z.ZodBoolean;
166
166
  }, z.core.$loose>>>;
167
167
  }, z.core.$loose>>;
168
+ recordings: z.ZodOptional<z.ZodObject<{
169
+ expected: z.ZodNumber;
170
+ uploaded: z.ZodNumber;
171
+ referenced: z.ZodNumber;
172
+ skipped: z.ZodNumber;
173
+ unresolved: z.ZodNumber;
174
+ notApplicable: z.ZodNumber;
175
+ }, z.core.$loose>>;
168
176
  }, z.core.$loose>;
169
177
  /** One check of a layer as the report shows it. */
170
178
  export declare const LayerRowSchema: z.ZodObject<{
@@ -207,6 +215,10 @@ export declare const LayerRowSchema: z.ZodObject<{
207
215
  available: z.ZodBoolean;
208
216
  }, z.core.$loose>>>;
209
217
  }, z.core.$loose>>;
218
+ recording: z.ZodOptional<z.ZodObject<{
219
+ state: z.ZodString;
220
+ reason: z.ZodOptional<z.ZodString>;
221
+ }, z.core.$loose>>;
210
222
  }, z.core.$loose>;
211
223
  /** A layer with its checks: the rows of one layer, read apart from its header. */
212
224
  export declare const LayerRowsSchema: z.ZodObject<{
@@ -251,6 +263,10 @@ export declare const LayerRowsSchema: z.ZodObject<{
251
263
  available: z.ZodBoolean;
252
264
  }, z.core.$loose>>>;
253
265
  }, z.core.$loose>>;
266
+ recording: z.ZodOptional<z.ZodObject<{
267
+ state: z.ZodString;
268
+ reason: z.ZodOptional<z.ZodString>;
269
+ }, z.core.$loose>>;
254
270
  }, z.core.$loose>>;
255
271
  fingerprints: z.ZodRecord<z.ZodString, z.ZodString>;
256
272
  }, z.core.$loose>;
@@ -297,6 +313,10 @@ export declare const LayerEvidenceSchema: z.ZodObject<{
297
313
  available: z.ZodBoolean;
298
314
  }, z.core.$loose>>>;
299
315
  }, z.core.$loose>>;
316
+ recording: z.ZodOptional<z.ZodObject<{
317
+ state: z.ZodString;
318
+ reason: z.ZodOptional<z.ZodString>;
319
+ }, z.core.$loose>>;
300
320
  }, z.core.$loose>>;
301
321
  fingerprints: z.ZodRecord<z.ZodString, z.ZodString>;
302
322
  layer: z.ZodObject<{
@@ -348,6 +368,14 @@ export declare const LayerEvidenceSchema: z.ZodObject<{
348
368
  available: z.ZodBoolean;
349
369
  }, z.core.$loose>>>;
350
370
  }, z.core.$loose>>;
371
+ recordings: z.ZodOptional<z.ZodObject<{
372
+ expected: z.ZodNumber;
373
+ uploaded: z.ZodNumber;
374
+ referenced: z.ZodNumber;
375
+ skipped: z.ZodNumber;
376
+ unresolved: z.ZodNumber;
377
+ notApplicable: z.ZodNumber;
378
+ }, z.core.$loose>>;
351
379
  }, z.core.$loose>;
352
380
  }, z.core.$loose>;
353
381
  /**
@@ -399,6 +427,10 @@ export declare const EffectiveEvidenceSchema: z.ZodObject<{
399
427
  available: z.ZodBoolean;
400
428
  }, z.core.$loose>>>;
401
429
  }, z.core.$loose>>;
430
+ recording: z.ZodOptional<z.ZodObject<{
431
+ state: z.ZodString;
432
+ reason: z.ZodOptional<z.ZodString>;
433
+ }, z.core.$loose>>;
402
434
  }, z.core.$loose>>;
403
435
  fingerprints: z.ZodRecord<z.ZodString, z.ZodString>;
404
436
  layer: z.ZodObject<{
@@ -450,6 +482,14 @@ export declare const EffectiveEvidenceSchema: z.ZodObject<{
450
482
  available: z.ZodBoolean;
451
483
  }, z.core.$loose>>>;
452
484
  }, z.core.$loose>>;
485
+ recordings: z.ZodOptional<z.ZodObject<{
486
+ expected: z.ZodNumber;
487
+ uploaded: z.ZodNumber;
488
+ referenced: z.ZodNumber;
489
+ skipped: z.ZodNumber;
490
+ unresolved: z.ZodNumber;
491
+ notApplicable: z.ZodNumber;
492
+ }, z.core.$loose>>;
453
493
  }, z.core.$loose>;
454
494
  }, z.core.$loose>>;
455
495
  backends: z.ZodArray<z.ZodObject<{
@@ -522,6 +562,10 @@ export declare const EffectiveDeltaSchema: z.ZodObject<{
522
562
  available: z.ZodBoolean;
523
563
  }, z.core.$loose>>>;
524
564
  }, z.core.$loose>>;
565
+ recording: z.ZodOptional<z.ZodObject<{
566
+ state: z.ZodString;
567
+ reason: z.ZodOptional<z.ZodString>;
568
+ }, z.core.$loose>>;
525
569
  }, z.core.$loose>>;
526
570
  fingerprints: z.ZodRecord<z.ZodString, z.ZodString>;
527
571
  layer: z.ZodObject<{
@@ -573,6 +617,14 @@ export declare const EffectiveDeltaSchema: z.ZodObject<{
573
617
  available: z.ZodBoolean;
574
618
  }, z.core.$loose>>>;
575
619
  }, z.core.$loose>>;
620
+ recordings: z.ZodOptional<z.ZodObject<{
621
+ expected: z.ZodNumber;
622
+ uploaded: z.ZodNumber;
623
+ referenced: z.ZodNumber;
624
+ skipped: z.ZodNumber;
625
+ unresolved: z.ZodNumber;
626
+ notApplicable: z.ZodNumber;
627
+ }, z.core.$loose>>;
576
628
  }, z.core.$loose>;
577
629
  }, z.core.$loose>>;
578
630
  removed: z.ZodArray<z.ZodString>;
@@ -648,6 +700,14 @@ export declare const EvidencePageSchema: z.ZodObject<{
648
700
  available: z.ZodBoolean;
649
701
  }, z.core.$loose>>>;
650
702
  }, z.core.$loose>>;
703
+ recordings: z.ZodOptional<z.ZodObject<{
704
+ expected: z.ZodNumber;
705
+ uploaded: z.ZodNumber;
706
+ referenced: z.ZodNumber;
707
+ skipped: z.ZodNumber;
708
+ unresolved: z.ZodNumber;
709
+ notApplicable: z.ZodNumber;
710
+ }, z.core.$loose>>;
651
711
  }, z.core.$loose>>;
652
712
  cursor: z.ZodNullable<z.ZodString>;
653
713
  notices: z.ZodArray<z.ZodString>;
@@ -687,6 +747,7 @@ export declare const CheckDetailSchema: z.ZodObject<{
687
747
  height: z.ZodOptional<z.ZodNumber>;
688
748
  durationMs: z.ZodOptional<z.ZodNumber>;
689
749
  description: z.ZodOptional<z.ZodString>;
750
+ omitted: z.ZodOptional<z.ZodString>;
690
751
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
691
752
  at: z.ZodOptional<z.ZodObject<{
692
753
  step: z.ZodOptional<z.ZodString>;
@@ -752,6 +813,7 @@ export declare const CheckDetailSchema: z.ZodObject<{
752
813
  height: z.ZodOptional<z.ZodNumber>;
753
814
  durationMs: z.ZodOptional<z.ZodNumber>;
754
815
  description: z.ZodOptional<z.ZodString>;
816
+ omitted: z.ZodOptional<z.ZodString>;
755
817
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
756
818
  at: z.ZodOptional<z.ZodObject<{
757
819
  step: z.ZodOptional<z.ZodString>;
@@ -797,6 +859,7 @@ export declare const CheckDetailSchema: z.ZodObject<{
797
859
  height: z.ZodOptional<z.ZodNumber>;
798
860
  durationMs: z.ZodOptional<z.ZodNumber>;
799
861
  description: z.ZodOptional<z.ZodString>;
862
+ omitted: z.ZodOptional<z.ZodString>;
800
863
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
801
864
  at: z.ZodOptional<z.ZodObject<{
802
865
  step: z.ZodOptional<z.ZodString>;
@@ -849,6 +912,7 @@ export declare const CheckDetailSchema: z.ZodObject<{
849
912
  height: z.ZodOptional<z.ZodNumber>;
850
913
  durationMs: z.ZodOptional<z.ZodNumber>;
851
914
  description: z.ZodOptional<z.ZodString>;
915
+ omitted: z.ZodOptional<z.ZodString>;
852
916
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
853
917
  at: z.ZodOptional<z.ZodObject<{
854
918
  step: z.ZodOptional<z.ZodString>;
@@ -896,6 +960,7 @@ export declare const CheckDetailSchema: z.ZodObject<{
896
960
  limit: z.ZodOptional<z.ZodNumber>;
897
961
  }, z.core.$loose>>>;
898
962
  durationMs: z.ZodOptional<z.ZodNumber>;
963
+ recordingExpectation: z.ZodOptional<z.ZodString>;
899
964
  }, z.core.$loose>;
900
965
  run: z.ZodObject<{}, z.core.$loose>;
901
966
  }, z.core.$loose>;
@@ -108,7 +108,11 @@ export const LayerHeaderSchema = z.looseObject({
108
108
  live: z.boolean(),
109
109
  counts: z.record(EvidenceStatusSchema, z.number().int().nonnegative()),
110
110
  execution: z.string(),
111
- evidence: EvidenceSummarySchema.optional()
111
+ evidence: EvidenceSummarySchema.optional(),
112
+ recordings: z.looseObject({
113
+ expected: z.number().int().nonnegative(), uploaded: z.number().int().nonnegative(), referenced: z.number().int().nonnegative(),
114
+ skipped: z.number().int().nonnegative(), unresolved: z.number().int().nonnegative(), notApplicable: z.number().int().nonnegative()
115
+ }).optional().describe('How many of the recordings the layer expected were published. Absent: the layer declared no expectations, so its completeness is unknown, not complete')
112
116
  });
113
117
  /** One check of a layer as the report shows it. */
114
118
  export const LayerRowSchema = z.looseObject({
@@ -122,7 +126,8 @@ export const LayerRowSchema = z.looseObject({
122
126
  testId: z.string().nullable(),
123
127
  variant: z.record(z.string(), z.string()),
124
128
  durationMs: z.number().nullable(),
125
- evidence: EvidenceSummarySchema.optional()
129
+ evidence: EvidenceSummarySchema.optional(),
130
+ recording: z.looseObject({ state: z.string(), reason: z.string().optional() }).optional().describe('What became of the check\'s expected recording: uploaded, referenced, skipped, unresolved or not-applicable. Independent of `status`')
126
131
  });
127
132
  /** A layer with its checks: the rows of one layer, read apart from its header. */
128
133
  export const LayerRowsSchema = z.looseObject({
@@ -29,10 +29,30 @@ export declare const PublishedLayerSchema: z.ZodObject<{
29
29
  }>>;
30
30
  attachmentFiles: z.ZodNumber;
31
31
  attachmentBytes: z.ZodNumber;
32
+ recordings: z.ZodOptional<z.ZodObject<{
33
+ expected: z.ZodNumber;
34
+ uploaded: z.ZodNumber;
35
+ referenced: z.ZodNumber;
36
+ skipped: z.ZodNumber;
37
+ unresolved: z.ZodNumber;
38
+ notApplicable: z.ZodNumber;
39
+ items: z.ZodArray<z.ZodObject<{
40
+ check: z.ZodString;
41
+ state: z.ZodString;
42
+ reason: z.ZodOptional<z.ZodString>;
43
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
44
+ name: z.ZodString;
45
+ state: z.ZodOptional<z.ZodString>;
46
+ bytes: z.ZodOptional<z.ZodNumber>;
47
+ sha256: z.ZodOptional<z.ZodString>;
48
+ reason: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$loose>>>;
50
+ }, z.core.$loose>>;
51
+ }, z.core.$loose>>;
32
52
  }, z.core.$loose>;
33
53
  /** What `atlas report publish --format json` prints. */
34
54
  export declare const PublishResultSchema: z.ZodObject<{
35
- ok: z.ZodLiteral<true>;
55
+ ok: z.ZodBoolean;
36
56
  store: z.ZodString;
37
57
  layer: z.ZodObject<{
38
58
  id: z.ZodString;
@@ -49,6 +69,26 @@ export declare const PublishResultSchema: z.ZodObject<{
49
69
  }>>;
50
70
  attachmentFiles: z.ZodNumber;
51
71
  attachmentBytes: z.ZodNumber;
72
+ recordings: z.ZodOptional<z.ZodObject<{
73
+ expected: z.ZodNumber;
74
+ uploaded: z.ZodNumber;
75
+ referenced: z.ZodNumber;
76
+ skipped: z.ZodNumber;
77
+ unresolved: z.ZodNumber;
78
+ notApplicable: z.ZodNumber;
79
+ items: z.ZodArray<z.ZodObject<{
80
+ check: z.ZodString;
81
+ state: z.ZodString;
82
+ reason: z.ZodOptional<z.ZodString>;
83
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
84
+ name: z.ZodString;
85
+ state: z.ZodOptional<z.ZodString>;
86
+ bytes: z.ZodOptional<z.ZodNumber>;
87
+ sha256: z.ZodOptional<z.ZodString>;
88
+ reason: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$loose>>>;
90
+ }, z.core.$loose>>;
91
+ }, z.core.$loose>>;
52
92
  }, z.core.$loose>;
53
93
  specSet: z.ZodOptional<z.ZodObject<{
54
94
  id: z.ZodString;
@@ -61,6 +101,17 @@ export declare const PublishResultSchema: z.ZodObject<{
61
101
  bytes: z.ZodNumber;
62
102
  alreadyPublished: z.ZodBoolean;
63
103
  }, z.core.$loose>>;
104
+ recordings: z.ZodOptional<z.ZodObject<{
105
+ strict: z.ZodBoolean;
106
+ complete: z.ZodBoolean;
107
+ expected: z.ZodNumber;
108
+ uploaded: z.ZodNumber;
109
+ gaps: z.ZodArray<z.ZodObject<{
110
+ check: z.ZodString;
111
+ state: z.ZodString;
112
+ reason: z.ZodOptional<z.ZodString>;
113
+ }, z.core.$loose>>;
114
+ }, z.core.$loose>>;
64
115
  warnings: z.ZodArray<z.ZodString>;
65
116
  }, z.core.$loose>;
66
117
  /** What `atlas report stream --format json` prints when its input ends. */
@@ -288,7 +339,7 @@ export declare const CLI_RESULTS: {
288
339
  readonly command: "atlas report publish";
289
340
  readonly schemaName: "publish-result";
290
341
  readonly schema: z.ZodObject<{
291
- ok: z.ZodLiteral<true>;
342
+ ok: z.ZodBoolean;
292
343
  store: z.ZodString;
293
344
  layer: z.ZodObject<{
294
345
  id: z.ZodString;
@@ -305,6 +356,26 @@ export declare const CLI_RESULTS: {
305
356
  }>>;
306
357
  attachmentFiles: z.ZodNumber;
307
358
  attachmentBytes: z.ZodNumber;
359
+ recordings: z.ZodOptional<z.ZodObject<{
360
+ expected: z.ZodNumber;
361
+ uploaded: z.ZodNumber;
362
+ referenced: z.ZodNumber;
363
+ skipped: z.ZodNumber;
364
+ unresolved: z.ZodNumber;
365
+ notApplicable: z.ZodNumber;
366
+ items: z.ZodArray<z.ZodObject<{
367
+ check: z.ZodString;
368
+ state: z.ZodString;
369
+ reason: z.ZodOptional<z.ZodString>;
370
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
371
+ name: z.ZodString;
372
+ state: z.ZodOptional<z.ZodString>;
373
+ bytes: z.ZodOptional<z.ZodNumber>;
374
+ sha256: z.ZodOptional<z.ZodString>;
375
+ reason: z.ZodOptional<z.ZodString>;
376
+ }, z.core.$loose>>>;
377
+ }, z.core.$loose>>;
378
+ }, z.core.$loose>>;
308
379
  }, z.core.$loose>;
309
380
  specSet: z.ZodOptional<z.ZodObject<{
310
381
  id: z.ZodString;
@@ -317,6 +388,17 @@ export declare const CLI_RESULTS: {
317
388
  bytes: z.ZodNumber;
318
389
  alreadyPublished: z.ZodBoolean;
319
390
  }, z.core.$loose>>;
391
+ recordings: z.ZodOptional<z.ZodObject<{
392
+ strict: z.ZodBoolean;
393
+ complete: z.ZodBoolean;
394
+ expected: z.ZodNumber;
395
+ uploaded: z.ZodNumber;
396
+ gaps: z.ZodArray<z.ZodObject<{
397
+ check: z.ZodString;
398
+ state: z.ZodString;
399
+ reason: z.ZodOptional<z.ZodString>;
400
+ }, z.core.$loose>>;
401
+ }, z.core.$loose>>;
320
402
  warnings: z.ZodArray<z.ZodString>;
321
403
  }, z.core.$loose>;
322
404
  };
@@ -425,6 +507,29 @@ export declare const CLI_RESULTS: {
425
507
  runUrl: z.ZodNullable<z.ZodString>;
426
508
  detail: z.ZodString;
427
509
  }, z.core.$loose>>;
510
+ recordings: z.ZodOptional<z.ZodObject<{
511
+ state: z.ZodEnum<{
512
+ unknown: "unknown";
513
+ complete: "complete";
514
+ incomplete: "incomplete";
515
+ "none-expected": "none-expected";
516
+ }>;
517
+ expected: z.ZodNumber;
518
+ uploaded: z.ZodNumber;
519
+ referenced: z.ZodNumber;
520
+ skipped: z.ZodNumber;
521
+ unresolved: z.ZodNumber;
522
+ notApplicable: z.ZodNumber;
523
+ layersWithoutReceipt: z.ZodNumber;
524
+ gaps: z.ZodArray<z.ZodObject<{
525
+ spec: z.ZodNullable<z.ZodString>;
526
+ check: z.ZodString;
527
+ layer: z.ZodString;
528
+ environment: z.ZodNullable<z.ZodString>;
529
+ state: z.ZodString;
530
+ reason: z.ZodOptional<z.ZodString>;
531
+ }, z.core.$loose>>;
532
+ }, z.core.$loose>>;
428
533
  }, z.core.$loose>;
429
534
  };
430
535
  readonly error: {
@@ -13,7 +13,7 @@
13
13
  * @see docs/agents.md
14
14
  */
15
15
  import { z } from 'zod/v4';
16
- import { ReportStatusSchema } from './layer.js';
16
+ import { RecordingReceiptSchema, ReportStatusSchema } from './layer.js';
17
17
  /** What was written for one layer by `atlas report publish`. */
18
18
  export const PublishedLayerSchema = z.looseObject({
19
19
  id: z.string().describe('The layer id: 64 hex digits, the SHA-256 of its content. Publishing the same input again gives the same id'),
@@ -26,15 +26,23 @@ export const PublishedLayerSchema = z.looseObject({
26
26
  linkedToSpec: z.number().int().nonnegative().describe('Checks that were matched to a spec file. The rest still count, but belong to no spec'),
27
27
  freshness: z.enum(['modified', 'unknown']).optional().describe('Set when the checkout had uncommitted changes (`modified`) or no git origin (`unknown`)'),
28
28
  attachmentFiles: z.number().int().nonnegative(),
29
- attachmentBytes: z.number().int().nonnegative()
29
+ attachmentBytes: z.number().int().nonnegative(),
30
+ recordings: RecordingReceiptSchema.optional().describe('Present when a check declared a `recordingExpectation`: what became of each expected video, with sizes and checksums of the stored bytes. It describes publication only; the checks keep their results')
30
31
  });
31
32
  /** What `atlas report publish --format json` prints. */
32
33
  export const PublishResultSchema = z.looseObject({
33
- ok: z.literal(true),
34
+ ok: z.boolean().describe('True when the layer was written. False only with `--require-recordings` when an expected recording is not uploaded (the layer was still written; the exit code is then 1)'),
34
35
  store: z.string().describe('Where it was written: a folder, `s3://…` or a server URL'),
35
36
  layer: PublishedLayerSchema,
36
37
  specSet: z.looseObject({ id: z.string(), files: z.number().int().nonnegative(), branch: z.string().nullable() }).optional().describe('Present when `--specs` was given'),
37
38
  run: z.looseObject({ id: z.string(), files: z.number().int().nonnegative(), bytes: z.number().int().nonnegative(), alreadyPublished: z.boolean() }).optional().describe('Present with `--upload-run`'),
39
+ recordings: z.looseObject({
40
+ strict: z.boolean().describe('Whether `--require-recordings` was given'),
41
+ complete: z.boolean().describe('True when every expected recording is uploaded or referenced'),
42
+ expected: z.number().int().nonnegative(),
43
+ uploaded: z.number().int().nonnegative(),
44
+ gaps: z.array(z.looseObject({ check: z.string(), state: z.string(), reason: z.string().optional() })).describe('Each expected recording that is skipped or unresolved. Retry after fixing it: publishing again reuses the stored files')
45
+ }).optional().describe('Present when a check declared a `recordingExpectation`'),
38
46
  warnings: z.array(z.string()).describe('What was skipped and why, such as an attachment file that could not be read. Never fatal')
39
47
  });
40
48
  /** What `atlas report stream --format json` prints when its input ends. */