@crvouga/atlas 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/reports/src/artifact-tag-store.d.ts +20 -0
- package/dist/reports/src/artifact-tag-store.js +70 -0
- package/dist/reports/src/artifact-tags.d.ts +96 -0
- package/dist/reports/src/artifact-tags.js +96 -0
- package/dist/reports/src/evidence-detail.d.ts +20 -3
- package/dist/reports/src/evidence-detail.js +66 -13
- package/dist/reports/src/evidence-types.d.ts +33 -0
- package/dist/reports/src/layer-merge.js +2 -2
- package/dist/reports/src/reports-explorer-route.d.ts +8 -0
- package/dist/reports/src/reports-route.d.ts +8 -0
- package/dist/reports/src/test-catalog.d.ts +35 -26
- package/dist/reports/src/test-catalog.js +79 -15
- package/dist/schema/src/api.d.ts +246 -0
- package/dist/schema/src/api.js +59 -5
- package/dist/schema/src/layer.d.ts +33 -0
- package/dist/schema/src/layer.js +11 -1
- package/dist/server/src/app.js +35 -3
- package/dist/server/src/llms.js +2 -1
- package/dist/server/src/openapi.d.ts +1 -1
- package/dist/server/src/openapi.js +20 -3
- package/docs/extending.md +3 -0
- package/docs/reference/http-api.md +52 -2
- package/docs/reference/reports.md +327 -5
- package/docs/reference/schema.md +48 -0
- package/docs/rich-evidence.md +28 -0
- package/docs/server.md +25 -1
- package/llms-full.txt +108 -3
- package/package.json +1 -1
- package/packages/schema/schemas/check-detail.schema.json +28 -0
- package/packages/schema/schemas/effective-delta.schema.json +96 -0
- package/packages/schema/schemas/effective-evidence.schema.json +96 -0
- package/packages/schema/schemas/evidence-page.schema.json +48 -0
- package/packages/schema/schemas/layer-rows.schema.json +48 -0
- package/packages/schema/schemas/layer.schema.json +70 -0
- package/packages/schema/schemas/publish-checks.schema.json +35 -0
- package/packages/schema/schemas/report-run.schema.json +71 -0
- package/packages/schema/schemas/report-runs.schema.json +38 -1
- package/packages/schema/schemas/test-catalog.schema.json +83 -0
- package/packages/schema/schemas/test-history.schema.json +110 -0
- package/packages/server/openapi.json +1259 -33
- package/packages/visualizer/src/evidence/artifact-tags.tsx +285 -0
- package/packages/visualizer/src/evidence/artifacts.tsx +18 -12
- package/packages/visualizer/src/explorer/RunsView.tsx +128 -10
- package/packages/visualizer/src/explorer/catalog.tsx +16 -6
- package/packages/visualizer/src/explorer/search.ts +4 -1
package/llms-full.txt
CHANGED
|
@@ -1013,6 +1013,7 @@ decided exactly as before ([the report contract](report-contract.md)). Evidence
|
|
|
1013
1013
|
| `steps` (`parentId`, `offsetMs`, `durationMs`, `status`, `kind`) | check, attempt | Draws the check's timeline: nested steps, when each started, how long it took, which one failed. |
|
|
1014
1014
|
| `attempts` | check | Every try of a retried check, with its own status, detail, steps and attachments. A check that passed after failing is flaky. |
|
|
1015
1015
|
| `tags`, `labels` | check, layer | Filters and groups (`smoke`, `flaky`, an owner, a browser). |
|
|
1016
|
+
| `tags` | attachment | Marks one recording or screenshot, for example `demo`: shown as a `#demo` chip, and searchable. See [Tagging artifacts and demos](#tagging-artifacts-and-demos). |
|
|
1016
1017
|
| `annotations`, `links` | check, step, attempt, layer | Notes, warnings and issue links next to the result. |
|
|
1017
1018
|
| `specPath` | check | The spec a check belongs to (a `.feature`, a test file), relative to the repository. Checks are grouped by it. |
|
|
1018
1019
|
| `specs[]` (`path`, `domain`, `kind`, `title`) | layer | Names each spec and its group (`domain`), so a server can group checks by spec with a title even when no [spec set](integrating.md#tell-atlas-which-spec-a-check-belongs-to) has been published. |
|
|
@@ -1021,6 +1022,33 @@ decided exactly as before ([the report contract](report-contract.md)). Evidence
|
|
|
1021
1022
|
Send `sha`, `branch` and `runUrl` on every layer too. They never change a result, but they tie results to a commit
|
|
1022
1023
|
and to the CI run that produced them.
|
|
1023
1024
|
|
|
1025
|
+
## Tagging artifacts and demos
|
|
1026
|
+
|
|
1027
|
+
To mark one recording as a demo, tag the attachment itself. A tag on a check says something about the result; a tag on
|
|
1028
|
+
an attachment says something about that file, and no Gherkin tag, label, environment or producer name is needed:
|
|
1029
|
+
|
|
1030
|
+
```ts
|
|
1031
|
+
{ name: 'checkout.webm', role: 'video', tags: ['demo'], labels: { audience: 'business' } }
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
The viewer shows it as a `#demo` chip on the artifact card. Selecting the chip filters the result's evidence to the
|
|
1035
|
+
attachments with that tag, and says how many match. Tags describe evidence; they never change a status or a slot.
|
|
1036
|
+
|
|
1037
|
+
- **One spelling.** A tag is normalized before it is compared or stored: a leading `#` is dropped, letters are
|
|
1038
|
+
lower-cased, each run of whitespace becomes `-`, and surrounding space is trimmed, so `demo`, `#demo` and `#Demo ` are
|
|
1039
|
+
`demo`. Empty tags and tags over 64 characters are not tags and are ignored (or refused, when a reviewer enters them).
|
|
1040
|
+
Everything else is a valid tag (`team/payments`, `release=2`), and repeats are shown once.
|
|
1041
|
+
- **Inherited.** An attachment is also searchable by the tags of its check and its run. The viewer says `inherited` on
|
|
1042
|
+
such a chip, and a switch decides whether the filter counts them: a recording without a tag of its own under a run
|
|
1043
|
+
tagged `demo` is found by the inherited query and not by the exact one. In the API,
|
|
1044
|
+
`GET /api/reports/tests?artifactTag=demo` is exact and adding `&inherited=1` includes inherited tags.
|
|
1045
|
+
- **Reviewers.** After upload, a person with a publish token can add tags to an attachment (the viewer's *Add tag*
|
|
1046
|
+
button) and remove the ones a reviewer added. Those tags are not written into the layer, which is immutable: the
|
|
1047
|
+
server keeps them as an audit trail (who, when, which tags) and the viewer shows them as `added by <name>`, apart
|
|
1048
|
+
from the producer's tags. See [Tagging artifacts](server.md#tagging-artifacts). A producer's own tags stay as uploaded.
|
|
1049
|
+
- **Older layers.** A layer without attachment tags reads exactly as before. Tags on an attachment that cannot be read
|
|
1050
|
+
(not a list of strings) are dropped, and the attachment, check and layer stay.
|
|
1051
|
+
|
|
1024
1052
|
## Labels describe, parameters split
|
|
1025
1053
|
|
|
1026
1054
|
A result's **slot** is its producer, check id, part kind, spec, environment and **parameters**. The newest completed
|
|
@@ -1404,6 +1432,26 @@ against a server unchanged. A client uploads **in dependency order**: blobs, the
|
|
|
1404
1432
|
entry that makes it visible. The server checks each step and says no to a catalog entry whose manifest is not
|
|
1405
1433
|
there (`409`), so nothing half-uploaded is ever shown.
|
|
1406
1434
|
|
|
1435
|
+
## Tagging artifacts
|
|
1436
|
+
|
|
1437
|
+
A reviewer can mark a recording `#demo` after it was uploaded without uploading it again. The layer is immutable, so the
|
|
1438
|
+
tag is kept beside it: each edit is one small object under `curation/artifact-tags/` in the write backend (or the live
|
|
1439
|
+
store of a relay), named by time, never changed or removed. It records the attachment (layer, check, and the attachment's
|
|
1440
|
+
`id`, else its bytes' key, else its name), the normalized tags added and removed, the name of the token that made the
|
|
1441
|
+
edit, and the server's time. Nothing about the layer, its results or the report's winners changes.
|
|
1442
|
+
|
|
1443
|
+
- `GET /api/reports/artifact-tags` (read) returns every edit, oldest first. Fold them to get the tags that stand now: the
|
|
1444
|
+
last edit of a tag wins.
|
|
1445
|
+
- `POST /api/reports/artifact-tags` (publish, `Authorization: Bearer`) records an edit. A read token, an anonymous reader
|
|
1446
|
+
and the browser's sign-in box are refused (`403`/`401`) like any upload, so a read-only visitor can see the tags and
|
|
1447
|
+
not change them. The viewer asks for a token when a reviewer adds a tag and keeps it only in that tab.
|
|
1448
|
+
- Producer tags (`tags` on the attachment) and reviewer tags are kept apart everywhere: the viewer says who added a
|
|
1449
|
+
reviewer tag and when, and a reviewer can remove only reviewer tags. `capabilities.artifactTags` on `/api/server` says
|
|
1450
|
+
a server has this.
|
|
1451
|
+
|
|
1452
|
+
See [Tagging artifacts and demos](rich-evidence.md#tagging-artifacts-and-demos) for the tag rules. Reviewer tags are
|
|
1453
|
+
shown in the viewer's evidence; the tests API (`artifactTag`) searches the producers' tags.
|
|
1454
|
+
|
|
1407
1455
|
## Streaming
|
|
1408
1456
|
|
|
1409
1457
|
`GET /api/events` is a server-sent-events stream:
|
|
@@ -1444,7 +1492,7 @@ with `format=markdown` (or `Accept: text/markdown`), and takes the project prefi
|
|
|
1444
1492
|
| Only some: `q` (all words), `status` (or `flaky`), `environment`, `producer`, `domain`, `spec`, `tag`, `run`; `sort`, `offset`, `limit` | `GET /api/reports/tests?status=failed&environment=ios` |
|
|
1445
1493
|
| One test: every recorded result (status, duration, environment, branch, commit, CI run), newest first | `GET /api/reports/tests/history?key=<key>` |
|
|
1446
1494
|
| Why Specs, domains and counts disagree: ambiguous spec paths, shared domains, gaps, a reconciliation of the totals | `GET /api/reports/tests/health` |
|
|
1447
|
-
| The runs that recorded the report (by CI run URL, else branch and commit) | `GET /api/reports/runs` |
|
|
1495
|
+
| The runs that recorded the report (by CI run URL, else branch and commit); `?video=true` keeps those with a playable video | `GET /api/reports/runs` |
|
|
1448
1496
|
| Every test one run recorded | `GET /api/reports/runs/detail?key=<run key>` |
|
|
1449
1497
|
|
|
1450
1498
|
```sh
|
|
@@ -1518,6 +1566,10 @@ curl "$ATLAS_SERVER_URL/api/projects/$ATLAS_PROJECT/reports/tests?format=markdow
|
|
|
1518
1566
|
| `GET /api/projects/{project}/reports/tests/health` | read | Why specs, domains and counts disagree. |
|
|
1519
1567
|
| `GET /api/reports/tests/history` | read | One test and every result recorded for it. |
|
|
1520
1568
|
| `GET /api/projects/{project}/reports/tests/history` | read | One test and every result recorded for it. |
|
|
1569
|
+
| `GET /api/reports/artifact-tags` | read | Reviewer tags of attachments: every recorded edit. |
|
|
1570
|
+
| `GET /api/projects/{project}/reports/artifact-tags` | read | Reviewer tags of attachments: every recorded edit. |
|
|
1571
|
+
| `POST /api/reports/artifact-tags` | publish | Tag or untag one attachment after upload. |
|
|
1572
|
+
| `POST /api/projects/{project}/reports/artifact-tags` | publish | Tag or untag one attachment after upload. |
|
|
1521
1573
|
| `GET /api/reports/runs` | read | The runs that recorded the report. |
|
|
1522
1574
|
| `GET /api/projects/{project}/reports/runs` | read | The runs that recorded the report. |
|
|
1523
1575
|
| `GET /api/reports/runs/detail` | read | Every test one run recorded. |
|
|
@@ -2542,6 +2594,9 @@ carry any of these. Every one is optional.
|
|
|
2542
2594
|
| `extensions{}` | Structured data of your own or a tool's, under a name you own. |
|
|
2543
2595
|
| `measurements[]` | Numbers, with units and an allowance (already part of the contract). |
|
|
2544
2596
|
|
|
2597
|
+
An attachment may carry its own `tags[]` (`demo`): shown as `#demo` and searchable; see
|
|
2598
|
+
[Tagging artifacts and demos](rich-evidence.md#tagging-artifacts-and-demos).
|
|
2599
|
+
|
|
2545
2600
|
On a **layer** the same fields describe the whole run: its CI log, a coverage report, an archive of traces, the
|
|
2546
2601
|
build number, a link to the pipeline.
|
|
2547
2602
|
|
|
@@ -4794,6 +4849,8 @@ Send `format=markdown` (or `Accept: text/markdown`) for the same as a Markdown r
|
|
|
4794
4849
|
- `domain` (query): Only tests whose spec is in this domain (`(no spec)` for none). Repeatable or comma-separated.
|
|
4795
4850
|
- `spec` (query): Only tests of this spec path. Repeatable or comma-separated.
|
|
4796
4851
|
- `tag` (query): Only tests with this tag. Repeatable or comma-separated.
|
|
4852
|
+
- `artifactTag` (query): Only tests with an attachment tagged this (`demo` and `#demo` are the same tag), not counting tags inherited from a check or run: the exact artifact query. `inherited=1` widens it to the tags inherited from the check and run. Repeatable or comma-separated.
|
|
4853
|
+
- `inherited` (query): With `artifactTag`: `1` also matches the tags an attachment inherits from its check and run, so a recording without a tag of its own under a run tagged `demo` is found. Without it the query is exact.
|
|
4797
4854
|
- `run` (query): Only tests recorded in this run (a `key` from `/api/reports/runs`).
|
|
4798
4855
|
- `sort` (query): The order: `spec` (default: domain, spec, title), `title`, `recent`, `slowest`, `failures`, `flaky` or `runs`.
|
|
4799
4856
|
- `offset` (query): Skip this many matching tests.
|
|
@@ -4823,6 +4880,8 @@ Scoped to one project. The same project may be selected on the unprefixed API us
|
|
|
4823
4880
|
- `domain` (query): Only tests whose spec is in this domain (`(no spec)` for none). Repeatable or comma-separated.
|
|
4824
4881
|
- `spec` (query): Only tests of this spec path. Repeatable or comma-separated.
|
|
4825
4882
|
- `tag` (query): Only tests with this tag. Repeatable or comma-separated.
|
|
4883
|
+
- `artifactTag` (query): Only tests with an attachment tagged this (`demo` and `#demo` are the same tag), not counting tags inherited from a check or run: the exact artifact query. `inherited=1` widens it to the tags inherited from the check and run. Repeatable or comma-separated.
|
|
4884
|
+
- `inherited` (query): With `artifactTag`: `1` also matches the tags an attachment inherits from its check and run, so a recording without a tag of its own under a run tagged `demo` is found. Without it the query is exact.
|
|
4826
4885
|
- `run` (query): Only tests recorded in this run (a `key` from `/api/reports/runs`).
|
|
4827
4886
|
- `sort` (query): The order: `spec` (default: domain, spec, title), `title`, `recent`, `slowest`, `failures`, `flaky` or `runs`.
|
|
4828
4887
|
- `offset` (query): Skip this many matching tests.
|
|
@@ -4891,13 +4950,58 @@ Scoped to one project. The same project may be selected on the unprefixed API us
|
|
|
4891
4950
|
|
|
4892
4951
|
Responses: `200` The test and its history.; `304` Unchanged since the `If-None-Match` ETag.; `400` No `key`.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No test in the report has that key.; `503` The server is still reading its backends. Retry after the number of seconds in `Retry-After`.
|
|
4893
4952
|
|
|
4953
|
+
### Reviewer tags of attachments: every recorded edit
|
|
4954
|
+
|
|
4955
|
+
`GET /api/reports/artifact-tags` · role: read
|
|
4956
|
+
|
|
4957
|
+
The audit trail of tags that reviewers added to and removed from attachments after upload, oldest first. Each entry says which attachment (`target`), which normalized tags were added and removed, the name of the token that made the edit (`by`, never the token) and when (`atMs`). The layers themselves are never rewritten, so a producer's own `tags` on an attachment stay as uploaded; fold the entries (oldest first, the last edit of a tag wins) to get the reviewer tags that stand now. Tags are normalized: `#Demo` and `demo` are `demo`.
|
|
4958
|
+
|
|
4959
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4960
|
+
|
|
4961
|
+
Responses: `200` The edits.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
4962
|
+
|
|
4963
|
+
### Reviewer tags of attachments: every recorded edit
|
|
4964
|
+
|
|
4965
|
+
`GET /api/projects/{project}/reports/artifact-tags` · role: read
|
|
4966
|
+
|
|
4967
|
+
The audit trail of tags that reviewers added to and removed from attachments after upload, oldest first. Each entry says which attachment (`target`), which normalized tags were added and removed, the name of the token that made the edit (`by`, never the token) and when (`atMs`). The layers themselves are never rewritten, so a producer's own `tags` on an attachment stay as uploaded; fold the entries (oldest first, the last edit of a tag wins) to get the reviewer tags that stand now. Tags are normalized: `#Demo` and `demo` are `demo`.
|
|
4968
|
+
|
|
4969
|
+
Scoped 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.
|
|
4970
|
+
|
|
4971
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4972
|
+
|
|
4973
|
+
Responses: `200` The edits.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
4974
|
+
|
|
4975
|
+
### Tag or untag one attachment after upload
|
|
4976
|
+
|
|
4977
|
+
`POST /api/reports/artifact-tags` · role: publish
|
|
4978
|
+
|
|
4979
|
+
Records one edit of the reviewer tags of one attachment, by the name of the publish (or admin) token that sends it. It adds an immutable entry to the audit trail and changes nothing else: not the layer, not the movie, not any result. The tags it removes are reviewer tags only; a producer's tags are part of the layer and stay. A reader-only token, a browser sign-in box and an anonymous reader are refused. Name the attachment as `artifactRef` does (`id:<id>`, else `key:<bundleKey>`, else `name:<name>`).
|
|
4980
|
+
|
|
4981
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4982
|
+
|
|
4983
|
+
Responses: `201` The recorded entry.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `413` Request too large.; `422` Not a tag edit: a bad target, an empty or over-long tag, or nothing to change.
|
|
4984
|
+
|
|
4985
|
+
### Tag or untag one attachment after upload
|
|
4986
|
+
|
|
4987
|
+
`POST /api/projects/{project}/reports/artifact-tags` · role: publish
|
|
4988
|
+
|
|
4989
|
+
Records one edit of the reviewer tags of one attachment, by the name of the publish (or admin) token that sends it. It adds an immutable entry to the audit trail and changes nothing else: not the layer, not the movie, not any result. The tags it removes are reviewer tags only; a producer's tags are part of the layer and stay. A reader-only token, a browser sign-in box and an anonymous reader are refused. Name the attachment as `artifactRef` does (`id:<id>`, else `key:<bundleKey>`, else `name:<name>`).
|
|
4990
|
+
|
|
4991
|
+
Scoped 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.
|
|
4992
|
+
|
|
4993
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4994
|
+
|
|
4995
|
+
Responses: `201` The recorded entry.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `413` Request too large.; `422` Not a tag edit: a bad target, an empty or over-long tag, or nothing to change.
|
|
4996
|
+
|
|
4894
4997
|
### The runs that recorded the report
|
|
4895
4998
|
|
|
4896
4999
|
`GET /api/reports/runs` · role: read
|
|
4897
5000
|
|
|
4898
|
-
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
|
|
5001
|
+
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.
|
|
4899
5002
|
|
|
4900
5003
|
- `limit` (query): At most this many runs (default 100).
|
|
5004
|
+
- `video` (query): `true` to list only runs that have a playable video recording. Applied to every run before `limit`; `total` counts the matches. A server that does not know it answers with every run.
|
|
4901
5005
|
- `format` (query): `markdown` for Markdown instead of JSON.
|
|
4902
5006
|
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4903
5007
|
|
|
@@ -4907,12 +5011,13 @@ Responses: `200` The runs.; `304` Unchanged since the `If-None-Match` ETag.; `40
|
|
|
4907
5011
|
|
|
4908
5012
|
`GET /api/projects/{project}/reports/runs` · role: read
|
|
4909
5013
|
|
|
4910
|
-
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
|
|
5014
|
+
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.
|
|
4911
5015
|
|
|
4912
5016
|
Scoped 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.
|
|
4913
5017
|
|
|
4914
5018
|
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
4915
5019
|
- `limit` (query): At most this many runs (default 100).
|
|
5020
|
+
- `video` (query): `true` to list only runs that have a playable video recording. Applied to every run before `limit`; `total` counts the matches. A server that does not know it answers with every run.
|
|
4916
5021
|
- `format` (query): `markdown` for Markdown instead of JSON.
|
|
4917
5022
|
|
|
4918
5023
|
Responses: `200` The runs.; `304` Unchanged since the `If-None-Match` ETag.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` The server is still reading its backends. Retry after the number of seconds in `Retry-After`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crvouga/atlas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Atlas: specs of any kind, reported as layered evidence. Publish checks from any runner (JUnit, CTRF, a script), combine them across nodes, branches, environments and backends, gate CI on the result, and run statecharts against the real app.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -169,6 +169,13 @@
|
|
|
169
169
|
"description": {
|
|
170
170
|
"type": "string"
|
|
171
171
|
},
|
|
172
|
+
"tags": {
|
|
173
|
+
"description": "Free labels of this one attachment, such as `demo`: shown as `#demo`, searchable, and normalized by `normalizeTag` (a leading `#` and letter case never matter). Unlike the tags of a check they say nothing about its result",
|
|
174
|
+
"type": "array",
|
|
175
|
+
"items": {
|
|
176
|
+
"type": "string"
|
|
177
|
+
}
|
|
178
|
+
},
|
|
172
179
|
"at": {
|
|
173
180
|
"type": "object",
|
|
174
181
|
"properties": {
|
|
@@ -397,6 +404,13 @@
|
|
|
397
404
|
"description": {
|
|
398
405
|
"type": "string"
|
|
399
406
|
},
|
|
407
|
+
"tags": {
|
|
408
|
+
"description": "Free labels of this one attachment, such as `demo`: shown as `#demo`, searchable, and normalized by `normalizeTag` (a leading `#` and letter case never matter). Unlike the tags of a check they say nothing about its result",
|
|
409
|
+
"type": "array",
|
|
410
|
+
"items": {
|
|
411
|
+
"type": "string"
|
|
412
|
+
}
|
|
413
|
+
},
|
|
400
414
|
"at": {
|
|
401
415
|
"type": "object",
|
|
402
416
|
"properties": {
|
|
@@ -662,6 +676,13 @@
|
|
|
662
676
|
"description": {
|
|
663
677
|
"type": "string"
|
|
664
678
|
},
|
|
679
|
+
"tags": {
|
|
680
|
+
"description": "Free labels of this one attachment, such as `demo`: shown as `#demo`, searchable, and normalized by `normalizeTag` (a leading `#` and letter case never matter). Unlike the tags of a check they say nothing about its result",
|
|
681
|
+
"type": "array",
|
|
682
|
+
"items": {
|
|
683
|
+
"type": "string"
|
|
684
|
+
}
|
|
685
|
+
},
|
|
665
686
|
"at": {
|
|
666
687
|
"type": "object",
|
|
667
688
|
"properties": {
|
|
@@ -862,6 +883,13 @@
|
|
|
862
883
|
"description": {
|
|
863
884
|
"type": "string"
|
|
864
885
|
},
|
|
886
|
+
"tags": {
|
|
887
|
+
"description": "Free labels of this one attachment, such as `demo`: shown as `#demo`, searchable, and normalized by `normalizeTag` (a leading `#` and letter case never matter). Unlike the tags of a check they say nothing about its result",
|
|
888
|
+
"type": "array",
|
|
889
|
+
"items": {
|
|
890
|
+
"type": "string"
|
|
891
|
+
}
|
|
892
|
+
},
|
|
865
893
|
"at": {
|
|
866
894
|
"type": "object",
|
|
867
895
|
"properties": {
|
|
@@ -132,6 +132,13 @@
|
|
|
132
132
|
"type": "string"
|
|
133
133
|
}
|
|
134
134
|
},
|
|
135
|
+
"artifactTags": {
|
|
136
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
137
|
+
"type": "array",
|
|
138
|
+
"items": {
|
|
139
|
+
"type": "string"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
135
142
|
"labels": {
|
|
136
143
|
"type": "object",
|
|
137
144
|
"propertyNames": {
|
|
@@ -146,6 +153,47 @@
|
|
|
146
153
|
"items": {
|
|
147
154
|
"type": "string"
|
|
148
155
|
}
|
|
156
|
+
},
|
|
157
|
+
"videos": {
|
|
158
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
159
|
+
"type": "array",
|
|
160
|
+
"items": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"properties": {
|
|
163
|
+
"name": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"description": "The attachment name"
|
|
166
|
+
},
|
|
167
|
+
"owner": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
170
|
+
},
|
|
171
|
+
"attempt": {
|
|
172
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
173
|
+
"type": "integer",
|
|
174
|
+
"minimum": 0,
|
|
175
|
+
"maximum": 9007199254740991
|
|
176
|
+
},
|
|
177
|
+
"step": {
|
|
178
|
+
"description": "The name of the step that holds it",
|
|
179
|
+
"type": "string"
|
|
180
|
+
},
|
|
181
|
+
"recording": {
|
|
182
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
183
|
+
"type": "string"
|
|
184
|
+
},
|
|
185
|
+
"available": {
|
|
186
|
+
"type": "boolean",
|
|
187
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"required": [
|
|
191
|
+
"name",
|
|
192
|
+
"owner",
|
|
193
|
+
"available"
|
|
194
|
+
],
|
|
195
|
+
"additionalProperties": {}
|
|
196
|
+
}
|
|
149
197
|
}
|
|
150
198
|
},
|
|
151
199
|
"required": [
|
|
@@ -358,6 +406,13 @@
|
|
|
358
406
|
"type": "string"
|
|
359
407
|
}
|
|
360
408
|
},
|
|
409
|
+
"artifactTags": {
|
|
410
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
411
|
+
"type": "array",
|
|
412
|
+
"items": {
|
|
413
|
+
"type": "string"
|
|
414
|
+
}
|
|
415
|
+
},
|
|
361
416
|
"labels": {
|
|
362
417
|
"type": "object",
|
|
363
418
|
"propertyNames": {
|
|
@@ -372,6 +427,47 @@
|
|
|
372
427
|
"items": {
|
|
373
428
|
"type": "string"
|
|
374
429
|
}
|
|
430
|
+
},
|
|
431
|
+
"videos": {
|
|
432
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
433
|
+
"type": "array",
|
|
434
|
+
"items": {
|
|
435
|
+
"type": "object",
|
|
436
|
+
"properties": {
|
|
437
|
+
"name": {
|
|
438
|
+
"type": "string",
|
|
439
|
+
"description": "The attachment name"
|
|
440
|
+
},
|
|
441
|
+
"owner": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
444
|
+
},
|
|
445
|
+
"attempt": {
|
|
446
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
447
|
+
"type": "integer",
|
|
448
|
+
"minimum": 0,
|
|
449
|
+
"maximum": 9007199254740991
|
|
450
|
+
},
|
|
451
|
+
"step": {
|
|
452
|
+
"description": "The name of the step that holds it",
|
|
453
|
+
"type": "string"
|
|
454
|
+
},
|
|
455
|
+
"recording": {
|
|
456
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
457
|
+
"type": "string"
|
|
458
|
+
},
|
|
459
|
+
"available": {
|
|
460
|
+
"type": "boolean",
|
|
461
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
"required": [
|
|
465
|
+
"name",
|
|
466
|
+
"owner",
|
|
467
|
+
"available"
|
|
468
|
+
],
|
|
469
|
+
"additionalProperties": {}
|
|
470
|
+
}
|
|
375
471
|
}
|
|
376
472
|
},
|
|
377
473
|
"required": [
|
|
@@ -132,6 +132,13 @@
|
|
|
132
132
|
"type": "string"
|
|
133
133
|
}
|
|
134
134
|
},
|
|
135
|
+
"artifactTags": {
|
|
136
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
137
|
+
"type": "array",
|
|
138
|
+
"items": {
|
|
139
|
+
"type": "string"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
135
142
|
"labels": {
|
|
136
143
|
"type": "object",
|
|
137
144
|
"propertyNames": {
|
|
@@ -146,6 +153,47 @@
|
|
|
146
153
|
"items": {
|
|
147
154
|
"type": "string"
|
|
148
155
|
}
|
|
156
|
+
},
|
|
157
|
+
"videos": {
|
|
158
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
159
|
+
"type": "array",
|
|
160
|
+
"items": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"properties": {
|
|
163
|
+
"name": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"description": "The attachment name"
|
|
166
|
+
},
|
|
167
|
+
"owner": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
170
|
+
},
|
|
171
|
+
"attempt": {
|
|
172
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
173
|
+
"type": "integer",
|
|
174
|
+
"minimum": 0,
|
|
175
|
+
"maximum": 9007199254740991
|
|
176
|
+
},
|
|
177
|
+
"step": {
|
|
178
|
+
"description": "The name of the step that holds it",
|
|
179
|
+
"type": "string"
|
|
180
|
+
},
|
|
181
|
+
"recording": {
|
|
182
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
183
|
+
"type": "string"
|
|
184
|
+
},
|
|
185
|
+
"available": {
|
|
186
|
+
"type": "boolean",
|
|
187
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"required": [
|
|
191
|
+
"name",
|
|
192
|
+
"owner",
|
|
193
|
+
"available"
|
|
194
|
+
],
|
|
195
|
+
"additionalProperties": {}
|
|
196
|
+
}
|
|
149
197
|
}
|
|
150
198
|
},
|
|
151
199
|
"required": [
|
|
@@ -358,6 +406,13 @@
|
|
|
358
406
|
"type": "string"
|
|
359
407
|
}
|
|
360
408
|
},
|
|
409
|
+
"artifactTags": {
|
|
410
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
411
|
+
"type": "array",
|
|
412
|
+
"items": {
|
|
413
|
+
"type": "string"
|
|
414
|
+
}
|
|
415
|
+
},
|
|
361
416
|
"labels": {
|
|
362
417
|
"type": "object",
|
|
363
418
|
"propertyNames": {
|
|
@@ -372,6 +427,47 @@
|
|
|
372
427
|
"items": {
|
|
373
428
|
"type": "string"
|
|
374
429
|
}
|
|
430
|
+
},
|
|
431
|
+
"videos": {
|
|
432
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
433
|
+
"type": "array",
|
|
434
|
+
"items": {
|
|
435
|
+
"type": "object",
|
|
436
|
+
"properties": {
|
|
437
|
+
"name": {
|
|
438
|
+
"type": "string",
|
|
439
|
+
"description": "The attachment name"
|
|
440
|
+
},
|
|
441
|
+
"owner": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
444
|
+
},
|
|
445
|
+
"attempt": {
|
|
446
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
447
|
+
"type": "integer",
|
|
448
|
+
"minimum": 0,
|
|
449
|
+
"maximum": 9007199254740991
|
|
450
|
+
},
|
|
451
|
+
"step": {
|
|
452
|
+
"description": "The name of the step that holds it",
|
|
453
|
+
"type": "string"
|
|
454
|
+
},
|
|
455
|
+
"recording": {
|
|
456
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
457
|
+
"type": "string"
|
|
458
|
+
},
|
|
459
|
+
"available": {
|
|
460
|
+
"type": "boolean",
|
|
461
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
"required": [
|
|
465
|
+
"name",
|
|
466
|
+
"owner",
|
|
467
|
+
"available"
|
|
468
|
+
],
|
|
469
|
+
"additionalProperties": {}
|
|
470
|
+
}
|
|
375
471
|
}
|
|
376
472
|
},
|
|
377
473
|
"required": [
|
|
@@ -177,6 +177,13 @@
|
|
|
177
177
|
"type": "string"
|
|
178
178
|
}
|
|
179
179
|
},
|
|
180
|
+
"artifactTags": {
|
|
181
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
182
|
+
"type": "array",
|
|
183
|
+
"items": {
|
|
184
|
+
"type": "string"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
180
187
|
"labels": {
|
|
181
188
|
"type": "object",
|
|
182
189
|
"propertyNames": {
|
|
@@ -191,6 +198,47 @@
|
|
|
191
198
|
"items": {
|
|
192
199
|
"type": "string"
|
|
193
200
|
}
|
|
201
|
+
},
|
|
202
|
+
"videos": {
|
|
203
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
204
|
+
"type": "array",
|
|
205
|
+
"items": {
|
|
206
|
+
"type": "object",
|
|
207
|
+
"properties": {
|
|
208
|
+
"name": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"description": "The attachment name"
|
|
211
|
+
},
|
|
212
|
+
"owner": {
|
|
213
|
+
"type": "string",
|
|
214
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
215
|
+
},
|
|
216
|
+
"attempt": {
|
|
217
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
218
|
+
"type": "integer",
|
|
219
|
+
"minimum": 0,
|
|
220
|
+
"maximum": 9007199254740991
|
|
221
|
+
},
|
|
222
|
+
"step": {
|
|
223
|
+
"description": "The name of the step that holds it",
|
|
224
|
+
"type": "string"
|
|
225
|
+
},
|
|
226
|
+
"recording": {
|
|
227
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
228
|
+
"type": "string"
|
|
229
|
+
},
|
|
230
|
+
"available": {
|
|
231
|
+
"type": "boolean",
|
|
232
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
"required": [
|
|
236
|
+
"name",
|
|
237
|
+
"owner",
|
|
238
|
+
"available"
|
|
239
|
+
],
|
|
240
|
+
"additionalProperties": {}
|
|
241
|
+
}
|
|
194
242
|
}
|
|
195
243
|
},
|
|
196
244
|
"required": [
|
|
@@ -123,6 +123,13 @@
|
|
|
123
123
|
"type": "string"
|
|
124
124
|
}
|
|
125
125
|
},
|
|
126
|
+
"artifactTags": {
|
|
127
|
+
"description": "Normalized tags of the attachments themselves, sorted and distinct. Absent when no attachment is tagged; never inherited from a check or run",
|
|
128
|
+
"type": "array",
|
|
129
|
+
"items": {
|
|
130
|
+
"type": "string"
|
|
131
|
+
}
|
|
132
|
+
},
|
|
126
133
|
"labels": {
|
|
127
134
|
"type": "object",
|
|
128
135
|
"propertyNames": {
|
|
@@ -137,6 +144,47 @@
|
|
|
137
144
|
"items": {
|
|
138
145
|
"type": "string"
|
|
139
146
|
}
|
|
147
|
+
},
|
|
148
|
+
"videos": {
|
|
149
|
+
"description": "Its references to videos and who holds each. Absent when it has none, and in reports written before this was recorded",
|
|
150
|
+
"type": "array",
|
|
151
|
+
"items": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"properties": {
|
|
154
|
+
"name": {
|
|
155
|
+
"type": "string",
|
|
156
|
+
"description": "The attachment name"
|
|
157
|
+
},
|
|
158
|
+
"owner": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
161
|
+
},
|
|
162
|
+
"attempt": {
|
|
163
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
164
|
+
"type": "integer",
|
|
165
|
+
"minimum": 0,
|
|
166
|
+
"maximum": 9007199254740991
|
|
167
|
+
},
|
|
168
|
+
"step": {
|
|
169
|
+
"description": "The name of the step that holds it",
|
|
170
|
+
"type": "string"
|
|
171
|
+
},
|
|
172
|
+
"recording": {
|
|
173
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
174
|
+
"type": "string"
|
|
175
|
+
},
|
|
176
|
+
"available": {
|
|
177
|
+
"type": "boolean",
|
|
178
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"required": [
|
|
182
|
+
"name",
|
|
183
|
+
"owner",
|
|
184
|
+
"available"
|
|
185
|
+
],
|
|
186
|
+
"additionalProperties": {}
|
|
187
|
+
}
|
|
140
188
|
}
|
|
141
189
|
},
|
|
142
190
|
"required": [
|