@crvouga/atlas 1.13.0 → 1.14.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 (43) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/dist/playwright/src/index.d.ts +4 -0
  3. package/dist/playwright/src/index.js +4 -0
  4. package/dist/playwright/src/ui-catalog.d.ts +51 -0
  5. package/dist/playwright/src/ui-catalog.js +44 -0
  6. package/dist/reports/src/evidence-types.d.ts +3 -0
  7. package/dist/reports/src/layer-merge.d.ts +5 -1
  8. package/dist/reports/src/layer-merge.js +9 -2
  9. package/dist/reports/src/report-index.js +9 -5
  10. package/dist/reports/src/ui-catalog-publish.d.ts +92 -0
  11. package/dist/reports/src/ui-catalog-publish.js +68 -0
  12. package/dist/reports/src/ui-catalog.d.ts +229 -0
  13. package/dist/reports/src/ui-catalog.js +273 -0
  14. package/dist/reports/src/ui-state.d.ts +70 -0
  15. package/dist/reports/src/ui-state.js +66 -0
  16. package/dist/schema/src/api.d.ts +350 -0
  17. package/dist/schema/src/api.js +71 -0
  18. package/dist/server/src/app.js +15 -0
  19. package/dist/server/src/openapi.js +22 -2
  20. package/docs/reference/http-api.md +46 -0
  21. package/docs/reference/playwright.md +63 -0
  22. package/docs/reference/reports.md +588 -1
  23. package/docs/reference/schema.md +33 -0
  24. package/docs/report-contract.md +2 -2
  25. package/docs/rich-evidence.md +5 -0
  26. package/docs/server.md +2 -0
  27. package/docs/ui-catalog.md +173 -0
  28. package/docs/ui.md +15 -0
  29. package/llms-full.txt +246 -2
  30. package/llms.txt +1 -0
  31. package/package.json +2 -1
  32. package/packages/schema/schemas/effective-delta.schema.json +73 -0
  33. package/packages/schema/schemas/effective-evidence.schema.json +73 -0
  34. package/packages/schema/schemas/layer-rows.schema.json +73 -0
  35. package/packages/server/openapi.json +1441 -79
  36. package/packages/visualizer/src/app/AppShell.tsx +36 -30
  37. package/packages/visualizer/src/app/router.tsx +10 -1
  38. package/packages/visualizer/src/catalog/UiCatalogFilters.tsx +65 -0
  39. package/packages/visualizer/src/catalog/UiCatalogPage.tsx +342 -0
  40. package/packages/visualizer/src/catalog/provider.tsx +25 -0
  41. package/packages/visualizer/src/catalog/search.ts +68 -0
  42. package/packages/visualizer/src/catalog/words.ts +26 -0
  43. package/packages/visualizer/src/components/Header.tsx +17 -4
@@ -6626,14 +6626,14 @@
6626
6626
  }
6627
6627
  }
6628
6628
  },
6629
- "/api/reports/runs/detail": {
6629
+ "/api/reports/ui-catalog": {
6630
6630
  "get": {
6631
- "operationId": "getReportRun",
6631
+ "operationId": "getUiCatalog",
6632
6632
  "tags": [
6633
6633
  "Report"
6634
6634
  ],
6635
- "summary": "Every test one run recorded",
6636
- "description": "One run and its last result for every test, environment and producer it recorded, failures first, and `layers`: each layer of the run with its backend, how many checks it recorded (zero means evidence only, never a pass) and how many files it carries as a whole. Open a layer's files with `/api/reports/evidence/detail/{backend}/{id}`. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
6635
+ "summary": "The UI catalog: captured UI states per profile, and what is still expected",
6636
+ "description": "A browsable inventory of the product's user interface, computed from the winning results of the `ui-state` and `ui-plan` parts of every layer (see the UI catalog guide). Each state is a check id; each cell is one profile of it (the layer's environment and parameters) with its coverage: `captured` only when the winning capture passed, `failed`, `capturing`, `skipped`, or `missing` when a plan expects it and nothing has been captured. A picture is read from the cell's `capture.image.path` under the reports API root, or `uri`. What is expected is itself a layer, so a shard that never published leaves its states `missing`, never captured. The document equals what the viewer computes from the same report. Narrow it by `q` (words), `coverage`, `profile` (a profile `key`), `area`, `route`, `cohort`, `flag`, `surface` and `producer`: AND across parameters, OR within one; a state keeps only the cells that match `profile` and `coverage`. Page the states with `limit` and `offset`. Viewers need not poll: they hold the report over `/api/events` and read changes with `/api/reports/evidence/effective?since=`.\n\nRole needed: `read`.",
6637
6637
  "x-atlas-role": "read",
6638
6638
  "security": [
6639
6639
  {
@@ -6645,10 +6645,102 @@
6645
6645
  ],
6646
6646
  "parameters": [
6647
6647
  {
6648
- "required": true,
6649
- "name": "key",
6648
+ "required": false,
6649
+ "name": "limit",
6650
6650
  "in": "query",
6651
- "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
6651
+ "description": "At most this many states (default 200).",
6652
+ "schema": {
6653
+ "type": "integer",
6654
+ "minimum": 0
6655
+ }
6656
+ },
6657
+ {
6658
+ "required": false,
6659
+ "name": "offset",
6660
+ "in": "query",
6661
+ "description": "Skip this many states (default 0).",
6662
+ "schema": {
6663
+ "type": "integer",
6664
+ "minimum": 0
6665
+ }
6666
+ },
6667
+ {
6668
+ "required": false,
6669
+ "name": "q",
6670
+ "in": "query",
6671
+ "description": "Words that must all appear in a state's id, title, route, fixture, cohort, area, flags, surfaces or producers.",
6672
+ "schema": {
6673
+ "type": "string"
6674
+ }
6675
+ },
6676
+ {
6677
+ "required": false,
6678
+ "name": "coverage",
6679
+ "in": "query",
6680
+ "description": "Coverage values: `captured`, `failed`, `capturing`, `skipped`, `missing`. Comma-separated.",
6681
+ "schema": {
6682
+ "type": "string"
6683
+ }
6684
+ },
6685
+ {
6686
+ "required": false,
6687
+ "name": "profile",
6688
+ "in": "query",
6689
+ "description": "Profile keys, as listed in `profiles[].key`.",
6690
+ "schema": {
6691
+ "type": "string"
6692
+ }
6693
+ },
6694
+ {
6695
+ "required": false,
6696
+ "name": "area",
6697
+ "in": "query",
6698
+ "description": "Areas.",
6699
+ "schema": {
6700
+ "type": "string"
6701
+ }
6702
+ },
6703
+ {
6704
+ "required": false,
6705
+ "name": "route",
6706
+ "in": "query",
6707
+ "description": "Routes.",
6708
+ "schema": {
6709
+ "type": "string"
6710
+ }
6711
+ },
6712
+ {
6713
+ "required": false,
6714
+ "name": "cohort",
6715
+ "in": "query",
6716
+ "description": "Cohorts.",
6717
+ "schema": {
6718
+ "type": "string"
6719
+ }
6720
+ },
6721
+ {
6722
+ "required": false,
6723
+ "name": "flag",
6724
+ "in": "query",
6725
+ "description": "Feature flags a state was captured with.",
6726
+ "schema": {
6727
+ "type": "string"
6728
+ }
6729
+ },
6730
+ {
6731
+ "required": false,
6732
+ "name": "surface",
6733
+ "in": "query",
6734
+ "description": "Surfaces a state covers.",
6735
+ "schema": {
6736
+ "type": "string"
6737
+ }
6738
+ },
6739
+ {
6740
+ "required": false,
6741
+ "name": "producer",
6742
+ "in": "query",
6743
+ "description": "Producers that captured or planned a state.",
6652
6744
  "schema": {
6653
6745
  "type": "string"
6654
6746
  }
@@ -6681,11 +6773,11 @@
6681
6773
  ],
6682
6774
  "responses": {
6683
6775
  "200": {
6684
- "description": "The run and its results.",
6776
+ "description": "The catalog.",
6685
6777
  "content": {
6686
6778
  "application/json": {
6687
6779
  "schema": {
6688
- "$ref": "#/components/schemas/RunDetail"
6780
+ "$ref": "#/components/schemas/UiCatalog"
6689
6781
  }
6690
6782
  }
6691
6783
  }
@@ -6693,16 +6785,6 @@
6693
6785
  "304": {
6694
6786
  "description": "Unchanged since the `If-None-Match` ETag."
6695
6787
  },
6696
- "400": {
6697
- "description": "No `key`.",
6698
- "content": {
6699
- "application/problem+json": {
6700
- "schema": {
6701
- "$ref": "#/components/schemas/Problem"
6702
- }
6703
- }
6704
- }
6705
- },
6706
6788
  "401": {
6707
6789
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6708
6790
  "content": {
@@ -6713,16 +6795,6 @@
6713
6795
  }
6714
6796
  }
6715
6797
  },
6716
- "404": {
6717
- "description": "No run has that key.",
6718
- "content": {
6719
- "application/problem+json": {
6720
- "schema": {
6721
- "$ref": "#/components/schemas/Problem"
6722
- }
6723
- }
6724
- }
6725
- },
6726
6798
  "503": {
6727
6799
  "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
6728
6800
  "content": {
@@ -6736,14 +6808,14 @@
6736
6808
  }
6737
6809
  }
6738
6810
  },
6739
- "/api/projects/{project}/reports/runs/detail": {
6811
+ "/api/projects/{project}/reports/ui-catalog": {
6740
6812
  "get": {
6741
- "operationId": "getReportRunForProject",
6813
+ "operationId": "getUiCatalogForProject",
6742
6814
  "tags": [
6743
6815
  "Report"
6744
6816
  ],
6745
- "summary": "Every test one run recorded",
6746
- "description": "One run and its last result for every test, environment and producer it recorded, failures first, and `layers`: each layer of the run with its backend, how many checks it recorded (zero means evidence only, never a pass) and how many files it carries as a whole. Open a layer's files with `/api/reports/evidence/detail/{backend}/{id}`. 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`.",
6817
+ "summary": "The UI catalog: captured UI states per profile, and what is still expected",
6818
+ "description": "A browsable inventory of the product's user interface, computed from the winning results of the `ui-state` and `ui-plan` parts of every layer (see the UI catalog guide). Each state is a check id; each cell is one profile of it (the layer's environment and parameters) with its coverage: `captured` only when the winning capture passed, `failed`, `capturing`, `skipped`, or `missing` when a plan expects it and nothing has been captured. A picture is read from the cell's `capture.image.path` under the reports API root, or `uri`. What is expected is itself a layer, so a shard that never published leaves its states `missing`, never captured. The document equals what the viewer computes from the same report. Narrow it by `q` (words), `coverage`, `profile` (a profile `key`), `area`, `route`, `cohort`, `flag`, `surface` and `producer`: AND across parameters, OR within one; a state keeps only the cells that match `profile` and `coverage`. Page the states with `limit` and `offset`. Viewers need not poll: they hold the report over `/api/events` and read changes with `/api/reports/evidence/effective?since=`.\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`.",
6747
6819
  "x-atlas-role": "read",
6748
6820
  "security": [
6749
6821
  {
@@ -6767,10 +6839,102 @@
6767
6839
  }
6768
6840
  },
6769
6841
  {
6770
- "required": true,
6771
- "name": "key",
6842
+ "required": false,
6843
+ "name": "limit",
6772
6844
  "in": "query",
6773
- "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
6845
+ "description": "At most this many states (default 200).",
6846
+ "schema": {
6847
+ "type": "integer",
6848
+ "minimum": 0
6849
+ }
6850
+ },
6851
+ {
6852
+ "required": false,
6853
+ "name": "offset",
6854
+ "in": "query",
6855
+ "description": "Skip this many states (default 0).",
6856
+ "schema": {
6857
+ "type": "integer",
6858
+ "minimum": 0
6859
+ }
6860
+ },
6861
+ {
6862
+ "required": false,
6863
+ "name": "q",
6864
+ "in": "query",
6865
+ "description": "Words that must all appear in a state's id, title, route, fixture, cohort, area, flags, surfaces or producers.",
6866
+ "schema": {
6867
+ "type": "string"
6868
+ }
6869
+ },
6870
+ {
6871
+ "required": false,
6872
+ "name": "coverage",
6873
+ "in": "query",
6874
+ "description": "Coverage values: `captured`, `failed`, `capturing`, `skipped`, `missing`. Comma-separated.",
6875
+ "schema": {
6876
+ "type": "string"
6877
+ }
6878
+ },
6879
+ {
6880
+ "required": false,
6881
+ "name": "profile",
6882
+ "in": "query",
6883
+ "description": "Profile keys, as listed in `profiles[].key`.",
6884
+ "schema": {
6885
+ "type": "string"
6886
+ }
6887
+ },
6888
+ {
6889
+ "required": false,
6890
+ "name": "area",
6891
+ "in": "query",
6892
+ "description": "Areas.",
6893
+ "schema": {
6894
+ "type": "string"
6895
+ }
6896
+ },
6897
+ {
6898
+ "required": false,
6899
+ "name": "route",
6900
+ "in": "query",
6901
+ "description": "Routes.",
6902
+ "schema": {
6903
+ "type": "string"
6904
+ }
6905
+ },
6906
+ {
6907
+ "required": false,
6908
+ "name": "cohort",
6909
+ "in": "query",
6910
+ "description": "Cohorts.",
6911
+ "schema": {
6912
+ "type": "string"
6913
+ }
6914
+ },
6915
+ {
6916
+ "required": false,
6917
+ "name": "flag",
6918
+ "in": "query",
6919
+ "description": "Feature flags a state was captured with.",
6920
+ "schema": {
6921
+ "type": "string"
6922
+ }
6923
+ },
6924
+ {
6925
+ "required": false,
6926
+ "name": "surface",
6927
+ "in": "query",
6928
+ "description": "Surfaces a state covers.",
6929
+ "schema": {
6930
+ "type": "string"
6931
+ }
6932
+ },
6933
+ {
6934
+ "required": false,
6935
+ "name": "producer",
6936
+ "in": "query",
6937
+ "description": "Producers that captured or planned a state.",
6774
6938
  "schema": {
6775
6939
  "type": "string"
6776
6940
  }
@@ -6791,11 +6955,11 @@
6791
6955
  ],
6792
6956
  "responses": {
6793
6957
  "200": {
6794
- "description": "The run and its results.",
6958
+ "description": "The catalog.",
6795
6959
  "content": {
6796
6960
  "application/json": {
6797
6961
  "schema": {
6798
- "$ref": "#/components/schemas/RunDetail"
6962
+ "$ref": "#/components/schemas/UiCatalog"
6799
6963
  }
6800
6964
  }
6801
6965
  }
@@ -6803,16 +6967,6 @@
6803
6967
  "304": {
6804
6968
  "description": "Unchanged since the `If-None-Match` ETag."
6805
6969
  },
6806
- "400": {
6807
- "description": "No `key`.",
6808
- "content": {
6809
- "application/problem+json": {
6810
- "schema": {
6811
- "$ref": "#/components/schemas/Problem"
6812
- }
6813
- }
6814
- }
6815
- },
6816
6970
  "401": {
6817
6971
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6818
6972
  "content": {
@@ -6823,16 +6977,6 @@
6823
6977
  }
6824
6978
  }
6825
6979
  },
6826
- "404": {
6827
- "description": "No run has that key.",
6828
- "content": {
6829
- "application/problem+json": {
6830
- "schema": {
6831
- "$ref": "#/components/schemas/Problem"
6832
- }
6833
- }
6834
- }
6835
- },
6836
6980
  "503": {
6837
6981
  "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
6838
6982
  "content": {
@@ -6846,14 +6990,14 @@
6846
6990
  }
6847
6991
  }
6848
6992
  },
6849
- "/api/reports/outline": {
6993
+ "/api/reports/runs/detail": {
6850
6994
  "get": {
6851
- "operationId": "getOutline",
6995
+ "operationId": "getReportRun",
6852
6996
  "tags": [
6853
6997
  "Report"
6854
6998
  ],
6855
- "summary": "The specs a report is laid over",
6856
- "description": "The specs of the newest committed spec set (of `main`, else the newest), so the report needs no checkout. Without a spec set, the specs the layers recorded (`specs[]`), newest per path. A spec here with no result shows as having none.\n\nRole needed: `read`.",
6999
+ "summary": "Every test one run recorded",
7000
+ "description": "One run and its last result for every test, environment and producer it recorded, failures first, and `layers`: each layer of the run with its backend, how many checks it recorded (zero means evidence only, never a pass) and how many files it carries as a whole. Open a layer's files with `/api/reports/evidence/detail/{backend}/{id}`. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
6857
7001
  "x-atlas-role": "read",
6858
7002
  "security": [
6859
7003
  {
@@ -6864,6 +7008,28 @@
6864
7008
  }
6865
7009
  ],
6866
7010
  "parameters": [
7011
+ {
7012
+ "required": true,
7013
+ "name": "key",
7014
+ "in": "query",
7015
+ "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
7016
+ "schema": {
7017
+ "type": "string"
7018
+ }
7019
+ },
7020
+ {
7021
+ "required": false,
7022
+ "name": "format",
7023
+ "in": "query",
7024
+ "description": "`markdown` for Markdown instead of JSON.",
7025
+ "schema": {
7026
+ "type": "string",
7027
+ "enum": [
7028
+ "json",
7029
+ "markdown"
7030
+ ]
7031
+ }
7032
+ },
6867
7033
  {
6868
7034
  "required": false,
6869
7035
  "name": "project",
@@ -6879,17 +7045,20 @@
6879
7045
  ],
6880
7046
  "responses": {
6881
7047
  "200": {
6882
- "description": "The outline.",
7048
+ "description": "The run and its results.",
6883
7049
  "content": {
6884
7050
  "application/json": {
6885
7051
  "schema": {
6886
- "$ref": "#/components/schemas/Outline"
7052
+ "$ref": "#/components/schemas/RunDetail"
6887
7053
  }
6888
7054
  }
6889
7055
  }
6890
7056
  },
6891
- "401": {
6892
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7057
+ "304": {
7058
+ "description": "Unchanged since the `If-None-Match` ETag."
7059
+ },
7060
+ "400": {
7061
+ "description": "No `key`.",
6893
7062
  "content": {
6894
7063
  "application/problem+json": {
6895
7064
  "schema": {
@@ -6897,7 +7066,202 @@
6897
7066
  }
6898
7067
  }
6899
7068
  }
6900
- }
7069
+ },
7070
+ "401": {
7071
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7072
+ "content": {
7073
+ "application/problem+json": {
7074
+ "schema": {
7075
+ "$ref": "#/components/schemas/Problem"
7076
+ }
7077
+ }
7078
+ }
7079
+ },
7080
+ "404": {
7081
+ "description": "No run has that key.",
7082
+ "content": {
7083
+ "application/problem+json": {
7084
+ "schema": {
7085
+ "$ref": "#/components/schemas/Problem"
7086
+ }
7087
+ }
7088
+ }
7089
+ },
7090
+ "503": {
7091
+ "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
7092
+ "content": {
7093
+ "application/problem+json": {
7094
+ "schema": {
7095
+ "$ref": "#/components/schemas/Problem"
7096
+ }
7097
+ }
7098
+ }
7099
+ }
7100
+ }
7101
+ }
7102
+ },
7103
+ "/api/projects/{project}/reports/runs/detail": {
7104
+ "get": {
7105
+ "operationId": "getReportRunForProject",
7106
+ "tags": [
7107
+ "Report"
7108
+ ],
7109
+ "summary": "Every test one run recorded",
7110
+ "description": "One run and its last result for every test, environment and producer it recorded, failures first, and `layers`: each layer of the run with its backend, how many checks it recorded (zero means evidence only, never a pass) and how many files it carries as a whole. Open a layer's files with `/api/reports/evidence/detail/{backend}/{id}`. 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`.",
7111
+ "x-atlas-role": "read",
7112
+ "security": [
7113
+ {
7114
+ "bearer": []
7115
+ },
7116
+ {
7117
+ "basic": []
7118
+ }
7119
+ ],
7120
+ "parameters": [
7121
+ {
7122
+ "required": true,
7123
+ "name": "project",
7124
+ "in": "path",
7125
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7126
+ "example": "todo-app",
7127
+ "schema": {
7128
+ "type": "string",
7129
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7130
+ "maxLength": 64
7131
+ }
7132
+ },
7133
+ {
7134
+ "required": true,
7135
+ "name": "key",
7136
+ "in": "query",
7137
+ "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
7138
+ "schema": {
7139
+ "type": "string"
7140
+ }
7141
+ },
7142
+ {
7143
+ "required": false,
7144
+ "name": "format",
7145
+ "in": "query",
7146
+ "description": "`markdown` for Markdown instead of JSON.",
7147
+ "schema": {
7148
+ "type": "string",
7149
+ "enum": [
7150
+ "json",
7151
+ "markdown"
7152
+ ]
7153
+ }
7154
+ }
7155
+ ],
7156
+ "responses": {
7157
+ "200": {
7158
+ "description": "The run and its results.",
7159
+ "content": {
7160
+ "application/json": {
7161
+ "schema": {
7162
+ "$ref": "#/components/schemas/RunDetail"
7163
+ }
7164
+ }
7165
+ }
7166
+ },
7167
+ "304": {
7168
+ "description": "Unchanged since the `If-None-Match` ETag."
7169
+ },
7170
+ "400": {
7171
+ "description": "No `key`.",
7172
+ "content": {
7173
+ "application/problem+json": {
7174
+ "schema": {
7175
+ "$ref": "#/components/schemas/Problem"
7176
+ }
7177
+ }
7178
+ }
7179
+ },
7180
+ "401": {
7181
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7182
+ "content": {
7183
+ "application/problem+json": {
7184
+ "schema": {
7185
+ "$ref": "#/components/schemas/Problem"
7186
+ }
7187
+ }
7188
+ }
7189
+ },
7190
+ "404": {
7191
+ "description": "No run has that key.",
7192
+ "content": {
7193
+ "application/problem+json": {
7194
+ "schema": {
7195
+ "$ref": "#/components/schemas/Problem"
7196
+ }
7197
+ }
7198
+ }
7199
+ },
7200
+ "503": {
7201
+ "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
7202
+ "content": {
7203
+ "application/problem+json": {
7204
+ "schema": {
7205
+ "$ref": "#/components/schemas/Problem"
7206
+ }
7207
+ }
7208
+ }
7209
+ }
7210
+ }
7211
+ }
7212
+ },
7213
+ "/api/reports/outline": {
7214
+ "get": {
7215
+ "operationId": "getOutline",
7216
+ "tags": [
7217
+ "Report"
7218
+ ],
7219
+ "summary": "The specs a report is laid over",
7220
+ "description": "The specs of the newest committed spec set (of `main`, else the newest), so the report needs no checkout. Without a spec set, the specs the layers recorded (`specs[]`), newest per path. A spec here with no result shows as having none.\n\nRole needed: `read`.",
7221
+ "x-atlas-role": "read",
7222
+ "security": [
7223
+ {
7224
+ "bearer": []
7225
+ },
7226
+ {
7227
+ "basic": []
7228
+ }
7229
+ ],
7230
+ "parameters": [
7231
+ {
7232
+ "required": false,
7233
+ "name": "project",
7234
+ "in": "query",
7235
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7236
+ "example": "todo-app",
7237
+ "schema": {
7238
+ "type": "string",
7239
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7240
+ "maxLength": 64
7241
+ }
7242
+ }
7243
+ ],
7244
+ "responses": {
7245
+ "200": {
7246
+ "description": "The outline.",
7247
+ "content": {
7248
+ "application/json": {
7249
+ "schema": {
7250
+ "$ref": "#/components/schemas/Outline"
7251
+ }
7252
+ }
7253
+ }
7254
+ },
7255
+ "401": {
7256
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7257
+ "content": {
7258
+ "application/problem+json": {
7259
+ "schema": {
7260
+ "$ref": "#/components/schemas/Problem"
7261
+ }
7262
+ }
7263
+ }
7264
+ }
6901
7265
  }
6902
7266
  }
6903
7267
  },
@@ -10484,6 +10848,79 @@
10484
10848
  ],
10485
10849
  "additionalProperties": {}
10486
10850
  },
10851
+ "state": {
10852
+ "description": "Only for a check of a `ui-state` or `ui-plan` part: its picture and the facts its producer declared under the `atlas.ui-state` extension. See the UI catalog guide. Never decides a result",
10853
+ "type": "object",
10854
+ "properties": {
10855
+ "route": {
10856
+ "type": "string"
10857
+ },
10858
+ "fixture": {
10859
+ "type": "string"
10860
+ },
10861
+ "cohort": {
10862
+ "type": "string"
10863
+ },
10864
+ "area": {
10865
+ "type": "string"
10866
+ },
10867
+ "flags": {
10868
+ "type": "array",
10869
+ "items": {
10870
+ "type": "string"
10871
+ }
10872
+ },
10873
+ "covers": {
10874
+ "type": "array",
10875
+ "items": {
10876
+ "type": "string"
10877
+ }
10878
+ },
10879
+ "inventory": {
10880
+ "description": "A `ui-plan` entry that names a surface of the product's inventory, not a state",
10881
+ "type": "boolean"
10882
+ },
10883
+ "screenshot": {
10884
+ "description": "The check's picture: its `screenshot` attachment, else its first image",
10885
+ "type": "object",
10886
+ "properties": {
10887
+ "name": {
10888
+ "type": "string"
10889
+ },
10890
+ "bundleKey": {
10891
+ "type": "string"
10892
+ },
10893
+ "uri": {
10894
+ "type": "string"
10895
+ },
10896
+ "contentType": {
10897
+ "type": "string"
10898
+ },
10899
+ "width": {
10900
+ "type": "number"
10901
+ },
10902
+ "height": {
10903
+ "type": "number"
10904
+ },
10905
+ "bytes": {
10906
+ "type": "number"
10907
+ },
10908
+ "sha256": {
10909
+ "type": "string"
10910
+ },
10911
+ "omitted": {
10912
+ "description": "Why the producer left the bytes out",
10913
+ "type": "string"
10914
+ }
10915
+ },
10916
+ "required": [
10917
+ "name"
10918
+ ],
10919
+ "additionalProperties": {}
10920
+ }
10921
+ },
10922
+ "additionalProperties": {}
10923
+ },
10487
10924
  "recording": {
10488
10925
  "description": "What became of the check's expected recording: uploaded, referenced, skipped, unresolved or not-applicable. Independent of `status`",
10489
10926
  "type": "object",
@@ -11404,23 +11841,96 @@
11404
11841
  ],
11405
11842
  "additionalProperties": {}
11406
11843
  },
11407
- "recording": {
11408
- "description": "What became of the check's expected recording: uploaded, referenced, skipped, unresolved or not-applicable. Independent of `status`",
11844
+ "state": {
11845
+ "description": "Only for a check of a `ui-state` or `ui-plan` part: its picture and the facts its producer declared under the `atlas.ui-state` extension. See the UI catalog guide. Never decides a result",
11409
11846
  "type": "object",
11410
11847
  "properties": {
11411
- "state": {
11848
+ "route": {
11412
11849
  "type": "string"
11413
11850
  },
11414
- "reason": {
11851
+ "fixture": {
11415
11852
  "type": "string"
11416
- }
11417
- },
11418
- "required": [
11419
- "state"
11420
- ],
11421
- "additionalProperties": {}
11422
- }
11423
- },
11853
+ },
11854
+ "cohort": {
11855
+ "type": "string"
11856
+ },
11857
+ "area": {
11858
+ "type": "string"
11859
+ },
11860
+ "flags": {
11861
+ "type": "array",
11862
+ "items": {
11863
+ "type": "string"
11864
+ }
11865
+ },
11866
+ "covers": {
11867
+ "type": "array",
11868
+ "items": {
11869
+ "type": "string"
11870
+ }
11871
+ },
11872
+ "inventory": {
11873
+ "description": "A `ui-plan` entry that names a surface of the product's inventory, not a state",
11874
+ "type": "boolean"
11875
+ },
11876
+ "screenshot": {
11877
+ "description": "The check's picture: its `screenshot` attachment, else its first image",
11878
+ "type": "object",
11879
+ "properties": {
11880
+ "name": {
11881
+ "type": "string"
11882
+ },
11883
+ "bundleKey": {
11884
+ "type": "string"
11885
+ },
11886
+ "uri": {
11887
+ "type": "string"
11888
+ },
11889
+ "contentType": {
11890
+ "type": "string"
11891
+ },
11892
+ "width": {
11893
+ "type": "number"
11894
+ },
11895
+ "height": {
11896
+ "type": "number"
11897
+ },
11898
+ "bytes": {
11899
+ "type": "number"
11900
+ },
11901
+ "sha256": {
11902
+ "type": "string"
11903
+ },
11904
+ "omitted": {
11905
+ "description": "Why the producer left the bytes out",
11906
+ "type": "string"
11907
+ }
11908
+ },
11909
+ "required": [
11910
+ "name"
11911
+ ],
11912
+ "additionalProperties": {}
11913
+ }
11914
+ },
11915
+ "additionalProperties": {}
11916
+ },
11917
+ "recording": {
11918
+ "description": "What became of the check's expected recording: uploaded, referenced, skipped, unresolved or not-applicable. Independent of `status`",
11919
+ "type": "object",
11920
+ "properties": {
11921
+ "state": {
11922
+ "type": "string"
11923
+ },
11924
+ "reason": {
11925
+ "type": "string"
11926
+ }
11927
+ },
11928
+ "required": [
11929
+ "state"
11930
+ ],
11931
+ "additionalProperties": {}
11932
+ }
11933
+ },
11424
11934
  "required": [
11425
11935
  "kind",
11426
11936
  "id",
@@ -15712,6 +16222,79 @@
15712
16222
  ],
15713
16223
  "additionalProperties": {}
15714
16224
  },
16225
+ "state": {
16226
+ "description": "Only for a check of a `ui-state` or `ui-plan` part: its picture and the facts its producer declared under the `atlas.ui-state` extension. See the UI catalog guide. Never decides a result",
16227
+ "type": "object",
16228
+ "properties": {
16229
+ "route": {
16230
+ "type": "string"
16231
+ },
16232
+ "fixture": {
16233
+ "type": "string"
16234
+ },
16235
+ "cohort": {
16236
+ "type": "string"
16237
+ },
16238
+ "area": {
16239
+ "type": "string"
16240
+ },
16241
+ "flags": {
16242
+ "type": "array",
16243
+ "items": {
16244
+ "type": "string"
16245
+ }
16246
+ },
16247
+ "covers": {
16248
+ "type": "array",
16249
+ "items": {
16250
+ "type": "string"
16251
+ }
16252
+ },
16253
+ "inventory": {
16254
+ "description": "A `ui-plan` entry that names a surface of the product's inventory, not a state",
16255
+ "type": "boolean"
16256
+ },
16257
+ "screenshot": {
16258
+ "description": "The check's picture: its `screenshot` attachment, else its first image",
16259
+ "type": "object",
16260
+ "properties": {
16261
+ "name": {
16262
+ "type": "string"
16263
+ },
16264
+ "bundleKey": {
16265
+ "type": "string"
16266
+ },
16267
+ "uri": {
16268
+ "type": "string"
16269
+ },
16270
+ "contentType": {
16271
+ "type": "string"
16272
+ },
16273
+ "width": {
16274
+ "type": "number"
16275
+ },
16276
+ "height": {
16277
+ "type": "number"
16278
+ },
16279
+ "bytes": {
16280
+ "type": "number"
16281
+ },
16282
+ "sha256": {
16283
+ "type": "string"
16284
+ },
16285
+ "omitted": {
16286
+ "description": "Why the producer left the bytes out",
16287
+ "type": "string"
16288
+ }
16289
+ },
16290
+ "required": [
16291
+ "name"
16292
+ ],
16293
+ "additionalProperties": {}
16294
+ }
16295
+ },
16296
+ "additionalProperties": {}
16297
+ },
15715
16298
  "recording": {
15716
16299
  "description": "What became of the check's expected recording: uploaded, referenced, skipped, unresolved or not-applicable. Independent of `status`",
15717
16300
  "type": "object",
@@ -24126,6 +24709,785 @@
24126
24709
  ],
24127
24710
  "additionalProperties": {}
24128
24711
  },
24712
+ "UiCatalog": {
24713
+ "type": "object",
24714
+ "properties": {
24715
+ "schemaVersion": {
24716
+ "type": "number",
24717
+ "const": 1
24718
+ },
24719
+ "version": {
24720
+ "description": "The report version this was computed from; equal exactly when the report is",
24721
+ "type": "string"
24722
+ },
24723
+ "summary": {
24724
+ "type": "object",
24725
+ "properties": {
24726
+ "states": {
24727
+ "type": "integer",
24728
+ "minimum": 0,
24729
+ "maximum": 9007199254740991
24730
+ },
24731
+ "profiles": {
24732
+ "type": "integer",
24733
+ "minimum": 0,
24734
+ "maximum": 9007199254740991
24735
+ },
24736
+ "cells": {
24737
+ "type": "integer",
24738
+ "minimum": 0,
24739
+ "maximum": 9007199254740991
24740
+ },
24741
+ "coverage": {
24742
+ "type": "object",
24743
+ "properties": {
24744
+ "captured": {
24745
+ "type": "number"
24746
+ },
24747
+ "failed": {
24748
+ "type": "number"
24749
+ },
24750
+ "capturing": {
24751
+ "type": "number"
24752
+ },
24753
+ "skipped": {
24754
+ "type": "number"
24755
+ },
24756
+ "missing": {
24757
+ "type": "number"
24758
+ }
24759
+ },
24760
+ "required": [
24761
+ "captured",
24762
+ "failed",
24763
+ "capturing",
24764
+ "skipped",
24765
+ "missing"
24766
+ ],
24767
+ "additionalProperties": {}
24768
+ },
24769
+ "undeclared": {
24770
+ "type": "integer",
24771
+ "minimum": 0,
24772
+ "maximum": 9007199254740991,
24773
+ "description": "Cells captured or failed that no plan expects. Zero when no plan was published"
24774
+ },
24775
+ "planned": {
24776
+ "type": "boolean",
24777
+ "description": "Whether any plan was published. Without one `missing` is always zero: what should exist is unknown"
24778
+ },
24779
+ "surfaces": {
24780
+ "type": "integer",
24781
+ "minimum": 0,
24782
+ "maximum": 9007199254740991
24783
+ },
24784
+ "uncoveredSurfaces": {
24785
+ "type": "integer",
24786
+ "minimum": 0,
24787
+ "maximum": 9007199254740991
24788
+ }
24789
+ },
24790
+ "required": [
24791
+ "states",
24792
+ "profiles",
24793
+ "cells",
24794
+ "coverage",
24795
+ "undeclared",
24796
+ "planned",
24797
+ "surfaces",
24798
+ "uncoveredSurfaces"
24799
+ ],
24800
+ "additionalProperties": {}
24801
+ },
24802
+ "profiles": {
24803
+ "type": "array",
24804
+ "items": {
24805
+ "type": "object",
24806
+ "properties": {
24807
+ "key": {
24808
+ "type": "string",
24809
+ "description": "Identifies the profile across layers: the environment and the sorted parameters"
24810
+ },
24811
+ "environment": {
24812
+ "type": [
24813
+ "string",
24814
+ "null"
24815
+ ]
24816
+ },
24817
+ "parameters": {
24818
+ "type": "object",
24819
+ "propertyNames": {
24820
+ "type": "string"
24821
+ },
24822
+ "additionalProperties": {
24823
+ "type": "string"
24824
+ }
24825
+ },
24826
+ "label": {
24827
+ "type": "string",
24828
+ "description": "For a person: the client and each parameter's value"
24829
+ }
24830
+ },
24831
+ "required": [
24832
+ "key",
24833
+ "environment",
24834
+ "parameters",
24835
+ "label"
24836
+ ],
24837
+ "additionalProperties": {}
24838
+ }
24839
+ },
24840
+ "states": {
24841
+ "type": "array",
24842
+ "items": {
24843
+ "type": "object",
24844
+ "properties": {
24845
+ "id": {
24846
+ "type": "string"
24847
+ },
24848
+ "title": {
24849
+ "type": "string"
24850
+ },
24851
+ "route": {
24852
+ "type": [
24853
+ "string",
24854
+ "null"
24855
+ ]
24856
+ },
24857
+ "fixture": {
24858
+ "type": [
24859
+ "string",
24860
+ "null"
24861
+ ]
24862
+ },
24863
+ "cohort": {
24864
+ "type": [
24865
+ "string",
24866
+ "null"
24867
+ ]
24868
+ },
24869
+ "area": {
24870
+ "type": [
24871
+ "string",
24872
+ "null"
24873
+ ]
24874
+ },
24875
+ "flags": {
24876
+ "type": "array",
24877
+ "items": {
24878
+ "type": "string"
24879
+ }
24880
+ },
24881
+ "covers": {
24882
+ "type": "array",
24883
+ "items": {
24884
+ "type": "string"
24885
+ },
24886
+ "description": "The surfaces it covers"
24887
+ },
24888
+ "producers": {
24889
+ "type": "array",
24890
+ "items": {
24891
+ "type": "string"
24892
+ }
24893
+ },
24894
+ "cells": {
24895
+ "type": "array",
24896
+ "items": {
24897
+ "type": "object",
24898
+ "properties": {
24899
+ "profile": {
24900
+ "type": "object",
24901
+ "properties": {
24902
+ "key": {
24903
+ "type": "string",
24904
+ "description": "Identifies the profile across layers: the environment and the sorted parameters"
24905
+ },
24906
+ "environment": {
24907
+ "type": [
24908
+ "string",
24909
+ "null"
24910
+ ]
24911
+ },
24912
+ "parameters": {
24913
+ "type": "object",
24914
+ "propertyNames": {
24915
+ "type": "string"
24916
+ },
24917
+ "additionalProperties": {
24918
+ "type": "string"
24919
+ }
24920
+ },
24921
+ "label": {
24922
+ "type": "string",
24923
+ "description": "For a person: the client and each parameter's value"
24924
+ }
24925
+ },
24926
+ "required": [
24927
+ "key",
24928
+ "environment",
24929
+ "parameters",
24930
+ "label"
24931
+ ],
24932
+ "additionalProperties": {}
24933
+ },
24934
+ "coverage": {
24935
+ "type": "string",
24936
+ "enum": [
24937
+ "captured",
24938
+ "failed",
24939
+ "capturing",
24940
+ "skipped",
24941
+ "missing"
24942
+ ],
24943
+ "description": "`captured` only when the winning capture passed. Every other value means there is no picture to trust"
24944
+ },
24945
+ "expected": {
24946
+ "type": "string",
24947
+ "enum": [
24948
+ "declared",
24949
+ "undeclared",
24950
+ "unknown"
24951
+ ],
24952
+ "description": "`declared`: a plan expects it. `undeclared`: plans exist and none names it. `unknown`: no plan was published, so nothing is known to be unexpected"
24953
+ },
24954
+ "capture": {
24955
+ "anyOf": [
24956
+ {
24957
+ "type": "object",
24958
+ "properties": {
24959
+ "status": {
24960
+ "type": "string",
24961
+ "enum": [
24962
+ "passed",
24963
+ "failed",
24964
+ "running",
24965
+ "not-run"
24966
+ ]
24967
+ },
24968
+ "detail": {
24969
+ "type": "string"
24970
+ },
24971
+ "durationMs": {
24972
+ "type": [
24973
+ "number",
24974
+ "null"
24975
+ ]
24976
+ },
24977
+ "image": {
24978
+ "anyOf": [
24979
+ {
24980
+ "type": "object",
24981
+ "properties": {
24982
+ "name": {
24983
+ "type": "string"
24984
+ },
24985
+ "contentType": {
24986
+ "type": "string"
24987
+ },
24988
+ "width": {
24989
+ "type": "number"
24990
+ },
24991
+ "height": {
24992
+ "type": "number"
24993
+ },
24994
+ "bytes": {
24995
+ "type": "number"
24996
+ },
24997
+ "sha256": {
24998
+ "type": "string"
24999
+ },
25000
+ "bundleKey": {
25001
+ "type": "string"
25002
+ },
25003
+ "uri": {
25004
+ "description": "An http(s) address, when the picture lives elsewhere",
25005
+ "type": "string"
25006
+ },
25007
+ "path": {
25008
+ "description": "Where the stored bytes are, relative to the reports API root (`/api/reports` on a server): `/layers/<layer>/blobs/attachments/<sha256>`",
25009
+ "type": "string"
25010
+ },
25011
+ "omitted": {
25012
+ "description": "Why the producer left the bytes out. A picture that is left out is not a picture that was never taken",
25013
+ "type": "string"
25014
+ }
25015
+ },
25016
+ "required": [
25017
+ "name"
25018
+ ],
25019
+ "additionalProperties": {}
25020
+ },
25021
+ {
25022
+ "type": "null"
25023
+ }
25024
+ ]
25025
+ },
25026
+ "labels": {
25027
+ "type": "object",
25028
+ "propertyNames": {
25029
+ "type": "string"
25030
+ },
25031
+ "additionalProperties": {
25032
+ "type": "string"
25033
+ },
25034
+ "description": "What describes the capture without splitting it: a `shard`, a `browser`"
25035
+ },
25036
+ "origin": {
25037
+ "type": "object",
25038
+ "properties": {
25039
+ "layer": {
25040
+ "type": "string"
25041
+ },
25042
+ "backend": {
25043
+ "type": "string"
25044
+ },
25045
+ "producer": {
25046
+ "type": "string"
25047
+ },
25048
+ "recordedAtMs": {
25049
+ "type": "number"
25050
+ },
25051
+ "sha": {
25052
+ "type": [
25053
+ "string",
25054
+ "null"
25055
+ ]
25056
+ },
25057
+ "branch": {
25058
+ "type": [
25059
+ "string",
25060
+ "null"
25061
+ ]
25062
+ },
25063
+ "runUrl": {
25064
+ "type": [
25065
+ "string",
25066
+ "null"
25067
+ ]
25068
+ },
25069
+ "freshness": {
25070
+ "type": "string",
25071
+ "enum": [
25072
+ "unknown",
25073
+ "modified"
25074
+ ]
25075
+ }
25076
+ },
25077
+ "required": [
25078
+ "layer",
25079
+ "backend",
25080
+ "producer",
25081
+ "recordedAtMs",
25082
+ "sha",
25083
+ "branch",
25084
+ "runUrl"
25085
+ ],
25086
+ "additionalProperties": {}
25087
+ },
25088
+ "alternatives": {
25089
+ "type": "integer",
25090
+ "minimum": 0,
25091
+ "maximum": 9007199254740991,
25092
+ "description": "Other captures of this cell from other producers; the winner is the one the report contract picks"
25093
+ }
25094
+ },
25095
+ "required": [
25096
+ "status",
25097
+ "detail",
25098
+ "durationMs",
25099
+ "image",
25100
+ "labels",
25101
+ "origin",
25102
+ "alternatives"
25103
+ ],
25104
+ "additionalProperties": {}
25105
+ },
25106
+ {
25107
+ "type": "null"
25108
+ }
25109
+ ]
25110
+ },
25111
+ "planned": {
25112
+ "anyOf": [
25113
+ {
25114
+ "type": "object",
25115
+ "properties": {
25116
+ "layer": {
25117
+ "type": "string"
25118
+ },
25119
+ "backend": {
25120
+ "type": "string"
25121
+ }
25122
+ },
25123
+ "required": [
25124
+ "layer",
25125
+ "backend"
25126
+ ],
25127
+ "additionalProperties": {}
25128
+ },
25129
+ {
25130
+ "type": "null"
25131
+ }
25132
+ ],
25133
+ "description": "The plan layer that expects this cell"
25134
+ }
25135
+ },
25136
+ "required": [
25137
+ "profile",
25138
+ "coverage",
25139
+ "expected",
25140
+ "capture",
25141
+ "planned"
25142
+ ],
25143
+ "additionalProperties": {}
25144
+ }
25145
+ }
25146
+ },
25147
+ "required": [
25148
+ "id",
25149
+ "title",
25150
+ "route",
25151
+ "fixture",
25152
+ "cohort",
25153
+ "area",
25154
+ "flags",
25155
+ "covers",
25156
+ "producers",
25157
+ "cells"
25158
+ ],
25159
+ "additionalProperties": {}
25160
+ }
25161
+ },
25162
+ "surfaces": {
25163
+ "type": "array",
25164
+ "items": {
25165
+ "type": "object",
25166
+ "properties": {
25167
+ "id": {
25168
+ "type": "string"
25169
+ },
25170
+ "inventoried": {
25171
+ "type": "boolean",
25172
+ "description": "A `ui-plan` inventory entry names it: the product is known to have it"
25173
+ },
25174
+ "states": {
25175
+ "type": "integer",
25176
+ "minimum": 0,
25177
+ "maximum": 9007199254740991
25178
+ },
25179
+ "captured": {
25180
+ "type": "integer",
25181
+ "minimum": 0,
25182
+ "maximum": 9007199254740991
25183
+ },
25184
+ "status": {
25185
+ "type": "string",
25186
+ "enum": [
25187
+ "covered",
25188
+ "uncaptured",
25189
+ "uncovered"
25190
+ ]
25191
+ }
25192
+ },
25193
+ "required": [
25194
+ "id",
25195
+ "inventoried",
25196
+ "states",
25197
+ "captured",
25198
+ "status"
25199
+ ],
25200
+ "additionalProperties": {}
25201
+ }
25202
+ },
25203
+ "facets": {
25204
+ "type": "object",
25205
+ "properties": {
25206
+ "profiles": {
25207
+ "type": "array",
25208
+ "items": {
25209
+ "type": "object",
25210
+ "properties": {
25211
+ "value": {
25212
+ "type": "string"
25213
+ },
25214
+ "count": {
25215
+ "type": "integer",
25216
+ "minimum": 0,
25217
+ "maximum": 9007199254740991
25218
+ },
25219
+ "label": {
25220
+ "type": "string"
25221
+ }
25222
+ },
25223
+ "required": [
25224
+ "value",
25225
+ "count"
25226
+ ],
25227
+ "additionalProperties": {}
25228
+ }
25229
+ },
25230
+ "coverage": {
25231
+ "type": "array",
25232
+ "items": {
25233
+ "type": "object",
25234
+ "properties": {
25235
+ "value": {
25236
+ "type": "string"
25237
+ },
25238
+ "count": {
25239
+ "type": "integer",
25240
+ "minimum": 0,
25241
+ "maximum": 9007199254740991
25242
+ },
25243
+ "label": {
25244
+ "type": "string"
25245
+ }
25246
+ },
25247
+ "required": [
25248
+ "value",
25249
+ "count"
25250
+ ],
25251
+ "additionalProperties": {}
25252
+ }
25253
+ },
25254
+ "areas": {
25255
+ "type": "array",
25256
+ "items": {
25257
+ "type": "object",
25258
+ "properties": {
25259
+ "value": {
25260
+ "type": "string"
25261
+ },
25262
+ "count": {
25263
+ "type": "integer",
25264
+ "minimum": 0,
25265
+ "maximum": 9007199254740991
25266
+ },
25267
+ "label": {
25268
+ "type": "string"
25269
+ }
25270
+ },
25271
+ "required": [
25272
+ "value",
25273
+ "count"
25274
+ ],
25275
+ "additionalProperties": {}
25276
+ }
25277
+ },
25278
+ "routes": {
25279
+ "type": "array",
25280
+ "items": {
25281
+ "type": "object",
25282
+ "properties": {
25283
+ "value": {
25284
+ "type": "string"
25285
+ },
25286
+ "count": {
25287
+ "type": "integer",
25288
+ "minimum": 0,
25289
+ "maximum": 9007199254740991
25290
+ },
25291
+ "label": {
25292
+ "type": "string"
25293
+ }
25294
+ },
25295
+ "required": [
25296
+ "value",
25297
+ "count"
25298
+ ],
25299
+ "additionalProperties": {}
25300
+ }
25301
+ },
25302
+ "cohorts": {
25303
+ "type": "array",
25304
+ "items": {
25305
+ "type": "object",
25306
+ "properties": {
25307
+ "value": {
25308
+ "type": "string"
25309
+ },
25310
+ "count": {
25311
+ "type": "integer",
25312
+ "minimum": 0,
25313
+ "maximum": 9007199254740991
25314
+ },
25315
+ "label": {
25316
+ "type": "string"
25317
+ }
25318
+ },
25319
+ "required": [
25320
+ "value",
25321
+ "count"
25322
+ ],
25323
+ "additionalProperties": {}
25324
+ }
25325
+ },
25326
+ "flags": {
25327
+ "type": "array",
25328
+ "items": {
25329
+ "type": "object",
25330
+ "properties": {
25331
+ "value": {
25332
+ "type": "string"
25333
+ },
25334
+ "count": {
25335
+ "type": "integer",
25336
+ "minimum": 0,
25337
+ "maximum": 9007199254740991
25338
+ },
25339
+ "label": {
25340
+ "type": "string"
25341
+ }
25342
+ },
25343
+ "required": [
25344
+ "value",
25345
+ "count"
25346
+ ],
25347
+ "additionalProperties": {}
25348
+ }
25349
+ },
25350
+ "surfaces": {
25351
+ "type": "array",
25352
+ "items": {
25353
+ "type": "object",
25354
+ "properties": {
25355
+ "value": {
25356
+ "type": "string"
25357
+ },
25358
+ "count": {
25359
+ "type": "integer",
25360
+ "minimum": 0,
25361
+ "maximum": 9007199254740991
25362
+ },
25363
+ "label": {
25364
+ "type": "string"
25365
+ }
25366
+ },
25367
+ "required": [
25368
+ "value",
25369
+ "count"
25370
+ ],
25371
+ "additionalProperties": {}
25372
+ }
25373
+ },
25374
+ "producers": {
25375
+ "type": "array",
25376
+ "items": {
25377
+ "type": "object",
25378
+ "properties": {
25379
+ "value": {
25380
+ "type": "string"
25381
+ },
25382
+ "count": {
25383
+ "type": "integer",
25384
+ "minimum": 0,
25385
+ "maximum": 9007199254740991
25386
+ },
25387
+ "label": {
25388
+ "type": "string"
25389
+ }
25390
+ },
25391
+ "required": [
25392
+ "value",
25393
+ "count"
25394
+ ],
25395
+ "additionalProperties": {}
25396
+ }
25397
+ }
25398
+ },
25399
+ "required": [
25400
+ "profiles",
25401
+ "coverage",
25402
+ "areas",
25403
+ "routes",
25404
+ "cohorts",
25405
+ "flags",
25406
+ "surfaces",
25407
+ "producers"
25408
+ ],
25409
+ "additionalProperties": {}
25410
+ },
25411
+ "sources": {
25412
+ "type": "object",
25413
+ "properties": {
25414
+ "layers": {
25415
+ "type": "integer",
25416
+ "minimum": 0,
25417
+ "maximum": 9007199254740991
25418
+ },
25419
+ "backends": {
25420
+ "type": "array",
25421
+ "items": {
25422
+ "type": "object",
25423
+ "properties": {
25424
+ "id": {
25425
+ "type": "string"
25426
+ },
25427
+ "label": {
25428
+ "type": "string"
25429
+ },
25430
+ "live": {
25431
+ "type": "boolean",
25432
+ "description": "Always false on a server"
25433
+ },
25434
+ "available": {
25435
+ "type": "boolean",
25436
+ "description": "False when the backend could not be read; its results are then unknown, never passed"
25437
+ }
25438
+ },
25439
+ "required": [
25440
+ "id",
25441
+ "label",
25442
+ "live",
25443
+ "available"
25444
+ ],
25445
+ "additionalProperties": {}
25446
+ }
25447
+ },
25448
+ "notices": {
25449
+ "type": "array",
25450
+ "items": {
25451
+ "type": "string"
25452
+ }
25453
+ }
25454
+ },
25455
+ "required": [
25456
+ "layers",
25457
+ "backends",
25458
+ "notices"
25459
+ ],
25460
+ "additionalProperties": {},
25461
+ "description": "What was read. A backend that is unavailable, or a layer that could not be read, is named here; what depended on it is not shown as captured"
25462
+ },
25463
+ "total": {
25464
+ "description": "States that matched, before `offset` and `limit`",
25465
+ "type": "integer",
25466
+ "minimum": 0,
25467
+ "maximum": 9007199254740991
25468
+ },
25469
+ "offset": {
25470
+ "type": "integer",
25471
+ "minimum": 0,
25472
+ "maximum": 9007199254740991
25473
+ },
25474
+ "limit": {
25475
+ "type": "integer",
25476
+ "minimum": 0,
25477
+ "maximum": 9007199254740991
25478
+ }
25479
+ },
25480
+ "required": [
25481
+ "schemaVersion",
25482
+ "summary",
25483
+ "profiles",
25484
+ "states",
25485
+ "surfaces",
25486
+ "facets",
25487
+ "sources"
25488
+ ],
25489
+ "additionalProperties": {}
25490
+ },
24129
25491
  "RunDetail": {
24130
25492
  "type": "object",
24131
25493
  "properties": {