@crvouga/atlas 1.7.0 → 1.9.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 (46) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/reports/src/evidence-detail.js +6 -1
  3. package/dist/reports/src/evidence-types.d.ts +2 -0
  4. package/dist/reports/src/explorer-types.d.ts +19 -0
  5. package/dist/reports/src/latency.d.ts +204 -0
  6. package/dist/reports/src/latency.js +219 -0
  7. package/dist/reports/src/reliability.d.ts +181 -0
  8. package/dist/reports/src/reliability.js +294 -0
  9. package/dist/reports/src/report-index.js +1 -1
  10. package/dist/reports/src/reports-explorer-route.d.ts +19 -6
  11. package/dist/reports/src/reports-route.d.ts +19 -6
  12. package/dist/reports/src/test-catalog.d.ts +11 -3
  13. package/dist/reports/src/test-catalog.js +12 -5
  14. package/dist/schema/src/api.d.ts +377 -0
  15. package/dist/schema/src/api.js +55 -3
  16. package/dist/schema/src/layer.d.ts +90 -0
  17. package/dist/schema/src/layer.js +20 -1
  18. package/dist/server/src/app.js +15 -0
  19. package/dist/server/src/llms.js +1 -0
  20. package/dist/server/src/openapi.js +25 -2
  21. package/docs/extending.md +1 -1
  22. package/docs/reference/http-api.md +48 -0
  23. package/docs/reference/reports.md +619 -1
  24. package/docs/reference/schema.md +39 -0
  25. package/docs/rich-evidence.md +43 -0
  26. package/docs/server.md +18 -0
  27. package/docs/ui.md +20 -1
  28. package/llms-full.txt +130 -2
  29. package/package.json +1 -1
  30. package/packages/schema/schemas/check-detail.schema.json +56 -1
  31. package/packages/schema/schemas/effective-delta.schema.json +86 -2
  32. package/packages/schema/schemas/effective-evidence.schema.json +86 -2
  33. package/packages/schema/schemas/evidence-page.schema.json +13 -0
  34. package/packages/schema/schemas/layer-rows.schema.json +73 -2
  35. package/packages/schema/schemas/layer.schema.json +112 -2
  36. package/packages/schema/schemas/publish-checks.schema.json +56 -1
  37. package/packages/schema/schemas/test-catalog.schema.json +102 -0
  38. package/packages/schema/schemas/test-history.schema.json +204 -0
  39. package/packages/schema/schemas/test-reliability.schema.json +629 -0
  40. package/packages/server/openapi.json +2354 -661
  41. package/packages/visualizer/src/evidence/check-detail.tsx +9 -0
  42. package/packages/visualizer/src/explorer/ProductLatency.tsx +214 -0
  43. package/packages/visualizer/src/explorer/Reliability.tsx +337 -0
  44. package/packages/visualizer/src/explorer/TestDetail.tsx +12 -2
  45. package/packages/visualizer/src/explorer/catalog.tsx +1 -1
  46. package/packages/visualizer/src/explorer/search.ts +36 -0
@@ -25,6 +25,7 @@
25
25
  import { displayTag, normalizeTag, normalizeTags } from './artifact-tags.js';
26
26
  import { facetsOf, forRuns, labelList, matchesFilter, outcomeOfCounts, splitList, usedFilters } from './artifact-query.js';
27
27
  import { videoCounts } from './evidence-detail.js';
28
+ import { productLatency } from './latency.js';
28
29
  import { matchesScope, scopeTokens, UNKNOWN_SCOPE } from './evidence-scope.js';
29
30
  import { checkSlots } from './evidence-view.js';
30
31
  import { combineEvidence, emptyCounts, slotKey, specPath as normalSpecPath } from './layer-merge.js';
@@ -55,8 +56,8 @@ function shortDetail(detail) {
55
56
  function completed(status) {
56
57
  return status === 'passed' || status === 'failed';
57
58
  }
58
- function entryOf(layer, row, backend) {
59
- return materialize({ o: originOf(layer, backend), s: row.status, d: row.durationMs, k: row.kind, t: row.detail, e: row.evidence });
59
+ function entryOf(layer, row, backend, fingerprints = {}) {
60
+ return materialize({ o: originOf(layer, backend), s: row.status, d: row.durationMs, k: row.kind, t: row.detail, e: row.evidence, m: productLatency(row.measurements), f: row.specPath ? fingerprints[row.specPath] : undefined });
60
61
  }
61
62
  function originOf(layer, backend) {
62
63
  const parameters = Object.keys(layer.parameters).sort().map(key => `${key}=${layer.parameters[key]}`).join('\u0002');
@@ -71,7 +72,9 @@ function materialize(held) {
71
72
  return {
72
73
  at: o.at, status: held.s, durationMs: held.d, environment: o.environment, producer: o.producer, kind: held.k, parameters: o.parameters,
73
74
  branch: o.branch, sha: o.sha, runUrl: o.runUrl, run: o.run, layer: o.layer, backend: o.backend, detail: shortDetail(held.t),
75
+ ...(held.f ? { specRevision: held.f } : {}),
74
76
  ...(held.e ? { evidence: held.e } : {}),
77
+ ...(held.m ? { latency: held.m } : {}),
75
78
  };
76
79
  }
77
80
  /** Newest first; at the same time the more severe, then the larger layer id, so the order is total. */
@@ -122,8 +125,12 @@ export class TestHistory {
122
125
  get layers() {
123
126
  return this.#seen.size;
124
127
  }
125
- /** Takes in one layer: its header, its rows, the specs it recorded and the backend it was read from. A layer id already added is ignored. */
126
- add(layer, rows, specs = [], backend = layer.backend) {
128
+ /**
129
+ * Takes in one layer: its header, its rows, the specs it recorded and the backend it was read from. A layer id already
130
+ * added is ignored. `fingerprints` (spec path to the fingerprint the layer recorded, as `LayerRows.fingerprints`) gives
131
+ * each result its `specRevision`; without it no result has one.
132
+ */
133
+ add(layer, rows, specs = [], backend = layer.backend, fingerprints = {}) {
127
134
  if (this.#seen.has(layer.id))
128
135
  return;
129
136
  this.#seen.add(layer.id);
@@ -180,7 +187,7 @@ export class TestHistory {
180
187
  ident.title = row.title;
181
188
  ident.titledAt = layer.recordedAtMs;
182
189
  }
183
- this.#remember(slot, { o: origin, s: row.status, d: row.durationMs, k: row.kind, t: row.detail, e: row.evidence });
190
+ this.#remember(slot, { o: origin, s: row.status, d: row.durationMs, k: row.kind, t: row.detail, e: row.evidence, m: productLatency(row.measurements), f: row.specPath ? fingerprints[row.specPath] : undefined });
184
191
  }
185
192
  }
186
193
  /** Sorted insert, newest first; past the bound, the oldest is dropped. */
@@ -121,6 +121,12 @@ export declare const EvidenceSummarySchema: z.ZodObject<{
121
121
  steps: z.ZodNumber;
122
122
  annotations: z.ZodNumber;
123
123
  attempts: z.ZodNumber;
124
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
125
+ passed: "passed";
126
+ failed: "failed";
127
+ running: "running";
128
+ "not-run": "not-run";
129
+ }>>>;
124
130
  links: z.ZodNumber;
125
131
  tags: z.ZodArray<z.ZodString>;
126
132
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -191,6 +197,12 @@ export declare const LayerHeaderSchema: z.ZodObject<{
191
197
  steps: z.ZodNumber;
192
198
  annotations: z.ZodNumber;
193
199
  attempts: z.ZodNumber;
200
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
201
+ passed: "passed";
202
+ failed: "failed";
203
+ running: "running";
204
+ "not-run": "not-run";
205
+ }>>>;
194
206
  links: z.ZodNumber;
195
207
  tags: z.ZodArray<z.ZodString>;
196
208
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -252,6 +264,17 @@ export declare const LayerRowSchema: z.ZodObject<{
252
264
  value: z.ZodNumber;
253
265
  unit: z.ZodString;
254
266
  limit: z.ZodOptional<z.ZodNumber>;
267
+ kind: z.ZodOptional<z.ZodString>;
268
+ from: z.ZodOptional<z.ZodString>;
269
+ to: z.ZodOptional<z.ZodString>;
270
+ intended: z.ZodOptional<z.ZodObject<{
271
+ from: z.ZodOptional<z.ZodString>;
272
+ to: z.ZodOptional<z.ZodString>;
273
+ }, z.core.$loose>>;
274
+ source: z.ZodOptional<z.ZodString>;
275
+ outcome: z.ZodOptional<z.ZodString>;
276
+ instrumentation: z.ZodOptional<z.ZodString>;
277
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
255
278
  }, z.core.$loose>>;
256
279
  testId: z.ZodNullable<z.ZodString>;
257
280
  variant: z.ZodRecord<z.ZodString, z.ZodString>;
@@ -261,6 +284,12 @@ export declare const LayerRowSchema: z.ZodObject<{
261
284
  steps: z.ZodNumber;
262
285
  annotations: z.ZodNumber;
263
286
  attempts: z.ZodNumber;
287
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
288
+ passed: "passed";
289
+ failed: "failed";
290
+ running: "running";
291
+ "not-run": "not-run";
292
+ }>>>;
264
293
  links: z.ZodNumber;
265
294
  tags: z.ZodArray<z.ZodString>;
266
295
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -320,6 +349,17 @@ export declare const LayerRowsSchema: z.ZodObject<{
320
349
  value: z.ZodNumber;
321
350
  unit: z.ZodString;
322
351
  limit: z.ZodOptional<z.ZodNumber>;
352
+ kind: z.ZodOptional<z.ZodString>;
353
+ from: z.ZodOptional<z.ZodString>;
354
+ to: z.ZodOptional<z.ZodString>;
355
+ intended: z.ZodOptional<z.ZodObject<{
356
+ from: z.ZodOptional<z.ZodString>;
357
+ to: z.ZodOptional<z.ZodString>;
358
+ }, z.core.$loose>>;
359
+ source: z.ZodOptional<z.ZodString>;
360
+ outcome: z.ZodOptional<z.ZodString>;
361
+ instrumentation: z.ZodOptional<z.ZodString>;
362
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
323
363
  }, z.core.$loose>>;
324
364
  testId: z.ZodNullable<z.ZodString>;
325
365
  variant: z.ZodRecord<z.ZodString, z.ZodString>;
@@ -329,6 +369,12 @@ export declare const LayerRowsSchema: z.ZodObject<{
329
369
  steps: z.ZodNumber;
330
370
  annotations: z.ZodNumber;
331
371
  attempts: z.ZodNumber;
372
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
373
+ passed: "passed";
374
+ failed: "failed";
375
+ running: "running";
376
+ "not-run": "not-run";
377
+ }>>>;
332
378
  links: z.ZodNumber;
333
379
  tags: z.ZodArray<z.ZodString>;
334
380
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -390,6 +436,17 @@ export declare const LayerEvidenceSchema: z.ZodObject<{
390
436
  value: z.ZodNumber;
391
437
  unit: z.ZodString;
392
438
  limit: z.ZodOptional<z.ZodNumber>;
439
+ kind: z.ZodOptional<z.ZodString>;
440
+ from: z.ZodOptional<z.ZodString>;
441
+ to: z.ZodOptional<z.ZodString>;
442
+ intended: z.ZodOptional<z.ZodObject<{
443
+ from: z.ZodOptional<z.ZodString>;
444
+ to: z.ZodOptional<z.ZodString>;
445
+ }, z.core.$loose>>;
446
+ source: z.ZodOptional<z.ZodString>;
447
+ outcome: z.ZodOptional<z.ZodString>;
448
+ instrumentation: z.ZodOptional<z.ZodString>;
449
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
393
450
  }, z.core.$loose>>;
394
451
  testId: z.ZodNullable<z.ZodString>;
395
452
  variant: z.ZodRecord<z.ZodString, z.ZodString>;
@@ -399,6 +456,12 @@ export declare const LayerEvidenceSchema: z.ZodObject<{
399
456
  steps: z.ZodNumber;
400
457
  annotations: z.ZodNumber;
401
458
  attempts: z.ZodNumber;
459
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
460
+ passed: "passed";
461
+ failed: "failed";
462
+ running: "running";
463
+ "not-run": "not-run";
464
+ }>>>;
402
465
  links: z.ZodNumber;
403
466
  tags: z.ZodArray<z.ZodString>;
404
467
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -474,6 +537,12 @@ export declare const LayerEvidenceSchema: z.ZodObject<{
474
537
  steps: z.ZodNumber;
475
538
  annotations: z.ZodNumber;
476
539
  attempts: z.ZodNumber;
540
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
541
+ passed: "passed";
542
+ failed: "failed";
543
+ running: "running";
544
+ "not-run": "not-run";
545
+ }>>>;
477
546
  links: z.ZodNumber;
478
547
  tags: z.ZodArray<z.ZodString>;
479
548
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -544,6 +613,17 @@ export declare const EffectiveEvidenceSchema: z.ZodObject<{
544
613
  value: z.ZodNumber;
545
614
  unit: z.ZodString;
546
615
  limit: z.ZodOptional<z.ZodNumber>;
616
+ kind: z.ZodOptional<z.ZodString>;
617
+ from: z.ZodOptional<z.ZodString>;
618
+ to: z.ZodOptional<z.ZodString>;
619
+ intended: z.ZodOptional<z.ZodObject<{
620
+ from: z.ZodOptional<z.ZodString>;
621
+ to: z.ZodOptional<z.ZodString>;
622
+ }, z.core.$loose>>;
623
+ source: z.ZodOptional<z.ZodString>;
624
+ outcome: z.ZodOptional<z.ZodString>;
625
+ instrumentation: z.ZodOptional<z.ZodString>;
626
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
547
627
  }, z.core.$loose>>;
548
628
  testId: z.ZodNullable<z.ZodString>;
549
629
  variant: z.ZodRecord<z.ZodString, z.ZodString>;
@@ -553,6 +633,12 @@ export declare const EffectiveEvidenceSchema: z.ZodObject<{
553
633
  steps: z.ZodNumber;
554
634
  annotations: z.ZodNumber;
555
635
  attempts: z.ZodNumber;
636
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
637
+ passed: "passed";
638
+ failed: "failed";
639
+ running: "running";
640
+ "not-run": "not-run";
641
+ }>>>;
556
642
  links: z.ZodNumber;
557
643
  tags: z.ZodArray<z.ZodString>;
558
644
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -628,6 +714,12 @@ export declare const EffectiveEvidenceSchema: z.ZodObject<{
628
714
  steps: z.ZodNumber;
629
715
  annotations: z.ZodNumber;
630
716
  attempts: z.ZodNumber;
717
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
718
+ passed: "passed";
719
+ failed: "failed";
720
+ running: "running";
721
+ "not-run": "not-run";
722
+ }>>>;
631
723
  links: z.ZodNumber;
632
724
  tags: z.ZodArray<z.ZodString>;
633
725
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -719,6 +811,17 @@ export declare const EffectiveDeltaSchema: z.ZodObject<{
719
811
  value: z.ZodNumber;
720
812
  unit: z.ZodString;
721
813
  limit: z.ZodOptional<z.ZodNumber>;
814
+ kind: z.ZodOptional<z.ZodString>;
815
+ from: z.ZodOptional<z.ZodString>;
816
+ to: z.ZodOptional<z.ZodString>;
817
+ intended: z.ZodOptional<z.ZodObject<{
818
+ from: z.ZodOptional<z.ZodString>;
819
+ to: z.ZodOptional<z.ZodString>;
820
+ }, z.core.$loose>>;
821
+ source: z.ZodOptional<z.ZodString>;
822
+ outcome: z.ZodOptional<z.ZodString>;
823
+ instrumentation: z.ZodOptional<z.ZodString>;
824
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
722
825
  }, z.core.$loose>>;
723
826
  testId: z.ZodNullable<z.ZodString>;
724
827
  variant: z.ZodRecord<z.ZodString, z.ZodString>;
@@ -728,6 +831,12 @@ export declare const EffectiveDeltaSchema: z.ZodObject<{
728
831
  steps: z.ZodNumber;
729
832
  annotations: z.ZodNumber;
730
833
  attempts: z.ZodNumber;
834
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
835
+ passed: "passed";
836
+ failed: "failed";
837
+ running: "running";
838
+ "not-run": "not-run";
839
+ }>>>;
731
840
  links: z.ZodNumber;
732
841
  tags: z.ZodArray<z.ZodString>;
733
842
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -803,6 +912,12 @@ export declare const EffectiveDeltaSchema: z.ZodObject<{
803
912
  steps: z.ZodNumber;
804
913
  annotations: z.ZodNumber;
805
914
  attempts: z.ZodNumber;
915
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
916
+ passed: "passed";
917
+ failed: "failed";
918
+ running: "running";
919
+ "not-run": "not-run";
920
+ }>>>;
806
921
  links: z.ZodNumber;
807
922
  tags: z.ZodArray<z.ZodString>;
808
923
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -906,6 +1021,12 @@ export declare const EvidencePageSchema: z.ZodObject<{
906
1021
  steps: z.ZodNumber;
907
1022
  annotations: z.ZodNumber;
908
1023
  attempts: z.ZodNumber;
1024
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1025
+ passed: "passed";
1026
+ failed: "failed";
1027
+ running: "running";
1028
+ "not-run": "not-run";
1029
+ }>>>;
909
1030
  links: z.ZodNumber;
910
1031
  tags: z.ZodArray<z.ZodString>;
911
1032
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1312,6 +1433,17 @@ export declare const CheckDetailSchema: z.ZodObject<{
1312
1433
  value: z.ZodNumber;
1313
1434
  unit: z.ZodString;
1314
1435
  limit: z.ZodOptional<z.ZodNumber>;
1436
+ kind: z.ZodOptional<z.ZodString>;
1437
+ from: z.ZodOptional<z.ZodString>;
1438
+ to: z.ZodOptional<z.ZodString>;
1439
+ intended: z.ZodOptional<z.ZodObject<{
1440
+ from: z.ZodOptional<z.ZodString>;
1441
+ to: z.ZodOptional<z.ZodString>;
1442
+ }, z.core.$loose>>;
1443
+ source: z.ZodOptional<z.ZodString>;
1444
+ outcome: z.ZodOptional<z.ZodString>;
1445
+ instrumentation: z.ZodOptional<z.ZodString>;
1446
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1315
1447
  }, z.core.$loose>>>;
1316
1448
  durationMs: z.ZodOptional<z.ZodNumber>;
1317
1449
  recordingExpectation: z.ZodOptional<z.ZodString>;
@@ -1459,11 +1591,18 @@ export declare const TestResultEntrySchema: z.ZodObject<{
1459
1591
  layer: z.ZodString;
1460
1592
  backend: z.ZodString;
1461
1593
  detail: z.ZodString;
1594
+ specRevision: z.ZodOptional<z.ZodString>;
1462
1595
  evidence: z.ZodOptional<z.ZodObject<{
1463
1596
  attachments: z.ZodNumber;
1464
1597
  steps: z.ZodNumber;
1465
1598
  annotations: z.ZodNumber;
1466
1599
  attempts: z.ZodNumber;
1600
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1601
+ passed: "passed";
1602
+ failed: "failed";
1603
+ running: "running";
1604
+ "not-run": "not-run";
1605
+ }>>>;
1467
1606
  links: z.ZodNumber;
1468
1607
  tags: z.ZodArray<z.ZodString>;
1469
1608
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1498,6 +1637,23 @@ export declare const TestResultEntrySchema: z.ZodObject<{
1498
1637
  }, z.core.$loose>>;
1499
1638
  }, z.core.$loose>>>;
1500
1639
  }, z.core.$loose>>;
1640
+ latency: z.ZodOptional<z.ZodArray<z.ZodObject<{
1641
+ name: z.ZodString;
1642
+ value: z.ZodNumber;
1643
+ unit: z.ZodString;
1644
+ limit: z.ZodOptional<z.ZodNumber>;
1645
+ kind: z.ZodOptional<z.ZodString>;
1646
+ from: z.ZodOptional<z.ZodString>;
1647
+ to: z.ZodOptional<z.ZodString>;
1648
+ intended: z.ZodOptional<z.ZodObject<{
1649
+ from: z.ZodOptional<z.ZodString>;
1650
+ to: z.ZodOptional<z.ZodString>;
1651
+ }, z.core.$loose>>;
1652
+ source: z.ZodOptional<z.ZodString>;
1653
+ outcome: z.ZodOptional<z.ZodString>;
1654
+ instrumentation: z.ZodOptional<z.ZodString>;
1655
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1656
+ }, z.core.$loose>>>;
1501
1657
  }, z.core.$loose>;
1502
1658
  /** One test of the catalog: what it is, its current result per environment, and how it has gone over its recorded history. */
1503
1659
  export declare const TestSummarySchema: z.ZodObject<{
@@ -1539,11 +1695,18 @@ export declare const TestSummarySchema: z.ZodObject<{
1539
1695
  layer: z.ZodString;
1540
1696
  backend: z.ZodString;
1541
1697
  detail: z.ZodString;
1698
+ specRevision: z.ZodOptional<z.ZodString>;
1542
1699
  evidence: z.ZodOptional<z.ZodObject<{
1543
1700
  attachments: z.ZodNumber;
1544
1701
  steps: z.ZodNumber;
1545
1702
  annotations: z.ZodNumber;
1546
1703
  attempts: z.ZodNumber;
1704
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1705
+ passed: "passed";
1706
+ failed: "failed";
1707
+ running: "running";
1708
+ "not-run": "not-run";
1709
+ }>>>;
1547
1710
  links: z.ZodNumber;
1548
1711
  tags: z.ZodArray<z.ZodString>;
1549
1712
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1578,6 +1741,23 @@ export declare const TestSummarySchema: z.ZodObject<{
1578
1741
  }, z.core.$loose>>;
1579
1742
  }, z.core.$loose>>>;
1580
1743
  }, z.core.$loose>>;
1744
+ latency: z.ZodOptional<z.ZodArray<z.ZodObject<{
1745
+ name: z.ZodString;
1746
+ value: z.ZodNumber;
1747
+ unit: z.ZodString;
1748
+ limit: z.ZodOptional<z.ZodNumber>;
1749
+ kind: z.ZodOptional<z.ZodString>;
1750
+ from: z.ZodOptional<z.ZodString>;
1751
+ to: z.ZodOptional<z.ZodString>;
1752
+ intended: z.ZodOptional<z.ZodObject<{
1753
+ from: z.ZodOptional<z.ZodString>;
1754
+ to: z.ZodOptional<z.ZodString>;
1755
+ }, z.core.$loose>>;
1756
+ source: z.ZodOptional<z.ZodString>;
1757
+ outcome: z.ZodOptional<z.ZodString>;
1758
+ instrumentation: z.ZodOptional<z.ZodString>;
1759
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1760
+ }, z.core.$loose>>>;
1581
1761
  }, z.core.$loose>>;
1582
1762
  stats: z.ZodObject<{
1583
1763
  results: z.ZodNumber;
@@ -1814,11 +1994,18 @@ export declare const TestCatalogSchema: z.ZodObject<{
1814
1994
  layer: z.ZodString;
1815
1995
  backend: z.ZodString;
1816
1996
  detail: z.ZodString;
1997
+ specRevision: z.ZodOptional<z.ZodString>;
1817
1998
  evidence: z.ZodOptional<z.ZodObject<{
1818
1999
  attachments: z.ZodNumber;
1819
2000
  steps: z.ZodNumber;
1820
2001
  annotations: z.ZodNumber;
1821
2002
  attempts: z.ZodNumber;
2003
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
2004
+ passed: "passed";
2005
+ failed: "failed";
2006
+ running: "running";
2007
+ "not-run": "not-run";
2008
+ }>>>;
1822
2009
  links: z.ZodNumber;
1823
2010
  tags: z.ZodArray<z.ZodString>;
1824
2011
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1853,6 +2040,23 @@ export declare const TestCatalogSchema: z.ZodObject<{
1853
2040
  }, z.core.$loose>>;
1854
2041
  }, z.core.$loose>>>;
1855
2042
  }, z.core.$loose>>;
2043
+ latency: z.ZodOptional<z.ZodArray<z.ZodObject<{
2044
+ name: z.ZodString;
2045
+ value: z.ZodNumber;
2046
+ unit: z.ZodString;
2047
+ limit: z.ZodOptional<z.ZodNumber>;
2048
+ kind: z.ZodOptional<z.ZodString>;
2049
+ from: z.ZodOptional<z.ZodString>;
2050
+ to: z.ZodOptional<z.ZodString>;
2051
+ intended: z.ZodOptional<z.ZodObject<{
2052
+ from: z.ZodOptional<z.ZodString>;
2053
+ to: z.ZodOptional<z.ZodString>;
2054
+ }, z.core.$loose>>;
2055
+ source: z.ZodOptional<z.ZodString>;
2056
+ outcome: z.ZodOptional<z.ZodString>;
2057
+ instrumentation: z.ZodOptional<z.ZodString>;
2058
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
2059
+ }, z.core.$loose>>>;
1856
2060
  }, z.core.$loose>>;
1857
2061
  stats: z.ZodObject<{
1858
2062
  results: z.ZodNumber;
@@ -2016,11 +2220,18 @@ export declare const TestHistorySchema: z.ZodObject<{
2016
2220
  layer: z.ZodString;
2017
2221
  backend: z.ZodString;
2018
2222
  detail: z.ZodString;
2223
+ specRevision: z.ZodOptional<z.ZodString>;
2019
2224
  evidence: z.ZodOptional<z.ZodObject<{
2020
2225
  attachments: z.ZodNumber;
2021
2226
  steps: z.ZodNumber;
2022
2227
  annotations: z.ZodNumber;
2023
2228
  attempts: z.ZodNumber;
2229
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
2230
+ passed: "passed";
2231
+ failed: "failed";
2232
+ running: "running";
2233
+ "not-run": "not-run";
2234
+ }>>>;
2024
2235
  links: z.ZodNumber;
2025
2236
  tags: z.ZodArray<z.ZodString>;
2026
2237
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -2055,6 +2266,23 @@ export declare const TestHistorySchema: z.ZodObject<{
2055
2266
  }, z.core.$loose>>;
2056
2267
  }, z.core.$loose>>>;
2057
2268
  }, z.core.$loose>>;
2269
+ latency: z.ZodOptional<z.ZodArray<z.ZodObject<{
2270
+ name: z.ZodString;
2271
+ value: z.ZodNumber;
2272
+ unit: z.ZodString;
2273
+ limit: z.ZodOptional<z.ZodNumber>;
2274
+ kind: z.ZodOptional<z.ZodString>;
2275
+ from: z.ZodOptional<z.ZodString>;
2276
+ to: z.ZodOptional<z.ZodString>;
2277
+ intended: z.ZodOptional<z.ZodObject<{
2278
+ from: z.ZodOptional<z.ZodString>;
2279
+ to: z.ZodOptional<z.ZodString>;
2280
+ }, z.core.$loose>>;
2281
+ source: z.ZodOptional<z.ZodString>;
2282
+ outcome: z.ZodOptional<z.ZodString>;
2283
+ instrumentation: z.ZodOptional<z.ZodString>;
2284
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
2285
+ }, z.core.$loose>>>;
2058
2286
  }, z.core.$loose>>;
2059
2287
  stats: z.ZodObject<{
2060
2288
  results: z.ZodNumber;
@@ -2115,11 +2343,18 @@ export declare const TestHistorySchema: z.ZodObject<{
2115
2343
  layer: z.ZodString;
2116
2344
  backend: z.ZodString;
2117
2345
  detail: z.ZodString;
2346
+ specRevision: z.ZodOptional<z.ZodString>;
2118
2347
  evidence: z.ZodOptional<z.ZodObject<{
2119
2348
  attachments: z.ZodNumber;
2120
2349
  steps: z.ZodNumber;
2121
2350
  annotations: z.ZodNumber;
2122
2351
  attempts: z.ZodNumber;
2352
+ attemptStatuses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
2353
+ passed: "passed";
2354
+ failed: "failed";
2355
+ running: "running";
2356
+ "not-run": "not-run";
2357
+ }>>>;
2123
2358
  links: z.ZodNumber;
2124
2359
  tags: z.ZodArray<z.ZodString>;
2125
2360
  artifactTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -2154,6 +2389,148 @@ export declare const TestHistorySchema: z.ZodObject<{
2154
2389
  }, z.core.$loose>>;
2155
2390
  }, z.core.$loose>>>;
2156
2391
  }, z.core.$loose>>;
2392
+ latency: z.ZodOptional<z.ZodArray<z.ZodObject<{
2393
+ name: z.ZodString;
2394
+ value: z.ZodNumber;
2395
+ unit: z.ZodString;
2396
+ limit: z.ZodOptional<z.ZodNumber>;
2397
+ kind: z.ZodOptional<z.ZodString>;
2398
+ from: z.ZodOptional<z.ZodString>;
2399
+ to: z.ZodOptional<z.ZodString>;
2400
+ intended: z.ZodOptional<z.ZodObject<{
2401
+ from: z.ZodOptional<z.ZodString>;
2402
+ to: z.ZodOptional<z.ZodString>;
2403
+ }, z.core.$loose>>;
2404
+ source: z.ZodOptional<z.ZodString>;
2405
+ outcome: z.ZodOptional<z.ZodString>;
2406
+ instrumentation: z.ZodOptional<z.ZodString>;
2407
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
2408
+ }, z.core.$loose>>>;
2409
+ }, z.core.$loose>>;
2410
+ }, z.core.$loose>;
2411
+ /**
2412
+ * `GET /api/reports/tests/reliability`: how reliable one test is inside a scope, and exactly how that figure was counted.
2413
+ * The snapshots one run recorded for one producer, environment and parameter set are one independent execution; only
2414
+ * `passed` and `failed` executions are trials; `notes` say when the sample is too small, pooled, selectively rerun or
2415
+ * bounded. It reads results and never changes a status. It is not a production failure probability.
2416
+ */
2417
+ export declare const TestReliabilitySchema: z.ZodObject<{
2418
+ schemaVersion: z.ZodLiteral<1>;
2419
+ key: z.ZodString;
2420
+ scope: z.ZodObject<{
2421
+ environment: z.ZodOptional<z.ZodArray<z.ZodString>>;
2422
+ producer: z.ZodOptional<z.ZodArray<z.ZodString>>;
2423
+ parameter: z.ZodOptional<z.ZodArray<z.ZodString>>;
2424
+ branch: z.ZodOptional<z.ZodArray<z.ZodString>>;
2425
+ sha: z.ZodOptional<z.ZodArray<z.ZodString>>;
2426
+ specRevision: z.ZodOptional<z.ZodArray<z.ZodString>>;
2427
+ revision: z.ZodOptional<z.ZodEnum<{
2428
+ any: "any";
2429
+ current: "current";
2430
+ }>>;
2431
+ since: z.ZodOptional<z.ZodNumber>;
2432
+ until: z.ZodOptional<z.ZodNumber>;
2433
+ }, z.core.$loose>;
2434
+ minimumExecutions: z.ZodNumber;
2435
+ sample: z.ZodEnum<{
2436
+ none: "none";
2437
+ insufficient: "insufficient";
2438
+ sufficient: "sufficient";
2439
+ }>;
2440
+ eventual: z.ZodObject<{
2441
+ executions: z.ZodNumber;
2442
+ passed: z.ZodNumber;
2443
+ failed: z.ZodNumber;
2444
+ rate: z.ZodNullable<z.ZodNumber>;
2445
+ }, z.core.$loose>;
2446
+ interval: z.ZodNullable<z.ZodObject<{
2447
+ method: z.ZodLiteral<"wilson">;
2448
+ level: z.ZodNumber;
2449
+ lower: z.ZodNumber;
2450
+ upper: z.ZodNumber;
2451
+ assumptions: z.ZodString;
2452
+ }, z.core.$loose>>;
2453
+ firstAttempt: z.ZodObject<{
2454
+ executions: z.ZodNumber;
2455
+ passed: z.ZodNumber;
2456
+ failed: z.ZodNumber;
2457
+ rate: z.ZodNullable<z.ZodNumber>;
2458
+ }, z.core.$loose>;
2459
+ unrecordedAttempts: z.ZodNumber;
2460
+ attempts: z.ZodObject<{
2461
+ total: z.ZodNumber;
2462
+ retried: z.ZodNumber;
2463
+ recovered: z.ZodNumber;
2464
+ }, z.core.$loose>;
2465
+ currentRevision: z.ZodNullable<z.ZodString>;
2466
+ historical: z.ZodObject<{
2467
+ executions: z.ZodNumber;
2468
+ passed: z.ZodNumber;
2469
+ failed: z.ZodNumber;
2470
+ revisions: z.ZodArray<z.ZodObject<{
2471
+ specRevision: z.ZodString;
2472
+ executions: z.ZodNumber;
2473
+ }, z.core.$loose>>;
2474
+ }, z.core.$loose>;
2475
+ excluded: z.ZodRecord<z.ZodString, z.ZodNumber>;
2476
+ outsideScope: z.ZodNumber;
2477
+ snapshots: z.ZodNumber;
2478
+ cohorts: z.ZodArray<z.ZodObject<{
2479
+ executions: z.ZodNumber;
2480
+ passed: z.ZodNumber;
2481
+ failed: z.ZodNumber;
2482
+ rate: z.ZodNullable<z.ZodNumber>;
2483
+ environment: z.ZodNullable<z.ZodString>;
2484
+ producer: z.ZodString;
2485
+ parameters: z.ZodRecord<z.ZodString, z.ZodString>;
2486
+ }, z.core.$loose>>;
2487
+ available: z.ZodObject<{
2488
+ environments: z.ZodArray<z.ZodObject<{
2489
+ value: z.ZodString;
2490
+ count: z.ZodNumber;
2491
+ }, z.core.$loose>>;
2492
+ producers: z.ZodArray<z.ZodObject<{
2493
+ value: z.ZodString;
2494
+ count: z.ZodNumber;
2495
+ }, z.core.$loose>>;
2496
+ branches: z.ZodArray<z.ZodObject<{
2497
+ value: z.ZodString;
2498
+ count: z.ZodNumber;
2499
+ }, z.core.$loose>>;
2500
+ specRevisions: z.ZodArray<z.ZodObject<{
2501
+ value: z.ZodString;
2502
+ count: z.ZodNumber;
2503
+ }, z.core.$loose>>;
2504
+ }, z.core.$loose>;
2505
+ notes: z.ZodArray<z.ZodObject<{
2506
+ code: z.ZodString;
2507
+ severity: z.ZodEnum<{
2508
+ info: "info";
2509
+ warning: "warning";
2510
+ }>;
2511
+ message: z.ZodString;
2512
+ }, z.core.$loose>>;
2513
+ executions: z.ZodArray<z.ZodObject<{
2514
+ run: z.ZodString;
2515
+ at: z.ZodNumber;
2516
+ status: z.ZodString;
2517
+ counted: z.ZodBoolean;
2518
+ excluded: z.ZodOptional<z.ZodString>;
2519
+ environment: z.ZodNullable<z.ZodString>;
2520
+ producer: z.ZodString;
2521
+ kind: z.ZodString;
2522
+ parameters: z.ZodRecord<z.ZodString, z.ZodString>;
2523
+ branch: z.ZodNullable<z.ZodString>;
2524
+ sha: z.ZodNullable<z.ZodString>;
2525
+ runUrl: z.ZodNullable<z.ZodString>;
2526
+ layer: z.ZodString;
2527
+ backend: z.ZodString;
2528
+ durationMs: z.ZodNullable<z.ZodNumber>;
2529
+ specRevision: z.ZodOptional<z.ZodString>;
2530
+ snapshots: z.ZodNumber;
2531
+ attempts: z.ZodOptional<z.ZodArray<z.ZodString>>;
2532
+ firstAttempt: z.ZodOptional<z.ZodString>;
2533
+ republished: z.ZodBoolean;
2157
2534
  }, z.core.$loose>>;
2158
2535
  }, z.core.$loose>;
2159
2536
  /** A run: the layers that name the same execution (else share a run URL, else a branch and commit), with what they recorded. */