@crvouga/atlas 1.17.0 → 1.19.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.
- package/CHANGELOG.md +14 -1
- package/dist/reports/src/artifact-query.d.ts +14 -2
- package/dist/reports/src/artifact-query.js +13 -4
- package/dist/reports/src/evidence-detail.js +19 -6
- package/dist/reports/src/evidence-types.d.ts +8 -0
- package/dist/reports/src/recording-receipt.d.ts +23 -0
- package/dist/reports/src/recording-receipt.js +16 -0
- package/dist/reports/src/recording-verify.d.ts +74 -0
- package/dist/reports/src/recording-verify.js +142 -0
- package/dist/reports/src/report-cli.d.ts +2 -2
- package/dist/reports/src/report-cli.js +53 -3
- package/dist/reports/src/test-catalog.d.ts +7 -1
- package/dist/reports/src/test-catalog.js +10 -4
- package/dist/schema/src/api.d.ts +134 -0
- package/dist/schema/src/api.js +13 -2
- package/dist/schema/src/cli-results.d.ts +51 -1
- package/dist/schema/src/cli-results.js +25 -1
- package/dist/server/src/openapi.js +1 -0
- package/docs/agents.md +1 -0
- package/docs/reference/cli.md +11 -2
- package/docs/reference/http-api.md +2 -0
- package/docs/reference/reports.md +189 -9
- package/docs/reference/schema.md +19 -1
- package/docs/rich-evidence.md +33 -5
- package/docs/server.md +1 -1
- package/docs/ui.md +40 -1
- package/llms-full.txt +88 -9
- package/package.json +1 -1
- package/packages/schema/schemas/effective-delta.schema.json +26 -0
- package/packages/schema/schemas/effective-evidence.schema.json +26 -0
- package/packages/schema/schemas/evidence-page.schema.json +13 -0
- package/packages/schema/schemas/layer-rows.schema.json +13 -0
- package/packages/schema/schemas/report-run.schema.json +83 -0
- package/packages/schema/schemas/report-runs.schema.json +86 -0
- package/packages/schema/schemas/review-collection.schema.json +13 -0
- package/packages/schema/schemas/review-manifest.schema.json +13 -0
- package/packages/schema/schemas/test-catalog.schema.json +13 -0
- package/packages/schema/schemas/test-history.schema.json +26 -0
- package/packages/schema/schemas/verify-recordings-result.schema.json +97 -0
- package/packages/server/openapi.json +378 -0
- package/packages/visualizer/src/app/AppShell.tsx +2 -2
- package/packages/visualizer/src/app/router.tsx +25 -1
- package/packages/visualizer/src/components/Header.tsx +15 -4
- package/packages/visualizer/src/evidence/behavior-index.test.ts +119 -0
- package/packages/visualizer/src/evidence/behavior-index.ts +162 -0
- package/packages/visualizer/src/evidence/behavior-panel.tsx +36 -22
- package/packages/visualizer/src/evidence/behavior-return.test.ts +41 -0
- package/packages/visualizer/src/evidence/behavior-return.ts +59 -0
- package/packages/visualizer/src/evidence/behavior.ts +32 -1
- package/packages/visualizer/src/evidence/behaviors-page.tsx +465 -0
- package/packages/visualizer/src/evidence/feature-page.tsx +5 -26
- package/packages/visualizer/src/evidence/scoped-summary-view.tsx +110 -0
- package/packages/visualizer/src/evidence/scoped-summary.test.ts +62 -0
- package/packages/visualizer/src/evidence/scoped-summary.ts +118 -0
- package/packages/visualizer/src/evidence/spec-texts.ts +88 -0
- package/packages/visualizer/src/explorer/ArtifactsView.tsx +7 -6
- package/packages/visualizer/src/explorer/Explorer.tsx +1 -1
- package/packages/visualizer/src/explorer/RunsView.tsx +32 -7
- package/packages/visualizer/src/explorer/collections.tsx +5 -5
- package/packages/visualizer/src/explorer/filters.tsx +11 -3
- package/packages/visualizer/src/explorer/navigate.ts +17 -0
- package/packages/visualizer/src/explorer/playlist-entries.test.ts +10 -1
- package/packages/visualizer/src/explorer/playlist-entries.ts +10 -0
- package/packages/visualizer/src/explorer/playlist.tsx +43 -8
- package/packages/visualizer/src/explorer/search.ts +13 -3
- package/packages/visualizer/src/find/Finder.tsx +1 -62
|
@@ -5856,6 +5856,15 @@
|
|
|
5856
5856
|
"type": "string"
|
|
5857
5857
|
}
|
|
5858
5858
|
},
|
|
5859
|
+
{
|
|
5860
|
+
"required": false,
|
|
5861
|
+
"name": "recordings",
|
|
5862
|
+
"in": "query",
|
|
5863
|
+
"description": "Recording completeness of the run, apart from its outcome: `complete`, `incomplete`, `none-expected` or `unknown` (a run whose layers declared no recording expectations is `unknown`, never `complete`). Repeatable or comma-separated. Answered from the layers' receipts; no recording is read. A server that does not know it ignores it and does not name it in `filters`.",
|
|
5864
|
+
"schema": {
|
|
5865
|
+
"type": "string"
|
|
5866
|
+
}
|
|
5867
|
+
},
|
|
5859
5868
|
{
|
|
5860
5869
|
"required": false,
|
|
5861
5870
|
"name": "q",
|
|
@@ -6076,6 +6085,15 @@
|
|
|
6076
6085
|
"type": "string"
|
|
6077
6086
|
}
|
|
6078
6087
|
},
|
|
6088
|
+
{
|
|
6089
|
+
"required": false,
|
|
6090
|
+
"name": "recordings",
|
|
6091
|
+
"in": "query",
|
|
6092
|
+
"description": "Recording completeness of the run, apart from its outcome: `complete`, `incomplete`, `none-expected` or `unknown` (a run whose layers declared no recording expectations is `unknown`, never `complete`). Repeatable or comma-separated. Answered from the layers' receipts; no recording is read. A server that does not know it ignores it and does not name it in `filters`.",
|
|
6093
|
+
"schema": {
|
|
6094
|
+
"type": "string"
|
|
6095
|
+
}
|
|
6096
|
+
},
|
|
6079
6097
|
{
|
|
6080
6098
|
"required": false,
|
|
6081
6099
|
"name": "q",
|
|
@@ -10730,6 +10748,19 @@
|
|
|
10730
10748
|
"type": "boolean",
|
|
10731
10749
|
"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
10750
|
},
|
|
10751
|
+
"reason": {
|
|
10752
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
10753
|
+
"type": "string"
|
|
10754
|
+
},
|
|
10755
|
+
"durationMs": {
|
|
10756
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
10757
|
+
"type": "number",
|
|
10758
|
+
"minimum": 0
|
|
10759
|
+
},
|
|
10760
|
+
"poster": {
|
|
10761
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
10762
|
+
"type": "string"
|
|
10763
|
+
},
|
|
10733
10764
|
"scope": {
|
|
10734
10765
|
"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",
|
|
10735
10766
|
"type": "object",
|
|
@@ -11209,6 +11240,19 @@
|
|
|
11209
11240
|
"type": "boolean",
|
|
11210
11241
|
"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
11242
|
},
|
|
11243
|
+
"reason": {
|
|
11244
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
11245
|
+
"type": "string"
|
|
11246
|
+
},
|
|
11247
|
+
"durationMs": {
|
|
11248
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
11249
|
+
"type": "number",
|
|
11250
|
+
"minimum": 0
|
|
11251
|
+
},
|
|
11252
|
+
"poster": {
|
|
11253
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
11254
|
+
"type": "string"
|
|
11255
|
+
},
|
|
11212
11256
|
"scope": {
|
|
11213
11257
|
"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",
|
|
11214
11258
|
"type": "object",
|
|
@@ -11723,6 +11767,19 @@
|
|
|
11723
11767
|
"type": "boolean",
|
|
11724
11768
|
"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
11769
|
},
|
|
11770
|
+
"reason": {
|
|
11771
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
11772
|
+
"type": "string"
|
|
11773
|
+
},
|
|
11774
|
+
"durationMs": {
|
|
11775
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
11776
|
+
"type": "number",
|
|
11777
|
+
"minimum": 0
|
|
11778
|
+
},
|
|
11779
|
+
"poster": {
|
|
11780
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
11781
|
+
"type": "string"
|
|
11782
|
+
},
|
|
11726
11783
|
"scope": {
|
|
11727
11784
|
"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",
|
|
11728
11785
|
"type": "object",
|
|
@@ -12202,6 +12259,19 @@
|
|
|
12202
12259
|
"type": "boolean",
|
|
12203
12260
|
"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
12261
|
},
|
|
12262
|
+
"reason": {
|
|
12263
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
12264
|
+
"type": "string"
|
|
12265
|
+
},
|
|
12266
|
+
"durationMs": {
|
|
12267
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
12268
|
+
"type": "number",
|
|
12269
|
+
"minimum": 0
|
|
12270
|
+
},
|
|
12271
|
+
"poster": {
|
|
12272
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
12273
|
+
"type": "string"
|
|
12274
|
+
},
|
|
12205
12275
|
"scope": {
|
|
12206
12276
|
"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",
|
|
12207
12277
|
"type": "object",
|
|
@@ -15610,6 +15680,19 @@
|
|
|
15610
15680
|
"type": "boolean",
|
|
15611
15681
|
"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
15682
|
},
|
|
15683
|
+
"reason": {
|
|
15684
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
15685
|
+
"type": "string"
|
|
15686
|
+
},
|
|
15687
|
+
"durationMs": {
|
|
15688
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
15689
|
+
"type": "number",
|
|
15690
|
+
"minimum": 0
|
|
15691
|
+
},
|
|
15692
|
+
"poster": {
|
|
15693
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
15694
|
+
"type": "string"
|
|
15695
|
+
},
|
|
15613
15696
|
"scope": {
|
|
15614
15697
|
"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",
|
|
15615
15698
|
"type": "object",
|
|
@@ -16104,6 +16187,19 @@
|
|
|
16104
16187
|
"type": "boolean",
|
|
16105
16188
|
"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
16189
|
},
|
|
16190
|
+
"reason": {
|
|
16191
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
16192
|
+
"type": "string"
|
|
16193
|
+
},
|
|
16194
|
+
"durationMs": {
|
|
16195
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
16196
|
+
"type": "number",
|
|
16197
|
+
"minimum": 0
|
|
16198
|
+
},
|
|
16199
|
+
"poster": {
|
|
16200
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
16201
|
+
"type": "string"
|
|
16202
|
+
},
|
|
16107
16203
|
"scope": {
|
|
16108
16204
|
"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",
|
|
16109
16205
|
"type": "object",
|
|
@@ -18714,6 +18810,19 @@
|
|
|
18714
18810
|
"type": "boolean",
|
|
18715
18811
|
"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
18812
|
},
|
|
18813
|
+
"reason": {
|
|
18814
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
18815
|
+
"type": "string"
|
|
18816
|
+
},
|
|
18817
|
+
"durationMs": {
|
|
18818
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
18819
|
+
"type": "number",
|
|
18820
|
+
"minimum": 0
|
|
18821
|
+
},
|
|
18822
|
+
"poster": {
|
|
18823
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
18824
|
+
"type": "string"
|
|
18825
|
+
},
|
|
18717
18826
|
"scope": {
|
|
18718
18827
|
"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",
|
|
18719
18828
|
"type": "object",
|
|
@@ -19196,6 +19305,19 @@
|
|
|
19196
19305
|
"type": "boolean",
|
|
19197
19306
|
"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
19307
|
},
|
|
19308
|
+
"reason": {
|
|
19309
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
19310
|
+
"type": "string"
|
|
19311
|
+
},
|
|
19312
|
+
"durationMs": {
|
|
19313
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
19314
|
+
"type": "number",
|
|
19315
|
+
"minimum": 0
|
|
19316
|
+
},
|
|
19317
|
+
"poster": {
|
|
19318
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
19319
|
+
"type": "string"
|
|
19320
|
+
},
|
|
19199
19321
|
"scope": {
|
|
19200
19322
|
"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",
|
|
19201
19323
|
"type": "object",
|
|
@@ -19838,6 +19960,19 @@
|
|
|
19838
19960
|
"type": "boolean",
|
|
19839
19961
|
"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
19962
|
},
|
|
19963
|
+
"reason": {
|
|
19964
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
19965
|
+
"type": "string"
|
|
19966
|
+
},
|
|
19967
|
+
"durationMs": {
|
|
19968
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
19969
|
+
"type": "number",
|
|
19970
|
+
"minimum": 0
|
|
19971
|
+
},
|
|
19972
|
+
"poster": {
|
|
19973
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
19974
|
+
"type": "string"
|
|
19975
|
+
},
|
|
19841
19976
|
"scope": {
|
|
19842
19977
|
"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",
|
|
19843
19978
|
"type": "object",
|
|
@@ -21093,6 +21228,19 @@
|
|
|
21093
21228
|
"type": "boolean",
|
|
21094
21229
|
"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"
|
|
21095
21230
|
},
|
|
21231
|
+
"reason": {
|
|
21232
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
21233
|
+
"type": "string"
|
|
21234
|
+
},
|
|
21235
|
+
"durationMs": {
|
|
21236
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
21237
|
+
"type": "number",
|
|
21238
|
+
"minimum": 0
|
|
21239
|
+
},
|
|
21240
|
+
"poster": {
|
|
21241
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
21242
|
+
"type": "string"
|
|
21243
|
+
},
|
|
21096
21244
|
"scope": {
|
|
21097
21245
|
"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",
|
|
21098
21246
|
"type": "object",
|
|
@@ -22284,6 +22432,19 @@
|
|
|
22284
22432
|
"type": "boolean",
|
|
22285
22433
|
"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"
|
|
22286
22434
|
},
|
|
22435
|
+
"reason": {
|
|
22436
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
22437
|
+
"type": "string"
|
|
22438
|
+
},
|
|
22439
|
+
"durationMs": {
|
|
22440
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
22441
|
+
"type": "number",
|
|
22442
|
+
"minimum": 0
|
|
22443
|
+
},
|
|
22444
|
+
"poster": {
|
|
22445
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
22446
|
+
"type": "string"
|
|
22447
|
+
},
|
|
22287
22448
|
"scope": {
|
|
22288
22449
|
"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",
|
|
22289
22450
|
"type": "object",
|
|
@@ -22955,6 +23116,19 @@
|
|
|
22955
23116
|
"type": "boolean",
|
|
22956
23117
|
"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"
|
|
22957
23118
|
},
|
|
23119
|
+
"reason": {
|
|
23120
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
23121
|
+
"type": "string"
|
|
23122
|
+
},
|
|
23123
|
+
"durationMs": {
|
|
23124
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
23125
|
+
"type": "number",
|
|
23126
|
+
"minimum": 0
|
|
23127
|
+
},
|
|
23128
|
+
"poster": {
|
|
23129
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
23130
|
+
"type": "string"
|
|
23131
|
+
},
|
|
22958
23132
|
"scope": {
|
|
22959
23133
|
"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",
|
|
22960
23134
|
"type": "object",
|
|
@@ -23984,6 +24158,12 @@
|
|
|
23984
24158
|
"minimum": 0,
|
|
23985
24159
|
"maximum": 9007199254740991,
|
|
23986
24160
|
"description": "References that name no bytes, or bytes the layer does not hold"
|
|
24161
|
+
},
|
|
24162
|
+
"missing": {
|
|
24163
|
+
"description": "Of `unavailable`, those that name a file the layer's bundle does not hold (stored, then gone). Absent when there are none",
|
|
24164
|
+
"type": "integer",
|
|
24165
|
+
"exclusiveMinimum": 0,
|
|
24166
|
+
"maximum": 9007199254740991
|
|
23987
24167
|
}
|
|
23988
24168
|
},
|
|
23989
24169
|
"required": [
|
|
@@ -23993,6 +24173,64 @@
|
|
|
23993
24173
|
],
|
|
23994
24174
|
"additionalProperties": {}
|
|
23995
24175
|
},
|
|
24176
|
+
"recordings": {
|
|
24177
|
+
"description": "Whether the recordings its layers expected were published, apart from its outcomes. Absent when no layer declared an expectation: its completeness is unknown, never complete. Matched by the `recordings` filter",
|
|
24178
|
+
"type": "object",
|
|
24179
|
+
"properties": {
|
|
24180
|
+
"state": {
|
|
24181
|
+
"type": "string",
|
|
24182
|
+
"enum": [
|
|
24183
|
+
"complete",
|
|
24184
|
+
"incomplete",
|
|
24185
|
+
"none-expected",
|
|
24186
|
+
"unknown"
|
|
24187
|
+
],
|
|
24188
|
+
"description": "`incomplete` when an expected recording was skipped or unresolved; else `unknown` when a layer declared no expectations; else `complete` when something was expected and `none-expected` when nothing was"
|
|
24189
|
+
},
|
|
24190
|
+
"expected": {
|
|
24191
|
+
"type": "integer",
|
|
24192
|
+
"minimum": 0,
|
|
24193
|
+
"maximum": 9007199254740991
|
|
24194
|
+
},
|
|
24195
|
+
"published": {
|
|
24196
|
+
"type": "integer",
|
|
24197
|
+
"minimum": 0,
|
|
24198
|
+
"maximum": 9007199254740991,
|
|
24199
|
+
"description": "Of the expected recordings, uploaded or referenced by address"
|
|
24200
|
+
},
|
|
24201
|
+
"skipped": {
|
|
24202
|
+
"type": "integer",
|
|
24203
|
+
"minimum": 0,
|
|
24204
|
+
"maximum": 9007199254740991
|
|
24205
|
+
},
|
|
24206
|
+
"unresolved": {
|
|
24207
|
+
"type": "integer",
|
|
24208
|
+
"minimum": 0,
|
|
24209
|
+
"maximum": 9007199254740991
|
|
24210
|
+
},
|
|
24211
|
+
"notApplicable": {
|
|
24212
|
+
"type": "integer",
|
|
24213
|
+
"minimum": 0,
|
|
24214
|
+
"maximum": 9007199254740991
|
|
24215
|
+
},
|
|
24216
|
+
"layersWithoutReceipt": {
|
|
24217
|
+
"type": "integer",
|
|
24218
|
+
"minimum": 0,
|
|
24219
|
+
"maximum": 9007199254740991,
|
|
24220
|
+
"description": "Layers of the run that declared no recording expectations: nothing is claimed for them"
|
|
24221
|
+
}
|
|
24222
|
+
},
|
|
24223
|
+
"required": [
|
|
24224
|
+
"state",
|
|
24225
|
+
"expected",
|
|
24226
|
+
"published",
|
|
24227
|
+
"skipped",
|
|
24228
|
+
"unresolved",
|
|
24229
|
+
"notApplicable",
|
|
24230
|
+
"layersWithoutReceipt"
|
|
24231
|
+
],
|
|
24232
|
+
"additionalProperties": {}
|
|
24233
|
+
},
|
|
23996
24234
|
"attachments": {
|
|
23997
24235
|
"description": "Files attached to the run itself, in its layers, not to a check. Absent when there are none",
|
|
23998
24236
|
"type": "integer",
|
|
@@ -24233,6 +24471,28 @@
|
|
|
24233
24471
|
],
|
|
24234
24472
|
"additionalProperties": {}
|
|
24235
24473
|
}
|
|
24474
|
+
},
|
|
24475
|
+
"recordings": {
|
|
24476
|
+
"description": "Only for runs: `complete`, `incomplete`, `none-expected` and `unknown` with how many runs have each. Absent on servers that predate the filter",
|
|
24477
|
+
"type": "array",
|
|
24478
|
+
"items": {
|
|
24479
|
+
"type": "object",
|
|
24480
|
+
"properties": {
|
|
24481
|
+
"value": {
|
|
24482
|
+
"type": "string"
|
|
24483
|
+
},
|
|
24484
|
+
"count": {
|
|
24485
|
+
"type": "integer",
|
|
24486
|
+
"minimum": 0,
|
|
24487
|
+
"maximum": 9007199254740991
|
|
24488
|
+
}
|
|
24489
|
+
},
|
|
24490
|
+
"required": [
|
|
24491
|
+
"value",
|
|
24492
|
+
"count"
|
|
24493
|
+
],
|
|
24494
|
+
"additionalProperties": {}
|
|
24495
|
+
}
|
|
24236
24496
|
}
|
|
24237
24497
|
},
|
|
24238
24498
|
"required": [
|
|
@@ -24444,6 +24704,19 @@
|
|
|
24444
24704
|
"type": "boolean",
|
|
24445
24705
|
"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"
|
|
24446
24706
|
},
|
|
24707
|
+
"reason": {
|
|
24708
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
24709
|
+
"type": "string"
|
|
24710
|
+
},
|
|
24711
|
+
"durationMs": {
|
|
24712
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
24713
|
+
"type": "number",
|
|
24714
|
+
"minimum": 0
|
|
24715
|
+
},
|
|
24716
|
+
"poster": {
|
|
24717
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
24718
|
+
"type": "string"
|
|
24719
|
+
},
|
|
24447
24720
|
"scope": {
|
|
24448
24721
|
"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",
|
|
24449
24722
|
"type": "object",
|
|
@@ -24769,6 +25042,28 @@
|
|
|
24769
25042
|
],
|
|
24770
25043
|
"additionalProperties": {}
|
|
24771
25044
|
}
|
|
25045
|
+
},
|
|
25046
|
+
"recordings": {
|
|
25047
|
+
"description": "Only for runs: `complete`, `incomplete`, `none-expected` and `unknown` with how many runs have each. Absent on servers that predate the filter",
|
|
25048
|
+
"type": "array",
|
|
25049
|
+
"items": {
|
|
25050
|
+
"type": "object",
|
|
25051
|
+
"properties": {
|
|
25052
|
+
"value": {
|
|
25053
|
+
"type": "string"
|
|
25054
|
+
},
|
|
25055
|
+
"count": {
|
|
25056
|
+
"type": "integer",
|
|
25057
|
+
"minimum": 0,
|
|
25058
|
+
"maximum": 9007199254740991
|
|
25059
|
+
}
|
|
25060
|
+
},
|
|
25061
|
+
"required": [
|
|
25062
|
+
"value",
|
|
25063
|
+
"count"
|
|
25064
|
+
],
|
|
25065
|
+
"additionalProperties": {}
|
|
25066
|
+
}
|
|
24772
25067
|
}
|
|
24773
25068
|
},
|
|
24774
25069
|
"required": [
|
|
@@ -25736,6 +26031,12 @@
|
|
|
25736
26031
|
"minimum": 0,
|
|
25737
26032
|
"maximum": 9007199254740991,
|
|
25738
26033
|
"description": "References that name no bytes, or bytes the layer does not hold"
|
|
26034
|
+
},
|
|
26035
|
+
"missing": {
|
|
26036
|
+
"description": "Of `unavailable`, those that name a file the layer's bundle does not hold (stored, then gone). Absent when there are none",
|
|
26037
|
+
"type": "integer",
|
|
26038
|
+
"exclusiveMinimum": 0,
|
|
26039
|
+
"maximum": 9007199254740991
|
|
25739
26040
|
}
|
|
25740
26041
|
},
|
|
25741
26042
|
"required": [
|
|
@@ -25745,6 +26046,64 @@
|
|
|
25745
26046
|
],
|
|
25746
26047
|
"additionalProperties": {}
|
|
25747
26048
|
},
|
|
26049
|
+
"recordings": {
|
|
26050
|
+
"description": "Whether the recordings its layers expected were published, apart from its outcomes. Absent when no layer declared an expectation: its completeness is unknown, never complete. Matched by the `recordings` filter",
|
|
26051
|
+
"type": "object",
|
|
26052
|
+
"properties": {
|
|
26053
|
+
"state": {
|
|
26054
|
+
"type": "string",
|
|
26055
|
+
"enum": [
|
|
26056
|
+
"complete",
|
|
26057
|
+
"incomplete",
|
|
26058
|
+
"none-expected",
|
|
26059
|
+
"unknown"
|
|
26060
|
+
],
|
|
26061
|
+
"description": "`incomplete` when an expected recording was skipped or unresolved; else `unknown` when a layer declared no expectations; else `complete` when something was expected and `none-expected` when nothing was"
|
|
26062
|
+
},
|
|
26063
|
+
"expected": {
|
|
26064
|
+
"type": "integer",
|
|
26065
|
+
"minimum": 0,
|
|
26066
|
+
"maximum": 9007199254740991
|
|
26067
|
+
},
|
|
26068
|
+
"published": {
|
|
26069
|
+
"type": "integer",
|
|
26070
|
+
"minimum": 0,
|
|
26071
|
+
"maximum": 9007199254740991,
|
|
26072
|
+
"description": "Of the expected recordings, uploaded or referenced by address"
|
|
26073
|
+
},
|
|
26074
|
+
"skipped": {
|
|
26075
|
+
"type": "integer",
|
|
26076
|
+
"minimum": 0,
|
|
26077
|
+
"maximum": 9007199254740991
|
|
26078
|
+
},
|
|
26079
|
+
"unresolved": {
|
|
26080
|
+
"type": "integer",
|
|
26081
|
+
"minimum": 0,
|
|
26082
|
+
"maximum": 9007199254740991
|
|
26083
|
+
},
|
|
26084
|
+
"notApplicable": {
|
|
26085
|
+
"type": "integer",
|
|
26086
|
+
"minimum": 0,
|
|
26087
|
+
"maximum": 9007199254740991
|
|
26088
|
+
},
|
|
26089
|
+
"layersWithoutReceipt": {
|
|
26090
|
+
"type": "integer",
|
|
26091
|
+
"minimum": 0,
|
|
26092
|
+
"maximum": 9007199254740991,
|
|
26093
|
+
"description": "Layers of the run that declared no recording expectations: nothing is claimed for them"
|
|
26094
|
+
}
|
|
26095
|
+
},
|
|
26096
|
+
"required": [
|
|
26097
|
+
"state",
|
|
26098
|
+
"expected",
|
|
26099
|
+
"published",
|
|
26100
|
+
"skipped",
|
|
26101
|
+
"unresolved",
|
|
26102
|
+
"notApplicable",
|
|
26103
|
+
"layersWithoutReceipt"
|
|
26104
|
+
],
|
|
26105
|
+
"additionalProperties": {}
|
|
26106
|
+
},
|
|
25748
26107
|
"attachments": {
|
|
25749
26108
|
"description": "Files attached to the run itself, in its layers, not to a check. Absent when there are none",
|
|
25750
26109
|
"type": "integer",
|
|
@@ -25890,6 +26249,19 @@
|
|
|
25890
26249
|
"type": "boolean",
|
|
25891
26250
|
"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"
|
|
25892
26251
|
},
|
|
26252
|
+
"reason": {
|
|
26253
|
+
"description": "Why it is unavailable, when the report can tell: `not-in-bundle` is a file the layer names but does not hold (stored, then gone). An open vocabulary: treat an unknown reason as plain unavailable",
|
|
26254
|
+
"type": "string"
|
|
26255
|
+
},
|
|
26256
|
+
"durationMs": {
|
|
26257
|
+
"description": "How long the recording is, in milliseconds, as its producer declared it: a hint to show before the file is opened, never a latency. Absent when none was declared, and in documents of older servers",
|
|
26258
|
+
"type": "number",
|
|
26259
|
+
"minimum": 0
|
|
26260
|
+
},
|
|
26261
|
+
"poster": {
|
|
26262
|
+
"description": "The bundle key, in the same layer, of the image the producer named as this recording's poster: a hint to show before the file is opened. Absent when there is none or the layer's bundle does not hold it, and in documents of older servers",
|
|
26263
|
+
"type": "string"
|
|
26264
|
+
},
|
|
25893
26265
|
"scope": {
|
|
25894
26266
|
"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",
|
|
25895
26267
|
"type": "object",
|
|
@@ -26091,6 +26463,12 @@
|
|
|
26091
26463
|
"minimum": 0,
|
|
26092
26464
|
"maximum": 9007199254740991,
|
|
26093
26465
|
"description": "References that name no bytes, or bytes the layer does not hold"
|
|
26466
|
+
},
|
|
26467
|
+
"missing": {
|
|
26468
|
+
"description": "Of `unavailable`, those that name a file the layer's bundle does not hold (stored, then gone). Absent when there are none",
|
|
26469
|
+
"type": "integer",
|
|
26470
|
+
"exclusiveMinimum": 0,
|
|
26471
|
+
"maximum": 9007199254740991
|
|
26094
26472
|
}
|
|
26095
26473
|
},
|
|
26096
26474
|
"required": [
|
|
@@ -26,7 +26,7 @@ function Index() {
|
|
|
26
26
|
<UiCatalogFilters />
|
|
27
27
|
) : kind ? (
|
|
28
28
|
<SpecIndex kind={kind} />
|
|
29
|
-
) : pathname.startsWith('/specs/') ? (
|
|
29
|
+
) : pathname.startsWith('/specs/') || pathname === '/behaviors' ? (
|
|
30
30
|
<Box component="nav" aria-label="Specs" />
|
|
31
31
|
) : evidence.ready && !evidence.files.some(isStatechartFile) ? (
|
|
32
32
|
<ProjectIndex />
|
|
@@ -39,7 +39,7 @@ function Body() {
|
|
|
39
39
|
const { view, spec } = useAtlas();
|
|
40
40
|
const { pathname } = useLocation();
|
|
41
41
|
if (pathname === '/' && evidence.ready && !evidence.filesPending && !evidence.files.some(isStatechartFile)) return <Explorer />;
|
|
42
|
-
if (!pathname.startsWith('/specs/') && pathname !== '/catalog' && !view && spec.error)
|
|
42
|
+
if (!pathname.startsWith('/specs/') && pathname !== '/catalog' && pathname !== '/behaviors' && !view && spec.error)
|
|
43
43
|
return (
|
|
44
44
|
<Container py="xl">
|
|
45
45
|
<Alert color="red" title="The spec couldn’t be loaded">
|
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
import { z } from 'zod/v4';
|
|
13
13
|
import { CatalogSearchFields } from '../catalog/search';
|
|
14
14
|
import { UiCatalogPage } from '../catalog/UiCatalogPage';
|
|
15
|
+
import { COVERAGE_ORDER } from '../evidence/behavior';
|
|
16
|
+
import { BehaviorsPage } from '../evidence/behaviors-page';
|
|
15
17
|
import { SpecPage } from '../evidence/spec-page';
|
|
16
18
|
import { ExplorerSearchFields } from '../explorer/search';
|
|
17
19
|
import { ProductPage } from '../views/ProductPage';
|
|
@@ -44,6 +46,21 @@ const SpecSearch = RootSearch.extend({
|
|
|
44
46
|
evidence: z.enum(['stale']).optional().catch(undefined)
|
|
45
47
|
});
|
|
46
48
|
export type SpecSearch = z.infer<typeof SpecSearch>;
|
|
49
|
+
/**
|
|
50
|
+
* The project-wide behavior index and its read-and-watch workspace: the search words, the coverage filter, the open behavior
|
|
51
|
+
* (`behavior`, an id from `evidence/behavior-index.ts`), whether it is expanded into the workspace, and the run and recorded
|
|
52
|
+
* moment shown. Scope and selection live here so that a link, a reload and the way back from the workspace all reproduce them.
|
|
53
|
+
*/
|
|
54
|
+
const BehaviorsSearch = RootSearch.extend({
|
|
55
|
+
q: z.string().min(1).optional().catch(undefined),
|
|
56
|
+
coverage: z.enum(COVERAGE_ORDER as [(typeof COVERAGE_ORDER)[number], ...(typeof COVERAGE_ORDER)[number][]]).optional().catch(undefined),
|
|
57
|
+
behavior: z.string().min(1).optional().catch(undefined),
|
|
58
|
+
workspace: z.preprocess((value) => (value === 'true' ? true : value), z.literal(true)).optional().catch(undefined),
|
|
59
|
+
layer: z.string().min(1).optional().catch(undefined),
|
|
60
|
+
clip: z.coerce.string().min(1).optional().catch(undefined),
|
|
61
|
+
clipAt: z.coerce.number().nonnegative().optional().catch(undefined)
|
|
62
|
+
});
|
|
63
|
+
export type BehaviorsSearch = z.infer<typeof BehaviorsSearch>;
|
|
47
64
|
/** A fresh route tree per router, so a test can run its own viewer beside the page's. */
|
|
48
65
|
function routeTree() {
|
|
49
66
|
const rootRoute = createRootRoute({
|
|
@@ -96,7 +113,14 @@ function routeTree() {
|
|
|
96
113
|
validateSearch: (search) => RootSearch.extend(CatalogSearchFields).parse(search),
|
|
97
114
|
component: UiCatalogPage
|
|
98
115
|
});
|
|
99
|
-
|
|
116
|
+
/** Every behavior of the project in one searchable list, and the dedicated workspace to read and watch one. */
|
|
117
|
+
const behaviorsRoute = createRoute({
|
|
118
|
+
getParentRoute: () => rootRoute,
|
|
119
|
+
path: '/behaviors',
|
|
120
|
+
validateSearch: (search) => BehaviorsSearch.parse(search),
|
|
121
|
+
component: BehaviorsPage
|
|
122
|
+
});
|
|
123
|
+
return rootRoute.addChildren([productRoute, chartRoute, specRoute, catalogRoute, behaviorsRoute]);
|
|
100
124
|
}
|
|
101
125
|
export function createAtlasRouter(history: RouterHistory) {
|
|
102
126
|
return createRouter({ routeTree: routeTree(), history, defaultPreload: false, scrollRestoration: true });
|