@shipeasy/openapi 2.2.0 → 2.3.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/dist/{chunk-643YSMLU.js → chunk-LYNWK55D.js} +23 -1
- package/dist/chunk-LYNWK55D.js.map +1 -0
- package/dist/{chunk-MRW3DJ57.js → chunk-PRN4AEAM.js} +250 -100
- package/dist/chunk-PRN4AEAM.js.map +1 -0
- package/dist/{client-K0ShmsC7.d.ts → client-DO5HTb_L.d.ts} +690 -143
- package/dist/client.d.ts +1 -1
- package/dist/client.js +7 -1
- package/dist/custom.js +4 -4
- package/dist/custom.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/schemas.d.ts +686 -73
- package/dist/schemas.js +41 -5
- package/openapi.json +1486 -521
- package/openapi.yaml +1016 -350
- package/package.json +1 -1
- package/spec/components/errors.yaml +30 -1
- package/spec/components/schemas/common.yaml +6 -0
- package/spec/components/schemas/errors-api.yaml +66 -3
- package/spec/components/schemas/experiment-api-row.yaml +293 -0
- package/spec/components/schemas/experiments.yaml +54 -299
- package/spec/components/schemas/gates.yaml +19 -0
- package/spec/components/schemas/keys.yaml +2 -1
- package/spec/components/schemas/metrics.yaml +17 -17
- package/spec/components/schemas/ops.yaml +101 -0
- package/spec/components/schemas/projects.yaml +119 -1
- package/spec/components/schemas/universes.yaml +83 -1
- package/spec/openapi.yaml +14 -0
- package/spec/paths/alert-rules.yaml +1 -0
- package/spec/paths/configs.yaml +1 -0
- package/spec/paths/errors.yaml +96 -2
- package/spec/paths/events.yaml +1 -0
- package/spec/paths/experiments.yaml +8 -0
- package/spec/paths/gates.yaml +1 -0
- package/spec/paths/keys.yaml +1 -0
- package/spec/paths/killswitches.yaml +1 -0
- package/spec/paths/metrics.yaml +1 -0
- package/spec/paths/ops.yaml +111 -0
- package/spec/paths/projects.yaml +2 -2
- package/spec/paths/universes.yaml +1 -0
- package/dist/chunk-643YSMLU.js.map +0 -1
- package/dist/chunk-MRW3DJ57.js.map +0 -1
|
@@ -245,6 +245,11 @@ OpsErrorContext:
|
|
|
245
245
|
items:
|
|
246
246
|
type: string
|
|
247
247
|
description: "Distinct, id-normalized routes this error has surfaced on (UUIDs/ids collapsed to `#`)."
|
|
248
|
+
stackTail:
|
|
249
|
+
anyOf:
|
|
250
|
+
- type: string
|
|
251
|
+
- type: "null"
|
|
252
|
+
description: "The last 3 non-empty lines of the latest occurrence's stack — the innermost frames closest to where the throw bubbled out, baked in as an at-a-glance locator. `null` when the source supplied no stack. Fetch the full stack via `related.error`."
|
|
248
253
|
sdkVersion:
|
|
249
254
|
anyOf:
|
|
250
255
|
- type: string
|
|
@@ -380,6 +385,11 @@ OpsAlertMetricSummary:
|
|
|
380
385
|
OpsMeasurePlanContext:
|
|
381
386
|
type: object
|
|
382
387
|
properties:
|
|
388
|
+
goal:
|
|
389
|
+
anyOf:
|
|
390
|
+
- type: string
|
|
391
|
+
- type: "null"
|
|
392
|
+
description: "The customer's underlying intent in their own words — WHAT they want to learn or achieve and WHY, independent of the specific steps. The plan below is a best-effort proposal made without repo access; when the code reveals a better path, this goal is the target you optimize for, not literal step-adherence."
|
|
383
393
|
created:
|
|
384
394
|
type: array
|
|
385
395
|
items:
|
|
@@ -927,6 +937,97 @@ LinkPrToOpsItemResponse:
|
|
|
927
937
|
- id
|
|
928
938
|
additionalProperties: false
|
|
929
939
|
description: Response for the update / link-pr endpoints.
|
|
940
|
+
OpsCommentAuthorType:
|
|
941
|
+
type: string
|
|
942
|
+
enum:
|
|
943
|
+
- user
|
|
944
|
+
- system
|
|
945
|
+
description: >-
|
|
946
|
+
Who wrote a comment. `user` is a teammate (their email is in `authorEmail`);
|
|
947
|
+
`system` is Jarvis — the AI agent — which authors comments when an ops-notify
|
|
948
|
+
escalation lands on the item and when it is `@shipeasy`-mentioned in a thread.
|
|
949
|
+
OpsComment:
|
|
950
|
+
type: object
|
|
951
|
+
properties:
|
|
952
|
+
id:
|
|
953
|
+
type: string
|
|
954
|
+
description: Comment id.
|
|
955
|
+
feedbackId:
|
|
956
|
+
type: string
|
|
957
|
+
description: The queue item this comment hangs off.
|
|
958
|
+
parentId:
|
|
959
|
+
anyOf:
|
|
960
|
+
- type: string
|
|
961
|
+
- type: "null"
|
|
962
|
+
description: The top-level comment this is a reply to, or `null` for a top-level comment.
|
|
963
|
+
authorType:
|
|
964
|
+
$ref: "#/OpsCommentAuthorType"
|
|
965
|
+
authorEmail:
|
|
966
|
+
anyOf:
|
|
967
|
+
- type: string
|
|
968
|
+
- type: "null"
|
|
969
|
+
description: The teammate who wrote it, or `null` for a `system` (Jarvis) comment.
|
|
970
|
+
body:
|
|
971
|
+
type: string
|
|
972
|
+
description: Comment body as markdown (may contain sanitised inline image/video embeds).
|
|
973
|
+
createdAt:
|
|
974
|
+
type: string
|
|
975
|
+
description: ISO-8601 creation timestamp.
|
|
976
|
+
updatedAt:
|
|
977
|
+
type: string
|
|
978
|
+
description: ISO-8601 last-edit timestamp.
|
|
979
|
+
required:
|
|
980
|
+
- id
|
|
981
|
+
- feedbackId
|
|
982
|
+
- parentId
|
|
983
|
+
- authorType
|
|
984
|
+
- authorEmail
|
|
985
|
+
- body
|
|
986
|
+
- createdAt
|
|
987
|
+
- updatedAt
|
|
988
|
+
additionalProperties: false
|
|
989
|
+
description: A single comment on a queue item.
|
|
990
|
+
ListOpsCommentsResponse:
|
|
991
|
+
type: object
|
|
992
|
+
properties:
|
|
993
|
+
comments:
|
|
994
|
+
type: array
|
|
995
|
+
items:
|
|
996
|
+
$ref: "#/OpsComment"
|
|
997
|
+
required:
|
|
998
|
+
- comments
|
|
999
|
+
additionalProperties: false
|
|
1000
|
+
description: Response for `GET /api/admin/ops/{handle}/comments` — the thread, oldest first.
|
|
1001
|
+
CreateOpsCommentRequest:
|
|
1002
|
+
type: object
|
|
1003
|
+
properties:
|
|
1004
|
+
body:
|
|
1005
|
+
type: string
|
|
1006
|
+
minLength: 1
|
|
1007
|
+
maxLength: 10000
|
|
1008
|
+
description: The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it.
|
|
1009
|
+
parentId:
|
|
1010
|
+
anyOf:
|
|
1011
|
+
- type: string
|
|
1012
|
+
- type: "null"
|
|
1013
|
+
description: >-
|
|
1014
|
+
Reply under this top-level comment. Omit / `null` for a top-level
|
|
1015
|
+
comment. Replying to a reply attaches to the same top-level parent
|
|
1016
|
+
(threading is one level deep).
|
|
1017
|
+
required:
|
|
1018
|
+
- body
|
|
1019
|
+
additionalProperties: false
|
|
1020
|
+
description: Body for `POST /api/admin/ops/{handle}/comments`.
|
|
1021
|
+
CreateOpsCommentResponse:
|
|
1022
|
+
type: object
|
|
1023
|
+
properties:
|
|
1024
|
+
id:
|
|
1025
|
+
type: string
|
|
1026
|
+
description: Newly created comment id.
|
|
1027
|
+
required:
|
|
1028
|
+
- id
|
|
1029
|
+
additionalProperties: false
|
|
1030
|
+
description: Response for `POST /api/admin/ops/{handle}/comments`.
|
|
930
1031
|
NotifyOpsRequest:
|
|
931
1032
|
type: object
|
|
932
1033
|
properties:
|
|
@@ -19,7 +19,9 @@ GetCurrentProjectResponse:
|
|
|
19
19
|
type: string
|
|
20
20
|
enum:
|
|
21
21
|
- free
|
|
22
|
-
-
|
|
22
|
+
- pro
|
|
23
|
+
- business
|
|
24
|
+
- enterprise
|
|
23
25
|
description: Billing plan tier.
|
|
24
26
|
status:
|
|
25
27
|
type: string
|
|
@@ -74,6 +76,50 @@ GetCurrentProjectResponse:
|
|
|
74
76
|
- type: boolean
|
|
75
77
|
- type: number
|
|
76
78
|
description: Whether the feedback/ops module is enabled.
|
|
79
|
+
minSampleSize:
|
|
80
|
+
type: integer
|
|
81
|
+
description: Verdict power guard — minimum users per arm before a ship/hold verdict.
|
|
82
|
+
minRuntimeDays:
|
|
83
|
+
type: integer
|
|
84
|
+
description: Minimum days an experiment must run before a verdict (peeking guard).
|
|
85
|
+
defaultPower:
|
|
86
|
+
type: number
|
|
87
|
+
description: Target statistical power (1−β) feeding the realized-MDE calculation.
|
|
88
|
+
ciConfidence:
|
|
89
|
+
type: number
|
|
90
|
+
description: Confidence level for the interval surfaced on results.
|
|
91
|
+
defaultAllocationPct:
|
|
92
|
+
type: integer
|
|
93
|
+
description: Default traffic allocation (basis points) new experiments start with.
|
|
94
|
+
defaultHoldout:
|
|
95
|
+
type: integer
|
|
96
|
+
description: Default holdout carve-out (basis points) that seeds each new universe's holdout.
|
|
97
|
+
defaultWinsorizePct:
|
|
98
|
+
type: integer
|
|
99
|
+
description: Default winsorization percentile new metrics start with.
|
|
100
|
+
defaultMei:
|
|
101
|
+
anyOf:
|
|
102
|
+
- type: number
|
|
103
|
+
- type: "null"
|
|
104
|
+
description: Default minimum effect of interest (relative, 0–1) new metrics start with, or null.
|
|
105
|
+
cupedBaselineDays:
|
|
106
|
+
type: integer
|
|
107
|
+
description: CUPED baseline window — days of pre-experiment history, frozen at start.
|
|
108
|
+
cupedMinOverlap:
|
|
109
|
+
type: number
|
|
110
|
+
description: CUPED selection-bias guard — min share of users with a baseline, else skip.
|
|
111
|
+
cupedMinBaselineUsers:
|
|
112
|
+
type: integer
|
|
113
|
+
description: CUPED — minimum users with a baseline before it runs at all.
|
|
114
|
+
msprtTauMeiFactor:
|
|
115
|
+
type: number
|
|
116
|
+
description: mSPRT prior width — τ = minimum effect of interest × this factor.
|
|
117
|
+
msprtTauSdFactor:
|
|
118
|
+
type: number
|
|
119
|
+
description: mSPRT fallback prior width — τ = this × control SD when no MEI is set.
|
|
120
|
+
srmThreshold:
|
|
121
|
+
type: number
|
|
122
|
+
description: SRM chi-square p-value below which the run is called invalid.
|
|
77
123
|
createdAt:
|
|
78
124
|
type: string
|
|
79
125
|
description: ISO-8601 timestamp of project creation.
|
|
@@ -218,5 +264,77 @@ UpdateProjectRequest:
|
|
|
218
264
|
moduleEvents:
|
|
219
265
|
type: boolean
|
|
220
266
|
description: Enable/disable the events module.
|
|
267
|
+
minSampleSize:
|
|
268
|
+
type: integer
|
|
269
|
+
minimum: 2
|
|
270
|
+
maximum: 1000000
|
|
271
|
+
description: Verdict power guard — minimum users per arm before a ship/hold verdict.
|
|
272
|
+
minRuntimeDays:
|
|
273
|
+
type: integer
|
|
274
|
+
minimum: 0
|
|
275
|
+
maximum: 365
|
|
276
|
+
description: Minimum days an experiment must run before a verdict (peeking guard).
|
|
277
|
+
defaultPower:
|
|
278
|
+
type: number
|
|
279
|
+
minimum: 0.5
|
|
280
|
+
maximum: 0.99
|
|
281
|
+
description: Target statistical power (1−β) feeding the realized-MDE calculation.
|
|
282
|
+
ciConfidence:
|
|
283
|
+
type: number
|
|
284
|
+
minimum: 0.5
|
|
285
|
+
maximum: 0.999
|
|
286
|
+
description: Confidence level for the interval surfaced on results (any value in [0.5, 0.999], e.g. 0.90, 0.95, 0.975, 0.99).
|
|
287
|
+
defaultAllocationPct:
|
|
288
|
+
type: integer
|
|
289
|
+
minimum: 1
|
|
290
|
+
maximum: 10000
|
|
291
|
+
description: Default traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment.
|
|
292
|
+
defaultHoldout:
|
|
293
|
+
type: integer
|
|
294
|
+
minimum: 0
|
|
295
|
+
maximum: 10000
|
|
296
|
+
description: Default holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
|
|
297
|
+
defaultWinsorizePct:
|
|
298
|
+
type: integer
|
|
299
|
+
minimum: 1
|
|
300
|
+
maximum: 99
|
|
301
|
+
description: Default winsorization percentile new metrics start with; overridable per metric.
|
|
302
|
+
defaultMei:
|
|
303
|
+
anyOf:
|
|
304
|
+
- type: number
|
|
305
|
+
minimum: 0
|
|
306
|
+
maximum: 1
|
|
307
|
+
- type: "null"
|
|
308
|
+
description: Default minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it.
|
|
309
|
+
cupedBaselineDays:
|
|
310
|
+
type: integer
|
|
311
|
+
minimum: 1
|
|
312
|
+
maximum: 365
|
|
313
|
+
description: CUPED baseline window — days of pre-experiment history, frozen at start.
|
|
314
|
+
cupedMinOverlap:
|
|
315
|
+
type: number
|
|
316
|
+
minimum: 0.01
|
|
317
|
+
maximum: 0.99
|
|
318
|
+
description: CUPED selection-bias guard — min share of users with a baseline, else skip.
|
|
319
|
+
cupedMinBaselineUsers:
|
|
320
|
+
type: integer
|
|
321
|
+
minimum: 10
|
|
322
|
+
maximum: 100000
|
|
323
|
+
description: CUPED — minimum users with a baseline before it runs at all.
|
|
324
|
+
msprtTauMeiFactor:
|
|
325
|
+
type: number
|
|
326
|
+
minimum: 0.1
|
|
327
|
+
maximum: 2
|
|
328
|
+
description: mSPRT prior width — τ = minimum effect of interest × this factor.
|
|
329
|
+
msprtTauSdFactor:
|
|
330
|
+
type: number
|
|
331
|
+
minimum: 0.05
|
|
332
|
+
maximum: 1
|
|
333
|
+
description: mSPRT fallback prior width — τ = this × control SD when no MEI is set.
|
|
334
|
+
srmThreshold:
|
|
335
|
+
type: number
|
|
336
|
+
minimum: 0.0001
|
|
337
|
+
maximum: 0.05
|
|
338
|
+
description: SRM chi-square p-value below which the run is called invalid.
|
|
221
339
|
additionalProperties: false
|
|
222
340
|
description: "Body for `PATCH /api/admin/projects/{id}`. Partial — every field is optional; only supplied fields change. The project id in the path must match the caller's own project."
|
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
# The universe owns the config schema for every experiment/variant in it — an
|
|
2
|
+
# ordered list of `{ name, type, default }`. Experiments may only override the
|
|
3
|
+
# per-variant value of a declared param, never add fields (universe rework).
|
|
4
|
+
UniverseParam:
|
|
5
|
+
type: object
|
|
6
|
+
properties:
|
|
7
|
+
name:
|
|
8
|
+
type: string
|
|
9
|
+
minLength: 1
|
|
10
|
+
maxLength: 128
|
|
11
|
+
pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$
|
|
12
|
+
description: Param key, referenced by `groups[].params` on every experiment in the universe.
|
|
13
|
+
type:
|
|
14
|
+
type: string
|
|
15
|
+
enum:
|
|
16
|
+
- bool
|
|
17
|
+
- string
|
|
18
|
+
- int
|
|
19
|
+
- number
|
|
20
|
+
description: Scalar type of the param's value.
|
|
21
|
+
default:
|
|
22
|
+
description: "Universe-wide default. Returned when the assigned variant doesn't override this param (resolution: variant override → universe default)."
|
|
23
|
+
required:
|
|
24
|
+
- name
|
|
25
|
+
- type
|
|
26
|
+
- default
|
|
27
|
+
additionalProperties: false
|
|
28
|
+
UniverseParamSchema:
|
|
29
|
+
type: array
|
|
30
|
+
items:
|
|
31
|
+
$ref: "#/UniverseParam"
|
|
32
|
+
description: The universe's ordered config schema — the single source of truth for its params.
|
|
1
33
|
ListUniversesResponse:
|
|
2
34
|
type: object
|
|
3
35
|
properties:
|
|
@@ -14,6 +46,11 @@ ListUniversesResponse:
|
|
|
14
46
|
maxLength: 128
|
|
15
47
|
pattern: ^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$
|
|
16
48
|
description: Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
|
|
49
|
+
description:
|
|
50
|
+
anyOf:
|
|
51
|
+
- type: string
|
|
52
|
+
- type: "null"
|
|
53
|
+
description: Human-readable blurb shown in the universe picker/hovercard.
|
|
17
54
|
unitType:
|
|
18
55
|
type: string
|
|
19
56
|
description: Unit of randomisation. Snake-case in request (`unit_type`), camelCase in response.
|
|
@@ -26,6 +63,16 @@ ListUniversesResponse:
|
|
|
26
63
|
maxItems: 2
|
|
27
64
|
- type: "null"
|
|
28
65
|
description: Reserved holdout bucket range, or `null` if none.
|
|
66
|
+
recommendedHeadroom:
|
|
67
|
+
type: integer
|
|
68
|
+
minimum: 0
|
|
69
|
+
maximum: 10000
|
|
70
|
+
description: Basis points of headroom seeded into each new experiment's reserved tail (0 = none).
|
|
71
|
+
paramSchema:
|
|
72
|
+
anyOf:
|
|
73
|
+
- $ref: "#/UniverseParamSchema"
|
|
74
|
+
- type: "null"
|
|
75
|
+
description: The universe-owned config schema, or `null` on pre-rework universes not yet seeded.
|
|
29
76
|
createdAt:
|
|
30
77
|
type: string
|
|
31
78
|
description: ISO-8601 timestamp of creation.
|
|
@@ -54,6 +101,13 @@ CreateUniverseRequest:
|
|
|
54
101
|
description: Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
|
|
55
102
|
folder:
|
|
56
103
|
$ref: ./common.yaml#/Folder
|
|
104
|
+
description:
|
|
105
|
+
default: null
|
|
106
|
+
anyOf:
|
|
107
|
+
- type: string
|
|
108
|
+
maxLength: 2000
|
|
109
|
+
- type: "null"
|
|
110
|
+
description: Human-readable blurb shown in the universe picker/hovercard.
|
|
57
111
|
unit_type:
|
|
58
112
|
default: user_id
|
|
59
113
|
description: Unit of randomisation. Typically `user_id`. Use `account_id` to keep whole accounts in the same group across an experiment.
|
|
@@ -70,6 +124,18 @@ CreateUniverseRequest:
|
|
|
70
124
|
maxItems: 2
|
|
71
125
|
- type: "null"
|
|
72
126
|
description: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or higher required.
|
|
127
|
+
recommended_headroom:
|
|
128
|
+
default: 0
|
|
129
|
+
type: integer
|
|
130
|
+
minimum: 0
|
|
131
|
+
maximum: 10000
|
|
132
|
+
description: Basis points of reserved headroom seeded into each new experiment created in this universe (0 = none). Lets variants be appended into a running experiment without reshuffling.
|
|
133
|
+
param_schema:
|
|
134
|
+
default: null
|
|
135
|
+
anyOf:
|
|
136
|
+
- $ref: "#/UniverseParamSchema"
|
|
137
|
+
- type: "null"
|
|
138
|
+
description: The universe-owned config schema — an ordered `{ name, type, default }[]`. Experiments may only override values per variant, never add fields. `null` starts an empty schema.
|
|
73
139
|
required:
|
|
74
140
|
- name
|
|
75
141
|
additionalProperties: false
|
|
@@ -94,6 +160,12 @@ UpdateUniverseRequest:
|
|
|
94
160
|
properties:
|
|
95
161
|
folder:
|
|
96
162
|
$ref: ./common.yaml#/Folder
|
|
163
|
+
description:
|
|
164
|
+
anyOf:
|
|
165
|
+
- type: string
|
|
166
|
+
maxLength: 2000
|
|
167
|
+
- type: "null"
|
|
168
|
+
description: Human-readable blurb shown in the universe picker/hovercard.
|
|
97
169
|
holdout_range:
|
|
98
170
|
anyOf:
|
|
99
171
|
- type: array
|
|
@@ -105,8 +177,18 @@ UpdateUniverseRequest:
|
|
|
105
177
|
maxItems: 2
|
|
106
178
|
- type: "null"
|
|
107
179
|
description: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or higher required.
|
|
180
|
+
recommended_headroom:
|
|
181
|
+
type: integer
|
|
182
|
+
minimum: 0
|
|
183
|
+
maximum: 10000
|
|
184
|
+
description: Basis points of reserved headroom seeded into new experiments in this universe.
|
|
185
|
+
param_schema:
|
|
186
|
+
anyOf:
|
|
187
|
+
- $ref: "#/UniverseParamSchema"
|
|
188
|
+
- type: "null"
|
|
189
|
+
description: Replace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only).
|
|
108
190
|
additionalProperties: false
|
|
109
|
-
description: Body for `PATCH /api/admin/universes/{id}`.
|
|
191
|
+
description: Body for `PATCH /api/admin/universes/{id}`. `name` and `unit_type` are immutable after create; `holdout_range`, `description`, `recommended_headroom` and `param_schema` are mutable.
|
|
110
192
|
UpdateUniverseResponse:
|
|
111
193
|
type: object
|
|
112
194
|
properties:
|
package/spec/openapi.yaml
CHANGED
|
@@ -180,6 +180,16 @@ tags:
|
|
|
180
180
|
**Immutable metric.** The bound metric (and its aggregation) is fixed at create time — there is no update path for `metricId`. Tune `threshold`/`comparator`/`windowHours`/`severity`/`name`/`enabled` instead, or delete + recreate to repoint the rule at a different metric.
|
|
181
181
|
|
|
182
182
|
**Delivery.** `notify` optionally targets a Slack channel and/or email for this rule; `null` falls back to the project's default notification settings. Slack targets require a connected Slack connector.
|
|
183
|
+
- name: Comments
|
|
184
|
+
parent: Ops
|
|
185
|
+
description: |-
|
|
186
|
+
Comments on a queue item — the discussion thread that hangs off any bug,
|
|
187
|
+
feature request, or auto-filed error/alert ticket. Append a comment or read
|
|
188
|
+
the thread; one level of threaded replies via `parentId`.
|
|
189
|
+
|
|
190
|
+
**Mentions.** `@teammate` in a body raises an in-app notification for that
|
|
191
|
+
person; `@shipeasy` asks Jarvis (the AI agent) to read the item and reply.
|
|
192
|
+
Comments authored by Jarvis carry `authorType: system`.
|
|
183
193
|
- name: Projects
|
|
184
194
|
description: |-
|
|
185
195
|
Projects: the account-level container every other resource is scoped to.
|
|
@@ -304,6 +314,8 @@ paths:
|
|
|
304
314
|
$ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}
|
|
305
315
|
/api/admin/ops/{handle}/link-pr:
|
|
306
316
|
$ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1link-pr
|
|
317
|
+
/api/admin/ops/{handle}/comments:
|
|
318
|
+
$ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1comments
|
|
307
319
|
/api/admin/notifications:
|
|
308
320
|
$ref: ./paths/ops.yaml#/~1api~1admin~1notifications
|
|
309
321
|
/api/admin/slack/channels:
|
|
@@ -338,6 +350,8 @@ paths:
|
|
|
338
350
|
$ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}
|
|
339
351
|
/api/admin/errors/{id}/file:
|
|
340
352
|
$ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1file
|
|
353
|
+
/api/admin/errors/{id}/resolve:
|
|
354
|
+
$ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1resolve
|
|
341
355
|
/api/admin/errors/{id}/series:
|
|
342
356
|
$ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1series
|
|
343
357
|
/api/admin/connectors:
|
package/spec/paths/configs.yaml
CHANGED
package/spec/paths/errors.yaml
CHANGED
|
@@ -96,9 +96,9 @@
|
|
|
96
96
|
operationId: getError
|
|
97
97
|
summary: Get a tracked error
|
|
98
98
|
description: |-
|
|
99
|
-
Returns a single tracked error by its id, including the latest occurrence's stack, extras, and consequence. Returns `404` if no such error exists in the project.
|
|
99
|
+
Returns a single tracked error by its id, including the latest occurrence's stack, extras, and consequence, plus `occurrences` — the sampled per-instance detail rows behind the issue (newest first; exhaustive while the issue is small, thinned at volume, capped at 100). Returns `404` if no such error exists in the project.
|
|
100
100
|
|
|
101
|
-
**Use case:** Drill into one issue — fetch its full stack and `seenUrls` to investigate, or
|
|
101
|
+
**Use case:** Drill into one issue — fetch its full stack and `seenUrls` to investigate, or walk `occurrences` to see how the failing message/stack varies across instances.
|
|
102
102
|
tags:
|
|
103
103
|
- Errors
|
|
104
104
|
parameters:
|
|
@@ -142,6 +142,31 @@
|
|
|
142
142
|
lastSeenAt: 2026-06-28T14:55:31.000Z
|
|
143
143
|
createdAt: 2026-06-20T08:11:02.000Z
|
|
144
144
|
updatedAt: 2026-06-28T14:55:31.000Z
|
|
145
|
+
occurrences:
|
|
146
|
+
- id: occ_01j7w7qq0v3k9d2m5rc8t1xh4n
|
|
147
|
+
message: Cannot read properties of undefined (reading 'id')
|
|
148
|
+
stack: |-
|
|
149
|
+
TypeError: Cannot read properties of undefined (reading 'id')
|
|
150
|
+
at GateEditor (/app/gates/[id]/page.tsx:42:18)
|
|
151
|
+
url: https://app.example.com/dashboard/gat_01j7/edit
|
|
152
|
+
env: prod
|
|
153
|
+
side: client
|
|
154
|
+
sdkVersion: 6.0.0
|
|
155
|
+
extrasJson: '{"gateId":"gat_01j7"}'
|
|
156
|
+
sampleRate: 100
|
|
157
|
+
seenAt: 2026-06-28T14:55:31.000Z
|
|
158
|
+
- id: occ_01j7w7pk8s6e3f9b0zad7y5w2q
|
|
159
|
+
message: Cannot read properties of undefined (reading 'id')
|
|
160
|
+
stack: |-
|
|
161
|
+
TypeError: Cannot read properties of undefined (reading 'id')
|
|
162
|
+
at GateEditor (/app/gates/[id]/page.tsx:42:18)
|
|
163
|
+
url: https://app.example.com/dashboard/gat_02c4/edit
|
|
164
|
+
env: prod
|
|
165
|
+
side: client
|
|
166
|
+
sdkVersion: 6.0.0
|
|
167
|
+
extrasJson: '{"gateId":"gat_02c4"}'
|
|
168
|
+
sampleRate: 10
|
|
169
|
+
seenAt: 2026-06-24T09:12:05.000Z
|
|
145
170
|
"400":
|
|
146
171
|
$ref: ../components/responses.yaml#/BadRequest
|
|
147
172
|
"401":
|
|
@@ -303,6 +328,75 @@
|
|
|
303
328
|
name: file
|
|
304
329
|
positional:
|
|
305
330
|
- id
|
|
331
|
+
/api/admin/errors/{id}/resolve:
|
|
332
|
+
post:
|
|
333
|
+
operationId: resolveError
|
|
334
|
+
summary: Resolve a tracked error
|
|
335
|
+
description: |-
|
|
336
|
+
Marks one tracked error `resolved` — the single-purpose "close out" action. Takes no body; it is `PATCH /api/admin/errors/{id}` pinned to `{ "status": "resolved" }`, exposed so tooling can close an error without being handed the full open/resolved/ignored status machine. A resolved error reopens automatically (ingestion-side) if it recurs, so resolving is always safe: a premature resolve un-does itself on the next occurrence. Returns the updated row; `404` if the error does not exist.
|
|
337
|
+
|
|
338
|
+
**Use case:** Close out a tracked error from an agent or script once its fix has shipped — e.g. after a deploy, resolve every open issue the change addressed and let recurrence reopen anything that wasn't actually fixed.
|
|
339
|
+
tags:
|
|
340
|
+
- Errors
|
|
341
|
+
parameters:
|
|
342
|
+
- $ref: ../components/parameters.yaml#/ProjectId
|
|
343
|
+
- name: id
|
|
344
|
+
in: path
|
|
345
|
+
required: true
|
|
346
|
+
description: Stable opaque error id (`err_…`).
|
|
347
|
+
schema:
|
|
348
|
+
$ref: ../components/schemas/common.yaml#/ResourceId
|
|
349
|
+
responses:
|
|
350
|
+
"200":
|
|
351
|
+
description: Resolve a tracked error
|
|
352
|
+
content:
|
|
353
|
+
application/json:
|
|
354
|
+
schema:
|
|
355
|
+
$ref: ../components/schemas/errors-api.yaml#/ErrorRecord
|
|
356
|
+
example:
|
|
357
|
+
id: err_01j7w7m9q4hxbf6npe6s9zr3vc
|
|
358
|
+
projectId: e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90
|
|
359
|
+
fingerprint: 9c1f4f1f2c0c4a5fa1c2b6d3e7c8e3a1
|
|
360
|
+
causedByFingerprint: null
|
|
361
|
+
message: Cannot read properties of undefined (reading 'id')
|
|
362
|
+
errorType: TypeError
|
|
363
|
+
stack: null
|
|
364
|
+
source: shipeasy
|
|
365
|
+
url: https://app.example.com/dashboard/gat_01j7/edit
|
|
366
|
+
seenUrls: null
|
|
367
|
+
subject: gate editor
|
|
368
|
+
outcome: crash on load
|
|
369
|
+
side: client
|
|
370
|
+
env: prod
|
|
371
|
+
kind: uncaught
|
|
372
|
+
lastExtrasJson: null
|
|
373
|
+
sdkVersion: 6.0.0
|
|
374
|
+
count: 137
|
|
375
|
+
status: resolved
|
|
376
|
+
firstSeenAt: 2026-06-20T08:11:02.000Z
|
|
377
|
+
lastSeenAt: 2026-06-28T14:55:31.000Z
|
|
378
|
+
createdAt: 2026-06-20T08:11:02.000Z
|
|
379
|
+
updatedAt: 2026-06-28T15:02:10.000Z
|
|
380
|
+
"400":
|
|
381
|
+
$ref: ../components/responses.yaml#/BadRequest
|
|
382
|
+
"401":
|
|
383
|
+
$ref: ../components/responses.yaml#/Unauthorized
|
|
384
|
+
"403":
|
|
385
|
+
$ref: ../components/responses.yaml#/Forbidden
|
|
386
|
+
"404":
|
|
387
|
+
$ref: ../components/responses.yaml#/NotFound
|
|
388
|
+
"409":
|
|
389
|
+
$ref: ../components/responses.yaml#/Conflict
|
|
390
|
+
"422":
|
|
391
|
+
$ref: ../components/responses.yaml#/UnprocessableEntity
|
|
392
|
+
x-error-codes:
|
|
393
|
+
- UNAUTHORIZED
|
|
394
|
+
- FORBIDDEN
|
|
395
|
+
- NOT_FOUND
|
|
396
|
+
x-cli:
|
|
397
|
+
name: resolve
|
|
398
|
+
positional:
|
|
399
|
+
- id
|
|
306
400
|
/api/admin/errors/{id}/series:
|
|
307
401
|
post:
|
|
308
402
|
operationId: getErrorSeries
|
package/spec/paths/events.yaml
CHANGED
|
@@ -372,6 +372,7 @@
|
|
|
372
372
|
- GROUPS_WEIGHT_SUM
|
|
373
373
|
- REFERENCED_NOT_FOUND
|
|
374
374
|
- VALIDATION
|
|
375
|
+
- EXPERIMENT_IMMUTABLE_FIELD
|
|
375
376
|
x-cli:
|
|
376
377
|
name: update
|
|
377
378
|
positional:
|
|
@@ -510,6 +511,12 @@
|
|
|
510
511
|
- NOT_FOUND
|
|
511
512
|
- INVALID_TRANSITION
|
|
512
513
|
- VALIDATION
|
|
514
|
+
- PLAN_LIMIT
|
|
515
|
+
- EXPERIMENT_NO_GOAL_METRIC
|
|
516
|
+
- EXPERIMENT_ARCHIVED_RESTART
|
|
517
|
+
- EXPERIMENT_NOT_RUNNING
|
|
518
|
+
- EXPERIMENT_RUNNING_ARCHIVE
|
|
519
|
+
- EXPERIMENT_RESTORE_INVALID
|
|
513
520
|
x-cli:
|
|
514
521
|
positional:
|
|
515
522
|
- id
|
|
@@ -604,6 +611,7 @@
|
|
|
604
611
|
- EVENT_PENDING
|
|
605
612
|
- REFERENCED_NOT_FOUND
|
|
606
613
|
- VALIDATION
|
|
614
|
+
- METRIC_UNKNOWN_ID
|
|
607
615
|
x-cli:
|
|
608
616
|
name: set-metrics
|
|
609
617
|
positional:
|
package/spec/paths/gates.yaml
CHANGED
package/spec/paths/keys.yaml
CHANGED