@crvouga/atlas 1.14.0 → 1.16.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 (52) hide show
  1. package/CHANGELOG.md +14 -1
  2. package/dist/reports/src/catalog-health.d.ts +15 -2
  3. package/dist/reports/src/catalog-health.js +23 -2
  4. package/dist/reports/src/evidence-detail.d.ts +19 -0
  5. package/dist/reports/src/evidence-detail.js +31 -4
  6. package/dist/reports/src/evidence-types.d.ts +2 -2
  7. package/dist/reports/src/layer-merge.js +4 -3
  8. package/dist/reports/src/layer-store.d.ts +1 -1
  9. package/dist/reports/src/layer-store.js +4 -2
  10. package/dist/reports/src/layer-types.d.ts +2 -0
  11. package/dist/reports/src/run-compare.d.ts +182 -0
  12. package/dist/reports/src/run-compare.js +329 -0
  13. package/dist/reports/src/test-catalog.d.ts +8 -0
  14. package/dist/reports/src/test-catalog.js +14 -1
  15. package/dist/schema/src/api.d.ts +10 -0
  16. package/dist/schema/src/api.js +15 -5
  17. package/dist/schema/src/server-config.d.ts +3 -0
  18. package/dist/schema/src/server-config.js +5 -0
  19. package/dist/server/src/app.d.ts +2 -0
  20. package/dist/server/src/app.js +6 -2
  21. package/dist/server/src/config.js +4 -0
  22. package/dist/server/src/main.js +1 -0
  23. package/dist/server/src/openapi.js +2 -2
  24. package/docs/extending.md +1 -1
  25. package/docs/reference/http-api.md +4 -4
  26. package/docs/reference/reports.md +378 -5
  27. package/docs/reference/server.md +2 -0
  28. package/docs/server.md +11 -2
  29. package/docs/ui.md +49 -1
  30. package/llms-full.txt +65 -8
  31. package/package.json +1 -1
  32. package/packages/schema/schemas/catalog-health.schema.json +20 -0
  33. package/packages/schema/schemas/effective-delta.schema.json +2 -2
  34. package/packages/schema/schemas/effective-evidence.schema.json +2 -2
  35. package/packages/schema/schemas/evidence-page.schema.json +1 -1
  36. package/packages/schema/schemas/layer-rows.schema.json +1 -1
  37. package/packages/schema/schemas/report-run.schema.json +25 -3
  38. package/packages/schema/schemas/report-runs.schema.json +1 -1
  39. package/packages/schema/schemas/review-collection.schema.json +1 -1
  40. package/packages/schema/schemas/review-manifest.schema.json +1 -1
  41. package/packages/schema/schemas/server-config.schema.json +17 -0
  42. package/packages/schema/schemas/test-catalog.schema.json +1 -1
  43. package/packages/schema/schemas/test-history.schema.json +2 -2
  44. package/packages/server/openapi.json +63 -21
  45. package/packages/visualizer/src/explorer/ComparePair.tsx +597 -0
  46. package/packages/visualizer/src/explorer/CompareView.tsx +340 -0
  47. package/packages/visualizer/src/explorer/Explorer.tsx +13 -2
  48. package/packages/visualizer/src/explorer/HealthView.tsx +402 -0
  49. package/packages/visualizer/src/explorer/RunsView.tsx +10 -0
  50. package/packages/visualizer/src/explorer/catalog.tsx +33 -0
  51. package/packages/visualizer/src/explorer/playlist.tsx +1 -1
  52. package/packages/visualizer/src/explorer/search.ts +18 -3
@@ -3699,7 +3699,7 @@
3699
3699
  "Report"
3700
3700
  ],
3701
3701
  "summary": "Why specs, domains and counts disagree",
3702
- "description": "Diagnoses the report's metadata, so a domain filter or a coverage percentage can be trusted or fixed at its source. It reads; it never changes a status, a slot or a winner.\n\n`counts` keeps the denominators apart: spec files, defined specs, specs with an executed test (and those without: the defined coverage gaps), tests, outlines, examples and per-environment observations. `reconciliation` walks from the Specs count to the Tests count. `findings` name ambiguous and unmatched spec paths, identical or same-titled specs, a domain shared by nearly every spec, tests with no spec, checks that fall back to their title as identity and root mappings that matched nothing.\n\nTwo paths are one logical spec only when a `root` mapping relates them (`from>to`: paths under `from` are the same specs as paths under `to`; an empty `from` matches every path). Without one, similar paths are reported as ambiguous and never merged. A check's label `outline` names the outline its example belongs to. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
3702
+ "description": "Diagnoses the report's metadata, so a domain filter or a coverage percentage can be trusted or fixed at its source. It reads; it never changes a status, a slot or a winner.\n\n`counts` keeps the denominators apart: spec files, defined specs, specs with an executed test (and those without: the defined coverage gaps), tests, outlines, examples and per-environment observations. `reconciliation` walks from the Specs count to the Tests count. `findings` name ambiguous and unmatched spec paths, identical or same-titled specs, a domain shared by nearly every spec, tests with no spec, checks that fall back to their title as identity and root mappings that matched nothing.\n\nTwo paths are one logical spec only when a `root` mapping relates them (`from>to`: paths under `from` are the same specs as paths under `to`; an empty `from` matches every path). Without one, similar paths are reported as ambiguous and never merged. A check's label `outline` names the outline its example belongs to; the labels `behavior-id` and `example-id` declare stable ids, which are counted and checked for ids shared by several checks. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
3703
3703
  "x-atlas-role": "read",
3704
3704
  "security": [
3705
3705
  {
@@ -3714,7 +3714,7 @@
3714
3714
  "required": false,
3715
3715
  "name": "root",
3716
3716
  "in": "query",
3717
- "description": "A root mapping `from>to`, URL-encoded. Repeatable or comma-separated.",
3717
+ "description": "A root mapping `from>to`, URL-encoded. Repeatable or comma-separated. It is added to the mappings the server is configured with (`catalog.roots`, `ATLAS_CATALOG_ROOTS`); `roots[].source` says which is which.",
3718
3718
  "example": ">specs/",
3719
3719
  "schema": {
3720
3720
  "type": "string"
@@ -3798,7 +3798,7 @@
3798
3798
  "Report"
3799
3799
  ],
3800
3800
  "summary": "Why specs, domains and counts disagree",
3801
- "description": "Diagnoses the report's metadata, so a domain filter or a coverage percentage can be trusted or fixed at its source. It reads; it never changes a status, a slot or a winner.\n\n`counts` keeps the denominators apart: spec files, defined specs, specs with an executed test (and those without: the defined coverage gaps), tests, outlines, examples and per-environment observations. `reconciliation` walks from the Specs count to the Tests count. `findings` name ambiguous and unmatched spec paths, identical or same-titled specs, a domain shared by nearly every spec, tests with no spec, checks that fall back to their title as identity and root mappings that matched nothing.\n\nTwo paths are one logical spec only when a `root` mapping relates them (`from>to`: paths under `from` are the same specs as paths under `to`; an empty `from` matches every path). Without one, similar paths are reported as ambiguous and never merged. A check's label `outline` names the outline its example belongs to. Send `format=markdown` for Markdown.\n\nScoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.\n\nRole needed: `read`.",
3801
+ "description": "Diagnoses the report's metadata, so a domain filter or a coverage percentage can be trusted or fixed at its source. It reads; it never changes a status, a slot or a winner.\n\n`counts` keeps the denominators apart: spec files, defined specs, specs with an executed test (and those without: the defined coverage gaps), tests, outlines, examples and per-environment observations. `reconciliation` walks from the Specs count to the Tests count. `findings` name ambiguous and unmatched spec paths, identical or same-titled specs, a domain shared by nearly every spec, tests with no spec, checks that fall back to their title as identity and root mappings that matched nothing.\n\nTwo paths are one logical spec only when a `root` mapping relates them (`from>to`: paths under `from` are the same specs as paths under `to`; an empty `from` matches every path). Without one, similar paths are reported as ambiguous and never merged. A check's label `outline` names the outline its example belongs to; the labels `behavior-id` and `example-id` declare stable ids, which are counted and checked for ids shared by several checks. Send `format=markdown` for Markdown.\n\nScoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.\n\nRole needed: `read`.",
3802
3802
  "x-atlas-role": "read",
3803
3803
  "security": [
3804
3804
  {
@@ -3825,7 +3825,7 @@
3825
3825
  "required": false,
3826
3826
  "name": "root",
3827
3827
  "in": "query",
3828
- "description": "A root mapping `from>to`, URL-encoded. Repeatable or comma-separated.",
3828
+ "description": "A root mapping `from>to`, URL-encoded. Repeatable or comma-separated. It is added to the mappings the server is configured with (`catalog.roots`, `ATLAS_CATALOG_ROOTS`); `roots[].source` says which is which.",
3829
3829
  "example": ">specs/",
3830
3830
  "schema": {
3831
3831
  "type": "string"
@@ -10728,7 +10728,7 @@
10728
10728
  },
10729
10729
  "available": {
10730
10730
  "type": "boolean",
10731
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
10731
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
10732
10732
  },
10733
10733
  "scope": {
10734
10734
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -11207,7 +11207,7 @@
11207
11207
  },
11208
11208
  "available": {
11209
11209
  "type": "boolean",
11210
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
11210
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
11211
11211
  },
11212
11212
  "scope": {
11213
11213
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -11721,7 +11721,7 @@
11721
11721
  },
11722
11722
  "available": {
11723
11723
  "type": "boolean",
11724
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
11724
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
11725
11725
  },
11726
11726
  "scope": {
11727
11727
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -12200,7 +12200,7 @@
12200
12200
  },
12201
12201
  "available": {
12202
12202
  "type": "boolean",
12203
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
12203
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
12204
12204
  },
12205
12205
  "scope": {
12206
12206
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -15608,7 +15608,7 @@
15608
15608
  },
15609
15609
  "available": {
15610
15610
  "type": "boolean",
15611
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
15611
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
15612
15612
  },
15613
15613
  "scope": {
15614
15614
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -16102,7 +16102,7 @@
16102
16102
  },
16103
16103
  "available": {
16104
16104
  "type": "boolean",
16105
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
16105
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
16106
16106
  },
16107
16107
  "scope": {
16108
16108
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -18712,7 +18712,7 @@
18712
18712
  },
18713
18713
  "available": {
18714
18714
  "type": "boolean",
18715
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
18715
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
18716
18716
  },
18717
18717
  "scope": {
18718
18718
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -19194,7 +19194,7 @@
19194
19194
  },
19195
19195
  "available": {
19196
19196
  "type": "boolean",
19197
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
19197
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
19198
19198
  },
19199
19199
  "scope": {
19200
19200
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -19836,7 +19836,7 @@
19836
19836
  },
19837
19837
  "available": {
19838
19838
  "type": "boolean",
19839
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
19839
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
19840
19840
  },
19841
19841
  "scope": {
19842
19842
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -21065,7 +21065,7 @@
21065
21065
  },
21066
21066
  "available": {
21067
21067
  "type": "boolean",
21068
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
21068
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
21069
21069
  },
21070
21070
  "scope": {
21071
21071
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -21772,6 +21772,18 @@
21772
21772
  "maximum": 9007199254740991,
21773
21773
  "description": "Checks whose id equals their title"
21774
21774
  },
21775
+ "declaredBehaviorIds": {
21776
+ "description": "Checks that declare a `behavior-id` label",
21777
+ "type": "integer",
21778
+ "minimum": 0,
21779
+ "maximum": 9007199254740991
21780
+ },
21781
+ "declaredExampleIds": {
21782
+ "description": "Checks that declare an `example-id` label",
21783
+ "type": "integer",
21784
+ "minimum": 0,
21785
+ "maximum": 9007199254740991
21786
+ },
21775
21787
  "basis": {
21776
21788
  "type": "string"
21777
21789
  }
@@ -21821,6 +21833,14 @@
21821
21833
  "minimum": 0,
21822
21834
  "maximum": 9007199254740991,
21823
21835
  "description": "Distinct paths the mapping changed"
21836
+ },
21837
+ "source": {
21838
+ "description": "Where it was declared: the server's `catalog.roots` setting or this request's `root` parameter",
21839
+ "type": "string",
21840
+ "enum": [
21841
+ "configuration",
21842
+ "request"
21843
+ ]
21824
21844
  }
21825
21845
  },
21826
21846
  "required": [
@@ -22214,7 +22234,7 @@
22214
22234
  },
22215
22235
  "available": {
22216
22236
  "type": "boolean",
22217
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
22237
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
22218
22238
  },
22219
22239
  "scope": {
22220
22240
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -22867,7 +22887,7 @@
22867
22887
  },
22868
22888
  "available": {
22869
22889
  "type": "boolean",
22870
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
22890
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
22871
22891
  },
22872
22892
  "scope": {
22873
22893
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -23897,7 +23917,7 @@
23897
23917
  "type": "integer",
23898
23918
  "minimum": 0,
23899
23919
  "maximum": 9007199254740991,
23900
- "description": "References that name no bytes"
23920
+ "description": "References that name no bytes, or bytes the layer does not hold"
23901
23921
  }
23902
23922
  },
23903
23923
  "required": [
@@ -24356,7 +24376,7 @@
24356
24376
  },
24357
24377
  "available": {
24358
24378
  "type": "boolean",
24359
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
24379
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
24360
24380
  },
24361
24381
  "scope": {
24362
24382
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -25649,7 +25669,7 @@
25649
25669
  "type": "integer",
25650
25670
  "minimum": 0,
25651
25671
  "maximum": 9007199254740991,
25652
- "description": "References that name no bytes"
25672
+ "description": "References that name no bytes, or bytes the layer does not hold"
25653
25673
  }
25654
25674
  },
25655
25675
  "required": [
@@ -25802,7 +25822,7 @@
25802
25822
  },
25803
25823
  "available": {
25804
25824
  "type": "boolean",
25805
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
25825
+ "description": "False when the reference names no bytes: no bundle key, address or inline text, or a bundle key that the layer's own bundle does not hold"
25806
25826
  },
25807
25827
  "scope": {
25808
25828
  "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
@@ -25908,6 +25928,28 @@
25908
25928
  ],
25909
25929
  "additionalProperties": {}
25910
25930
  }
25931
+ },
25932
+ "kind": {
25933
+ "description": "The kind of the part that held it. With the producer, environment and parameters it is the condition the result was recorded under. Absent from an older server",
25934
+ "type": "string"
25935
+ },
25936
+ "parameters": {
25937
+ "description": "The other choices that made it its own result (a device size, a locale…). Absent when there are none, and from an older server",
25938
+ "type": "object",
25939
+ "propertyNames": {
25940
+ "type": "string"
25941
+ },
25942
+ "additionalProperties": {
25943
+ "type": "string"
25944
+ }
25945
+ },
25946
+ "specRevision": {
25947
+ "description": "The fingerprint of its spec file the layer recorded. Absent means not recorded, never \"the same\"",
25948
+ "type": "string"
25949
+ },
25950
+ "recordedTitle": {
25951
+ "description": "The title this run's layer gave the check. `title` is the check's newest title in the whole history; this is the wording as recorded. Absent from an older server",
25952
+ "type": "string"
25911
25953
  }
25912
25954
  },
25913
25955
  "required": [
@@ -25982,7 +26024,7 @@
25982
26024
  "type": "integer",
25983
26025
  "minimum": 0,
25984
26026
  "maximum": 9007199254740991,
25985
- "description": "References that name no bytes"
26027
+ "description": "References that name no bytes, or bytes the layer does not hold"
25986
26028
  }
25987
26029
  },
25988
26030
  "required": [