@crvouga/atlas 0.16.0 → 1.0.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 (91) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +52 -8
  3. package/dist/core/src/cli.d.ts +1 -1
  4. package/dist/core/src/cli.js +1 -1
  5. package/dist/reports/src/attachment-files.d.ts +3 -1
  6. package/dist/reports/src/attachment-files.js +14 -4
  7. package/dist/reports/src/evidence-types.d.ts +22 -0
  8. package/dist/reports/src/garbage.d.ts +39 -0
  9. package/dist/reports/src/garbage.js +82 -0
  10. package/dist/reports/src/layer-merge.js +5 -0
  11. package/dist/reports/src/layer-types.d.ts +1 -1
  12. package/dist/reports/src/publish-checks.js +11 -3
  13. package/dist/reports/src/recording-receipt.d.ts +48 -0
  14. package/dist/reports/src/recording-receipt.js +103 -0
  15. package/dist/reports/src/report-cli.d.ts +1 -1
  16. package/dist/reports/src/report-cli.js +20 -2
  17. package/dist/reports/src/report-index.d.ts +6 -0
  18. package/dist/reports/src/report-index.js +14 -0
  19. package/dist/reports/src/report-status.d.ts +2 -0
  20. package/dist/reports/src/report-status.js +17 -1
  21. package/dist/reports/src/reports-explorer-route.d.ts +8 -0
  22. package/dist/reports/src/reports-route.d.ts +8 -0
  23. package/dist/schema/src/api.d.ts +65 -0
  24. package/dist/schema/src/api.js +7 -2
  25. package/dist/schema/src/cli-results.d.ts +107 -2
  26. package/dist/schema/src/cli-results.js +11 -3
  27. package/dist/schema/src/index.d.ts +1 -0
  28. package/dist/schema/src/index.js +1 -0
  29. package/dist/schema/src/layer.d.ts +165 -0
  30. package/dist/schema/src/layer.js +72 -1
  31. package/dist/schema/src/server-config.d.ts +7 -49
  32. package/dist/schema/src/server-config.js +8 -21
  33. package/dist/schema/src/user-state.d.ts +115 -0
  34. package/dist/schema/src/user-state.js +54 -0
  35. package/dist/server/src/app.d.ts +16 -2
  36. package/dist/server/src/app.js +62 -0
  37. package/dist/server/src/config.d.ts +16 -21
  38. package/dist/server/src/config.js +48 -57
  39. package/dist/server/src/dev.d.ts +1 -1
  40. package/dist/server/src/dev.js +20 -7
  41. package/dist/server/src/index.d.ts +5 -1
  42. package/dist/server/src/index.js +5 -1
  43. package/dist/server/src/main.d.ts +23 -7
  44. package/dist/server/src/main.js +72 -26
  45. package/dist/server/src/openapi.js +24 -5
  46. package/dist/server/src/projects.js +89 -14
  47. package/dist/server/src/settings.d.ts +23 -7
  48. package/dist/server/src/settings.js +50 -60
  49. package/dist/server/src/storage.d.ts +68 -0
  50. package/dist/server/src/storage.js +125 -0
  51. package/dist/server/src/user-state.d.ts +31 -0
  52. package/dist/server/src/user-state.js +74 -0
  53. package/docs/agents.md +1 -1
  54. package/docs/deploying.md +38 -39
  55. package/docs/reference/cli.md +17 -7
  56. package/docs/reference/http-api.md +30 -2
  57. package/docs/reference/reports.md +165 -2
  58. package/docs/reference/schema.md +161 -16
  59. package/docs/reference/server.md +263 -41
  60. package/docs/report-backends.md +0 -144
  61. package/docs/report-contract.md +1 -1
  62. package/docs/rich-evidence.md +29 -0
  63. package/docs/runners.md +1 -1
  64. package/docs/server.md +141 -36
  65. package/docs/statecharts.md +1 -1
  66. package/docs/ui.md +1 -1
  67. package/docs/workspaces.md +5 -2
  68. package/llms-full.txt +265 -234
  69. package/llms.txt +1 -1
  70. package/package.json +2 -2
  71. package/packages/reports/STORAGE.md +1 -1
  72. package/packages/schema/schemas/check-detail.schema.json +20 -0
  73. package/packages/schema/schemas/effective-delta.schema.json +61 -0
  74. package/packages/schema/schemas/effective-evidence.schema.json +61 -0
  75. package/packages/schema/schemas/evidence-page.schema.json +45 -0
  76. package/packages/schema/schemas/gc-policy.schema.json +36 -0
  77. package/packages/schema/schemas/gc-run-result.schema.json +106 -0
  78. package/packages/schema/schemas/gc-snapshot.schema.json +122 -0
  79. package/packages/schema/schemas/layer-rows.schema.json +16 -0
  80. package/packages/schema/schemas/layer.schema.json +153 -0
  81. package/packages/schema/schemas/publish-checks.schema.json +24 -0
  82. package/packages/schema/schemas/publish-result.schema.json +161 -1
  83. package/packages/schema/schemas/report-status.schema.json +104 -0
  84. package/packages/schema/schemas/server-config.schema.json +0 -41
  85. package/packages/schema/schemas/server-editable-settings.schema.json +0 -41
  86. package/packages/schema/schemas/server-settings-snapshot.schema.json +0 -82
  87. package/packages/schema/schemas/user-state.schema.json +140 -0
  88. package/packages/server/README.md +11 -6
  89. package/packages/server/openapi.json +843 -128
  90. package/packages/visualizer/src/admin/SettingsPage.tsx +183 -88
  91. package/packages/visualizer/src/evidence/marks.tsx +16 -0
@@ -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. */
@@ -15,6 +15,7 @@ export * from './spec.js';
15
15
  export * from './report-sources.js';
16
16
  export * from './layer.js';
17
17
  export * from './server-config.js';
18
+ export * from './user-state.js';
18
19
  export * from './api.js';
19
20
  export * from './cli-results.js';
20
21
  export * from './live-run.js';
@@ -15,6 +15,7 @@ export * from './spec.js';
15
15
  export * from './report-sources.js';
16
16
  export * from './layer.js';
17
17
  export * from './server-config.js';
18
+ export * from './user-state.js';
18
19
  export * from './api.js';
19
20
  export * from './cli-results.js';
20
21
  export * from './live-run.js';
@@ -121,6 +121,7 @@ export declare const AttachmentSchema: z.ZodObject<{
121
121
  height: z.ZodOptional<z.ZodNumber>;
122
122
  durationMs: z.ZodOptional<z.ZodNumber>;
123
123
  description: z.ZodOptional<z.ZodString>;
124
+ omitted: z.ZodOptional<z.ZodString>;
124
125
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
125
126
  at: z.ZodOptional<z.ZodObject<{
126
127
  step: z.ZodOptional<z.ZodString>;
@@ -132,6 +133,59 @@ export declare const AttachmentSchema: z.ZodObject<{
132
133
  }, z.core.$loose>;
133
134
  /** An attachment as stored in a layer, parsed from `AttachmentSchema`. */
134
135
  export type Attachment = z.output<typeof AttachmentSchema>;
136
+ /**
137
+ * Whether a check is expected to have a screen recording (a video). `required`: the producer expects one, and the layer's
138
+ * recording receipt says whether it arrived. `not-applicable`: the check is intentionally unrecorded (an API-only check),
139
+ * so it counts as neither a recorded pass nor a missing video. An open string: a reader treats any other value, and its
140
+ * absence, as no expectation.
141
+ */
142
+ export declare const RECORDING_EXPECTATIONS: readonly ["required", "not-applicable"];
143
+ /**
144
+ * The state of one check's recording in a receipt, in an open vocabulary. Conventions: `uploaded` (the video's bytes are in
145
+ * the layer, with a checksum), `referenced` (only a `uri` was given: Atlas cannot vouch for it), `skipped` (the video was
146
+ * captured but its bytes were left out, with a reason), `unresolved` (no video was attached at all), `not-applicable`
147
+ * (intentionally unrecorded). A reader shows a state it does not know as it is and never counts it as uploaded.
148
+ */
149
+ export declare const RecordingItemSchema: z.ZodObject<{
150
+ check: z.ZodString;
151
+ state: z.ZodString;
152
+ reason: z.ZodOptional<z.ZodString>;
153
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
154
+ name: z.ZodString;
155
+ state: z.ZodOptional<z.ZodString>;
156
+ bytes: z.ZodOptional<z.ZodNumber>;
157
+ sha256: z.ZodOptional<z.ZodString>;
158
+ reason: z.ZodOptional<z.ZodString>;
159
+ }, z.core.$loose>>>;
160
+ }, z.core.$loose>;
161
+ /**
162
+ * What a layer's producer published about the recordings it expected: counts and one item per check that expected a
163
+ * recording (or declared itself not applicable). Written by `publishChecks` when any check declares a
164
+ * `recordingExpectation`; a layer without it says nothing, which a reader reports as Unknown, never Complete. It only
165
+ * describes publication: it never changes a check's status, its slot or which result wins.
166
+ */
167
+ export declare const RecordingReceiptSchema: z.ZodObject<{
168
+ expected: z.ZodNumber;
169
+ uploaded: z.ZodNumber;
170
+ referenced: z.ZodNumber;
171
+ skipped: z.ZodNumber;
172
+ unresolved: z.ZodNumber;
173
+ notApplicable: z.ZodNumber;
174
+ items: z.ZodArray<z.ZodObject<{
175
+ check: z.ZodString;
176
+ state: z.ZodString;
177
+ reason: z.ZodOptional<z.ZodString>;
178
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
179
+ name: z.ZodString;
180
+ state: z.ZodOptional<z.ZodString>;
181
+ bytes: z.ZodOptional<z.ZodNumber>;
182
+ sha256: z.ZodOptional<z.ZodString>;
183
+ reason: z.ZodOptional<z.ZodString>;
184
+ }, z.core.$loose>>>;
185
+ }, z.core.$loose>>;
186
+ }, z.core.$loose>;
187
+ /** A recording receipt as stored in a layer, parsed from `RecordingReceiptSchema`. */
188
+ export type RecordingReceipt = z.output<typeof RecordingReceiptSchema>;
135
189
  /** A note about a result: a warning, a deprecation, a coverage figure, an accessibility finding, anything. */
136
190
  export declare const AnnotationSchema: z.ZodObject<{
137
191
  type: z.ZodString;
@@ -182,6 +236,7 @@ export declare const StepSchema: z.ZodObject<{
182
236
  height: z.ZodOptional<z.ZodNumber>;
183
237
  durationMs: z.ZodOptional<z.ZodNumber>;
184
238
  description: z.ZodOptional<z.ZodString>;
239
+ omitted: z.ZodOptional<z.ZodString>;
185
240
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
186
241
  at: z.ZodOptional<z.ZodObject<{
187
242
  step: z.ZodOptional<z.ZodString>;
@@ -250,6 +305,7 @@ export declare const AttemptSchema: z.ZodObject<{
250
305
  height: z.ZodOptional<z.ZodNumber>;
251
306
  durationMs: z.ZodOptional<z.ZodNumber>;
252
307
  description: z.ZodOptional<z.ZodString>;
308
+ omitted: z.ZodOptional<z.ZodString>;
253
309
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
254
310
  at: z.ZodOptional<z.ZodObject<{
255
311
  step: z.ZodOptional<z.ZodString>;
@@ -295,6 +351,7 @@ export declare const AttemptSchema: z.ZodObject<{
295
351
  height: z.ZodOptional<z.ZodNumber>;
296
352
  durationMs: z.ZodOptional<z.ZodNumber>;
297
353
  description: z.ZodOptional<z.ZodString>;
354
+ omitted: z.ZodOptional<z.ZodString>;
298
355
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
299
356
  at: z.ZodOptional<z.ZodObject<{
300
357
  step: z.ZodOptional<z.ZodString>;
@@ -359,6 +416,7 @@ export declare const CheckSchema: z.ZodObject<{
359
416
  height: z.ZodOptional<z.ZodNumber>;
360
417
  durationMs: z.ZodOptional<z.ZodNumber>;
361
418
  description: z.ZodOptional<z.ZodString>;
419
+ omitted: z.ZodOptional<z.ZodString>;
362
420
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
363
421
  at: z.ZodOptional<z.ZodObject<{
364
422
  step: z.ZodOptional<z.ZodString>;
@@ -424,6 +482,7 @@ export declare const CheckSchema: z.ZodObject<{
424
482
  height: z.ZodOptional<z.ZodNumber>;
425
483
  durationMs: z.ZodOptional<z.ZodNumber>;
426
484
  description: z.ZodOptional<z.ZodString>;
485
+ omitted: z.ZodOptional<z.ZodString>;
427
486
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
428
487
  at: z.ZodOptional<z.ZodObject<{
429
488
  step: z.ZodOptional<z.ZodString>;
@@ -469,6 +528,7 @@ export declare const CheckSchema: z.ZodObject<{
469
528
  height: z.ZodOptional<z.ZodNumber>;
470
529
  durationMs: z.ZodOptional<z.ZodNumber>;
471
530
  description: z.ZodOptional<z.ZodString>;
531
+ omitted: z.ZodOptional<z.ZodString>;
472
532
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
473
533
  at: z.ZodOptional<z.ZodObject<{
474
534
  step: z.ZodOptional<z.ZodString>;
@@ -521,6 +581,7 @@ export declare const CheckSchema: z.ZodObject<{
521
581
  height: z.ZodOptional<z.ZodNumber>;
522
582
  durationMs: z.ZodOptional<z.ZodNumber>;
523
583
  description: z.ZodOptional<z.ZodString>;
584
+ omitted: z.ZodOptional<z.ZodString>;
524
585
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
525
586
  at: z.ZodOptional<z.ZodObject<{
526
587
  step: z.ZodOptional<z.ZodString>;
@@ -568,6 +629,7 @@ export declare const CheckSchema: z.ZodObject<{
568
629
  limit: z.ZodOptional<z.ZodNumber>;
569
630
  }, z.core.$loose>>>;
570
631
  durationMs: z.ZodOptional<z.ZodNumber>;
632
+ recordingExpectation: z.ZodOptional<z.ZodString>;
571
633
  }, z.core.$loose>;
572
634
  /** A check as stored in a layer, parsed from `CheckSchema`. */
573
635
  export type Check = z.output<typeof CheckSchema>;
@@ -608,6 +670,7 @@ export declare const ReportPartSchema: z.ZodObject<{
608
670
  height: z.ZodOptional<z.ZodNumber>;
609
671
  durationMs: z.ZodOptional<z.ZodNumber>;
610
672
  description: z.ZodOptional<z.ZodString>;
673
+ omitted: z.ZodOptional<z.ZodString>;
611
674
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
612
675
  at: z.ZodOptional<z.ZodObject<{
613
676
  step: z.ZodOptional<z.ZodString>;
@@ -672,6 +735,7 @@ export declare const ReportPartSchema: z.ZodObject<{
672
735
  height: z.ZodOptional<z.ZodNumber>;
673
736
  durationMs: z.ZodOptional<z.ZodNumber>;
674
737
  description: z.ZodOptional<z.ZodString>;
738
+ omitted: z.ZodOptional<z.ZodString>;
675
739
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
676
740
  at: z.ZodOptional<z.ZodObject<{
677
741
  step: z.ZodOptional<z.ZodString>;
@@ -737,6 +801,7 @@ export declare const ReportPartSchema: z.ZodObject<{
737
801
  height: z.ZodOptional<z.ZodNumber>;
738
802
  durationMs: z.ZodOptional<z.ZodNumber>;
739
803
  description: z.ZodOptional<z.ZodString>;
804
+ omitted: z.ZodOptional<z.ZodString>;
740
805
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
741
806
  at: z.ZodOptional<z.ZodObject<{
742
807
  step: z.ZodOptional<z.ZodString>;
@@ -782,6 +847,7 @@ export declare const ReportPartSchema: z.ZodObject<{
782
847
  height: z.ZodOptional<z.ZodNumber>;
783
848
  durationMs: z.ZodOptional<z.ZodNumber>;
784
849
  description: z.ZodOptional<z.ZodString>;
850
+ omitted: z.ZodOptional<z.ZodString>;
785
851
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
786
852
  at: z.ZodOptional<z.ZodObject<{
787
853
  step: z.ZodOptional<z.ZodString>;
@@ -834,6 +900,7 @@ export declare const ReportPartSchema: z.ZodObject<{
834
900
  height: z.ZodOptional<z.ZodNumber>;
835
901
  durationMs: z.ZodOptional<z.ZodNumber>;
836
902
  description: z.ZodOptional<z.ZodString>;
903
+ omitted: z.ZodOptional<z.ZodString>;
837
904
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
838
905
  at: z.ZodOptional<z.ZodObject<{
839
906
  step: z.ZodOptional<z.ZodString>;
@@ -881,6 +948,7 @@ export declare const ReportPartSchema: z.ZodObject<{
881
948
  limit: z.ZodOptional<z.ZodNumber>;
882
949
  }, z.core.$loose>>>;
883
950
  durationMs: z.ZodOptional<z.ZodNumber>;
951
+ recordingExpectation: z.ZodOptional<z.ZodString>;
884
952
  }, z.core.$loose>>;
885
953
  }, z.core.$loose>;
886
954
  /** A suite that recorded timelines and captured files, beside its checks. Absent for a layer of plain checks. */
@@ -923,6 +991,7 @@ export declare const LayerSourceSchema: z.ZodObject<{
923
991
  height: z.ZodOptional<z.ZodNumber>;
924
992
  durationMs: z.ZodOptional<z.ZodNumber>;
925
993
  description: z.ZodOptional<z.ZodString>;
994
+ omitted: z.ZodOptional<z.ZodString>;
926
995
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
927
996
  at: z.ZodOptional<z.ZodObject<{
928
997
  step: z.ZodOptional<z.ZodString>;
@@ -988,6 +1057,7 @@ export declare const LayerSourceSchema: z.ZodObject<{
988
1057
  height: z.ZodOptional<z.ZodNumber>;
989
1058
  durationMs: z.ZodOptional<z.ZodNumber>;
990
1059
  description: z.ZodOptional<z.ZodString>;
1060
+ omitted: z.ZodOptional<z.ZodString>;
991
1061
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
992
1062
  at: z.ZodOptional<z.ZodObject<{
993
1063
  step: z.ZodOptional<z.ZodString>;
@@ -1033,6 +1103,7 @@ export declare const LayerSourceSchema: z.ZodObject<{
1033
1103
  height: z.ZodOptional<z.ZodNumber>;
1034
1104
  durationMs: z.ZodOptional<z.ZodNumber>;
1035
1105
  description: z.ZodOptional<z.ZodString>;
1106
+ omitted: z.ZodOptional<z.ZodString>;
1036
1107
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1037
1108
  at: z.ZodOptional<z.ZodObject<{
1038
1109
  step: z.ZodOptional<z.ZodString>;
@@ -1085,6 +1156,7 @@ export declare const LayerSourceSchema: z.ZodObject<{
1085
1156
  height: z.ZodOptional<z.ZodNumber>;
1086
1157
  durationMs: z.ZodOptional<z.ZodNumber>;
1087
1158
  description: z.ZodOptional<z.ZodString>;
1159
+ omitted: z.ZodOptional<z.ZodString>;
1088
1160
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1089
1161
  at: z.ZodOptional<z.ZodObject<{
1090
1162
  step: z.ZodOptional<z.ZodString>;
@@ -1132,6 +1204,7 @@ export declare const LayerSourceSchema: z.ZodObject<{
1132
1204
  limit: z.ZodOptional<z.ZodNumber>;
1133
1205
  }, z.core.$loose>>>;
1134
1206
  durationMs: z.ZodOptional<z.ZodNumber>;
1207
+ recordingExpectation: z.ZodOptional<z.ZodString>;
1135
1208
  }, z.core.$loose>>;
1136
1209
  }, z.core.$loose>>>;
1137
1210
  tests: z.ZodArray<z.ZodObject<{
@@ -1200,6 +1273,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1200
1273
  height: z.ZodOptional<z.ZodNumber>;
1201
1274
  durationMs: z.ZodOptional<z.ZodNumber>;
1202
1275
  description: z.ZodOptional<z.ZodString>;
1276
+ omitted: z.ZodOptional<z.ZodString>;
1203
1277
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1204
1278
  at: z.ZodOptional<z.ZodObject<{
1205
1279
  step: z.ZodOptional<z.ZodString>;
@@ -1278,6 +1352,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1278
1352
  height: z.ZodOptional<z.ZodNumber>;
1279
1353
  durationMs: z.ZodOptional<z.ZodNumber>;
1280
1354
  description: z.ZodOptional<z.ZodString>;
1355
+ omitted: z.ZodOptional<z.ZodString>;
1281
1356
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1282
1357
  at: z.ZodOptional<z.ZodObject<{
1283
1358
  step: z.ZodOptional<z.ZodString>;
@@ -1342,6 +1417,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1342
1417
  height: z.ZodOptional<z.ZodNumber>;
1343
1418
  durationMs: z.ZodOptional<z.ZodNumber>;
1344
1419
  description: z.ZodOptional<z.ZodString>;
1420
+ omitted: z.ZodOptional<z.ZodString>;
1345
1421
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1346
1422
  at: z.ZodOptional<z.ZodObject<{
1347
1423
  step: z.ZodOptional<z.ZodString>;
@@ -1407,6 +1483,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1407
1483
  height: z.ZodOptional<z.ZodNumber>;
1408
1484
  durationMs: z.ZodOptional<z.ZodNumber>;
1409
1485
  description: z.ZodOptional<z.ZodString>;
1486
+ omitted: z.ZodOptional<z.ZodString>;
1410
1487
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1411
1488
  at: z.ZodOptional<z.ZodObject<{
1412
1489
  step: z.ZodOptional<z.ZodString>;
@@ -1452,6 +1529,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1452
1529
  height: z.ZodOptional<z.ZodNumber>;
1453
1530
  durationMs: z.ZodOptional<z.ZodNumber>;
1454
1531
  description: z.ZodOptional<z.ZodString>;
1532
+ omitted: z.ZodOptional<z.ZodString>;
1455
1533
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1456
1534
  at: z.ZodOptional<z.ZodObject<{
1457
1535
  step: z.ZodOptional<z.ZodString>;
@@ -1504,6 +1582,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1504
1582
  height: z.ZodOptional<z.ZodNumber>;
1505
1583
  durationMs: z.ZodOptional<z.ZodNumber>;
1506
1584
  description: z.ZodOptional<z.ZodString>;
1585
+ omitted: z.ZodOptional<z.ZodString>;
1507
1586
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1508
1587
  at: z.ZodOptional<z.ZodObject<{
1509
1588
  step: z.ZodOptional<z.ZodString>;
@@ -1551,6 +1630,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1551
1630
  limit: z.ZodOptional<z.ZodNumber>;
1552
1631
  }, z.core.$loose>>>;
1553
1632
  durationMs: z.ZodOptional<z.ZodNumber>;
1633
+ recordingExpectation: z.ZodOptional<z.ZodString>;
1554
1634
  }, z.core.$loose>>;
1555
1635
  }, z.core.$loose>>;
1556
1636
  source: z.ZodDefault<z.ZodNullable<z.ZodObject<{
@@ -1592,6 +1672,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1592
1672
  height: z.ZodOptional<z.ZodNumber>;
1593
1673
  durationMs: z.ZodOptional<z.ZodNumber>;
1594
1674
  description: z.ZodOptional<z.ZodString>;
1675
+ omitted: z.ZodOptional<z.ZodString>;
1595
1676
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1596
1677
  at: z.ZodOptional<z.ZodObject<{
1597
1678
  step: z.ZodOptional<z.ZodString>;
@@ -1657,6 +1738,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1657
1738
  height: z.ZodOptional<z.ZodNumber>;
1658
1739
  durationMs: z.ZodOptional<z.ZodNumber>;
1659
1740
  description: z.ZodOptional<z.ZodString>;
1741
+ omitted: z.ZodOptional<z.ZodString>;
1660
1742
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1661
1743
  at: z.ZodOptional<z.ZodObject<{
1662
1744
  step: z.ZodOptional<z.ZodString>;
@@ -1702,6 +1784,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1702
1784
  height: z.ZodOptional<z.ZodNumber>;
1703
1785
  durationMs: z.ZodOptional<z.ZodNumber>;
1704
1786
  description: z.ZodOptional<z.ZodString>;
1787
+ omitted: z.ZodOptional<z.ZodString>;
1705
1788
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1706
1789
  at: z.ZodOptional<z.ZodObject<{
1707
1790
  step: z.ZodOptional<z.ZodString>;
@@ -1754,6 +1837,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1754
1837
  height: z.ZodOptional<z.ZodNumber>;
1755
1838
  durationMs: z.ZodOptional<z.ZodNumber>;
1756
1839
  description: z.ZodOptional<z.ZodString>;
1840
+ omitted: z.ZodOptional<z.ZodString>;
1757
1841
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1758
1842
  at: z.ZodOptional<z.ZodObject<{
1759
1843
  step: z.ZodOptional<z.ZodString>;
@@ -1801,6 +1885,7 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1801
1885
  limit: z.ZodOptional<z.ZodNumber>;
1802
1886
  }, z.core.$loose>>>;
1803
1887
  durationMs: z.ZodOptional<z.ZodNumber>;
1888
+ recordingExpectation: z.ZodOptional<z.ZodString>;
1804
1889
  }, z.core.$loose>>;
1805
1890
  }, z.core.$loose>>>;
1806
1891
  tests: z.ZodArray<z.ZodObject<{
@@ -1832,6 +1917,26 @@ export declare const LayerDocumentSchema: z.ZodObject<{
1832
1917
  size: z.ZodNumber;
1833
1918
  }, z.core.$loose>>;
1834
1919
  }, z.core.$loose>>>;
1920
+ recordings: z.ZodOptional<z.ZodObject<{
1921
+ expected: z.ZodNumber;
1922
+ uploaded: z.ZodNumber;
1923
+ referenced: z.ZodNumber;
1924
+ skipped: z.ZodNumber;
1925
+ unresolved: z.ZodNumber;
1926
+ notApplicable: z.ZodNumber;
1927
+ items: z.ZodArray<z.ZodObject<{
1928
+ check: z.ZodString;
1929
+ state: z.ZodString;
1930
+ reason: z.ZodOptional<z.ZodString>;
1931
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
1932
+ name: z.ZodString;
1933
+ state: z.ZodOptional<z.ZodString>;
1934
+ bytes: z.ZodOptional<z.ZodNumber>;
1935
+ sha256: z.ZodOptional<z.ZodString>;
1936
+ reason: z.ZodOptional<z.ZodString>;
1937
+ }, z.core.$loose>>>;
1938
+ }, z.core.$loose>>;
1939
+ }, z.core.$loose>>;
1835
1940
  }, z.core.$loose>;
1836
1941
  /** A layer as a reader holds it: the output of `LayerDocumentSchema`, with defaults applied. */
1837
1942
  export type LayerDocument = z.output<typeof LayerDocumentSchema>;
@@ -1882,6 +1987,7 @@ export declare const AttachmentInputSchema: z.ZodObject<{
1882
1987
  height: z.ZodOptional<z.ZodNumber>;
1883
1988
  durationMs: z.ZodOptional<z.ZodNumber>;
1884
1989
  description: z.ZodOptional<z.ZodString>;
1990
+ omitted: z.ZodOptional<z.ZodString>;
1885
1991
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1886
1992
  at: z.ZodOptional<z.ZodObject<{
1887
1993
  step: z.ZodOptional<z.ZodString>;
@@ -1949,6 +2055,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
1949
2055
  limit: z.ZodOptional<z.ZodNumber>;
1950
2056
  }, z.core.$loose>>>;
1951
2057
  durationMs: z.ZodOptional<z.ZodNumber>;
2058
+ recordingExpectation: z.ZodOptional<z.ZodString>;
1952
2059
  attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
1953
2060
  id: z.ZodOptional<z.ZodString>;
1954
2061
  name: z.ZodString;
@@ -1963,6 +2070,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
1963
2070
  height: z.ZodOptional<z.ZodNumber>;
1964
2071
  durationMs: z.ZodOptional<z.ZodNumber>;
1965
2072
  description: z.ZodOptional<z.ZodString>;
2073
+ omitted: z.ZodOptional<z.ZodString>;
1966
2074
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
1967
2075
  at: z.ZodOptional<z.ZodObject<{
1968
2076
  step: z.ZodOptional<z.ZodString>;
@@ -2019,6 +2127,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
2019
2127
  height: z.ZodOptional<z.ZodNumber>;
2020
2128
  durationMs: z.ZodOptional<z.ZodNumber>;
2021
2129
  description: z.ZodOptional<z.ZodString>;
2130
+ omitted: z.ZodOptional<z.ZodString>;
2022
2131
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
2023
2132
  at: z.ZodOptional<z.ZodObject<{
2024
2133
  step: z.ZodOptional<z.ZodString>;
@@ -2108,6 +2217,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
2108
2217
  height: z.ZodOptional<z.ZodNumber>;
2109
2218
  durationMs: z.ZodOptional<z.ZodNumber>;
2110
2219
  description: z.ZodOptional<z.ZodString>;
2220
+ omitted: z.ZodOptional<z.ZodString>;
2111
2221
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
2112
2222
  at: z.ZodOptional<z.ZodObject<{
2113
2223
  step: z.ZodOptional<z.ZodString>;
@@ -2135,6 +2245,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
2135
2245
  height: z.ZodOptional<z.ZodNumber>;
2136
2246
  durationMs: z.ZodOptional<z.ZodNumber>;
2137
2247
  description: z.ZodOptional<z.ZodString>;
2248
+ omitted: z.ZodOptional<z.ZodString>;
2138
2249
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
2139
2250
  at: z.ZodOptional<z.ZodObject<{
2140
2251
  step: z.ZodOptional<z.ZodString>;
@@ -2195,6 +2306,7 @@ export declare const PublishChecksSchema: z.ZodObject<{
2195
2306
  height: z.ZodOptional<z.ZodNumber>;
2196
2307
  durationMs: z.ZodOptional<z.ZodNumber>;
2197
2308
  description: z.ZodOptional<z.ZodString>;
2309
+ omitted: z.ZodOptional<z.ZodString>;
2198
2310
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
2199
2311
  at: z.ZodOptional<z.ZodObject<{
2200
2312
  step: z.ZodOptional<z.ZodString>;
@@ -2231,6 +2343,36 @@ export declare const PublishChecksSchema: z.ZodObject<{
2231
2343
  }, z.core.$loose>;
2232
2344
  /** What a caller passes to `publishChecks`: the input type of `PublishChecksSchema`, before defaults. */
2233
2345
  export type PublishChecksInput = z.input<typeof PublishChecksSchema>;
2346
+ /**
2347
+ * Recording completeness across the winning results of a report: `complete` (every expected recording was published),
2348
+ * `incomplete` (at least one is skipped or unresolved), `none-expected` (every layer declared its expectations, and none
2349
+ * required a recording) or `unknown` (a layer has no receipt, so nothing is claimed). Independent of the checks' outcomes.
2350
+ */
2351
+ export declare const RecordingCompletenessSchema: z.ZodObject<{
2352
+ state: z.ZodEnum<{
2353
+ unknown: "unknown";
2354
+ complete: "complete";
2355
+ incomplete: "incomplete";
2356
+ "none-expected": "none-expected";
2357
+ }>;
2358
+ expected: z.ZodNumber;
2359
+ uploaded: z.ZodNumber;
2360
+ referenced: z.ZodNumber;
2361
+ skipped: z.ZodNumber;
2362
+ unresolved: z.ZodNumber;
2363
+ notApplicable: z.ZodNumber;
2364
+ layersWithoutReceipt: z.ZodNumber;
2365
+ gaps: z.ZodArray<z.ZodObject<{
2366
+ spec: z.ZodNullable<z.ZodString>;
2367
+ check: z.ZodString;
2368
+ layer: z.ZodString;
2369
+ environment: z.ZodNullable<z.ZodString>;
2370
+ state: z.ZodString;
2371
+ reason: z.ZodOptional<z.ZodString>;
2372
+ }, z.core.$loose>>;
2373
+ }, z.core.$loose>;
2374
+ /** A parsed `RecordingCompletenessSchema` value. */
2375
+ export type RecordingCompleteness = z.output<typeof RecordingCompletenessSchema>;
2234
2376
  /** The `schemaVersion` of the `ReportStatus` JSON, currently 1. */
2235
2377
  export declare const REPORT_STATUS_SCHEMA_VERSION = 1;
2236
2378
  /**
@@ -2300,6 +2442,29 @@ export declare const ReportStatusSchema: z.ZodObject<{
2300
2442
  runUrl: z.ZodNullable<z.ZodString>;
2301
2443
  detail: z.ZodString;
2302
2444
  }, z.core.$loose>>;
2445
+ recordings: z.ZodOptional<z.ZodObject<{
2446
+ state: z.ZodEnum<{
2447
+ unknown: "unknown";
2448
+ complete: "complete";
2449
+ incomplete: "incomplete";
2450
+ "none-expected": "none-expected";
2451
+ }>;
2452
+ expected: z.ZodNumber;
2453
+ uploaded: z.ZodNumber;
2454
+ referenced: z.ZodNumber;
2455
+ skipped: z.ZodNumber;
2456
+ unresolved: z.ZodNumber;
2457
+ notApplicable: z.ZodNumber;
2458
+ layersWithoutReceipt: z.ZodNumber;
2459
+ gaps: z.ZodArray<z.ZodObject<{
2460
+ spec: z.ZodNullable<z.ZodString>;
2461
+ check: z.ZodString;
2462
+ layer: z.ZodString;
2463
+ environment: z.ZodNullable<z.ZodString>;
2464
+ state: z.ZodString;
2465
+ reason: z.ZodOptional<z.ZodString>;
2466
+ }, z.core.$loose>>;
2467
+ }, z.core.$loose>>;
2303
2468
  }, z.core.$loose>;
2304
2469
  /** A parsed `ReportStatusSchema` value. */
2305
2470
  export type ReportStatus = z.output<typeof ReportStatusSchema>;