@shipeasy/openapi 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/{chunk-EPLLHLZN.js → chunk-643YSMLU.js} +1 -1
  2. package/dist/{chunk-EPLLHLZN.js.map → chunk-643YSMLU.js.map} +1 -1
  3. package/dist/{chunk-SPH5HWCD.js → chunk-MRW3DJ57.js} +147 -88
  4. package/dist/chunk-MRW3DJ57.js.map +1 -0
  5. package/dist/{client-pVkoo3Bf.d.ts → client-K0ShmsC7.d.ts} +196 -98
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.js +1 -1
  8. package/dist/custom.d.ts +23 -1
  9. package/dist/custom.js +8 -0
  10. package/dist/custom.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.js +2 -2
  13. package/dist/schemas.d.ts +85 -32
  14. package/dist/schemas.js +17 -1
  15. package/openapi.json +533 -96
  16. package/openapi.yaml +390 -92
  17. package/package.json +1 -1
  18. package/spec/components/parameters.yaml +8 -0
  19. package/spec/components/responses.yaml +15 -0
  20. package/spec/components/schemas/common.yaml +5 -0
  21. package/spec/components/schemas/connectors.yaml +5 -11
  22. package/spec/components/schemas/gate-templates.yaml +41 -2
  23. package/spec/components/schemas/ops.yaml +4 -2
  24. package/spec/openapi.yaml +21 -2
  25. package/spec/paths/alert-rules.yaml +10 -2
  26. package/spec/paths/attributes.yaml +14 -3
  27. package/spec/paths/configs.yaml +23 -9
  28. package/spec/paths/connectors.yaml +42 -8
  29. package/spec/paths/errors.yaml +4 -4
  30. package/spec/paths/events.yaml +18 -4
  31. package/spec/paths/experiments.yaml +37 -11
  32. package/spec/paths/gate-templates.yaml +9 -5
  33. package/spec/paths/gates.yaml +20 -6
  34. package/spec/paths/i18n.yaml +18 -5
  35. package/spec/paths/keys.yaml +2 -1
  36. package/spec/paths/killswitches.yaml +23 -6
  37. package/spec/paths/metrics.yaml +14 -3
  38. package/spec/paths/ops.yaml +3 -3
  39. package/spec/paths/projects.yaml +1 -1
  40. package/spec/paths/universes.yaml +10 -2
  41. package/dist/chunk-SPH5HWCD.js.map +0 -1
package/openapi.yaml CHANGED
@@ -21,9 +21,26 @@ security:
21
21
  - bearerSdkKey: []
22
22
  tags:
23
23
  - name: Release
24
- summary: Feature delivery
24
+ summary: Feature delivery — flags, kill switches, dynamic configs, A/B experiments, and the universes they bucket in.
25
25
  kind: nav
26
- description: Flags, kill switches, dynamic configs, experiments, and the universes they bucket in — the feature-delivery surface.
26
+ description: |-
27
+ Release: the feature-delivery surface. One roof over the five resources
28
+ that decide which code path a user gets — feature gates (flags), kill
29
+ switches, dynamic configs, A/B/n experiments, and the universes that bucket
30
+ them — each exposed as its own subcommand group.
31
+
32
+ **Groups.**
33
+ - `flags` — boolean feature gates: AND-combined targeting rules + a percentage rollout (basis points), evaluated on the SDK hot path.
34
+ - `killswitch` (`ks`) — per-env boolean overrides for incident response; no rules, no rollout, versioned per environment.
35
+ - `configs` — JSON-Schema-validated structured values with a draft → publish workflow, delivered per environment.
36
+ - `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.
37
+
38
+ **Delivery model.** Every write rebuilds the project's KV blob and purges
39
+ the CDN — SDKs poll at the plan interval and never touch the database on
40
+ the hot path. The destructive verb is `archive` (soft-delete), never
41
+ `delete`.
42
+
43
+ Run `shipeasy release <group> --help` for the full contract of each group.
27
44
  - name: Flags
28
45
  parent: Release
29
46
  description: |-
@@ -229,6 +246,7 @@ paths:
229
246
  - $ref: '#/components/parameters/ProjectId'
230
247
  - $ref: '#/components/parameters/PaginationLimit'
231
248
  - $ref: '#/components/parameters/PaginationCursor'
249
+ - $ref: '#/components/parameters/Q'
232
250
  responses:
233
251
  '200':
234
252
  description: List feature gates
@@ -380,6 +398,23 @@ paths:
380
398
  example:
381
399
  id: gat_01j7w7m9q4hxbf6npe6s9zr3vc
382
400
  name: checkout_v2
401
+ links:
402
+ UpdateGate:
403
+ operationId: updateGate
404
+ parameters:
405
+ id: $response.body#/id
406
+ EnableGate:
407
+ operationId: enableGate
408
+ parameters:
409
+ id: $response.body#/id
410
+ DisableGate:
411
+ operationId: disableGate
412
+ parameters:
413
+ id: $response.body#/id
414
+ DeleteGate:
415
+ operationId: deleteGate
416
+ parameters:
417
+ id: $response.body#/id
383
418
  '400':
384
419
  $ref: '#/components/responses/BadRequest'
385
420
  '401':
@@ -428,7 +463,7 @@ paths:
428
463
  required: true
429
464
  description: Stable opaque gate id (`gat_…`) or the gate's `name`.
430
465
  schema:
431
- type: string
466
+ $ref: '#/components/schemas/ResourceId'
432
467
  requestBody:
433
468
  required: true
434
469
  content:
@@ -534,7 +569,7 @@ paths:
534
569
  required: true
535
570
  description: Stable opaque gate id (`gat_…`) or the gate's `name`.
536
571
  schema:
537
- type: string
572
+ $ref: '#/components/schemas/ResourceId'
538
573
  responses:
539
574
  '200':
540
575
  description: Delete a feature gate
@@ -583,9 +618,9 @@ paths:
583
618
  required: true
584
619
  description: Stable opaque gate id (`gat_…`) or the gate's `name`.
585
620
  schema:
586
- type: string
621
+ $ref: '#/components/schemas/ResourceId'
587
622
  responses:
588
- '201':
623
+ '200':
589
624
  description: Enable a gate
590
625
  content:
591
626
  application/json:
@@ -633,9 +668,9 @@ paths:
633
668
  required: true
634
669
  description: Stable opaque gate id (`gat_…`) or the gate's `name`.
635
670
  schema:
636
- type: string
671
+ $ref: '#/components/schemas/ResourceId'
637
672
  responses:
638
- '201':
673
+ '200':
639
674
  description: Disable a gate
640
675
  content:
641
676
  application/json:
@@ -680,6 +715,13 @@ paths:
680
715
  - $ref: '#/components/parameters/ProjectId'
681
716
  - $ref: '#/components/parameters/PaginationLimit'
682
717
  - $ref: '#/components/parameters/PaginationCursor'
718
+ - name: status
719
+ in: query
720
+ required: false
721
+ description: Filter by lifecycle status. Pass `archived` to return the archive tab; any other value (or omitting it) returns the non-archived experiments.
722
+ schema:
723
+ type: string
724
+ - $ref: '#/components/parameters/Q'
683
725
  responses:
684
726
  '200':
685
727
  description: List experiments
@@ -827,6 +869,31 @@ paths:
827
869
  example:
828
870
  id: exp_01j7wb12c3d4e5f6g7h8j9k0l1
829
871
  name: checkout_button_color
872
+ links:
873
+ GetExperiment:
874
+ operationId: getExperiment
875
+ parameters:
876
+ id: $response.body#/id
877
+ UpdateExperiment:
878
+ operationId: updateExperiment
879
+ parameters:
880
+ id: $response.body#/id
881
+ SetExperimentMetrics:
882
+ operationId: setExperimentMetrics
883
+ parameters:
884
+ id: $response.body#/id
885
+ SetExperimentStatus:
886
+ operationId: setExperimentStatus
887
+ parameters:
888
+ id: $response.body#/id
889
+ ReanalyzeExperiment:
890
+ operationId: reanalyzeExperiment
891
+ parameters:
892
+ id: $response.body#/id
893
+ DeleteExperiment:
894
+ operationId: deleteExperiment
895
+ parameters:
896
+ id: $response.body#/id
830
897
  '400':
831
898
  $ref: '#/components/responses/BadRequest'
832
899
  '401':
@@ -869,7 +936,7 @@ paths:
869
936
  required: true
870
937
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
871
938
  schema:
872
- type: string
939
+ $ref: '#/components/schemas/ResourceId'
873
940
  responses:
874
941
  '200':
875
942
  description: Get one experiment
@@ -949,7 +1016,7 @@ paths:
949
1016
  required: true
950
1017
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
951
1018
  schema:
952
- type: string
1019
+ $ref: '#/components/schemas/ResourceId'
953
1020
  requestBody:
954
1021
  required: true
955
1022
  content:
@@ -1034,7 +1101,7 @@ paths:
1034
1101
  required: true
1035
1102
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1036
1103
  schema:
1037
- type: string
1104
+ $ref: '#/components/schemas/ResourceId'
1038
1105
  responses:
1039
1106
  '200':
1040
1107
  description: Delete an experiment
@@ -1095,7 +1162,7 @@ paths:
1095
1162
  required: true
1096
1163
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1097
1164
  schema:
1098
- type: string
1165
+ $ref: '#/components/schemas/ResourceId'
1099
1166
  requestBody:
1100
1167
  required: true
1101
1168
  content:
@@ -1124,7 +1191,7 @@ paths:
1124
1191
  value:
1125
1192
  status: draft
1126
1193
  responses:
1127
- '201':
1194
+ '200':
1128
1195
  description: Transition experiment status
1129
1196
  content:
1130
1197
  application/json:
@@ -1190,7 +1257,7 @@ paths:
1190
1257
  required: true
1191
1258
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1192
1259
  schema:
1193
- type: string
1260
+ $ref: '#/components/schemas/ResourceId'
1194
1261
  requestBody:
1195
1262
  required: true
1196
1263
  content:
@@ -1213,7 +1280,7 @@ paths:
1213
1280
  value:
1214
1281
  metrics: []
1215
1282
  responses:
1216
- '201':
1283
+ '200':
1217
1284
  description: Attach metrics
1218
1285
  content:
1219
1286
  application/json:
@@ -1267,7 +1334,7 @@ paths:
1267
1334
  required: true
1268
1335
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1269
1336
  schema:
1270
- type: string
1337
+ $ref: '#/components/schemas/ResourceId'
1271
1338
  responses:
1272
1339
  '200':
1273
1340
  description: Get analysis results
@@ -1336,7 +1403,7 @@ paths:
1336
1403
  required: true
1337
1404
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1338
1405
  schema:
1339
- type: string
1406
+ $ref: '#/components/schemas/ResourceId'
1340
1407
  - name: metric
1341
1408
  in: query
1342
1409
  required: false
@@ -1410,9 +1477,9 @@ paths:
1410
1477
  required: true
1411
1478
  description: Stable opaque experiment id (`exp_…`) or the experiment's `name`.
1412
1479
  schema:
1413
- type: string
1480
+ $ref: '#/components/schemas/ResourceId'
1414
1481
  responses:
1415
- '201':
1482
+ '200':
1416
1483
  description: Re-queue analysis
1417
1484
  content:
1418
1485
  application/json:
@@ -1457,6 +1524,7 @@ paths:
1457
1524
  - $ref: '#/components/parameters/ProjectId'
1458
1525
  - $ref: '#/components/parameters/PaginationLimit'
1459
1526
  - $ref: '#/components/parameters/PaginationCursor'
1527
+ - $ref: '#/components/parameters/Q'
1460
1528
  responses:
1461
1529
  '200':
1462
1530
  description: List dynamic configs
@@ -1605,6 +1673,23 @@ paths:
1605
1673
  example:
1606
1674
  id: cfg_01j7wae5h6j7k8l9m0n1p2q3r4
1607
1675
  name: pricing.tiers
1676
+ links:
1677
+ GetConfig:
1678
+ operationId: getConfig
1679
+ parameters:
1680
+ id: $response.body#/id
1681
+ UpdateConfig:
1682
+ operationId: updateConfig
1683
+ parameters:
1684
+ id: $response.body#/id
1685
+ PublishConfigDraft:
1686
+ operationId: publishConfigDraft
1687
+ parameters:
1688
+ id: $response.body#/id
1689
+ DeleteConfig:
1690
+ operationId: deleteConfig
1691
+ parameters:
1692
+ id: $response.body#/id
1608
1693
  '400':
1609
1694
  $ref: '#/components/responses/BadRequest'
1610
1695
  '401':
@@ -1644,7 +1729,7 @@ paths:
1644
1729
  required: true
1645
1730
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
1646
1731
  schema:
1647
- type: string
1732
+ $ref: '#/components/schemas/ResourceId'
1648
1733
  responses:
1649
1734
  '200':
1650
1735
  description: Get one config
@@ -1746,7 +1831,7 @@ paths:
1746
1831
  required: true
1747
1832
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
1748
1833
  schema:
1749
- type: string
1834
+ $ref: '#/components/schemas/ResourceId'
1750
1835
  requestBody:
1751
1836
  required: true
1752
1837
  content:
@@ -1822,7 +1907,7 @@ paths:
1822
1907
  required: true
1823
1908
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
1824
1909
  schema:
1825
- type: string
1910
+ $ref: '#/components/schemas/ResourceId'
1826
1911
  responses:
1827
1912
  '200':
1828
1913
  description: Delete a dynamic config
@@ -1872,7 +1957,7 @@ paths:
1872
1957
  required: true
1873
1958
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
1874
1959
  schema:
1875
- type: string
1960
+ $ref: '#/components/schemas/ResourceId'
1876
1961
  requestBody:
1877
1962
  required: true
1878
1963
  content:
@@ -1940,7 +2025,7 @@ paths:
1940
2025
  required: true
1941
2026
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
1942
2027
  schema:
1943
- type: string
2028
+ $ref: '#/components/schemas/ResourceId'
1944
2029
  requestBody:
1945
2030
  required: true
1946
2031
  content:
@@ -2002,7 +2087,7 @@ paths:
2002
2087
  required: true
2003
2088
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
2004
2089
  schema:
2005
- type: string
2090
+ $ref: '#/components/schemas/ResourceId'
2006
2091
  requestBody:
2007
2092
  required: true
2008
2093
  content:
@@ -2021,7 +2106,7 @@ paths:
2021
2106
  value:
2022
2107
  env: prod
2023
2108
  responses:
2024
- '201':
2109
+ '200':
2025
2110
  description: Publish a draft
2026
2111
  content:
2027
2112
  application/json:
@@ -2071,7 +2156,7 @@ paths:
2071
2156
  required: true
2072
2157
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
2073
2158
  schema:
2074
- type: string
2159
+ $ref: '#/components/schemas/ResourceId'
2075
2160
  - name: limit
2076
2161
  in: query
2077
2162
  required: false
@@ -2135,7 +2220,7 @@ paths:
2135
2220
  required: true
2136
2221
  description: Stable opaque config id (`cfg_…`) or the config's `name`.
2137
2222
  schema:
2138
- type: string
2223
+ $ref: '#/components/schemas/ResourceId'
2139
2224
  requestBody:
2140
2225
  required: true
2141
2226
  content:
@@ -2201,6 +2286,7 @@ paths:
2201
2286
  - $ref: '#/components/parameters/ProjectId'
2202
2287
  - $ref: '#/components/parameters/PaginationLimit'
2203
2288
  - $ref: '#/components/parameters/PaginationCursor'
2289
+ - $ref: '#/components/parameters/Q'
2204
2290
  responses:
2205
2291
  '200':
2206
2292
  description: List killswitches
@@ -2303,6 +2389,27 @@ paths:
2303
2389
  example:
2304
2390
  id: ksw_01j7w9d8h2k4m6n8p0q2r4s6t8
2305
2391
  name: payments.checkout
2392
+ links:
2393
+ GetKillswitch:
2394
+ operationId: getKillswitch
2395
+ parameters:
2396
+ id: $response.body#/id
2397
+ UpdateKillswitch:
2398
+ operationId: updateKillswitch
2399
+ parameters:
2400
+ id: $response.body#/id
2401
+ SetKillswitchSwitch:
2402
+ operationId: setKillswitchSwitch
2403
+ parameters:
2404
+ id: $response.body#/id
2405
+ SetKillswitchValue:
2406
+ operationId: setKillswitchValue
2407
+ parameters:
2408
+ id: $response.body#/id
2409
+ DeleteKillswitch:
2410
+ operationId: deleteKillswitch
2411
+ parameters:
2412
+ id: $response.body#/id
2306
2413
  '400':
2307
2414
  $ref: '#/components/responses/BadRequest'
2308
2415
  '401':
@@ -2342,7 +2449,7 @@ paths:
2342
2449
  required: true
2343
2450
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2344
2451
  schema:
2345
- type: string
2452
+ $ref: '#/components/schemas/ResourceId'
2346
2453
  responses:
2347
2454
  '200':
2348
2455
  description: Get one killswitch
@@ -2414,7 +2521,7 @@ paths:
2414
2521
  required: true
2415
2522
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2416
2523
  schema:
2417
- type: string
2524
+ $ref: '#/components/schemas/ResourceId'
2418
2525
  requestBody:
2419
2526
  required: true
2420
2527
  content:
@@ -2491,7 +2598,7 @@ paths:
2491
2598
  required: true
2492
2599
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2493
2600
  schema:
2494
- type: string
2601
+ $ref: '#/components/schemas/ResourceId'
2495
2602
  responses:
2496
2603
  '200':
2497
2604
  description: Delete a killswitch
@@ -2544,7 +2651,7 @@ paths:
2544
2651
  required: true
2545
2652
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2546
2653
  schema:
2547
- type: string
2654
+ $ref: '#/components/schemas/ResourceId'
2548
2655
  requestBody:
2549
2656
  required: true
2550
2657
  content:
@@ -2618,7 +2725,7 @@ paths:
2618
2725
  required: true
2619
2726
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2620
2727
  schema:
2621
- type: string
2728
+ $ref: '#/components/schemas/ResourceId'
2622
2729
  requestBody:
2623
2730
  required: true
2624
2731
  content:
@@ -2687,7 +2794,7 @@ paths:
2687
2794
  required: true
2688
2795
  description: Stable opaque killswitch id (`ksw_…`) or the killswitch's `name`.
2689
2796
  schema:
2690
- type: string
2797
+ $ref: '#/components/schemas/ResourceId'
2691
2798
  requestBody:
2692
2799
  required: true
2693
2800
  content:
@@ -2758,6 +2865,7 @@ paths:
2758
2865
  - $ref: '#/components/parameters/ProjectId'
2759
2866
  - $ref: '#/components/parameters/PaginationLimit'
2760
2867
  - $ref: '#/components/parameters/PaginationCursor'
2868
+ - $ref: '#/components/parameters/Q'
2761
2869
  responses:
2762
2870
  '200':
2763
2871
  description: List universes
@@ -2846,6 +2954,15 @@ paths:
2846
2954
  example:
2847
2955
  id: uni_01j7w8a1b2c3d4e5f6g7h8i9j0
2848
2956
  name: primary_users
2957
+ links:
2958
+ UpdateUniverse:
2959
+ operationId: updateUniverse
2960
+ parameters:
2961
+ id: $response.body#/id
2962
+ DeleteUniverse:
2963
+ operationId: deleteUniverse
2964
+ parameters:
2965
+ id: $response.body#/id
2849
2966
  '400':
2850
2967
  $ref: '#/components/responses/BadRequest'
2851
2968
  '401':
@@ -2891,7 +3008,7 @@ paths:
2891
3008
  required: true
2892
3009
  description: Stable opaque universe id (`uni_…`) or the universe's `name`.
2893
3010
  schema:
2894
- type: string
3011
+ $ref: '#/components/schemas/ResourceId'
2895
3012
  requestBody:
2896
3013
  required: true
2897
3014
  content:
@@ -2959,7 +3076,7 @@ paths:
2959
3076
  required: true
2960
3077
  description: Stable opaque universe id (`uni_…`) or the universe's `name`.
2961
3078
  schema:
2962
- type: string
3079
+ $ref: '#/components/schemas/ResourceId'
2963
3080
  responses:
2964
3081
  '200':
2965
3082
  description: Delete a universe
@@ -2998,17 +3115,19 @@ paths:
2998
3115
  description: |-
2999
3116
  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.
3000
3117
 
3001
- **Turn "launch X in country Y" into a gated flag:** list templates (optionally with `query`), take the matching template's `rules`, substitute the concrete value(s), and pass them as the `rules` arg of `release_flags_create`.
3118
+ **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`.
3002
3119
 
3003
3120
  The 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).
3004
3121
  tags:
3005
3122
  - Templates
3006
3123
  parameters:
3007
3124
  - $ref: '#/components/parameters/ProjectId'
3125
+ - $ref: '#/components/parameters/Q'
3008
3126
  - name: query
3009
3127
  in: query
3010
3128
  required: false
3011
- description: Case-insensitive substring filter over each template's `name` + `description`. Omit to return the whole catalog.
3129
+ deprecated: true
3130
+ description: Deprecated alias for `q`, kept working for one release. Prefer `q`.
3012
3131
  schema:
3013
3132
  type: string
3014
3133
  responses:
@@ -3120,7 +3239,7 @@ paths:
3120
3239
  required: true
3121
3240
  description: Built-in slug (`country`) or customer template id (`gtpl_…`).
3122
3241
  schema:
3123
- type: string
3242
+ $ref: '#/components/schemas/ResourceId'
3124
3243
  responses:
3125
3244
  '200':
3126
3245
  description: Get one gate template
@@ -3158,7 +3277,7 @@ paths:
3158
3277
  required: true
3159
3278
  description: Customer template id (`gtpl_…`) or its `name`.
3160
3279
  schema:
3161
- type: string
3280
+ $ref: '#/components/schemas/ResourceId'
3162
3281
  requestBody:
3163
3282
  required: true
3164
3283
  content:
@@ -3221,7 +3340,7 @@ paths:
3221
3340
  required: true
3222
3341
  description: Customer template id (`gtpl_…`) or its `name`.
3223
3342
  schema:
3224
- type: string
3343
+ $ref: '#/components/schemas/ResourceId'
3225
3344
  responses:
3226
3345
  '200':
3227
3346
  description: Delete a gate template
@@ -3241,6 +3360,8 @@ paths:
3241
3360
  $ref: '#/components/responses/NotFound'
3242
3361
  '409':
3243
3362
  $ref: '#/components/responses/Conflict'
3363
+ '422':
3364
+ $ref: '#/components/responses/UnprocessableEntity'
3244
3365
  x-error-codes:
3245
3366
  - BAD_REQUEST
3246
3367
  - UNAUTHORIZED
@@ -3263,6 +3384,7 @@ paths:
3263
3384
  - Attributes
3264
3385
  parameters:
3265
3386
  - $ref: '#/components/parameters/ProjectId'
3387
+ - $ref: '#/components/parameters/Q'
3266
3388
  responses:
3267
3389
  '200':
3268
3390
  description: List targeting attributes
@@ -3329,6 +3451,19 @@ paths:
3329
3451
  example:
3330
3452
  id: attr_01j7w8a1b2c3
3331
3453
  name: plan
3454
+ links:
3455
+ GetAttribute:
3456
+ operationId: getAttribute
3457
+ parameters:
3458
+ id: $response.body#/id
3459
+ UpdateAttribute:
3460
+ operationId: updateAttribute
3461
+ parameters:
3462
+ id: $response.body#/id
3463
+ DeleteAttribute:
3464
+ operationId: deleteAttribute
3465
+ parameters:
3466
+ id: $response.body#/id
3332
3467
  '400':
3333
3468
  $ref: '#/components/responses/BadRequest'
3334
3469
  '401':
@@ -3368,7 +3503,7 @@ paths:
3368
3503
  required: true
3369
3504
  description: The attribute id.
3370
3505
  schema:
3371
- type: string
3506
+ $ref: '#/components/schemas/ResourceId'
3372
3507
  responses:
3373
3508
  '200':
3374
3509
  description: Get a targeting attribute
@@ -3422,7 +3557,7 @@ paths:
3422
3557
  required: true
3423
3558
  description: The attribute id.
3424
3559
  schema:
3425
- type: string
3560
+ $ref: '#/components/schemas/ResourceId'
3426
3561
  requestBody:
3427
3562
  required: true
3428
3563
  content:
@@ -3481,7 +3616,7 @@ paths:
3481
3616
  required: true
3482
3617
  description: The attribute id.
3483
3618
  schema:
3484
- type: string
3619
+ $ref: '#/components/schemas/ResourceId'
3485
3620
  responses:
3486
3621
  '200':
3487
3622
  description: Archive a targeting attribute
@@ -3524,6 +3659,7 @@ paths:
3524
3659
  - Metrics
3525
3660
  parameters:
3526
3661
  - $ref: '#/components/parameters/ProjectId'
3662
+ - $ref: '#/components/parameters/Q'
3527
3663
  responses:
3528
3664
  '200':
3529
3665
  description: List metrics
@@ -3625,6 +3761,19 @@ paths:
3625
3761
  example:
3626
3762
  id: met_01j7w8a1b2c3d4e5f6g7h8i9j0
3627
3763
  name: checkouts
3764
+ links:
3765
+ GetMetric:
3766
+ operationId: getMetric
3767
+ parameters:
3768
+ id: $response.body#/id
3769
+ UpdateMetric:
3770
+ operationId: updateMetric
3771
+ parameters:
3772
+ id: $response.body#/id
3773
+ DeleteMetric:
3774
+ operationId: deleteMetric
3775
+ parameters:
3776
+ id: $response.body#/id
3628
3777
  '400':
3629
3778
  $ref: '#/components/responses/BadRequest'
3630
3779
  '401':
@@ -3666,7 +3815,7 @@ paths:
3666
3815
  required: true
3667
3816
  description: Stable opaque metric id (`met_…`) or the metric's `name`.
3668
3817
  schema:
3669
- type: string
3818
+ $ref: '#/components/schemas/ResourceId'
3670
3819
  responses:
3671
3820
  '200':
3672
3821
  description: Get a metric
@@ -3725,7 +3874,7 @@ paths:
3725
3874
  required: true
3726
3875
  description: Stable opaque metric id (`met_…`) or the metric's `name`.
3727
3876
  schema:
3728
- type: string
3877
+ $ref: '#/components/schemas/ResourceId'
3729
3878
  requestBody:
3730
3879
  required: true
3731
3880
  content:
@@ -3784,7 +3933,7 @@ paths:
3784
3933
  required: true
3785
3934
  description: Stable opaque metric id (`met_…`) or the metric's `name`.
3786
3935
  schema:
3787
- type: string
3936
+ $ref: '#/components/schemas/ResourceId'
3788
3937
  responses:
3789
3938
  '200':
3790
3939
  description: Archive a metric
@@ -3828,6 +3977,7 @@ paths:
3828
3977
  - Events
3829
3978
  parameters:
3830
3979
  - $ref: '#/components/parameters/ProjectId'
3980
+ - $ref: '#/components/parameters/Q'
3831
3981
  responses:
3832
3982
  '200':
3833
3983
  description: List events
@@ -3913,6 +4063,23 @@ paths:
3913
4063
  example:
3914
4064
  id: evt_01j7w8a1b2c3d4e5f6g7h8i9j0
3915
4065
  name: checkout_completed
4066
+ links:
4067
+ GetEvent:
4068
+ operationId: getEvent
4069
+ parameters:
4070
+ id: $response.body#/id
4071
+ UpdateEvent:
4072
+ operationId: updateEvent
4073
+ parameters:
4074
+ id: $response.body#/id
4075
+ ApproveEvent:
4076
+ operationId: approveEvent
4077
+ parameters:
4078
+ id: $response.body#/id
4079
+ DeleteEvent:
4080
+ operationId: deleteEvent
4081
+ parameters:
4082
+ id: $response.body#/id
3916
4083
  '400':
3917
4084
  $ref: '#/components/responses/BadRequest'
3918
4085
  '401':
@@ -3952,7 +4119,7 @@ paths:
3952
4119
  required: true
3953
4120
  description: Stable opaque event id (`evt_…`) or the event's `name`.
3954
4121
  schema:
3955
- type: string
4122
+ $ref: '#/components/schemas/ResourceId'
3956
4123
  responses:
3957
4124
  '200':
3958
4125
  description: Get an event
@@ -4011,7 +4178,7 @@ paths:
4011
4178
  required: true
4012
4179
  description: Stable opaque event id (`evt_…`) or the event's `name`.
4013
4180
  schema:
4014
- type: string
4181
+ $ref: '#/components/schemas/ResourceId'
4015
4182
  requestBody:
4016
4183
  required: true
4017
4184
  content:
@@ -4079,7 +4246,7 @@ paths:
4079
4246
  required: true
4080
4247
  description: Stable opaque event id (`evt_…`) or the event's `name`.
4081
4248
  schema:
4082
- type: string
4249
+ $ref: '#/components/schemas/ResourceId'
4083
4250
  responses:
4084
4251
  '200':
4085
4252
  description: Archive an event
@@ -4130,7 +4297,7 @@ paths:
4130
4297
  required: true
4131
4298
  description: Stable opaque event id (`evt_…`) or the event's `name`.
4132
4299
  schema:
4133
- type: string
4300
+ $ref: '#/components/schemas/ResourceId'
4134
4301
  requestBody:
4135
4302
  required: true
4136
4303
  content:
@@ -4357,7 +4524,7 @@ paths:
4357
4524
  required: true
4358
4525
  description: Per-project item number (e.g. `7`) or the full ops item id.
4359
4526
  schema:
4360
- type: string
4527
+ $ref: '#/components/schemas/ResourceId'
4361
4528
  responses:
4362
4529
  '200':
4363
4530
  description: Get one queue item
@@ -4416,7 +4583,7 @@ paths:
4416
4583
  required: true
4417
4584
  description: Per-project item number (e.g. `7`) or the full ops item id.
4418
4585
  schema:
4419
- type: string
4586
+ $ref: '#/components/schemas/ResourceId'
4420
4587
  requestBody:
4421
4588
  required: true
4422
4589
  content:
@@ -4484,7 +4651,7 @@ paths:
4484
4651
  required: true
4485
4652
  description: Per-project item number (e.g. `7`) or the full ops item id.
4486
4653
  schema:
4487
- type: string
4654
+ $ref: '#/components/schemas/ResourceId'
4488
4655
  requestBody:
4489
4656
  required: true
4490
4657
  content:
@@ -4637,6 +4804,7 @@ paths:
4637
4804
  - Alerts
4638
4805
  parameters:
4639
4806
  - $ref: '#/components/parameters/ProjectId'
4807
+ - $ref: '#/components/parameters/Q'
4640
4808
  responses:
4641
4809
  '200':
4642
4810
  description: List alert rules
@@ -4730,6 +4898,15 @@ paths:
4730
4898
  $ref: '#/components/schemas/CreateAlertRuleResponse'
4731
4899
  example:
4732
4900
  id: ar_01j7w8a1b2c3d4e5f6g7h8i9j0
4901
+ links:
4902
+ UpdateAlertRule:
4903
+ operationId: updateAlertRule
4904
+ parameters:
4905
+ id: $response.body#/id
4906
+ DeleteAlertRule:
4907
+ operationId: deleteAlertRule
4908
+ parameters:
4909
+ id: $response.body#/id
4733
4910
  '400':
4734
4911
  $ref: '#/components/responses/BadRequest'
4735
4912
  '401':
@@ -4773,7 +4950,7 @@ paths:
4773
4950
  required: true
4774
4951
  description: Stable opaque alert-rule id (`ar_…`) or the rule's `name`.
4775
4952
  schema:
4776
- type: string
4953
+ $ref: '#/components/schemas/ResourceId'
4777
4954
  requestBody:
4778
4955
  required: true
4779
4956
  content:
@@ -4844,7 +5021,7 @@ paths:
4844
5021
  required: true
4845
5022
  description: Stable opaque alert-rule id (`ar_…`) or the rule's `name`.
4846
5023
  schema:
4847
- type: string
5024
+ $ref: '#/components/schemas/ResourceId'
4848
5025
  responses:
4849
5026
  '200':
4850
5027
  description: Delete an alert rule
@@ -5018,7 +5195,7 @@ paths:
5018
5195
  required: true
5019
5196
  description: Stable opaque project id. Must match the caller's own project.
5020
5197
  schema:
5021
- type: string
5198
+ $ref: '#/components/schemas/ResourceId'
5022
5199
  requestBody:
5023
5200
  required: true
5024
5201
  content:
@@ -5157,6 +5334,11 @@ paths:
5157
5334
  example:
5158
5335
  id: i18n_01j7w8a1b2c4
5159
5336
  name: fr:prod
5337
+ links:
5338
+ PublishI18nProfile:
5339
+ operationId: publishI18nProfile
5340
+ parameters:
5341
+ profileId: $response.body#/id
5160
5342
  '400':
5161
5343
  $ref: '#/components/responses/BadRequest'
5162
5344
  '401':
@@ -5204,9 +5386,10 @@ paths:
5204
5386
  - name: q
5205
5387
  in: query
5206
5388
  required: false
5207
- description: Free-text search — matches keys whose name OR value contains this substring (case-insensitive). Use it to find the key behind a piece of on-screen copy.
5389
+ 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.
5208
5390
  schema:
5209
5391
  type: string
5392
+ maxLength: 100
5210
5393
  - name: limit
5211
5394
  in: query
5212
5395
  required: false
@@ -5215,6 +5398,14 @@ paths:
5215
5398
  type: integer
5216
5399
  minimum: 1
5217
5400
  maximum: 500
5401
+ - name: offset
5402
+ in: query
5403
+ required: false
5404
+ description: Number of keys to skip before returning `limit` rows (offset pagination).
5405
+ schema:
5406
+ type: integer
5407
+ minimum: 0
5408
+ default: 0
5218
5409
  responses:
5219
5410
  '200':
5220
5411
  description: List i18n keys
@@ -5319,7 +5510,7 @@ paths:
5319
5510
  required: true
5320
5511
  description: The key's id.
5321
5512
  schema:
5322
- type: string
5513
+ $ref: '#/components/schemas/ResourceId'
5323
5514
  requestBody:
5324
5515
  required: true
5325
5516
  content:
@@ -5467,7 +5658,7 @@ paths:
5467
5658
  required: true
5468
5659
  description: The draft id to update.
5469
5660
  schema:
5470
- type: string
5661
+ $ref: '#/components/schemas/ResourceId'
5471
5662
  requestBody:
5472
5663
  required: true
5473
5664
  content:
@@ -5525,7 +5716,7 @@ paths:
5525
5716
  required: true
5526
5717
  description: The profile id to publish.
5527
5718
  schema:
5528
- type: string
5719
+ $ref: '#/components/schemas/ResourceId'
5529
5720
  requestBody:
5530
5721
  required: true
5531
5722
  content:
@@ -5535,7 +5726,7 @@ paths:
5535
5726
  example:
5536
5727
  chunk: default
5537
5728
  responses:
5538
- '201':
5729
+ '200':
5539
5730
  description: Publish a profile chunk
5540
5731
  content:
5541
5732
  application/json:
@@ -5736,7 +5927,7 @@ paths:
5736
5927
  required: true
5737
5928
  description: Stable opaque error id (`err_…`).
5738
5929
  schema:
5739
- type: string
5930
+ $ref: '#/components/schemas/ResourceId'
5740
5931
  responses:
5741
5932
  '200':
5742
5933
  description: Get a tracked error
@@ -5811,7 +6002,7 @@ paths:
5811
6002
  required: true
5812
6003
  description: Stable opaque error id (`err_…`).
5813
6004
  schema:
5814
- type: string
6005
+ $ref: '#/components/schemas/ResourceId'
5815
6006
  requestBody:
5816
6007
  required: true
5817
6008
  content:
@@ -5900,7 +6091,7 @@ paths:
5900
6091
  required: true
5901
6092
  description: Stable opaque error id (`err_…`).
5902
6093
  schema:
5903
- type: string
6094
+ $ref: '#/components/schemas/ResourceId'
5904
6095
  responses:
5905
6096
  '201':
5906
6097
  description: File a feedback ticket for an error
@@ -5948,7 +6139,7 @@ paths:
5948
6139
  required: true
5949
6140
  description: Stable opaque error id (`err_…`).
5950
6141
  schema:
5951
- type: string
6142
+ $ref: '#/components/schemas/ResourceId'
5952
6143
  requestBody:
5953
6144
  required: true
5954
6145
  content:
@@ -6022,6 +6213,7 @@ paths:
6022
6213
  - Connectors
6023
6214
  parameters:
6024
6215
  - $ref: '#/components/parameters/ProjectId'
6216
+ - $ref: '#/components/parameters/Q'
6025
6217
  responses:
6026
6218
  '200':
6027
6219
  description: List connectors
@@ -6140,6 +6332,23 @@ paths:
6140
6332
  $ref: '#/components/schemas/CreateConnectorResponse'
6141
6333
  example:
6142
6334
  id: 9b0e7c2a-1f3d-4a8e-bf21-0c6a2e5d7f10
6335
+ links:
6336
+ GetConnector:
6337
+ operationId: getConnector
6338
+ parameters:
6339
+ id: $response.body#/id
6340
+ UpdateConnector:
6341
+ operationId: updateConnector
6342
+ parameters:
6343
+ id: $response.body#/id
6344
+ TestConnector:
6345
+ operationId: testConnector
6346
+ parameters:
6347
+ id: $response.body#/id
6348
+ DeleteConnector:
6349
+ operationId: deleteConnector
6350
+ parameters:
6351
+ id: $response.body#/id
6143
6352
  '400':
6144
6353
  $ref: '#/components/responses/BadRequest'
6145
6354
  '401':
@@ -6175,7 +6384,7 @@ paths:
6175
6384
  required: true
6176
6385
  description: Stable opaque connector id.
6177
6386
  schema:
6178
- type: string
6387
+ $ref: '#/components/schemas/ResourceId'
6179
6388
  responses:
6180
6389
  '200':
6181
6390
  description: Get a connector
@@ -6243,7 +6452,7 @@ paths:
6243
6452
  required: true
6244
6453
  description: Stable opaque connector id.
6245
6454
  schema:
6246
- type: string
6455
+ $ref: '#/components/schemas/ResourceId'
6247
6456
  requestBody:
6248
6457
  required: true
6249
6458
  content:
@@ -6316,7 +6525,7 @@ paths:
6316
6525
  required: true
6317
6526
  description: Stable opaque connector id.
6318
6527
  schema:
6319
- type: string
6528
+ $ref: '#/components/schemas/ResourceId'
6320
6529
  responses:
6321
6530
  '200':
6322
6531
  description: Delete a connector
@@ -6365,7 +6574,7 @@ paths:
6365
6574
  required: true
6366
6575
  description: Stable opaque connector id.
6367
6576
  schema:
6368
- type: string
6577
+ $ref: '#/components/schemas/ResourceId'
6369
6578
  requestBody:
6370
6579
  required: false
6371
6580
  content:
@@ -6383,7 +6592,7 @@ paths:
6383
6592
  text: Triage only the P0 bugs reported in the last 24h.
6384
6593
  responses:
6385
6594
  '200':
6386
- description: Fire a trigger connector
6595
+ description: The trigger run was successfully kicked off.
6387
6596
  content:
6388
6597
  application/json:
6389
6598
  schema:
@@ -6402,6 +6611,8 @@ paths:
6402
6611
  $ref: '#/components/responses/Conflict'
6403
6612
  '422':
6404
6613
  $ref: '#/components/responses/UnprocessableEntity'
6614
+ '502':
6615
+ $ref: '#/components/responses/BadGateway'
6405
6616
  x-error-codes:
6406
6617
  - UNAUTHORIZED
6407
6618
  - FORBIDDEN
@@ -6429,10 +6640,10 @@ paths:
6429
6640
  required: true
6430
6641
  description: Stable opaque connector id.
6431
6642
  schema:
6432
- type: string
6643
+ $ref: '#/components/schemas/ResourceId'
6433
6644
  responses:
6434
6645
  '200':
6435
- description: Test a connector
6646
+ description: The test dispatch reached the destination.
6436
6647
  content:
6437
6648
  application/json:
6438
6649
  schema:
@@ -6452,6 +6663,8 @@ paths:
6452
6663
  $ref: '#/components/responses/Conflict'
6453
6664
  '422':
6454
6665
  $ref: '#/components/responses/UnprocessableEntity'
6666
+ '502':
6667
+ $ref: '#/components/responses/BadGateway'
6455
6668
  x-error-codes:
6456
6669
  - UNAUTHORIZED
6457
6670
  - FORBIDDEN
@@ -6481,7 +6694,7 @@ paths:
6481
6694
  required: true
6482
6695
  description: Stable opaque connector id. Its stored `provider` must match the body's `provider`.
6483
6696
  schema:
6484
- type: string
6697
+ $ref: '#/components/schemas/ResourceId'
6485
6698
  requestBody:
6486
6699
  required: true
6487
6700
  content:
@@ -6587,6 +6800,27 @@ paths:
6587
6800
  $ref: '#/components/schemas/CreateConnectorResponse'
6588
6801
  example:
6589
6802
  id: 9b0e7c2a-1f3d-4a8e-bf21-0c6a2e5d7f10
6803
+ links:
6804
+ FireConnector:
6805
+ operationId: fireConnector
6806
+ parameters:
6807
+ id: $response.body#/id
6808
+ TestConnector:
6809
+ operationId: testConnector
6810
+ parameters:
6811
+ id: $response.body#/id
6812
+ GetConnector:
6813
+ operationId: getConnector
6814
+ parameters:
6815
+ id: $response.body#/id
6816
+ UpdateTriggerConnector:
6817
+ operationId: updateTriggerConnector
6818
+ parameters:
6819
+ id: $response.body#/id
6820
+ DeleteConnector:
6821
+ operationId: deleteConnector
6822
+ parameters:
6823
+ id: $response.body#/id
6590
6824
  '400':
6591
6825
  $ref: '#/components/responses/BadRequest'
6592
6826
  '401':
@@ -6783,6 +7017,7 @@ paths:
6783
7017
  - $ref: '#/components/parameters/ProjectId'
6784
7018
  - $ref: '#/components/parameters/PaginationLimit'
6785
7019
  - $ref: '#/components/parameters/PaginationCursor'
7020
+ - $ref: '#/components/parameters/Q'
6786
7021
  responses:
6787
7022
  '200':
6788
7023
  description: List API keys
@@ -6917,7 +7152,7 @@ paths:
6917
7152
  required: true
6918
7153
  description: Stable opaque key id (UUID) returned by `create` / `list`.
6919
7154
  schema:
6920
- type: string
7155
+ $ref: '#/components/schemas/ResourceId'
6921
7156
  responses:
6922
7157
  '200':
6923
7158
  description: Revoke an API key
@@ -7042,6 +7277,14 @@ components:
7042
7277
  description: Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
7043
7278
  schema:
7044
7279
  type: string
7280
+ Q:
7281
+ name: q
7282
+ in: query
7283
+ required: false
7284
+ 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.
7285
+ schema:
7286
+ type: string
7287
+ maxLength: 100
7045
7288
  schemas:
7046
7289
  ListGatesResponse:
7047
7290
  type: object
@@ -7690,6 +7933,11 @@ components:
7690
7933
  - id
7691
7934
  - name
7692
7935
  additionalProperties: false
7936
+ ResourceId:
7937
+ type: string
7938
+ minLength: 1
7939
+ maxLength: 128
7940
+ 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.
7693
7941
  DeleteGateResponse:
7694
7942
  type: object
7695
7943
  properties:
@@ -9729,7 +9977,7 @@ components:
9729
9977
  required:
9730
9978
  - id
9731
9979
  additionalProperties: false
9732
- GateTemplateRule:
9980
+ GateTemplateRuleResponse:
9733
9981
  type: object
9734
9982
  properties:
9735
9983
  attr:
@@ -9760,9 +10008,8 @@ components:
9760
10008
  required:
9761
10009
  - attr
9762
10010
  - op
9763
- - value
9764
10011
  additionalProperties: false
9765
- 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`.
10012
+ 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`.
9766
10013
  GateTemplate:
9767
10014
  type: object
9768
10015
  description: 'A reusable targeting-rule template. Built-ins are read-only (`builtin: true`, stable slug `id`); per-project customer templates are `builtin: false` with a `gtpl_…` id.'
@@ -9796,7 +10043,7 @@ components:
9796
10043
  rules:
9797
10044
  type: array
9798
10045
  items:
9799
- $ref: '#/components/schemas/GateTemplateRule'
10046
+ $ref: '#/components/schemas/GateTemplateRuleResponse'
9800
10047
  description: The rule definition — copy, substitute the value(s), pass as `rules`.
9801
10048
  createdAt:
9802
10049
  anyOf:
@@ -9832,6 +10079,46 @@ components:
9832
10079
  - data
9833
10080
  - next_cursor
9834
10081
  additionalProperties: false
10082
+ GateTemplateRule:
10083
+ type: object
10084
+ properties:
10085
+ attr:
10086
+ type: string
10087
+ 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).
10088
+ op:
10089
+ type: string
10090
+ enum:
10091
+ - eq
10092
+ - neq
10093
+ - in
10094
+ - not_in
10095
+ - gt
10096
+ - gte
10097
+ - lt
10098
+ - lte
10099
+ - contains
10100
+ - regex
10101
+ - semver_gt
10102
+ - semver_gte
10103
+ - semver_lt
10104
+ - semver_lte
10105
+ - gate_pass
10106
+ - exp_in
10107
+ 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"`).'
10108
+ value:
10109
+ 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).'
10110
+ anyOf:
10111
+ - type: string
10112
+ - type: number
10113
+ - type: boolean
10114
+ - type: array
10115
+ items: {}
10116
+ required:
10117
+ - attr
10118
+ - op
10119
+ - value
10120
+ additionalProperties: false
10121
+ 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`.
9835
10122
  CreateGateTemplateRequest:
9836
10123
  type: object
9837
10124
  description: Body for `POST /api/admin/gate-templates`. Creates a per-project (customer) template. At minimum supply `name` + `rules`.
@@ -11907,8 +12194,10 @@ components:
11907
12194
  items:
11908
12195
  type: string
11909
12196
  href:
11910
- description: Dashboard-relative deep link to the related item.
11911
- type: string
12197
+ description: Dashboard-relative deep link to the related item. `null` is accepted and treated as "no link".
12198
+ anyOf:
12199
+ - type: string
12200
+ - type: 'null'
11912
12201
  dedupeKey:
11913
12202
  description: Stable per-escalation key (e.g. `feedback:7`) so re-runs dedupe to one row.
11914
12203
  type: string
@@ -13478,33 +13767,27 @@ components:
13478
13767
  properties:
13479
13768
  ok:
13480
13769
  type: boolean
13481
- description: '`true` when the trigger run was successfully kicked off; `false` when the dispatch itself failed (still HTTP 200, with `error` set).'
13482
- error:
13483
- type: string
13484
- description: Failure reason. Present only when `ok` is `false` — the fire reached the handler but the underlying dispatch to the provider failed.
13770
+ description: Always `true` — a successful fire returns HTTP 200. A dispatch failure returns HTTP 502 with the `Error` envelope, not this body.
13485
13771
  required:
13486
13772
  - ok
13487
13773
  additionalProperties: false
13488
- description: 'Result of firing a trigger connector. `{ ok: true }` on success; `{ ok: false, error }` when the dispatch fails (the request still returns HTTP 200).'
13774
+ 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`.'
13489
13775
  TestConnectorResponse:
13490
13776
  type: object
13491
13777
  properties:
13492
13778
  ok:
13493
13779
  type: boolean
13494
- description: '`true` when the test dispatch reached the destination; `false` when the dispatch itself failed (still HTTP 200, with `error` set).'
13780
+ description: Always `true` — a successful test returns HTTP 200. A dispatch failure returns HTTP 502 with the `Error` envelope, not this body.
13495
13781
  issueUrl:
13496
13782
  anyOf:
13497
13783
  - type: string
13498
13784
  - type: 'null'
13499
- 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 (or the dispatch failed).
13500
- error:
13501
- type: string
13502
- description: Failure reason. Present only when `ok` is `false` — the test reached the handler but the underlying dispatch to the provider failed.
13785
+ 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.
13503
13786
  required:
13504
13787
  - ok
13505
13788
  - issueUrl
13506
13789
  additionalProperties: false
13507
- description: 'Result of testing a connector. `{ ok: true, issueUrl }` on success; `{ ok: false, issueUrl: null, error }` when the dispatch fails (the request still returns HTTP 200).'
13790
+ 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`.'
13508
13791
  UpdateClaudeTriggerRequest:
13509
13792
  type: object
13510
13793
  properties:
@@ -13977,3 +14260,18 @@ components:
13977
14260
  value:
13978
14261
  error: The referenced event is still pending review and cannot back a metric yet.
13979
14262
  code: EVENT_PENDING
14263
+ BadGateway:
14264
+ description: |-
14265
+ The request was well-formed and the resource exists, but a downstream provider
14266
+ the endpoint delegates to (e.g. a connector's Slack/GitHub/cloud-agent dispatch)
14267
+ failed. The failure is upstream of this API, not a client error. No stable
14268
+ `ErrorCode` is assigned to upstream failures, so `code` is omitted.
14269
+ content:
14270
+ application/json:
14271
+ schema:
14272
+ $ref: '#/components/schemas/Error'
14273
+ examples:
14274
+ UPSTREAM_FAILURE:
14275
+ summary: Downstream provider dispatch failed
14276
+ value:
14277
+ error: 'GitHub API responded 403: resource not accessible by integration.'