@crvouga/atlas 1.1.0 → 1.2.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 (35) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/reports/src/artifact-query.d.ts +123 -0
  3. package/dist/reports/src/artifact-query.js +234 -0
  4. package/dist/reports/src/evidence-detail.js +2 -1
  5. package/dist/reports/src/evidence-types.d.ts +2 -0
  6. package/dist/reports/src/test-catalog.d.ts +101 -5
  7. package/dist/reports/src/test-catalog.js +140 -5
  8. package/dist/schema/src/api.d.ts +225 -0
  9. package/dist/schema/src/api.js +41 -2
  10. package/dist/server/src/app.js +16 -5
  11. package/dist/server/src/openapi.js +41 -3
  12. package/docs/reference/http-api.md +84 -2
  13. package/docs/reference/reports.md +371 -7
  14. package/docs/reference/schema.md +32 -0
  15. package/docs/rich-evidence.md +31 -0
  16. package/docs/server.md +4 -1
  17. package/docs/ui.md +1 -1
  18. package/llms-full.txt +120 -4
  19. package/package.json +1 -1
  20. package/packages/schema/schemas/effective-delta.schema.json +14 -0
  21. package/packages/schema/schemas/effective-evidence.schema.json +14 -0
  22. package/packages/schema/schemas/evidence-page.schema.json +7 -0
  23. package/packages/schema/schemas/layer-rows.schema.json +7 -0
  24. package/packages/schema/schemas/report-run.schema.json +35 -0
  25. package/packages/schema/schemas/report-runs.schema.json +221 -0
  26. package/packages/schema/schemas/test-catalog.schema.json +7 -0
  27. package/packages/schema/schemas/test-history.schema.json +14 -0
  28. package/packages/server/openapi.json +2473 -1035
  29. package/packages/visualizer/src/explorer/ArtifactsView.tsx +162 -0
  30. package/packages/visualizer/src/explorer/Explorer.tsx +28 -3
  31. package/packages/visualizer/src/explorer/RunsView.tsx +43 -19
  32. package/packages/visualizer/src/explorer/catalog.tsx +97 -12
  33. package/packages/visualizer/src/explorer/filters.tsx +279 -0
  34. package/packages/visualizer/src/explorer/search.ts +81 -6
  35. package/packages/visualizer/src/explorer/views.ts +75 -0
@@ -4391,7 +4391,7 @@
4391
4391
  "Report"
4392
4392
  ],
4393
4393
  "summary": "The runs that recorded the report",
4394
- "description": "Every run, newest first: layers grouped by their CI run URL (else branch and commit), with their environments, producers, how many tests they recorded, their results by status, the time they spanned, up to twenty failures and their video counts (references, distinct playable recordings, unavailable). Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
4394
+ "description": "Every run, newest first: layers grouped by their CI run URL (else branch and commit), with their environments, producers, how many tests they recorded, their results by status, the time they spanned, up to twenty failures, their video counts (references, distinct playable recordings, unavailable) and the artifact tags, media types and labels their results carry. Filters narrow the list before `limit`: AND across the parameters, OR within one; `filters` in the answer names those that were applied and `facets` offers each dimension's values with counts. A server that does not know a filter ignores it and does not name it in `filters`. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
4395
4395
  "x-atlas-role": "read",
4396
4396
  "security": [
4397
4397
  {
@@ -4421,6 +4421,114 @@
4421
4421
  "type": "boolean"
4422
4422
  }
4423
4423
  },
4424
+ {
4425
+ "required": false,
4426
+ "name": "artifactTag",
4427
+ "in": "query",
4428
+ "description": "Artifact tags (`demo` and `#demo` are the same), repeatable or comma-separated. A comma or backslash inside a value is written `\\,` or `\\\\`. OR within the parameter, AND with the other filters.",
4429
+ "schema": {
4430
+ "type": "string"
4431
+ }
4432
+ },
4433
+ {
4434
+ "required": false,
4435
+ "name": "inherited",
4436
+ "in": "query",
4437
+ "description": "`1` with `artifactTag` to also match the tags attachments inherit from their check and run. Default: the exact artifact query.",
4438
+ "schema": {
4439
+ "type": "boolean"
4440
+ }
4441
+ },
4442
+ {
4443
+ "required": false,
4444
+ "name": "type",
4445
+ "in": "query",
4446
+ "description": "Media types as roles (`video`, `image`, `audio`, `snapshot`, `text`, `file`, or a producer's own). `video` means a playable recording. With `artifactTag`, one artifact must be both where the report says which videos carry which tags.",
4447
+ "schema": {
4448
+ "type": "string"
4449
+ }
4450
+ },
4451
+ {
4452
+ "required": false,
4453
+ "name": "label",
4454
+ "in": "query",
4455
+ "description": "`key=value`, or `key` for any value.",
4456
+ "schema": {
4457
+ "type": "string"
4458
+ }
4459
+ },
4460
+ {
4461
+ "required": false,
4462
+ "name": "environment",
4463
+ "in": "query",
4464
+ "description": "Environments or devices (`ios`, `desktop-web`).",
4465
+ "schema": {
4466
+ "type": "string"
4467
+ }
4468
+ },
4469
+ {
4470
+ "required": false,
4471
+ "name": "producer",
4472
+ "in": "query",
4473
+ "description": "Producers.",
4474
+ "schema": {
4475
+ "type": "string"
4476
+ }
4477
+ },
4478
+ {
4479
+ "required": false,
4480
+ "name": "branch",
4481
+ "in": "query",
4482
+ "description": "Branches.",
4483
+ "schema": {
4484
+ "type": "string"
4485
+ }
4486
+ },
4487
+ {
4488
+ "required": false,
4489
+ "name": "sha",
4490
+ "in": "query",
4491
+ "description": "Revisions: a full commit id or a prefix of at least seven characters.",
4492
+ "schema": {
4493
+ "type": "string"
4494
+ }
4495
+ },
4496
+ {
4497
+ "required": false,
4498
+ "name": "outcome",
4499
+ "in": "query",
4500
+ "description": "Statuses: `passed`, `failed`, `running`, `not-run`. A run's outcome is `failed` when any result failed, else `running`, else `passed`, else `not-run`.",
4501
+ "schema": {
4502
+ "type": "string"
4503
+ }
4504
+ },
4505
+ {
4506
+ "required": false,
4507
+ "name": "q",
4508
+ "in": "query",
4509
+ "description": "Words that must all appear in the title, id, spec, branch, producer, environment, tags or labels.",
4510
+ "schema": {
4511
+ "type": "string"
4512
+ }
4513
+ },
4514
+ {
4515
+ "required": false,
4516
+ "name": "since",
4517
+ "in": "query",
4518
+ "description": "Only records at or after this time: epoch milliseconds or an ISO date (a date alone is UTC). A result's recording time; a run's end.",
4519
+ "schema": {
4520
+ "type": "string"
4521
+ }
4522
+ },
4523
+ {
4524
+ "required": false,
4525
+ "name": "until",
4526
+ "in": "query",
4527
+ "description": "Only records at or before this time (same forms as `since`).",
4528
+ "schema": {
4529
+ "type": "string"
4530
+ }
4531
+ },
4424
4532
  {
4425
4533
  "required": false,
4426
4534
  "name": "format",
@@ -4491,7 +4599,7 @@
4491
4599
  "Report"
4492
4600
  ],
4493
4601
  "summary": "The runs that recorded the report",
4494
- "description": "Every run, newest first: layers grouped by their CI run URL (else branch and commit), with their environments, producers, how many tests they recorded, their results by status, the time they spanned, up to twenty failures and their video counts (references, distinct playable recordings, unavailable). 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`.",
4602
+ "description": "Every run, newest first: layers grouped by their CI run URL (else branch and commit), with their environments, producers, how many tests they recorded, their results by status, the time they spanned, up to twenty failures, their video counts (references, distinct playable recordings, unavailable) and the artifact tags, media types and labels their results carry. Filters narrow the list before `limit`: AND across the parameters, OR within one; `filters` in the answer names those that were applied and `facets` offers each dimension's values with counts. A server that does not know a filter ignores it and does not name it in `filters`. 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`.",
4495
4603
  "x-atlas-role": "read",
4496
4604
  "security": [
4497
4605
  {
@@ -4533,6 +4641,114 @@
4533
4641
  "type": "boolean"
4534
4642
  }
4535
4643
  },
4644
+ {
4645
+ "required": false,
4646
+ "name": "artifactTag",
4647
+ "in": "query",
4648
+ "description": "Artifact tags (`demo` and `#demo` are the same), repeatable or comma-separated. A comma or backslash inside a value is written `\\,` or `\\\\`. OR within the parameter, AND with the other filters.",
4649
+ "schema": {
4650
+ "type": "string"
4651
+ }
4652
+ },
4653
+ {
4654
+ "required": false,
4655
+ "name": "inherited",
4656
+ "in": "query",
4657
+ "description": "`1` with `artifactTag` to also match the tags attachments inherit from their check and run. Default: the exact artifact query.",
4658
+ "schema": {
4659
+ "type": "boolean"
4660
+ }
4661
+ },
4662
+ {
4663
+ "required": false,
4664
+ "name": "type",
4665
+ "in": "query",
4666
+ "description": "Media types as roles (`video`, `image`, `audio`, `snapshot`, `text`, `file`, or a producer's own). `video` means a playable recording. With `artifactTag`, one artifact must be both where the report says which videos carry which tags.",
4667
+ "schema": {
4668
+ "type": "string"
4669
+ }
4670
+ },
4671
+ {
4672
+ "required": false,
4673
+ "name": "label",
4674
+ "in": "query",
4675
+ "description": "`key=value`, or `key` for any value.",
4676
+ "schema": {
4677
+ "type": "string"
4678
+ }
4679
+ },
4680
+ {
4681
+ "required": false,
4682
+ "name": "environment",
4683
+ "in": "query",
4684
+ "description": "Environments or devices (`ios`, `desktop-web`).",
4685
+ "schema": {
4686
+ "type": "string"
4687
+ }
4688
+ },
4689
+ {
4690
+ "required": false,
4691
+ "name": "producer",
4692
+ "in": "query",
4693
+ "description": "Producers.",
4694
+ "schema": {
4695
+ "type": "string"
4696
+ }
4697
+ },
4698
+ {
4699
+ "required": false,
4700
+ "name": "branch",
4701
+ "in": "query",
4702
+ "description": "Branches.",
4703
+ "schema": {
4704
+ "type": "string"
4705
+ }
4706
+ },
4707
+ {
4708
+ "required": false,
4709
+ "name": "sha",
4710
+ "in": "query",
4711
+ "description": "Revisions: a full commit id or a prefix of at least seven characters.",
4712
+ "schema": {
4713
+ "type": "string"
4714
+ }
4715
+ },
4716
+ {
4717
+ "required": false,
4718
+ "name": "outcome",
4719
+ "in": "query",
4720
+ "description": "Statuses: `passed`, `failed`, `running`, `not-run`. A run's outcome is `failed` when any result failed, else `running`, else `passed`, else `not-run`.",
4721
+ "schema": {
4722
+ "type": "string"
4723
+ }
4724
+ },
4725
+ {
4726
+ "required": false,
4727
+ "name": "q",
4728
+ "in": "query",
4729
+ "description": "Words that must all appear in the title, id, spec, branch, producer, environment, tags or labels.",
4730
+ "schema": {
4731
+ "type": "string"
4732
+ }
4733
+ },
4734
+ {
4735
+ "required": false,
4736
+ "name": "since",
4737
+ "in": "query",
4738
+ "description": "Only records at or after this time: epoch milliseconds or an ISO date (a date alone is UTC). A result's recording time; a run's end.",
4739
+ "schema": {
4740
+ "type": "string"
4741
+ }
4742
+ },
4743
+ {
4744
+ "required": false,
4745
+ "name": "until",
4746
+ "in": "query",
4747
+ "description": "Only records at or before this time (same forms as `since`).",
4748
+ "schema": {
4749
+ "type": "string"
4750
+ }
4751
+ },
4536
4752
  {
4537
4753
  "required": false,
4538
4754
  "name": "format",
@@ -4584,14 +4800,14 @@
4584
4800
  }
4585
4801
  }
4586
4802
  },
4587
- "/api/reports/runs/detail": {
4803
+ "/api/reports/artifacts": {
4588
4804
  "get": {
4589
- "operationId": "getReportRun",
4805
+ "operationId": "getReportArtifacts",
4590
4806
  "tags": [
4591
4807
  "Report"
4592
4808
  ],
4593
- "summary": "Every test one run recorded",
4594
- "description": "One run and its last result for every test, environment and producer it recorded, failures first. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
4809
+ "summary": "Recorded results that carry evidence, across the whole history",
4810
+ "description": "Every recorded result that has attachments (recordings, screenshots, traces), newest first, found in the history and not only among the current winners: a recording tagged `demo` is found with its original run, revision and status even when a later attempt is untagged. Narrow it by artifact tag, media type, label, feature (`domain`, `spec`), environment or device, producer, branch, revision, outcome and time: AND across the parameters, OR within one; with both `artifactTag` and `type`, one artifact must be both. `filters` names the filters that were applied and `facets` offers each dimension's values with counts: the count beside a value is what the list would hold if that value alone were chosen in its dimension, every other filter applied. Tags written by reviewers after upload are not searched; only those in the layer are. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
4595
4811
  "x-atlas-role": "read",
4596
4812
  "security": [
4597
4813
  {
@@ -4603,132 +4819,156 @@
4603
4819
  ],
4604
4820
  "parameters": [
4605
4821
  {
4606
- "required": true,
4607
- "name": "key",
4822
+ "required": false,
4823
+ "name": "limit",
4608
4824
  "in": "query",
4609
- "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
4825
+ "description": "At most this many results (default 100).",
4610
4826
  "schema": {
4611
- "type": "string"
4827
+ "type": "integer",
4828
+ "minimum": 0
4612
4829
  }
4613
4830
  },
4614
4831
  {
4615
4832
  "required": false,
4616
- "name": "format",
4833
+ "name": "offset",
4617
4834
  "in": "query",
4618
- "description": "`markdown` for Markdown instead of JSON.",
4835
+ "description": "Skip this many matches (default 0).",
4619
4836
  "schema": {
4620
- "type": "string",
4621
- "enum": [
4622
- "json",
4623
- "markdown"
4624
- ]
4837
+ "type": "integer",
4838
+ "minimum": 0
4625
4839
  }
4626
4840
  },
4627
4841
  {
4628
4842
  "required": false,
4629
- "name": "project",
4843
+ "name": "video",
4630
4844
  "in": "query",
4631
- "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4632
- "example": "todo-app",
4845
+ "description": "`true` for results with a playable video recording (the same as `type=video`).",
4633
4846
  "schema": {
4634
- "type": "string",
4635
- "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4636
- "maxLength": 64
4637
- }
4638
- }
4639
- ],
4640
- "responses": {
4641
- "200": {
4642
- "description": "The run and its results.",
4643
- "content": {
4644
- "application/json": {
4645
- "schema": {
4646
- "$ref": "#/components/schemas/RunDetail"
4647
- }
4648
- }
4847
+ "type": "boolean"
4649
4848
  }
4650
4849
  },
4651
- "304": {
4652
- "description": "Unchanged since the `If-None-Match` ETag."
4653
- },
4654
- "400": {
4655
- "description": "No `key`.",
4656
- "content": {
4657
- "application/problem+json": {
4658
- "schema": {
4659
- "$ref": "#/components/schemas/Problem"
4660
- }
4661
- }
4850
+ {
4851
+ "required": false,
4852
+ "name": "domain",
4853
+ "in": "query",
4854
+ "description": "The feature domain of the result's spec.",
4855
+ "schema": {
4856
+ "type": "string"
4662
4857
  }
4663
4858
  },
4664
- "401": {
4665
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
4666
- "content": {
4667
- "application/problem+json": {
4668
- "schema": {
4669
- "$ref": "#/components/schemas/Problem"
4670
- }
4671
- }
4859
+ {
4860
+ "required": false,
4861
+ "name": "spec",
4862
+ "in": "query",
4863
+ "description": "Spec paths.",
4864
+ "schema": {
4865
+ "type": "string"
4672
4866
  }
4673
4867
  },
4674
- "404": {
4675
- "description": "No run has that key.",
4676
- "content": {
4677
- "application/problem+json": {
4678
- "schema": {
4679
- "$ref": "#/components/schemas/Problem"
4680
- }
4681
- }
4868
+ {
4869
+ "required": false,
4870
+ "name": "artifactTag",
4871
+ "in": "query",
4872
+ "description": "Artifact tags (`demo` and `#demo` are the same), repeatable or comma-separated. A comma or backslash inside a value is written `\\,` or `\\\\`. OR within the parameter, AND with the other filters.",
4873
+ "schema": {
4874
+ "type": "string"
4682
4875
  }
4683
4876
  },
4684
- "503": {
4685
- "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
4686
- "content": {
4687
- "application/problem+json": {
4688
- "schema": {
4689
- "$ref": "#/components/schemas/Problem"
4690
- }
4691
- }
4877
+ {
4878
+ "required": false,
4879
+ "name": "inherited",
4880
+ "in": "query",
4881
+ "description": "`1` with `artifactTag` to also match the tags attachments inherit from their check and run. Default: the exact artifact query.",
4882
+ "schema": {
4883
+ "type": "boolean"
4692
4884
  }
4693
- }
4694
- }
4695
- }
4696
- },
4697
- "/api/projects/{project}/reports/runs/detail": {
4698
- "get": {
4699
- "operationId": "getReportRunForProject",
4700
- "tags": [
4701
- "Report"
4702
- ],
4703
- "summary": "Every test one run recorded",
4704
- "description": "One run and its last result for every test, environment and producer it recorded, failures first. 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`.",
4705
- "x-atlas-role": "read",
4706
- "security": [
4885
+ },
4707
4886
  {
4708
- "bearer": []
4887
+ "required": false,
4888
+ "name": "type",
4889
+ "in": "query",
4890
+ "description": "Media types as roles (`video`, `image`, `audio`, `snapshot`, `text`, `file`, or a producer's own). `video` means a playable recording. With `artifactTag`, one artifact must be both where the report says which videos carry which tags.",
4891
+ "schema": {
4892
+ "type": "string"
4893
+ }
4709
4894
  },
4710
4895
  {
4711
- "basic": []
4712
- }
4713
- ],
4714
- "parameters": [
4896
+ "required": false,
4897
+ "name": "label",
4898
+ "in": "query",
4899
+ "description": "`key=value`, or `key` for any value.",
4900
+ "schema": {
4901
+ "type": "string"
4902
+ }
4903
+ },
4715
4904
  {
4716
- "required": true,
4717
- "name": "project",
4718
- "in": "path",
4719
- "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4720
- "example": "todo-app",
4905
+ "required": false,
4906
+ "name": "environment",
4907
+ "in": "query",
4908
+ "description": "Environments or devices (`ios`, `desktop-web`).",
4721
4909
  "schema": {
4722
- "type": "string",
4723
- "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4724
- "maxLength": 64
4910
+ "type": "string"
4725
4911
  }
4726
4912
  },
4727
4913
  {
4728
- "required": true,
4729
- "name": "key",
4914
+ "required": false,
4915
+ "name": "producer",
4730
4916
  "in": "query",
4731
- "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
4917
+ "description": "Producers.",
4918
+ "schema": {
4919
+ "type": "string"
4920
+ }
4921
+ },
4922
+ {
4923
+ "required": false,
4924
+ "name": "branch",
4925
+ "in": "query",
4926
+ "description": "Branches.",
4927
+ "schema": {
4928
+ "type": "string"
4929
+ }
4930
+ },
4931
+ {
4932
+ "required": false,
4933
+ "name": "sha",
4934
+ "in": "query",
4935
+ "description": "Revisions: a full commit id or a prefix of at least seven characters.",
4936
+ "schema": {
4937
+ "type": "string"
4938
+ }
4939
+ },
4940
+ {
4941
+ "required": false,
4942
+ "name": "outcome",
4943
+ "in": "query",
4944
+ "description": "Statuses: `passed`, `failed`, `running`, `not-run`. A run's outcome is `failed` when any result failed, else `running`, else `passed`, else `not-run`.",
4945
+ "schema": {
4946
+ "type": "string"
4947
+ }
4948
+ },
4949
+ {
4950
+ "required": false,
4951
+ "name": "q",
4952
+ "in": "query",
4953
+ "description": "Words that must all appear in the title, id, spec, branch, producer, environment, tags or labels.",
4954
+ "schema": {
4955
+ "type": "string"
4956
+ }
4957
+ },
4958
+ {
4959
+ "required": false,
4960
+ "name": "since",
4961
+ "in": "query",
4962
+ "description": "Only records at or after this time: epoch milliseconds or an ISO date (a date alone is UTC). A result's recording time; a run's end.",
4963
+ "schema": {
4964
+ "type": "string"
4965
+ }
4966
+ },
4967
+ {
4968
+ "required": false,
4969
+ "name": "until",
4970
+ "in": "query",
4971
+ "description": "Only records at or before this time (same forms as `since`).",
4732
4972
  "schema": {
4733
4973
  "type": "string"
4734
4974
  }
@@ -4745,15 +4985,27 @@
4745
4985
  "markdown"
4746
4986
  ]
4747
4987
  }
4988
+ },
4989
+ {
4990
+ "required": false,
4991
+ "name": "project",
4992
+ "in": "query",
4993
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4994
+ "example": "todo-app",
4995
+ "schema": {
4996
+ "type": "string",
4997
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4998
+ "maxLength": 64
4999
+ }
4748
5000
  }
4749
5001
  ],
4750
5002
  "responses": {
4751
5003
  "200": {
4752
- "description": "The run and its results.",
5004
+ "description": "The matching results and the facets.",
4753
5005
  "content": {
4754
5006
  "application/json": {
4755
5007
  "schema": {
4756
- "$ref": "#/components/schemas/RunDetail"
5008
+ "$ref": "#/components/schemas/ArtifactList"
4757
5009
  }
4758
5010
  }
4759
5011
  }
@@ -4761,16 +5013,6 @@
4761
5013
  "304": {
4762
5014
  "description": "Unchanged since the `If-None-Match` ETag."
4763
5015
  },
4764
- "400": {
4765
- "description": "No `key`.",
4766
- "content": {
4767
- "application/problem+json": {
4768
- "schema": {
4769
- "$ref": "#/components/schemas/Problem"
4770
- }
4771
- }
4772
- }
4773
- },
4774
5016
  "401": {
4775
5017
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
4776
5018
  "content": {
@@ -4781,16 +5023,6 @@
4781
5023
  }
4782
5024
  }
4783
5025
  },
4784
- "404": {
4785
- "description": "No run has that key.",
4786
- "content": {
4787
- "application/problem+json": {
4788
- "schema": {
4789
- "$ref": "#/components/schemas/Problem"
4790
- }
4791
- }
4792
- }
4793
- },
4794
5026
  "503": {
4795
5027
  "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
4796
5028
  "content": {
@@ -4804,14 +5036,14 @@
4804
5036
  }
4805
5037
  }
4806
5038
  },
4807
- "/api/reports/outline": {
5039
+ "/api/projects/{project}/reports/artifacts": {
4808
5040
  "get": {
4809
- "operationId": "getOutline",
5041
+ "operationId": "getReportArtifactsForProject",
4810
5042
  "tags": [
4811
5043
  "Report"
4812
5044
  ],
4813
- "summary": "The specs a report is laid over",
4814
- "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`.",
5045
+ "summary": "Recorded results that carry evidence, across the whole history",
5046
+ "description": "Every recorded result that has attachments (recordings, screenshots, traces), newest first, found in the history and not only among the current winners: a recording tagged `demo` is found with its original run, revision and status even when a later attempt is untagged. Narrow it by artifact tag, media type, label, feature (`domain`, `spec`), environment or device, producer, branch, revision, outcome and time: AND across the parameters, OR within one; with both `artifactTag` and `type`, one artifact must be both. `filters` names the filters that were applied and `facets` offers each dimension's values with counts: the count beside a value is what the list would hold if that value alone were chosen in its dimension, every other filter applied. Tags written by reviewers after upload are not searched; only those in the layer are. 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`.",
4815
5047
  "x-atlas-role": "read",
4816
5048
  "security": [
4817
5049
  {
@@ -4823,9 +5055,9 @@
4823
5055
  ],
4824
5056
  "parameters": [
4825
5057
  {
4826
- "required": false,
5058
+ "required": true,
4827
5059
  "name": "project",
4828
- "in": "query",
5060
+ "in": "path",
4829
5061
  "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4830
5062
  "example": "todo-app",
4831
5063
  "schema": {
@@ -4833,212 +5065,190 @@
4833
5065
  "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4834
5066
  "maxLength": 64
4835
5067
  }
4836
- }
4837
- ],
4838
- "responses": {
4839
- "200": {
4840
- "description": "The outline.",
4841
- "content": {
4842
- "application/json": {
4843
- "schema": {
4844
- "$ref": "#/components/schemas/Outline"
4845
- }
4846
- }
4847
- }
4848
5068
  },
4849
- "401": {
4850
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
4851
- "content": {
4852
- "application/problem+json": {
4853
- "schema": {
4854
- "$ref": "#/components/schemas/Problem"
4855
- }
4856
- }
5069
+ {
5070
+ "required": false,
5071
+ "name": "limit",
5072
+ "in": "query",
5073
+ "description": "At most this many results (default 100).",
5074
+ "schema": {
5075
+ "type": "integer",
5076
+ "minimum": 0
4857
5077
  }
4858
- }
4859
- }
4860
- }
4861
- },
4862
- "/api/projects/{project}/reports/outline": {
4863
- "get": {
4864
- "operationId": "getOutlineForProject",
4865
- "tags": [
4866
- "Report"
4867
- ],
4868
- "summary": "The specs a report is laid over",
4869
- "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\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`.",
4870
- "x-atlas-role": "read",
4871
- "security": [
5078
+ },
4872
5079
  {
4873
- "bearer": []
5080
+ "required": false,
5081
+ "name": "offset",
5082
+ "in": "query",
5083
+ "description": "Skip this many matches (default 0).",
5084
+ "schema": {
5085
+ "type": "integer",
5086
+ "minimum": 0
5087
+ }
4874
5088
  },
4875
5089
  {
4876
- "basic": []
4877
- }
4878
- ],
4879
- "parameters": [
5090
+ "required": false,
5091
+ "name": "video",
5092
+ "in": "query",
5093
+ "description": "`true` for results with a playable video recording (the same as `type=video`).",
5094
+ "schema": {
5095
+ "type": "boolean"
5096
+ }
5097
+ },
4880
5098
  {
4881
- "required": true,
4882
- "name": "project",
4883
- "in": "path",
4884
- "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4885
- "example": "todo-app",
5099
+ "required": false,
5100
+ "name": "domain",
5101
+ "in": "query",
5102
+ "description": "The feature domain of the result's spec.",
4886
5103
  "schema": {
4887
- "type": "string",
4888
- "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4889
- "maxLength": 64
5104
+ "type": "string"
4890
5105
  }
4891
- }
4892
- ],
4893
- "responses": {
4894
- "200": {
4895
- "description": "The outline.",
4896
- "content": {
4897
- "application/json": {
4898
- "schema": {
4899
- "$ref": "#/components/schemas/Outline"
4900
- }
4901
- }
5106
+ },
5107
+ {
5108
+ "required": false,
5109
+ "name": "spec",
5110
+ "in": "query",
5111
+ "description": "Spec paths.",
5112
+ "schema": {
5113
+ "type": "string"
4902
5114
  }
4903
5115
  },
4904
- "401": {
4905
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
4906
- "content": {
4907
- "application/problem+json": {
4908
- "schema": {
4909
- "$ref": "#/components/schemas/Problem"
4910
- }
4911
- }
5116
+ {
5117
+ "required": false,
5118
+ "name": "artifactTag",
5119
+ "in": "query",
5120
+ "description": "Artifact tags (`demo` and `#demo` are the same), repeatable or comma-separated. A comma or backslash inside a value is written `\\,` or `\\\\`. OR within the parameter, AND with the other filters.",
5121
+ "schema": {
5122
+ "type": "string"
4912
5123
  }
4913
- }
4914
- }
4915
- }
4916
- },
4917
- "/api/reports/outline/spec": {
4918
- "get": {
4919
- "operationId": "getOutlineSpec",
4920
- "tags": [
4921
- "Report"
4922
- ],
4923
- "summary": "The text of one spec",
4924
- "description": "The text of a spec file of the outline, by its path.\n\nRole needed: `read`.",
4925
- "x-atlas-role": "read",
4926
- "security": [
5124
+ },
4927
5125
  {
4928
- "bearer": []
5126
+ "required": false,
5127
+ "name": "inherited",
5128
+ "in": "query",
5129
+ "description": "`1` with `artifactTag` to also match the tags attachments inherit from their check and run. Default: the exact artifact query.",
5130
+ "schema": {
5131
+ "type": "boolean"
5132
+ }
4929
5133
  },
4930
5134
  {
4931
- "basic": []
4932
- }
4933
- ],
4934
- "parameters": [
5135
+ "required": false,
5136
+ "name": "type",
5137
+ "in": "query",
5138
+ "description": "Media types as roles (`video`, `image`, `audio`, `snapshot`, `text`, `file`, or a producer's own). `video` means a playable recording. With `artifactTag`, one artifact must be both where the report says which videos carry which tags.",
5139
+ "schema": {
5140
+ "type": "string"
5141
+ }
5142
+ },
4935
5143
  {
4936
- "required": true,
4937
- "name": "path",
5144
+ "required": false,
5145
+ "name": "label",
4938
5146
  "in": "query",
4939
- "description": "The spec's path, `specs/<path>`.",
5147
+ "description": "`key=value`, or `key` for any value.",
4940
5148
  "schema": {
4941
5149
  "type": "string"
4942
5150
  }
4943
5151
  },
4944
5152
  {
4945
5153
  "required": false,
4946
- "name": "project",
5154
+ "name": "environment",
4947
5155
  "in": "query",
4948
- "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
4949
- "example": "todo-app",
5156
+ "description": "Environments or devices (`ios`, `desktop-web`).",
4950
5157
  "schema": {
4951
- "type": "string",
4952
- "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
4953
- "maxLength": 64
5158
+ "type": "string"
4954
5159
  }
4955
- }
4956
- ],
4957
- "responses": {
4958
- "200": {
4959
- "description": "The spec text.",
4960
- "content": {
4961
- "text/plain": {
4962
- "schema": {
4963
- "type": "string"
4964
- }
4965
- }
5160
+ },
5161
+ {
5162
+ "required": false,
5163
+ "name": "producer",
5164
+ "in": "query",
5165
+ "description": "Producers.",
5166
+ "schema": {
5167
+ "type": "string"
4966
5168
  }
4967
5169
  },
4968
- "401": {
4969
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
4970
- "content": {
4971
- "application/problem+json": {
4972
- "schema": {
4973
- "$ref": "#/components/schemas/Problem"
4974
- }
4975
- }
5170
+ {
5171
+ "required": false,
5172
+ "name": "branch",
5173
+ "in": "query",
5174
+ "description": "Branches.",
5175
+ "schema": {
5176
+ "type": "string"
4976
5177
  }
4977
5178
  },
4978
- "404": {
4979
- "description": "No such spec in the outline.",
4980
- "content": {
4981
- "application/problem+json": {
4982
- "schema": {
4983
- "$ref": "#/components/schemas/Problem"
4984
- }
4985
- }
5179
+ {
5180
+ "required": false,
5181
+ "name": "sha",
5182
+ "in": "query",
5183
+ "description": "Revisions: a full commit id or a prefix of at least seven characters.",
5184
+ "schema": {
5185
+ "type": "string"
4986
5186
  }
4987
- }
4988
- }
4989
- }
4990
- },
4991
- "/api/projects/{project}/reports/outline/spec": {
4992
- "get": {
4993
- "operationId": "getOutlineSpecForProject",
4994
- "tags": [
4995
- "Report"
4996
- ],
4997
- "summary": "The text of one spec",
4998
- "description": "The text of a spec file of the outline, by its path.\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`.",
4999
- "x-atlas-role": "read",
5000
- "security": [
5187
+ },
5001
5188
  {
5002
- "bearer": []
5189
+ "required": false,
5190
+ "name": "outcome",
5191
+ "in": "query",
5192
+ "description": "Statuses: `passed`, `failed`, `running`, `not-run`. A run's outcome is `failed` when any result failed, else `running`, else `passed`, else `not-run`.",
5193
+ "schema": {
5194
+ "type": "string"
5195
+ }
5003
5196
  },
5004
5197
  {
5005
- "basic": []
5006
- }
5007
- ],
5008
- "parameters": [
5198
+ "required": false,
5199
+ "name": "q",
5200
+ "in": "query",
5201
+ "description": "Words that must all appear in the title, id, spec, branch, producer, environment, tags or labels.",
5202
+ "schema": {
5203
+ "type": "string"
5204
+ }
5205
+ },
5009
5206
  {
5010
- "required": true,
5011
- "name": "project",
5012
- "in": "path",
5013
- "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
5014
- "example": "todo-app",
5207
+ "required": false,
5208
+ "name": "since",
5209
+ "in": "query",
5210
+ "description": "Only records at or after this time: epoch milliseconds or an ISO date (a date alone is UTC). A result's recording time; a run's end.",
5015
5211
  "schema": {
5016
- "type": "string",
5017
- "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
5018
- "maxLength": 64
5212
+ "type": "string"
5019
5213
  }
5020
5214
  },
5021
5215
  {
5022
- "required": true,
5023
- "name": "path",
5216
+ "required": false,
5217
+ "name": "until",
5024
5218
  "in": "query",
5025
- "description": "The spec's path, `specs/<path>`.",
5219
+ "description": "Only records at or before this time (same forms as `since`).",
5026
5220
  "schema": {
5027
5221
  "type": "string"
5028
5222
  }
5223
+ },
5224
+ {
5225
+ "required": false,
5226
+ "name": "format",
5227
+ "in": "query",
5228
+ "description": "`markdown` for Markdown instead of JSON.",
5229
+ "schema": {
5230
+ "type": "string",
5231
+ "enum": [
5232
+ "json",
5233
+ "markdown"
5234
+ ]
5235
+ }
5029
5236
  }
5030
5237
  ],
5031
5238
  "responses": {
5032
5239
  "200": {
5033
- "description": "The spec text.",
5240
+ "description": "The matching results and the facets.",
5034
5241
  "content": {
5035
- "text/plain": {
5242
+ "application/json": {
5036
5243
  "schema": {
5037
- "type": "string"
5244
+ "$ref": "#/components/schemas/ArtifactList"
5038
5245
  }
5039
5246
  }
5040
5247
  }
5041
5248
  },
5249
+ "304": {
5250
+ "description": "Unchanged since the `If-None-Match` ETag."
5251
+ },
5042
5252
  "401": {
5043
5253
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
5044
5254
  "content": {
@@ -5049,8 +5259,8 @@
5049
5259
  }
5050
5260
  }
5051
5261
  },
5052
- "404": {
5053
- "description": "No such spec in the outline.",
5262
+ "503": {
5263
+ "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
5054
5264
  "content": {
5055
5265
  "application/problem+json": {
5056
5266
  "schema": {
@@ -5062,14 +5272,14 @@
5062
5272
  }
5063
5273
  }
5064
5274
  },
5065
- "/api/reports/evidence": {
5275
+ "/api/reports/runs/detail": {
5066
5276
  "get": {
5067
- "operationId": "listLayers",
5277
+ "operationId": "getReportRun",
5068
5278
  "tags": [
5069
5279
  "Report"
5070
5280
  ],
5071
- "summary": "Page through every layer header",
5072
- "description": "The history: layer headers newest first, merged from every backend. Prefer `/api/reports/evidence/effective`, which is one request and holds only what wins. Use this to audit what was recorded.\n\nRole needed: `read`.",
5281
+ "summary": "Every test one run recorded",
5282
+ "description": "One run and its last result for every test, environment and producer it recorded, failures first. Send `format=markdown` for Markdown.\n\nRole needed: `read`.",
5073
5283
  "x-atlas-role": "read",
5074
5284
  "security": [
5075
5285
  {
@@ -5081,14 +5291,27 @@
5081
5291
  ],
5082
5292
  "parameters": [
5083
5293
  {
5084
- "required": false,
5085
- "name": "cursor",
5294
+ "required": true,
5295
+ "name": "key",
5086
5296
  "in": "query",
5087
- "description": "The `cursor` of the previous page.",
5297
+ "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
5088
5298
  "schema": {
5089
5299
  "type": "string"
5090
5300
  }
5091
5301
  },
5302
+ {
5303
+ "required": false,
5304
+ "name": "format",
5305
+ "in": "query",
5306
+ "description": "`markdown` for Markdown instead of JSON.",
5307
+ "schema": {
5308
+ "type": "string",
5309
+ "enum": [
5310
+ "json",
5311
+ "markdown"
5312
+ ]
5313
+ }
5314
+ },
5092
5315
  {
5093
5316
  "required": false,
5094
5317
  "name": "project",
@@ -5104,11 +5327,24 @@
5104
5327
  ],
5105
5328
  "responses": {
5106
5329
  "200": {
5107
- "description": "A page of headers.",
5330
+ "description": "The run and its results.",
5108
5331
  "content": {
5109
5332
  "application/json": {
5110
5333
  "schema": {
5111
- "$ref": "#/components/schemas/EvidencePage"
5334
+ "$ref": "#/components/schemas/RunDetail"
5335
+ }
5336
+ }
5337
+ }
5338
+ },
5339
+ "304": {
5340
+ "description": "Unchanged since the `If-None-Match` ETag."
5341
+ },
5342
+ "400": {
5343
+ "description": "No `key`.",
5344
+ "content": {
5345
+ "application/problem+json": {
5346
+ "schema": {
5347
+ "$ref": "#/components/schemas/Problem"
5112
5348
  }
5113
5349
  }
5114
5350
  }
@@ -5123,6 +5359,16 @@
5123
5359
  }
5124
5360
  }
5125
5361
  },
5362
+ "404": {
5363
+ "description": "No run has that key.",
5364
+ "content": {
5365
+ "application/problem+json": {
5366
+ "schema": {
5367
+ "$ref": "#/components/schemas/Problem"
5368
+ }
5369
+ }
5370
+ }
5371
+ },
5126
5372
  "503": {
5127
5373
  "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
5128
5374
  "content": {
@@ -5136,14 +5382,14 @@
5136
5382
  }
5137
5383
  }
5138
5384
  },
5139
- "/api/projects/{project}/reports/evidence": {
5385
+ "/api/projects/{project}/reports/runs/detail": {
5140
5386
  "get": {
5141
- "operationId": "listLayersForProject",
5387
+ "operationId": "getReportRunForProject",
5142
5388
  "tags": [
5143
5389
  "Report"
5144
5390
  ],
5145
- "summary": "Page through every layer header",
5146
- "description": "The history: layer headers newest first, merged from every backend. Prefer `/api/reports/evidence/effective`, which is one request and holds only what wins. Use this to audit what was recorded.\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`.",
5391
+ "summary": "Every test one run recorded",
5392
+ "description": "One run and its last result for every test, environment and producer it recorded, failures first. 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`.",
5147
5393
  "x-atlas-role": "read",
5148
5394
  "security": [
5149
5395
  {
@@ -5167,22 +5413,48 @@
5167
5413
  }
5168
5414
  },
5169
5415
  {
5170
- "required": false,
5171
- "name": "cursor",
5416
+ "required": true,
5417
+ "name": "key",
5172
5418
  "in": "query",
5173
- "description": "The `cursor` of the previous page.",
5419
+ "description": "The run's `key` from `/api/reports/runs`, URL-encoded.",
5174
5420
  "schema": {
5175
5421
  "type": "string"
5176
5422
  }
5423
+ },
5424
+ {
5425
+ "required": false,
5426
+ "name": "format",
5427
+ "in": "query",
5428
+ "description": "`markdown` for Markdown instead of JSON.",
5429
+ "schema": {
5430
+ "type": "string",
5431
+ "enum": [
5432
+ "json",
5433
+ "markdown"
5434
+ ]
5435
+ }
5177
5436
  }
5178
5437
  ],
5179
5438
  "responses": {
5180
5439
  "200": {
5181
- "description": "A page of headers.",
5440
+ "description": "The run and its results.",
5182
5441
  "content": {
5183
5442
  "application/json": {
5184
5443
  "schema": {
5185
- "$ref": "#/components/schemas/EvidencePage"
5444
+ "$ref": "#/components/schemas/RunDetail"
5445
+ }
5446
+ }
5447
+ }
5448
+ },
5449
+ "304": {
5450
+ "description": "Unchanged since the `If-None-Match` ETag."
5451
+ },
5452
+ "400": {
5453
+ "description": "No `key`.",
5454
+ "content": {
5455
+ "application/problem+json": {
5456
+ "schema": {
5457
+ "$ref": "#/components/schemas/Problem"
5186
5458
  }
5187
5459
  }
5188
5460
  }
@@ -5197,6 +5469,16 @@
5197
5469
  }
5198
5470
  }
5199
5471
  },
5472
+ "404": {
5473
+ "description": "No run has that key.",
5474
+ "content": {
5475
+ "application/problem+json": {
5476
+ "schema": {
5477
+ "$ref": "#/components/schemas/Problem"
5478
+ }
5479
+ }
5480
+ }
5481
+ },
5200
5482
  "503": {
5201
5483
  "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
5202
5484
  "content": {
@@ -5210,14 +5492,14 @@
5210
5492
  }
5211
5493
  }
5212
5494
  },
5213
- "/api/reports/evidence/rows/{backend}/{id}": {
5495
+ "/api/reports/outline": {
5214
5496
  "get": {
5215
- "operationId": "getLayerRows",
5497
+ "operationId": "getOutline",
5216
5498
  "tags": [
5217
5499
  "Report"
5218
5500
  ],
5219
- "summary": "The checks of one layer",
5220
- "description": "Every check of one layer (not only those that win), with the spec fingerprints it recorded.\n\nRole needed: `read`.",
5501
+ "summary": "The specs a report is laid over",
5502
+ "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`.",
5221
5503
  "x-atlas-role": "read",
5222
5504
  "security": [
5223
5505
  {
@@ -5228,25 +5510,6 @@
5228
5510
  }
5229
5511
  ],
5230
5512
  "parameters": [
5231
- {
5232
- "required": true,
5233
- "name": "backend",
5234
- "in": "path",
5235
- "description": "A backend id from `/api/server`.",
5236
- "schema": {
5237
- "type": "string"
5238
- }
5239
- },
5240
- {
5241
- "required": true,
5242
- "name": "id",
5243
- "in": "path",
5244
- "description": "A layer id: 64 lowercase hex digits.",
5245
- "schema": {
5246
- "type": "string",
5247
- "pattern": "^[0-9a-f]{64}$"
5248
- }
5249
- },
5250
5513
  {
5251
5514
  "required": false,
5252
5515
  "name": "project",
@@ -5262,11 +5525,11 @@
5262
5525
  ],
5263
5526
  "responses": {
5264
5527
  "200": {
5265
- "description": "The rows.",
5528
+ "description": "The outline.",
5266
5529
  "content": {
5267
5530
  "application/json": {
5268
5531
  "schema": {
5269
- "$ref": "#/components/schemas/LayerRows"
5532
+ "$ref": "#/components/schemas/Outline"
5270
5533
  }
5271
5534
  }
5272
5535
  }
@@ -5280,28 +5543,18 @@
5280
5543
  }
5281
5544
  }
5282
5545
  }
5283
- },
5284
- "404": {
5285
- "description": "No such layer in that backend.",
5286
- "content": {
5287
- "application/problem+json": {
5288
- "schema": {
5289
- "$ref": "#/components/schemas/Problem"
5290
- }
5291
- }
5292
- }
5293
5546
  }
5294
5547
  }
5295
5548
  }
5296
5549
  },
5297
- "/api/projects/{project}/reports/evidence/rows/{backend}/{id}": {
5550
+ "/api/projects/{project}/reports/outline": {
5298
5551
  "get": {
5299
- "operationId": "getLayerRowsForProject",
5552
+ "operationId": "getOutlineForProject",
5300
5553
  "tags": [
5301
5554
  "Report"
5302
5555
  ],
5303
- "summary": "The checks of one layer",
5304
- "description": "Every check of one layer (not only those that win), with the spec fingerprints it recorded.\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`.",
5556
+ "summary": "The specs a report is laid over",
5557
+ "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\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`.",
5305
5558
  "x-atlas-role": "read",
5306
5559
  "security": [
5307
5560
  {
@@ -5323,34 +5576,15 @@
5323
5576
  "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
5324
5577
  "maxLength": 64
5325
5578
  }
5326
- },
5327
- {
5328
- "required": true,
5329
- "name": "backend",
5330
- "in": "path",
5331
- "description": "A backend id from `/api/server`.",
5332
- "schema": {
5333
- "type": "string"
5334
- }
5335
- },
5336
- {
5337
- "required": true,
5338
- "name": "id",
5339
- "in": "path",
5340
- "description": "A layer id: 64 lowercase hex digits.",
5341
- "schema": {
5342
- "type": "string",
5343
- "pattern": "^[0-9a-f]{64}$"
5344
- }
5345
5579
  }
5346
5580
  ],
5347
5581
  "responses": {
5348
5582
  "200": {
5349
- "description": "The rows.",
5583
+ "description": "The outline.",
5350
5584
  "content": {
5351
5585
  "application/json": {
5352
5586
  "schema": {
5353
- "$ref": "#/components/schemas/LayerRows"
5587
+ "$ref": "#/components/schemas/Outline"
5354
5588
  }
5355
5589
  }
5356
5590
  }
@@ -5364,28 +5598,18 @@
5364
5598
  }
5365
5599
  }
5366
5600
  }
5367
- },
5368
- "404": {
5369
- "description": "No such layer in that backend.",
5370
- "content": {
5371
- "application/problem+json": {
5372
- "schema": {
5373
- "$ref": "#/components/schemas/Problem"
5374
- }
5375
- }
5376
- }
5377
5601
  }
5378
5602
  }
5379
5603
  }
5380
5604
  },
5381
- "/api/reports/evidence/detail/{backend}/{id}": {
5605
+ "/api/reports/outline/spec": {
5382
5606
  "get": {
5383
- "operationId": "getCheckDetail",
5607
+ "operationId": "getOutlineSpec",
5384
5608
  "tags": [
5385
5609
  "Report"
5386
5610
  ],
5387
- "summary": "Everything one result carries",
5388
- "description": "The timeline, annotations, retries, attachments and extensions of one check, and what its run carries as a whole. Without `check`, only the run's. Attachment bytes are fetched from `/api/reports/layers/{id}/blobs/{bundleKey}`.\n\nRole needed: `read`.",
5611
+ "summary": "The text of one spec",
5612
+ "description": "The text of a spec file of the outline, by its path.\n\nRole needed: `read`.",
5389
5613
  "x-atlas-role": "read",
5390
5614
  "security": [
5391
5615
  {
@@ -5398,37 +5622,9 @@
5398
5622
  "parameters": [
5399
5623
  {
5400
5624
  "required": true,
5401
- "name": "backend",
5402
- "in": "path",
5403
- "description": "A backend id from `/api/server`.",
5404
- "schema": {
5405
- "type": "string"
5406
- }
5407
- },
5408
- {
5409
- "required": true,
5410
- "name": "id",
5411
- "in": "path",
5412
- "description": "A layer id: 64 lowercase hex digits.",
5413
- "schema": {
5414
- "type": "string",
5415
- "pattern": "^[0-9a-f]{64}$"
5416
- }
5417
- },
5418
- {
5419
- "required": false,
5420
- "name": "check",
5421
- "in": "query",
5422
- "description": "The check id.",
5423
- "schema": {
5424
- "type": "string"
5425
- }
5426
- },
5427
- {
5428
- "required": false,
5429
- "name": "kind",
5625
+ "name": "path",
5430
5626
  "in": "query",
5431
- "description": "The kind of the part, when the same id is in several.",
5627
+ "description": "The spec's path, `specs/<path>`.",
5432
5628
  "schema": {
5433
5629
  "type": "string"
5434
5630
  }
@@ -5448,11 +5644,11 @@
5448
5644
  ],
5449
5645
  "responses": {
5450
5646
  "200": {
5451
- "description": "The detail.",
5647
+ "description": "The spec text.",
5452
5648
  "content": {
5453
- "application/json": {
5649
+ "text/plain": {
5454
5650
  "schema": {
5455
- "$ref": "#/components/schemas/CheckDetail"
5651
+ "type": "string"
5456
5652
  }
5457
5653
  }
5458
5654
  }
@@ -5468,7 +5664,7 @@
5468
5664
  }
5469
5665
  },
5470
5666
  "404": {
5471
- "description": "No such layer or check.",
5667
+ "description": "No such spec in the outline.",
5472
5668
  "content": {
5473
5669
  "application/problem+json": {
5474
5670
  "schema": {
@@ -5480,14 +5676,14 @@
5480
5676
  }
5481
5677
  }
5482
5678
  },
5483
- "/api/projects/{project}/reports/evidence/detail/{backend}/{id}": {
5679
+ "/api/projects/{project}/reports/outline/spec": {
5484
5680
  "get": {
5485
- "operationId": "getCheckDetailForProject",
5681
+ "operationId": "getOutlineSpecForProject",
5486
5682
  "tags": [
5487
5683
  "Report"
5488
5684
  ],
5489
- "summary": "Everything one result carries",
5490
- "description": "The timeline, annotations, retries, attachments and extensions of one check, and what its run carries as a whole. Without `check`, only the run's. Attachment bytes are fetched from `/api/reports/layers/{id}/blobs/{bundleKey}`.\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`.",
5685
+ "summary": "The text of one spec",
5686
+ "description": "The text of a spec file of the outline, by its path.\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`.",
5491
5687
  "x-atlas-role": "read",
5492
5688
  "security": [
5493
5689
  {
@@ -5512,37 +5708,9 @@
5512
5708
  },
5513
5709
  {
5514
5710
  "required": true,
5515
- "name": "backend",
5516
- "in": "path",
5517
- "description": "A backend id from `/api/server`.",
5518
- "schema": {
5519
- "type": "string"
5520
- }
5521
- },
5522
- {
5523
- "required": true,
5524
- "name": "id",
5525
- "in": "path",
5526
- "description": "A layer id: 64 lowercase hex digits.",
5527
- "schema": {
5528
- "type": "string",
5529
- "pattern": "^[0-9a-f]{64}$"
5530
- }
5531
- },
5532
- {
5533
- "required": false,
5534
- "name": "check",
5535
- "in": "query",
5536
- "description": "The check id.",
5537
- "schema": {
5538
- "type": "string"
5539
- }
5540
- },
5541
- {
5542
- "required": false,
5543
- "name": "kind",
5711
+ "name": "path",
5544
5712
  "in": "query",
5545
- "description": "The kind of the part, when the same id is in several.",
5713
+ "description": "The spec's path, `specs/<path>`.",
5546
5714
  "schema": {
5547
5715
  "type": "string"
5548
5716
  }
@@ -5550,11 +5718,11 @@
5550
5718
  ],
5551
5719
  "responses": {
5552
5720
  "200": {
5553
- "description": "The detail.",
5721
+ "description": "The spec text.",
5554
5722
  "content": {
5555
- "application/json": {
5723
+ "text/plain": {
5556
5724
  "schema": {
5557
- "$ref": "#/components/schemas/CheckDetail"
5725
+ "type": "string"
5558
5726
  }
5559
5727
  }
5560
5728
  }
@@ -5570,7 +5738,7 @@
5570
5738
  }
5571
5739
  },
5572
5740
  "404": {
5573
- "description": "No such layer or check.",
5741
+ "description": "No such spec in the outline.",
5574
5742
  "content": {
5575
5743
  "application/problem+json": {
5576
5744
  "schema": {
@@ -5582,14 +5750,14 @@
5582
5750
  }
5583
5751
  }
5584
5752
  },
5585
- "/api/reports/layers/{id}/blobs/{bundleKey}": {
5753
+ "/api/reports/evidence": {
5586
5754
  "get": {
5587
- "operationId": "getAttachment",
5755
+ "operationId": "listLayers",
5588
5756
  "tags": [
5589
5757
  "Report"
5590
5758
  ],
5591
- "summary": "A file a layer carries",
5592
- "description": "A screenshot, video, trace, log or any attachment of a layer, by the `bundleKey` its attachment names (`attachments/<sha256>`). Served as untrusted bytes: never sniffed, never run, sandboxed; immutable, cacheable for good; videos can be sought with `Range`.\n\nRole needed: `read`.",
5759
+ "summary": "Page through every layer header",
5760
+ "description": "The history: layer headers newest first, merged from every backend. Prefer `/api/reports/evidence/effective`, which is one request and holds only what wins. Use this to audit what was recorded.\n\nRole needed: `read`.",
5593
5761
  "x-atlas-role": "read",
5594
5762
  "security": [
5595
5763
  {
@@ -5600,30 +5768,11 @@
5600
5768
  }
5601
5769
  ],
5602
5770
  "parameters": [
5603
- {
5604
- "required": true,
5605
- "name": "id",
5606
- "in": "path",
5607
- "description": "A layer id: 64 lowercase hex digits.",
5608
- "schema": {
5609
- "type": "string",
5610
- "pattern": "^[0-9a-f]{64}$"
5611
- }
5612
- },
5613
- {
5614
- "required": true,
5615
- "name": "bundleKey",
5616
- "in": "path",
5617
- "description": "The attachment's `bundleKey`, which contains a slash.",
5618
- "schema": {
5619
- "type": "string"
5620
- }
5621
- },
5622
5771
  {
5623
5772
  "required": false,
5624
- "name": "range",
5625
- "in": "header",
5626
- "description": "A byte range, `bytes=0-1023`.",
5773
+ "name": "cursor",
5774
+ "in": "query",
5775
+ "description": "The `cursor` of the previous page.",
5627
5776
  "schema": {
5628
5777
  "type": "string"
5629
5778
  }
@@ -5643,22 +5792,15 @@
5643
5792
  ],
5644
5793
  "responses": {
5645
5794
  "200": {
5646
- "description": "The bytes, with the type the producer gave (or `application/octet-stream`).",
5795
+ "description": "A page of headers.",
5647
5796
  "content": {
5648
- "application/octet-stream": {
5797
+ "application/json": {
5649
5798
  "schema": {
5650
- "type": "string",
5651
- "format": "binary"
5799
+ "$ref": "#/components/schemas/EvidencePage"
5652
5800
  }
5653
5801
  }
5654
5802
  }
5655
5803
  },
5656
- "206": {
5657
- "description": "The requested range."
5658
- },
5659
- "304": {
5660
- "description": "Not modified."
5661
- },
5662
5804
  "401": {
5663
5805
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
5664
5806
  "content": {
@@ -5669,8 +5811,8 @@
5669
5811
  }
5670
5812
  }
5671
5813
  },
5672
- "404": {
5673
- "description": "No such layer or file.",
5814
+ "503": {
5815
+ "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
5674
5816
  "content": {
5675
5817
  "application/problem+json": {
5676
5818
  "schema": {
@@ -5682,14 +5824,14 @@
5682
5824
  }
5683
5825
  }
5684
5826
  },
5685
- "/api/projects/{project}/reports/layers/{id}/blobs/{bundleKey}": {
5827
+ "/api/projects/{project}/reports/evidence": {
5686
5828
  "get": {
5687
- "operationId": "getAttachmentForProject",
5829
+ "operationId": "listLayersForProject",
5688
5830
  "tags": [
5689
5831
  "Report"
5690
5832
  ],
5691
- "summary": "A file a layer carries",
5692
- "description": "A screenshot, video, trace, log or any attachment of a layer, by the `bundleKey` its attachment names (`attachments/<sha256>`). Served as untrusted bytes: never sniffed, never run, sandboxed; immutable, cacheable for good; videos can be sought with `Range`.\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`.",
5833
+ "summary": "Page through every layer header",
5834
+ "description": "The history: layer headers newest first, merged from every backend. Prefer `/api/reports/evidence/effective`, which is one request and holds only what wins. Use this to audit what was recorded.\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`.",
5693
5835
  "x-atlas-role": "read",
5694
5836
  "security": [
5695
5837
  {
@@ -5712,30 +5854,11 @@
5712
5854
  "maxLength": 64
5713
5855
  }
5714
5856
  },
5715
- {
5716
- "required": true,
5717
- "name": "id",
5718
- "in": "path",
5719
- "description": "A layer id: 64 lowercase hex digits.",
5720
- "schema": {
5721
- "type": "string",
5722
- "pattern": "^[0-9a-f]{64}$"
5723
- }
5724
- },
5725
- {
5726
- "required": true,
5727
- "name": "bundleKey",
5728
- "in": "path",
5729
- "description": "The attachment's `bundleKey`, which contains a slash.",
5730
- "schema": {
5731
- "type": "string"
5732
- }
5733
- },
5734
5857
  {
5735
5858
  "required": false,
5736
- "name": "range",
5737
- "in": "header",
5738
- "description": "A byte range, `bytes=0-1023`.",
5859
+ "name": "cursor",
5860
+ "in": "query",
5861
+ "description": "The `cursor` of the previous page.",
5739
5862
  "schema": {
5740
5863
  "type": "string"
5741
5864
  }
@@ -5743,22 +5866,15 @@
5743
5866
  ],
5744
5867
  "responses": {
5745
5868
  "200": {
5746
- "description": "The bytes, with the type the producer gave (or `application/octet-stream`).",
5869
+ "description": "A page of headers.",
5747
5870
  "content": {
5748
- "application/octet-stream": {
5871
+ "application/json": {
5749
5872
  "schema": {
5750
- "type": "string",
5751
- "format": "binary"
5873
+ "$ref": "#/components/schemas/EvidencePage"
5752
5874
  }
5753
5875
  }
5754
5876
  }
5755
5877
  },
5756
- "206": {
5757
- "description": "The requested range."
5758
- },
5759
- "304": {
5760
- "description": "Not modified."
5761
- },
5762
5878
  "401": {
5763
5879
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
5764
5880
  "content": {
@@ -5769,8 +5885,8 @@
5769
5885
  }
5770
5886
  }
5771
5887
  },
5772
- "404": {
5773
- "description": "No such layer or file.",
5888
+ "503": {
5889
+ "description": "The server is still reading its backends. Retry after the number of seconds in `Retry-After`.",
5774
5890
  "content": {
5775
5891
  "application/problem+json": {
5776
5892
  "schema": {
@@ -5782,14 +5898,14 @@
5782
5898
  }
5783
5899
  }
5784
5900
  },
5785
- "/api/reports/layers/{id}/{path}": {
5901
+ "/api/reports/evidence/rows/{backend}/{id}": {
5786
5902
  "get": {
5787
- "operationId": "getRecordedFile",
5903
+ "operationId": "getLayerRows",
5788
5904
  "tags": [
5789
5905
  "Report"
5790
5906
  ],
5791
- "summary": "A recorded test of a statechart run",
5792
- "description": "The `report.json`, captured files and frame stylesheet of a recorded statechart test of a layer (`tests/<testId>/report.json`, `tests/<testId>/files/…`, `frame.css`). Untrusted bytes, served like attachments.\n\nRole needed: `read`.",
5907
+ "summary": "The checks of one layer",
5908
+ "description": "Every check of one layer (not only those that win), with the spec fingerprints it recorded.\n\nRole needed: `read`.",
5793
5909
  "x-atlas-role": "read",
5794
5910
  "security": [
5795
5911
  {
@@ -5802,21 +5918,21 @@
5802
5918
  "parameters": [
5803
5919
  {
5804
5920
  "required": true,
5805
- "name": "id",
5921
+ "name": "backend",
5806
5922
  "in": "path",
5807
- "description": "A layer id: 64 lowercase hex digits.",
5923
+ "description": "A backend id from `/api/server`.",
5808
5924
  "schema": {
5809
- "type": "string",
5810
- "pattern": "^[0-9a-f]{64}$"
5925
+ "type": "string"
5811
5926
  }
5812
5927
  },
5813
5928
  {
5814
5929
  "required": true,
5815
- "name": "path",
5930
+ "name": "id",
5816
5931
  "in": "path",
5817
- "description": "The path under the layer.",
5932
+ "description": "A layer id: 64 lowercase hex digits.",
5818
5933
  "schema": {
5819
- "type": "string"
5934
+ "type": "string",
5935
+ "pattern": "^[0-9a-f]{64}$"
5820
5936
  }
5821
5937
  },
5822
5938
  {
@@ -5834,12 +5950,11 @@
5834
5950
  ],
5835
5951
  "responses": {
5836
5952
  "200": {
5837
- "description": "The file.",
5953
+ "description": "The rows.",
5838
5954
  "content": {
5839
- "application/octet-stream": {
5955
+ "application/json": {
5840
5956
  "schema": {
5841
- "type": "string",
5842
- "format": "binary"
5957
+ "$ref": "#/components/schemas/LayerRows"
5843
5958
  }
5844
5959
  }
5845
5960
  }
@@ -5855,7 +5970,7 @@
5855
5970
  }
5856
5971
  },
5857
5972
  "404": {
5858
- "description": "No such file.",
5973
+ "description": "No such layer in that backend.",
5859
5974
  "content": {
5860
5975
  "application/problem+json": {
5861
5976
  "schema": {
@@ -5867,14 +5982,14 @@
5867
5982
  }
5868
5983
  }
5869
5984
  },
5870
- "/api/projects/{project}/reports/layers/{id}/{path}": {
5985
+ "/api/projects/{project}/reports/evidence/rows/{backend}/{id}": {
5871
5986
  "get": {
5872
- "operationId": "getRecordedFileForProject",
5987
+ "operationId": "getLayerRowsForProject",
5873
5988
  "tags": [
5874
5989
  "Report"
5875
5990
  ],
5876
- "summary": "A recorded test of a statechart run",
5877
- "description": "The `report.json`, captured files and frame stylesheet of a recorded statechart test of a layer (`tests/<testId>/report.json`, `tests/<testId>/files/…`, `frame.css`). Untrusted bytes, served like attachments.\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`.",
5991
+ "summary": "The checks of one layer",
5992
+ "description": "Every check of one layer (not only those that win), with the spec fingerprints it recorded.\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`.",
5878
5993
  "x-atlas-role": "read",
5879
5994
  "security": [
5880
5995
  {
@@ -5899,32 +6014,31 @@
5899
6014
  },
5900
6015
  {
5901
6016
  "required": true,
5902
- "name": "id",
6017
+ "name": "backend",
5903
6018
  "in": "path",
5904
- "description": "A layer id: 64 lowercase hex digits.",
6019
+ "description": "A backend id from `/api/server`.",
5905
6020
  "schema": {
5906
- "type": "string",
5907
- "pattern": "^[0-9a-f]{64}$"
6021
+ "type": "string"
5908
6022
  }
5909
6023
  },
5910
6024
  {
5911
6025
  "required": true,
5912
- "name": "path",
6026
+ "name": "id",
5913
6027
  "in": "path",
5914
- "description": "The path under the layer.",
6028
+ "description": "A layer id: 64 lowercase hex digits.",
5915
6029
  "schema": {
5916
- "type": "string"
6030
+ "type": "string",
6031
+ "pattern": "^[0-9a-f]{64}$"
5917
6032
  }
5918
6033
  }
5919
6034
  ],
5920
6035
  "responses": {
5921
6036
  "200": {
5922
- "description": "The file.",
6037
+ "description": "The rows.",
5923
6038
  "content": {
5924
- "application/octet-stream": {
6039
+ "application/json": {
5925
6040
  "schema": {
5926
- "type": "string",
5927
- "format": "binary"
6041
+ "$ref": "#/components/schemas/LayerRows"
5928
6042
  }
5929
6043
  }
5930
6044
  }
@@ -5940,7 +6054,7 @@
5940
6054
  }
5941
6055
  },
5942
6056
  "404": {
5943
- "description": "No such file.",
6057
+ "description": "No such layer in that backend.",
5944
6058
  "content": {
5945
6059
  "application/problem+json": {
5946
6060
  "schema": {
@@ -5952,14 +6066,14 @@
5952
6066
  }
5953
6067
  }
5954
6068
  },
5955
- "/api/reports/live/{source}/frame.css": {
6069
+ "/api/reports/evidence/detail/{backend}/{id}": {
5956
6070
  "get": {
5957
- "operationId": "getLiveFrameCss",
6071
+ "operationId": "getCheckDetail",
5958
6072
  "tags": [
5959
6073
  "Report"
5960
6074
  ],
5961
- "summary": "Frame stylesheet of a live spec run (development only)",
5962
- "description": "For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.\n\nRole needed: `read`.",
6075
+ "summary": "Everything one result carries",
6076
+ "description": "The timeline, annotations, retries, attachments and extensions of one check, and what its run carries as a whole. Without `check`, only the run's. Attachment bytes are fetched from `/api/reports/layers/{id}/blobs/{bundleKey}`.\n\nRole needed: `read`.",
5963
6077
  "x-atlas-role": "read",
5964
6078
  "security": [
5965
6079
  {
@@ -5972,9 +6086,37 @@
5972
6086
  "parameters": [
5973
6087
  {
5974
6088
  "required": true,
5975
- "name": "source",
6089
+ "name": "backend",
5976
6090
  "in": "path",
5977
- "description": "The live source id.",
6091
+ "description": "A backend id from `/api/server`.",
6092
+ "schema": {
6093
+ "type": "string"
6094
+ }
6095
+ },
6096
+ {
6097
+ "required": true,
6098
+ "name": "id",
6099
+ "in": "path",
6100
+ "description": "A layer id: 64 lowercase hex digits.",
6101
+ "schema": {
6102
+ "type": "string",
6103
+ "pattern": "^[0-9a-f]{64}$"
6104
+ }
6105
+ },
6106
+ {
6107
+ "required": false,
6108
+ "name": "check",
6109
+ "in": "query",
6110
+ "description": "The check id.",
6111
+ "schema": {
6112
+ "type": "string"
6113
+ }
6114
+ },
6115
+ {
6116
+ "required": false,
6117
+ "name": "kind",
6118
+ "in": "query",
6119
+ "description": "The kind of the part, when the same id is in several.",
5978
6120
  "schema": {
5979
6121
  "type": "string"
5980
6122
  }
@@ -5994,17 +6136,27 @@
5994
6136
  ],
5995
6137
  "responses": {
5996
6138
  "200": {
5997
- "description": "The stylesheet.",
6139
+ "description": "The detail.",
5998
6140
  "content": {
5999
- "text/css": {
6141
+ "application/json": {
6000
6142
  "schema": {
6001
- "type": "string"
6143
+ "$ref": "#/components/schemas/CheckDetail"
6144
+ }
6145
+ }
6146
+ }
6147
+ },
6148
+ "401": {
6149
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6150
+ "content": {
6151
+ "application/problem+json": {
6152
+ "schema": {
6153
+ "$ref": "#/components/schemas/Problem"
6002
6154
  }
6003
6155
  }
6004
6156
  }
6005
6157
  },
6006
6158
  "404": {
6007
- "description": "Not a live source.",
6159
+ "description": "No such layer or check.",
6008
6160
  "content": {
6009
6161
  "application/problem+json": {
6010
6162
  "schema": {
@@ -6016,14 +6168,14 @@
6016
6168
  }
6017
6169
  }
6018
6170
  },
6019
- "/api/projects/{project}/reports/live/{source}/frame.css": {
6171
+ "/api/projects/{project}/reports/evidence/detail/{backend}/{id}": {
6020
6172
  "get": {
6021
- "operationId": "getLiveFrameCssForProject",
6173
+ "operationId": "getCheckDetailForProject",
6022
6174
  "tags": [
6023
6175
  "Report"
6024
6176
  ],
6025
- "summary": "Frame stylesheet of a live spec run (development only)",
6026
- "description": "For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.\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`.",
6177
+ "summary": "Everything one result carries",
6178
+ "description": "The timeline, annotations, retries, attachments and extensions of one check, and what its run carries as a whole. Without `check`, only the run's. Attachment bytes are fetched from `/api/reports/layers/{id}/blobs/{bundleKey}`.\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`.",
6027
6179
  "x-atlas-role": "read",
6028
6180
  "security": [
6029
6181
  {
@@ -6048,9 +6200,37 @@
6048
6200
  },
6049
6201
  {
6050
6202
  "required": true,
6051
- "name": "source",
6203
+ "name": "backend",
6052
6204
  "in": "path",
6053
- "description": "The live source id.",
6205
+ "description": "A backend id from `/api/server`.",
6206
+ "schema": {
6207
+ "type": "string"
6208
+ }
6209
+ },
6210
+ {
6211
+ "required": true,
6212
+ "name": "id",
6213
+ "in": "path",
6214
+ "description": "A layer id: 64 lowercase hex digits.",
6215
+ "schema": {
6216
+ "type": "string",
6217
+ "pattern": "^[0-9a-f]{64}$"
6218
+ }
6219
+ },
6220
+ {
6221
+ "required": false,
6222
+ "name": "check",
6223
+ "in": "query",
6224
+ "description": "The check id.",
6225
+ "schema": {
6226
+ "type": "string"
6227
+ }
6228
+ },
6229
+ {
6230
+ "required": false,
6231
+ "name": "kind",
6232
+ "in": "query",
6233
+ "description": "The kind of the part, when the same id is in several.",
6054
6234
  "schema": {
6055
6235
  "type": "string"
6056
6236
  }
@@ -6058,17 +6238,27 @@
6058
6238
  ],
6059
6239
  "responses": {
6060
6240
  "200": {
6061
- "description": "The stylesheet.",
6241
+ "description": "The detail.",
6062
6242
  "content": {
6063
- "text/css": {
6243
+ "application/json": {
6064
6244
  "schema": {
6065
- "type": "string"
6245
+ "$ref": "#/components/schemas/CheckDetail"
6246
+ }
6247
+ }
6248
+ }
6249
+ },
6250
+ "401": {
6251
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6252
+ "content": {
6253
+ "application/problem+json": {
6254
+ "schema": {
6255
+ "$ref": "#/components/schemas/Problem"
6066
6256
  }
6067
6257
  }
6068
6258
  }
6069
6259
  },
6070
6260
  "404": {
6071
- "description": "Not a live source.",
6261
+ "description": "No such layer or check.",
6072
6262
  "content": {
6073
6263
  "application/problem+json": {
6074
6264
  "schema": {
@@ -6080,14 +6270,14 @@
6080
6270
  }
6081
6271
  }
6082
6272
  },
6083
- "/api/reports/live/{source}/tests/{testId}/{path}": {
6273
+ "/api/reports/layers/{id}/blobs/{bundleKey}": {
6084
6274
  "get": {
6085
- "operationId": "getLiveTestFile",
6275
+ "operationId": "getAttachment",
6086
6276
  "tags": [
6087
6277
  "Report"
6088
6278
  ],
6089
- "summary": "A file of a test in a live spec run (development only)",
6090
- "description": "For spec runs writing on the same machine as a development host. A server has none: it answers `404`.\n\nRole needed: `read`.",
6279
+ "summary": "A file a layer carries",
6280
+ "description": "A screenshot, video, trace, log or any attachment of a layer, by the `bundleKey` its attachment names (`attachments/<sha256>`). Served as untrusted bytes: never sniffed, never run, sandboxed; immutable, cacheable for good; videos can be sought with `Range`.\n\nRole needed: `read`.",
6091
6281
  "x-atlas-role": "read",
6092
6282
  "security": [
6093
6283
  {
@@ -6100,27 +6290,28 @@
6100
6290
  "parameters": [
6101
6291
  {
6102
6292
  "required": true,
6103
- "name": "source",
6293
+ "name": "id",
6104
6294
  "in": "path",
6105
- "description": "The live source id.",
6295
+ "description": "A layer id: 64 lowercase hex digits.",
6106
6296
  "schema": {
6107
- "type": "string"
6297
+ "type": "string",
6298
+ "pattern": "^[0-9a-f]{64}$"
6108
6299
  }
6109
6300
  },
6110
6301
  {
6111
6302
  "required": true,
6112
- "name": "testId",
6303
+ "name": "bundleKey",
6113
6304
  "in": "path",
6114
- "description": "The test id.",
6305
+ "description": "The attachment's `bundleKey`, which contains a slash.",
6115
6306
  "schema": {
6116
6307
  "type": "string"
6117
6308
  }
6118
6309
  },
6119
6310
  {
6120
- "required": true,
6121
- "name": "path",
6122
- "in": "path",
6123
- "description": "The path under the test.",
6311
+ "required": false,
6312
+ "name": "range",
6313
+ "in": "header",
6314
+ "description": "A byte range, `bytes=0-1023`.",
6124
6315
  "schema": {
6125
6316
  "type": "string"
6126
6317
  }
@@ -6140,7 +6331,7 @@
6140
6331
  ],
6141
6332
  "responses": {
6142
6333
  "200": {
6143
- "description": "The file.",
6334
+ "description": "The bytes, with the type the producer gave (or `application/octet-stream`).",
6144
6335
  "content": {
6145
6336
  "application/octet-stream": {
6146
6337
  "schema": {
@@ -6150,9 +6341,25 @@
6150
6341
  }
6151
6342
  }
6152
6343
  },
6153
- "404": {
6154
- "description": "Not a live source.",
6155
- "content": {
6344
+ "206": {
6345
+ "description": "The requested range."
6346
+ },
6347
+ "304": {
6348
+ "description": "Not modified."
6349
+ },
6350
+ "401": {
6351
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6352
+ "content": {
6353
+ "application/problem+json": {
6354
+ "schema": {
6355
+ "$ref": "#/components/schemas/Problem"
6356
+ }
6357
+ }
6358
+ }
6359
+ },
6360
+ "404": {
6361
+ "description": "No such layer or file.",
6362
+ "content": {
6156
6363
  "application/problem+json": {
6157
6364
  "schema": {
6158
6365
  "$ref": "#/components/schemas/Problem"
@@ -6163,14 +6370,14 @@
6163
6370
  }
6164
6371
  }
6165
6372
  },
6166
- "/api/projects/{project}/reports/live/{source}/tests/{testId}/{path}": {
6373
+ "/api/projects/{project}/reports/layers/{id}/blobs/{bundleKey}": {
6167
6374
  "get": {
6168
- "operationId": "getLiveTestFileForProject",
6375
+ "operationId": "getAttachmentForProject",
6169
6376
  "tags": [
6170
6377
  "Report"
6171
6378
  ],
6172
- "summary": "A file of a test in a live spec run (development only)",
6173
- "description": "For spec runs writing on the same machine as a development host. A server has none: it answers `404`.\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`.",
6379
+ "summary": "A file a layer carries",
6380
+ "description": "A screenshot, video, trace, log or any attachment of a layer, by the `bundleKey` its attachment names (`attachments/<sha256>`). Served as untrusted bytes: never sniffed, never run, sandboxed; immutable, cacheable for good; videos can be sought with `Range`.\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`.",
6174
6381
  "x-atlas-role": "read",
6175
6382
  "security": [
6176
6383
  {
@@ -6195,27 +6402,28 @@
6195
6402
  },
6196
6403
  {
6197
6404
  "required": true,
6198
- "name": "source",
6405
+ "name": "id",
6199
6406
  "in": "path",
6200
- "description": "The live source id.",
6407
+ "description": "A layer id: 64 lowercase hex digits.",
6201
6408
  "schema": {
6202
- "type": "string"
6409
+ "type": "string",
6410
+ "pattern": "^[0-9a-f]{64}$"
6203
6411
  }
6204
6412
  },
6205
6413
  {
6206
6414
  "required": true,
6207
- "name": "testId",
6415
+ "name": "bundleKey",
6208
6416
  "in": "path",
6209
- "description": "The test id.",
6417
+ "description": "The attachment's `bundleKey`, which contains a slash.",
6210
6418
  "schema": {
6211
6419
  "type": "string"
6212
6420
  }
6213
6421
  },
6214
6422
  {
6215
- "required": true,
6216
- "name": "path",
6217
- "in": "path",
6218
- "description": "The path under the test.",
6423
+ "required": false,
6424
+ "name": "range",
6425
+ "in": "header",
6426
+ "description": "A byte range, `bytes=0-1023`.",
6219
6427
  "schema": {
6220
6428
  "type": "string"
6221
6429
  }
@@ -6223,7 +6431,7 @@
6223
6431
  ],
6224
6432
  "responses": {
6225
6433
  "200": {
6226
- "description": "The file.",
6434
+ "description": "The bytes, with the type the producer gave (or `application/octet-stream`).",
6227
6435
  "content": {
6228
6436
  "application/octet-stream": {
6229
6437
  "schema": {
@@ -6233,8 +6441,24 @@
6233
6441
  }
6234
6442
  }
6235
6443
  },
6444
+ "206": {
6445
+ "description": "The requested range."
6446
+ },
6447
+ "304": {
6448
+ "description": "Not modified."
6449
+ },
6450
+ "401": {
6451
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6452
+ "content": {
6453
+ "application/problem+json": {
6454
+ "schema": {
6455
+ "$ref": "#/components/schemas/Problem"
6456
+ }
6457
+ }
6458
+ }
6459
+ },
6236
6460
  "404": {
6237
- "description": "Not a live source.",
6461
+ "description": "No such layer or file.",
6238
6462
  "content": {
6239
6463
  "application/problem+json": {
6240
6464
  "schema": {
@@ -6246,14 +6470,14 @@
6246
6470
  }
6247
6471
  }
6248
6472
  },
6249
- "/api/data/sources.json": {
6473
+ "/api/reports/layers/{id}/{path}": {
6250
6474
  "get": {
6251
- "operationId": "getSources",
6475
+ "operationId": "getRecordedFile",
6252
6476
  "tags": [
6253
- "Viewer data"
6477
+ "Report"
6254
6478
  ],
6255
- "summary": "The sources the viewer reads",
6256
- "description": "The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.\n\nRole needed: `read`.",
6479
+ "summary": "A recorded test of a statechart run",
6480
+ "description": "The `report.json`, captured files and frame stylesheet of a recorded statechart test of a layer (`tests/<testId>/report.json`, `tests/<testId>/files/…`, `frame.css`). Untrusted bytes, served like attachments.\n\nRole needed: `read`.",
6257
6481
  "x-atlas-role": "read",
6258
6482
  "security": [
6259
6483
  {
@@ -6264,6 +6488,25 @@
6264
6488
  }
6265
6489
  ],
6266
6490
  "parameters": [
6491
+ {
6492
+ "required": true,
6493
+ "name": "id",
6494
+ "in": "path",
6495
+ "description": "A layer id: 64 lowercase hex digits.",
6496
+ "schema": {
6497
+ "type": "string",
6498
+ "pattern": "^[0-9a-f]{64}$"
6499
+ }
6500
+ },
6501
+ {
6502
+ "required": true,
6503
+ "name": "path",
6504
+ "in": "path",
6505
+ "description": "The path under the layer.",
6506
+ "schema": {
6507
+ "type": "string"
6508
+ }
6509
+ },
6267
6510
  {
6268
6511
  "required": false,
6269
6512
  "name": "project",
@@ -6279,11 +6522,12 @@
6279
6522
  ],
6280
6523
  "responses": {
6281
6524
  "200": {
6282
- "description": "The sources file.",
6525
+ "description": "The file.",
6283
6526
  "content": {
6284
- "application/json": {
6527
+ "application/octet-stream": {
6285
6528
  "schema": {
6286
- "$ref": "#/components/schemas/ReportSources"
6529
+ "type": "string",
6530
+ "format": "binary"
6287
6531
  }
6288
6532
  }
6289
6533
  }
@@ -6297,18 +6541,28 @@
6297
6541
  }
6298
6542
  }
6299
6543
  }
6544
+ },
6545
+ "404": {
6546
+ "description": "No such file.",
6547
+ "content": {
6548
+ "application/problem+json": {
6549
+ "schema": {
6550
+ "$ref": "#/components/schemas/Problem"
6551
+ }
6552
+ }
6553
+ }
6300
6554
  }
6301
6555
  }
6302
6556
  }
6303
6557
  },
6304
- "/api/projects/{project}/data/sources.json": {
6558
+ "/api/projects/{project}/reports/layers/{id}/{path}": {
6305
6559
  "get": {
6306
- "operationId": "getSourcesForProject",
6560
+ "operationId": "getRecordedFileForProject",
6307
6561
  "tags": [
6308
- "Viewer data"
6562
+ "Report"
6309
6563
  ],
6310
- "summary": "The sources the viewer reads",
6311
- "description": "The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.\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`.",
6564
+ "summary": "A recorded test of a statechart run",
6565
+ "description": "The `report.json`, captured files and frame stylesheet of a recorded statechart test of a layer (`tests/<testId>/report.json`, `tests/<testId>/files/…`, `frame.css`). Untrusted bytes, served like attachments.\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`.",
6312
6566
  "x-atlas-role": "read",
6313
6567
  "security": [
6314
6568
  {
@@ -6330,15 +6584,35 @@
6330
6584
  "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
6331
6585
  "maxLength": 64
6332
6586
  }
6587
+ },
6588
+ {
6589
+ "required": true,
6590
+ "name": "id",
6591
+ "in": "path",
6592
+ "description": "A layer id: 64 lowercase hex digits.",
6593
+ "schema": {
6594
+ "type": "string",
6595
+ "pattern": "^[0-9a-f]{64}$"
6596
+ }
6597
+ },
6598
+ {
6599
+ "required": true,
6600
+ "name": "path",
6601
+ "in": "path",
6602
+ "description": "The path under the layer.",
6603
+ "schema": {
6604
+ "type": "string"
6605
+ }
6333
6606
  }
6334
6607
  ],
6335
6608
  "responses": {
6336
6609
  "200": {
6337
- "description": "The sources file.",
6610
+ "description": "The file.",
6338
6611
  "content": {
6339
- "application/json": {
6612
+ "application/octet-stream": {
6340
6613
  "schema": {
6341
- "$ref": "#/components/schemas/ReportSources"
6614
+ "type": "string",
6615
+ "format": "binary"
6342
6616
  }
6343
6617
  }
6344
6618
  }
@@ -6352,18 +6626,28 @@
6352
6626
  }
6353
6627
  }
6354
6628
  }
6629
+ },
6630
+ "404": {
6631
+ "description": "No such file.",
6632
+ "content": {
6633
+ "application/problem+json": {
6634
+ "schema": {
6635
+ "$ref": "#/components/schemas/Problem"
6636
+ }
6637
+ }
6638
+ }
6355
6639
  }
6356
6640
  }
6357
6641
  }
6358
6642
  },
6359
- "/api/data/specs/index.json": {
6643
+ "/api/reports/live/{source}/frame.css": {
6360
6644
  "get": {
6361
- "operationId": "getSpecIndex",
6645
+ "operationId": "getLiveFrameCss",
6362
6646
  "tags": [
6363
- "Viewer data"
6647
+ "Report"
6364
6648
  ],
6365
- "summary": "The spec files",
6366
- "description": "The files of the newest committed spec set, relative to `specs/`.\n\nRole needed: `read`.",
6649
+ "summary": "Frame stylesheet of a live spec run (development only)",
6650
+ "description": "For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.\n\nRole needed: `read`.",
6367
6651
  "x-atlas-role": "read",
6368
6652
  "security": [
6369
6653
  {
@@ -6374,6 +6658,15 @@
6374
6658
  }
6375
6659
  ],
6376
6660
  "parameters": [
6661
+ {
6662
+ "required": true,
6663
+ "name": "source",
6664
+ "in": "path",
6665
+ "description": "The live source id.",
6666
+ "schema": {
6667
+ "type": "string"
6668
+ }
6669
+ },
6377
6670
  {
6378
6671
  "required": false,
6379
6672
  "name": "project",
@@ -6389,17 +6682,17 @@
6389
6682
  ],
6390
6683
  "responses": {
6391
6684
  "200": {
6392
- "description": "The index.",
6685
+ "description": "The stylesheet.",
6393
6686
  "content": {
6394
- "application/json": {
6687
+ "text/css": {
6395
6688
  "schema": {
6396
- "$ref": "#/components/schemas/SpecIndex"
6689
+ "type": "string"
6397
6690
  }
6398
6691
  }
6399
6692
  }
6400
6693
  },
6401
- "401": {
6402
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6694
+ "404": {
6695
+ "description": "Not a live source.",
6403
6696
  "content": {
6404
6697
  "application/problem+json": {
6405
6698
  "schema": {
@@ -6411,14 +6704,14 @@
6411
6704
  }
6412
6705
  }
6413
6706
  },
6414
- "/api/projects/{project}/data/specs/index.json": {
6707
+ "/api/projects/{project}/reports/live/{source}/frame.css": {
6415
6708
  "get": {
6416
- "operationId": "getSpecIndexForProject",
6709
+ "operationId": "getLiveFrameCssForProject",
6417
6710
  "tags": [
6418
- "Viewer data"
6711
+ "Report"
6419
6712
  ],
6420
- "summary": "The spec files",
6421
- "description": "The files of the newest committed spec set, relative to `specs/`.\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`.",
6713
+ "summary": "Frame stylesheet of a live spec run (development only)",
6714
+ "description": "For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.\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`.",
6422
6715
  "x-atlas-role": "read",
6423
6716
  "security": [
6424
6717
  {
@@ -6440,21 +6733,30 @@
6440
6733
  "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
6441
6734
  "maxLength": 64
6442
6735
  }
6736
+ },
6737
+ {
6738
+ "required": true,
6739
+ "name": "source",
6740
+ "in": "path",
6741
+ "description": "The live source id.",
6742
+ "schema": {
6743
+ "type": "string"
6744
+ }
6443
6745
  }
6444
6746
  ],
6445
6747
  "responses": {
6446
6748
  "200": {
6447
- "description": "The index.",
6749
+ "description": "The stylesheet.",
6448
6750
  "content": {
6449
- "application/json": {
6751
+ "text/css": {
6450
6752
  "schema": {
6451
- "$ref": "#/components/schemas/SpecIndex"
6753
+ "type": "string"
6452
6754
  }
6453
6755
  }
6454
6756
  }
6455
6757
  },
6456
- "401": {
6457
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6758
+ "404": {
6759
+ "description": "Not a live source.",
6458
6760
  "content": {
6459
6761
  "application/problem+json": {
6460
6762
  "schema": {
@@ -6466,14 +6768,14 @@
6466
6768
  }
6467
6769
  }
6468
6770
  },
6469
- "/api/data/specs/{file}": {
6771
+ "/api/reports/live/{source}/tests/{testId}/{path}": {
6470
6772
  "get": {
6471
- "operationId": "getSpecFile",
6773
+ "operationId": "getLiveTestFile",
6472
6774
  "tags": [
6473
- "Viewer data"
6775
+ "Report"
6474
6776
  ],
6475
- "summary": "One spec file",
6476
- "description": "The text of a spec file, with the digest of its content as `ETag`.\n\nRole needed: `read`.",
6777
+ "summary": "A file of a test in a live spec run (development only)",
6778
+ "description": "For spec runs writing on the same machine as a development host. A server has none: it answers `404`.\n\nRole needed: `read`.",
6477
6779
  "x-atlas-role": "read",
6478
6780
  "security": [
6479
6781
  {
@@ -6486,9 +6788,27 @@
6486
6788
  "parameters": [
6487
6789
  {
6488
6790
  "required": true,
6489
- "name": "file",
6791
+ "name": "source",
6490
6792
  "in": "path",
6491
- "description": "The file's path relative to `specs/`.",
6793
+ "description": "The live source id.",
6794
+ "schema": {
6795
+ "type": "string"
6796
+ }
6797
+ },
6798
+ {
6799
+ "required": true,
6800
+ "name": "testId",
6801
+ "in": "path",
6802
+ "description": "The test id.",
6803
+ "schema": {
6804
+ "type": "string"
6805
+ }
6806
+ },
6807
+ {
6808
+ "required": true,
6809
+ "name": "path",
6810
+ "in": "path",
6811
+ "description": "The path under the test.",
6492
6812
  "schema": {
6493
6813
  "type": "string"
6494
6814
  }
@@ -6508,30 +6828,18 @@
6508
6828
  ],
6509
6829
  "responses": {
6510
6830
  "200": {
6511
- "description": "The text.",
6831
+ "description": "The file.",
6512
6832
  "content": {
6513
- "text/plain": {
6833
+ "application/octet-stream": {
6514
6834
  "schema": {
6515
- "type": "string"
6516
- }
6517
- }
6518
- }
6519
- },
6520
- "304": {
6521
- "description": "Not modified."
6522
- },
6523
- "401": {
6524
- "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6525
- "content": {
6526
- "application/problem+json": {
6527
- "schema": {
6528
- "$ref": "#/components/schemas/Problem"
6835
+ "type": "string",
6836
+ "format": "binary"
6529
6837
  }
6530
6838
  }
6531
6839
  }
6532
6840
  },
6533
6841
  "404": {
6534
- "description": "No such spec.",
6842
+ "description": "Not a live source.",
6535
6843
  "content": {
6536
6844
  "application/problem+json": {
6537
6845
  "schema": {
@@ -6543,14 +6851,14 @@
6543
6851
  }
6544
6852
  }
6545
6853
  },
6546
- "/api/projects/{project}/data/specs/{file}": {
6854
+ "/api/projects/{project}/reports/live/{source}/tests/{testId}/{path}": {
6547
6855
  "get": {
6548
- "operationId": "getSpecFileForProject",
6856
+ "operationId": "getLiveTestFileForProject",
6549
6857
  "tags": [
6550
- "Viewer data"
6858
+ "Report"
6551
6859
  ],
6552
- "summary": "One spec file",
6553
- "description": "The text of a spec file, with the digest of its content as `ETag`.\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`.",
6860
+ "summary": "A file of a test in a live spec run (development only)",
6861
+ "description": "For spec runs writing on the same machine as a development host. A server has none: it answers `404`.\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`.",
6554
6862
  "x-atlas-role": "read",
6555
6863
  "security": [
6556
6864
  {
@@ -6575,9 +6883,27 @@
6575
6883
  },
6576
6884
  {
6577
6885
  "required": true,
6578
- "name": "file",
6886
+ "name": "source",
6579
6887
  "in": "path",
6580
- "description": "The file's path relative to `specs/`.",
6888
+ "description": "The live source id.",
6889
+ "schema": {
6890
+ "type": "string"
6891
+ }
6892
+ },
6893
+ {
6894
+ "required": true,
6895
+ "name": "testId",
6896
+ "in": "path",
6897
+ "description": "The test id.",
6898
+ "schema": {
6899
+ "type": "string"
6900
+ }
6901
+ },
6902
+ {
6903
+ "required": true,
6904
+ "name": "path",
6905
+ "in": "path",
6906
+ "description": "The path under the test.",
6581
6907
  "schema": {
6582
6908
  "type": "string"
6583
6909
  }
@@ -6585,17 +6911,70 @@
6585
6911
  ],
6586
6912
  "responses": {
6587
6913
  "200": {
6588
- "description": "The text.",
6914
+ "description": "The file.",
6589
6915
  "content": {
6590
- "text/plain": {
6916
+ "application/octet-stream": {
6591
6917
  "schema": {
6592
- "type": "string"
6918
+ "type": "string",
6919
+ "format": "binary"
6593
6920
  }
6594
6921
  }
6595
6922
  }
6596
6923
  },
6597
- "304": {
6598
- "description": "Not modified."
6924
+ "404": {
6925
+ "description": "Not a live source.",
6926
+ "content": {
6927
+ "application/problem+json": {
6928
+ "schema": {
6929
+ "$ref": "#/components/schemas/Problem"
6930
+ }
6931
+ }
6932
+ }
6933
+ }
6934
+ }
6935
+ }
6936
+ },
6937
+ "/api/data/sources.json": {
6938
+ "get": {
6939
+ "operationId": "getSources",
6940
+ "tags": [
6941
+ "Viewer data"
6942
+ ],
6943
+ "summary": "The sources the viewer reads",
6944
+ "description": "The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.\n\nRole needed: `read`.",
6945
+ "x-atlas-role": "read",
6946
+ "security": [
6947
+ {
6948
+ "bearer": []
6949
+ },
6950
+ {
6951
+ "basic": []
6952
+ }
6953
+ ],
6954
+ "parameters": [
6955
+ {
6956
+ "required": false,
6957
+ "name": "project",
6958
+ "in": "query",
6959
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
6960
+ "example": "todo-app",
6961
+ "schema": {
6962
+ "type": "string",
6963
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
6964
+ "maxLength": 64
6965
+ }
6966
+ }
6967
+ ],
6968
+ "responses": {
6969
+ "200": {
6970
+ "description": "The sources file.",
6971
+ "content": {
6972
+ "application/json": {
6973
+ "schema": {
6974
+ "$ref": "#/components/schemas/ReportSources"
6975
+ }
6976
+ }
6977
+ }
6599
6978
  },
6600
6979
  "401": {
6601
6980
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
@@ -6606,9 +6985,54 @@
6606
6985
  }
6607
6986
  }
6608
6987
  }
6988
+ }
6989
+ }
6990
+ }
6991
+ },
6992
+ "/api/projects/{project}/data/sources.json": {
6993
+ "get": {
6994
+ "operationId": "getSourcesForProject",
6995
+ "tags": [
6996
+ "Viewer data"
6997
+ ],
6998
+ "summary": "The sources the viewer reads",
6999
+ "description": "The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.\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`.",
7000
+ "x-atlas-role": "read",
7001
+ "security": [
7002
+ {
7003
+ "bearer": []
6609
7004
  },
6610
- "404": {
6611
- "description": "No such spec.",
7005
+ {
7006
+ "basic": []
7007
+ }
7008
+ ],
7009
+ "parameters": [
7010
+ {
7011
+ "required": true,
7012
+ "name": "project",
7013
+ "in": "path",
7014
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7015
+ "example": "todo-app",
7016
+ "schema": {
7017
+ "type": "string",
7018
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7019
+ "maxLength": 64
7020
+ }
7021
+ }
7022
+ ],
7023
+ "responses": {
7024
+ "200": {
7025
+ "description": "The sources file.",
7026
+ "content": {
7027
+ "application/json": {
7028
+ "schema": {
7029
+ "$ref": "#/components/schemas/ReportSources"
7030
+ }
7031
+ }
7032
+ }
7033
+ },
7034
+ "401": {
7035
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6612
7036
  "content": {
6613
7037
  "application/problem+json": {
6614
7038
  "schema": {
@@ -6620,14 +7044,14 @@
6620
7044
  }
6621
7045
  }
6622
7046
  },
6623
- "/api/data/runs/index.json": {
7047
+ "/api/data/specs/index.json": {
6624
7048
  "get": {
6625
- "operationId": "getRunsIndex",
7049
+ "operationId": "getSpecIndex",
6626
7050
  "tags": [
6627
7051
  "Viewer data"
6628
7052
  ],
6629
- "summary": "The statechart runs",
6630
- "description": "The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.\n\nRole needed: `read`.",
7053
+ "summary": "The spec files",
7054
+ "description": "The files of the newest committed spec set, relative to `specs/`.\n\nRole needed: `read`.",
6631
7055
  "x-atlas-role": "read",
6632
7056
  "security": [
6633
7057
  {
@@ -6657,7 +7081,7 @@
6657
7081
  "content": {
6658
7082
  "application/json": {
6659
7083
  "schema": {
6660
- "$ref": "#/components/schemas/RunsIndex"
7084
+ "$ref": "#/components/schemas/SpecIndex"
6661
7085
  }
6662
7086
  }
6663
7087
  }
@@ -6675,14 +7099,14 @@
6675
7099
  }
6676
7100
  }
6677
7101
  },
6678
- "/api/projects/{project}/data/runs/index.json": {
7102
+ "/api/projects/{project}/data/specs/index.json": {
6679
7103
  "get": {
6680
- "operationId": "getRunsIndexForProject",
7104
+ "operationId": "getSpecIndexForProject",
6681
7105
  "tags": [
6682
7106
  "Viewer data"
6683
7107
  ],
6684
- "summary": "The statechart runs",
6685
- "description": "The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.\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`.",
7108
+ "summary": "The spec files",
7109
+ "description": "The files of the newest committed spec set, relative to `specs/`.\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`.",
6686
7110
  "x-atlas-role": "read",
6687
7111
  "security": [
6688
7112
  {
@@ -6712,7 +7136,7 @@
6712
7136
  "content": {
6713
7137
  "application/json": {
6714
7138
  "schema": {
6715
- "$ref": "#/components/schemas/RunsIndex"
7139
+ "$ref": "#/components/schemas/SpecIndex"
6716
7140
  }
6717
7141
  }
6718
7142
  }
@@ -6730,14 +7154,14 @@
6730
7154
  }
6731
7155
  }
6732
7156
  },
6733
- "/api/data/runs/{id}/{path}": {
7157
+ "/api/data/specs/{file}": {
6734
7158
  "get": {
6735
- "operationId": "getRunFile",
7159
+ "operationId": "getSpecFile",
6736
7160
  "tags": [
6737
7161
  "Viewer data"
6738
7162
  ],
6739
- "summary": "A file of an uploaded run",
6740
- "description": "A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.\n\nRole needed: `read`.",
7163
+ "summary": "One spec file",
7164
+ "description": "The text of a spec file, with the digest of its content as `ETag`.\n\nRole needed: `read`.",
6741
7165
  "x-atlas-role": "read",
6742
7166
  "security": [
6743
7167
  {
@@ -6750,18 +7174,9 @@
6750
7174
  "parameters": [
6751
7175
  {
6752
7176
  "required": true,
6753
- "name": "id",
6754
- "in": "path",
6755
- "description": "The run id.",
6756
- "schema": {
6757
- "type": "string"
6758
- }
6759
- },
6760
- {
6761
- "required": true,
6762
- "name": "path",
7177
+ "name": "file",
6763
7178
  "in": "path",
6764
- "description": "The path inside the run.",
7179
+ "description": "The file's path relative to `specs/`.",
6765
7180
  "schema": {
6766
7181
  "type": "string"
6767
7182
  }
@@ -6781,16 +7196,18 @@
6781
7196
  ],
6782
7197
  "responses": {
6783
7198
  "200": {
6784
- "description": "The file.",
7199
+ "description": "The text.",
6785
7200
  "content": {
6786
- "application/octet-stream": {
7201
+ "text/plain": {
6787
7202
  "schema": {
6788
- "type": "string",
6789
- "format": "binary"
7203
+ "type": "string"
6790
7204
  }
6791
7205
  }
6792
7206
  }
6793
7207
  },
7208
+ "304": {
7209
+ "description": "Not modified."
7210
+ },
6794
7211
  "401": {
6795
7212
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6796
7213
  "content": {
@@ -6802,7 +7219,7 @@
6802
7219
  }
6803
7220
  },
6804
7221
  "404": {
6805
- "description": "No such run or file.",
7222
+ "description": "No such spec.",
6806
7223
  "content": {
6807
7224
  "application/problem+json": {
6808
7225
  "schema": {
@@ -6814,14 +7231,14 @@
6814
7231
  }
6815
7232
  }
6816
7233
  },
6817
- "/api/projects/{project}/data/runs/{id}/{path}": {
7234
+ "/api/projects/{project}/data/specs/{file}": {
6818
7235
  "get": {
6819
- "operationId": "getRunFileForProject",
7236
+ "operationId": "getSpecFileForProject",
6820
7237
  "tags": [
6821
7238
  "Viewer data"
6822
7239
  ],
6823
- "summary": "A file of an uploaded run",
6824
- "description": "A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.\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`.",
7240
+ "summary": "One spec file",
7241
+ "description": "The text of a spec file, with the digest of its content as `ETag`.\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`.",
6825
7242
  "x-atlas-role": "read",
6826
7243
  "security": [
6827
7244
  {
@@ -6846,18 +7263,9 @@
6846
7263
  },
6847
7264
  {
6848
7265
  "required": true,
6849
- "name": "id",
6850
- "in": "path",
6851
- "description": "The run id.",
6852
- "schema": {
6853
- "type": "string"
6854
- }
6855
- },
6856
- {
6857
- "required": true,
6858
- "name": "path",
7266
+ "name": "file",
6859
7267
  "in": "path",
6860
- "description": "The path inside the run.",
7268
+ "description": "The file's path relative to `specs/`.",
6861
7269
  "schema": {
6862
7270
  "type": "string"
6863
7271
  }
@@ -6865,16 +7273,18 @@
6865
7273
  ],
6866
7274
  "responses": {
6867
7275
  "200": {
6868
- "description": "The file.",
7276
+ "description": "The text.",
6869
7277
  "content": {
6870
- "application/octet-stream": {
7278
+ "text/plain": {
6871
7279
  "schema": {
6872
- "type": "string",
6873
- "format": "binary"
7280
+ "type": "string"
6874
7281
  }
6875
7282
  }
6876
7283
  }
6877
7284
  },
7285
+ "304": {
7286
+ "description": "Not modified."
7287
+ },
6878
7288
  "401": {
6879
7289
  "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
6880
7290
  "content": {
@@ -6886,7 +7296,7 @@
6886
7296
  }
6887
7297
  },
6888
7298
  "404": {
6889
- "description": "No such run or file.",
7299
+ "description": "No such spec.",
6890
7300
  "content": {
6891
7301
  "application/problem+json": {
6892
7302
  "schema": {
@@ -6897,18 +7307,296 @@
6897
7307
  }
6898
7308
  }
6899
7309
  }
6900
- }
6901
- },
6902
- "components": {
6903
- "securitySchemes": {
6904
- "bearer": {
6905
- "type": "http",
6906
- "scheme": "bearer",
6907
- "description": "A token of the server: `Authorization: Bearer <token>`. Needed to upload."
6908
- },
6909
- "basic": {
6910
- "type": "http",
6911
- "scheme": "basic",
7310
+ },
7311
+ "/api/data/runs/index.json": {
7312
+ "get": {
7313
+ "operationId": "getRunsIndex",
7314
+ "tags": [
7315
+ "Viewer data"
7316
+ ],
7317
+ "summary": "The statechart runs",
7318
+ "description": "The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.\n\nRole needed: `read`.",
7319
+ "x-atlas-role": "read",
7320
+ "security": [
7321
+ {
7322
+ "bearer": []
7323
+ },
7324
+ {
7325
+ "basic": []
7326
+ }
7327
+ ],
7328
+ "parameters": [
7329
+ {
7330
+ "required": false,
7331
+ "name": "project",
7332
+ "in": "query",
7333
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7334
+ "example": "todo-app",
7335
+ "schema": {
7336
+ "type": "string",
7337
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7338
+ "maxLength": 64
7339
+ }
7340
+ }
7341
+ ],
7342
+ "responses": {
7343
+ "200": {
7344
+ "description": "The index.",
7345
+ "content": {
7346
+ "application/json": {
7347
+ "schema": {
7348
+ "$ref": "#/components/schemas/RunsIndex"
7349
+ }
7350
+ }
7351
+ }
7352
+ },
7353
+ "401": {
7354
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7355
+ "content": {
7356
+ "application/problem+json": {
7357
+ "schema": {
7358
+ "$ref": "#/components/schemas/Problem"
7359
+ }
7360
+ }
7361
+ }
7362
+ }
7363
+ }
7364
+ }
7365
+ },
7366
+ "/api/projects/{project}/data/runs/index.json": {
7367
+ "get": {
7368
+ "operationId": "getRunsIndexForProject",
7369
+ "tags": [
7370
+ "Viewer data"
7371
+ ],
7372
+ "summary": "The statechart runs",
7373
+ "description": "The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.\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`.",
7374
+ "x-atlas-role": "read",
7375
+ "security": [
7376
+ {
7377
+ "bearer": []
7378
+ },
7379
+ {
7380
+ "basic": []
7381
+ }
7382
+ ],
7383
+ "parameters": [
7384
+ {
7385
+ "required": true,
7386
+ "name": "project",
7387
+ "in": "path",
7388
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7389
+ "example": "todo-app",
7390
+ "schema": {
7391
+ "type": "string",
7392
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7393
+ "maxLength": 64
7394
+ }
7395
+ }
7396
+ ],
7397
+ "responses": {
7398
+ "200": {
7399
+ "description": "The index.",
7400
+ "content": {
7401
+ "application/json": {
7402
+ "schema": {
7403
+ "$ref": "#/components/schemas/RunsIndex"
7404
+ }
7405
+ }
7406
+ }
7407
+ },
7408
+ "401": {
7409
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7410
+ "content": {
7411
+ "application/problem+json": {
7412
+ "schema": {
7413
+ "$ref": "#/components/schemas/Problem"
7414
+ }
7415
+ }
7416
+ }
7417
+ }
7418
+ }
7419
+ }
7420
+ },
7421
+ "/api/data/runs/{id}/{path}": {
7422
+ "get": {
7423
+ "operationId": "getRunFile",
7424
+ "tags": [
7425
+ "Viewer data"
7426
+ ],
7427
+ "summary": "A file of an uploaded run",
7428
+ "description": "A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.\n\nRole needed: `read`.",
7429
+ "x-atlas-role": "read",
7430
+ "security": [
7431
+ {
7432
+ "bearer": []
7433
+ },
7434
+ {
7435
+ "basic": []
7436
+ }
7437
+ ],
7438
+ "parameters": [
7439
+ {
7440
+ "required": true,
7441
+ "name": "id",
7442
+ "in": "path",
7443
+ "description": "The run id.",
7444
+ "schema": {
7445
+ "type": "string"
7446
+ }
7447
+ },
7448
+ {
7449
+ "required": true,
7450
+ "name": "path",
7451
+ "in": "path",
7452
+ "description": "The path inside the run.",
7453
+ "schema": {
7454
+ "type": "string"
7455
+ }
7456
+ },
7457
+ {
7458
+ "required": false,
7459
+ "name": "project",
7460
+ "in": "query",
7461
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7462
+ "example": "todo-app",
7463
+ "schema": {
7464
+ "type": "string",
7465
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7466
+ "maxLength": 64
7467
+ }
7468
+ }
7469
+ ],
7470
+ "responses": {
7471
+ "200": {
7472
+ "description": "The file.",
7473
+ "content": {
7474
+ "application/octet-stream": {
7475
+ "schema": {
7476
+ "type": "string",
7477
+ "format": "binary"
7478
+ }
7479
+ }
7480
+ }
7481
+ },
7482
+ "401": {
7483
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7484
+ "content": {
7485
+ "application/problem+json": {
7486
+ "schema": {
7487
+ "$ref": "#/components/schemas/Problem"
7488
+ }
7489
+ }
7490
+ }
7491
+ },
7492
+ "404": {
7493
+ "description": "No such run or file.",
7494
+ "content": {
7495
+ "application/problem+json": {
7496
+ "schema": {
7497
+ "$ref": "#/components/schemas/Problem"
7498
+ }
7499
+ }
7500
+ }
7501
+ }
7502
+ }
7503
+ }
7504
+ },
7505
+ "/api/projects/{project}/data/runs/{id}/{path}": {
7506
+ "get": {
7507
+ "operationId": "getRunFileForProject",
7508
+ "tags": [
7509
+ "Viewer data"
7510
+ ],
7511
+ "summary": "A file of an uploaded run",
7512
+ "description": "A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.\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`.",
7513
+ "x-atlas-role": "read",
7514
+ "security": [
7515
+ {
7516
+ "bearer": []
7517
+ },
7518
+ {
7519
+ "basic": []
7520
+ }
7521
+ ],
7522
+ "parameters": [
7523
+ {
7524
+ "required": true,
7525
+ "name": "project",
7526
+ "in": "path",
7527
+ "description": "Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.",
7528
+ "example": "todo-app",
7529
+ "schema": {
7530
+ "type": "string",
7531
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
7532
+ "maxLength": 64
7533
+ }
7534
+ },
7535
+ {
7536
+ "required": true,
7537
+ "name": "id",
7538
+ "in": "path",
7539
+ "description": "The run id.",
7540
+ "schema": {
7541
+ "type": "string"
7542
+ }
7543
+ },
7544
+ {
7545
+ "required": true,
7546
+ "name": "path",
7547
+ "in": "path",
7548
+ "description": "The path inside the run.",
7549
+ "schema": {
7550
+ "type": "string"
7551
+ }
7552
+ }
7553
+ ],
7554
+ "responses": {
7555
+ "200": {
7556
+ "description": "The file.",
7557
+ "content": {
7558
+ "application/octet-stream": {
7559
+ "schema": {
7560
+ "type": "string",
7561
+ "format": "binary"
7562
+ }
7563
+ }
7564
+ }
7565
+ },
7566
+ "401": {
7567
+ "description": "No token, or an unknown one. Send `Authorization: Bearer <token>`.",
7568
+ "content": {
7569
+ "application/problem+json": {
7570
+ "schema": {
7571
+ "$ref": "#/components/schemas/Problem"
7572
+ }
7573
+ }
7574
+ }
7575
+ },
7576
+ "404": {
7577
+ "description": "No such run or file.",
7578
+ "content": {
7579
+ "application/problem+json": {
7580
+ "schema": {
7581
+ "$ref": "#/components/schemas/Problem"
7582
+ }
7583
+ }
7584
+ }
7585
+ }
7586
+ }
7587
+ }
7588
+ }
7589
+ },
7590
+ "components": {
7591
+ "securitySchemes": {
7592
+ "bearer": {
7593
+ "type": "http",
7594
+ "scheme": "bearer",
7595
+ "description": "A token of the server: `Authorization: Bearer <token>`. Needed to upload."
7596
+ },
7597
+ "basic": {
7598
+ "type": "http",
7599
+ "scheme": "basic",
6912
7600
  "description": "Any user name, the token as the password. For reading only: the browser's sign-in box."
6913
7601
  }
6914
7602
  },
@@ -8237,6 +8925,13 @@
8237
8925
  "description": "The name of the step that holds it",
8238
8926
  "type": "string"
8239
8927
  },
8928
+ "tags": {
8929
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
8930
+ "type": "array",
8931
+ "items": {
8932
+ "type": "string"
8933
+ }
8934
+ },
8240
8935
  "recording": {
8241
8936
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
8242
8937
  "type": "string"
@@ -8527,6 +9222,13 @@
8527
9222
  "description": "The name of the step that holds it",
8528
9223
  "type": "string"
8529
9224
  },
9225
+ "tags": {
9226
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
9227
+ "type": "array",
9228
+ "items": {
9229
+ "type": "string"
9230
+ }
9231
+ },
8530
9232
  "recording": {
8531
9233
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
8532
9234
  "type": "string"
@@ -8867,6 +9569,13 @@
8867
9569
  "description": "The name of the step that holds it",
8868
9570
  "type": "string"
8869
9571
  },
9572
+ "tags": {
9573
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
9574
+ "type": "array",
9575
+ "items": {
9576
+ "type": "string"
9577
+ }
9578
+ },
8870
9579
  "recording": {
8871
9580
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
8872
9581
  "type": "string"
@@ -9157,6 +9866,13 @@
9157
9866
  "description": "The name of the step that holds it",
9158
9867
  "type": "string"
9159
9868
  },
9869
+ "tags": {
9870
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
9871
+ "type": "array",
9872
+ "items": {
9873
+ "type": "string"
9874
+ }
9875
+ },
9160
9876
  "recording": {
9161
9877
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
9162
9878
  "type": "string"
@@ -11626,6 +12342,13 @@
11626
12342
  "description": "The name of the step that holds it",
11627
12343
  "type": "string"
11628
12344
  },
12345
+ "tags": {
12346
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
12347
+ "type": "array",
12348
+ "items": {
12349
+ "type": "string"
12350
+ }
12351
+ },
11629
12352
  "recording": {
11630
12353
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
11631
12354
  "type": "string"
@@ -11946,6 +12669,13 @@
11946
12669
  "description": "The name of the step that holds it",
11947
12670
  "type": "string"
11948
12671
  },
12672
+ "tags": {
12673
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
12674
+ "type": "array",
12675
+ "items": {
12676
+ "type": "string"
12677
+ }
12678
+ },
11949
12679
  "recording": {
11950
12680
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
11951
12681
  "type": "string"
@@ -14247,6 +14977,13 @@
14247
14977
  "description": "The name of the step that holds it",
14248
14978
  "type": "string"
14249
14979
  },
14980
+ "tags": {
14981
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
14982
+ "type": "array",
14983
+ "items": {
14984
+ "type": "string"
14985
+ }
14986
+ },
14250
14987
  "recording": {
14251
14988
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
14252
14989
  "type": "string"
@@ -15181,6 +15918,13 @@
15181
15918
  "description": "The name of the step that holds it",
15182
15919
  "type": "string"
15183
15920
  },
15921
+ "tags": {
15922
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
15923
+ "type": "array",
15924
+ "items": {
15925
+ "type": "string"
15926
+ }
15927
+ },
15184
15928
  "recording": {
15185
15929
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
15186
15930
  "type": "string"
@@ -15436,249 +16180,691 @@
15436
16180
  "lastRecordedAtMs": {
15437
16181
  "type": "number"
15438
16182
  },
15439
- "live": {
15440
- "type": "boolean"
15441
- }
15442
- },
15443
- "required": [
15444
- "key",
15445
- "id",
15446
- "title",
15447
- "specPath",
15448
- "spec",
15449
- "status",
15450
- "environments",
15451
- "producers",
15452
- "outcomes",
15453
- "stats",
15454
- "tags",
15455
- "labels",
15456
- "evidence",
15457
- "lastRecordedAtMs",
15458
- "live"
15459
- ],
15460
- "additionalProperties": {}
16183
+ "live": {
16184
+ "type": "boolean"
16185
+ }
16186
+ },
16187
+ "required": [
16188
+ "key",
16189
+ "id",
16190
+ "title",
16191
+ "specPath",
16192
+ "spec",
16193
+ "status",
16194
+ "environments",
16195
+ "producers",
16196
+ "outcomes",
16197
+ "stats",
16198
+ "tags",
16199
+ "labels",
16200
+ "evidence",
16201
+ "lastRecordedAtMs",
16202
+ "live"
16203
+ ],
16204
+ "additionalProperties": {}
16205
+ },
16206
+ "history": {
16207
+ "type": "array",
16208
+ "items": {
16209
+ "type": "object",
16210
+ "properties": {
16211
+ "at": {
16212
+ "type": "number",
16213
+ "description": "When it was recorded, epoch milliseconds"
16214
+ },
16215
+ "status": {
16216
+ "type": "string",
16217
+ "enum": [
16218
+ "passed",
16219
+ "failed",
16220
+ "running",
16221
+ "not-run"
16222
+ ]
16223
+ },
16224
+ "durationMs": {
16225
+ "description": "How long it took, or null when the producer did not measure it",
16226
+ "type": [
16227
+ "number",
16228
+ "null"
16229
+ ]
16230
+ },
16231
+ "environment": {
16232
+ "description": "The client it checked, such as `desktop-web` or `ios`",
16233
+ "type": [
16234
+ "string",
16235
+ "null"
16236
+ ]
16237
+ },
16238
+ "producer": {
16239
+ "type": "string"
16240
+ },
16241
+ "kind": {
16242
+ "type": "string"
16243
+ },
16244
+ "parameters": {
16245
+ "type": "object",
16246
+ "propertyNames": {
16247
+ "type": "string"
16248
+ },
16249
+ "additionalProperties": {
16250
+ "type": "string"
16251
+ }
16252
+ },
16253
+ "branch": {
16254
+ "type": [
16255
+ "string",
16256
+ "null"
16257
+ ]
16258
+ },
16259
+ "sha": {
16260
+ "type": [
16261
+ "string",
16262
+ "null"
16263
+ ]
16264
+ },
16265
+ "runUrl": {
16266
+ "type": [
16267
+ "string",
16268
+ "null"
16269
+ ]
16270
+ },
16271
+ "run": {
16272
+ "type": "string",
16273
+ "description": "The key of the run it belongs to, as `GET /api/reports/runs` lists it"
16274
+ },
16275
+ "layer": {
16276
+ "type": "string",
16277
+ "description": "The id of the layer that recorded it"
16278
+ },
16279
+ "backend": {
16280
+ "type": "string"
16281
+ },
16282
+ "detail": {
16283
+ "type": "string",
16284
+ "description": "Why it has its status, at most 500 characters"
16285
+ },
16286
+ "evidence": {
16287
+ "type": "object",
16288
+ "properties": {
16289
+ "attachments": {
16290
+ "type": "integer",
16291
+ "minimum": 0,
16292
+ "maximum": 9007199254740991
16293
+ },
16294
+ "steps": {
16295
+ "type": "integer",
16296
+ "minimum": 0,
16297
+ "maximum": 9007199254740991
16298
+ },
16299
+ "annotations": {
16300
+ "type": "integer",
16301
+ "minimum": 0,
16302
+ "maximum": 9007199254740991
16303
+ },
16304
+ "attempts": {
16305
+ "type": "integer",
16306
+ "minimum": 0,
16307
+ "maximum": 9007199254740991
16308
+ },
16309
+ "links": {
16310
+ "type": "integer",
16311
+ "minimum": 0,
16312
+ "maximum": 9007199254740991
16313
+ },
16314
+ "tags": {
16315
+ "type": "array",
16316
+ "items": {
16317
+ "type": "string"
16318
+ }
16319
+ },
16320
+ "artifactTags": {
16321
+ "description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
16322
+ "type": "array",
16323
+ "items": {
16324
+ "type": "string"
16325
+ }
16326
+ },
16327
+ "labels": {
16328
+ "type": "object",
16329
+ "propertyNames": {
16330
+ "type": "string"
16331
+ },
16332
+ "additionalProperties": {
16333
+ "type": "string"
16334
+ }
16335
+ },
16336
+ "roles": {
16337
+ "type": "array",
16338
+ "items": {
16339
+ "type": "string"
16340
+ }
16341
+ },
16342
+ "videos": {
16343
+ "description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
16344
+ "type": "array",
16345
+ "items": {
16346
+ "type": "object",
16347
+ "properties": {
16348
+ "name": {
16349
+ "type": "string",
16350
+ "description": "The attachment name"
16351
+ },
16352
+ "owner": {
16353
+ "type": "string",
16354
+ "description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
16355
+ },
16356
+ "attempt": {
16357
+ "description": "The retry attempt that holds it, or that holds the step that does",
16358
+ "type": "integer",
16359
+ "minimum": 0,
16360
+ "maximum": 9007199254740991
16361
+ },
16362
+ "step": {
16363
+ "description": "The name of the step that holds it",
16364
+ "type": "string"
16365
+ },
16366
+ "tags": {
16367
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
16368
+ "type": "array",
16369
+ "items": {
16370
+ "type": "string"
16371
+ }
16372
+ },
16373
+ "recording": {
16374
+ "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
16375
+ "type": "string"
16376
+ },
16377
+ "available": {
16378
+ "type": "boolean",
16379
+ "description": "False when the reference names no bytes (no bundle key, address or inline text)"
16380
+ }
16381
+ },
16382
+ "required": [
16383
+ "name",
16384
+ "owner",
16385
+ "available"
16386
+ ],
16387
+ "additionalProperties": {}
16388
+ }
16389
+ }
16390
+ },
16391
+ "required": [
16392
+ "attachments",
16393
+ "steps",
16394
+ "annotations",
16395
+ "attempts",
16396
+ "links",
16397
+ "tags",
16398
+ "labels",
16399
+ "roles"
16400
+ ],
16401
+ "additionalProperties": {}
16402
+ }
16403
+ },
16404
+ "required": [
16405
+ "at",
16406
+ "status",
16407
+ "durationMs",
16408
+ "environment",
16409
+ "producer",
16410
+ "kind",
16411
+ "parameters",
16412
+ "branch",
16413
+ "sha",
16414
+ "runUrl",
16415
+ "run",
16416
+ "layer",
16417
+ "backend",
16418
+ "detail"
16419
+ ],
16420
+ "additionalProperties": {}
16421
+ }
16422
+ }
16423
+ },
16424
+ "required": [
16425
+ "schemaVersion",
16426
+ "version",
16427
+ "test",
16428
+ "history"
16429
+ ],
16430
+ "additionalProperties": {}
16431
+ },
16432
+ "RunList": {
16433
+ "type": "object",
16434
+ "properties": {
16435
+ "schemaVersion": {
16436
+ "type": "number",
16437
+ "const": 1
15461
16438
  },
15462
- "history": {
16439
+ "version": {
16440
+ "type": "string"
16441
+ },
16442
+ "total": {
16443
+ "type": "integer",
16444
+ "minimum": 0,
16445
+ "maximum": 9007199254740991,
16446
+ "description": "Runs that matched, before `limit`"
16447
+ },
16448
+ "runs": {
15463
16449
  "type": "array",
15464
16450
  "items": {
15465
16451
  "type": "object",
15466
16452
  "properties": {
15467
- "at": {
15468
- "type": "number",
15469
- "description": "When it was recorded, epoch milliseconds"
16453
+ "key": {
16454
+ "type": "string",
16455
+ "description": "`run:<id>` for an execution a producer named, else the run URL, else `branch@sha`. Pass it to `/api/reports/runs/detail?key=` or `/api/reports/tests?run=`"
15470
16456
  },
15471
- "status": {
16457
+ "runId": {
16458
+ "description": "The execution id the producer named, when it did. Layers that share it are one run however many uploads they took",
16459
+ "type": "string"
16460
+ },
16461
+ "title": {
16462
+ "description": "The human title of the execution (the newest layer's). Presentation only: the key, commit and `freshness` are unaffected",
16463
+ "type": "string"
16464
+ },
16465
+ "freshness": {
16466
+ "description": "`modified` when any layer of the run was recorded from a checkout with uncommitted changes; `unknown` when an origin was not captured; absent when all are clean. Shown beside the commit, never replaced by the title",
15472
16467
  "type": "string",
15473
16468
  "enum": [
15474
- "passed",
15475
- "failed",
15476
- "running",
15477
- "not-run"
16469
+ "unknown",
16470
+ "modified"
15478
16471
  ]
15479
16472
  },
15480
- "durationMs": {
15481
- "description": "How long it took, or null when the producer did not measure it",
16473
+ "runUrl": {
15482
16474
  "type": [
15483
- "number",
16475
+ "string",
15484
16476
  "null"
15485
16477
  ]
15486
16478
  },
15487
- "environment": {
15488
- "description": "The client it checked, such as `desktop-web` or `ios`",
16479
+ "branch": {
15489
16480
  "type": [
15490
16481
  "string",
15491
16482
  "null"
15492
16483
  ]
15493
16484
  },
15494
- "producer": {
15495
- "type": "string"
16485
+ "sha": {
16486
+ "type": [
16487
+ "string",
16488
+ "null"
16489
+ ]
15496
16490
  },
15497
- "kind": {
15498
- "type": "string"
16491
+ "startedAtMs": {
16492
+ "type": "number"
15499
16493
  },
15500
- "parameters": {
15501
- "type": "object",
15502
- "propertyNames": {
16494
+ "endedAtMs": {
16495
+ "type": "number"
16496
+ },
16497
+ "spanMs": {
16498
+ "type": "number"
16499
+ },
16500
+ "producers": {
16501
+ "type": "array",
16502
+ "items": {
15503
16503
  "type": "string"
15504
- },
15505
- "additionalProperties": {
16504
+ }
16505
+ },
16506
+ "environments": {
16507
+ "type": "array",
16508
+ "items": {
15506
16509
  "type": "string"
15507
16510
  }
15508
16511
  },
15509
- "branch": {
15510
- "type": [
15511
- "string",
15512
- "null"
15513
- ]
16512
+ "layers": {
16513
+ "type": "integer",
16514
+ "minimum": 0,
16515
+ "maximum": 9007199254740991
15514
16516
  },
15515
- "sha": {
15516
- "type": [
15517
- "string",
15518
- "null"
16517
+ "tests": {
16518
+ "type": "integer",
16519
+ "minimum": 0,
16520
+ "maximum": 9007199254740991
16521
+ },
16522
+ "counts": {
16523
+ "type": "object",
16524
+ "propertyNames": {
16525
+ "type": "string",
16526
+ "enum": [
16527
+ "passed",
16528
+ "failed",
16529
+ "running",
16530
+ "not-run"
16531
+ ]
16532
+ },
16533
+ "additionalProperties": {
16534
+ "type": "integer",
16535
+ "minimum": 0,
16536
+ "maximum": 9007199254740991
16537
+ },
16538
+ "required": [
16539
+ "passed",
16540
+ "failed",
16541
+ "running",
16542
+ "not-run"
15519
16543
  ]
15520
16544
  },
15521
- "runUrl": {
16545
+ "totalDurationMs": {
15522
16546
  "type": [
15523
- "string",
16547
+ "number",
15524
16548
  "null"
15525
16549
  ]
15526
16550
  },
15527
- "run": {
15528
- "type": "string",
15529
- "description": "The key of the run it belongs to, as `GET /api/reports/runs` lists it"
16551
+ "failing": {
16552
+ "type": "array",
16553
+ "items": {
16554
+ "type": "object",
16555
+ "properties": {
16556
+ "key": {
16557
+ "type": "string"
16558
+ },
16559
+ "title": {
16560
+ "type": "string"
16561
+ },
16562
+ "environment": {
16563
+ "type": [
16564
+ "string",
16565
+ "null"
16566
+ ]
16567
+ },
16568
+ "detail": {
16569
+ "type": "string"
16570
+ }
16571
+ },
16572
+ "required": [
16573
+ "key",
16574
+ "title",
16575
+ "environment",
16576
+ "detail"
16577
+ ],
16578
+ "additionalProperties": {}
16579
+ }
15530
16580
  },
15531
- "layer": {
15532
- "type": "string",
15533
- "description": "The id of the layer that recorded it"
16581
+ "videos": {
16582
+ "description": "Its videos, from its layers and the last result of each test. Absent when it has none or the report carries no video information",
16583
+ "type": "object",
16584
+ "properties": {
16585
+ "references": {
16586
+ "type": "integer",
16587
+ "minimum": 0,
16588
+ "maximum": 9007199254740991,
16589
+ "description": "Every reference to a video; identical bytes referenced twice count twice"
16590
+ },
16591
+ "recordings": {
16592
+ "type": "integer",
16593
+ "minimum": 0,
16594
+ "maximum": 9007199254740991,
16595
+ "description": "Distinct playable recordings"
16596
+ },
16597
+ "unavailable": {
16598
+ "type": "integer",
16599
+ "minimum": 0,
16600
+ "maximum": 9007199254740991,
16601
+ "description": "References that name no bytes"
16602
+ }
16603
+ },
16604
+ "required": [
16605
+ "references",
16606
+ "recordings",
16607
+ "unavailable"
16608
+ ],
16609
+ "additionalProperties": {}
15534
16610
  },
15535
- "backend": {
15536
- "type": "string"
16611
+ "artifactTags": {
16612
+ "description": "The normalized tags of the attachments of its results, sorted and distinct. Absent when none is tagged, and in reports of older servers",
16613
+ "type": "array",
16614
+ "items": {
16615
+ "type": "string"
16616
+ }
15537
16617
  },
15538
- "detail": {
15539
- "type": "string",
15540
- "description": "Why it has its status, at most 500 characters"
16618
+ "tags": {
16619
+ "description": "The tags of its checks and layers, which its attachments inherit (what `inherited=1` also matches). Absent when none",
16620
+ "type": "array",
16621
+ "items": {
16622
+ "type": "string"
16623
+ }
15541
16624
  },
15542
- "evidence": {
16625
+ "types": {
16626
+ "description": "The media types (roles) of its attachments, sorted and distinct; `video` only for a playable recording. Absent when it has no attachment",
16627
+ "type": "array",
16628
+ "items": {
16629
+ "type": "string"
16630
+ }
16631
+ },
16632
+ "labels": {
16633
+ "description": "The `key=value` labels of its results and layers, sorted and distinct. Absent when it has none",
16634
+ "type": "array",
16635
+ "items": {
16636
+ "type": "string"
16637
+ }
16638
+ }
16639
+ },
16640
+ "required": [
16641
+ "key",
16642
+ "runUrl",
16643
+ "branch",
16644
+ "sha",
16645
+ "startedAtMs",
16646
+ "endedAtMs",
16647
+ "spanMs",
16648
+ "producers",
16649
+ "environments",
16650
+ "layers",
16651
+ "tests",
16652
+ "counts",
16653
+ "totalDurationMs",
16654
+ "failing"
16655
+ ],
16656
+ "additionalProperties": {}
16657
+ }
16658
+ },
16659
+ "withVideo": {
16660
+ "description": "How many of all runs (before `video` and `limit`) have a playable video recording",
16661
+ "type": "integer",
16662
+ "minimum": 0,
16663
+ "maximum": 9007199254740991
16664
+ },
16665
+ "filters": {
16666
+ "description": "The filter parameters this server applied (`artifactTag`, `type`, `outcome`…). A viewer that asked for one that is missing here knows the server ignored it. Absent on servers that predate filtering",
16667
+ "type": "array",
16668
+ "items": {
16669
+ "type": "string"
16670
+ }
16671
+ },
16672
+ "facets": {
16673
+ "description": "The values each filter dimension offers, counted over every run. Absent on servers that predate filtering",
16674
+ "type": "object",
16675
+ "properties": {
16676
+ "artifactTags": {
16677
+ "type": "array",
16678
+ "items": {
15543
16679
  "type": "object",
15544
16680
  "properties": {
15545
- "attachments": {
16681
+ "value": {
16682
+ "type": "string"
16683
+ },
16684
+ "count": {
15546
16685
  "type": "integer",
15547
16686
  "minimum": 0,
15548
16687
  "maximum": 9007199254740991
16688
+ }
16689
+ },
16690
+ "required": [
16691
+ "value",
16692
+ "count"
16693
+ ],
16694
+ "additionalProperties": {}
16695
+ }
16696
+ },
16697
+ "types": {
16698
+ "type": "array",
16699
+ "items": {
16700
+ "type": "object",
16701
+ "properties": {
16702
+ "value": {
16703
+ "type": "string"
15549
16704
  },
15550
- "steps": {
16705
+ "count": {
15551
16706
  "type": "integer",
15552
16707
  "minimum": 0,
15553
16708
  "maximum": 9007199254740991
16709
+ }
16710
+ },
16711
+ "required": [
16712
+ "value",
16713
+ "count"
16714
+ ],
16715
+ "additionalProperties": {}
16716
+ }
16717
+ },
16718
+ "labels": {
16719
+ "type": "array",
16720
+ "items": {
16721
+ "type": "object",
16722
+ "properties": {
16723
+ "value": {
16724
+ "type": "string"
15554
16725
  },
15555
- "annotations": {
16726
+ "count": {
15556
16727
  "type": "integer",
15557
16728
  "minimum": 0,
15558
16729
  "maximum": 9007199254740991
16730
+ }
16731
+ },
16732
+ "required": [
16733
+ "value",
16734
+ "count"
16735
+ ],
16736
+ "additionalProperties": {}
16737
+ },
16738
+ "description": "Values are `key=value`"
16739
+ },
16740
+ "environments": {
16741
+ "type": "array",
16742
+ "items": {
16743
+ "type": "object",
16744
+ "properties": {
16745
+ "value": {
16746
+ "type": "string"
15559
16747
  },
15560
- "attempts": {
16748
+ "count": {
15561
16749
  "type": "integer",
15562
16750
  "minimum": 0,
15563
16751
  "maximum": 9007199254740991
16752
+ }
16753
+ },
16754
+ "required": [
16755
+ "value",
16756
+ "count"
16757
+ ],
16758
+ "additionalProperties": {}
16759
+ }
16760
+ },
16761
+ "producers": {
16762
+ "type": "array",
16763
+ "items": {
16764
+ "type": "object",
16765
+ "properties": {
16766
+ "value": {
16767
+ "type": "string"
15564
16768
  },
15565
- "links": {
16769
+ "count": {
15566
16770
  "type": "integer",
15567
16771
  "minimum": 0,
15568
16772
  "maximum": 9007199254740991
16773
+ }
16774
+ },
16775
+ "required": [
16776
+ "value",
16777
+ "count"
16778
+ ],
16779
+ "additionalProperties": {}
16780
+ }
16781
+ },
16782
+ "branches": {
16783
+ "type": "array",
16784
+ "items": {
16785
+ "type": "object",
16786
+ "properties": {
16787
+ "value": {
16788
+ "type": "string"
15569
16789
  },
15570
- "tags": {
15571
- "type": "array",
15572
- "items": {
15573
- "type": "string"
15574
- }
15575
- },
15576
- "artifactTags": {
15577
- "description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
15578
- "type": "array",
15579
- "items": {
15580
- "type": "string"
15581
- }
15582
- },
15583
- "labels": {
15584
- "type": "object",
15585
- "propertyNames": {
15586
- "type": "string"
15587
- },
15588
- "additionalProperties": {
15589
- "type": "string"
15590
- }
15591
- },
15592
- "roles": {
15593
- "type": "array",
15594
- "items": {
15595
- "type": "string"
15596
- }
16790
+ "count": {
16791
+ "type": "integer",
16792
+ "minimum": 0,
16793
+ "maximum": 9007199254740991
16794
+ }
16795
+ },
16796
+ "required": [
16797
+ "value",
16798
+ "count"
16799
+ ],
16800
+ "additionalProperties": {}
16801
+ }
16802
+ },
16803
+ "outcomes": {
16804
+ "type": "array",
16805
+ "items": {
16806
+ "type": "object",
16807
+ "properties": {
16808
+ "value": {
16809
+ "type": "string"
15597
16810
  },
15598
- "videos": {
15599
- "description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
15600
- "type": "array",
15601
- "items": {
15602
- "type": "object",
15603
- "properties": {
15604
- "name": {
15605
- "type": "string",
15606
- "description": "The attachment name"
15607
- },
15608
- "owner": {
15609
- "type": "string",
15610
- "description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
15611
- },
15612
- "attempt": {
15613
- "description": "The retry attempt that holds it, or that holds the step that does",
15614
- "type": "integer",
15615
- "minimum": 0,
15616
- "maximum": 9007199254740991
15617
- },
15618
- "step": {
15619
- "description": "The name of the step that holds it",
15620
- "type": "string"
15621
- },
15622
- "recording": {
15623
- "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
15624
- "type": "string"
15625
- },
15626
- "available": {
15627
- "type": "boolean",
15628
- "description": "False when the reference names no bytes (no bundle key, address or inline text)"
15629
- }
15630
- },
15631
- "required": [
15632
- "name",
15633
- "owner",
15634
- "available"
15635
- ],
15636
- "additionalProperties": {}
15637
- }
16811
+ "count": {
16812
+ "type": "integer",
16813
+ "minimum": 0,
16814
+ "maximum": 9007199254740991
16815
+ }
16816
+ },
16817
+ "required": [
16818
+ "value",
16819
+ "count"
16820
+ ],
16821
+ "additionalProperties": {}
16822
+ }
16823
+ },
16824
+ "domains": {
16825
+ "description": "Only for artifacts: runs have no domain",
16826
+ "type": "array",
16827
+ "items": {
16828
+ "type": "object",
16829
+ "properties": {
16830
+ "value": {
16831
+ "type": "string"
16832
+ },
16833
+ "count": {
16834
+ "type": "integer",
16835
+ "minimum": 0,
16836
+ "maximum": 9007199254740991
15638
16837
  }
15639
16838
  },
15640
16839
  "required": [
15641
- "attachments",
15642
- "steps",
15643
- "annotations",
15644
- "attempts",
15645
- "links",
15646
- "tags",
15647
- "labels",
15648
- "roles"
16840
+ "value",
16841
+ "count"
15649
16842
  ],
15650
16843
  "additionalProperties": {}
15651
16844
  }
15652
- },
15653
- "required": [
15654
- "at",
15655
- "status",
15656
- "durationMs",
15657
- "environment",
15658
- "producer",
15659
- "kind",
15660
- "parameters",
15661
- "branch",
15662
- "sha",
15663
- "runUrl",
15664
- "run",
15665
- "layer",
15666
- "backend",
15667
- "detail"
15668
- ],
15669
- "additionalProperties": {}
15670
- }
16845
+ }
16846
+ },
16847
+ "required": [
16848
+ "artifactTags",
16849
+ "types",
16850
+ "labels",
16851
+ "environments",
16852
+ "producers",
16853
+ "branches",
16854
+ "outcomes"
16855
+ ],
16856
+ "additionalProperties": {}
15671
16857
  }
15672
16858
  },
15673
16859
  "required": [
15674
16860
  "schemaVersion",
15675
16861
  "version",
15676
- "test",
15677
- "history"
16862
+ "total",
16863
+ "runs"
15678
16864
  ],
15679
16865
  "additionalProperties": {}
15680
16866
  },
15681
- "RunList": {
16867
+ "ArtifactList": {
15682
16868
  "type": "object",
15683
16869
  "properties": {
15684
16870
  "schemaVersion": {
@@ -15692,39 +16878,79 @@
15692
16878
  "type": "integer",
15693
16879
  "minimum": 0,
15694
16880
  "maximum": 9007199254740991,
15695
- "description": "Runs that matched, before `limit`"
16881
+ "description": "Results that matched, before `offset` and `limit`"
15696
16882
  },
15697
- "runs": {
16883
+ "offset": {
16884
+ "type": "integer",
16885
+ "minimum": 0,
16886
+ "maximum": 9007199254740991
16887
+ },
16888
+ "limit": {
16889
+ "type": "integer",
16890
+ "minimum": 0,
16891
+ "maximum": 9007199254740991
16892
+ },
16893
+ "results": {
15698
16894
  "type": "array",
15699
16895
  "items": {
15700
16896
  "type": "object",
15701
16897
  "properties": {
15702
16898
  "key": {
15703
16899
  "type": "string",
15704
- "description": "`run:<id>` for an execution a producer named, else the run URL, else `branch@sha`. Pass it to `/api/reports/runs/detail?key=` or `/api/reports/tests?run=`"
16900
+ "description": "The test's key, as in `/api/reports/tests`"
15705
16901
  },
15706
- "runId": {
15707
- "description": "The execution id the producer named, when it did. Layers that share it are one run however many uploads they took",
16902
+ "id": {
15708
16903
  "type": "string"
15709
16904
  },
15710
16905
  "title": {
15711
- "description": "The human title of the execution (the newest layer's). Presentation only: the key, commit and `freshness` are unaffected",
15712
16906
  "type": "string"
15713
16907
  },
15714
- "freshness": {
15715
- "description": "`modified` when any layer of the run was recorded from a checkout with uncommitted changes; `unknown` when an origin was not captured; absent when all are clean. Shown beside the commit, never replaced by the title",
16908
+ "specPath": {
16909
+ "type": [
16910
+ "string",
16911
+ "null"
16912
+ ]
16913
+ },
16914
+ "domain": {
16915
+ "type": [
16916
+ "string",
16917
+ "null"
16918
+ ]
16919
+ },
16920
+ "at": {
16921
+ "type": "number",
16922
+ "description": "When it was recorded, epoch milliseconds"
16923
+ },
16924
+ "status": {
15716
16925
  "type": "string",
15717
16926
  "enum": [
15718
- "unknown",
15719
- "modified"
16927
+ "passed",
16928
+ "failed",
16929
+ "running",
16930
+ "not-run"
15720
16931
  ]
15721
16932
  },
15722
- "runUrl": {
16933
+ "environment": {
15723
16934
  "type": [
15724
16935
  "string",
15725
16936
  "null"
15726
16937
  ]
15727
16938
  },
16939
+ "producer": {
16940
+ "type": "string"
16941
+ },
16942
+ "kind": {
16943
+ "type": "string"
16944
+ },
16945
+ "parameters": {
16946
+ "type": "object",
16947
+ "propertyNames": {
16948
+ "type": "string"
16949
+ },
16950
+ "additionalProperties": {
16951
+ "type": "string"
16952
+ }
16953
+ },
15728
16954
  "branch": {
15729
16955
  "type": [
15730
16956
  "string",
@@ -15737,158 +16963,335 @@
15737
16963
  "null"
15738
16964
  ]
15739
16965
  },
15740
- "startedAtMs": {
15741
- "type": "number"
16966
+ "run": {
16967
+ "type": "string",
16968
+ "description": "The run's key, as in `/api/reports/runs`"
15742
16969
  },
15743
- "endedAtMs": {
15744
- "type": "number"
16970
+ "runUrl": {
16971
+ "type": [
16972
+ "string",
16973
+ "null"
16974
+ ]
15745
16975
  },
15746
- "spanMs": {
15747
- "type": "number"
16976
+ "layer": {
16977
+ "type": "string",
16978
+ "description": "The id of the layer that recorded it. Pass it as the `layer` of the explorer to see exactly this result"
15748
16979
  },
15749
- "producers": {
16980
+ "backend": {
16981
+ "type": "string"
16982
+ },
16983
+ "attachments": {
16984
+ "type": "integer",
16985
+ "minimum": 0,
16986
+ "maximum": 9007199254740991
16987
+ },
16988
+ "artifactTags": {
15750
16989
  "type": "array",
15751
16990
  "items": {
15752
16991
  "type": "string"
15753
- }
16992
+ },
16993
+ "description": "Normalized tags of its attachments"
15754
16994
  },
15755
- "environments": {
16995
+ "tags": {
15756
16996
  "type": "array",
15757
16997
  "items": {
15758
16998
  "type": "string"
15759
- }
16999
+ },
17000
+ "description": "Tags of its check and run, which its attachments inherit"
15760
17001
  },
15761
- "layers": {
15762
- "type": "integer",
15763
- "minimum": 0,
15764
- "maximum": 9007199254740991
17002
+ "types": {
17003
+ "type": "array",
17004
+ "items": {
17005
+ "type": "string"
17006
+ },
17007
+ "description": "Media types (roles) of its attachments; `video` only for a playable recording"
15765
17008
  },
15766
- "tests": {
15767
- "type": "integer",
15768
- "minimum": 0,
15769
- "maximum": 9007199254740991
17009
+ "labels": {
17010
+ "type": "object",
17011
+ "propertyNames": {
17012
+ "type": "string"
17013
+ },
17014
+ "additionalProperties": {
17015
+ "type": "string"
17016
+ }
15770
17017
  },
15771
- "counts": {
17018
+ "videos": {
17019
+ "type": "array",
17020
+ "items": {
17021
+ "type": "object",
17022
+ "properties": {
17023
+ "name": {
17024
+ "type": "string",
17025
+ "description": "The attachment name"
17026
+ },
17027
+ "owner": {
17028
+ "type": "string",
17029
+ "description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
17030
+ },
17031
+ "attempt": {
17032
+ "description": "The retry attempt that holds it, or that holds the step that does",
17033
+ "type": "integer",
17034
+ "minimum": 0,
17035
+ "maximum": 9007199254740991
17036
+ },
17037
+ "step": {
17038
+ "description": "The name of the step that holds it",
17039
+ "type": "string"
17040
+ },
17041
+ "tags": {
17042
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
17043
+ "type": "array",
17044
+ "items": {
17045
+ "type": "string"
17046
+ }
17047
+ },
17048
+ "recording": {
17049
+ "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
17050
+ "type": "string"
17051
+ },
17052
+ "available": {
17053
+ "type": "boolean",
17054
+ "description": "False when the reference names no bytes (no bundle key, address or inline text)"
17055
+ }
17056
+ },
17057
+ "required": [
17058
+ "name",
17059
+ "owner",
17060
+ "available"
17061
+ ],
17062
+ "additionalProperties": {}
17063
+ }
17064
+ }
17065
+ },
17066
+ "required": [
17067
+ "key",
17068
+ "id",
17069
+ "title",
17070
+ "specPath",
17071
+ "domain",
17072
+ "at",
17073
+ "status",
17074
+ "environment",
17075
+ "producer",
17076
+ "kind",
17077
+ "parameters",
17078
+ "branch",
17079
+ "sha",
17080
+ "run",
17081
+ "runUrl",
17082
+ "layer",
17083
+ "backend",
17084
+ "attachments",
17085
+ "artifactTags",
17086
+ "tags",
17087
+ "types",
17088
+ "labels"
17089
+ ],
17090
+ "additionalProperties": {}
17091
+ }
17092
+ },
17093
+ "filters": {
17094
+ "type": "array",
17095
+ "items": {
17096
+ "type": "string"
17097
+ },
17098
+ "description": "The filters of the query that were applied"
17099
+ },
17100
+ "facets": {
17101
+ "type": "object",
17102
+ "properties": {
17103
+ "artifactTags": {
17104
+ "type": "array",
17105
+ "items": {
17106
+ "type": "object",
17107
+ "properties": {
17108
+ "value": {
17109
+ "type": "string"
17110
+ },
17111
+ "count": {
17112
+ "type": "integer",
17113
+ "minimum": 0,
17114
+ "maximum": 9007199254740991
17115
+ }
17116
+ },
17117
+ "required": [
17118
+ "value",
17119
+ "count"
17120
+ ],
17121
+ "additionalProperties": {}
17122
+ }
17123
+ },
17124
+ "types": {
17125
+ "type": "array",
17126
+ "items": {
15772
17127
  "type": "object",
15773
- "propertyNames": {
15774
- "type": "string",
15775
- "enum": [
15776
- "passed",
15777
- "failed",
15778
- "running",
15779
- "not-run"
15780
- ]
17128
+ "properties": {
17129
+ "value": {
17130
+ "type": "string"
17131
+ },
17132
+ "count": {
17133
+ "type": "integer",
17134
+ "minimum": 0,
17135
+ "maximum": 9007199254740991
17136
+ }
15781
17137
  },
15782
- "additionalProperties": {
15783
- "type": "integer",
15784
- "minimum": 0,
15785
- "maximum": 9007199254740991
17138
+ "required": [
17139
+ "value",
17140
+ "count"
17141
+ ],
17142
+ "additionalProperties": {}
17143
+ }
17144
+ },
17145
+ "labels": {
17146
+ "type": "array",
17147
+ "items": {
17148
+ "type": "object",
17149
+ "properties": {
17150
+ "value": {
17151
+ "type": "string"
17152
+ },
17153
+ "count": {
17154
+ "type": "integer",
17155
+ "minimum": 0,
17156
+ "maximum": 9007199254740991
17157
+ }
15786
17158
  },
15787
17159
  "required": [
15788
- "passed",
15789
- "failed",
15790
- "running",
15791
- "not-run"
15792
- ]
15793
- },
15794
- "totalDurationMs": {
15795
- "type": [
15796
- "number",
15797
- "null"
15798
- ]
17160
+ "value",
17161
+ "count"
17162
+ ],
17163
+ "additionalProperties": {}
15799
17164
  },
15800
- "failing": {
15801
- "type": "array",
15802
- "items": {
15803
- "type": "object",
15804
- "properties": {
15805
- "key": {
15806
- "type": "string"
15807
- },
15808
- "title": {
15809
- "type": "string"
15810
- },
15811
- "environment": {
15812
- "type": [
15813
- "string",
15814
- "null"
15815
- ]
15816
- },
15817
- "detail": {
15818
- "type": "string"
15819
- }
17165
+ "description": "Values are `key=value`"
17166
+ },
17167
+ "environments": {
17168
+ "type": "array",
17169
+ "items": {
17170
+ "type": "object",
17171
+ "properties": {
17172
+ "value": {
17173
+ "type": "string"
15820
17174
  },
15821
- "required": [
15822
- "key",
15823
- "title",
15824
- "environment",
15825
- "detail"
15826
- ],
15827
- "additionalProperties": {}
15828
- }
15829
- },
15830
- "videos": {
15831
- "description": "Its videos, from its layers and the last result of each test. Absent when it has none or the report carries no video information",
17175
+ "count": {
17176
+ "type": "integer",
17177
+ "minimum": 0,
17178
+ "maximum": 9007199254740991
17179
+ }
17180
+ },
17181
+ "required": [
17182
+ "value",
17183
+ "count"
17184
+ ],
17185
+ "additionalProperties": {}
17186
+ }
17187
+ },
17188
+ "producers": {
17189
+ "type": "array",
17190
+ "items": {
15832
17191
  "type": "object",
15833
17192
  "properties": {
15834
- "references": {
17193
+ "value": {
17194
+ "type": "string"
17195
+ },
17196
+ "count": {
15835
17197
  "type": "integer",
15836
17198
  "minimum": 0,
15837
- "maximum": 9007199254740991,
15838
- "description": "Every reference to a video; identical bytes referenced twice count twice"
17199
+ "maximum": 9007199254740991
17200
+ }
17201
+ },
17202
+ "required": [
17203
+ "value",
17204
+ "count"
17205
+ ],
17206
+ "additionalProperties": {}
17207
+ }
17208
+ },
17209
+ "branches": {
17210
+ "type": "array",
17211
+ "items": {
17212
+ "type": "object",
17213
+ "properties": {
17214
+ "value": {
17215
+ "type": "string"
15839
17216
  },
15840
- "recordings": {
17217
+ "count": {
15841
17218
  "type": "integer",
15842
17219
  "minimum": 0,
15843
- "maximum": 9007199254740991,
15844
- "description": "Distinct playable recordings"
17220
+ "maximum": 9007199254740991
17221
+ }
17222
+ },
17223
+ "required": [
17224
+ "value",
17225
+ "count"
17226
+ ],
17227
+ "additionalProperties": {}
17228
+ }
17229
+ },
17230
+ "outcomes": {
17231
+ "type": "array",
17232
+ "items": {
17233
+ "type": "object",
17234
+ "properties": {
17235
+ "value": {
17236
+ "type": "string"
15845
17237
  },
15846
- "unavailable": {
17238
+ "count": {
15847
17239
  "type": "integer",
15848
17240
  "minimum": 0,
15849
- "maximum": 9007199254740991,
15850
- "description": "References that name no bytes"
17241
+ "maximum": 9007199254740991
15851
17242
  }
15852
17243
  },
15853
17244
  "required": [
15854
- "references",
15855
- "recordings",
15856
- "unavailable"
17245
+ "value",
17246
+ "count"
15857
17247
  ],
15858
17248
  "additionalProperties": {}
15859
17249
  }
15860
17250
  },
15861
- "required": [
15862
- "key",
15863
- "runUrl",
15864
- "branch",
15865
- "sha",
15866
- "startedAtMs",
15867
- "endedAtMs",
15868
- "spanMs",
15869
- "producers",
15870
- "environments",
15871
- "layers",
15872
- "tests",
15873
- "counts",
15874
- "totalDurationMs",
15875
- "failing"
15876
- ],
15877
- "additionalProperties": {}
15878
- }
15879
- },
15880
- "withVideo": {
15881
- "description": "How many of all runs (before `video` and `limit`) have a playable video recording",
15882
- "type": "integer",
15883
- "minimum": 0,
15884
- "maximum": 9007199254740991
17251
+ "domains": {
17252
+ "description": "Only for artifacts: runs have no domain",
17253
+ "type": "array",
17254
+ "items": {
17255
+ "type": "object",
17256
+ "properties": {
17257
+ "value": {
17258
+ "type": "string"
17259
+ },
17260
+ "count": {
17261
+ "type": "integer",
17262
+ "minimum": 0,
17263
+ "maximum": 9007199254740991
17264
+ }
17265
+ },
17266
+ "required": [
17267
+ "value",
17268
+ "count"
17269
+ ],
17270
+ "additionalProperties": {}
17271
+ }
17272
+ }
17273
+ },
17274
+ "required": [
17275
+ "artifactTags",
17276
+ "types",
17277
+ "labels",
17278
+ "environments",
17279
+ "producers",
17280
+ "branches",
17281
+ "outcomes"
17282
+ ],
17283
+ "additionalProperties": {}
15885
17284
  }
15886
17285
  },
15887
17286
  "required": [
15888
17287
  "schemaVersion",
15889
17288
  "version",
15890
17289
  "total",
15891
- "runs"
17290
+ "offset",
17291
+ "limit",
17292
+ "results",
17293
+ "filters",
17294
+ "facets"
15892
17295
  ],
15893
17296
  "additionalProperties": {}
15894
17297
  },
@@ -16062,6 +17465,34 @@
16062
17465
  "unavailable"
16063
17466
  ],
16064
17467
  "additionalProperties": {}
17468
+ },
17469
+ "artifactTags": {
17470
+ "description": "The normalized tags of the attachments of its results, sorted and distinct. Absent when none is tagged, and in reports of older servers",
17471
+ "type": "array",
17472
+ "items": {
17473
+ "type": "string"
17474
+ }
17475
+ },
17476
+ "tags": {
17477
+ "description": "The tags of its checks and layers, which its attachments inherit (what `inherited=1` also matches). Absent when none",
17478
+ "type": "array",
17479
+ "items": {
17480
+ "type": "string"
17481
+ }
17482
+ },
17483
+ "types": {
17484
+ "description": "The media types (roles) of its attachments, sorted and distinct; `video` only for a playable recording. Absent when it has no attachment",
17485
+ "type": "array",
17486
+ "items": {
17487
+ "type": "string"
17488
+ }
17489
+ },
17490
+ "labels": {
17491
+ "description": "The `key=value` labels of its results and layers, sorted and distinct. Absent when it has none",
17492
+ "type": "array",
17493
+ "items": {
17494
+ "type": "string"
17495
+ }
16065
17496
  }
16066
17497
  },
16067
17498
  "required": [
@@ -16159,6 +17590,13 @@
16159
17590
  "description": "The name of the step that holds it",
16160
17591
  "type": "string"
16161
17592
  },
17593
+ "tags": {
17594
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
17595
+ "type": "array",
17596
+ "items": {
17597
+ "type": "string"
17598
+ }
17599
+ },
16162
17600
  "recording": {
16163
17601
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
16164
17602
  "type": "string"