@8lines/gauntlet-protocol 0.1.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 (91) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +265 -0
  3. package/dist/environment.d.ts +3 -0
  4. package/dist/environment.d.ts.map +1 -0
  5. package/dist/environment.js +32 -0
  6. package/dist/environment.js.map +1 -0
  7. package/dist/identifiers.d.ts +4 -0
  8. package/dist/identifiers.d.ts.map +1 -0
  9. package/dist/identifiers.js +5 -0
  10. package/dist/identifiers.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +8 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/placements.d.ts +5 -0
  16. package/dist/placements.d.ts.map +1 -0
  17. package/dist/placements.js +99 -0
  18. package/dist/placements.js.map +1 -0
  19. package/dist/portable-pattern.d.ts +2 -0
  20. package/dist/portable-pattern.d.ts.map +1 -0
  21. package/dist/portable-pattern.js +450 -0
  22. package/dist/portable-pattern.js.map +1 -0
  23. package/dist/preset-secrets.d.ts +7 -0
  24. package/dist/preset-secrets.d.ts.map +1 -0
  25. package/dist/preset-secrets.js +694 -0
  26. package/dist/preset-secrets.js.map +1 -0
  27. package/dist/revision.d.ts +11 -0
  28. package/dist/revision.d.ts.map +1 -0
  29. package/dist/revision.js +135 -0
  30. package/dist/revision.js.map +1 -0
  31. package/dist/schema-profile.d.ts +5 -0
  32. package/dist/schema-profile.d.ts.map +1 -0
  33. package/dist/schema-profile.js +295 -0
  34. package/dist/schema-profile.js.map +1 -0
  35. package/dist/semantic-validation.d.ts +24 -0
  36. package/dist/semantic-validation.d.ts.map +1 -0
  37. package/dist/semantic-validation.js +321 -0
  38. package/dist/semantic-validation.js.map +1 -0
  39. package/dist/types.d.ts +437 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/fixtures/v1/adapter-semantic-vectors.json +3257 -0
  44. package/fixtures/v1/adapter-semantic-vectors.schema.json +519 -0
  45. package/fixtures/v1/create-run-request.valid.json +33 -0
  46. package/fixtures/v1/data-source-page.valid.json +18 -0
  47. package/fixtures/v1/data-source-query.valid.json +12 -0
  48. package/fixtures/v1/data-source-resolve-request.valid.json +10 -0
  49. package/fixtures/v1/data-source-resolve-response.valid.json +17 -0
  50. package/fixtures/v1/health.valid.json +4 -0
  51. package/fixtures/v1/jcs-revision-vectors.json +114 -0
  52. package/fixtures/v1/manifest.invalid-major-version.json +18 -0
  53. package/fixtures/v1/manifest.invalid-unknown-property.json +27 -0
  54. package/fixtures/v1/manifest.minor-forward.valid.json +142 -0
  55. package/fixtures/v1/manifest.valid.json +137 -0
  56. package/fixtures/v1/operation.invalid-remote-ref.json +28 -0
  57. package/fixtures/v1/operation.invalid-schema-profile.json +28 -0
  58. package/fixtures/v1/operation.invalid-unsafe-id.json +28 -0
  59. package/fixtures/v1/operation.valid.json +227 -0
  60. package/fixtures/v1/problem.unsupported-capability.valid.json +7 -0
  61. package/fixtures/v1/problem.valid.json +8 -0
  62. package/fixtures/v1/problem.validation.valid.json +16 -0
  63. package/fixtures/v1/run-event.valid.json +21 -0
  64. package/fixtures/v1/run.cancelled.valid.json +17 -0
  65. package/fixtures/v1/run.failed.valid.json +32 -0
  66. package/fixtures/v1/run.invalid-active-problem.json +16 -0
  67. package/fixtures/v1/run.invalid-cancelled-problem.json +17 -0
  68. package/fixtures/v1/run.invalid-terminal-without-problem.json +12 -0
  69. package/fixtures/v1/run.invalid-timed-out-status.json +18 -0
  70. package/fixtures/v1/run.queued.valid.json +15 -0
  71. package/fixtures/v1/run.succeeded.valid.json +68 -0
  72. package/fixtures/v1/run.timed-out.valid.json +18 -0
  73. package/fixtures/v1/session-launch.valid.json +5 -0
  74. package/fixtures/v1/tc-schema-core-pattern-vectors.json +450 -0
  75. package/fixtures/v1/upload-response.valid.json +11 -0
  76. package/openapi/adapter-v1.yaml +251 -0
  77. package/package.json +41 -0
  78. package/schemas/v1/common.schema.json +558 -0
  79. package/schemas/v1/create-run-request.schema.json +16 -0
  80. package/schemas/v1/data-source-page.schema.json +15 -0
  81. package/schemas/v1/data-source-query.schema.json +14 -0
  82. package/schemas/v1/data-source-resolve-request.schema.json +16 -0
  83. package/schemas/v1/data-source-resolve-response.schema.json +27 -0
  84. package/schemas/v1/health.schema.json +12 -0
  85. package/schemas/v1/manifest.schema.json +147 -0
  86. package/schemas/v1/operation-definition.schema.json +326 -0
  87. package/schemas/v1/problem.schema.json +5 -0
  88. package/schemas/v1/run-event.schema.json +15 -0
  89. package/schemas/v1/run.schema.json +95 -0
  90. package/schemas/v1/session-launch.schema.json +13 -0
  91. package/schemas/v1/upload.schema.json +11 -0
@@ -0,0 +1,227 @@
1
+ {
2
+ "id": "application-access-review",
3
+ "revision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
4
+ "label": "Review application access",
5
+ "featureId": "security",
6
+ "description": "Review application access and optionally notify its owners.",
7
+ "icon": "shield-check",
8
+ "order": 10,
9
+ "tags": ["access", "security"],
10
+ "requirements": {
11
+ "profiles": ["tc-schema-core@1", "tc-rich-forms@1", "tc-rich-results@1"],
12
+ "capabilities": ["tc-uploads@1", "tc-session-launch@1"]
13
+ },
14
+ "inputSchema": {
15
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
16
+ "type": "object",
17
+ "required": ["applicationId", "message", "notify", "options", "roles", "apiToken", "attachment"],
18
+ "properties": {
19
+ "applicationId": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "title": "Application"
23
+ },
24
+ "message": {
25
+ "type": "string",
26
+ "minLength": 1,
27
+ "maxLength": 500,
28
+ "title": "Review message"
29
+ },
30
+ "notify": {
31
+ "type": "boolean",
32
+ "default": true,
33
+ "title": "Notify owners"
34
+ },
35
+ "options": {
36
+ "type": "object",
37
+ "required": ["includeInactive", "mode"],
38
+ "properties": {
39
+ "includeInactive": { "type": "boolean", "default": false },
40
+ "mode": { "type": "string", "enum": ["preview", "apply"] }
41
+ },
42
+ "additionalProperties": false
43
+ },
44
+ "roles": {
45
+ "type": "array",
46
+ "items": { "type": "string", "minLength": 1 },
47
+ "minItems": 1,
48
+ "uniqueItems": true
49
+ },
50
+ "apiToken": {
51
+ "type": "string",
52
+ "minLength": 1,
53
+ "title": "API token"
54
+ },
55
+ "attachment": {
56
+ "type": "object",
57
+ "required": ["kind", "uploadId", "name", "mediaType", "sizeBytes", "expiresAt"],
58
+ "properties": {
59
+ "kind": { "const": "file" },
60
+ "uploadId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" },
61
+ "name": { "type": "string", "minLength": 1 },
62
+ "mediaType": { "type": "string", "minLength": 1 },
63
+ "sizeBytes": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
64
+ "sha256": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
65
+ "expiresAt": { "type": "string", "format": "date-time" },
66
+ "extensions": {
67
+ "type": "object",
68
+ "propertyNames": { "pattern": "^urn:[A-Za-z0-9][A-Za-z0-9:._/-]*$" }
69
+ }
70
+ },
71
+ "additionalProperties": false
72
+ }
73
+ },
74
+ "additionalProperties": false
75
+ },
76
+ "inputHandling": {
77
+ "rules": [
78
+ {
79
+ "kind": "secret",
80
+ "schemaPointer": "/properties/apiToken",
81
+ "retention": "none"
82
+ },
83
+ {
84
+ "kind": "file",
85
+ "schemaPointer": "/properties/attachment",
86
+ "multiple": false,
87
+ "mediaTypes": ["application/pdf", "text/plain"],
88
+ "maxBytes": 10485760
89
+ }
90
+ ]
91
+ },
92
+ "contextSchema": {
93
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
94
+ "type": "object",
95
+ "required": ["requestId", "target"],
96
+ "properties": {
97
+ "requestId": {
98
+ "type": "string",
99
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
100
+ },
101
+ "locale": { "type": "string" },
102
+ "timeZone": { "type": "string" },
103
+ "actor": {
104
+ "type": "object",
105
+ "required": ["id"],
106
+ "properties": {
107
+ "id": {
108
+ "type": "string",
109
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
110
+ },
111
+ "displayName": { "type": "string" }
112
+ },
113
+ "additionalProperties": false
114
+ },
115
+ "target": {
116
+ "type": "object",
117
+ "required": ["id"],
118
+ "properties": {
119
+ "id": {
120
+ "type": "string",
121
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
122
+ },
123
+ "environment": { "type": "string" }
124
+ },
125
+ "additionalProperties": false
126
+ },
127
+ "extensions": {
128
+ "type": "object",
129
+ "propertyNames": {
130
+ "pattern": "^urn:[A-Za-z0-9][A-Za-z0-9:._/-]*$"
131
+ }
132
+ }
133
+ },
134
+ "additionalProperties": false
135
+ },
136
+ "uiSchema": {
137
+ "profile": "tc-rich-forms@1",
138
+ "root": {
139
+ "type": "group",
140
+ "label": "Access review",
141
+ "children": [
142
+ {
143
+ "type": "field",
144
+ "pointer": "/applicationId",
145
+ "widget": "autocomplete",
146
+ "dataSourceId": "application-catalog",
147
+ "label": "Application",
148
+ "help": "Search the target application catalog."
149
+ },
150
+ {
151
+ "type": "field",
152
+ "pointer": "/message",
153
+ "widget": "textarea"
154
+ },
155
+ {
156
+ "type": "field",
157
+ "pointer": "/notify",
158
+ "widget": "toggle"
159
+ },
160
+ {
161
+ "type": "group",
162
+ "label": "Notification options",
163
+ "visibleWhen": { "op": "equals", "pointer": "/notify", "value": true },
164
+ "children": [
165
+ { "type": "field", "pointer": "/options/includeInactive", "widget": "toggle" },
166
+ { "type": "field", "pointer": "/options/mode", "widget": "select" },
167
+ { "type": "field", "pointer": "/roles", "widget": "multi-select" }
168
+ ]
169
+ },
170
+ {
171
+ "type": "columns",
172
+ "children": [
173
+ { "type": "field", "pointer": "/apiToken", "widget": "secret" },
174
+ { "type": "field", "pointer": "/attachment", "widget": "file" }
175
+ ]
176
+ }
177
+ ]
178
+ }
179
+ },
180
+ "dataSources": [
181
+ {
182
+ "id": "application-catalog",
183
+ "inputPointer": "/applicationId",
184
+ "dependencyPointers": ["/options/includeInactive"],
185
+ "contextPointers": ["/target/id"],
186
+ "required": true
187
+ }
188
+ ],
189
+ "presets": [
190
+ {
191
+ "id": "preview-active",
192
+ "label": "Preview active applications",
193
+ "description": "Starts with a safe, secret-free preview configuration.",
194
+ "input": {
195
+ "notify": false,
196
+ "options": { "includeInactive": false, "mode": "preview" },
197
+ "roles": ["viewer"]
198
+ },
199
+ "lockedPointers": ["/options/mode"]
200
+ }
201
+ ],
202
+ "execution": {
203
+ "impact": "write",
204
+ "confirmationRequired": true,
205
+ "dryRunSupported": true,
206
+ "idempotency": "required",
207
+ "cancellationSupported": false,
208
+ "timeoutSeconds": 120,
209
+ "concurrency": "queue"
210
+ },
211
+ "output": {
212
+ "schema": {
213
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
214
+ "type": "object",
215
+ "required": ["reviewed", "notified"],
216
+ "properties": {
217
+ "reviewed": { "type": "integer", "minimum": 0 },
218
+ "notified": { "type": "boolean" }
219
+ },
220
+ "additionalProperties": false
221
+ },
222
+ "presentation": {
223
+ "profile": "tc-rich-results@1",
224
+ "defaultView": "summary"
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "type": "urn:gauntlet:problem:unsupported-capability",
3
+ "title": "Capability is not supported",
4
+ "status": 501,
5
+ "detail": "This adapter does not support run event streaming.",
6
+ "capability": "tc-run-sse@1"
7
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "type": "urn:gauntlet:problem:run-not-found",
3
+ "title": "Run not found",
4
+ "status": 404,
5
+ "detail": "No run exists with ID run-missing.",
6
+ "instance": "/_gauntlet/v1/runs/run-missing",
7
+ "correlationId": "correlation-404"
8
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "type": "urn:gauntlet:problem:validation-failed",
3
+ "title": "Request validation failed",
4
+ "status": 422,
5
+ "detail": "The operation input is invalid.",
6
+ "correlationId": "correlation-422",
7
+ "errors": [
8
+ {
9
+ "instancePath": "/applicationId",
10
+ "schemaPath": "#/properties/applicationId/minLength",
11
+ "keyword": "minLength",
12
+ "message": "must NOT have fewer than 1 characters",
13
+ "params": { "limit": 1 }
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "event-01",
3
+ "sequence": 0,
4
+ "occurredAt": "2026-08-29T12:00:00Z",
5
+ "type": "run.updated",
6
+ "run": {
7
+ "id": "run-01",
8
+ "operationId": "application-access-review",
9
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
10
+ "sequence": 0,
11
+ "state": "queued",
12
+ "createdAt": "2026-08-29T12:00:00Z",
13
+ "updatedAt": "2026-08-29T12:00:00Z",
14
+ "summary": {
15
+ "title": "Access review queued",
16
+ "tone": "neutral"
17
+ },
18
+ "artifacts": [],
19
+ "actions": []
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "run-cancelled-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 1,
6
+ "state": "cancelled",
7
+ "createdAt": "2026-08-29T12:20:00Z",
8
+ "updatedAt": "2026-08-29T12:20:02Z",
9
+ "completedAt": "2026-08-29T12:20:02Z",
10
+ "artifacts": [],
11
+ "actions": [],
12
+ "problem": {
13
+ "type": "urn:gauntlet:problem:run-cancelled",
14
+ "title": "Run cancelled",
15
+ "status": 409
16
+ }
17
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "id": "run-02",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 2,
6
+ "state": "failed",
7
+ "createdAt": "2026-08-29T12:10:00Z",
8
+ "updatedAt": "2026-08-29T12:10:02Z",
9
+ "startedAt": "2026-08-29T12:10:01Z",
10
+ "completedAt": "2026-08-29T12:10:02Z",
11
+ "summary": {
12
+ "title": "Access review failed",
13
+ "message": "The target application was unavailable.",
14
+ "tone": "error"
15
+ },
16
+ "artifacts": [
17
+ {
18
+ "id": "failure-notice",
19
+ "kind": "notice",
20
+ "level": "error",
21
+ "message": "The target application was unavailable."
22
+ }
23
+ ],
24
+ "actions": [],
25
+ "problem": {
26
+ "type": "urn:gauntlet:problem:handler-failed",
27
+ "title": "Operation handler failed",
28
+ "status": 502,
29
+ "detail": "The target application was unavailable.",
30
+ "correlationId": "correlation-02"
31
+ }
32
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "run-invalid-active",
3
+ "operationId": "fixture-operation",
4
+ "operationRevision": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
5
+ "sequence": 1,
6
+ "state": "running",
7
+ "createdAt": "2026-08-29T12:00:00Z",
8
+ "updatedAt": "2026-08-29T12:00:01Z",
9
+ "artifacts": [],
10
+ "actions": [],
11
+ "problem": {
12
+ "type": "urn:gauntlet:problem:handler-failed",
13
+ "title": "Handler failed",
14
+ "status": 500
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "run-cancelled-invalid-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 1,
6
+ "state": "cancelled",
7
+ "createdAt": "2026-08-29T12:20:00Z",
8
+ "updatedAt": "2026-08-29T12:20:02Z",
9
+ "completedAt": "2026-08-29T12:20:02Z",
10
+ "artifacts": [],
11
+ "actions": [],
12
+ "problem": {
13
+ "type": "urn:gauntlet:problem:handler-failed",
14
+ "title": "Operation failed",
15
+ "status": 500
16
+ }
17
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "run-invalid-terminal",
3
+ "operationId": "fixture-operation",
4
+ "operationRevision": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
5
+ "sequence": 2,
6
+ "state": "failed",
7
+ "createdAt": "2026-08-29T12:00:00Z",
8
+ "updatedAt": "2026-08-29T12:00:02Z",
9
+ "completedAt": "2026-08-29T12:00:02Z",
10
+ "artifacts": [],
11
+ "actions": []
12
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "run-timed-out-invalid-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 2,
6
+ "state": "timed_out",
7
+ "createdAt": "2026-08-29T12:30:00Z",
8
+ "updatedAt": "2026-08-29T12:32:01Z",
9
+ "startedAt": "2026-08-29T12:30:01Z",
10
+ "completedAt": "2026-08-29T12:32:01Z",
11
+ "artifacts": [],
12
+ "actions": [],
13
+ "problem": {
14
+ "type": "urn:gauntlet:problem:run-timed-out",
15
+ "title": "Run timed out",
16
+ "status": 409
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "run-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 0,
6
+ "state": "queued",
7
+ "createdAt": "2026-08-29T12:00:00Z",
8
+ "updatedAt": "2026-08-29T12:00:00Z",
9
+ "summary": {
10
+ "title": "Access review queued",
11
+ "tone": "neutral"
12
+ },
13
+ "artifacts": [],
14
+ "actions": []
15
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "id": "run-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 2,
6
+ "state": "succeeded",
7
+ "createdAt": "2026-08-29T12:00:00Z",
8
+ "updatedAt": "2026-08-29T12:00:03Z",
9
+ "startedAt": "2026-08-29T12:00:01Z",
10
+ "completedAt": "2026-08-29T12:00:03Z",
11
+ "progress": {
12
+ "current": 12,
13
+ "total": 12,
14
+ "phase": "complete",
15
+ "message": "Review completed",
16
+ "updatedAt": "2026-08-29T12:00:03Z"
17
+ },
18
+ "summary": {
19
+ "title": "Access review complete",
20
+ "message": "12 access grants were reviewed.",
21
+ "tone": "success"
22
+ },
23
+ "output": {
24
+ "reviewed": 12,
25
+ "notified": true
26
+ },
27
+ "artifacts": [
28
+ {
29
+ "id": "review-counts",
30
+ "kind": "metrics",
31
+ "title": "Review counts",
32
+ "metrics": [
33
+ { "name": "reviewed", "value": 12, "unit": "grants" }
34
+ ]
35
+ },
36
+ {
37
+ "id": "review-summary",
38
+ "kind": "table",
39
+ "title": "Reviewed roles",
40
+ "columns": [
41
+ { "key": "role", "label": "Role" },
42
+ { "key": "count", "label": "Count" }
43
+ ],
44
+ "rows": [
45
+ { "role": "viewer", "count": 8 },
46
+ { "role": "auditor", "count": 4 }
47
+ ]
48
+ },
49
+ {
50
+ "id": "browser-session",
51
+ "kind": "browser-launch",
52
+ "label": "Open reviewed application"
53
+ }
54
+ ],
55
+ "actions": [
56
+ {
57
+ "kind": "invoke-operation",
58
+ "label": "Review another application",
59
+ "operationId": "application-access-review",
60
+ "input": { "notify": false }
61
+ },
62
+ {
63
+ "kind": "browser-launch",
64
+ "label": "Open reviewed application",
65
+ "artifactId": "browser-session"
66
+ }
67
+ ]
68
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "run-timed-out-01",
3
+ "operationId": "application-access-review",
4
+ "operationRevision": "sha256:2e301a636fb48d2bec64fc7e91b62d8a45e47af3a28f665b6b809f6a4b19d9e8",
5
+ "sequence": 2,
6
+ "state": "timed_out",
7
+ "createdAt": "2026-08-29T12:30:00Z",
8
+ "updatedAt": "2026-08-29T12:32:01Z",
9
+ "startedAt": "2026-08-29T12:30:01Z",
10
+ "completedAt": "2026-08-29T12:32:01Z",
11
+ "artifacts": [],
12
+ "actions": [],
13
+ "problem": {
14
+ "type": "urn:gauntlet:problem:run-timed-out",
15
+ "title": "Run timed out",
16
+ "status": 504
17
+ }
18
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "url": "https://portal.example.test/gauntlet/session/launch-01",
3
+ "expiresAt": "2026-08-29T12:15:00Z",
4
+ "singleUse": true
5
+ }