@shipeasy/openapi 2.1.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-EPLLHLZN.js → chunk-LYNWK55D.js} +23 -1
- package/dist/chunk-LYNWK55D.js.map +1 -0
- package/dist/{chunk-SPH5HWCD.js → chunk-PRN4AEAM.js} +396 -187
- package/dist/chunk-PRN4AEAM.js.map +1 -0
- package/dist/{client-pVkoo3Bf.d.ts → client-DO5HTb_L.d.ts} +886 -241
- package/dist/client.d.ts +1 -1
- package/dist/client.js +7 -1
- package/dist/custom.d.ts +23 -1
- package/dist/custom.js +12 -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 +770 -104
- package/dist/schemas.js +57 -5
- package/openapi.json +2177 -775
- package/openapi.yaml +1373 -409
- package/package.json +1 -1
- package/spec/components/errors.yaml +30 -1
- package/spec/components/parameters.yaml +8 -0
- package/spec/components/responses.yaml +15 -0
- package/spec/components/schemas/common.yaml +11 -0
- package/spec/components/schemas/connectors.yaml +5 -11
- 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/gate-templates.yaml +41 -2
- 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 +105 -2
- package/spec/components/schemas/projects.yaml +119 -1
- package/spec/components/schemas/universes.yaml +83 -1
- package/spec/openapi.yaml +35 -2
- package/spec/paths/alert-rules.yaml +11 -2
- package/spec/paths/attributes.yaml +14 -3
- package/spec/paths/configs.yaml +24 -9
- package/spec/paths/connectors.yaml +42 -8
- package/spec/paths/errors.yaml +100 -6
- package/spec/paths/events.yaml +19 -4
- package/spec/paths/experiments.yaml +45 -11
- package/spec/paths/gate-templates.yaml +9 -5
- package/spec/paths/gates.yaml +21 -6
- package/spec/paths/i18n.yaml +18 -5
- package/spec/paths/keys.yaml +3 -1
- package/spec/paths/killswitches.yaml +24 -6
- package/spec/paths/metrics.yaml +15 -3
- package/spec/paths/ops.yaml +114 -3
- package/spec/paths/projects.yaml +3 -3
- package/spec/paths/universes.yaml +11 -2
- package/dist/chunk-EPLLHLZN.js.map +0 -1
- package/dist/chunk-SPH5HWCD.js.map +0 -1
package/openapi.json
CHANGED
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"tags": [
|
|
32
32
|
{
|
|
33
33
|
"name": "Release",
|
|
34
|
-
"summary": "Feature delivery",
|
|
34
|
+
"summary": "Feature delivery — flags, kill switches, dynamic configs, A/B experiments, and the universes they bucket in.",
|
|
35
35
|
"kind": "nav",
|
|
36
|
-
"description": "
|
|
36
|
+
"description": "Release: the feature-delivery surface. One roof over the five resources\nthat decide which code path a user gets — feature gates (flags), kill\nswitches, dynamic configs, A/B/n experiments, and the universes that bucket\nthem — each exposed as its own subcommand group.\n\n**Groups.**\n- `flags` — boolean feature gates: AND-combined targeting rules + a percentage rollout (basis points), evaluated on the SDK hot path.\n- `killswitch` (`ks`) — per-env boolean overrides for incident response; no rules, no rollout, versioned per environment.\n- `configs` — JSON-Schema-validated structured values with a draft → publish workflow, delivered per environment.\n- `experiments` — randomised A/B/n assignment plus the analysis pipeline (t-test, sequential testing, SRM detection); `universes` hold the shared bucketing space and holdouts the experiments draw from.\n\n**Delivery model.** Every write rebuilds the project's KV blob and purges\nthe CDN — SDKs poll at the plan interval and never touch the database on\nthe hot path. The destructive verb is `archive` (soft-delete), never\n`delete`.\n\nRun `shipeasy release <group> --help` for the full contract of each group."
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"name": "Flags",
|
|
@@ -98,6 +98,11 @@
|
|
|
98
98
|
},
|
|
99
99
|
"description": "Alert rules: the metric-threshold definitions the analysis cron evaluates each run.\n\n**What fires.** Each rule binds a `metricId`, a `comparator` (`gt`/`gte`/`lt`/`lte`), and a `threshold`. On every cron pass the cron aggregates the metric over the trailing `windowHours` and raises an alert at `severity` when `value comparator threshold` holds.\n\n**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.\n\n**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."
|
|
100
100
|
},
|
|
101
|
+
{
|
|
102
|
+
"name": "Comments",
|
|
103
|
+
"parent": "Ops",
|
|
104
|
+
"description": "Comments on a queue item — the discussion thread that hangs off any bug,\nfeature request, or auto-filed error/alert ticket. Append a comment or read\nthe thread; one level of threaded replies via `parentId`.\n\n**Mentions.** `@teammate` in a body raises an in-app notification for that\nperson; `@shipeasy` asks Jarvis (the AI agent) to read the item and reply.\nComments authored by Jarvis carry `authorType: system`."
|
|
105
|
+
},
|
|
101
106
|
{
|
|
102
107
|
"name": "Projects",
|
|
103
108
|
"description": "Projects: the account-level container every other resource is scoped to.\n\n**Account-level, not bound-project-level.** Both operations resolve from the caller's credential rather than the `.shipeasy`-bound project — `current` reads the project the auth header maps to, and `upsert` find-or-creates under the session's owner. Neither touches the local `.shipeasy` binding; recording the result there is a consumer side-effect layered on top.\n\n**Idempotent upsert.** A project is keyed by `(owner_email, domain)`. Calling `upsert` again with the same domain returns the existing project with `created: false`, so it is safe to run on every install."
|
|
@@ -157,6 +162,9 @@
|
|
|
157
162
|
},
|
|
158
163
|
{
|
|
159
164
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"$ref": "#/components/parameters/Q"
|
|
160
168
|
}
|
|
161
169
|
],
|
|
162
170
|
"responses": {
|
|
@@ -360,6 +368,32 @@
|
|
|
360
368
|
"name": "checkout_v2"
|
|
361
369
|
}
|
|
362
370
|
}
|
|
371
|
+
},
|
|
372
|
+
"links": {
|
|
373
|
+
"UpdateGate": {
|
|
374
|
+
"operationId": "updateGate",
|
|
375
|
+
"parameters": {
|
|
376
|
+
"id": "$response.body#/id"
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"EnableGate": {
|
|
380
|
+
"operationId": "enableGate",
|
|
381
|
+
"parameters": {
|
|
382
|
+
"id": "$response.body#/id"
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"DisableGate": {
|
|
386
|
+
"operationId": "disableGate",
|
|
387
|
+
"parameters": {
|
|
388
|
+
"id": "$response.body#/id"
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
"DeleteGate": {
|
|
392
|
+
"operationId": "deleteGate",
|
|
393
|
+
"parameters": {
|
|
394
|
+
"id": "$response.body#/id"
|
|
395
|
+
}
|
|
396
|
+
}
|
|
363
397
|
}
|
|
364
398
|
},
|
|
365
399
|
"400": {
|
|
@@ -386,7 +420,8 @@
|
|
|
386
420
|
"UNAUTHORIZED",
|
|
387
421
|
"FORBIDDEN",
|
|
388
422
|
"ALREADY_EXISTS",
|
|
389
|
-
"VALIDATION"
|
|
423
|
+
"VALIDATION",
|
|
424
|
+
"PLAN_LIMIT"
|
|
390
425
|
],
|
|
391
426
|
"x-cli": {
|
|
392
427
|
"name": "create",
|
|
@@ -414,7 +449,7 @@
|
|
|
414
449
|
"required": true,
|
|
415
450
|
"description": "Stable opaque gate id (`gat_…`) or the gate's `name`.",
|
|
416
451
|
"schema": {
|
|
417
|
-
"
|
|
452
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
418
453
|
}
|
|
419
454
|
}
|
|
420
455
|
],
|
|
@@ -569,7 +604,7 @@
|
|
|
569
604
|
"required": true,
|
|
570
605
|
"description": "Stable opaque gate id (`gat_…`) or the gate's `name`.",
|
|
571
606
|
"schema": {
|
|
572
|
-
"
|
|
607
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
573
608
|
}
|
|
574
609
|
}
|
|
575
610
|
],
|
|
@@ -639,12 +674,12 @@
|
|
|
639
674
|
"required": true,
|
|
640
675
|
"description": "Stable opaque gate id (`gat_…`) or the gate's `name`.",
|
|
641
676
|
"schema": {
|
|
642
|
-
"
|
|
677
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
643
678
|
}
|
|
644
679
|
}
|
|
645
680
|
],
|
|
646
681
|
"responses": {
|
|
647
|
-
"
|
|
682
|
+
"200": {
|
|
648
683
|
"description": "Enable a gate",
|
|
649
684
|
"content": {
|
|
650
685
|
"application/json": {
|
|
@@ -710,12 +745,12 @@
|
|
|
710
745
|
"required": true,
|
|
711
746
|
"description": "Stable opaque gate id (`gat_…`) or the gate's `name`.",
|
|
712
747
|
"schema": {
|
|
713
|
-
"
|
|
748
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
714
749
|
}
|
|
715
750
|
}
|
|
716
751
|
],
|
|
717
752
|
"responses": {
|
|
718
|
-
"
|
|
753
|
+
"200": {
|
|
719
754
|
"description": "Disable a gate",
|
|
720
755
|
"content": {
|
|
721
756
|
"application/json": {
|
|
@@ -780,6 +815,18 @@
|
|
|
780
815
|
},
|
|
781
816
|
{
|
|
782
817
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"name": "status",
|
|
821
|
+
"in": "query",
|
|
822
|
+
"required": false,
|
|
823
|
+
"description": "Filter by lifecycle status. Pass `archived` to return the archive tab; any other value (or omitting it) returns the non-archived experiments.",
|
|
824
|
+
"schema": {
|
|
825
|
+
"type": "string"
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
"$ref": "#/components/parameters/Q"
|
|
783
830
|
}
|
|
784
831
|
],
|
|
785
832
|
"responses": {
|
|
@@ -990,6 +1037,44 @@
|
|
|
990
1037
|
"name": "checkout_button_color"
|
|
991
1038
|
}
|
|
992
1039
|
}
|
|
1040
|
+
},
|
|
1041
|
+
"links": {
|
|
1042
|
+
"GetExperiment": {
|
|
1043
|
+
"operationId": "getExperiment",
|
|
1044
|
+
"parameters": {
|
|
1045
|
+
"id": "$response.body#/id"
|
|
1046
|
+
}
|
|
1047
|
+
},
|
|
1048
|
+
"UpdateExperiment": {
|
|
1049
|
+
"operationId": "updateExperiment",
|
|
1050
|
+
"parameters": {
|
|
1051
|
+
"id": "$response.body#/id"
|
|
1052
|
+
}
|
|
1053
|
+
},
|
|
1054
|
+
"SetExperimentMetrics": {
|
|
1055
|
+
"operationId": "setExperimentMetrics",
|
|
1056
|
+
"parameters": {
|
|
1057
|
+
"id": "$response.body#/id"
|
|
1058
|
+
}
|
|
1059
|
+
},
|
|
1060
|
+
"SetExperimentStatus": {
|
|
1061
|
+
"operationId": "setExperimentStatus",
|
|
1062
|
+
"parameters": {
|
|
1063
|
+
"id": "$response.body#/id"
|
|
1064
|
+
}
|
|
1065
|
+
},
|
|
1066
|
+
"ReanalyzeExperiment": {
|
|
1067
|
+
"operationId": "reanalyzeExperiment",
|
|
1068
|
+
"parameters": {
|
|
1069
|
+
"id": "$response.body#/id"
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
"DeleteExperiment": {
|
|
1073
|
+
"operationId": "deleteExperiment",
|
|
1074
|
+
"parameters": {
|
|
1075
|
+
"id": "$response.body#/id"
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
993
1078
|
}
|
|
994
1079
|
},
|
|
995
1080
|
"400": {
|
|
@@ -1047,7 +1132,7 @@
|
|
|
1047
1132
|
"required": true,
|
|
1048
1133
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1049
1134
|
"schema": {
|
|
1050
|
-
"
|
|
1135
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1051
1136
|
}
|
|
1052
1137
|
}
|
|
1053
1138
|
],
|
|
@@ -1057,7 +1142,7 @@
|
|
|
1057
1142
|
"content": {
|
|
1058
1143
|
"application/json": {
|
|
1059
1144
|
"schema": {
|
|
1060
|
-
"$ref": "#/components/schemas/
|
|
1145
|
+
"$ref": "#/components/schemas/ExperimentApiRow"
|
|
1061
1146
|
},
|
|
1062
1147
|
"example": {
|
|
1063
1148
|
"id": "exp_01j7wb12c3d4e5f6g7h8j9k0l1",
|
|
@@ -1148,7 +1233,7 @@
|
|
|
1148
1233
|
"required": true,
|
|
1149
1234
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1150
1235
|
"schema": {
|
|
1151
|
-
"
|
|
1236
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1152
1237
|
}
|
|
1153
1238
|
}
|
|
1154
1239
|
],
|
|
@@ -1245,7 +1330,8 @@
|
|
|
1245
1330
|
"INVALID_TRANSITION",
|
|
1246
1331
|
"GROUPS_WEIGHT_SUM",
|
|
1247
1332
|
"REFERENCED_NOT_FOUND",
|
|
1248
|
-
"VALIDATION"
|
|
1333
|
+
"VALIDATION",
|
|
1334
|
+
"EXPERIMENT_IMMUTABLE_FIELD"
|
|
1249
1335
|
],
|
|
1250
1336
|
"x-cli": {
|
|
1251
1337
|
"name": "update",
|
|
@@ -1271,7 +1357,7 @@
|
|
|
1271
1357
|
"required": true,
|
|
1272
1358
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1273
1359
|
"schema": {
|
|
1274
|
-
"
|
|
1360
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1275
1361
|
}
|
|
1276
1362
|
}
|
|
1277
1363
|
],
|
|
@@ -1341,7 +1427,7 @@
|
|
|
1341
1427
|
"required": true,
|
|
1342
1428
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1343
1429
|
"schema": {
|
|
1344
|
-
"
|
|
1430
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1345
1431
|
}
|
|
1346
1432
|
}
|
|
1347
1433
|
],
|
|
@@ -1386,7 +1472,7 @@
|
|
|
1386
1472
|
}
|
|
1387
1473
|
},
|
|
1388
1474
|
"responses": {
|
|
1389
|
-
"
|
|
1475
|
+
"200": {
|
|
1390
1476
|
"description": "Transition experiment status",
|
|
1391
1477
|
"content": {
|
|
1392
1478
|
"application/json": {
|
|
@@ -1425,7 +1511,13 @@
|
|
|
1425
1511
|
"FORBIDDEN",
|
|
1426
1512
|
"NOT_FOUND",
|
|
1427
1513
|
"INVALID_TRANSITION",
|
|
1428
|
-
"VALIDATION"
|
|
1514
|
+
"VALIDATION",
|
|
1515
|
+
"PLAN_LIMIT",
|
|
1516
|
+
"EXPERIMENT_NO_GOAL_METRIC",
|
|
1517
|
+
"EXPERIMENT_ARCHIVED_RESTART",
|
|
1518
|
+
"EXPERIMENT_NOT_RUNNING",
|
|
1519
|
+
"EXPERIMENT_RUNNING_ARCHIVE",
|
|
1520
|
+
"EXPERIMENT_RESTORE_INVALID"
|
|
1429
1521
|
],
|
|
1430
1522
|
"x-cli": {
|
|
1431
1523
|
"positional": [
|
|
@@ -1475,7 +1567,7 @@
|
|
|
1475
1567
|
"required": true,
|
|
1476
1568
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1477
1569
|
"schema": {
|
|
1478
|
-
"
|
|
1570
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1479
1571
|
}
|
|
1480
1572
|
}
|
|
1481
1573
|
],
|
|
@@ -1515,7 +1607,7 @@
|
|
|
1515
1607
|
}
|
|
1516
1608
|
},
|
|
1517
1609
|
"responses": {
|
|
1518
|
-
"
|
|
1610
|
+
"200": {
|
|
1519
1611
|
"description": "Attach metrics",
|
|
1520
1612
|
"content": {
|
|
1521
1613
|
"application/json": {
|
|
@@ -1564,7 +1656,8 @@
|
|
|
1564
1656
|
"NOT_FOUND",
|
|
1565
1657
|
"EVENT_PENDING",
|
|
1566
1658
|
"REFERENCED_NOT_FOUND",
|
|
1567
|
-
"VALIDATION"
|
|
1659
|
+
"VALIDATION",
|
|
1660
|
+
"METRIC_UNKNOWN_ID"
|
|
1568
1661
|
],
|
|
1569
1662
|
"x-cli": {
|
|
1570
1663
|
"name": "set-metrics",
|
|
@@ -1592,7 +1685,7 @@
|
|
|
1592
1685
|
"required": true,
|
|
1593
1686
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1594
1687
|
"schema": {
|
|
1595
|
-
"
|
|
1688
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1596
1689
|
}
|
|
1597
1690
|
}
|
|
1598
1691
|
],
|
|
@@ -1688,7 +1781,7 @@
|
|
|
1688
1781
|
"required": true,
|
|
1689
1782
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1690
1783
|
"schema": {
|
|
1691
|
-
"
|
|
1784
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1692
1785
|
}
|
|
1693
1786
|
},
|
|
1694
1787
|
{
|
|
@@ -1792,12 +1885,12 @@
|
|
|
1792
1885
|
"required": true,
|
|
1793
1886
|
"description": "Stable opaque experiment id (`exp_…`) or the experiment's `name`.",
|
|
1794
1887
|
"schema": {
|
|
1795
|
-
"
|
|
1888
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
1796
1889
|
}
|
|
1797
1890
|
}
|
|
1798
1891
|
],
|
|
1799
1892
|
"responses": {
|
|
1800
|
-
"
|
|
1893
|
+
"200": {
|
|
1801
1894
|
"description": "Re-queue analysis",
|
|
1802
1895
|
"content": {
|
|
1803
1896
|
"application/json": {
|
|
@@ -1862,6 +1955,9 @@
|
|
|
1862
1955
|
},
|
|
1863
1956
|
{
|
|
1864
1957
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
1958
|
+
},
|
|
1959
|
+
{
|
|
1960
|
+
"$ref": "#/components/parameters/Q"
|
|
1865
1961
|
}
|
|
1866
1962
|
],
|
|
1867
1963
|
"responses": {
|
|
@@ -2089,6 +2185,32 @@
|
|
|
2089
2185
|
"name": "pricing.tiers"
|
|
2090
2186
|
}
|
|
2091
2187
|
}
|
|
2188
|
+
},
|
|
2189
|
+
"links": {
|
|
2190
|
+
"GetConfig": {
|
|
2191
|
+
"operationId": "getConfig",
|
|
2192
|
+
"parameters": {
|
|
2193
|
+
"id": "$response.body#/id"
|
|
2194
|
+
}
|
|
2195
|
+
},
|
|
2196
|
+
"UpdateConfig": {
|
|
2197
|
+
"operationId": "updateConfig",
|
|
2198
|
+
"parameters": {
|
|
2199
|
+
"id": "$response.body#/id"
|
|
2200
|
+
}
|
|
2201
|
+
},
|
|
2202
|
+
"PublishConfigDraft": {
|
|
2203
|
+
"operationId": "publishConfigDraft",
|
|
2204
|
+
"parameters": {
|
|
2205
|
+
"id": "$response.body#/id"
|
|
2206
|
+
}
|
|
2207
|
+
},
|
|
2208
|
+
"DeleteConfig": {
|
|
2209
|
+
"operationId": "deleteConfig",
|
|
2210
|
+
"parameters": {
|
|
2211
|
+
"id": "$response.body#/id"
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2092
2214
|
}
|
|
2093
2215
|
},
|
|
2094
2216
|
"400": {
|
|
@@ -2115,7 +2237,8 @@
|
|
|
2115
2237
|
"UNAUTHORIZED",
|
|
2116
2238
|
"FORBIDDEN",
|
|
2117
2239
|
"ALREADY_EXISTS",
|
|
2118
|
-
"VALIDATION"
|
|
2240
|
+
"VALIDATION",
|
|
2241
|
+
"PLAN_LIMIT"
|
|
2119
2242
|
],
|
|
2120
2243
|
"x-cli": {
|
|
2121
2244
|
"name": "create",
|
|
@@ -2143,7 +2266,7 @@
|
|
|
2143
2266
|
"required": true,
|
|
2144
2267
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2145
2268
|
"schema": {
|
|
2146
|
-
"
|
|
2269
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2147
2270
|
}
|
|
2148
2271
|
}
|
|
2149
2272
|
],
|
|
@@ -2298,7 +2421,7 @@
|
|
|
2298
2421
|
"required": true,
|
|
2299
2422
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2300
2423
|
"schema": {
|
|
2301
|
-
"
|
|
2424
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2302
2425
|
}
|
|
2303
2426
|
}
|
|
2304
2427
|
],
|
|
@@ -2414,7 +2537,7 @@
|
|
|
2414
2537
|
"required": true,
|
|
2415
2538
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2416
2539
|
"schema": {
|
|
2417
|
-
"
|
|
2540
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2418
2541
|
}
|
|
2419
2542
|
}
|
|
2420
2543
|
],
|
|
@@ -2483,7 +2606,7 @@
|
|
|
2483
2606
|
"required": true,
|
|
2484
2607
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2485
2608
|
"schema": {
|
|
2486
|
-
"
|
|
2609
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2487
2610
|
}
|
|
2488
2611
|
}
|
|
2489
2612
|
],
|
|
@@ -2586,7 +2709,7 @@
|
|
|
2586
2709
|
"required": true,
|
|
2587
2710
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2588
2711
|
"schema": {
|
|
2589
|
-
"
|
|
2712
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2590
2713
|
}
|
|
2591
2714
|
}
|
|
2592
2715
|
],
|
|
@@ -2674,7 +2797,7 @@
|
|
|
2674
2797
|
"required": true,
|
|
2675
2798
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2676
2799
|
"schema": {
|
|
2677
|
-
"
|
|
2800
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2678
2801
|
}
|
|
2679
2802
|
}
|
|
2680
2803
|
],
|
|
@@ -2705,7 +2828,7 @@
|
|
|
2705
2828
|
}
|
|
2706
2829
|
},
|
|
2707
2830
|
"responses": {
|
|
2708
|
-
"
|
|
2831
|
+
"200": {
|
|
2709
2832
|
"description": "Publish a draft",
|
|
2710
2833
|
"content": {
|
|
2711
2834
|
"application/json": {
|
|
@@ -2773,7 +2896,7 @@
|
|
|
2773
2896
|
"required": true,
|
|
2774
2897
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2775
2898
|
"schema": {
|
|
2776
|
-
"
|
|
2899
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2777
2900
|
}
|
|
2778
2901
|
},
|
|
2779
2902
|
{
|
|
@@ -2864,7 +2987,7 @@
|
|
|
2864
2987
|
"required": true,
|
|
2865
2988
|
"description": "Stable opaque config id (`cfg_…`) or the config's `name`.",
|
|
2866
2989
|
"schema": {
|
|
2867
|
-
"
|
|
2990
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
2868
2991
|
}
|
|
2869
2992
|
}
|
|
2870
2993
|
],
|
|
@@ -2965,6 +3088,9 @@
|
|
|
2965
3088
|
},
|
|
2966
3089
|
{
|
|
2967
3090
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
3091
|
+
},
|
|
3092
|
+
{
|
|
3093
|
+
"$ref": "#/components/parameters/Q"
|
|
2968
3094
|
}
|
|
2969
3095
|
],
|
|
2970
3096
|
"responses": {
|
|
@@ -3102,6 +3228,38 @@
|
|
|
3102
3228
|
"name": "payments.checkout"
|
|
3103
3229
|
}
|
|
3104
3230
|
}
|
|
3231
|
+
},
|
|
3232
|
+
"links": {
|
|
3233
|
+
"GetKillswitch": {
|
|
3234
|
+
"operationId": "getKillswitch",
|
|
3235
|
+
"parameters": {
|
|
3236
|
+
"id": "$response.body#/id"
|
|
3237
|
+
}
|
|
3238
|
+
},
|
|
3239
|
+
"UpdateKillswitch": {
|
|
3240
|
+
"operationId": "updateKillswitch",
|
|
3241
|
+
"parameters": {
|
|
3242
|
+
"id": "$response.body#/id"
|
|
3243
|
+
}
|
|
3244
|
+
},
|
|
3245
|
+
"SetKillswitchSwitch": {
|
|
3246
|
+
"operationId": "setKillswitchSwitch",
|
|
3247
|
+
"parameters": {
|
|
3248
|
+
"id": "$response.body#/id"
|
|
3249
|
+
}
|
|
3250
|
+
},
|
|
3251
|
+
"SetKillswitchValue": {
|
|
3252
|
+
"operationId": "setKillswitchValue",
|
|
3253
|
+
"parameters": {
|
|
3254
|
+
"id": "$response.body#/id"
|
|
3255
|
+
}
|
|
3256
|
+
},
|
|
3257
|
+
"DeleteKillswitch": {
|
|
3258
|
+
"operationId": "deleteKillswitch",
|
|
3259
|
+
"parameters": {
|
|
3260
|
+
"id": "$response.body#/id"
|
|
3261
|
+
}
|
|
3262
|
+
}
|
|
3105
3263
|
}
|
|
3106
3264
|
},
|
|
3107
3265
|
"400": {
|
|
@@ -3128,7 +3286,8 @@
|
|
|
3128
3286
|
"UNAUTHORIZED",
|
|
3129
3287
|
"FORBIDDEN",
|
|
3130
3288
|
"ALREADY_EXISTS",
|
|
3131
|
-
"VALIDATION"
|
|
3289
|
+
"VALIDATION",
|
|
3290
|
+
"PLAN_LIMIT"
|
|
3132
3291
|
],
|
|
3133
3292
|
"x-cli": {
|
|
3134
3293
|
"name": "create",
|
|
@@ -3156,7 +3315,7 @@
|
|
|
3156
3315
|
"required": true,
|
|
3157
3316
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3158
3317
|
"schema": {
|
|
3159
|
-
"
|
|
3318
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3160
3319
|
}
|
|
3161
3320
|
}
|
|
3162
3321
|
],
|
|
@@ -3246,7 +3405,7 @@
|
|
|
3246
3405
|
"required": true,
|
|
3247
3406
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3248
3407
|
"schema": {
|
|
3249
|
-
"
|
|
3408
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3250
3409
|
}
|
|
3251
3410
|
}
|
|
3252
3411
|
],
|
|
@@ -3357,7 +3516,7 @@
|
|
|
3357
3516
|
"required": true,
|
|
3358
3517
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3359
3518
|
"schema": {
|
|
3360
|
-
"
|
|
3519
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3361
3520
|
}
|
|
3362
3521
|
}
|
|
3363
3522
|
],
|
|
@@ -3426,7 +3585,7 @@
|
|
|
3426
3585
|
"required": true,
|
|
3427
3586
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3428
3587
|
"schema": {
|
|
3429
|
-
"
|
|
3588
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3430
3589
|
}
|
|
3431
3590
|
}
|
|
3432
3591
|
],
|
|
@@ -3527,7 +3686,7 @@
|
|
|
3527
3686
|
"required": true,
|
|
3528
3687
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3529
3688
|
"schema": {
|
|
3530
|
-
"
|
|
3689
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3531
3690
|
}
|
|
3532
3691
|
}
|
|
3533
3692
|
],
|
|
@@ -3619,7 +3778,7 @@
|
|
|
3619
3778
|
"required": true,
|
|
3620
3779
|
"description": "Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.",
|
|
3621
3780
|
"schema": {
|
|
3622
|
-
"
|
|
3781
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3623
3782
|
}
|
|
3624
3783
|
}
|
|
3625
3784
|
],
|
|
@@ -3724,6 +3883,9 @@
|
|
|
3724
3883
|
},
|
|
3725
3884
|
{
|
|
3726
3885
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
3886
|
+
},
|
|
3887
|
+
{
|
|
3888
|
+
"$ref": "#/components/parameters/Q"
|
|
3727
3889
|
}
|
|
3728
3890
|
],
|
|
3729
3891
|
"responses": {
|
|
@@ -3843,6 +4005,20 @@
|
|
|
3843
4005
|
"name": "primary_users"
|
|
3844
4006
|
}
|
|
3845
4007
|
}
|
|
4008
|
+
},
|
|
4009
|
+
"links": {
|
|
4010
|
+
"UpdateUniverse": {
|
|
4011
|
+
"operationId": "updateUniverse",
|
|
4012
|
+
"parameters": {
|
|
4013
|
+
"id": "$response.body#/id"
|
|
4014
|
+
}
|
|
4015
|
+
},
|
|
4016
|
+
"DeleteUniverse": {
|
|
4017
|
+
"operationId": "deleteUniverse",
|
|
4018
|
+
"parameters": {
|
|
4019
|
+
"id": "$response.body#/id"
|
|
4020
|
+
}
|
|
4021
|
+
}
|
|
3846
4022
|
}
|
|
3847
4023
|
},
|
|
3848
4024
|
"400": {
|
|
@@ -3870,7 +4046,8 @@
|
|
|
3870
4046
|
"FORBIDDEN",
|
|
3871
4047
|
"PLAN_REQUIRED",
|
|
3872
4048
|
"ALREADY_EXISTS",
|
|
3873
|
-
"VALIDATION"
|
|
4049
|
+
"VALIDATION",
|
|
4050
|
+
"PLAN_LIMIT"
|
|
3874
4051
|
],
|
|
3875
4052
|
"x-cli": {
|
|
3876
4053
|
"name": "create",
|
|
@@ -3898,7 +4075,7 @@
|
|
|
3898
4075
|
"required": true,
|
|
3899
4076
|
"description": "Stable opaque universe id (`uni_…`) or the universe's `name`.",
|
|
3900
4077
|
"schema": {
|
|
3901
|
-
"
|
|
4078
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
3902
4079
|
}
|
|
3903
4080
|
}
|
|
3904
4081
|
],
|
|
@@ -3996,7 +4173,7 @@
|
|
|
3996
4173
|
"required": true,
|
|
3997
4174
|
"description": "Stable opaque universe id (`uni_…`) or the universe's `name`.",
|
|
3998
4175
|
"schema": {
|
|
3999
|
-
"
|
|
4176
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4000
4177
|
}
|
|
4001
4178
|
}
|
|
4002
4179
|
],
|
|
@@ -4052,7 +4229,7 @@
|
|
|
4052
4229
|
"get": {
|
|
4053
4230
|
"operationId": "listGateTemplates",
|
|
4054
4231
|
"summary": "List gate templates",
|
|
4055
|
-
"description": "Returns the merged targeting-rule template catalog — read-only **built-ins first** (the `@team`/`@owner` audience aliases, country, email-domain, region presets, …), then this project's **customer** templates. Each item carries a `rules: [{ attr, op, value }]` definition; the alias templates carry a symbol value (`email in [\"@team\"]`) that the SDK expands to the resolved email list at rebuild.\n\n**Turn \"launch X in country Y\" into a gated flag:** list templates (optionally with `
|
|
4232
|
+
"description": "Returns the merged targeting-rule template catalog — read-only **built-ins first** (the `@team`/`@owner` audience aliases, country, email-domain, region presets, …), then this project's **customer** templates. Each item carries a `rules: [{ attr, op, value }]` definition; the alias templates carry a symbol value (`email in [\"@team\"]`) that the SDK expands to the resolved email list at rebuild.\n\n**Turn \"launch X in country Y\" into a gated flag:** list templates (optionally with `q`), take the matching template's `rules`, substitute the concrete value(s), and pass them as the `rules` arg of `release_flags_create`.\n\nThe catalog is small and bounded, so the full merged set is returned in one page — this endpoint is **not** paginated (`next_cursor` is always `null`; there are no `limit`/`cursor` params).",
|
|
4056
4233
|
"tags": [
|
|
4057
4234
|
"Templates"
|
|
4058
4235
|
],
|
|
@@ -4060,11 +4237,15 @@
|
|
|
4060
4237
|
{
|
|
4061
4238
|
"$ref": "#/components/parameters/ProjectId"
|
|
4062
4239
|
},
|
|
4240
|
+
{
|
|
4241
|
+
"$ref": "#/components/parameters/Q"
|
|
4242
|
+
},
|
|
4063
4243
|
{
|
|
4064
4244
|
"name": "query",
|
|
4065
4245
|
"in": "query",
|
|
4066
4246
|
"required": false,
|
|
4067
|
-
"
|
|
4247
|
+
"deprecated": true,
|
|
4248
|
+
"description": "Deprecated alias for `q`, kept working for one release. Prefer `q`.",
|
|
4068
4249
|
"schema": {
|
|
4069
4250
|
"type": "string"
|
|
4070
4251
|
}
|
|
@@ -4233,7 +4414,7 @@
|
|
|
4233
4414
|
"required": true,
|
|
4234
4415
|
"description": "Built-in slug (`country`) or customer template id (`gtpl_…`).",
|
|
4235
4416
|
"schema": {
|
|
4236
|
-
"
|
|
4417
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4237
4418
|
}
|
|
4238
4419
|
}
|
|
4239
4420
|
],
|
|
@@ -4291,7 +4472,7 @@
|
|
|
4291
4472
|
"required": true,
|
|
4292
4473
|
"description": "Customer template id (`gtpl_…`) or its `name`.",
|
|
4293
4474
|
"schema": {
|
|
4294
|
-
"
|
|
4475
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4295
4476
|
}
|
|
4296
4477
|
}
|
|
4297
4478
|
],
|
|
@@ -4388,7 +4569,7 @@
|
|
|
4388
4569
|
"required": true,
|
|
4389
4570
|
"description": "Customer template id (`gtpl_…`) or its `name`.",
|
|
4390
4571
|
"schema": {
|
|
4391
|
-
"
|
|
4572
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4392
4573
|
}
|
|
4393
4574
|
}
|
|
4394
4575
|
],
|
|
@@ -4420,6 +4601,9 @@
|
|
|
4420
4601
|
},
|
|
4421
4602
|
"409": {
|
|
4422
4603
|
"$ref": "#/components/responses/Conflict"
|
|
4604
|
+
},
|
|
4605
|
+
"422": {
|
|
4606
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
4423
4607
|
}
|
|
4424
4608
|
},
|
|
4425
4609
|
"x-error-codes": [
|
|
@@ -4448,6 +4632,9 @@
|
|
|
4448
4632
|
"parameters": [
|
|
4449
4633
|
{
|
|
4450
4634
|
"$ref": "#/components/parameters/ProjectId"
|
|
4635
|
+
},
|
|
4636
|
+
{
|
|
4637
|
+
"$ref": "#/components/parameters/Q"
|
|
4451
4638
|
}
|
|
4452
4639
|
],
|
|
4453
4640
|
"responses": {
|
|
@@ -4547,6 +4734,26 @@
|
|
|
4547
4734
|
"name": "plan"
|
|
4548
4735
|
}
|
|
4549
4736
|
}
|
|
4737
|
+
},
|
|
4738
|
+
"links": {
|
|
4739
|
+
"GetAttribute": {
|
|
4740
|
+
"operationId": "getAttribute",
|
|
4741
|
+
"parameters": {
|
|
4742
|
+
"id": "$response.body#/id"
|
|
4743
|
+
}
|
|
4744
|
+
},
|
|
4745
|
+
"UpdateAttribute": {
|
|
4746
|
+
"operationId": "updateAttribute",
|
|
4747
|
+
"parameters": {
|
|
4748
|
+
"id": "$response.body#/id"
|
|
4749
|
+
}
|
|
4750
|
+
},
|
|
4751
|
+
"DeleteAttribute": {
|
|
4752
|
+
"operationId": "deleteAttribute",
|
|
4753
|
+
"parameters": {
|
|
4754
|
+
"id": "$response.body#/id"
|
|
4755
|
+
}
|
|
4756
|
+
}
|
|
4550
4757
|
}
|
|
4551
4758
|
},
|
|
4552
4759
|
"400": {
|
|
@@ -4601,7 +4808,7 @@
|
|
|
4601
4808
|
"required": true,
|
|
4602
4809
|
"description": "The attribute id.",
|
|
4603
4810
|
"schema": {
|
|
4604
|
-
"
|
|
4811
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4605
4812
|
}
|
|
4606
4813
|
}
|
|
4607
4814
|
],
|
|
@@ -4676,7 +4883,7 @@
|
|
|
4676
4883
|
"required": true,
|
|
4677
4884
|
"description": "The attribute id.",
|
|
4678
4885
|
"schema": {
|
|
4679
|
-
"
|
|
4886
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4680
4887
|
}
|
|
4681
4888
|
}
|
|
4682
4889
|
],
|
|
@@ -4761,7 +4968,7 @@
|
|
|
4761
4968
|
"required": true,
|
|
4762
4969
|
"description": "The attribute id.",
|
|
4763
4970
|
"schema": {
|
|
4764
|
-
"
|
|
4971
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
4765
4972
|
}
|
|
4766
4973
|
}
|
|
4767
4974
|
],
|
|
@@ -4823,6 +5030,9 @@
|
|
|
4823
5030
|
"parameters": [
|
|
4824
5031
|
{
|
|
4825
5032
|
"$ref": "#/components/parameters/ProjectId"
|
|
5033
|
+
},
|
|
5034
|
+
{
|
|
5035
|
+
"$ref": "#/components/parameters/Q"
|
|
4826
5036
|
}
|
|
4827
5037
|
],
|
|
4828
5038
|
"responses": {
|
|
@@ -4953,6 +5163,26 @@
|
|
|
4953
5163
|
"name": "checkouts"
|
|
4954
5164
|
}
|
|
4955
5165
|
}
|
|
5166
|
+
},
|
|
5167
|
+
"links": {
|
|
5168
|
+
"GetMetric": {
|
|
5169
|
+
"operationId": "getMetric",
|
|
5170
|
+
"parameters": {
|
|
5171
|
+
"id": "$response.body#/id"
|
|
5172
|
+
}
|
|
5173
|
+
},
|
|
5174
|
+
"UpdateMetric": {
|
|
5175
|
+
"operationId": "updateMetric",
|
|
5176
|
+
"parameters": {
|
|
5177
|
+
"id": "$response.body#/id"
|
|
5178
|
+
}
|
|
5179
|
+
},
|
|
5180
|
+
"DeleteMetric": {
|
|
5181
|
+
"operationId": "deleteMetric",
|
|
5182
|
+
"parameters": {
|
|
5183
|
+
"id": "$response.body#/id"
|
|
5184
|
+
}
|
|
5185
|
+
}
|
|
4956
5186
|
}
|
|
4957
5187
|
},
|
|
4958
5188
|
"400": {
|
|
@@ -4981,7 +5211,8 @@
|
|
|
4981
5211
|
"ALREADY_EXISTS",
|
|
4982
5212
|
"EVENT_PENDING",
|
|
4983
5213
|
"REFERENCED_NOT_FOUND",
|
|
4984
|
-
"VALIDATION"
|
|
5214
|
+
"VALIDATION",
|
|
5215
|
+
"PLAN_LIMIT"
|
|
4985
5216
|
],
|
|
4986
5217
|
"x-cli": {
|
|
4987
5218
|
"name": "create",
|
|
@@ -5009,7 +5240,7 @@
|
|
|
5009
5240
|
"required": true,
|
|
5010
5241
|
"description": "Stable opaque metric id (`met_…`) or the metric's `name`.",
|
|
5011
5242
|
"schema": {
|
|
5012
|
-
"
|
|
5243
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5013
5244
|
}
|
|
5014
5245
|
}
|
|
5015
5246
|
],
|
|
@@ -5090,7 +5321,7 @@
|
|
|
5090
5321
|
"required": true,
|
|
5091
5322
|
"description": "Stable opaque metric id (`met_…`) or the metric's `name`.",
|
|
5092
5323
|
"schema": {
|
|
5093
|
-
"
|
|
5324
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5094
5325
|
}
|
|
5095
5326
|
}
|
|
5096
5327
|
],
|
|
@@ -5174,7 +5405,7 @@
|
|
|
5174
5405
|
"required": true,
|
|
5175
5406
|
"description": "Stable opaque metric id (`met_…`) or the metric's `name`.",
|
|
5176
5407
|
"schema": {
|
|
5177
|
-
"
|
|
5408
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5178
5409
|
}
|
|
5179
5410
|
}
|
|
5180
5411
|
],
|
|
@@ -5237,6 +5468,9 @@
|
|
|
5237
5468
|
"parameters": [
|
|
5238
5469
|
{
|
|
5239
5470
|
"$ref": "#/components/parameters/ProjectId"
|
|
5471
|
+
},
|
|
5472
|
+
{
|
|
5473
|
+
"$ref": "#/components/parameters/Q"
|
|
5240
5474
|
}
|
|
5241
5475
|
],
|
|
5242
5476
|
"responses": {
|
|
@@ -5355,6 +5589,32 @@
|
|
|
5355
5589
|
"name": "checkout_completed"
|
|
5356
5590
|
}
|
|
5357
5591
|
}
|
|
5592
|
+
},
|
|
5593
|
+
"links": {
|
|
5594
|
+
"GetEvent": {
|
|
5595
|
+
"operationId": "getEvent",
|
|
5596
|
+
"parameters": {
|
|
5597
|
+
"id": "$response.body#/id"
|
|
5598
|
+
}
|
|
5599
|
+
},
|
|
5600
|
+
"UpdateEvent": {
|
|
5601
|
+
"operationId": "updateEvent",
|
|
5602
|
+
"parameters": {
|
|
5603
|
+
"id": "$response.body#/id"
|
|
5604
|
+
}
|
|
5605
|
+
},
|
|
5606
|
+
"ApproveEvent": {
|
|
5607
|
+
"operationId": "approveEvent",
|
|
5608
|
+
"parameters": {
|
|
5609
|
+
"id": "$response.body#/id"
|
|
5610
|
+
}
|
|
5611
|
+
},
|
|
5612
|
+
"DeleteEvent": {
|
|
5613
|
+
"operationId": "deleteEvent",
|
|
5614
|
+
"parameters": {
|
|
5615
|
+
"id": "$response.body#/id"
|
|
5616
|
+
}
|
|
5617
|
+
}
|
|
5358
5618
|
}
|
|
5359
5619
|
},
|
|
5360
5620
|
"400": {
|
|
@@ -5381,7 +5641,8 @@
|
|
|
5381
5641
|
"UNAUTHORIZED",
|
|
5382
5642
|
"FORBIDDEN",
|
|
5383
5643
|
"ALREADY_EXISTS",
|
|
5384
|
-
"VALIDATION"
|
|
5644
|
+
"VALIDATION",
|
|
5645
|
+
"PLAN_LIMIT"
|
|
5385
5646
|
],
|
|
5386
5647
|
"x-cli": {
|
|
5387
5648
|
"name": "create",
|
|
@@ -5409,7 +5670,7 @@
|
|
|
5409
5670
|
"required": true,
|
|
5410
5671
|
"description": "Stable opaque event id (`evt_…`) or the event's `name`.",
|
|
5411
5672
|
"schema": {
|
|
5412
|
-
"
|
|
5673
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5413
5674
|
}
|
|
5414
5675
|
}
|
|
5415
5676
|
],
|
|
@@ -5489,7 +5750,7 @@
|
|
|
5489
5750
|
"required": true,
|
|
5490
5751
|
"description": "Stable opaque event id (`evt_…`) or the event's `name`.",
|
|
5491
5752
|
"schema": {
|
|
5492
|
-
"
|
|
5753
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5493
5754
|
}
|
|
5494
5755
|
}
|
|
5495
5756
|
],
|
|
@@ -5589,7 +5850,7 @@
|
|
|
5589
5850
|
"required": true,
|
|
5590
5851
|
"description": "Stable opaque event id (`evt_…`) or the event's `name`.",
|
|
5591
5852
|
"schema": {
|
|
5592
|
-
"
|
|
5853
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5593
5854
|
}
|
|
5594
5855
|
}
|
|
5595
5856
|
],
|
|
@@ -5659,7 +5920,7 @@
|
|
|
5659
5920
|
"required": true,
|
|
5660
5921
|
"description": "Stable opaque event id (`evt_…`) or the event's `name`.",
|
|
5661
5922
|
"schema": {
|
|
5662
|
-
"
|
|
5923
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5663
5924
|
}
|
|
5664
5925
|
}
|
|
5665
5926
|
],
|
|
@@ -5989,7 +6250,7 @@
|
|
|
5989
6250
|
"required": true,
|
|
5990
6251
|
"description": "Per-project item number (e.g. `7`) or the full ops item id.",
|
|
5991
6252
|
"schema": {
|
|
5992
|
-
"
|
|
6253
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
5993
6254
|
}
|
|
5994
6255
|
}
|
|
5995
6256
|
],
|
|
@@ -6062,7 +6323,7 @@
|
|
|
6062
6323
|
"required": true,
|
|
6063
6324
|
"description": "Per-project item number (e.g. `7`) or the full ops item id.",
|
|
6064
6325
|
"schema": {
|
|
6065
|
-
"
|
|
6326
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6066
6327
|
}
|
|
6067
6328
|
}
|
|
6068
6329
|
],
|
|
@@ -6162,7 +6423,7 @@
|
|
|
6162
6423
|
"required": true,
|
|
6163
6424
|
"description": "Per-project item number (e.g. `7`) or the full ops item id.",
|
|
6164
6425
|
"schema": {
|
|
6165
|
-
"
|
|
6426
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6166
6427
|
}
|
|
6167
6428
|
}
|
|
6168
6429
|
],
|
|
@@ -6228,51 +6489,35 @@
|
|
|
6228
6489
|
}
|
|
6229
6490
|
}
|
|
6230
6491
|
},
|
|
6231
|
-
"/api/admin/
|
|
6232
|
-
"
|
|
6233
|
-
"operationId": "
|
|
6234
|
-
"summary": "
|
|
6235
|
-
"description": "
|
|
6492
|
+
"/api/admin/ops/{handle}/comments": {
|
|
6493
|
+
"get": {
|
|
6494
|
+
"operationId": "listOpsComments",
|
|
6495
|
+
"summary": "List an item's comments",
|
|
6496
|
+
"description": "List the comment thread on a queue item, oldest first. Each comment\ncarries its author (a teammate email, or `system` for a comment authored by\nJarvis — the AI agent), its markdown body, and `parentId` for the single\nlevel of threaded replies. Removed comments are omitted.\n\n**Use case:** Read the discussion on an item before replying or acting on it.",
|
|
6236
6497
|
"tags": [
|
|
6237
|
-
"
|
|
6498
|
+
"Comments"
|
|
6238
6499
|
],
|
|
6239
6500
|
"parameters": [
|
|
6240
6501
|
{
|
|
6241
6502
|
"$ref": "#/components/parameters/ProjectId"
|
|
6242
|
-
}
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
|
|
6246
|
-
|
|
6247
|
-
"
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
},
|
|
6251
|
-
"example": {
|
|
6252
|
-
"title": "Alert rule @alert:checkout-error-rate needs a human edit for #42",
|
|
6253
|
-
"summary": "#42 is a false positive — the rule fires on the expected nightly batch spike, and rule definitions can only be edited by a human.",
|
|
6254
|
-
"steps": [
|
|
6255
|
-
"Open @alert:checkout-error-rate in the dashboard alerts page.",
|
|
6256
|
-
"Raise the threshold from `2%` to `5%` and widen the window to `1h`.",
|
|
6257
|
-
"Re-run the shipeasy-ops-work loop — #42 will be acknowledged."
|
|
6258
|
-
],
|
|
6259
|
-
"dedupeKey": "feedback:42",
|
|
6260
|
-
"href": "/dashboard/prj_0abc/bugs/42"
|
|
6261
|
-
}
|
|
6503
|
+
},
|
|
6504
|
+
{
|
|
6505
|
+
"name": "handle",
|
|
6506
|
+
"in": "path",
|
|
6507
|
+
"required": true,
|
|
6508
|
+
"description": "Per-project item number (e.g. `7`) or the full ops item id.",
|
|
6509
|
+
"schema": {
|
|
6510
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6262
6511
|
}
|
|
6263
6512
|
}
|
|
6264
|
-
|
|
6513
|
+
],
|
|
6265
6514
|
"responses": {
|
|
6266
|
-
"
|
|
6267
|
-
"description": "
|
|
6515
|
+
"200": {
|
|
6516
|
+
"description": "List an item's comments",
|
|
6268
6517
|
"content": {
|
|
6269
6518
|
"application/json": {
|
|
6270
6519
|
"schema": {
|
|
6271
|
-
"$ref": "#/components/schemas/
|
|
6272
|
-
},
|
|
6273
|
-
"example": {
|
|
6274
|
-
"dedupeKey": "error:checkout:5xx",
|
|
6275
|
-
"dispatched": true
|
|
6520
|
+
"$ref": "#/components/schemas/ListOpsCommentsResponse"
|
|
6276
6521
|
}
|
|
6277
6522
|
}
|
|
6278
6523
|
}
|
|
@@ -6288,44 +6533,210 @@
|
|
|
6288
6533
|
},
|
|
6289
6534
|
"404": {
|
|
6290
6535
|
"$ref": "#/components/responses/NotFound"
|
|
6291
|
-
},
|
|
6292
|
-
"409": {
|
|
6293
|
-
"$ref": "#/components/responses/Conflict"
|
|
6294
|
-
},
|
|
6295
|
-
"422": {
|
|
6296
|
-
"$ref": "#/components/responses/UnprocessableEntity"
|
|
6297
6536
|
}
|
|
6298
6537
|
},
|
|
6299
6538
|
"x-error-codes": [
|
|
6300
6539
|
"BAD_REQUEST",
|
|
6301
6540
|
"UNAUTHORIZED",
|
|
6302
6541
|
"FORBIDDEN",
|
|
6303
|
-
"
|
|
6542
|
+
"NOT_FOUND"
|
|
6304
6543
|
],
|
|
6305
6544
|
"x-cli": {
|
|
6306
|
-
"name": "
|
|
6545
|
+
"name": "list",
|
|
6546
|
+
"positional": [
|
|
6547
|
+
"handle"
|
|
6548
|
+
]
|
|
6307
6549
|
}
|
|
6308
|
-
}
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
"
|
|
6313
|
-
"summary": "List Slack channels",
|
|
6314
|
-
"description": "List the project's connected Slack channels — used to resolve an alert rule's notification target.\n\n**Use case:** Populate a channel picker, or validate an alert rule's `--slack-channel` before saving.",
|
|
6550
|
+
},
|
|
6551
|
+
"post": {
|
|
6552
|
+
"operationId": "createOpsComment",
|
|
6553
|
+
"summary": "Comment on an item",
|
|
6554
|
+
"description": "Append a comment to a queue item's thread. The body is markdown (mentions\nlike `@teammate` notify that person; `@shipeasy` asks Jarvis, the AI agent,\nto reply). Pass `parentId` to reply under an existing top-level comment\n(one level of threading — a reply to a reply attaches to the same parent).\n\nCreate-only and append-only, so it is safe for restricted ops keys — the\nsame channel the ops loop and Jarvis use to leave a note on an item.",
|
|
6315
6555
|
"tags": [
|
|
6316
|
-
"
|
|
6556
|
+
"Comments"
|
|
6317
6557
|
],
|
|
6318
6558
|
"parameters": [
|
|
6319
6559
|
{
|
|
6320
6560
|
"$ref": "#/components/parameters/ProjectId"
|
|
6561
|
+
},
|
|
6562
|
+
{
|
|
6563
|
+
"name": "handle",
|
|
6564
|
+
"in": "path",
|
|
6565
|
+
"required": true,
|
|
6566
|
+
"description": "Per-project item number (e.g. `7`) or the full ops item id.",
|
|
6567
|
+
"schema": {
|
|
6568
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6569
|
+
}
|
|
6321
6570
|
}
|
|
6322
6571
|
],
|
|
6323
|
-
"
|
|
6324
|
-
"
|
|
6325
|
-
|
|
6326
|
-
"
|
|
6327
|
-
"
|
|
6328
|
-
"
|
|
6572
|
+
"requestBody": {
|
|
6573
|
+
"required": true,
|
|
6574
|
+
"content": {
|
|
6575
|
+
"application/json": {
|
|
6576
|
+
"schema": {
|
|
6577
|
+
"$ref": "#/components/schemas/CreateOpsCommentRequest"
|
|
6578
|
+
},
|
|
6579
|
+
"examples": {
|
|
6580
|
+
"comment": {
|
|
6581
|
+
"summary": "Leave a comment",
|
|
6582
|
+
"value": {
|
|
6583
|
+
"body": "Repro'd on iOS Safari 17 — the button overflows its container. cc @alice"
|
|
6584
|
+
}
|
|
6585
|
+
},
|
|
6586
|
+
"reply": {
|
|
6587
|
+
"summary": "Reply under an existing comment",
|
|
6588
|
+
"value": {
|
|
6589
|
+
"body": "Agreed, let's ship the fix behind @shipeasy's suggested flag.",
|
|
6590
|
+
"parentId": "cm_01j7w8a1b2c3d4e5f6g7h8i9j0"
|
|
6591
|
+
}
|
|
6592
|
+
}
|
|
6593
|
+
}
|
|
6594
|
+
}
|
|
6595
|
+
}
|
|
6596
|
+
},
|
|
6597
|
+
"responses": {
|
|
6598
|
+
"201": {
|
|
6599
|
+
"description": "Comment on an item",
|
|
6600
|
+
"content": {
|
|
6601
|
+
"application/json": {
|
|
6602
|
+
"schema": {
|
|
6603
|
+
"$ref": "#/components/schemas/CreateOpsCommentResponse"
|
|
6604
|
+
},
|
|
6605
|
+
"example": {
|
|
6606
|
+
"id": "cm_01j7w8a1b2c3d4e5f6g7h8i9j0"
|
|
6607
|
+
}
|
|
6608
|
+
}
|
|
6609
|
+
}
|
|
6610
|
+
},
|
|
6611
|
+
"400": {
|
|
6612
|
+
"$ref": "#/components/responses/BadRequest"
|
|
6613
|
+
},
|
|
6614
|
+
"401": {
|
|
6615
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
6616
|
+
},
|
|
6617
|
+
"403": {
|
|
6618
|
+
"$ref": "#/components/responses/Forbidden"
|
|
6619
|
+
},
|
|
6620
|
+
"404": {
|
|
6621
|
+
"$ref": "#/components/responses/NotFound"
|
|
6622
|
+
},
|
|
6623
|
+
"422": {
|
|
6624
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
6625
|
+
}
|
|
6626
|
+
},
|
|
6627
|
+
"x-error-codes": [
|
|
6628
|
+
"BAD_REQUEST",
|
|
6629
|
+
"UNAUTHORIZED",
|
|
6630
|
+
"FORBIDDEN",
|
|
6631
|
+
"NOT_FOUND",
|
|
6632
|
+
"VALIDATION"
|
|
6633
|
+
],
|
|
6634
|
+
"x-cli": {
|
|
6635
|
+
"name": "create",
|
|
6636
|
+
"positional": [
|
|
6637
|
+
"handle"
|
|
6638
|
+
]
|
|
6639
|
+
}
|
|
6640
|
+
}
|
|
6641
|
+
},
|
|
6642
|
+
"/api/admin/notifications": {
|
|
6643
|
+
"post": {
|
|
6644
|
+
"operationId": "notifyOps",
|
|
6645
|
+
"summary": "Raise an attention notification",
|
|
6646
|
+
"description": "Raise a 'needs your attention' bell notification. Create-only and idempotent on `dedupeKey` — re-raising with the same key updates the one card instead of stacking duplicates. It never reads, marks read, or deletes the feed, so it is safe for restricted ops keys.\n\n**Use case:** Escalate work that can't land in code (a product decision, a credential only a human has, a resource only a human may edit), deduped so repeats don't spam the bell.",
|
|
6647
|
+
"tags": [
|
|
6648
|
+
"Ops"
|
|
6649
|
+
],
|
|
6650
|
+
"parameters": [
|
|
6651
|
+
{
|
|
6652
|
+
"$ref": "#/components/parameters/ProjectId"
|
|
6653
|
+
}
|
|
6654
|
+
],
|
|
6655
|
+
"requestBody": {
|
|
6656
|
+
"required": true,
|
|
6657
|
+
"content": {
|
|
6658
|
+
"application/json": {
|
|
6659
|
+
"schema": {
|
|
6660
|
+
"$ref": "#/components/schemas/NotifyOpsRequest"
|
|
6661
|
+
},
|
|
6662
|
+
"example": {
|
|
6663
|
+
"title": "Alert rule @alert:checkout-error-rate needs a human edit for #42",
|
|
6664
|
+
"summary": "#42 is a false positive — the rule fires on the expected nightly batch spike, and rule definitions can only be edited by a human.",
|
|
6665
|
+
"steps": [
|
|
6666
|
+
"Open @alert:checkout-error-rate in the dashboard alerts page.",
|
|
6667
|
+
"Raise the threshold from `2%` to `5%` and widen the window to `1h`.",
|
|
6668
|
+
"Re-run the shipeasy-ops-work loop — #42 will be acknowledged."
|
|
6669
|
+
],
|
|
6670
|
+
"dedupeKey": "feedback:42",
|
|
6671
|
+
"href": "/dashboard/prj_0abc/bugs/42"
|
|
6672
|
+
}
|
|
6673
|
+
}
|
|
6674
|
+
}
|
|
6675
|
+
},
|
|
6676
|
+
"responses": {
|
|
6677
|
+
"201": {
|
|
6678
|
+
"description": "Raise an attention notification",
|
|
6679
|
+
"content": {
|
|
6680
|
+
"application/json": {
|
|
6681
|
+
"schema": {
|
|
6682
|
+
"$ref": "#/components/schemas/NotifyOpsResponse"
|
|
6683
|
+
},
|
|
6684
|
+
"example": {
|
|
6685
|
+
"dedupeKey": "error:checkout:5xx",
|
|
6686
|
+
"dispatched": true
|
|
6687
|
+
}
|
|
6688
|
+
}
|
|
6689
|
+
}
|
|
6690
|
+
},
|
|
6691
|
+
"400": {
|
|
6692
|
+
"$ref": "#/components/responses/BadRequest"
|
|
6693
|
+
},
|
|
6694
|
+
"401": {
|
|
6695
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
6696
|
+
},
|
|
6697
|
+
"403": {
|
|
6698
|
+
"$ref": "#/components/responses/Forbidden"
|
|
6699
|
+
},
|
|
6700
|
+
"404": {
|
|
6701
|
+
"$ref": "#/components/responses/NotFound"
|
|
6702
|
+
},
|
|
6703
|
+
"409": {
|
|
6704
|
+
"$ref": "#/components/responses/Conflict"
|
|
6705
|
+
},
|
|
6706
|
+
"422": {
|
|
6707
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
6708
|
+
}
|
|
6709
|
+
},
|
|
6710
|
+
"x-error-codes": [
|
|
6711
|
+
"BAD_REQUEST",
|
|
6712
|
+
"UNAUTHORIZED",
|
|
6713
|
+
"FORBIDDEN",
|
|
6714
|
+
"VALIDATION"
|
|
6715
|
+
],
|
|
6716
|
+
"x-cli": {
|
|
6717
|
+
"name": "notify"
|
|
6718
|
+
}
|
|
6719
|
+
}
|
|
6720
|
+
},
|
|
6721
|
+
"/api/admin/slack/channels": {
|
|
6722
|
+
"get": {
|
|
6723
|
+
"operationId": "listSlackChannels",
|
|
6724
|
+
"summary": "List Slack channels",
|
|
6725
|
+
"description": "List the project's connected Slack channels — used to resolve an alert rule's notification target.\n\n**Use case:** Populate a channel picker, or validate an alert rule's `--slack-channel` before saving.",
|
|
6726
|
+
"tags": [
|
|
6727
|
+
"Alerts"
|
|
6728
|
+
],
|
|
6729
|
+
"parameters": [
|
|
6730
|
+
{
|
|
6731
|
+
"$ref": "#/components/parameters/ProjectId"
|
|
6732
|
+
}
|
|
6733
|
+
],
|
|
6734
|
+
"responses": {
|
|
6735
|
+
"200": {
|
|
6736
|
+
"description": "List Slack channels",
|
|
6737
|
+
"content": {
|
|
6738
|
+
"application/json": {
|
|
6739
|
+
"schema": {
|
|
6329
6740
|
"$ref": "#/components/schemas/ListSlackChannelsResponse"
|
|
6330
6741
|
},
|
|
6331
6742
|
"example": {
|
|
@@ -6384,6 +6795,9 @@
|
|
|
6384
6795
|
"parameters": [
|
|
6385
6796
|
{
|
|
6386
6797
|
"$ref": "#/components/parameters/ProjectId"
|
|
6798
|
+
},
|
|
6799
|
+
{
|
|
6800
|
+
"$ref": "#/components/parameters/Q"
|
|
6387
6801
|
}
|
|
6388
6802
|
],
|
|
6389
6803
|
"responses": {
|
|
@@ -6506,6 +6920,20 @@
|
|
|
6506
6920
|
"id": "ar_01j7w8a1b2c3d4e5f6g7h8i9j0"
|
|
6507
6921
|
}
|
|
6508
6922
|
}
|
|
6923
|
+
},
|
|
6924
|
+
"links": {
|
|
6925
|
+
"UpdateAlertRule": {
|
|
6926
|
+
"operationId": "updateAlertRule",
|
|
6927
|
+
"parameters": {
|
|
6928
|
+
"id": "$response.body#/id"
|
|
6929
|
+
}
|
|
6930
|
+
},
|
|
6931
|
+
"DeleteAlertRule": {
|
|
6932
|
+
"operationId": "deleteAlertRule",
|
|
6933
|
+
"parameters": {
|
|
6934
|
+
"id": "$response.body#/id"
|
|
6935
|
+
}
|
|
6936
|
+
}
|
|
6509
6937
|
}
|
|
6510
6938
|
},
|
|
6511
6939
|
"400": {
|
|
@@ -6532,6 +6960,7 @@
|
|
|
6532
6960
|
"UNAUTHORIZED",
|
|
6533
6961
|
"FORBIDDEN",
|
|
6534
6962
|
"ALREADY_EXISTS",
|
|
6963
|
+
"METRIC_NOT_FOUND",
|
|
6535
6964
|
"REFERENCED_NOT_FOUND",
|
|
6536
6965
|
"VALIDATION"
|
|
6537
6966
|
],
|
|
@@ -6558,7 +6987,7 @@
|
|
|
6558
6987
|
"required": true,
|
|
6559
6988
|
"description": "Stable opaque alert-rule id (`ar_…`) or the rule's `name`.",
|
|
6560
6989
|
"schema": {
|
|
6561
|
-
"
|
|
6990
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6562
6991
|
}
|
|
6563
6992
|
}
|
|
6564
6993
|
],
|
|
@@ -6660,7 +7089,7 @@
|
|
|
6660
7089
|
"required": true,
|
|
6661
7090
|
"description": "Stable opaque alert-rule id (`ar_…`) or the rule's `name`.",
|
|
6662
7091
|
"schema": {
|
|
6663
|
-
"
|
|
7092
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6664
7093
|
}
|
|
6665
7094
|
}
|
|
6666
7095
|
],
|
|
@@ -6737,7 +7166,7 @@
|
|
|
6737
7166
|
"name": "Acme",
|
|
6738
7167
|
"domain": "acme.com",
|
|
6739
7168
|
"ownerEmail": "owner@acme.com",
|
|
6740
|
-
"plan": "
|
|
7169
|
+
"plan": "pro",
|
|
6741
7170
|
"status": "active",
|
|
6742
7171
|
"subscriptionStatus": "active",
|
|
6743
7172
|
"billingInterval": "monthly",
|
|
@@ -6891,7 +7320,7 @@
|
|
|
6891
7320
|
"required": true,
|
|
6892
7321
|
"description": "Stable opaque project id. Must match the caller's own project.",
|
|
6893
7322
|
"schema": {
|
|
6894
|
-
"
|
|
7323
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
6895
7324
|
}
|
|
6896
7325
|
}
|
|
6897
7326
|
],
|
|
@@ -6932,7 +7361,7 @@
|
|
|
6932
7361
|
"name": "Acme Rockets",
|
|
6933
7362
|
"domain": "acme.com",
|
|
6934
7363
|
"ownerEmail": "owner@acme.com",
|
|
6935
|
-
"plan": "
|
|
7364
|
+
"plan": "pro",
|
|
6936
7365
|
"status": "active",
|
|
6937
7366
|
"subscriptionStatus": "active",
|
|
6938
7367
|
"billingInterval": "monthly",
|
|
@@ -7088,6 +7517,14 @@
|
|
|
7088
7517
|
"name": "fr:prod"
|
|
7089
7518
|
}
|
|
7090
7519
|
}
|
|
7520
|
+
},
|
|
7521
|
+
"links": {
|
|
7522
|
+
"PublishI18nProfile": {
|
|
7523
|
+
"operationId": "publishI18nProfile",
|
|
7524
|
+
"parameters": {
|
|
7525
|
+
"profileId": "$response.body#/id"
|
|
7526
|
+
}
|
|
7527
|
+
}
|
|
7091
7528
|
}
|
|
7092
7529
|
},
|
|
7093
7530
|
"400": {
|
|
@@ -7155,9 +7592,10 @@
|
|
|
7155
7592
|
"name": "q",
|
|
7156
7593
|
"in": "query",
|
|
7157
7594
|
"required": false,
|
|
7158
|
-
"description": "Free-text search — matches keys whose name OR
|
|
7595
|
+
"description": "Free-text search — matches keys whose name, value, OR description contains this substring (case-insensitive). Use it to find the key behind a piece of on-screen copy.",
|
|
7159
7596
|
"schema": {
|
|
7160
|
-
"type": "string"
|
|
7597
|
+
"type": "string",
|
|
7598
|
+
"maxLength": 100
|
|
7161
7599
|
}
|
|
7162
7600
|
},
|
|
7163
7601
|
{
|
|
@@ -7170,6 +7608,17 @@
|
|
|
7170
7608
|
"minimum": 1,
|
|
7171
7609
|
"maximum": 500
|
|
7172
7610
|
}
|
|
7611
|
+
},
|
|
7612
|
+
{
|
|
7613
|
+
"name": "offset",
|
|
7614
|
+
"in": "query",
|
|
7615
|
+
"required": false,
|
|
7616
|
+
"description": "Number of keys to skip before returning `limit` rows (offset pagination).",
|
|
7617
|
+
"schema": {
|
|
7618
|
+
"type": "integer",
|
|
7619
|
+
"minimum": 0,
|
|
7620
|
+
"default": 0
|
|
7621
|
+
}
|
|
7173
7622
|
}
|
|
7174
7623
|
],
|
|
7175
7624
|
"responses": {
|
|
@@ -7319,7 +7768,7 @@
|
|
|
7319
7768
|
"required": true,
|
|
7320
7769
|
"description": "The key's id.",
|
|
7321
7770
|
"schema": {
|
|
7322
|
-
"
|
|
7771
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
7323
7772
|
}
|
|
7324
7773
|
}
|
|
7325
7774
|
],
|
|
@@ -7533,7 +7982,7 @@
|
|
|
7533
7982
|
"required": true,
|
|
7534
7983
|
"description": "The draft id to update.",
|
|
7535
7984
|
"schema": {
|
|
7536
|
-
"
|
|
7985
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
7537
7986
|
}
|
|
7538
7987
|
}
|
|
7539
7988
|
],
|
|
@@ -7617,7 +8066,7 @@
|
|
|
7617
8066
|
"required": true,
|
|
7618
8067
|
"description": "The profile id to publish.",
|
|
7619
8068
|
"schema": {
|
|
7620
|
-
"
|
|
8069
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
7621
8070
|
}
|
|
7622
8071
|
}
|
|
7623
8072
|
],
|
|
@@ -7635,7 +8084,7 @@
|
|
|
7635
8084
|
}
|
|
7636
8085
|
},
|
|
7637
8086
|
"responses": {
|
|
7638
|
-
"
|
|
8087
|
+
"200": {
|
|
7639
8088
|
"description": "Publish a profile chunk",
|
|
7640
8089
|
"content": {
|
|
7641
8090
|
"application/json": {
|
|
@@ -7888,7 +8337,7 @@
|
|
|
7888
8337
|
"get": {
|
|
7889
8338
|
"operationId": "getError",
|
|
7890
8339
|
"summary": "Get a tracked error",
|
|
7891
|
-
"description": "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.\n\n**Use case:** Drill into one issue — fetch its full stack and `seenUrls` to investigate, or
|
|
8340
|
+
"description": "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.\n\n**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.",
|
|
7892
8341
|
"tags": [
|
|
7893
8342
|
"Errors"
|
|
7894
8343
|
],
|
|
@@ -7902,7 +8351,7 @@
|
|
|
7902
8351
|
"required": true,
|
|
7903
8352
|
"description": "Stable opaque error id (`err_…`).",
|
|
7904
8353
|
"schema": {
|
|
7905
|
-
"
|
|
8354
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
7906
8355
|
}
|
|
7907
8356
|
}
|
|
7908
8357
|
],
|
|
@@ -7937,7 +8386,33 @@
|
|
|
7937
8386
|
"firstSeenAt": "2026-06-20T08:11:02.000Z",
|
|
7938
8387
|
"lastSeenAt": "2026-06-28T14:55:31.000Z",
|
|
7939
8388
|
"createdAt": "2026-06-20T08:11:02.000Z",
|
|
7940
|
-
"updatedAt": "2026-06-28T14:55:31.000Z"
|
|
8389
|
+
"updatedAt": "2026-06-28T14:55:31.000Z",
|
|
8390
|
+
"occurrences": [
|
|
8391
|
+
{
|
|
8392
|
+
"id": "occ_01j7w7qq0v3k9d2m5rc8t1xh4n",
|
|
8393
|
+
"message": "Cannot read properties of undefined (reading 'id')",
|
|
8394
|
+
"stack": "TypeError: Cannot read properties of undefined (reading 'id')\n at GateEditor (/app/gates/[id]/page.tsx:42:18)",
|
|
8395
|
+
"url": "https://app.example.com/dashboard/gat_01j7/edit",
|
|
8396
|
+
"env": "prod",
|
|
8397
|
+
"side": "client",
|
|
8398
|
+
"sdkVersion": "6.0.0",
|
|
8399
|
+
"extrasJson": "{\"gateId\":\"gat_01j7\"}",
|
|
8400
|
+
"sampleRate": 100,
|
|
8401
|
+
"seenAt": "2026-06-28T14:55:31.000Z"
|
|
8402
|
+
},
|
|
8403
|
+
{
|
|
8404
|
+
"id": "occ_01j7w7pk8s6e3f9b0zad7y5w2q",
|
|
8405
|
+
"message": "Cannot read properties of undefined (reading 'id')",
|
|
8406
|
+
"stack": "TypeError: Cannot read properties of undefined (reading 'id')\n at GateEditor (/app/gates/[id]/page.tsx:42:18)",
|
|
8407
|
+
"url": "https://app.example.com/dashboard/gat_02c4/edit",
|
|
8408
|
+
"env": "prod",
|
|
8409
|
+
"side": "client",
|
|
8410
|
+
"sdkVersion": "6.0.0",
|
|
8411
|
+
"extrasJson": "{\"gateId\":\"gat_02c4\"}",
|
|
8412
|
+
"sampleRate": 10,
|
|
8413
|
+
"seenAt": "2026-06-24T09:12:05.000Z"
|
|
8414
|
+
}
|
|
8415
|
+
]
|
|
7941
8416
|
}
|
|
7942
8417
|
}
|
|
7943
8418
|
}
|
|
@@ -7990,7 +8465,7 @@
|
|
|
7990
8465
|
"required": true,
|
|
7991
8466
|
"description": "Stable opaque error id (`err_…`).",
|
|
7992
8467
|
"schema": {
|
|
7993
|
-
"
|
|
8468
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
7994
8469
|
}
|
|
7995
8470
|
}
|
|
7996
8471
|
],
|
|
@@ -8107,7 +8582,7 @@
|
|
|
8107
8582
|
"required": true,
|
|
8108
8583
|
"description": "Stable opaque error id (`err_…`).",
|
|
8109
8584
|
"schema": {
|
|
8110
|
-
"
|
|
8585
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8111
8586
|
}
|
|
8112
8587
|
}
|
|
8113
8588
|
],
|
|
@@ -8158,11 +8633,11 @@
|
|
|
8158
8633
|
}
|
|
8159
8634
|
}
|
|
8160
8635
|
},
|
|
8161
|
-
"/api/admin/errors/{id}/
|
|
8636
|
+
"/api/admin/errors/{id}/resolve": {
|
|
8162
8637
|
"post": {
|
|
8163
|
-
"operationId": "
|
|
8164
|
-
"summary": "
|
|
8165
|
-
"description": "
|
|
8638
|
+
"operationId": "resolveError",
|
|
8639
|
+
"summary": "Resolve a tracked error",
|
|
8640
|
+
"description": "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.\n\n**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.",
|
|
8166
8641
|
"tags": [
|
|
8167
8642
|
"Errors"
|
|
8168
8643
|
],
|
|
@@ -8176,73 +8651,163 @@
|
|
|
8176
8651
|
"required": true,
|
|
8177
8652
|
"description": "Stable opaque error id (`err_…`).",
|
|
8178
8653
|
"schema": {
|
|
8179
|
-
"
|
|
8654
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8180
8655
|
}
|
|
8181
8656
|
}
|
|
8182
8657
|
],
|
|
8183
|
-
"requestBody": {
|
|
8184
|
-
"required": true,
|
|
8185
|
-
"content": {
|
|
8186
|
-
"application/json": {
|
|
8187
|
-
"schema": {
|
|
8188
|
-
"$ref": "#/components/schemas/ErrorSeriesRequest"
|
|
8189
|
-
},
|
|
8190
|
-
"examples": {
|
|
8191
|
-
"lastDayHourly": {
|
|
8192
|
-
"summary": "Last 24h, hourly buckets",
|
|
8193
|
-
"description": "Hourly occurrence counts over a one-day window (bounds in epoch seconds).",
|
|
8194
|
-
"value": {
|
|
8195
|
-
"from": 1751000400,
|
|
8196
|
-
"to": 1751086800,
|
|
8197
|
-
"bucket": 3600
|
|
8198
|
-
}
|
|
8199
|
-
}
|
|
8200
|
-
}
|
|
8201
|
-
}
|
|
8202
|
-
}
|
|
8203
|
-
},
|
|
8204
8658
|
"responses": {
|
|
8205
8659
|
"200": {
|
|
8206
|
-
"description": "
|
|
8660
|
+
"description": "Resolve a tracked error",
|
|
8207
8661
|
"content": {
|
|
8208
8662
|
"application/json": {
|
|
8209
8663
|
"schema": {
|
|
8210
|
-
"$ref": "#/components/schemas/
|
|
8664
|
+
"$ref": "#/components/schemas/ErrorRecord"
|
|
8211
8665
|
},
|
|
8212
8666
|
"example": {
|
|
8213
|
-
"
|
|
8214
|
-
"
|
|
8215
|
-
|
|
8216
|
-
|
|
8217
|
-
|
|
8218
|
-
|
|
8219
|
-
|
|
8220
|
-
|
|
8221
|
-
|
|
8222
|
-
|
|
8223
|
-
|
|
8224
|
-
|
|
8225
|
-
|
|
8226
|
-
|
|
8227
|
-
|
|
8228
|
-
|
|
8229
|
-
|
|
8230
|
-
|
|
8231
|
-
|
|
8232
|
-
|
|
8233
|
-
|
|
8234
|
-
|
|
8235
|
-
|
|
8236
|
-
|
|
8237
|
-
|
|
8238
|
-
|
|
8239
|
-
|
|
8240
|
-
|
|
8241
|
-
|
|
8242
|
-
|
|
8243
|
-
|
|
8244
|
-
|
|
8245
|
-
|
|
8667
|
+
"id": "err_01j7w7m9q4hxbf6npe6s9zr3vc",
|
|
8668
|
+
"projectId": "e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90",
|
|
8669
|
+
"fingerprint": "9c1f4f1f2c0c4a5fa1c2b6d3e7c8e3a1",
|
|
8670
|
+
"causedByFingerprint": null,
|
|
8671
|
+
"message": "Cannot read properties of undefined (reading 'id')",
|
|
8672
|
+
"errorType": "TypeError",
|
|
8673
|
+
"stack": null,
|
|
8674
|
+
"source": "shipeasy",
|
|
8675
|
+
"url": "https://app.example.com/dashboard/gat_01j7/edit",
|
|
8676
|
+
"seenUrls": null,
|
|
8677
|
+
"subject": "gate editor",
|
|
8678
|
+
"outcome": "crash on load",
|
|
8679
|
+
"side": "client",
|
|
8680
|
+
"env": "prod",
|
|
8681
|
+
"kind": "uncaught",
|
|
8682
|
+
"lastExtrasJson": null,
|
|
8683
|
+
"sdkVersion": "6.0.0",
|
|
8684
|
+
"count": 137,
|
|
8685
|
+
"status": "resolved",
|
|
8686
|
+
"firstSeenAt": "2026-06-20T08:11:02.000Z",
|
|
8687
|
+
"lastSeenAt": "2026-06-28T14:55:31.000Z",
|
|
8688
|
+
"createdAt": "2026-06-20T08:11:02.000Z",
|
|
8689
|
+
"updatedAt": "2026-06-28T15:02:10.000Z"
|
|
8690
|
+
}
|
|
8691
|
+
}
|
|
8692
|
+
}
|
|
8693
|
+
},
|
|
8694
|
+
"400": {
|
|
8695
|
+
"$ref": "#/components/responses/BadRequest"
|
|
8696
|
+
},
|
|
8697
|
+
"401": {
|
|
8698
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
8699
|
+
},
|
|
8700
|
+
"403": {
|
|
8701
|
+
"$ref": "#/components/responses/Forbidden"
|
|
8702
|
+
},
|
|
8703
|
+
"404": {
|
|
8704
|
+
"$ref": "#/components/responses/NotFound"
|
|
8705
|
+
},
|
|
8706
|
+
"409": {
|
|
8707
|
+
"$ref": "#/components/responses/Conflict"
|
|
8708
|
+
},
|
|
8709
|
+
"422": {
|
|
8710
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
8711
|
+
}
|
|
8712
|
+
},
|
|
8713
|
+
"x-error-codes": [
|
|
8714
|
+
"UNAUTHORIZED",
|
|
8715
|
+
"FORBIDDEN",
|
|
8716
|
+
"NOT_FOUND"
|
|
8717
|
+
],
|
|
8718
|
+
"x-cli": {
|
|
8719
|
+
"name": "resolve",
|
|
8720
|
+
"positional": [
|
|
8721
|
+
"id"
|
|
8722
|
+
]
|
|
8723
|
+
}
|
|
8724
|
+
}
|
|
8725
|
+
},
|
|
8726
|
+
"/api/admin/errors/{id}/series": {
|
|
8727
|
+
"post": {
|
|
8728
|
+
"operationId": "getErrorSeries",
|
|
8729
|
+
"summary": "Get an error's occurrence series",
|
|
8730
|
+
"description": "Returns a bucketed occurrence timeseries for one tracked error (by its fingerprint), read from the `shipeasy_errors` Analytics Engine dataset (near-real-time; ingest lag is seconds). The window bounds are epoch **seconds**; `to` must be strictly greater than `from`. The response echoes the SQL that produced the rows.\n\n**Use case:** Render the trend sparkline / occurrence chart on the error detail panel, or pull the raw bucketed counts to alert when an issue's rate spikes.",
|
|
8731
|
+
"tags": [
|
|
8732
|
+
"Errors"
|
|
8733
|
+
],
|
|
8734
|
+
"parameters": [
|
|
8735
|
+
{
|
|
8736
|
+
"$ref": "#/components/parameters/ProjectId"
|
|
8737
|
+
},
|
|
8738
|
+
{
|
|
8739
|
+
"name": "id",
|
|
8740
|
+
"in": "path",
|
|
8741
|
+
"required": true,
|
|
8742
|
+
"description": "Stable opaque error id (`err_…`).",
|
|
8743
|
+
"schema": {
|
|
8744
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8745
|
+
}
|
|
8746
|
+
}
|
|
8747
|
+
],
|
|
8748
|
+
"requestBody": {
|
|
8749
|
+
"required": true,
|
|
8750
|
+
"content": {
|
|
8751
|
+
"application/json": {
|
|
8752
|
+
"schema": {
|
|
8753
|
+
"$ref": "#/components/schemas/ErrorSeriesRequest"
|
|
8754
|
+
},
|
|
8755
|
+
"examples": {
|
|
8756
|
+
"lastDayHourly": {
|
|
8757
|
+
"summary": "Last 24h, hourly buckets",
|
|
8758
|
+
"description": "Hourly occurrence counts over a one-day window (bounds in epoch seconds).",
|
|
8759
|
+
"value": {
|
|
8760
|
+
"from": 1751000400,
|
|
8761
|
+
"to": 1751086800,
|
|
8762
|
+
"bucket": 3600
|
|
8763
|
+
}
|
|
8764
|
+
}
|
|
8765
|
+
}
|
|
8766
|
+
}
|
|
8767
|
+
}
|
|
8768
|
+
},
|
|
8769
|
+
"responses": {
|
|
8770
|
+
"200": {
|
|
8771
|
+
"description": "Get an error's occurrence series",
|
|
8772
|
+
"content": {
|
|
8773
|
+
"application/json": {
|
|
8774
|
+
"schema": {
|
|
8775
|
+
"$ref": "#/components/schemas/ErrorSeriesResponse"
|
|
8776
|
+
},
|
|
8777
|
+
"example": {
|
|
8778
|
+
"sql": "SELECT intDiv(toUInt32(double2), 3600) * 3600 AS t,\n sum(double1 * _sample_interval) AS v\nFROM shipeasy_errors\nWHERE index1 = 'e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90'\n AND blob1 = '9c1f4f1f2c0c4a5fa1c2b6d3e7c8e3a1'\n AND double2 >= 1751000400 AND double2 < 1751086800\nGROUP BY t\nORDER BY t",
|
|
8779
|
+
"rows": [
|
|
8780
|
+
{
|
|
8781
|
+
"t": 1751000400,
|
|
8782
|
+
"v": 12
|
|
8783
|
+
},
|
|
8784
|
+
{
|
|
8785
|
+
"t": 1751004000,
|
|
8786
|
+
"v": 31
|
|
8787
|
+
},
|
|
8788
|
+
{
|
|
8789
|
+
"t": 1751007600,
|
|
8790
|
+
"v": 27
|
|
8791
|
+
}
|
|
8792
|
+
]
|
|
8793
|
+
}
|
|
8794
|
+
}
|
|
8795
|
+
}
|
|
8796
|
+
},
|
|
8797
|
+
"400": {
|
|
8798
|
+
"$ref": "#/components/responses/BadRequest"
|
|
8799
|
+
},
|
|
8800
|
+
"401": {
|
|
8801
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
8802
|
+
},
|
|
8803
|
+
"403": {
|
|
8804
|
+
"$ref": "#/components/responses/Forbidden"
|
|
8805
|
+
},
|
|
8806
|
+
"404": {
|
|
8807
|
+
"$ref": "#/components/responses/NotFound"
|
|
8808
|
+
},
|
|
8809
|
+
"409": {
|
|
8810
|
+
"$ref": "#/components/responses/Conflict"
|
|
8246
8811
|
},
|
|
8247
8812
|
"422": {
|
|
8248
8813
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
@@ -8273,6 +8838,9 @@
|
|
|
8273
8838
|
"parameters": [
|
|
8274
8839
|
{
|
|
8275
8840
|
"$ref": "#/components/parameters/ProjectId"
|
|
8841
|
+
},
|
|
8842
|
+
{
|
|
8843
|
+
"$ref": "#/components/parameters/Q"
|
|
8276
8844
|
}
|
|
8277
8845
|
],
|
|
8278
8846
|
"responses": {
|
|
@@ -8426,6 +8994,32 @@
|
|
|
8426
8994
|
"id": "9b0e7c2a-1f3d-4a8e-bf21-0c6a2e5d7f10"
|
|
8427
8995
|
}
|
|
8428
8996
|
}
|
|
8997
|
+
},
|
|
8998
|
+
"links": {
|
|
8999
|
+
"GetConnector": {
|
|
9000
|
+
"operationId": "getConnector",
|
|
9001
|
+
"parameters": {
|
|
9002
|
+
"id": "$response.body#/id"
|
|
9003
|
+
}
|
|
9004
|
+
},
|
|
9005
|
+
"UpdateConnector": {
|
|
9006
|
+
"operationId": "updateConnector",
|
|
9007
|
+
"parameters": {
|
|
9008
|
+
"id": "$response.body#/id"
|
|
9009
|
+
}
|
|
9010
|
+
},
|
|
9011
|
+
"TestConnector": {
|
|
9012
|
+
"operationId": "testConnector",
|
|
9013
|
+
"parameters": {
|
|
9014
|
+
"id": "$response.body#/id"
|
|
9015
|
+
}
|
|
9016
|
+
},
|
|
9017
|
+
"DeleteConnector": {
|
|
9018
|
+
"operationId": "deleteConnector",
|
|
9019
|
+
"parameters": {
|
|
9020
|
+
"id": "$response.body#/id"
|
|
9021
|
+
}
|
|
9022
|
+
}
|
|
8429
9023
|
}
|
|
8430
9024
|
},
|
|
8431
9025
|
"400": {
|
|
@@ -8475,7 +9069,7 @@
|
|
|
8475
9069
|
"required": true,
|
|
8476
9070
|
"description": "Stable opaque connector id.",
|
|
8477
9071
|
"schema": {
|
|
8478
|
-
"
|
|
9072
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8479
9073
|
}
|
|
8480
9074
|
}
|
|
8481
9075
|
],
|
|
@@ -8558,7 +9152,7 @@
|
|
|
8558
9152
|
"required": true,
|
|
8559
9153
|
"description": "Stable opaque connector id.",
|
|
8560
9154
|
"schema": {
|
|
8561
|
-
"
|
|
9155
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8562
9156
|
}
|
|
8563
9157
|
}
|
|
8564
9158
|
],
|
|
@@ -8664,7 +9258,7 @@
|
|
|
8664
9258
|
"required": true,
|
|
8665
9259
|
"description": "Stable opaque connector id.",
|
|
8666
9260
|
"schema": {
|
|
8667
|
-
"
|
|
9261
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8668
9262
|
}
|
|
8669
9263
|
}
|
|
8670
9264
|
],
|
|
@@ -8732,7 +9326,7 @@
|
|
|
8732
9326
|
"required": true,
|
|
8733
9327
|
"description": "Stable opaque connector id.",
|
|
8734
9328
|
"schema": {
|
|
8735
|
-
"
|
|
9329
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8736
9330
|
}
|
|
8737
9331
|
}
|
|
8738
9332
|
],
|
|
@@ -8761,7 +9355,7 @@
|
|
|
8761
9355
|
},
|
|
8762
9356
|
"responses": {
|
|
8763
9357
|
"200": {
|
|
8764
|
-
"description": "
|
|
9358
|
+
"description": "The trigger run was successfully kicked off.",
|
|
8765
9359
|
"content": {
|
|
8766
9360
|
"application/json": {
|
|
8767
9361
|
"schema": {
|
|
@@ -8790,6 +9384,9 @@
|
|
|
8790
9384
|
},
|
|
8791
9385
|
"422": {
|
|
8792
9386
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
9387
|
+
},
|
|
9388
|
+
"502": {
|
|
9389
|
+
"$ref": "#/components/responses/BadGateway"
|
|
8793
9390
|
}
|
|
8794
9391
|
},
|
|
8795
9392
|
"x-error-codes": [
|
|
@@ -8823,13 +9420,13 @@
|
|
|
8823
9420
|
"required": true,
|
|
8824
9421
|
"description": "Stable opaque connector id.",
|
|
8825
9422
|
"schema": {
|
|
8826
|
-
"
|
|
9423
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8827
9424
|
}
|
|
8828
9425
|
}
|
|
8829
9426
|
],
|
|
8830
9427
|
"responses": {
|
|
8831
9428
|
"200": {
|
|
8832
|
-
"description": "
|
|
9429
|
+
"description": "The test dispatch reached the destination.",
|
|
8833
9430
|
"content": {
|
|
8834
9431
|
"application/json": {
|
|
8835
9432
|
"schema": {
|
|
@@ -8859,6 +9456,9 @@
|
|
|
8859
9456
|
},
|
|
8860
9457
|
"422": {
|
|
8861
9458
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
9459
|
+
},
|
|
9460
|
+
"502": {
|
|
9461
|
+
"$ref": "#/components/responses/BadGateway"
|
|
8862
9462
|
}
|
|
8863
9463
|
},
|
|
8864
9464
|
"x-error-codes": [
|
|
@@ -8892,7 +9492,7 @@
|
|
|
8892
9492
|
"required": true,
|
|
8893
9493
|
"description": "Stable opaque connector id. Its stored `provider` must match the body's `provider`.",
|
|
8894
9494
|
"schema": {
|
|
8895
|
-
"
|
|
9495
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
8896
9496
|
}
|
|
8897
9497
|
}
|
|
8898
9498
|
],
|
|
@@ -9038,6 +9638,38 @@
|
|
|
9038
9638
|
"id": "9b0e7c2a-1f3d-4a8e-bf21-0c6a2e5d7f10"
|
|
9039
9639
|
}
|
|
9040
9640
|
}
|
|
9641
|
+
},
|
|
9642
|
+
"links": {
|
|
9643
|
+
"FireConnector": {
|
|
9644
|
+
"operationId": "fireConnector",
|
|
9645
|
+
"parameters": {
|
|
9646
|
+
"id": "$response.body#/id"
|
|
9647
|
+
}
|
|
9648
|
+
},
|
|
9649
|
+
"TestConnector": {
|
|
9650
|
+
"operationId": "testConnector",
|
|
9651
|
+
"parameters": {
|
|
9652
|
+
"id": "$response.body#/id"
|
|
9653
|
+
}
|
|
9654
|
+
},
|
|
9655
|
+
"GetConnector": {
|
|
9656
|
+
"operationId": "getConnector",
|
|
9657
|
+
"parameters": {
|
|
9658
|
+
"id": "$response.body#/id"
|
|
9659
|
+
}
|
|
9660
|
+
},
|
|
9661
|
+
"UpdateTriggerConnector": {
|
|
9662
|
+
"operationId": "updateTriggerConnector",
|
|
9663
|
+
"parameters": {
|
|
9664
|
+
"id": "$response.body#/id"
|
|
9665
|
+
}
|
|
9666
|
+
},
|
|
9667
|
+
"DeleteConnector": {
|
|
9668
|
+
"operationId": "deleteConnector",
|
|
9669
|
+
"parameters": {
|
|
9670
|
+
"id": "$response.body#/id"
|
|
9671
|
+
}
|
|
9672
|
+
}
|
|
9041
9673
|
}
|
|
9042
9674
|
},
|
|
9043
9675
|
"400": {
|
|
@@ -9129,6 +9761,9 @@
|
|
|
9129
9761
|
},
|
|
9130
9762
|
{
|
|
9131
9763
|
"$ref": "#/components/parameters/PaginationCursor"
|
|
9764
|
+
},
|
|
9765
|
+
{
|
|
9766
|
+
"$ref": "#/components/parameters/Q"
|
|
9132
9767
|
}
|
|
9133
9768
|
],
|
|
9134
9769
|
"responses": {
|
|
@@ -9281,7 +9916,8 @@
|
|
|
9281
9916
|
"x-error-codes": [
|
|
9282
9917
|
"UNAUTHORIZED",
|
|
9283
9918
|
"FORBIDDEN",
|
|
9284
|
-
"VALIDATION"
|
|
9919
|
+
"VALIDATION",
|
|
9920
|
+
"PLAN_LIMIT"
|
|
9285
9921
|
],
|
|
9286
9922
|
"x-cli": {
|
|
9287
9923
|
"name": "create"
|
|
@@ -9306,7 +9942,7 @@
|
|
|
9306
9942
|
"required": true,
|
|
9307
9943
|
"description": "Stable opaque key id (UUID) returned by `create` / `list`.",
|
|
9308
9944
|
"schema": {
|
|
9309
|
-
"
|
|
9945
|
+
"$ref": "#/components/schemas/ResourceId"
|
|
9310
9946
|
}
|
|
9311
9947
|
}
|
|
9312
9948
|
],
|
|
@@ -9484,6 +10120,16 @@
|
|
|
9484
10120
|
"schema": {
|
|
9485
10121
|
"type": "string"
|
|
9486
10122
|
}
|
|
10123
|
+
},
|
|
10124
|
+
"Q": {
|
|
10125
|
+
"name": "q",
|
|
10126
|
+
"in": "query",
|
|
10127
|
+
"required": false,
|
|
10128
|
+
"description": "Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.",
|
|
10129
|
+
"schema": {
|
|
10130
|
+
"type": "string",
|
|
10131
|
+
"maxLength": 100
|
|
10132
|
+
}
|
|
9487
10133
|
}
|
|
9488
10134
|
},
|
|
9489
10135
|
"schemas": {
|
|
@@ -9518,6 +10164,14 @@
|
|
|
9518
10164
|
],
|
|
9519
10165
|
"description": "Master switch. Returned as `1`/`0` from D1; treat truthy as enabled."
|
|
9520
10166
|
},
|
|
10167
|
+
"type": {
|
|
10168
|
+
"type": "string",
|
|
10169
|
+
"enum": [
|
|
10170
|
+
"targeting",
|
|
10171
|
+
"holdout"
|
|
10172
|
+
],
|
|
10173
|
+
"description": "Gate kind — `targeting` (normal flag) or `holdout` (restricted public % + whitelist)."
|
|
10174
|
+
},
|
|
9521
10175
|
"rolloutPct": {
|
|
9522
10176
|
"type": "integer",
|
|
9523
10177
|
"minimum": 0,
|
|
@@ -9928,7 +10582,16 @@
|
|
|
9928
10582
|
"REFERENCED_NOT_FOUND",
|
|
9929
10583
|
"GROUPS_WEIGHT_SUM",
|
|
9930
10584
|
"EVENT_PENDING",
|
|
9931
|
-
"INTERNAL"
|
|
10585
|
+
"INTERNAL",
|
|
10586
|
+
"PLAN_LIMIT",
|
|
10587
|
+
"EXPERIMENT_NO_GOAL_METRIC",
|
|
10588
|
+
"EXPERIMENT_ARCHIVED_RESTART",
|
|
10589
|
+
"EXPERIMENT_RESTORE_INVALID",
|
|
10590
|
+
"EXPERIMENT_NOT_RUNNING",
|
|
10591
|
+
"EXPERIMENT_RUNNING_ARCHIVE",
|
|
10592
|
+
"EXPERIMENT_IMMUTABLE_FIELD",
|
|
10593
|
+
"METRIC_NOT_FOUND",
|
|
10594
|
+
"METRIC_UNKNOWN_ID"
|
|
9932
10595
|
],
|
|
9933
10596
|
"x-enum-descriptions": {
|
|
9934
10597
|
"BAD_REQUEST": "Malformed request (bad JSON, missing project scope).",
|
|
@@ -9945,12 +10608,21 @@
|
|
|
9945
10608
|
"REFERENCED_NOT_FOUND": "A referenced entity (universe, metric, gate, event) does not exist.",
|
|
9946
10609
|
"GROUPS_WEIGHT_SUM": "Experiment group weights must sum to 10000 (basis points).",
|
|
9947
10610
|
"EVENT_PENDING": "The referenced event is still pending review and cannot back a metric yet.",
|
|
9948
|
-
"INTERNAL": "Unexpected server error."
|
|
10611
|
+
"INTERNAL": "Unexpected server error.",
|
|
10612
|
+
"PLAN_LIMIT": "The action would exceed a plan quota (e.g. the tier's maximum experiments, metrics, or configs). Upgrade the plan or archive an existing resource.",
|
|
10613
|
+
"EXPERIMENT_NO_GOAL_METRIC": "The experiment has no goal metric set, which the requested action requires.",
|
|
10614
|
+
"EXPERIMENT_ARCHIVED_RESTART": "An archived experiment cannot be restarted.",
|
|
10615
|
+
"EXPERIMENT_RESTORE_INVALID": "The experiment cannot be restored from its current state.",
|
|
10616
|
+
"EXPERIMENT_NOT_RUNNING": "The action requires the experiment to be running.",
|
|
10617
|
+
"EXPERIMENT_RUNNING_ARCHIVE": "A running experiment cannot be archived — stop it first.",
|
|
10618
|
+
"EXPERIMENT_IMMUTABLE_FIELD": "A field that is immutable while the experiment is running was modified.",
|
|
10619
|
+
"METRIC_NOT_FOUND": "The referenced metric does not exist or is not visible to the caller.",
|
|
10620
|
+
"METRIC_UNKNOWN_ID": "The supplied metric id is malformed or not recognised."
|
|
9949
10621
|
}
|
|
9950
10622
|
},
|
|
9951
10623
|
"Error": {
|
|
9952
10624
|
"type": "object",
|
|
9953
|
-
"description": "Uniform error envelope returned by every admin endpoint on a non-2xx status. `error` is the human-readable message; `code` is the stable machine code (present whenever the failure maps to a catalogued `ErrorCode`); `detail` carries extra context (validation paths, conflicting field); `instructions` is optional actionable guidance for resolving the error.",
|
|
10625
|
+
"description": "Uniform error envelope returned by every admin endpoint on a non-2xx status. `error` is the human-readable message; `code` is the stable machine code (present whenever the failure maps to a catalogued `ErrorCode`); `detail` carries extra context (validation paths, conflicting field); `fields` maps each failing input field to its own message; `instructions` is optional actionable guidance for resolving the error; `schema` echoes back the expected JSON Schema when a value failed schema validation.",
|
|
9954
10626
|
"required": [
|
|
9955
10627
|
"error"
|
|
9956
10628
|
],
|
|
@@ -9967,9 +10639,21 @@
|
|
|
9967
10639
|
"type": "string",
|
|
9968
10640
|
"description": "Extra context (validation details, conflicting field, referenced row)."
|
|
9969
10641
|
},
|
|
10642
|
+
"fields": {
|
|
10643
|
+
"type": "object",
|
|
10644
|
+
"additionalProperties": {
|
|
10645
|
+
"type": "string"
|
|
10646
|
+
},
|
|
10647
|
+
"description": "Per-field validation messages, keyed by the submitted field's path (dot-notation for nested fields, e.g. `groups.0.weight`). Present when structural validation failed on one or more specific input fields, so a client form can attach each message to its own input instead of collapsing everything into one banner."
|
|
10648
|
+
},
|
|
9970
10649
|
"instructions": {
|
|
9971
10650
|
"type": "string",
|
|
9972
10651
|
"description": "Actionable guidance for resolving this error — what to check or change next."
|
|
10652
|
+
},
|
|
10653
|
+
"schema": {
|
|
10654
|
+
"type": "object",
|
|
10655
|
+
"additionalProperties": true,
|
|
10656
|
+
"description": "The expected JSON Schema (draft 2020-12) the submitted value must satisfy. Returned only when a value failed schema validation (e.g. a config `value` that does not match its config's saved schema), so the caller can correct the value and retry without re-fetching."
|
|
9973
10657
|
}
|
|
9974
10658
|
}
|
|
9975
10659
|
},
|
|
@@ -9995,6 +10679,15 @@
|
|
|
9995
10679
|
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
9996
10680
|
"description": "Stable gate key used by SDKs (`Shipeasy.checkGate(user, '<name>')`). Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create — rename = delete + recreate."
|
|
9997
10681
|
},
|
|
10682
|
+
"type": {
|
|
10683
|
+
"default": "targeting",
|
|
10684
|
+
"type": "string",
|
|
10685
|
+
"enum": [
|
|
10686
|
+
"targeting",
|
|
10687
|
+
"holdout"
|
|
10688
|
+
],
|
|
10689
|
+
"description": "Gate kind. `targeting` (default) is a normal flag with the full builder. `holdout` is a **restricted** flag — only a public rollout % and a whitelist are allowed; attribute rules and a gatekeeper stack are rejected. Used as an experiment's `holdout_gate`."
|
|
10690
|
+
},
|
|
9998
10691
|
"enabled": {
|
|
9999
10692
|
"default": true,
|
|
10000
10693
|
"description": "Master switch. Defaults to `true`. Set `false` to create the gate disabled (evaluates to `false` regardless of rules/rollout); flip on via `POST /{id}/enable` or PATCH.",
|
|
@@ -10370,6 +11063,12 @@
|
|
|
10370
11063
|
],
|
|
10371
11064
|
"additionalProperties": false
|
|
10372
11065
|
},
|
|
11066
|
+
"ResourceId": {
|
|
11067
|
+
"type": "string",
|
|
11068
|
+
"minLength": 1,
|
|
11069
|
+
"maxLength": 128,
|
|
11070
|
+
"description": "A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long value can never name a real row."
|
|
11071
|
+
},
|
|
10373
11072
|
"DeleteGateResponse": {
|
|
10374
11073
|
"type": "object",
|
|
10375
11074
|
"properties": {
|
|
@@ -10386,6 +11085,14 @@
|
|
|
10386
11085
|
"UpdateGateRequest": {
|
|
10387
11086
|
"type": "object",
|
|
10388
11087
|
"properties": {
|
|
11088
|
+
"type": {
|
|
11089
|
+
"type": "string",
|
|
11090
|
+
"enum": [
|
|
11091
|
+
"targeting",
|
|
11092
|
+
"holdout"
|
|
11093
|
+
],
|
|
11094
|
+
"description": "Gate kind. Switching to `holdout` requires the gate carry only a public rollout % + whitelist (attribute rules / stack are rejected)."
|
|
11095
|
+
},
|
|
10389
11096
|
"rollout_pct": {
|
|
10390
11097
|
"description": "New rollout in **basis points** (0–10000 = 0%–100%) — `100` here means **1%**. Use `rollout_percent` (0–100) below for percent. Omit both to leave unchanged.",
|
|
10391
11098
|
"type": "integer",
|
|
@@ -10775,307 +11482,13 @@
|
|
|
10775
11482
|
],
|
|
10776
11483
|
"additionalProperties": false
|
|
10777
11484
|
},
|
|
10778
|
-
"
|
|
11485
|
+
"ExperimentApiRow": {
|
|
10779
11486
|
"type": "object",
|
|
10780
11487
|
"properties": {
|
|
10781
|
-
"
|
|
10782
|
-
"type": "array",
|
|
10783
|
-
"items": {
|
|
10784
|
-
"type": "object",
|
|
10785
|
-
"properties": {
|
|
10786
|
-
"id": {
|
|
10787
|
-
"type": "string",
|
|
10788
|
-
"description": "Stable opaque experiment id (`exp_…`)."
|
|
10789
|
-
},
|
|
10790
|
-
"name": {
|
|
10791
|
-
"type": "string",
|
|
10792
|
-
"maxLength": 128,
|
|
10793
|
-
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
10794
|
-
"description": "Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create."
|
|
10795
|
-
},
|
|
10796
|
-
"description": {
|
|
10797
|
-
"anyOf": [
|
|
10798
|
-
{
|
|
10799
|
-
"type": "string"
|
|
10800
|
-
},
|
|
10801
|
-
{
|
|
10802
|
-
"type": "null"
|
|
10803
|
-
}
|
|
10804
|
-
]
|
|
10805
|
-
},
|
|
10806
|
-
"hypothesis": {
|
|
10807
|
-
"anyOf": [
|
|
10808
|
-
{
|
|
10809
|
-
"type": "string"
|
|
10810
|
-
},
|
|
10811
|
-
{
|
|
10812
|
-
"type": "null"
|
|
10813
|
-
}
|
|
10814
|
-
]
|
|
10815
|
-
},
|
|
10816
|
-
"tag": {
|
|
10817
|
-
"anyOf": [
|
|
10818
|
-
{
|
|
10819
|
-
"type": "string"
|
|
10820
|
-
},
|
|
10821
|
-
{
|
|
10822
|
-
"type": "null"
|
|
10823
|
-
}
|
|
10824
|
-
]
|
|
10825
|
-
},
|
|
10826
|
-
"ownerEmail": {
|
|
10827
|
-
"anyOf": [
|
|
10828
|
-
{
|
|
10829
|
-
"type": "string"
|
|
10830
|
-
},
|
|
10831
|
-
{
|
|
10832
|
-
"type": "null"
|
|
10833
|
-
}
|
|
10834
|
-
]
|
|
10835
|
-
},
|
|
10836
|
-
"audience": {
|
|
10837
|
-
"anyOf": [
|
|
10838
|
-
{
|
|
10839
|
-
"type": "string"
|
|
10840
|
-
},
|
|
10841
|
-
{
|
|
10842
|
-
"type": "null"
|
|
10843
|
-
}
|
|
10844
|
-
]
|
|
10845
|
-
},
|
|
10846
|
-
"bucketBy": {
|
|
10847
|
-
"anyOf": [
|
|
10848
|
-
{
|
|
10849
|
-
"type": "string",
|
|
10850
|
-
"minLength": 1,
|
|
10851
|
-
"maxLength": 128,
|
|
10852
|
-
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$",
|
|
10853
|
-
"description": "User-attribute name used as the bucketing key — e.g. `user_id` (default), `session_id`, `device_id`, or a custom attribute like `company_id` to keep a whole org on one variant. Defaults to `user_id` when omitted."
|
|
10854
|
-
},
|
|
10855
|
-
{
|
|
10856
|
-
"type": "null"
|
|
10857
|
-
}
|
|
10858
|
-
]
|
|
10859
|
-
},
|
|
10860
|
-
"folder": {
|
|
10861
|
-
"anyOf": [
|
|
10862
|
-
{
|
|
10863
|
-
"type": "string"
|
|
10864
|
-
},
|
|
10865
|
-
{
|
|
10866
|
-
"type": "null"
|
|
10867
|
-
}
|
|
10868
|
-
]
|
|
10869
|
-
},
|
|
10870
|
-
"status": {
|
|
10871
|
-
"type": "string",
|
|
10872
|
-
"enum": [
|
|
10873
|
-
"draft",
|
|
10874
|
-
"running",
|
|
10875
|
-
"stopped",
|
|
10876
|
-
"archived"
|
|
10877
|
-
]
|
|
10878
|
-
},
|
|
10879
|
-
"universe": {
|
|
10880
|
-
"type": "string",
|
|
10881
|
-
"description": "Universe name this experiment draws from."
|
|
10882
|
-
},
|
|
10883
|
-
"targetingGate": {
|
|
10884
|
-
"anyOf": [
|
|
10885
|
-
{
|
|
10886
|
-
"type": "string"
|
|
10887
|
-
},
|
|
10888
|
-
{
|
|
10889
|
-
"type": "null"
|
|
10890
|
-
}
|
|
10891
|
-
]
|
|
10892
|
-
},
|
|
10893
|
-
"allocationPct": {
|
|
10894
|
-
"type": "integer",
|
|
10895
|
-
"minimum": -9007199254740991,
|
|
10896
|
-
"maximum": 9007199254740991,
|
|
10897
|
-
"description": "Allocation in basis points (0–10000)."
|
|
10898
|
-
},
|
|
10899
|
-
"salt": {
|
|
10900
|
-
"type": "string"
|
|
10901
|
-
},
|
|
10902
|
-
"params": {
|
|
10903
|
-
"type": "object",
|
|
10904
|
-
"additionalProperties": {
|
|
10905
|
-
"type": "string",
|
|
10906
|
-
"enum": [
|
|
10907
|
-
"string",
|
|
10908
|
-
"bool",
|
|
10909
|
-
"number"
|
|
10910
|
-
]
|
|
10911
|
-
}
|
|
10912
|
-
},
|
|
10913
|
-
"groups": {
|
|
10914
|
-
"type": "array",
|
|
10915
|
-
"items": {
|
|
10916
|
-
"type": "object",
|
|
10917
|
-
"properties": {
|
|
10918
|
-
"name": {
|
|
10919
|
-
"type": "string",
|
|
10920
|
-
"minLength": 1,
|
|
10921
|
-
"maxLength": 64,
|
|
10922
|
-
"description": "Group label (e.g. `control`, `treatment_a`). Max 64 chars."
|
|
10923
|
-
},
|
|
10924
|
-
"weight": {
|
|
10925
|
-
"type": "integer",
|
|
10926
|
-
"minimum": 0,
|
|
10927
|
-
"maximum": 10000,
|
|
10928
|
-
"description": "Allocation weight in basis points (0–10000). The sum across all groups must equal exactly **10000** (100%)."
|
|
10929
|
-
},
|
|
10930
|
-
"params": {
|
|
10931
|
-
"default": {},
|
|
10932
|
-
"description": "Per-group parameter values delivered to the SDK when a caller is hashed into this group. Keys must match the experiment's `params` schema.",
|
|
10933
|
-
"type": "object",
|
|
10934
|
-
"additionalProperties": {}
|
|
10935
|
-
}
|
|
10936
|
-
},
|
|
10937
|
-
"required": [
|
|
10938
|
-
"name",
|
|
10939
|
-
"weight"
|
|
10940
|
-
],
|
|
10941
|
-
"additionalProperties": false,
|
|
10942
|
-
"description": "One variant in the experiment. Weights across all groups must sum to 10000."
|
|
10943
|
-
}
|
|
10944
|
-
},
|
|
10945
|
-
"significanceThreshold": {
|
|
10946
|
-
"type": "number"
|
|
10947
|
-
},
|
|
10948
|
-
"minRuntimeDays": {
|
|
10949
|
-
"type": "integer",
|
|
10950
|
-
"minimum": -9007199254740991,
|
|
10951
|
-
"maximum": 9007199254740991
|
|
10952
|
-
},
|
|
10953
|
-
"minSampleSize": {
|
|
10954
|
-
"type": "integer",
|
|
10955
|
-
"minimum": -9007199254740991,
|
|
10956
|
-
"maximum": 9007199254740991
|
|
10957
|
-
},
|
|
10958
|
-
"sequentialTesting": {
|
|
10959
|
-
"type": "boolean"
|
|
10960
|
-
},
|
|
10961
|
-
"startedAt": {
|
|
10962
|
-
"anyOf": [
|
|
10963
|
-
{
|
|
10964
|
-
"type": "string"
|
|
10965
|
-
},
|
|
10966
|
-
{
|
|
10967
|
-
"type": "null"
|
|
10968
|
-
}
|
|
10969
|
-
],
|
|
10970
|
-
"description": "ISO-8601 timestamp the experiment last transitioned to `running`, or `null`."
|
|
10971
|
-
},
|
|
10972
|
-
"stoppedAt": {
|
|
10973
|
-
"anyOf": [
|
|
10974
|
-
{
|
|
10975
|
-
"type": "string"
|
|
10976
|
-
},
|
|
10977
|
-
{
|
|
10978
|
-
"type": "null"
|
|
10979
|
-
}
|
|
10980
|
-
]
|
|
10981
|
-
},
|
|
10982
|
-
"updatedAt": {
|
|
10983
|
-
"type": "string"
|
|
10984
|
-
}
|
|
10985
|
-
},
|
|
10986
|
-
"required": [
|
|
10987
|
-
"id",
|
|
10988
|
-
"name",
|
|
10989
|
-
"description",
|
|
10990
|
-
"hypothesis",
|
|
10991
|
-
"tag",
|
|
10992
|
-
"ownerEmail",
|
|
10993
|
-
"audience",
|
|
10994
|
-
"bucketBy",
|
|
10995
|
-
"folder",
|
|
10996
|
-
"status",
|
|
10997
|
-
"universe",
|
|
10998
|
-
"targetingGate",
|
|
10999
|
-
"allocationPct",
|
|
11000
|
-
"salt",
|
|
11001
|
-
"params",
|
|
11002
|
-
"groups",
|
|
11003
|
-
"significanceThreshold",
|
|
11004
|
-
"minRuntimeDays",
|
|
11005
|
-
"minSampleSize",
|
|
11006
|
-
"sequentialTesting",
|
|
11007
|
-
"startedAt",
|
|
11008
|
-
"updatedAt"
|
|
11009
|
-
],
|
|
11010
|
-
"additionalProperties": false
|
|
11011
|
-
}
|
|
11012
|
-
},
|
|
11013
|
-
"next_cursor": {
|
|
11014
|
-
"anyOf": [
|
|
11015
|
-
{
|
|
11016
|
-
"type": "string"
|
|
11017
|
-
},
|
|
11018
|
-
{
|
|
11019
|
-
"type": "null"
|
|
11020
|
-
}
|
|
11021
|
-
]
|
|
11022
|
-
}
|
|
11023
|
-
},
|
|
11024
|
-
"required": [
|
|
11025
|
-
"data",
|
|
11026
|
-
"next_cursor"
|
|
11027
|
-
],
|
|
11028
|
-
"additionalProperties": false
|
|
11029
|
-
},
|
|
11030
|
-
"MetricName": {
|
|
11031
|
-
"type": "string",
|
|
11032
|
-
"maxLength": 128,
|
|
11033
|
-
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
11034
|
-
"description": "Stable metric key. Single segment or `folder.name`; lowercase letters, digits, `_`/`-`; max 128 chars."
|
|
11035
|
-
},
|
|
11036
|
-
"ExperimentInlineMetric": {
|
|
11037
|
-
"type": "object",
|
|
11038
|
-
"properties": {
|
|
11039
|
-
"name": {
|
|
11040
|
-
"$ref": "#/components/schemas/MetricName"
|
|
11041
|
-
},
|
|
11042
|
-
"query": {
|
|
11043
|
-
"type": "string",
|
|
11044
|
-
"minLength": 1,
|
|
11045
|
-
"maxLength": 4096,
|
|
11046
|
-
"description": "Metric DSL string. Provide this OR `event`."
|
|
11047
|
-
},
|
|
11048
|
-
"event": {
|
|
11049
|
-
"type": "string",
|
|
11050
|
-
"minLength": 1,
|
|
11051
|
-
"maxLength": 256,
|
|
11052
|
-
"description": "Event name to build the metric from server-side. Auto-created if missing."
|
|
11053
|
-
},
|
|
11054
|
-
"aggregation": {
|
|
11488
|
+
"id": {
|
|
11055
11489
|
"type": "string",
|
|
11056
|
-
"
|
|
11057
|
-
"count_users",
|
|
11058
|
-
"count_events",
|
|
11059
|
-
"retention_7d",
|
|
11060
|
-
"retention_30d",
|
|
11061
|
-
"sum",
|
|
11062
|
-
"avg"
|
|
11063
|
-
],
|
|
11064
|
-
"description": "Reducer for the `event` form. Defaults to `count_users`."
|
|
11490
|
+
"description": "Stable opaque experiment id (`exp_…`)."
|
|
11065
11491
|
},
|
|
11066
|
-
"value": {
|
|
11067
|
-
"type": "string",
|
|
11068
|
-
"minLength": 1,
|
|
11069
|
-
"maxLength": 256,
|
|
11070
|
-
"description": "Numeric event property for `sum`/`avg` (with `event`)."
|
|
11071
|
-
}
|
|
11072
|
-
},
|
|
11073
|
-
"additionalProperties": false,
|
|
11074
|
-
"description": "Inline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one."
|
|
11075
|
-
},
|
|
11076
|
-
"CreateExperimentRequest": {
|
|
11077
|
-
"type": "object",
|
|
11078
|
-
"properties": {
|
|
11079
11492
|
"name": {
|
|
11080
11493
|
"type": "string",
|
|
11081
11494
|
"maxLength": 128,
|
|
@@ -11083,12 +11496,9 @@
|
|
|
11083
11496
|
"description": "Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create."
|
|
11084
11497
|
},
|
|
11085
11498
|
"description": {
|
|
11086
|
-
"default": null,
|
|
11087
|
-
"description": "Free-form description. Max 2000 chars, markdown rendered in the dashboard.",
|
|
11088
11499
|
"anyOf": [
|
|
11089
11500
|
{
|
|
11090
|
-
"type": "string"
|
|
11091
|
-
"maxLength": 2000
|
|
11501
|
+
"type": "string"
|
|
11092
11502
|
},
|
|
11093
11503
|
{
|
|
11094
11504
|
"type": "null"
|
|
@@ -11096,12 +11506,9 @@
|
|
|
11096
11506
|
]
|
|
11097
11507
|
},
|
|
11098
11508
|
"hypothesis": {
|
|
11099
|
-
"default": null,
|
|
11100
|
-
"description": "Hypothesis statement shown in the editor. Display-only.",
|
|
11101
11509
|
"anyOf": [
|
|
11102
11510
|
{
|
|
11103
|
-
"type": "string"
|
|
11104
|
-
"maxLength": 4000
|
|
11511
|
+
"type": "string"
|
|
11105
11512
|
},
|
|
11106
11513
|
{
|
|
11107
11514
|
"type": "null"
|
|
@@ -11109,25 +11516,19 @@
|
|
|
11109
11516
|
]
|
|
11110
11517
|
},
|
|
11111
11518
|
"tag": {
|
|
11112
|
-
"default": null,
|
|
11113
|
-
"description": "Short tag chip rendered next to the name. Display-only.",
|
|
11114
11519
|
"anyOf": [
|
|
11115
11520
|
{
|
|
11116
|
-
"type": "string"
|
|
11117
|
-
"maxLength": 64
|
|
11521
|
+
"type": "string"
|
|
11118
11522
|
},
|
|
11119
11523
|
{
|
|
11120
11524
|
"type": "null"
|
|
11121
11525
|
}
|
|
11122
11526
|
]
|
|
11123
11527
|
},
|
|
11124
|
-
"
|
|
11125
|
-
"default": null,
|
|
11126
|
-
"description": "Owner email. Display-only.",
|
|
11528
|
+
"ownerEmail": {
|
|
11127
11529
|
"anyOf": [
|
|
11128
11530
|
{
|
|
11129
|
-
"type": "string"
|
|
11130
|
-
"maxLength": 254
|
|
11531
|
+
"type": "string"
|
|
11131
11532
|
},
|
|
11132
11533
|
{
|
|
11133
11534
|
"type": "null"
|
|
@@ -11135,20 +11536,16 @@
|
|
|
11135
11536
|
]
|
|
11136
11537
|
},
|
|
11137
11538
|
"audience": {
|
|
11138
|
-
"default": null,
|
|
11139
|
-
"description": "Audience label shown in the editor. Display-only.",
|
|
11140
11539
|
"anyOf": [
|
|
11141
11540
|
{
|
|
11142
|
-
"type": "string"
|
|
11143
|
-
"maxLength": 256
|
|
11541
|
+
"type": "string"
|
|
11144
11542
|
},
|
|
11145
11543
|
{
|
|
11146
11544
|
"type": "null"
|
|
11147
11545
|
}
|
|
11148
11546
|
]
|
|
11149
11547
|
},
|
|
11150
|
-
"
|
|
11151
|
-
"default": null,
|
|
11548
|
+
"bucketBy": {
|
|
11152
11549
|
"anyOf": [
|
|
11153
11550
|
{
|
|
11154
11551
|
"type": "string",
|
|
@@ -11163,16 +11560,29 @@
|
|
|
11163
11560
|
]
|
|
11164
11561
|
},
|
|
11165
11562
|
"folder": {
|
|
11166
|
-
"
|
|
11563
|
+
"anyOf": [
|
|
11564
|
+
{
|
|
11565
|
+
"type": "string"
|
|
11566
|
+
},
|
|
11567
|
+
{
|
|
11568
|
+
"type": "null"
|
|
11569
|
+
}
|
|
11570
|
+
]
|
|
11571
|
+
},
|
|
11572
|
+
"status": {
|
|
11573
|
+
"type": "string",
|
|
11574
|
+
"enum": [
|
|
11575
|
+
"draft",
|
|
11576
|
+
"running",
|
|
11577
|
+
"stopped",
|
|
11578
|
+
"archived"
|
|
11579
|
+
]
|
|
11167
11580
|
},
|
|
11168
11581
|
"universe": {
|
|
11169
11582
|
"type": "string",
|
|
11170
|
-
"
|
|
11171
|
-
"description": "Name of an existing universe in the project. Returns `422` if the universe doesn't exist."
|
|
11583
|
+
"description": "Universe name this experiment draws from."
|
|
11172
11584
|
},
|
|
11173
|
-
"
|
|
11174
|
-
"default": null,
|
|
11175
|
-
"description": "Optional gate name. Only callers that pass the gate are enrolled in the experiment.",
|
|
11585
|
+
"targetingGate": {
|
|
11176
11586
|
"anyOf": [
|
|
11177
11587
|
{
|
|
11178
11588
|
"type": "string"
|
|
@@ -11182,27 +11592,64 @@
|
|
|
11182
11592
|
}
|
|
11183
11593
|
]
|
|
11184
11594
|
},
|
|
11185
|
-
"
|
|
11186
|
-
"
|
|
11187
|
-
|
|
11188
|
-
|
|
11189
|
-
|
|
11190
|
-
|
|
11191
|
-
|
|
11192
|
-
|
|
11193
|
-
|
|
11194
|
-
"
|
|
11195
|
-
|
|
11196
|
-
|
|
11595
|
+
"holdoutGate": {
|
|
11596
|
+
"anyOf": [
|
|
11597
|
+
{
|
|
11598
|
+
"type": "string"
|
|
11599
|
+
},
|
|
11600
|
+
{
|
|
11601
|
+
"type": "null"
|
|
11602
|
+
}
|
|
11603
|
+
],
|
|
11604
|
+
"description": "Per-experiment holdout gate name (a `holdout`-type flag), or `null`."
|
|
11605
|
+
},
|
|
11606
|
+
"allocationPct": {
|
|
11607
|
+
"type": "integer",
|
|
11608
|
+
"minimum": -9007199254740991,
|
|
11609
|
+
"maximum": 9007199254740991,
|
|
11610
|
+
"description": "Allocation in basis points (0–10000)."
|
|
11611
|
+
},
|
|
11612
|
+
"reservedHeadroom": {
|
|
11613
|
+
"type": "integer",
|
|
11614
|
+
"minimum": 0,
|
|
11615
|
+
"maximum": 10000,
|
|
11616
|
+
"description": "Basis points of the split reserved for appended variants (group weights sum to 10000 − this)."
|
|
11617
|
+
},
|
|
11618
|
+
"hashVersion": {
|
|
11619
|
+
"type": "integer",
|
|
11620
|
+
"minimum": 1,
|
|
11621
|
+
"description": "Bucketing hash algorithm version for the experiment's pool slice (§B4). Defaults to 1."
|
|
11622
|
+
},
|
|
11623
|
+
"poolOffsetBp": {
|
|
11624
|
+
"anyOf": [
|
|
11625
|
+
{
|
|
11626
|
+
"type": "integer",
|
|
11627
|
+
"minimum": 0,
|
|
11628
|
+
"maximum": 10000
|
|
11629
|
+
},
|
|
11630
|
+
{
|
|
11631
|
+
"type": "null"
|
|
11632
|
+
}
|
|
11633
|
+
],
|
|
11634
|
+
"description": "Basis-point offset of the experiment's contiguous slice in the universe pool, or `null` before a slice is allocated."
|
|
11635
|
+
},
|
|
11636
|
+
"poolSizeBp": {
|
|
11637
|
+
"anyOf": [
|
|
11638
|
+
{
|
|
11639
|
+
"type": "integer",
|
|
11640
|
+
"minimum": 0,
|
|
11641
|
+
"maximum": 10000
|
|
11642
|
+
},
|
|
11643
|
+
{
|
|
11644
|
+
"type": "null"
|
|
11645
|
+
}
|
|
11646
|
+
],
|
|
11647
|
+
"description": "Basis-point width of the experiment's pool slice (equal to its allocation), or `null` before a slice is allocated."
|
|
11197
11648
|
},
|
|
11198
11649
|
"salt": {
|
|
11199
|
-
"
|
|
11200
|
-
"type": "string",
|
|
11201
|
-
"minLength": 1,
|
|
11202
|
-
"maxLength": 64
|
|
11650
|
+
"type": "string"
|
|
11203
11651
|
},
|
|
11204
11652
|
"params": {
|
|
11205
|
-
"default": {},
|
|
11206
11653
|
"type": "object",
|
|
11207
11654
|
"additionalProperties": {
|
|
11208
11655
|
"type": "string",
|
|
@@ -11211,11 +11658,9 @@
|
|
|
11211
11658
|
"bool",
|
|
11212
11659
|
"number"
|
|
11213
11660
|
]
|
|
11214
|
-
}
|
|
11215
|
-
"description": "Map of param-name → scalar type. Defines the shape of `groups[].params`. Example: `{ headline: 'string', show_cta: 'bool' }`."
|
|
11661
|
+
}
|
|
11216
11662
|
},
|
|
11217
11663
|
"groups": {
|
|
11218
|
-
"minItems": 2,
|
|
11219
11664
|
"type": "array",
|
|
11220
11665
|
"items": {
|
|
11221
11666
|
"type": "object",
|
|
@@ -11245,84 +11690,344 @@
|
|
|
11245
11690
|
],
|
|
11246
11691
|
"additionalProperties": false,
|
|
11247
11692
|
"description": "One variant in the experiment. Weights across all groups must sum to 10000."
|
|
11248
|
-
}
|
|
11249
|
-
"description": "Two or more variants. Weights must sum to exactly 10000 (100%). Immutable while running."
|
|
11693
|
+
}
|
|
11250
11694
|
},
|
|
11251
|
-
"
|
|
11252
|
-
"
|
|
11253
|
-
"description": "p-value cutoff used by the analysis pass. Defaults to `0.05`. Values other than 0.05 require Pro plan or higher.",
|
|
11254
|
-
"type": "number",
|
|
11255
|
-
"minimum": 0.0001,
|
|
11256
|
-
"maximum": 0.5
|
|
11695
|
+
"significanceThreshold": {
|
|
11696
|
+
"type": "number"
|
|
11257
11697
|
},
|
|
11258
|
-
"
|
|
11259
|
-
"default": 0,
|
|
11260
|
-
"description": "Minimum days the experiment must run before results are considered conclusive.",
|
|
11698
|
+
"minRuntimeDays": {
|
|
11261
11699
|
"type": "integer",
|
|
11262
|
-
"minimum":
|
|
11263
|
-
"maximum":
|
|
11700
|
+
"minimum": -9007199254740991,
|
|
11701
|
+
"maximum": 9007199254740991
|
|
11264
11702
|
},
|
|
11265
|
-
"
|
|
11266
|
-
"default": 100,
|
|
11267
|
-
"description": "Minimum exposures per group before results are considered conclusive.",
|
|
11703
|
+
"minSampleSize": {
|
|
11268
11704
|
"type": "integer",
|
|
11269
|
-
"minimum":
|
|
11705
|
+
"minimum": -9007199254740991,
|
|
11270
11706
|
"maximum": 9007199254740991
|
|
11271
11707
|
},
|
|
11272
|
-
"
|
|
11273
|
-
"default": false,
|
|
11274
|
-
"description": "Enable sequential testing (always-valid p-values). Requires Premium plan or higher.",
|
|
11708
|
+
"sequentialTesting": {
|
|
11275
11709
|
"type": "boolean"
|
|
11276
11710
|
},
|
|
11277
|
-
"
|
|
11278
|
-
"
|
|
11279
|
-
|
|
11711
|
+
"startedAt": {
|
|
11712
|
+
"anyOf": [
|
|
11713
|
+
{
|
|
11714
|
+
"type": "string"
|
|
11715
|
+
},
|
|
11716
|
+
{
|
|
11717
|
+
"type": "null"
|
|
11718
|
+
}
|
|
11719
|
+
],
|
|
11720
|
+
"description": "ISO-8601 timestamp the experiment last transitioned to `running`, or `null`."
|
|
11280
11721
|
},
|
|
11281
|
-
"
|
|
11282
|
-
"
|
|
11283
|
-
|
|
11284
|
-
|
|
11722
|
+
"stoppedAt": {
|
|
11723
|
+
"anyOf": [
|
|
11724
|
+
{
|
|
11725
|
+
"type": "string"
|
|
11726
|
+
},
|
|
11727
|
+
{
|
|
11728
|
+
"type": "null"
|
|
11729
|
+
}
|
|
11730
|
+
]
|
|
11731
|
+
},
|
|
11732
|
+
"updatedAt": {
|
|
11733
|
+
"type": "string"
|
|
11734
|
+
},
|
|
11735
|
+
"version": {
|
|
11736
|
+
"anyOf": [
|
|
11737
|
+
{
|
|
11738
|
+
"type": "integer"
|
|
11739
|
+
},
|
|
11740
|
+
{
|
|
11741
|
+
"type": "null"
|
|
11742
|
+
}
|
|
11743
|
+
],
|
|
11744
|
+
"description": "Save counter (number of published edits), or `null` on pre-versioning rows."
|
|
11745
|
+
},
|
|
11746
|
+
"creatorEmail": {
|
|
11747
|
+
"anyOf": [
|
|
11748
|
+
{
|
|
11749
|
+
"type": "string"
|
|
11750
|
+
},
|
|
11751
|
+
{
|
|
11752
|
+
"type": "null"
|
|
11753
|
+
}
|
|
11754
|
+
],
|
|
11755
|
+
"description": "Resolved creator email (`created_by` → users). Enriched field: present on list rows, omitted from the by-id detail."
|
|
11756
|
+
},
|
|
11757
|
+
"updaterEmail": {
|
|
11758
|
+
"anyOf": [
|
|
11759
|
+
{
|
|
11760
|
+
"type": "string"
|
|
11761
|
+
},
|
|
11762
|
+
{
|
|
11763
|
+
"type": "null"
|
|
11764
|
+
}
|
|
11765
|
+
],
|
|
11766
|
+
"description": "Resolved last-editor email (`updated_by` → users). Enriched field: present on list rows, omitted from the by-id detail."
|
|
11767
|
+
},
|
|
11768
|
+
"verdict": {
|
|
11769
|
+
"type": "string",
|
|
11770
|
+
"enum": [
|
|
11771
|
+
"ship",
|
|
11772
|
+
"hold",
|
|
11773
|
+
"wait",
|
|
11774
|
+
"invalid",
|
|
11775
|
+
"draft"
|
|
11776
|
+
],
|
|
11777
|
+
"description": "Answer-first decision from the goal metric + guardrails + SRM vs. the significance threshold and min runtime: `ship`, `hold`, `wait`, `invalid`, `draft`. Enriched field: list rows only."
|
|
11778
|
+
},
|
|
11779
|
+
"verdictTitle": {
|
|
11780
|
+
"type": "string",
|
|
11781
|
+
"description": "Expanded verdict headline the results hero renders. Enriched field: list rows only."
|
|
11782
|
+
},
|
|
11783
|
+
"verdictWhy": {
|
|
11784
|
+
"type": "string",
|
|
11785
|
+
"description": "Verdict rationale the results hero renders. Enriched field: list rows only."
|
|
11786
|
+
},
|
|
11787
|
+
"goalMetric": {
|
|
11788
|
+
"anyOf": [
|
|
11789
|
+
{
|
|
11790
|
+
"type": "object",
|
|
11791
|
+
"properties": {
|
|
11792
|
+
"id": {
|
|
11793
|
+
"type": "string"
|
|
11794
|
+
},
|
|
11795
|
+
"name": {
|
|
11796
|
+
"type": "string"
|
|
11797
|
+
}
|
|
11798
|
+
},
|
|
11799
|
+
"required": [
|
|
11800
|
+
"id",
|
|
11801
|
+
"name"
|
|
11802
|
+
],
|
|
11803
|
+
"additionalProperties": false
|
|
11804
|
+
},
|
|
11805
|
+
{
|
|
11806
|
+
"type": "null"
|
|
11807
|
+
}
|
|
11808
|
+
],
|
|
11809
|
+
"description": "The experiment's goal metric `{ id, name }`, or `null` when none is set. Enriched field: list rows only."
|
|
11810
|
+
},
|
|
11811
|
+
"guardrails": {
|
|
11285
11812
|
"type": "array",
|
|
11286
11813
|
"items": {
|
|
11287
|
-
"
|
|
11288
|
-
|
|
11814
|
+
"type": "object",
|
|
11815
|
+
"properties": {
|
|
11816
|
+
"id": {
|
|
11817
|
+
"type": "string"
|
|
11818
|
+
},
|
|
11819
|
+
"name": {
|
|
11820
|
+
"type": "string"
|
|
11821
|
+
},
|
|
11822
|
+
"eventName": {
|
|
11823
|
+
"anyOf": [
|
|
11824
|
+
{
|
|
11825
|
+
"type": "string"
|
|
11826
|
+
},
|
|
11827
|
+
{
|
|
11828
|
+
"type": "null"
|
|
11829
|
+
}
|
|
11830
|
+
]
|
|
11831
|
+
}
|
|
11832
|
+
},
|
|
11833
|
+
"required": [
|
|
11834
|
+
"id",
|
|
11835
|
+
"name"
|
|
11836
|
+
],
|
|
11837
|
+
"additionalProperties": false
|
|
11838
|
+
},
|
|
11839
|
+
"description": "Guardrail metrics `{ id, name, eventName? }`. Enriched field: list rows only."
|
|
11840
|
+
},
|
|
11841
|
+
"guardrailCount": {
|
|
11842
|
+
"type": "integer",
|
|
11843
|
+
"minimum": 0,
|
|
11844
|
+
"description": "Number of guardrail metrics. Enriched field: list rows only."
|
|
11845
|
+
},
|
|
11846
|
+
"primaryLiftPct": {
|
|
11847
|
+
"anyOf": [
|
|
11848
|
+
{
|
|
11849
|
+
"type": "number"
|
|
11850
|
+
},
|
|
11851
|
+
{
|
|
11852
|
+
"type": "null"
|
|
11853
|
+
}
|
|
11854
|
+
],
|
|
11855
|
+
"description": "Goal-metric lift of the leading variant vs. control, in percent, or `null` when not yet computed. Enriched field: list rows only."
|
|
11856
|
+
},
|
|
11857
|
+
"significancePct": {
|
|
11858
|
+
"anyOf": [
|
|
11859
|
+
{
|
|
11860
|
+
"type": "number"
|
|
11861
|
+
},
|
|
11862
|
+
{
|
|
11863
|
+
"type": "null"
|
|
11864
|
+
}
|
|
11865
|
+
],
|
|
11866
|
+
"description": "Statistical significance (1 − p) as a percent, or `null` when not yet computed. Enriched field: list rows only."
|
|
11867
|
+
},
|
|
11868
|
+
"sampleSize": {
|
|
11869
|
+
"anyOf": [
|
|
11870
|
+
{
|
|
11871
|
+
"type": "integer"
|
|
11872
|
+
},
|
|
11873
|
+
{
|
|
11874
|
+
"type": "null"
|
|
11875
|
+
}
|
|
11876
|
+
],
|
|
11877
|
+
"description": "Total distinct units analysed, or `null` when not yet computed. Enriched field: list rows only."
|
|
11878
|
+
},
|
|
11879
|
+
"exposure": {
|
|
11880
|
+
"type": "array",
|
|
11881
|
+
"items": {
|
|
11882
|
+
"type": "object",
|
|
11883
|
+
"properties": {
|
|
11884
|
+
"ds": {
|
|
11885
|
+
"type": "string"
|
|
11886
|
+
},
|
|
11887
|
+
"value": {
|
|
11888
|
+
"type": "number"
|
|
11889
|
+
}
|
|
11890
|
+
},
|
|
11891
|
+
"required": [
|
|
11892
|
+
"ds",
|
|
11893
|
+
"value"
|
|
11894
|
+
],
|
|
11895
|
+
"additionalProperties": false
|
|
11896
|
+
},
|
|
11897
|
+
"description": "Cumulative unique-users-enrolled series for the exposure sparkline. Enriched field: list rows only."
|
|
11898
|
+
},
|
|
11899
|
+
"exposureTotal": {
|
|
11900
|
+
"anyOf": [
|
|
11901
|
+
{
|
|
11902
|
+
"type": "integer"
|
|
11903
|
+
},
|
|
11904
|
+
{
|
|
11905
|
+
"type": "null"
|
|
11906
|
+
}
|
|
11907
|
+
],
|
|
11908
|
+
"description": "Total distinct units ever exposed (sparkline headline), or `null`. Enriched field: list rows only."
|
|
11289
11909
|
}
|
|
11290
11910
|
},
|
|
11291
11911
|
"required": [
|
|
11912
|
+
"id",
|
|
11292
11913
|
"name",
|
|
11914
|
+
"description",
|
|
11915
|
+
"hypothesis",
|
|
11916
|
+
"tag",
|
|
11917
|
+
"ownerEmail",
|
|
11918
|
+
"audience",
|
|
11919
|
+
"bucketBy",
|
|
11920
|
+
"folder",
|
|
11921
|
+
"status",
|
|
11293
11922
|
"universe",
|
|
11294
|
-
"
|
|
11923
|
+
"targetingGate",
|
|
11924
|
+
"holdoutGate",
|
|
11925
|
+
"allocationPct",
|
|
11926
|
+
"reservedHeadroom",
|
|
11927
|
+
"hashVersion",
|
|
11928
|
+
"poolOffsetBp",
|
|
11929
|
+
"poolSizeBp",
|
|
11930
|
+
"salt",
|
|
11931
|
+
"params",
|
|
11932
|
+
"groups",
|
|
11933
|
+
"significanceThreshold",
|
|
11934
|
+
"minRuntimeDays",
|
|
11935
|
+
"minSampleSize",
|
|
11936
|
+
"sequentialTesting",
|
|
11937
|
+
"startedAt",
|
|
11938
|
+
"stoppedAt",
|
|
11939
|
+
"updatedAt",
|
|
11940
|
+
"version"
|
|
11295
11941
|
],
|
|
11296
|
-
"additionalProperties": false
|
|
11297
|
-
"description": "Body for `POST /api/admin/experiments`. `name`, `universe`, and `groups` (≥2, weights sum to 10000) required."
|
|
11942
|
+
"additionalProperties": false
|
|
11298
11943
|
},
|
|
11299
|
-
"
|
|
11944
|
+
"ListExperimentsResponse": {
|
|
11300
11945
|
"type": "object",
|
|
11301
11946
|
"properties": {
|
|
11302
|
-
"
|
|
11303
|
-
"type": "
|
|
11304
|
-
"
|
|
11947
|
+
"data": {
|
|
11948
|
+
"type": "array",
|
|
11949
|
+
"items": {
|
|
11950
|
+
"$ref": "#/components/schemas/ExperimentApiRow"
|
|
11951
|
+
}
|
|
11305
11952
|
},
|
|
11306
|
-
"
|
|
11307
|
-
"
|
|
11308
|
-
|
|
11309
|
-
|
|
11310
|
-
|
|
11953
|
+
"next_cursor": {
|
|
11954
|
+
"anyOf": [
|
|
11955
|
+
{
|
|
11956
|
+
"type": "string"
|
|
11957
|
+
},
|
|
11958
|
+
{
|
|
11959
|
+
"type": "null"
|
|
11960
|
+
}
|
|
11961
|
+
]
|
|
11311
11962
|
}
|
|
11312
11963
|
},
|
|
11313
11964
|
"required": [
|
|
11314
|
-
"
|
|
11315
|
-
"
|
|
11965
|
+
"data",
|
|
11966
|
+
"next_cursor"
|
|
11316
11967
|
],
|
|
11317
11968
|
"additionalProperties": false
|
|
11318
11969
|
},
|
|
11319
|
-
"
|
|
11970
|
+
"MetricName": {
|
|
11971
|
+
"type": "string",
|
|
11972
|
+
"maxLength": 128,
|
|
11973
|
+
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
11974
|
+
"description": "Stable metric key. Single segment or `folder.name`; lowercase letters, digits, `_`/`-`; max 128 chars."
|
|
11975
|
+
},
|
|
11976
|
+
"ExperimentInlineMetric": {
|
|
11977
|
+
"type": "object",
|
|
11978
|
+
"properties": {
|
|
11979
|
+
"name": {
|
|
11980
|
+
"$ref": "#/components/schemas/MetricName"
|
|
11981
|
+
},
|
|
11982
|
+
"query": {
|
|
11983
|
+
"type": "string",
|
|
11984
|
+
"minLength": 1,
|
|
11985
|
+
"maxLength": 4096,
|
|
11986
|
+
"description": "Metric DSL string. Provide this OR `event`."
|
|
11987
|
+
},
|
|
11988
|
+
"event": {
|
|
11989
|
+
"type": "string",
|
|
11990
|
+
"minLength": 1,
|
|
11991
|
+
"maxLength": 256,
|
|
11992
|
+
"description": "Event name to build the metric from server-side. Auto-created if missing."
|
|
11993
|
+
},
|
|
11994
|
+
"aggregation": {
|
|
11995
|
+
"type": "string",
|
|
11996
|
+
"enum": [
|
|
11997
|
+
"count_users",
|
|
11998
|
+
"count_events",
|
|
11999
|
+
"retention_7d",
|
|
12000
|
+
"retention_30d",
|
|
12001
|
+
"sum",
|
|
12002
|
+
"avg"
|
|
12003
|
+
],
|
|
12004
|
+
"description": "Reducer for the `event` form. Defaults to `count_users`."
|
|
12005
|
+
},
|
|
12006
|
+
"value": {
|
|
12007
|
+
"type": "string",
|
|
12008
|
+
"minLength": 1,
|
|
12009
|
+
"maxLength": 256,
|
|
12010
|
+
"description": "Numeric event property for `sum`/`avg` (with `event`)."
|
|
12011
|
+
},
|
|
12012
|
+
"min_effect_of_interest": {
|
|
12013
|
+
"description": "Per-experiment override of the metric's default minimum effect of interest (relative, 0–1) — the smallest change worth acting on for this experiment's decision. `null`/omitted inherits the metric default. For a guardrail, the non-inferiority margin.",
|
|
12014
|
+
"default": null,
|
|
12015
|
+
"anyOf": [
|
|
12016
|
+
{
|
|
12017
|
+
"type": "number"
|
|
12018
|
+
},
|
|
12019
|
+
{
|
|
12020
|
+
"type": "null"
|
|
12021
|
+
}
|
|
12022
|
+
]
|
|
12023
|
+
}
|
|
12024
|
+
},
|
|
12025
|
+
"additionalProperties": false,
|
|
12026
|
+
"description": "Inline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one."
|
|
12027
|
+
},
|
|
12028
|
+
"CreateExperimentRequest": {
|
|
11320
12029
|
"type": "object",
|
|
11321
12030
|
"properties": {
|
|
11322
|
-
"id": {
|
|
11323
|
-
"type": "string",
|
|
11324
|
-
"description": "Stable opaque experiment id (`exp_…`)."
|
|
11325
|
-
},
|
|
11326
12031
|
"name": {
|
|
11327
12032
|
"type": "string",
|
|
11328
12033
|
"maxLength": 128,
|
|
@@ -11330,9 +12035,12 @@
|
|
|
11330
12035
|
"description": "Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create."
|
|
11331
12036
|
},
|
|
11332
12037
|
"description": {
|
|
12038
|
+
"default": null,
|
|
12039
|
+
"description": "Free-form description. Max 2000 chars, markdown rendered in the dashboard.",
|
|
11333
12040
|
"anyOf": [
|
|
11334
12041
|
{
|
|
11335
|
-
"type": "string"
|
|
12042
|
+
"type": "string",
|
|
12043
|
+
"maxLength": 2000
|
|
11336
12044
|
},
|
|
11337
12045
|
{
|
|
11338
12046
|
"type": "null"
|
|
@@ -11340,9 +12048,12 @@
|
|
|
11340
12048
|
]
|
|
11341
12049
|
},
|
|
11342
12050
|
"hypothesis": {
|
|
12051
|
+
"default": null,
|
|
12052
|
+
"description": "Hypothesis statement shown in the editor. Display-only.",
|
|
11343
12053
|
"anyOf": [
|
|
11344
12054
|
{
|
|
11345
|
-
"type": "string"
|
|
12055
|
+
"type": "string",
|
|
12056
|
+
"maxLength": 4000
|
|
11346
12057
|
},
|
|
11347
12058
|
{
|
|
11348
12059
|
"type": "null"
|
|
@@ -11350,19 +12061,25 @@
|
|
|
11350
12061
|
]
|
|
11351
12062
|
},
|
|
11352
12063
|
"tag": {
|
|
12064
|
+
"default": null,
|
|
12065
|
+
"description": "Short tag chip rendered next to the name. Display-only.",
|
|
11353
12066
|
"anyOf": [
|
|
11354
12067
|
{
|
|
11355
|
-
"type": "string"
|
|
12068
|
+
"type": "string",
|
|
12069
|
+
"maxLength": 64
|
|
11356
12070
|
},
|
|
11357
12071
|
{
|
|
11358
12072
|
"type": "null"
|
|
11359
12073
|
}
|
|
11360
12074
|
]
|
|
11361
12075
|
},
|
|
11362
|
-
"
|
|
12076
|
+
"owner_email": {
|
|
12077
|
+
"default": null,
|
|
12078
|
+
"description": "Owner email. Display-only.",
|
|
11363
12079
|
"anyOf": [
|
|
11364
12080
|
{
|
|
11365
|
-
"type": "string"
|
|
12081
|
+
"type": "string",
|
|
12082
|
+
"maxLength": 254
|
|
11366
12083
|
},
|
|
11367
12084
|
{
|
|
11368
12085
|
"type": "null"
|
|
@@ -11370,16 +12087,20 @@
|
|
|
11370
12087
|
]
|
|
11371
12088
|
},
|
|
11372
12089
|
"audience": {
|
|
12090
|
+
"default": null,
|
|
12091
|
+
"description": "Audience label shown in the editor. Display-only.",
|
|
11373
12092
|
"anyOf": [
|
|
11374
12093
|
{
|
|
11375
|
-
"type": "string"
|
|
12094
|
+
"type": "string",
|
|
12095
|
+
"maxLength": 256
|
|
11376
12096
|
},
|
|
11377
12097
|
{
|
|
11378
12098
|
"type": "null"
|
|
11379
12099
|
}
|
|
11380
12100
|
]
|
|
11381
12101
|
},
|
|
11382
|
-
"
|
|
12102
|
+
"bucket_by": {
|
|
12103
|
+
"default": null,
|
|
11383
12104
|
"anyOf": [
|
|
11384
12105
|
{
|
|
11385
12106
|
"type": "string",
|
|
@@ -11394,6 +12115,16 @@
|
|
|
11394
12115
|
]
|
|
11395
12116
|
},
|
|
11396
12117
|
"folder": {
|
|
12118
|
+
"$ref": "#/components/schemas/Folder"
|
|
12119
|
+
},
|
|
12120
|
+
"universe": {
|
|
12121
|
+
"type": "string",
|
|
12122
|
+
"minLength": 1,
|
|
12123
|
+
"description": "Name of an existing universe in the project. Returns `422` if the universe doesn't exist."
|
|
12124
|
+
},
|
|
12125
|
+
"targeting_gate": {
|
|
12126
|
+
"default": null,
|
|
12127
|
+
"description": "Optional gate name (a `targeting`-type flag). Only callers that pass the gate are enrolled in the experiment.",
|
|
11397
12128
|
"anyOf": [
|
|
11398
12129
|
{
|
|
11399
12130
|
"type": "string"
|
|
@@ -11403,20 +12134,9 @@
|
|
|
11403
12134
|
}
|
|
11404
12135
|
]
|
|
11405
12136
|
},
|
|
11406
|
-
"
|
|
11407
|
-
"
|
|
11408
|
-
"
|
|
11409
|
-
"draft",
|
|
11410
|
-
"running",
|
|
11411
|
-
"stopped",
|
|
11412
|
-
"archived"
|
|
11413
|
-
]
|
|
11414
|
-
},
|
|
11415
|
-
"universe": {
|
|
11416
|
-
"type": "string",
|
|
11417
|
-
"description": "Universe name this experiment draws from."
|
|
11418
|
-
},
|
|
11419
|
-
"targetingGate": {
|
|
12137
|
+
"holdout_gate": {
|
|
12138
|
+
"default": null,
|
|
12139
|
+
"description": "Optional per-experiment holdout gate — the name of a `holdout`-type flag (public % + whitelist). A caller the flag passes is *held out* (never assigned, sees the universe defaults). Distinct from the universe-level holdout.",
|
|
11420
12140
|
"anyOf": [
|
|
11421
12141
|
{
|
|
11422
12142
|
"type": "string"
|
|
@@ -11426,16 +12146,33 @@
|
|
|
11426
12146
|
}
|
|
11427
12147
|
]
|
|
11428
12148
|
},
|
|
11429
|
-
"
|
|
12149
|
+
"allocation_pct": {
|
|
12150
|
+
"default": 0,
|
|
12151
|
+
"description": "Share of the (gated) audience allocated to the experiment, in basis points (0–10000 = 0%–100%). `0` = unallocated. Under pooled assignment this is the size of the universe-pool slice claimed. Use `allocation_percent` (0–100) below to think in percent. Immutable while the experiment is running.",
|
|
11430
12152
|
"type": "integer",
|
|
11431
|
-
"minimum":
|
|
11432
|
-
"maximum":
|
|
11433
|
-
|
|
12153
|
+
"minimum": 0,
|
|
12154
|
+
"maximum": 10000
|
|
12155
|
+
},
|
|
12156
|
+
"allocation_percent": {
|
|
12157
|
+
"description": "Allocation as a **percentage** (0–100, fractional ok). Friendlier alias for `allocation_pct`; converted to basis points server-side (e.g. `50` = 5000 bp). If both are set, `allocation_percent` wins.",
|
|
12158
|
+
"type": "number",
|
|
12159
|
+
"minimum": 0,
|
|
12160
|
+
"maximum": 100
|
|
12161
|
+
},
|
|
12162
|
+
"reserved_headroom": {
|
|
12163
|
+
"description": "Basis points of this experiment's split kept empty (0–10000) so a new variant can be appended into it while running without reshuffling. Group weights must sum to `10000 − reserved_headroom`. Defaults to the universe's `recommended_headroom` when omitted.",
|
|
12164
|
+
"type": "integer",
|
|
12165
|
+
"minimum": 0,
|
|
12166
|
+
"maximum": 10000
|
|
11434
12167
|
},
|
|
11435
12168
|
"salt": {
|
|
11436
|
-
"
|
|
12169
|
+
"description": "Hash salt for bucketing. Auto-generated if omitted. Immutable while running.",
|
|
12170
|
+
"type": "string",
|
|
12171
|
+
"minLength": 1,
|
|
12172
|
+
"maxLength": 64
|
|
11437
12173
|
},
|
|
11438
12174
|
"params": {
|
|
12175
|
+
"default": {},
|
|
11439
12176
|
"type": "object",
|
|
11440
12177
|
"additionalProperties": {
|
|
11441
12178
|
"type": "string",
|
|
@@ -11444,9 +12181,11 @@
|
|
|
11444
12181
|
"bool",
|
|
11445
12182
|
"number"
|
|
11446
12183
|
]
|
|
11447
|
-
}
|
|
12184
|
+
},
|
|
12185
|
+
"description": "**Deprecated** — the universe now owns the config schema (`param_schema`). Retained for back-compat; new experiments should leave this empty and declare params on the universe. Map of param-name → scalar type."
|
|
11448
12186
|
},
|
|
11449
12187
|
"groups": {
|
|
12188
|
+
"minItems": 2,
|
|
11450
12189
|
"type": "array",
|
|
11451
12190
|
"items": {
|
|
11452
12191
|
"type": "object",
|
|
@@ -11461,11 +12200,11 @@
|
|
|
11461
12200
|
"type": "integer",
|
|
11462
12201
|
"minimum": 0,
|
|
11463
12202
|
"maximum": 10000,
|
|
11464
|
-
"description": "Allocation weight in basis points (0–10000).
|
|
12203
|
+
"description": "Allocation weight in basis points (0–10000). Weights across all groups must sum to `10000 − reserved_headroom` (100% minus any reserved tail)."
|
|
11465
12204
|
},
|
|
11466
12205
|
"params": {
|
|
11467
12206
|
"default": {},
|
|
11468
|
-
"description": "Per-
|
|
12207
|
+
"description": "Per-variant **override map** — a subset of the universe's `param_schema` keys. A key the variant doesn't set inherits the universe default. Unknown keys (not in the universe schema) are rejected.",
|
|
11469
12208
|
"type": "object",
|
|
11470
12209
|
"additionalProperties": {}
|
|
11471
12210
|
}
|
|
@@ -11475,73 +12214,75 @@
|
|
|
11475
12214
|
"weight"
|
|
11476
12215
|
],
|
|
11477
12216
|
"additionalProperties": false,
|
|
11478
|
-
"description": "One variant
|
|
11479
|
-
}
|
|
12217
|
+
"description": "One variant. Its `params` may only override keys declared on the universe schema."
|
|
12218
|
+
},
|
|
12219
|
+
"description": "Two or more variants. Weights must sum to `10000 − reserved_headroom`. Existing weights are immutable while running, but a new variant may be appended into the reserved tail."
|
|
11480
12220
|
},
|
|
11481
|
-
"
|
|
11482
|
-
"
|
|
12221
|
+
"significance_threshold": {
|
|
12222
|
+
"default": 0.05,
|
|
12223
|
+
"description": "p-value cutoff used by the analysis pass. Defaults to `0.05`. Values other than 0.05 require Pro plan or higher.",
|
|
12224
|
+
"type": "number",
|
|
12225
|
+
"minimum": 0.0001,
|
|
12226
|
+
"maximum": 0.5
|
|
11483
12227
|
},
|
|
11484
|
-
"
|
|
12228
|
+
"min_runtime_days": {
|
|
12229
|
+
"default": 0,
|
|
12230
|
+
"description": "Minimum days the experiment must run before results are considered conclusive.",
|
|
11485
12231
|
"type": "integer",
|
|
11486
|
-
"minimum":
|
|
11487
|
-
"maximum":
|
|
12232
|
+
"minimum": 0,
|
|
12233
|
+
"maximum": 365
|
|
11488
12234
|
},
|
|
11489
|
-
"
|
|
12235
|
+
"min_sample_size": {
|
|
12236
|
+
"default": 100,
|
|
12237
|
+
"description": "Minimum exposures per group before results are considered conclusive.",
|
|
11490
12238
|
"type": "integer",
|
|
11491
|
-
"minimum":
|
|
12239
|
+
"minimum": 1,
|
|
11492
12240
|
"maximum": 9007199254740991
|
|
11493
12241
|
},
|
|
11494
|
-
"
|
|
12242
|
+
"sequential_testing": {
|
|
12243
|
+
"default": false,
|
|
12244
|
+
"description": "Enable sequential testing (always-valid p-values). Requires Premium plan or higher.",
|
|
11495
12245
|
"type": "boolean"
|
|
11496
12246
|
},
|
|
11497
|
-
"
|
|
11498
|
-
"
|
|
11499
|
-
|
|
11500
|
-
"type": "string"
|
|
11501
|
-
},
|
|
11502
|
-
{
|
|
11503
|
-
"type": "null"
|
|
11504
|
-
}
|
|
11505
|
-
],
|
|
11506
|
-
"description": "ISO-8601 timestamp the experiment last transitioned to `running`, or `null`."
|
|
11507
|
-
},
|
|
11508
|
-
"stoppedAt": {
|
|
11509
|
-
"anyOf": [
|
|
11510
|
-
{
|
|
11511
|
-
"type": "string"
|
|
11512
|
-
},
|
|
11513
|
-
{
|
|
11514
|
-
"type": "null"
|
|
11515
|
-
}
|
|
11516
|
-
]
|
|
12247
|
+
"goal_metric": {
|
|
12248
|
+
"description": "Single goal metric defined inline — either a DSL `query` or an `event` (+`aggregation`/`value`) the server compiles. Attaching one is required before the experiment can be started. The underlying event is auto-created if missing.",
|
|
12249
|
+
"$ref": "#/components/schemas/ExperimentInlineMetric"
|
|
11517
12250
|
},
|
|
11518
|
-
"
|
|
11519
|
-
"
|
|
12251
|
+
"guardrail_metrics": {
|
|
12252
|
+
"default": [],
|
|
12253
|
+
"description": "Up to 10 guardrail metrics defined inline. Each is upserted (event + metric) and attached with role=guardrail.",
|
|
12254
|
+
"maxItems": 10,
|
|
12255
|
+
"type": "array",
|
|
12256
|
+
"items": {
|
|
12257
|
+
"$ref": "#/components/schemas/ExperimentInlineMetric"
|
|
12258
|
+
}
|
|
11520
12259
|
}
|
|
11521
12260
|
},
|
|
11522
12261
|
"required": [
|
|
11523
|
-
"id",
|
|
11524
12262
|
"name",
|
|
11525
|
-
"description",
|
|
11526
|
-
"hypothesis",
|
|
11527
|
-
"tag",
|
|
11528
|
-
"ownerEmail",
|
|
11529
|
-
"audience",
|
|
11530
|
-
"bucketBy",
|
|
11531
|
-
"folder",
|
|
11532
|
-
"status",
|
|
11533
12263
|
"universe",
|
|
11534
|
-
"
|
|
11535
|
-
|
|
11536
|
-
|
|
11537
|
-
|
|
11538
|
-
|
|
11539
|
-
|
|
11540
|
-
|
|
11541
|
-
|
|
11542
|
-
"
|
|
11543
|
-
|
|
11544
|
-
|
|
12264
|
+
"groups"
|
|
12265
|
+
],
|
|
12266
|
+
"additionalProperties": false,
|
|
12267
|
+
"description": "Body for `POST /api/admin/experiments`. `name`, `universe`, and `groups` (≥2, weights sum to 10000) required."
|
|
12268
|
+
},
|
|
12269
|
+
"CreateExperimentResponse": {
|
|
12270
|
+
"type": "object",
|
|
12271
|
+
"properties": {
|
|
12272
|
+
"id": {
|
|
12273
|
+
"type": "string",
|
|
12274
|
+
"description": "Newly assigned experiment id."
|
|
12275
|
+
},
|
|
12276
|
+
"name": {
|
|
12277
|
+
"type": "string",
|
|
12278
|
+
"maxLength": 128,
|
|
12279
|
+
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
12280
|
+
"description": "Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create."
|
|
12281
|
+
}
|
|
12282
|
+
},
|
|
12283
|
+
"required": [
|
|
12284
|
+
"id",
|
|
12285
|
+
"name"
|
|
11545
12286
|
],
|
|
11546
12287
|
"additionalProperties": false
|
|
11547
12288
|
},
|
|
@@ -11649,12 +12390,29 @@
|
|
|
11649
12390
|
}
|
|
11650
12391
|
]
|
|
11651
12392
|
},
|
|
12393
|
+
"holdout_gate": {
|
|
12394
|
+
"description": "Per-experiment holdout gate — the name of a `holdout`-type flag, or `null` to clear. A caller the flag passes is held out.",
|
|
12395
|
+
"anyOf": [
|
|
12396
|
+
{
|
|
12397
|
+
"type": "string"
|
|
12398
|
+
},
|
|
12399
|
+
{
|
|
12400
|
+
"type": "null"
|
|
12401
|
+
}
|
|
12402
|
+
]
|
|
12403
|
+
},
|
|
11652
12404
|
"allocation_pct": {
|
|
11653
12405
|
"description": "Basis-points allocation (0–10000). Use `allocation_percent` (0–100) for percent. Immutable while the experiment is running.",
|
|
11654
12406
|
"type": "integer",
|
|
11655
12407
|
"minimum": 0,
|
|
11656
12408
|
"maximum": 10000
|
|
11657
12409
|
},
|
|
12410
|
+
"reserved_headroom": {
|
|
12411
|
+
"description": "Basis points of the split kept empty for appended variants. Group weights must sum to `10000 − reserved_headroom`. May be shrunk (never grown into existing weights) while running when appending a variant.",
|
|
12412
|
+
"type": "integer",
|
|
12413
|
+
"minimum": 0,
|
|
12414
|
+
"maximum": 10000
|
|
12415
|
+
},
|
|
11658
12416
|
"allocation_percent": {
|
|
11659
12417
|
"description": "Allocation as a **percentage** (0–100). Friendlier alias for `allocation_pct`; converted to basis points server-side. Wins over `allocation_pct` if both are supplied. Immutable while running.",
|
|
11660
12418
|
"type": "number",
|
|
@@ -11681,10 +12439,10 @@
|
|
|
11681
12439
|
"number"
|
|
11682
12440
|
]
|
|
11683
12441
|
},
|
|
11684
|
-
"description": "
|
|
12442
|
+
"description": "**Deprecated** — the universe owns the config schema (`param_schema`). Retained for back-compat. Map of param-name → scalar type."
|
|
11685
12443
|
},
|
|
11686
12444
|
"groups": {
|
|
11687
|
-
"description": "Replacement groups. Weights must sum to 10000
|
|
12445
|
+
"description": "Replacement groups. Weights must sum to `10000 − reserved_headroom`. Existing weights/values are immutable while running; a new variant may be appended into the reserved tail.",
|
|
11688
12446
|
"minItems": 2,
|
|
11689
12447
|
"type": "array",
|
|
11690
12448
|
"items": {
|
|
@@ -11700,11 +12458,11 @@
|
|
|
11700
12458
|
"type": "integer",
|
|
11701
12459
|
"minimum": 0,
|
|
11702
12460
|
"maximum": 10000,
|
|
11703
|
-
"description": "Allocation weight in basis points (0–10000).
|
|
12461
|
+
"description": "Allocation weight in basis points (0–10000). Weights across all groups must sum to `10000 − reserved_headroom`."
|
|
11704
12462
|
},
|
|
11705
12463
|
"params": {
|
|
11706
12464
|
"default": {},
|
|
11707
|
-
"description": "Per-
|
|
12465
|
+
"description": "Per-variant **override map** — a subset of the universe's `param_schema` keys. Unknown keys are rejected; unset keys inherit the universe default.",
|
|
11708
12466
|
"type": "object",
|
|
11709
12467
|
"additionalProperties": {}
|
|
11710
12468
|
}
|
|
@@ -11714,7 +12472,7 @@
|
|
|
11714
12472
|
"weight"
|
|
11715
12473
|
],
|
|
11716
12474
|
"additionalProperties": false,
|
|
11717
|
-
"description": "One variant
|
|
12475
|
+
"description": "One variant. Its `params` may only override keys declared on the universe schema."
|
|
11718
12476
|
}
|
|
11719
12477
|
},
|
|
11720
12478
|
"significance_threshold": {
|
|
@@ -11749,7 +12507,7 @@
|
|
|
11749
12507
|
}
|
|
11750
12508
|
},
|
|
11751
12509
|
"additionalProperties": false,
|
|
11752
|
-
"description": "Body for `PATCH /api/admin/experiments/{id}`. Partial — only supplied fields change. `allocation_pct`, `
|
|
12510
|
+
"description": "Body for `PATCH /api/admin/experiments/{id}`. Partial — only supplied fields change. `allocation_pct`, `salt`, `universe` and existing group weights/values are immutable while running (stop first); a new variant may still be appended into the reserved tail."
|
|
11753
12511
|
},
|
|
11754
12512
|
"UpdateExperimentResponse": {
|
|
11755
12513
|
"type": "object",
|
|
@@ -11826,6 +12584,18 @@
|
|
|
11826
12584
|
"secondary"
|
|
11827
12585
|
],
|
|
11828
12586
|
"description": "Metric role. `goal` drives the decision, `guardrail` blocks ship if degraded, `secondary` is informational."
|
|
12587
|
+
},
|
|
12588
|
+
"min_effect_of_interest": {
|
|
12589
|
+
"description": "Per-experiment override of the metric's `default_min_effect_of_interest` (relative, 0–1) — the smallest change worth acting on for THIS experiment's decision, which depends on the intervention's cost/risk. `null`/omitted falls back to the metric default. For a `guardrail` this is the non-inferiority margin (how large a regression is tolerated); for a `goal` it is the superiority threshold.",
|
|
12590
|
+
"default": null,
|
|
12591
|
+
"anyOf": [
|
|
12592
|
+
{
|
|
12593
|
+
"type": "number"
|
|
12594
|
+
},
|
|
12595
|
+
{
|
|
12596
|
+
"type": "null"
|
|
12597
|
+
}
|
|
12598
|
+
]
|
|
11829
12599
|
}
|
|
11830
12600
|
},
|
|
11831
12601
|
"required": [
|
|
@@ -11864,11 +12634,23 @@
|
|
|
11864
12634
|
"guardrail",
|
|
11865
12635
|
"secondary"
|
|
11866
12636
|
]
|
|
12637
|
+
},
|
|
12638
|
+
"min_effect_of_interest": {
|
|
12639
|
+
"description": "The resolved per-experiment override, or `null` when this attachment inherits the metric's `default_min_effect_of_interest`.",
|
|
12640
|
+
"anyOf": [
|
|
12641
|
+
{
|
|
12642
|
+
"type": "number"
|
|
12643
|
+
},
|
|
12644
|
+
{
|
|
12645
|
+
"type": "null"
|
|
12646
|
+
}
|
|
12647
|
+
]
|
|
11867
12648
|
}
|
|
11868
12649
|
},
|
|
11869
12650
|
"required": [
|
|
11870
12651
|
"metric_id",
|
|
11871
|
-
"role"
|
|
12652
|
+
"role",
|
|
12653
|
+
"min_effect_of_interest"
|
|
11872
12654
|
],
|
|
11873
12655
|
"additionalProperties": false
|
|
11874
12656
|
}
|
|
@@ -11977,6 +12759,17 @@
|
|
|
11977
12759
|
}
|
|
11978
12760
|
],
|
|
11979
12761
|
"description": "`1` if sample-ratio mismatch detected, else `0`."
|
|
12762
|
+
},
|
|
12763
|
+
"realized_mde": {
|
|
12764
|
+
"anyOf": [
|
|
12765
|
+
{
|
|
12766
|
+
"type": "number"
|
|
12767
|
+
},
|
|
12768
|
+
{
|
|
12769
|
+
"type": "null"
|
|
12770
|
+
}
|
|
12771
|
+
],
|
|
12772
|
+
"description": "Realized minimum detectable effect (absolute, in metric units) — the smallest true effect this run could detect at the experiment's significance level and target power GIVEN the observed variance and per-arm sample sizes. A derived OUTPUT, not an input knob; compare it against the metric's minimum effect of interest to judge whether the run is adequately powered. `null` on the control row and on empty arms."
|
|
11980
12773
|
}
|
|
11981
12774
|
},
|
|
11982
12775
|
"required": [
|
|
@@ -11987,7 +12780,8 @@
|
|
|
11987
12780
|
"mean",
|
|
11988
12781
|
"delta_pct",
|
|
11989
12782
|
"p_value",
|
|
11990
|
-
"srm_detected"
|
|
12783
|
+
"srm_detected",
|
|
12784
|
+
"realized_mde"
|
|
11991
12785
|
],
|
|
11992
12786
|
"additionalProperties": false
|
|
11993
12787
|
}
|
|
@@ -13140,6 +13934,44 @@
|
|
|
13140
13934
|
],
|
|
13141
13935
|
"additionalProperties": false
|
|
13142
13936
|
},
|
|
13937
|
+
"UniverseParam": {
|
|
13938
|
+
"type": "object",
|
|
13939
|
+
"properties": {
|
|
13940
|
+
"name": {
|
|
13941
|
+
"type": "string",
|
|
13942
|
+
"minLength": 1,
|
|
13943
|
+
"maxLength": 128,
|
|
13944
|
+
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$",
|
|
13945
|
+
"description": "Param key, referenced by `groups[].params` on every experiment in the universe."
|
|
13946
|
+
},
|
|
13947
|
+
"type": {
|
|
13948
|
+
"type": "string",
|
|
13949
|
+
"enum": [
|
|
13950
|
+
"bool",
|
|
13951
|
+
"string",
|
|
13952
|
+
"int",
|
|
13953
|
+
"number"
|
|
13954
|
+
],
|
|
13955
|
+
"description": "Scalar type of the param's value."
|
|
13956
|
+
},
|
|
13957
|
+
"default": {
|
|
13958
|
+
"description": "Universe-wide default. Returned when the assigned variant doesn't override this param (resolution: variant override → universe default)."
|
|
13959
|
+
}
|
|
13960
|
+
},
|
|
13961
|
+
"required": [
|
|
13962
|
+
"name",
|
|
13963
|
+
"type",
|
|
13964
|
+
"default"
|
|
13965
|
+
],
|
|
13966
|
+
"additionalProperties": false
|
|
13967
|
+
},
|
|
13968
|
+
"UniverseParamSchema": {
|
|
13969
|
+
"type": "array",
|
|
13970
|
+
"items": {
|
|
13971
|
+
"$ref": "#/components/schemas/UniverseParam"
|
|
13972
|
+
},
|
|
13973
|
+
"description": "The universe's ordered config schema — the single source of truth for its params."
|
|
13974
|
+
},
|
|
13143
13975
|
"ListUniversesResponse": {
|
|
13144
13976
|
"type": "object",
|
|
13145
13977
|
"properties": {
|
|
@@ -13158,6 +13990,17 @@
|
|
|
13158
13990
|
"pattern": "^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$",
|
|
13159
13991
|
"description": "Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create."
|
|
13160
13992
|
},
|
|
13993
|
+
"description": {
|
|
13994
|
+
"anyOf": [
|
|
13995
|
+
{
|
|
13996
|
+
"type": "string"
|
|
13997
|
+
},
|
|
13998
|
+
{
|
|
13999
|
+
"type": "null"
|
|
14000
|
+
}
|
|
14001
|
+
],
|
|
14002
|
+
"description": "Human-readable blurb shown in the universe picker/hovercard."
|
|
14003
|
+
},
|
|
13161
14004
|
"unitType": {
|
|
13162
14005
|
"type": "string",
|
|
13163
14006
|
"description": "Unit of randomisation. Snake-case in request (`unit_type`), camelCase in response."
|
|
@@ -13178,6 +14021,23 @@
|
|
|
13178
14021
|
],
|
|
13179
14022
|
"description": "Reserved holdout bucket range, or `null` if none."
|
|
13180
14023
|
},
|
|
14024
|
+
"recommendedHeadroom": {
|
|
14025
|
+
"type": "integer",
|
|
14026
|
+
"minimum": 0,
|
|
14027
|
+
"maximum": 10000,
|
|
14028
|
+
"description": "Basis points of headroom seeded into each new experiment's reserved tail (0 = none)."
|
|
14029
|
+
},
|
|
14030
|
+
"paramSchema": {
|
|
14031
|
+
"anyOf": [
|
|
14032
|
+
{
|
|
14033
|
+
"$ref": "#/components/schemas/UniverseParamSchema"
|
|
14034
|
+
},
|
|
14035
|
+
{
|
|
14036
|
+
"type": "null"
|
|
14037
|
+
}
|
|
14038
|
+
],
|
|
14039
|
+
"description": "The universe-owned config schema, or `null` on pre-rework universes not yet seeded."
|
|
14040
|
+
},
|
|
13181
14041
|
"createdAt": {
|
|
13182
14042
|
"type": "string",
|
|
13183
14043
|
"description": "ISO-8601 timestamp of creation."
|
|
@@ -13222,6 +14082,19 @@
|
|
|
13222
14082
|
"folder": {
|
|
13223
14083
|
"$ref": "#/components/schemas/Folder"
|
|
13224
14084
|
},
|
|
14085
|
+
"description": {
|
|
14086
|
+
"default": null,
|
|
14087
|
+
"anyOf": [
|
|
14088
|
+
{
|
|
14089
|
+
"type": "string",
|
|
14090
|
+
"maxLength": 2000
|
|
14091
|
+
},
|
|
14092
|
+
{
|
|
14093
|
+
"type": "null"
|
|
14094
|
+
}
|
|
14095
|
+
],
|
|
14096
|
+
"description": "Human-readable blurb shown in the universe picker/hovercard."
|
|
14097
|
+
},
|
|
13225
14098
|
"unit_type": {
|
|
13226
14099
|
"default": "user_id",
|
|
13227
14100
|
"description": "Unit of randomisation. Typically `user_id`. Use `account_id` to keep whole accounts in the same group across an experiment.",
|
|
@@ -13245,6 +14118,25 @@
|
|
|
13245
14118
|
}
|
|
13246
14119
|
],
|
|
13247
14120
|
"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."
|
|
14121
|
+
},
|
|
14122
|
+
"recommended_headroom": {
|
|
14123
|
+
"default": 0,
|
|
14124
|
+
"type": "integer",
|
|
14125
|
+
"minimum": 0,
|
|
14126
|
+
"maximum": 10000,
|
|
14127
|
+
"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."
|
|
14128
|
+
},
|
|
14129
|
+
"param_schema": {
|
|
14130
|
+
"default": null,
|
|
14131
|
+
"anyOf": [
|
|
14132
|
+
{
|
|
14133
|
+
"$ref": "#/components/schemas/UniverseParamSchema"
|
|
14134
|
+
},
|
|
14135
|
+
{
|
|
14136
|
+
"type": "null"
|
|
14137
|
+
}
|
|
14138
|
+
],
|
|
14139
|
+
"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."
|
|
13248
14140
|
}
|
|
13249
14141
|
},
|
|
13250
14142
|
"required": [
|
|
@@ -13292,6 +14184,18 @@
|
|
|
13292
14184
|
"folder": {
|
|
13293
14185
|
"$ref": "#/components/schemas/Folder"
|
|
13294
14186
|
},
|
|
14187
|
+
"description": {
|
|
14188
|
+
"anyOf": [
|
|
14189
|
+
{
|
|
14190
|
+
"type": "string",
|
|
14191
|
+
"maxLength": 2000
|
|
14192
|
+
},
|
|
14193
|
+
{
|
|
14194
|
+
"type": "null"
|
|
14195
|
+
}
|
|
14196
|
+
],
|
|
14197
|
+
"description": "Human-readable blurb shown in the universe picker/hovercard."
|
|
14198
|
+
},
|
|
13295
14199
|
"holdout_range": {
|
|
13296
14200
|
"anyOf": [
|
|
13297
14201
|
{
|
|
@@ -13309,10 +14213,27 @@
|
|
|
13309
14213
|
}
|
|
13310
14214
|
],
|
|
13311
14215
|
"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."
|
|
14216
|
+
},
|
|
14217
|
+
"recommended_headroom": {
|
|
14218
|
+
"type": "integer",
|
|
14219
|
+
"minimum": 0,
|
|
14220
|
+
"maximum": 10000,
|
|
14221
|
+
"description": "Basis points of reserved headroom seeded into new experiments in this universe."
|
|
14222
|
+
},
|
|
14223
|
+
"param_schema": {
|
|
14224
|
+
"anyOf": [
|
|
14225
|
+
{
|
|
14226
|
+
"$ref": "#/components/schemas/UniverseParamSchema"
|
|
14227
|
+
},
|
|
14228
|
+
{
|
|
14229
|
+
"type": "null"
|
|
14230
|
+
}
|
|
14231
|
+
],
|
|
14232
|
+
"description": "Replace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only)."
|
|
13312
14233
|
}
|
|
13313
14234
|
},
|
|
13314
14235
|
"additionalProperties": false,
|
|
13315
|
-
"description": "Body for `PATCH /api/admin/universes/{id}`.
|
|
14236
|
+
"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."
|
|
13316
14237
|
},
|
|
13317
14238
|
"UpdateUniverseResponse": {
|
|
13318
14239
|
"type": "object",
|
|
@@ -13327,7 +14248,7 @@
|
|
|
13327
14248
|
],
|
|
13328
14249
|
"additionalProperties": false
|
|
13329
14250
|
},
|
|
13330
|
-
"
|
|
14251
|
+
"GateTemplateRuleResponse": {
|
|
13331
14252
|
"type": "object",
|
|
13332
14253
|
"properties": {
|
|
13333
14254
|
"attr": {
|
|
@@ -13362,11 +14283,10 @@
|
|
|
13362
14283
|
},
|
|
13363
14284
|
"required": [
|
|
13364
14285
|
"attr",
|
|
13365
|
-
"op"
|
|
13366
|
-
"value"
|
|
14286
|
+
"op"
|
|
13367
14287
|
],
|
|
13368
14288
|
"additionalProperties": false,
|
|
13369
|
-
"description": "Single targeting predicate
|
|
14289
|
+
"description": "Single targeting predicate as returned by the API. `value` is optional here — read-only built-in templates (e.g. `@owner`, or presets whose operand is supplied at substitution time) legitimately omit it. Request bodies still require `value`."
|
|
13370
14290
|
},
|
|
13371
14291
|
"GateTemplate": {
|
|
13372
14292
|
"type": "object",
|
|
@@ -13414,7 +14334,7 @@
|
|
|
13414
14334
|
"rules": {
|
|
13415
14335
|
"type": "array",
|
|
13416
14336
|
"items": {
|
|
13417
|
-
"$ref": "#/components/schemas/
|
|
14337
|
+
"$ref": "#/components/schemas/GateTemplateRuleResponse"
|
|
13418
14338
|
},
|
|
13419
14339
|
"description": "The rule definition — copy, substitute the value(s), pass as `rules`."
|
|
13420
14340
|
},
|
|
@@ -13478,6 +14398,62 @@
|
|
|
13478
14398
|
],
|
|
13479
14399
|
"additionalProperties": false
|
|
13480
14400
|
},
|
|
14401
|
+
"GateTemplateRule": {
|
|
14402
|
+
"type": "object",
|
|
14403
|
+
"properties": {
|
|
14404
|
+
"attr": {
|
|
14405
|
+
"type": "string",
|
|
14406
|
+
"description": "Attribute key on the evaluation context (e.g. `country`, `plan`, `email`). Matched case-sensitively against `Shipeasy.checkGate(user, name)` input. May be empty on a built-in template whose attribute is supplied at substitution time (e.g. the `exp_in` \"in any experiment\" preset — you fill in the experiment name)."
|
|
14407
|
+
},
|
|
14408
|
+
"op": {
|
|
14409
|
+
"type": "string",
|
|
14410
|
+
"enum": [
|
|
14411
|
+
"eq",
|
|
14412
|
+
"neq",
|
|
14413
|
+
"in",
|
|
14414
|
+
"not_in",
|
|
14415
|
+
"gt",
|
|
14416
|
+
"gte",
|
|
14417
|
+
"lt",
|
|
14418
|
+
"lte",
|
|
14419
|
+
"contains",
|
|
14420
|
+
"regex",
|
|
14421
|
+
"semver_gt",
|
|
14422
|
+
"semver_gte",
|
|
14423
|
+
"semver_lt",
|
|
14424
|
+
"semver_lte",
|
|
14425
|
+
"gate_pass",
|
|
14426
|
+
"exp_in"
|
|
14427
|
+
],
|
|
14428
|
+
"description": "Comparison operator. Equality: `eq`/`neq`. Set membership: `in`/`not_in` (value is an array). Numeric order: `gt`/`gte`/`lt`/`lte`. Semver order: `semver_gt`/`semver_gte`/`semver_lt`/`semver_lte`. String: `contains` (substring), `regex` (JS-flavour pattern). Cross-resource: `gate_pass` (value is another gate's name), `exp_in` (attr is an experiment name, value is a variant / `\"$holdout\"` / `\"$any\"`)."
|
|
14429
|
+
},
|
|
14430
|
+
"value": {
|
|
14431
|
+
"description": "Operand. Shape depends on `op`: scalar for `eq/neq/gt/gte/lt/lte/contains/semver_*`; array of scalars for `in/not_in`; string pattern for `regex`; referenced gate name for `gate_pass`; variant selector for `exp_in`. Required on every request rule (value-ops need it; the valueless built-in presets are read-only and never created via the API).",
|
|
14432
|
+
"anyOf": [
|
|
14433
|
+
{
|
|
14434
|
+
"type": "string"
|
|
14435
|
+
},
|
|
14436
|
+
{
|
|
14437
|
+
"type": "number"
|
|
14438
|
+
},
|
|
14439
|
+
{
|
|
14440
|
+
"type": "boolean"
|
|
14441
|
+
},
|
|
14442
|
+
{
|
|
14443
|
+
"type": "array",
|
|
14444
|
+
"items": {}
|
|
14445
|
+
}
|
|
14446
|
+
]
|
|
14447
|
+
}
|
|
14448
|
+
},
|
|
14449
|
+
"required": [
|
|
14450
|
+
"attr",
|
|
14451
|
+
"op",
|
|
14452
|
+
"value"
|
|
14453
|
+
],
|
|
14454
|
+
"additionalProperties": false,
|
|
14455
|
+
"description": "Single targeting predicate. Copy a template's rules, substitute the concrete `value`(s), and pass them as the `rules` arg of `release_flags_create`."
|
|
14456
|
+
},
|
|
13481
14457
|
"CreateGateTemplateRequest": {
|
|
13482
14458
|
"type": "object",
|
|
13483
14459
|
"description": "Body for `POST /api/admin/gate-templates`. Creates a per-project (customer) template. At minimum supply `name` + `rules`.",
|
|
@@ -14289,8 +15265,8 @@
|
|
|
14289
15265
|
"description": "Winsorise percentile applied to the metric.",
|
|
14290
15266
|
"type": "number"
|
|
14291
15267
|
},
|
|
14292
|
-
"
|
|
14293
|
-
"description": "
|
|
15268
|
+
"defaultMinEffectOfInterest": {
|
|
15269
|
+
"description": "Metric-level default minimum effect of interest (relative, 0–1), or `null`.",
|
|
14294
15270
|
"anyOf": [
|
|
14295
15271
|
{
|
|
14296
15272
|
"type": "number"
|
|
@@ -14340,9 +15316,9 @@
|
|
|
14340
15316
|
"minimum": 1,
|
|
14341
15317
|
"maximum": 99
|
|
14342
15318
|
},
|
|
14343
|
-
"
|
|
15319
|
+
"MetricDefaultMinEffectOfInterest": {
|
|
14344
15320
|
"default": null,
|
|
14345
|
-
"description": "
|
|
15321
|
+
"description": "Default minimum effect of interest (relative, 0–1) — the smallest change in this metric worth acting on, used as the power-planning baseline. Intrinsic to the metric; an experiment overrides it per-attachment with `min_effect_of_interest` when a specific decision has a different cost/risk bar. `null` to omit.",
|
|
14346
15322
|
"anyOf": [
|
|
14347
15323
|
{
|
|
14348
15324
|
"type": "number"
|
|
@@ -14380,8 +15356,8 @@
|
|
|
14380
15356
|
"winsorize_pct": {
|
|
14381
15357
|
"$ref": "#/components/schemas/MetricWinsorizePct"
|
|
14382
15358
|
},
|
|
14383
|
-
"
|
|
14384
|
-
"$ref": "#/components/schemas/
|
|
15359
|
+
"default_min_effect_of_interest": {
|
|
15360
|
+
"$ref": "#/components/schemas/MetricDefaultMinEffectOfInterest"
|
|
14385
15361
|
},
|
|
14386
15362
|
"direction": {
|
|
14387
15363
|
"$ref": "#/components/schemas/MetricDirection"
|
|
@@ -14413,8 +15389,8 @@
|
|
|
14413
15389
|
"winsorize_pct": {
|
|
14414
15390
|
"$ref": "#/components/schemas/MetricWinsorizePct"
|
|
14415
15391
|
},
|
|
14416
|
-
"
|
|
14417
|
-
"$ref": "#/components/schemas/
|
|
15392
|
+
"default_min_effect_of_interest": {
|
|
15393
|
+
"$ref": "#/components/schemas/MetricDefaultMinEffectOfInterest"
|
|
14418
15394
|
},
|
|
14419
15395
|
"direction": {
|
|
14420
15396
|
"$ref": "#/components/schemas/MetricDirection"
|
|
@@ -14511,8 +15487,8 @@
|
|
|
14511
15487
|
"description": "Winsorise percentile applied to the metric.",
|
|
14512
15488
|
"type": "number"
|
|
14513
15489
|
},
|
|
14514
|
-
"
|
|
14515
|
-
"description": "
|
|
15490
|
+
"defaultMinEffectOfInterest": {
|
|
15491
|
+
"description": "Metric-level default minimum effect of interest (relative, 0–1), or `null`.",
|
|
14516
15492
|
"anyOf": [
|
|
14517
15493
|
{
|
|
14518
15494
|
"type": "number"
|
|
@@ -14571,8 +15547,8 @@
|
|
|
14571
15547
|
"winsorize_pct": {
|
|
14572
15548
|
"$ref": "#/components/schemas/MetricWinsorizePct"
|
|
14573
15549
|
},
|
|
14574
|
-
"
|
|
14575
|
-
"$ref": "#/components/schemas/
|
|
15550
|
+
"default_min_effect_of_interest": {
|
|
15551
|
+
"$ref": "#/components/schemas/MetricDefaultMinEffectOfInterest"
|
|
14576
15552
|
},
|
|
14577
15553
|
"direction": {
|
|
14578
15554
|
"$ref": "#/components/schemas/MetricDirection"
|
|
@@ -14599,8 +15575,8 @@
|
|
|
14599
15575
|
"winsorize_pct": {
|
|
14600
15576
|
"$ref": "#/components/schemas/MetricWinsorizePct"
|
|
14601
15577
|
},
|
|
14602
|
-
"
|
|
14603
|
-
"$ref": "#/components/schemas/
|
|
15578
|
+
"default_min_effect_of_interest": {
|
|
15579
|
+
"$ref": "#/components/schemas/MetricDefaultMinEffectOfInterest"
|
|
14604
15580
|
},
|
|
14605
15581
|
"direction": {
|
|
14606
15582
|
"$ref": "#/components/schemas/MetricDirection"
|
|
@@ -14624,15 +15600,15 @@
|
|
|
14624
15600
|
"winsorize_pct": {
|
|
14625
15601
|
"$ref": "#/components/schemas/MetricWinsorizePct"
|
|
14626
15602
|
},
|
|
14627
|
-
"
|
|
14628
|
-
"$ref": "#/components/schemas/
|
|
15603
|
+
"default_min_effect_of_interest": {
|
|
15604
|
+
"$ref": "#/components/schemas/MetricDefaultMinEffectOfInterest"
|
|
14629
15605
|
},
|
|
14630
15606
|
"direction": {
|
|
14631
15607
|
"$ref": "#/components/schemas/MetricDirection"
|
|
14632
15608
|
}
|
|
14633
15609
|
},
|
|
14634
15610
|
"additionalProperties": false,
|
|
14635
|
-
"description": "Update-metric variant that leaves the query untouched (metadata-only edit — folder, event, winsorisation,
|
|
15611
|
+
"description": "Update-metric variant that leaves the query untouched (metadata-only edit — folder, event, winsorisation, default minimum effect of interest, direction)."
|
|
14636
15612
|
},
|
|
14637
15613
|
"UpdateMetricRequest": {
|
|
14638
15614
|
"oneOf": [
|
|
@@ -15673,6 +16649,17 @@
|
|
|
15673
16649
|
},
|
|
15674
16650
|
"description": "Distinct, id-normalized routes this error has surfaced on (UUIDs/ids collapsed to `#`)."
|
|
15675
16651
|
},
|
|
16652
|
+
"stackTail": {
|
|
16653
|
+
"anyOf": [
|
|
16654
|
+
{
|
|
16655
|
+
"type": "string"
|
|
16656
|
+
},
|
|
16657
|
+
{
|
|
16658
|
+
"type": "null"
|
|
16659
|
+
}
|
|
16660
|
+
],
|
|
16661
|
+
"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`."
|
|
16662
|
+
},
|
|
15676
16663
|
"sdkVersion": {
|
|
15677
16664
|
"anyOf": [
|
|
15678
16665
|
{
|
|
@@ -15974,6 +16961,17 @@
|
|
|
15974
16961
|
"OpsMeasurePlanContext": {
|
|
15975
16962
|
"type": "object",
|
|
15976
16963
|
"properties": {
|
|
16964
|
+
"goal": {
|
|
16965
|
+
"anyOf": [
|
|
16966
|
+
{
|
|
16967
|
+
"type": "string"
|
|
16968
|
+
},
|
|
16969
|
+
{
|
|
16970
|
+
"type": "null"
|
|
16971
|
+
}
|
|
16972
|
+
],
|
|
16973
|
+
"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."
|
|
16974
|
+
},
|
|
15977
16975
|
"created": {
|
|
15978
16976
|
"type": "array",
|
|
15979
16977
|
"items": {
|
|
@@ -16500,82 +17498,209 @@
|
|
|
16500
17498
|
"priority": {
|
|
16501
17499
|
"$ref": "#/components/schemas/OpsItemPriorityOrNull"
|
|
16502
17500
|
},
|
|
16503
|
-
"notify": {
|
|
16504
|
-
"$ref": "#/components/schemas/OpsItemNotifyOrNull"
|
|
16505
|
-
}
|
|
16506
|
-
},
|
|
16507
|
-
"additionalProperties": false,
|
|
16508
|
-
"description": "Triage-only update — the shape accepted for any item, and the ONLY shape for auto-filed `error`/`alert`/`measure_plan` tickets (their content is not user-editable)."
|
|
16509
|
-
},
|
|
16510
|
-
"UpdateOpsItemRequest": {
|
|
16511
|
-
"anyOf": [
|
|
16512
|
-
{
|
|
16513
|
-
"$ref": "#/components/schemas/UpdateBugRequest"
|
|
17501
|
+
"notify": {
|
|
17502
|
+
"$ref": "#/components/schemas/OpsItemNotifyOrNull"
|
|
17503
|
+
}
|
|
17504
|
+
},
|
|
17505
|
+
"additionalProperties": false,
|
|
17506
|
+
"description": "Triage-only update — the shape accepted for any item, and the ONLY shape for auto-filed `error`/`alert`/`measure_plan` tickets (their content is not user-editable)."
|
|
17507
|
+
},
|
|
17508
|
+
"UpdateOpsItemRequest": {
|
|
17509
|
+
"anyOf": [
|
|
17510
|
+
{
|
|
17511
|
+
"$ref": "#/components/schemas/UpdateBugRequest"
|
|
17512
|
+
},
|
|
17513
|
+
{
|
|
17514
|
+
"$ref": "#/components/schemas/UpdateFeatureRequestRequest"
|
|
17515
|
+
},
|
|
17516
|
+
{
|
|
17517
|
+
"$ref": "#/components/schemas/UpdateOpsItemStatusRequest"
|
|
17518
|
+
}
|
|
17519
|
+
],
|
|
17520
|
+
"description": "Body for `PATCH /api/admin/ops/{handle}`. The body is type-less — the server validates it against the stored item's type: a `bug` accepts the bug content fields, a `feature_request` the feature fields, and `error`/`alert`/`measure_plan` only `status`/`priority`/`notify`. Pass at least one field."
|
|
17521
|
+
},
|
|
17522
|
+
"UpdateOpsItemResponse": {
|
|
17523
|
+
"type": "object",
|
|
17524
|
+
"properties": {
|
|
17525
|
+
"id": {
|
|
17526
|
+
"type": "string",
|
|
17527
|
+
"description": "Item id that was updated."
|
|
17528
|
+
}
|
|
17529
|
+
},
|
|
17530
|
+
"required": [
|
|
17531
|
+
"id"
|
|
17532
|
+
],
|
|
17533
|
+
"additionalProperties": false,
|
|
17534
|
+
"description": "Response for the update / link-pr endpoints."
|
|
17535
|
+
},
|
|
17536
|
+
"LinkPrToOpsItemRequest": {
|
|
17537
|
+
"type": "object",
|
|
17538
|
+
"properties": {
|
|
17539
|
+
"prNumber": {
|
|
17540
|
+
"anyOf": [
|
|
17541
|
+
{
|
|
17542
|
+
"type": "integer",
|
|
17543
|
+
"exclusiveMinimum": 0,
|
|
17544
|
+
"maximum": 9007199254740991
|
|
17545
|
+
},
|
|
17546
|
+
{
|
|
17547
|
+
"type": "null"
|
|
17548
|
+
}
|
|
17549
|
+
],
|
|
17550
|
+
"description": "PR number to record on the item. `null` unlinks the PR."
|
|
17551
|
+
},
|
|
17552
|
+
"prUrl": {
|
|
17553
|
+
"description": "Explicit PR URL. Required for error/alert tickets (no GitHub issue to derive the URL from).",
|
|
17554
|
+
"type": "string",
|
|
17555
|
+
"format": "uri"
|
|
17556
|
+
}
|
|
17557
|
+
},
|
|
17558
|
+
"required": [
|
|
17559
|
+
"prNumber"
|
|
17560
|
+
],
|
|
17561
|
+
"additionalProperties": false,
|
|
17562
|
+
"description": "Body for `POST /api/admin/ops/{handle}/link-pr`."
|
|
17563
|
+
},
|
|
17564
|
+
"LinkPrToOpsItemResponse": {
|
|
17565
|
+
"type": "object",
|
|
17566
|
+
"properties": {
|
|
17567
|
+
"id": {
|
|
17568
|
+
"type": "string",
|
|
17569
|
+
"description": "Item id that was updated."
|
|
17570
|
+
}
|
|
17571
|
+
},
|
|
17572
|
+
"required": [
|
|
17573
|
+
"id"
|
|
17574
|
+
],
|
|
17575
|
+
"additionalProperties": false,
|
|
17576
|
+
"description": "Response for the update / link-pr endpoints."
|
|
17577
|
+
},
|
|
17578
|
+
"OpsCommentAuthorType": {
|
|
17579
|
+
"type": "string",
|
|
17580
|
+
"enum": [
|
|
17581
|
+
"user",
|
|
17582
|
+
"system"
|
|
17583
|
+
],
|
|
17584
|
+
"description": "Who wrote a comment. `user` is a teammate (their email is in `authorEmail`); `system` is Jarvis — the AI agent — which authors comments when an ops-notify escalation lands on the item and when it is `@shipeasy`-mentioned in a thread."
|
|
17585
|
+
},
|
|
17586
|
+
"OpsComment": {
|
|
17587
|
+
"type": "object",
|
|
17588
|
+
"properties": {
|
|
17589
|
+
"id": {
|
|
17590
|
+
"type": "string",
|
|
17591
|
+
"description": "Comment id."
|
|
17592
|
+
},
|
|
17593
|
+
"feedbackId": {
|
|
17594
|
+
"type": "string",
|
|
17595
|
+
"description": "The queue item this comment hangs off."
|
|
17596
|
+
},
|
|
17597
|
+
"parentId": {
|
|
17598
|
+
"anyOf": [
|
|
17599
|
+
{
|
|
17600
|
+
"type": "string"
|
|
17601
|
+
},
|
|
17602
|
+
{
|
|
17603
|
+
"type": "null"
|
|
17604
|
+
}
|
|
17605
|
+
],
|
|
17606
|
+
"description": "The top-level comment this is a reply to, or `null` for a top-level comment."
|
|
17607
|
+
},
|
|
17608
|
+
"authorType": {
|
|
17609
|
+
"$ref": "#/components/schemas/OpsCommentAuthorType"
|
|
17610
|
+
},
|
|
17611
|
+
"authorEmail": {
|
|
17612
|
+
"anyOf": [
|
|
17613
|
+
{
|
|
17614
|
+
"type": "string"
|
|
17615
|
+
},
|
|
17616
|
+
{
|
|
17617
|
+
"type": "null"
|
|
17618
|
+
}
|
|
17619
|
+
],
|
|
17620
|
+
"description": "The teammate who wrote it, or `null` for a `system` (Jarvis) comment."
|
|
17621
|
+
},
|
|
17622
|
+
"body": {
|
|
17623
|
+
"type": "string",
|
|
17624
|
+
"description": "Comment body as markdown (may contain sanitised inline image/video embeds)."
|
|
16514
17625
|
},
|
|
16515
|
-
{
|
|
16516
|
-
"
|
|
17626
|
+
"createdAt": {
|
|
17627
|
+
"type": "string",
|
|
17628
|
+
"description": "ISO-8601 creation timestamp."
|
|
16517
17629
|
},
|
|
16518
|
-
{
|
|
16519
|
-
"
|
|
17630
|
+
"updatedAt": {
|
|
17631
|
+
"type": "string",
|
|
17632
|
+
"description": "ISO-8601 last-edit timestamp."
|
|
16520
17633
|
}
|
|
17634
|
+
},
|
|
17635
|
+
"required": [
|
|
17636
|
+
"id",
|
|
17637
|
+
"feedbackId",
|
|
17638
|
+
"parentId",
|
|
17639
|
+
"authorType",
|
|
17640
|
+
"authorEmail",
|
|
17641
|
+
"body",
|
|
17642
|
+
"createdAt",
|
|
17643
|
+
"updatedAt"
|
|
16521
17644
|
],
|
|
16522
|
-
"
|
|
17645
|
+
"additionalProperties": false,
|
|
17646
|
+
"description": "A single comment on a queue item."
|
|
16523
17647
|
},
|
|
16524
|
-
"
|
|
17648
|
+
"ListOpsCommentsResponse": {
|
|
16525
17649
|
"type": "object",
|
|
16526
17650
|
"properties": {
|
|
16527
|
-
"
|
|
16528
|
-
"type": "
|
|
16529
|
-
"
|
|
17651
|
+
"comments": {
|
|
17652
|
+
"type": "array",
|
|
17653
|
+
"items": {
|
|
17654
|
+
"$ref": "#/components/schemas/OpsComment"
|
|
17655
|
+
}
|
|
16530
17656
|
}
|
|
16531
17657
|
},
|
|
16532
17658
|
"required": [
|
|
16533
|
-
"
|
|
17659
|
+
"comments"
|
|
16534
17660
|
],
|
|
16535
17661
|
"additionalProperties": false,
|
|
16536
|
-
"description": "Response for the
|
|
17662
|
+
"description": "Response for `GET /api/admin/ops/{handle}/comments` — the thread, oldest first."
|
|
16537
17663
|
},
|
|
16538
|
-
"
|
|
17664
|
+
"CreateOpsCommentRequest": {
|
|
16539
17665
|
"type": "object",
|
|
16540
17666
|
"properties": {
|
|
16541
|
-
"
|
|
17667
|
+
"body": {
|
|
17668
|
+
"type": "string",
|
|
17669
|
+
"minLength": 1,
|
|
17670
|
+
"maxLength": 10000,
|
|
17671
|
+
"description": "The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it."
|
|
17672
|
+
},
|
|
17673
|
+
"parentId": {
|
|
16542
17674
|
"anyOf": [
|
|
16543
17675
|
{
|
|
16544
|
-
"type": "
|
|
16545
|
-
"exclusiveMinimum": 0,
|
|
16546
|
-
"maximum": 9007199254740991
|
|
17676
|
+
"type": "string"
|
|
16547
17677
|
},
|
|
16548
17678
|
{
|
|
16549
17679
|
"type": "null"
|
|
16550
17680
|
}
|
|
16551
17681
|
],
|
|
16552
|
-
"description": "
|
|
16553
|
-
},
|
|
16554
|
-
"prUrl": {
|
|
16555
|
-
"description": "Explicit PR URL. Required for error/alert tickets (no GitHub issue to derive the URL from).",
|
|
16556
|
-
"type": "string",
|
|
16557
|
-
"format": "uri"
|
|
17682
|
+
"description": "Reply under this top-level comment. Omit / `null` for a top-level comment. Replying to a reply attaches to the same top-level parent (threading is one level deep)."
|
|
16558
17683
|
}
|
|
16559
17684
|
},
|
|
16560
17685
|
"required": [
|
|
16561
|
-
"
|
|
17686
|
+
"body"
|
|
16562
17687
|
],
|
|
16563
17688
|
"additionalProperties": false,
|
|
16564
|
-
"description": "Body for `POST /api/admin/ops/{handle}/
|
|
17689
|
+
"description": "Body for `POST /api/admin/ops/{handle}/comments`."
|
|
16565
17690
|
},
|
|
16566
|
-
"
|
|
17691
|
+
"CreateOpsCommentResponse": {
|
|
16567
17692
|
"type": "object",
|
|
16568
17693
|
"properties": {
|
|
16569
17694
|
"id": {
|
|
16570
17695
|
"type": "string",
|
|
16571
|
-
"description": "
|
|
17696
|
+
"description": "Newly created comment id."
|
|
16572
17697
|
}
|
|
16573
17698
|
},
|
|
16574
17699
|
"required": [
|
|
16575
17700
|
"id"
|
|
16576
17701
|
],
|
|
16577
17702
|
"additionalProperties": false,
|
|
16578
|
-
"description": "Response for
|
|
17703
|
+
"description": "Response for `POST /api/admin/ops/{handle}/comments`."
|
|
16579
17704
|
},
|
|
16580
17705
|
"NotifyOpsRequest": {
|
|
16581
17706
|
"type": "object",
|
|
@@ -16600,8 +17725,15 @@
|
|
|
16600
17725
|
}
|
|
16601
17726
|
},
|
|
16602
17727
|
"href": {
|
|
16603
|
-
"description": "Dashboard-relative deep link to the related item.",
|
|
16604
|
-
"
|
|
17728
|
+
"description": "Dashboard-relative deep link to the related item. `null` is accepted and treated as \"no link\".",
|
|
17729
|
+
"anyOf": [
|
|
17730
|
+
{
|
|
17731
|
+
"type": "string"
|
|
17732
|
+
},
|
|
17733
|
+
{
|
|
17734
|
+
"type": "null"
|
|
17735
|
+
}
|
|
17736
|
+
]
|
|
16605
17737
|
},
|
|
16606
17738
|
"dedupeKey": {
|
|
16607
17739
|
"description": "Stable per-escalation key (e.g. `feedback:7`) so re-runs dedupe to one row.",
|
|
@@ -16940,7 +18072,9 @@
|
|
|
16940
18072
|
"type": "string",
|
|
16941
18073
|
"enum": [
|
|
16942
18074
|
"free",
|
|
16943
|
-
"
|
|
18075
|
+
"pro",
|
|
18076
|
+
"business",
|
|
18077
|
+
"enterprise"
|
|
16944
18078
|
],
|
|
16945
18079
|
"description": "Billing plan tier."
|
|
16946
18080
|
},
|
|
@@ -17045,6 +18179,69 @@
|
|
|
17045
18179
|
],
|
|
17046
18180
|
"description": "Whether the feedback/ops module is enabled."
|
|
17047
18181
|
},
|
|
18182
|
+
"minSampleSize": {
|
|
18183
|
+
"type": "integer",
|
|
18184
|
+
"description": "Verdict power guard — minimum users per arm before a ship/hold verdict."
|
|
18185
|
+
},
|
|
18186
|
+
"minRuntimeDays": {
|
|
18187
|
+
"type": "integer",
|
|
18188
|
+
"description": "Minimum days an experiment must run before a verdict (peeking guard)."
|
|
18189
|
+
},
|
|
18190
|
+
"defaultPower": {
|
|
18191
|
+
"type": "number",
|
|
18192
|
+
"description": "Target statistical power (1−β) feeding the realized-MDE calculation."
|
|
18193
|
+
},
|
|
18194
|
+
"ciConfidence": {
|
|
18195
|
+
"type": "number",
|
|
18196
|
+
"description": "Confidence level for the interval surfaced on results."
|
|
18197
|
+
},
|
|
18198
|
+
"defaultAllocationPct": {
|
|
18199
|
+
"type": "integer",
|
|
18200
|
+
"description": "Default traffic allocation (basis points) new experiments start with."
|
|
18201
|
+
},
|
|
18202
|
+
"defaultHoldout": {
|
|
18203
|
+
"type": "integer",
|
|
18204
|
+
"description": "Default holdout carve-out (basis points) that seeds each new universe's holdout."
|
|
18205
|
+
},
|
|
18206
|
+
"defaultWinsorizePct": {
|
|
18207
|
+
"type": "integer",
|
|
18208
|
+
"description": "Default winsorization percentile new metrics start with."
|
|
18209
|
+
},
|
|
18210
|
+
"defaultMei": {
|
|
18211
|
+
"anyOf": [
|
|
18212
|
+
{
|
|
18213
|
+
"type": "number"
|
|
18214
|
+
},
|
|
18215
|
+
{
|
|
18216
|
+
"type": "null"
|
|
18217
|
+
}
|
|
18218
|
+
],
|
|
18219
|
+
"description": "Default minimum effect of interest (relative, 0–1) new metrics start with, or null."
|
|
18220
|
+
},
|
|
18221
|
+
"cupedBaselineDays": {
|
|
18222
|
+
"type": "integer",
|
|
18223
|
+
"description": "CUPED baseline window — days of pre-experiment history, frozen at start."
|
|
18224
|
+
},
|
|
18225
|
+
"cupedMinOverlap": {
|
|
18226
|
+
"type": "number",
|
|
18227
|
+
"description": "CUPED selection-bias guard — min share of users with a baseline, else skip."
|
|
18228
|
+
},
|
|
18229
|
+
"cupedMinBaselineUsers": {
|
|
18230
|
+
"type": "integer",
|
|
18231
|
+
"description": "CUPED — minimum users with a baseline before it runs at all."
|
|
18232
|
+
},
|
|
18233
|
+
"msprtTauMeiFactor": {
|
|
18234
|
+
"type": "number",
|
|
18235
|
+
"description": "mSPRT prior width — τ = minimum effect of interest × this factor."
|
|
18236
|
+
},
|
|
18237
|
+
"msprtTauSdFactor": {
|
|
18238
|
+
"type": "number",
|
|
18239
|
+
"description": "mSPRT fallback prior width — τ = this × control SD when no MEI is set."
|
|
18240
|
+
},
|
|
18241
|
+
"srmThreshold": {
|
|
18242
|
+
"type": "number",
|
|
18243
|
+
"description": "SRM chi-square p-value below which the run is called invalid."
|
|
18244
|
+
},
|
|
17048
18245
|
"createdAt": {
|
|
17049
18246
|
"type": "string",
|
|
17050
18247
|
"description": "ISO-8601 timestamp of project creation."
|
|
@@ -17237,6 +18434,97 @@
|
|
|
17237
18434
|
"moduleEvents": {
|
|
17238
18435
|
"type": "boolean",
|
|
17239
18436
|
"description": "Enable/disable the events module."
|
|
18437
|
+
},
|
|
18438
|
+
"minSampleSize": {
|
|
18439
|
+
"type": "integer",
|
|
18440
|
+
"minimum": 2,
|
|
18441
|
+
"maximum": 1000000,
|
|
18442
|
+
"description": "Verdict power guard — minimum users per arm before a ship/hold verdict."
|
|
18443
|
+
},
|
|
18444
|
+
"minRuntimeDays": {
|
|
18445
|
+
"type": "integer",
|
|
18446
|
+
"minimum": 0,
|
|
18447
|
+
"maximum": 365,
|
|
18448
|
+
"description": "Minimum days an experiment must run before a verdict (peeking guard)."
|
|
18449
|
+
},
|
|
18450
|
+
"defaultPower": {
|
|
18451
|
+
"type": "number",
|
|
18452
|
+
"minimum": 0.5,
|
|
18453
|
+
"maximum": 0.99,
|
|
18454
|
+
"description": "Target statistical power (1−β) feeding the realized-MDE calculation."
|
|
18455
|
+
},
|
|
18456
|
+
"ciConfidence": {
|
|
18457
|
+
"type": "number",
|
|
18458
|
+
"minimum": 0.5,
|
|
18459
|
+
"maximum": 0.999,
|
|
18460
|
+
"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)."
|
|
18461
|
+
},
|
|
18462
|
+
"defaultAllocationPct": {
|
|
18463
|
+
"type": "integer",
|
|
18464
|
+
"minimum": 1,
|
|
18465
|
+
"maximum": 10000,
|
|
18466
|
+
"description": "Default traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment."
|
|
18467
|
+
},
|
|
18468
|
+
"defaultHoldout": {
|
|
18469
|
+
"type": "integer",
|
|
18470
|
+
"minimum": 0,
|
|
18471
|
+
"maximum": 10000,
|
|
18472
|
+
"description": "Default holdout carve-out (basis points) that seeds each new universe's holdout (0 = none)."
|
|
18473
|
+
},
|
|
18474
|
+
"defaultWinsorizePct": {
|
|
18475
|
+
"type": "integer",
|
|
18476
|
+
"minimum": 1,
|
|
18477
|
+
"maximum": 99,
|
|
18478
|
+
"description": "Default winsorization percentile new metrics start with; overridable per metric."
|
|
18479
|
+
},
|
|
18480
|
+
"defaultMei": {
|
|
18481
|
+
"anyOf": [
|
|
18482
|
+
{
|
|
18483
|
+
"type": "number",
|
|
18484
|
+
"minimum": 0,
|
|
18485
|
+
"maximum": 1
|
|
18486
|
+
},
|
|
18487
|
+
{
|
|
18488
|
+
"type": "null"
|
|
18489
|
+
}
|
|
18490
|
+
],
|
|
18491
|
+
"description": "Default minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it."
|
|
18492
|
+
},
|
|
18493
|
+
"cupedBaselineDays": {
|
|
18494
|
+
"type": "integer",
|
|
18495
|
+
"minimum": 1,
|
|
18496
|
+
"maximum": 365,
|
|
18497
|
+
"description": "CUPED baseline window — days of pre-experiment history, frozen at start."
|
|
18498
|
+
},
|
|
18499
|
+
"cupedMinOverlap": {
|
|
18500
|
+
"type": "number",
|
|
18501
|
+
"minimum": 0.01,
|
|
18502
|
+
"maximum": 0.99,
|
|
18503
|
+
"description": "CUPED selection-bias guard — min share of users with a baseline, else skip."
|
|
18504
|
+
},
|
|
18505
|
+
"cupedMinBaselineUsers": {
|
|
18506
|
+
"type": "integer",
|
|
18507
|
+
"minimum": 10,
|
|
18508
|
+
"maximum": 100000,
|
|
18509
|
+
"description": "CUPED — minimum users with a baseline before it runs at all."
|
|
18510
|
+
},
|
|
18511
|
+
"msprtTauMeiFactor": {
|
|
18512
|
+
"type": "number",
|
|
18513
|
+
"minimum": 0.1,
|
|
18514
|
+
"maximum": 2,
|
|
18515
|
+
"description": "mSPRT prior width — τ = minimum effect of interest × this factor."
|
|
18516
|
+
},
|
|
18517
|
+
"msprtTauSdFactor": {
|
|
18518
|
+
"type": "number",
|
|
18519
|
+
"minimum": 0.05,
|
|
18520
|
+
"maximum": 1,
|
|
18521
|
+
"description": "mSPRT fallback prior width — τ = this × control SD when no MEI is set."
|
|
18522
|
+
},
|
|
18523
|
+
"srmThreshold": {
|
|
18524
|
+
"type": "number",
|
|
18525
|
+
"minimum": 0.0001,
|
|
18526
|
+
"maximum": 0.05,
|
|
18527
|
+
"description": "SRM chi-square p-value below which the run is called invalid."
|
|
17240
18528
|
}
|
|
17241
18529
|
},
|
|
17242
18530
|
"additionalProperties": false,
|
|
@@ -17902,6 +19190,102 @@
|
|
|
17902
19190
|
"additionalProperties": false,
|
|
17903
19191
|
"description": "Result of a one-shot set-and-publish."
|
|
17904
19192
|
},
|
|
19193
|
+
"ErrorOccurrence": {
|
|
19194
|
+
"type": "object",
|
|
19195
|
+
"description": "One sampled instance behind a tracked error — the minimal per-occurrence payload (what varies between instances; everything else lives on the parent `ErrorRecord`).",
|
|
19196
|
+
"properties": {
|
|
19197
|
+
"id": {
|
|
19198
|
+
"type": "string",
|
|
19199
|
+
"description": "Stable opaque occurrence id."
|
|
19200
|
+
},
|
|
19201
|
+
"message": {
|
|
19202
|
+
"type": "string",
|
|
19203
|
+
"description": "This instance's raw message (unlike the fingerprint, never normalized)."
|
|
19204
|
+
},
|
|
19205
|
+
"stack": {
|
|
19206
|
+
"description": "This instance's stack trace, or `null` if none was captured.",
|
|
19207
|
+
"anyOf": [
|
|
19208
|
+
{
|
|
19209
|
+
"type": "string"
|
|
19210
|
+
},
|
|
19211
|
+
{
|
|
19212
|
+
"type": "null"
|
|
19213
|
+
}
|
|
19214
|
+
]
|
|
19215
|
+
},
|
|
19216
|
+
"url": {
|
|
19217
|
+
"description": "This instance's raw URL (ids intact), or `null`.",
|
|
19218
|
+
"anyOf": [
|
|
19219
|
+
{
|
|
19220
|
+
"type": "string"
|
|
19221
|
+
},
|
|
19222
|
+
{
|
|
19223
|
+
"type": "null"
|
|
19224
|
+
}
|
|
19225
|
+
]
|
|
19226
|
+
},
|
|
19227
|
+
"env": {
|
|
19228
|
+
"description": "Published env this instance ran against, or `null`.",
|
|
19229
|
+
"anyOf": [
|
|
19230
|
+
{
|
|
19231
|
+
"type": "string"
|
|
19232
|
+
},
|
|
19233
|
+
{
|
|
19234
|
+
"type": "null"
|
|
19235
|
+
}
|
|
19236
|
+
]
|
|
19237
|
+
},
|
|
19238
|
+
"side": {
|
|
19239
|
+
"description": "Which SDK side reported it — `client` or `server`. `null` if unknown.",
|
|
19240
|
+
"anyOf": [
|
|
19241
|
+
{
|
|
19242
|
+
"type": "string"
|
|
19243
|
+
},
|
|
19244
|
+
{
|
|
19245
|
+
"type": "null"
|
|
19246
|
+
}
|
|
19247
|
+
]
|
|
19248
|
+
},
|
|
19249
|
+
"sdkVersion": {
|
|
19250
|
+
"description": "`@shipeasy/sdk` version of this instance, or `null`.",
|
|
19251
|
+
"anyOf": [
|
|
19252
|
+
{
|
|
19253
|
+
"type": "string"
|
|
19254
|
+
},
|
|
19255
|
+
{
|
|
19256
|
+
"type": "null"
|
|
19257
|
+
}
|
|
19258
|
+
]
|
|
19259
|
+
},
|
|
19260
|
+
"extrasJson": {
|
|
19261
|
+
"description": "This instance's sanitized extras, JSON-encoded. `null` if none.",
|
|
19262
|
+
"anyOf": [
|
|
19263
|
+
{
|
|
19264
|
+
"type": "string"
|
|
19265
|
+
},
|
|
19266
|
+
{
|
|
19267
|
+
"type": "null"
|
|
19268
|
+
}
|
|
19269
|
+
]
|
|
19270
|
+
},
|
|
19271
|
+
"sampleRate": {
|
|
19272
|
+
"type": "integer",
|
|
19273
|
+
"minimum": 1,
|
|
19274
|
+
"description": "1-in-N sampling rate in force when this instance was kept (`1` = the issue was still being recorded exhaustively)."
|
|
19275
|
+
},
|
|
19276
|
+
"seenAt": {
|
|
19277
|
+
"type": "string",
|
|
19278
|
+
"description": "ISO-8601 timestamp this instance was ingested."
|
|
19279
|
+
}
|
|
19280
|
+
},
|
|
19281
|
+
"required": [
|
|
19282
|
+
"id",
|
|
19283
|
+
"message",
|
|
19284
|
+
"sampleRate",
|
|
19285
|
+
"seenAt"
|
|
19286
|
+
],
|
|
19287
|
+
"additionalProperties": false
|
|
19288
|
+
},
|
|
17905
19289
|
"ErrorRecord": {
|
|
17906
19290
|
"type": "object",
|
|
17907
19291
|
"description": "A tracked production error — one row per distinct issue, keyed by `fingerprint`. Rows are never created by hand: an ingestion path (worker log drain / the `see()` SDK reporter) folds each occurrence into the matching row, bumping `count` and `lastSeenAt`. The admin surface only lists them, reads one, and flips `status`.\n\nField names are camelCase (the D1 row projected through Drizzle). Many columns are nullable because the reporting source may not supply them.",
|
|
@@ -17916,7 +19300,7 @@
|
|
|
17916
19300
|
},
|
|
17917
19301
|
"fingerprint": {
|
|
17918
19302
|
"type": "string",
|
|
17919
|
-
"description": "Stable dedupe key (hash of `errorType` +
|
|
19303
|
+
"description": "Stable dedupe key — the issue TITLE (hash of `errorType` + `subject` + `outcome`, plus the violation name for violations). Unique per project — every occurrence with the same title folds into this one row; per-instance variety (message/stack/extras) lives in `occurrences`."
|
|
17920
19304
|
},
|
|
17921
19305
|
"causedByFingerprint": {
|
|
17922
19306
|
"description": "Fingerprint of the issue this one descends from — set when `see()` reported the same error (re-throw) or its `{ cause }` (wrap) at an inner boundary first. Points at another error's `fingerprint` in the same project (soft reference, no FK). `null` for a root issue.",
|
|
@@ -18075,7 +19459,14 @@
|
|
|
18075
19459
|
"count": {
|
|
18076
19460
|
"type": "integer",
|
|
18077
19461
|
"minimum": 1,
|
|
18078
|
-
"description": "
|
|
19462
|
+
"description": "EXACT number of folded occurrences for this fingerprint — every occurrence increments it, regardless of detail-row sampling."
|
|
19463
|
+
},
|
|
19464
|
+
"occurrences": {
|
|
19465
|
+
"type": "array",
|
|
19466
|
+
"description": "Sampled per-instance detail rows behind this issue, newest first. Returned only by `GET /api/admin/errors/{id}` (never in list responses). The parent row's `count` / `firstSeenAt` / `lastSeenAt` are exact; these rows are a *sampled sketch* of the instances — exhaustive while the issue is small, thinning to roughly 1-in-10 past 10 occurrences, 1-in-100 past 100, and 1-in-1000 past 1000 (each row's `sampleRate` records the rate in force when it was kept), capped at the newest 100 rows.",
|
|
19467
|
+
"items": {
|
|
19468
|
+
"$ref": "#/components/schemas/ErrorOccurrence"
|
|
19469
|
+
}
|
|
18079
19470
|
},
|
|
18080
19471
|
"status": {
|
|
18081
19472
|
"type": "string",
|
|
@@ -18119,7 +19510,7 @@
|
|
|
18119
19510
|
},
|
|
18120
19511
|
"ListErrorsResponse": {
|
|
18121
19512
|
"type": "array",
|
|
18122
|
-
"description": "A bare JSON array of tracked errors, ordered by `lastSeenAt` descending. There is no pagination envelope — `limit` caps the page size.",
|
|
19513
|
+
"description": "A bare JSON array of tracked errors, ordered by `lastSeenAt` descending. There is no pagination envelope — `limit` caps the page size. List rows never include `occurrences` — read one error to get them.",
|
|
18123
19514
|
"items": {
|
|
18124
19515
|
"$ref": "#/components/schemas/ErrorRecord"
|
|
18125
19516
|
}
|
|
@@ -18816,25 +20207,21 @@
|
|
|
18816
20207
|
"properties": {
|
|
18817
20208
|
"ok": {
|
|
18818
20209
|
"type": "boolean",
|
|
18819
|
-
"description": "`true`
|
|
18820
|
-
},
|
|
18821
|
-
"error": {
|
|
18822
|
-
"type": "string",
|
|
18823
|
-
"description": "Failure reason. Present only when `ok` is `false` — the fire reached the handler but the underlying dispatch to the provider failed."
|
|
20210
|
+
"description": "Always `true` — a successful fire returns HTTP 200. A dispatch failure returns HTTP 502 with the `Error` envelope, not this body."
|
|
18824
20211
|
}
|
|
18825
20212
|
},
|
|
18826
20213
|
"required": [
|
|
18827
20214
|
"ok"
|
|
18828
20215
|
],
|
|
18829
20216
|
"additionalProperties": false,
|
|
18830
|
-
"description": "Result of
|
|
20217
|
+
"description": "Result of a successful trigger fire: `{ ok: true }`. When the downstream dispatch fails the endpoint returns HTTP 502 (see the `Error` response), never `ok: false`."
|
|
18831
20218
|
},
|
|
18832
20219
|
"TestConnectorResponse": {
|
|
18833
20220
|
"type": "object",
|
|
18834
20221
|
"properties": {
|
|
18835
20222
|
"ok": {
|
|
18836
20223
|
"type": "boolean",
|
|
18837
|
-
"description": "`true`
|
|
20224
|
+
"description": "Always `true` — a successful test returns HTTP 200. A dispatch failure returns HTTP 502 with the `Error` envelope, not this body."
|
|
18838
20225
|
},
|
|
18839
20226
|
"issueUrl": {
|
|
18840
20227
|
"anyOf": [
|
|
@@ -18845,11 +20232,7 @@
|
|
|
18845
20232
|
"type": "null"
|
|
18846
20233
|
}
|
|
18847
20234
|
],
|
|
18848
|
-
"description": "URL of the artifact the test produced (e.g. the GitHub Issue created by a `github` connector), or `null` when the provider produces no linkable artifact
|
|
18849
|
-
},
|
|
18850
|
-
"error": {
|
|
18851
|
-
"type": "string",
|
|
18852
|
-
"description": "Failure reason. Present only when `ok` is `false` — the test reached the handler but the underlying dispatch to the provider failed."
|
|
20235
|
+
"description": "URL of the artifact the test produced (e.g. the GitHub Issue created by a `github` connector), or `null` when the provider produces no linkable artifact."
|
|
18853
20236
|
}
|
|
18854
20237
|
},
|
|
18855
20238
|
"required": [
|
|
@@ -18857,7 +20240,7 @@
|
|
|
18857
20240
|
"issueUrl"
|
|
18858
20241
|
],
|
|
18859
20242
|
"additionalProperties": false,
|
|
18860
|
-
"description": "Result of
|
|
20243
|
+
"description": "Result of a successful connector test: `{ ok: true, issueUrl }`. When the downstream dispatch fails the endpoint returns HTTP 502 (see the `Error` response), never `ok: false`."
|
|
18861
20244
|
},
|
|
18862
20245
|
"UpdateClaudeTriggerRequest": {
|
|
18863
20246
|
"type": "object",
|
|
@@ -19221,10 +20604,11 @@
|
|
|
19221
20604
|
"gates:evaluate",
|
|
19222
20605
|
"events:write",
|
|
19223
20606
|
"configs:write",
|
|
19224
|
-
"experiments:write"
|
|
20607
|
+
"experiments:write",
|
|
20608
|
+
"tickets:public_create"
|
|
19225
20609
|
]
|
|
19226
20610
|
},
|
|
19227
|
-
"description": "Optional permission strings recorded on the key
|
|
20611
|
+
"description": "Optional permission strings recorded on the key. `tickets:public_create` is enforced: a client key needs it (plus the project's `allowPublicTickets` setting) to file a `pending_approval` bug via the public `POST /cli/report` endpoint. The rest are audit/display only."
|
|
19228
20612
|
},
|
|
19229
20613
|
"expiresInDays": {
|
|
19230
20614
|
"anyOf": [
|
|
@@ -19555,6 +20939,24 @@
|
|
|
19555
20939
|
}
|
|
19556
20940
|
}
|
|
19557
20941
|
}
|
|
20942
|
+
},
|
|
20943
|
+
"BadGateway": {
|
|
20944
|
+
"description": "The request was well-formed and the resource exists, but a downstream provider\nthe endpoint delegates to (e.g. a connector's Slack/GitHub/cloud-agent dispatch)\nfailed. The failure is upstream of this API, not a client error. No stable\n`ErrorCode` is assigned to upstream failures, so `code` is omitted.",
|
|
20945
|
+
"content": {
|
|
20946
|
+
"application/json": {
|
|
20947
|
+
"schema": {
|
|
20948
|
+
"$ref": "#/components/schemas/Error"
|
|
20949
|
+
},
|
|
20950
|
+
"examples": {
|
|
20951
|
+
"UPSTREAM_FAILURE": {
|
|
20952
|
+
"summary": "Downstream provider dispatch failed",
|
|
20953
|
+
"value": {
|
|
20954
|
+
"error": "GitHub API responded 403: resource not accessible by integration."
|
|
20955
|
+
}
|
|
20956
|
+
}
|
|
20957
|
+
}
|
|
20958
|
+
}
|
|
20959
|
+
}
|
|
19558
20960
|
}
|
|
19559
20961
|
}
|
|
19560
20962
|
}
|