@rathnasgala2/schemas 3.6.0 → 3.8.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 (53) hide show
  1. package/THIRD_PARTY_LICENSES.json +1 -1
  2. package/diagnostics/diagnostic-map.json +845 -20
  3. package/docs/catalogs/app-components.json +1766 -2
  4. package/docs/catalogs/app-routes.json +598 -1
  5. package/docs/catalogs/schema-inventory.json +10 -10
  6. package/examples/valid/build-input/rules.json +24 -2
  7. package/examples/valid/template-composition/rules.json +769 -0
  8. package/examples/valid/theme-contract/rules.json +1107 -5
  9. package/fixtures/boundary/build-input/rules.json +24 -2
  10. package/fixtures/boundary/template-composition/rules.json +769 -0
  11. package/fixtures/boundary/theme-contract/rules.json +1107 -5
  12. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +22 -11
  13. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +22 -0
  14. package/fixtures/invalid/build-input/SCHEMA_UNION_INVALID/cases.json +11 -0
  15. package/fixtures/invalid/template-composition/SCHEMA_CONSTANT_INVALID/cases.json +497 -0
  16. package/fixtures/invalid/template-composition/SCHEMA_ENUM_INVALID/cases.json +83 -0
  17. package/fixtures/invalid/template-composition/SCHEMA_NEGATED_RULE_MATCHED/cases.json +11 -0
  18. package/fixtures/invalid/template-composition/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +909 -0
  19. package/fixtures/invalid/template-composition/SCHEMA_UNION_INVALID/cases.json +20 -0
  20. package/fixtures/invalid/theme-contract/REQUEST_FIELD_UNKNOWN/cases.json +120 -0
  21. package/fixtures/invalid/theme-contract/SCHEMA_CONSTANT_INVALID/cases.json +680 -0
  22. package/fixtures/invalid/theme-contract/SCHEMA_NEGATED_RULE_MATCHED/cases.json +11 -0
  23. package/fixtures/invalid/theme-contract/SCHEMA_PATTERN_INVALID/cases.json +33 -9
  24. package/fixtures/invalid/theme-contract/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +1383 -3
  25. package/fixtures/invalid/theme-contract/SCHEMA_TYPE_INVALID/cases.json +77 -0
  26. package/fixtures/invalid/theme-contract/SCHEMA_UNION_INVALID/cases.json +18 -0
  27. package/fixtures/invalid/theme-contract/SCHEMA_VERSION_UNSUPPORTED/cases.json +110 -0
  28. package/fixtures/manifest.json +7414 -1089
  29. package/fixtures/s2/manifest.json +1 -1
  30. package/fixtures/unknown-field/build-input/rules.json +5 -1
  31. package/fixtures/unknown-field/template-composition/rules.json +111 -0
  32. package/fixtures/unknown-field/theme-contract/rules.json +276 -1
  33. package/generated/browser/validator-core.mjs +3 -3
  34. package/generated/typescript/contracts/artifact-manifest.d.ts +4 -2
  35. package/generated/typescript/contracts/build-input.d.ts +3 -2
  36. package/generated/typescript/contracts/build-provenance.d.ts +4 -2
  37. package/generated/typescript/contracts/deployment-intent.d.ts +1 -0
  38. package/generated/typescript/contracts/deployment-receipt.d.ts +1 -0
  39. package/generated/typescript/contracts/lock.d.ts +2 -1
  40. package/generated/typescript/contracts/template-composition.d.ts +75 -4
  41. package/generated/typescript/contracts/theme-contract.d.ts +75 -2
  42. package/openapi/http-catalog.json +170 -2
  43. package/openapi/openapi.yaml +2711 -145
  44. package/package.json +1 -1
  45. package/sbom.cdx.json +23 -23
  46. package/schemas/artifact-manifest.schema.json +4 -2
  47. package/schemas/build-input.schema.json +12 -2
  48. package/schemas/build-provenance.schema.json +4 -2
  49. package/schemas/deployment-intent.schema.json +1 -0
  50. package/schemas/deployment-receipt.schema.json +1 -0
  51. package/schemas/lock.schema.json +2 -1
  52. package/schemas/template-composition.schema.json +179 -2
  53. package/schemas/theme-contract.schema.json +282 -1
@@ -141,6 +141,224 @@ components:
141
141
  minLength: 32
142
142
  type: string
143
143
  responses:
144
+ AuthorizationDenied:
145
+ content:
146
+ application/problem+json:
147
+ examples:
148
+ AUTHORIZATION_DENIED:
149
+ summary: AUTHORIZATION_DENIED
150
+ value:
151
+ code: AUTHORIZATION_DENIED
152
+ correlationId: 018f0000-0000-7000-8000-000000000001
153
+ detail: See the operation contract.
154
+ errors: []
155
+ retryable: false
156
+ schemaId: urn:gala:schema:problem:2.0.0
157
+ schemaVersion: 2.0.0
158
+ status: 403
159
+ title: AUTHORIZATION_DENIED
160
+ type: urn:gala:problem:authorization-denied
161
+ schema:
162
+ $ref: "#/components/schemas/Problem"
163
+ description: AUTHORIZATION_DENIED
164
+ headers:
165
+ Cache-Control:
166
+ $ref: "#/components/headers/CacheControlNoStore"
167
+ X-Correlation-Id:
168
+ $ref: "#/components/headers/XCorrelationId"
169
+ x-gala-problem-codes:
170
+ - AUTHORIZATION_DENIED
171
+ CommandReplayConflict:
172
+ content:
173
+ application/problem+json:
174
+ examples:
175
+ COMMAND_REPLAY_CONFLICT:
176
+ summary: COMMAND_REPLAY_CONFLICT
177
+ value:
178
+ code: COMMAND_REPLAY_CONFLICT
179
+ correlationId: 018f0000-0000-7000-8000-000000000001
180
+ detail: See the operation contract.
181
+ errors: []
182
+ retryable: false
183
+ schemaId: urn:gala:schema:problem:2.0.0
184
+ schemaVersion: 2.0.0
185
+ status: 409
186
+ title: COMMAND_REPLAY_CONFLICT
187
+ type: urn:gala:problem:command-replay-conflict
188
+ schema:
189
+ $ref: "#/components/schemas/Problem"
190
+ description: COMMAND_REPLAY_CONFLICT
191
+ headers:
192
+ Cache-Control:
193
+ $ref: "#/components/headers/CacheControlNoStore"
194
+ X-Correlation-Id:
195
+ $ref: "#/components/headers/XCorrelationId"
196
+ x-gala-problem-codes:
197
+ - COMMAND_REPLAY_CONFLICT
198
+ InvalidDecisionCommandConflict:
199
+ content:
200
+ application/problem+json:
201
+ examples:
202
+ COMMAND_REPLAY_CONFLICT:
203
+ summary: COMMAND_REPLAY_CONFLICT
204
+ value:
205
+ code: COMMAND_REPLAY_CONFLICT
206
+ correlationId: 018f0000-0000-7000-8000-000000000001
207
+ detail: See the operation contract.
208
+ errors: []
209
+ retryable: false
210
+ schemaId: urn:gala:schema:problem:2.0.0
211
+ schemaVersion: 2.0.0
212
+ status: 409
213
+ title: COMMAND_REPLAY_CONFLICT
214
+ type: urn:gala:problem:command-replay-conflict
215
+ INVALID_DECISION:
216
+ summary: INVALID_DECISION
217
+ value:
218
+ code: INVALID_DECISION
219
+ correlationId: 018f0000-0000-7000-8000-000000000001
220
+ detail: See the operation contract.
221
+ errors: []
222
+ retryable: false
223
+ schemaId: urn:gala:schema:problem:2.0.0
224
+ schemaVersion: 2.0.0
225
+ status: 409
226
+ title: INVALID_DECISION
227
+ type: urn:gala:problem:invalid-decision
228
+ schema:
229
+ $ref: "#/components/schemas/Problem"
230
+ description: COMMAND_REPLAY_CONFLICT, INVALID_DECISION
231
+ headers:
232
+ Cache-Control:
233
+ $ref: "#/components/headers/CacheControlNoStore"
234
+ X-Correlation-Id:
235
+ $ref: "#/components/headers/XCorrelationId"
236
+ x-gala-problem-codes:
237
+ - COMMAND_REPLAY_CONFLICT
238
+ - INVALID_DECISION
239
+ InvalidSourceStateCommandConflict:
240
+ content:
241
+ application/problem+json:
242
+ examples:
243
+ COMMAND_REPLAY_CONFLICT:
244
+ summary: COMMAND_REPLAY_CONFLICT
245
+ value:
246
+ code: COMMAND_REPLAY_CONFLICT
247
+ correlationId: 018f0000-0000-7000-8000-000000000001
248
+ detail: See the operation contract.
249
+ errors: []
250
+ retryable: false
251
+ schemaId: urn:gala:schema:problem:2.0.0
252
+ schemaVersion: 2.0.0
253
+ status: 409
254
+ title: COMMAND_REPLAY_CONFLICT
255
+ type: urn:gala:problem:command-replay-conflict
256
+ INVALID_SOURCE_STATE:
257
+ summary: INVALID_SOURCE_STATE
258
+ value:
259
+ code: INVALID_SOURCE_STATE
260
+ correlationId: 018f0000-0000-7000-8000-000000000001
261
+ detail: See the operation contract.
262
+ errors: []
263
+ retryable: false
264
+ schemaId: urn:gala:schema:problem:2.0.0
265
+ schemaVersion: 2.0.0
266
+ status: 409
267
+ title: INVALID_SOURCE_STATE
268
+ type: urn:gala:problem:invalid-source-state
269
+ schema:
270
+ $ref: "#/components/schemas/Problem"
271
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
272
+ headers:
273
+ Cache-Control:
274
+ $ref: "#/components/headers/CacheControlNoStore"
275
+ X-Correlation-Id:
276
+ $ref: "#/components/headers/XCorrelationId"
277
+ x-gala-problem-codes:
278
+ - COMMAND_REPLAY_CONFLICT
279
+ - INVALID_SOURCE_STATE
280
+ PlatformAuthenticationRequired:
281
+ content:
282
+ application/problem+json:
283
+ examples:
284
+ AUTHENTICATION_REQUIRED:
285
+ summary: AUTHENTICATION_REQUIRED
286
+ value:
287
+ code: AUTHENTICATION_REQUIRED
288
+ correlationId: 018f0000-0000-7000-8000-000000000001
289
+ detail: See the operation contract.
290
+ errors: []
291
+ retryable: false
292
+ schemaId: urn:gala:schema:problem:2.0.0
293
+ schemaVersion: 2.0.0
294
+ status: 401
295
+ title: AUTHENTICATION_REQUIRED
296
+ type: urn:gala:problem:authentication-required
297
+ REAUTH_REQUIRED:
298
+ summary: REAUTH_REQUIRED
299
+ value:
300
+ code: REAUTH_REQUIRED
301
+ correlationId: 018f0000-0000-7000-8000-000000000001
302
+ detail: See the operation contract.
303
+ errors: []
304
+ retryable: false
305
+ schemaId: urn:gala:schema:problem:2.0.0
306
+ schemaVersion: 2.0.0
307
+ status: 401
308
+ title: REAUTH_REQUIRED
309
+ type: urn:gala:problem:reauth-required
310
+ schema:
311
+ $ref: "#/components/schemas/Problem"
312
+ description: AUTHENTICATION_REQUIRED, REAUTH_REQUIRED
313
+ headers:
314
+ Cache-Control:
315
+ $ref: "#/components/headers/CacheControlNoStore"
316
+ X-Correlation-Id:
317
+ $ref: "#/components/headers/XCorrelationId"
318
+ x-gala-problem-codes:
319
+ - AUTHENTICATION_REQUIRED
320
+ - REAUTH_REQUIRED
321
+ RequestInvalid:
322
+ content:
323
+ application/problem+json:
324
+ examples:
325
+ REQUEST_FIELD_UNKNOWN:
326
+ summary: REQUEST_FIELD_UNKNOWN
327
+ value:
328
+ code: REQUEST_FIELD_UNKNOWN
329
+ correlationId: 018f0000-0000-7000-8000-000000000001
330
+ detail: See the operation contract.
331
+ errors: []
332
+ retryable: false
333
+ schemaId: urn:gala:schema:problem:2.0.0
334
+ schemaVersion: 2.0.0
335
+ status: 400
336
+ title: REQUEST_FIELD_UNKNOWN
337
+ type: urn:gala:problem:request-field-unknown
338
+ VALIDATION_FAILED:
339
+ summary: VALIDATION_FAILED
340
+ value:
341
+ code: VALIDATION_FAILED
342
+ correlationId: 018f0000-0000-7000-8000-000000000001
343
+ detail: See the operation contract.
344
+ errors: []
345
+ retryable: false
346
+ schemaId: urn:gala:schema:problem:2.0.0
347
+ schemaVersion: 2.0.0
348
+ status: 400
349
+ title: VALIDATION_FAILED
350
+ type: urn:gala:problem:validation-failed
351
+ schema:
352
+ $ref: "#/components/schemas/Problem"
353
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
354
+ headers:
355
+ Cache-Control:
356
+ $ref: "#/components/headers/CacheControlNoStore"
357
+ X-Correlation-Id:
358
+ $ref: "#/components/headers/XCorrelationId"
359
+ x-gala-problem-codes:
360
+ - REQUEST_FIELD_UNKNOWN
361
+ - VALIDATION_FAILED
144
362
  RequestTooLarge:
145
363
  content:
146
364
  application/problem+json:
@@ -168,6 +386,60 @@ components:
168
386
  $ref: "#/components/headers/XCorrelationId"
169
387
  x-gala-problem-codes:
170
388
  - VALIDATION_FAILED
389
+ ResourceNotFound:
390
+ content:
391
+ application/problem+json:
392
+ examples:
393
+ RESOURCE_NOT_FOUND:
394
+ summary: RESOURCE_NOT_FOUND
395
+ value:
396
+ code: RESOURCE_NOT_FOUND
397
+ correlationId: 018f0000-0000-7000-8000-000000000001
398
+ detail: See the operation contract.
399
+ errors: []
400
+ retryable: false
401
+ schemaId: urn:gala:schema:problem:2.0.0
402
+ schemaVersion: 2.0.0
403
+ status: 404
404
+ title: RESOURCE_NOT_FOUND
405
+ type: urn:gala:problem:resource-not-found
406
+ schema:
407
+ $ref: "#/components/schemas/Problem"
408
+ description: RESOURCE_NOT_FOUND
409
+ headers:
410
+ Cache-Control:
411
+ $ref: "#/components/headers/CacheControlNoStore"
412
+ X-Correlation-Id:
413
+ $ref: "#/components/headers/XCorrelationId"
414
+ x-gala-problem-codes:
415
+ - RESOURCE_NOT_FOUND
416
+ StaleAggregateVersion:
417
+ content:
418
+ application/problem+json:
419
+ examples:
420
+ STALE_AGGREGATE_VERSION:
421
+ summary: STALE_AGGREGATE_VERSION
422
+ value:
423
+ code: STALE_AGGREGATE_VERSION
424
+ correlationId: 018f0000-0000-7000-8000-000000000001
425
+ detail: See the operation contract.
426
+ errors: []
427
+ retryable: false
428
+ schemaId: urn:gala:schema:problem:2.0.0
429
+ schemaVersion: 2.0.0
430
+ status: 412
431
+ title: STALE_AGGREGATE_VERSION
432
+ type: urn:gala:problem:stale-aggregate-version
433
+ schema:
434
+ $ref: "#/components/schemas/Problem"
435
+ description: STALE_AGGREGATE_VERSION
436
+ headers:
437
+ Cache-Control:
438
+ $ref: "#/components/headers/CacheControlNoStore"
439
+ X-Correlation-Id:
440
+ $ref: "#/components/headers/XCorrelationId"
441
+ x-gala-problem-codes:
442
+ - STALE_AGGREGATE_VERSION
171
443
  UnsupportedMediaType:
172
444
  content:
173
445
  application/problem+json:
@@ -308,10 +580,12 @@ components:
308
580
  description: |
309
581
  The closed catalog of themes the server can select. `default` names
310
582
  `@rathnasgala2/theme-default`, `amaze` names
311
- `@rathnasgala2/theme-amaze`, and so on.
583
+ `@rathnasgala2/theme-amaze`, `editorial` names
584
+ `@rathnasgala2/theme-editorial`, and so on.
312
585
  enum:
313
586
  - default
314
587
  - amaze
588
+ - editorial
315
589
  - flashy
316
590
  - minimal
317
591
  - zebra
@@ -2174,7 +2448,7 @@ components:
2174
2448
  catalog:
2175
2449
  items:
2176
2450
  $ref: "#/components/schemas/PublicationAppearanceCatalogEntry"
2177
- maxItems: 5
2451
+ maxItems: 6
2178
2452
  type: array
2179
2453
  consistent:
2180
2454
  type: boolean
@@ -3234,19 +3508,9 @@ components:
3234
3508
  - items
3235
3509
  - hasMore
3236
3510
  type: object
3237
- GetPlatformAdaptersResponse:
3238
- additionalProperties: false
3239
- properties:
3240
- items:
3241
- items:
3242
- $ref: "#/components/schemas/PlatformAdapter"
3243
- maxItems: 100
3244
- minItems: 0
3245
- type: array
3246
- required:
3247
- - items
3248
- type: object
3249
- GetPlatformAuditEventsResponse:
3511
+ GetPlatformAbuseCasesByCommentIdResponse:
3512
+ $ref: "#/components/schemas/PlatformAbuseCaseDetail"
3513
+ GetPlatformAbuseCasesResponse:
3250
3514
  additionalProperties: false
3251
3515
  allOf:
3252
3516
  - else:
@@ -3274,11 +3538,11 @@ components:
3274
3538
  type: boolean
3275
3539
  items:
3276
3540
  items:
3277
- $ref: "#/components/schemas/PlatformAuditEvent"
3541
+ $ref: "#/components/schemas/PlatformAbuseCaseSummary"
3278
3542
  maxItems: 100
3279
3543
  type: array
3280
3544
  nextCursor:
3281
- description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false. The length bounds constrain the string branch only.
3545
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false.
3282
3546
  maxLength: 2048
3283
3547
  minLength: 1
3284
3548
  type:
@@ -3288,134 +3552,468 @@ components:
3288
3552
  - items
3289
3553
  - hasMore
3290
3554
  type: object
3291
- GetPlatformConfigurationResponse:
3555
+ GetPlatformAdaptersResponse:
3292
3556
  additionalProperties: false
3293
3557
  properties:
3294
- families:
3558
+ items:
3295
3559
  items:
3296
- additionalProperties: false
3297
- properties:
3298
- family:
3299
- maxLength: 80
3300
- minLength: 1
3301
- type: string
3302
- keys:
3303
- items:
3304
- $ref: "#/components/schemas/PlatformConfigurationKey"
3305
- maxItems: 200
3306
- minItems: 0
3307
- type: array
3308
- required:
3309
- - family
3310
- - keys
3311
- type: object
3560
+ $ref: "#/components/schemas/PlatformAdapter"
3312
3561
  maxItems: 100
3313
3562
  minItems: 0
3314
3563
  type: array
3315
- required:
3316
- - families
3317
- type: object
3318
- GetPublicPublicationsByPublicationIdContentsByContentIdCommentsResponse:
3319
- additionalProperties: false
3320
- properties:
3321
- count:
3322
- oneOf:
3323
- - $ref: "#/components/schemas/PublicCount"
3324
- - type: "null"
3325
- items:
3326
- items:
3327
- $ref: "#/components/schemas/CommentView"
3328
- maxItems: 50
3329
- type: array
3330
- nextCursor:
3331
- maxLength: 2048
3332
- minLength: 1
3333
- type:
3334
- - string
3335
- - "null"
3336
3564
  required:
3337
3565
  - items
3338
- - nextCursor
3339
- - count
3340
- type: object
3341
- GetPublicPublicationsByPublicationIdContentsByContentIdInteractionsResponse:
3342
- additionalProperties: false
3343
- properties:
3344
- asOf:
3345
- description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
3346
- format: date-time
3347
- type: string
3348
- comments:
3349
- additionalProperties: false
3350
- properties:
3351
- allowReplies:
3352
- type: boolean
3353
- enabled:
3354
- type: boolean
3355
- maxDepth:
3356
- maximum: 4
3357
- minimum: 1
3358
- type: integer
3359
- open:
3360
- type: boolean
3361
- required:
3362
- - enabled
3363
- - open
3364
- - allowReplies
3365
- - maxDepth
3366
- type: object
3367
- reactions:
3368
- additionalProperties: false
3369
- properties:
3370
- enabled:
3371
- type: boolean
3372
- items:
3373
- items:
3374
- $ref: "#/components/schemas/PublicReactionItem"
3375
- maxItems: 17
3376
- type: array
3377
- required:
3378
- - enabled
3379
- - items
3380
- type: object
3381
- viewer:
3382
- oneOf:
3383
- - $ref: "#/components/schemas/ReaderView"
3384
- - type: "null"
3385
- required:
3386
- - reactions
3387
- - comments
3388
- - viewer
3389
- - asOf
3390
3566
  type: object
3391
- GetPublicPublicationsByPublicationIdResponse:
3392
- additionalProperties: false
3393
- properties:
3394
- name:
3395
- maxLength: 120
3396
- minLength: 1
3397
- type: string
3398
- origin:
3399
- maxLength: 255
3400
- minLength: 1
3401
- pattern: ^(?:https://[^\s]+|http://(?:localhost|127\.0\.0\.1)(?::[0-9]{1,5})?(?:/[^\s]*)?)$
3402
- type: string
3403
- publicBaseUrl:
3404
- maxLength: 2048
3405
- minLength: 1
3406
- pattern: ^(?:https://[^\s]+|http://(?:localhost|127\.0\.0\.1)(?::[0-9]{1,5})?(?:/[^\s]*)?)$
3407
- type: string
3408
- publicationId:
3409
- format: uuid
3410
- pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
3411
- type: string
3412
- required:
3413
- - publicationId
3414
- - name
3415
- - origin
3416
- - publicBaseUrl
3417
- type: object
3418
- GetSelfAuthenticatorsResponse:
3567
+ GetPlatformAuditEventsResponse:
3568
+ additionalProperties: false
3569
+ allOf:
3570
+ - else:
3571
+ properties:
3572
+ nextCursor:
3573
+ type: "null"
3574
+ if:
3575
+ properties:
3576
+ hasMore:
3577
+ not:
3578
+ enum:
3579
+ - false
3580
+ type: boolean
3581
+ x-gala-const: true
3582
+ required:
3583
+ - hasMore
3584
+ then:
3585
+ properties:
3586
+ nextCursor:
3587
+ type: string
3588
+ required:
3589
+ - nextCursor
3590
+ properties:
3591
+ hasMore:
3592
+ type: boolean
3593
+ items:
3594
+ items:
3595
+ $ref: "#/components/schemas/PlatformAuditEvent"
3596
+ maxItems: 100
3597
+ type: array
3598
+ nextCursor:
3599
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false. The length bounds constrain the string branch only.
3600
+ maxLength: 2048
3601
+ minLength: 1
3602
+ type:
3603
+ - string
3604
+ - "null"
3605
+ required:
3606
+ - items
3607
+ - hasMore
3608
+ type: object
3609
+ GetPlatformCachesResponse:
3610
+ additionalProperties: false
3611
+ properties:
3612
+ items:
3613
+ items:
3614
+ $ref: "#/components/schemas/PlatformCache"
3615
+ maxItems: 100
3616
+ type: array
3617
+ required:
3618
+ - items
3619
+ type: object
3620
+ GetPlatformConfigurationResponse:
3621
+ additionalProperties: false
3622
+ properties:
3623
+ families:
3624
+ items:
3625
+ additionalProperties: false
3626
+ properties:
3627
+ family:
3628
+ maxLength: 80
3629
+ minLength: 1
3630
+ type: string
3631
+ keys:
3632
+ items:
3633
+ $ref: "#/components/schemas/PlatformConfigurationKey"
3634
+ maxItems: 200
3635
+ minItems: 0
3636
+ type: array
3637
+ required:
3638
+ - family
3639
+ - keys
3640
+ type: object
3641
+ maxItems: 100
3642
+ minItems: 0
3643
+ type: array
3644
+ required:
3645
+ - families
3646
+ type: object
3647
+ GetPlatformOauthClientsResponse:
3648
+ additionalProperties: false
3649
+ properties:
3650
+ items:
3651
+ items:
3652
+ $ref: "#/components/schemas/PlatformOauthClient"
3653
+ maxItems: 500
3654
+ type: array
3655
+ required:
3656
+ - items
3657
+ type: object
3658
+ GetPlatformOverviewResponse:
3659
+ additionalProperties: false
3660
+ properties:
3661
+ commentDeletedByAuthor:
3662
+ format: int64
3663
+ minimum: 0
3664
+ type: integer
3665
+ commentHeldReview:
3666
+ format: int64
3667
+ minimum: 0
3668
+ type: integer
3669
+ commentRemoved:
3670
+ format: int64
3671
+ minimum: 0
3672
+ type: integer
3673
+ commentVisible:
3674
+ format: int64
3675
+ minimum: 0
3676
+ type: integer
3677
+ commentVisibleFlagged:
3678
+ format: int64
3679
+ minimum: 0
3680
+ type: integer
3681
+ commentVisiblePendingScan:
3682
+ format: int64
3683
+ minimum: 0
3684
+ type: integer
3685
+ oauthClientDraft:
3686
+ format: int64
3687
+ minimum: 0
3688
+ type: integer
3689
+ oauthClientRevoked:
3690
+ format: int64
3691
+ minimum: 0
3692
+ type: integer
3693
+ openAbuseCases:
3694
+ format: int64
3695
+ minimum: 0
3696
+ type: integer
3697
+ organizationActive:
3698
+ format: int64
3699
+ minimum: 0
3700
+ type: integer
3701
+ organizationBusiness:
3702
+ format: int64
3703
+ minimum: 0
3704
+ type: integer
3705
+ organizationClosed:
3706
+ format: int64
3707
+ minimum: 0
3708
+ type: integer
3709
+ organizationClosing:
3710
+ format: int64
3711
+ minimum: 0
3712
+ type: integer
3713
+ organizationFree:
3714
+ format: int64
3715
+ minimum: 0
3716
+ type: integer
3717
+ organizationPro:
3718
+ format: int64
3719
+ minimum: 0
3720
+ type: integer
3721
+ organizationProvisioning:
3722
+ format: int64
3723
+ minimum: 0
3724
+ type: integer
3725
+ organizationSuspended:
3726
+ format: int64
3727
+ minimum: 0
3728
+ type: integer
3729
+ personActive:
3730
+ format: int64
3731
+ minimum: 0
3732
+ type: integer
3733
+ personClosed:
3734
+ format: int64
3735
+ minimum: 0
3736
+ type: integer
3737
+ personClosing:
3738
+ format: int64
3739
+ minimum: 0
3740
+ type: integer
3741
+ personRestricted:
3742
+ format: int64
3743
+ minimum: 0
3744
+ type: integer
3745
+ personSuspended:
3746
+ format: int64
3747
+ minimum: 0
3748
+ type: integer
3749
+ publicationActive:
3750
+ format: int64
3751
+ minimum: 0
3752
+ type: integer
3753
+ publicationPaused:
3754
+ format: int64
3755
+ minimum: 0
3756
+ type: integer
3757
+ publicationProvisioning:
3758
+ format: int64
3759
+ minimum: 0
3760
+ type: integer
3761
+ publicationRetired:
3762
+ format: int64
3763
+ minimum: 0
3764
+ type: integer
3765
+ publicationRetiring:
3766
+ format: int64
3767
+ minimum: 0
3768
+ type: integer
3769
+ reactionActive:
3770
+ format: int64
3771
+ minimum: 0
3772
+ type: integer
3773
+ reactionInactive:
3774
+ format: int64
3775
+ minimum: 0
3776
+ type: integer
3777
+ webhookProcessed7d:
3778
+ format: int64
3779
+ minimum: 0
3780
+ type: integer
3781
+ webhookProcessing7d:
3782
+ format: int64
3783
+ minimum: 0
3784
+ type: integer
3785
+ webhookQuarantined7d:
3786
+ format: int64
3787
+ minimum: 0
3788
+ type: integer
3789
+ webhookReceived7d:
3790
+ format: int64
3791
+ minimum: 0
3792
+ type: integer
3793
+ required:
3794
+ - personActive
3795
+ - personSuspended
3796
+ - personRestricted
3797
+ - personClosing
3798
+ - personClosed
3799
+ - organizationProvisioning
3800
+ - organizationActive
3801
+ - organizationSuspended
3802
+ - organizationClosing
3803
+ - organizationClosed
3804
+ - organizationFree
3805
+ - organizationPro
3806
+ - organizationBusiness
3807
+ - publicationProvisioning
3808
+ - publicationActive
3809
+ - publicationPaused
3810
+ - publicationRetiring
3811
+ - publicationRetired
3812
+ - commentVisiblePendingScan
3813
+ - commentVisible
3814
+ - commentVisibleFlagged
3815
+ - commentHeldReview
3816
+ - commentRemoved
3817
+ - commentDeletedByAuthor
3818
+ - reactionActive
3819
+ - reactionInactive
3820
+ - oauthClientDraft
3821
+ - oauthClientRevoked
3822
+ - openAbuseCases
3823
+ - webhookReceived7d
3824
+ - webhookProcessing7d
3825
+ - webhookProcessed7d
3826
+ - webhookQuarantined7d
3827
+ type: object
3828
+ GetPlatformPlansResponse:
3829
+ $ref: "#/components/schemas/PlatformPlanCapacityRelease"
3830
+ GetPlatformUsersResponse:
3831
+ additionalProperties: false
3832
+ allOf:
3833
+ - else:
3834
+ properties:
3835
+ nextCursor:
3836
+ type: "null"
3837
+ if:
3838
+ properties:
3839
+ hasMore:
3840
+ not:
3841
+ enum:
3842
+ - false
3843
+ type: boolean
3844
+ x-gala-const: true
3845
+ required:
3846
+ - hasMore
3847
+ then:
3848
+ properties:
3849
+ nextCursor:
3850
+ type: string
3851
+ required:
3852
+ - nextCursor
3853
+ properties:
3854
+ hasMore:
3855
+ type: boolean
3856
+ items:
3857
+ items:
3858
+ $ref: "#/components/schemas/PlatformUser"
3859
+ maxItems: 100
3860
+ type: array
3861
+ nextCursor:
3862
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false.
3863
+ maxLength: 2048
3864
+ minLength: 1
3865
+ type:
3866
+ - string
3867
+ - "null"
3868
+ required:
3869
+ - items
3870
+ - hasMore
3871
+ type: object
3872
+ GetPlatformWebhookEventsByEventIdResponse:
3873
+ $ref: "#/components/schemas/PlatformWebhookEvent"
3874
+ GetPlatformWebhookEventsResponse:
3875
+ additionalProperties: false
3876
+ allOf:
3877
+ - else:
3878
+ properties:
3879
+ nextCursor:
3880
+ type: "null"
3881
+ if:
3882
+ properties:
3883
+ hasMore:
3884
+ not:
3885
+ enum:
3886
+ - false
3887
+ type: boolean
3888
+ x-gala-const: true
3889
+ required:
3890
+ - hasMore
3891
+ then:
3892
+ properties:
3893
+ nextCursor:
3894
+ type: string
3895
+ required:
3896
+ - nextCursor
3897
+ properties:
3898
+ hasMore:
3899
+ type: boolean
3900
+ items:
3901
+ items:
3902
+ $ref: "#/components/schemas/PlatformWebhookEvent"
3903
+ maxItems: 100
3904
+ type: array
3905
+ nextCursor:
3906
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false.
3907
+ maxLength: 2048
3908
+ minLength: 1
3909
+ type:
3910
+ - string
3911
+ - "null"
3912
+ required:
3913
+ - items
3914
+ - hasMore
3915
+ type: object
3916
+ GetPublicPublicationsByPublicationIdContentsByContentIdCommentsResponse:
3917
+ additionalProperties: false
3918
+ properties:
3919
+ count:
3920
+ oneOf:
3921
+ - $ref: "#/components/schemas/PublicCount"
3922
+ - type: "null"
3923
+ items:
3924
+ items:
3925
+ $ref: "#/components/schemas/CommentView"
3926
+ maxItems: 50
3927
+ type: array
3928
+ nextCursor:
3929
+ maxLength: 2048
3930
+ minLength: 1
3931
+ type:
3932
+ - string
3933
+ - "null"
3934
+ required:
3935
+ - items
3936
+ - nextCursor
3937
+ - count
3938
+ type: object
3939
+ GetPublicPublicationsByPublicationIdContentsByContentIdInteractionsResponse:
3940
+ additionalProperties: false
3941
+ properties:
3942
+ asOf:
3943
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
3944
+ format: date-time
3945
+ type: string
3946
+ comments:
3947
+ additionalProperties: false
3948
+ properties:
3949
+ allowReplies:
3950
+ type: boolean
3951
+ enabled:
3952
+ type: boolean
3953
+ maxDepth:
3954
+ maximum: 4
3955
+ minimum: 1
3956
+ type: integer
3957
+ open:
3958
+ type: boolean
3959
+ required:
3960
+ - enabled
3961
+ - open
3962
+ - allowReplies
3963
+ - maxDepth
3964
+ type: object
3965
+ reactions:
3966
+ additionalProperties: false
3967
+ properties:
3968
+ enabled:
3969
+ type: boolean
3970
+ items:
3971
+ items:
3972
+ $ref: "#/components/schemas/PublicReactionItem"
3973
+ maxItems: 17
3974
+ type: array
3975
+ required:
3976
+ - enabled
3977
+ - items
3978
+ type: object
3979
+ viewer:
3980
+ oneOf:
3981
+ - $ref: "#/components/schemas/ReaderView"
3982
+ - type: "null"
3983
+ required:
3984
+ - reactions
3985
+ - comments
3986
+ - viewer
3987
+ - asOf
3988
+ type: object
3989
+ GetPublicPublicationsByPublicationIdResponse:
3990
+ additionalProperties: false
3991
+ properties:
3992
+ name:
3993
+ maxLength: 120
3994
+ minLength: 1
3995
+ type: string
3996
+ origin:
3997
+ maxLength: 255
3998
+ minLength: 1
3999
+ pattern: ^(?:https://[^\s]+|http://(?:localhost|127\.0\.0\.1)(?::[0-9]{1,5})?(?:/[^\s]*)?)$
4000
+ type: string
4001
+ publicBaseUrl:
4002
+ maxLength: 2048
4003
+ minLength: 1
4004
+ pattern: ^(?:https://[^\s]+|http://(?:localhost|127\.0\.0\.1)(?::[0-9]{1,5})?(?:/[^\s]*)?)$
4005
+ type: string
4006
+ publicationId:
4007
+ format: uuid
4008
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
4009
+ type: string
4010
+ required:
4011
+ - publicationId
4012
+ - name
4013
+ - origin
4014
+ - publicBaseUrl
4015
+ type: object
4016
+ GetSelfAuthenticatorsResponse:
3419
4017
  additionalProperties: false
3420
4018
  allOf:
3421
4019
  - else:
@@ -5771,6 +6369,114 @@ components:
5771
6369
  - label
5772
6370
  - createdAt
5773
6371
  type: object
6372
+ PlatformAbuseCaseDetail:
6373
+ additionalProperties: false
6374
+ description: Review evidence for one abuse case. Report reasons include only open reports and are sorted and distinct; reporter identities and notes are never exposed.
6375
+ properties:
6376
+ body:
6377
+ maxLength: 20000
6378
+ type: string
6379
+ commentId:
6380
+ format: uuid
6381
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6382
+ type: string
6383
+ commentState:
6384
+ $ref: "#/components/schemas/CommentInternalState"
6385
+ contentId:
6386
+ format: uuid
6387
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6388
+ type: string
6389
+ firstReportedAt:
6390
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6391
+ lastReportedAt:
6392
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6393
+ openReportCount:
6394
+ format: int64
6395
+ minimum: 0
6396
+ type: integer
6397
+ organizationId:
6398
+ format: uuid
6399
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6400
+ type: string
6401
+ parentId:
6402
+ oneOf:
6403
+ - format: uuid
6404
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6405
+ type: string
6406
+ - type: "null"
6407
+ publicationId:
6408
+ format: uuid
6409
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6410
+ type: string
6411
+ reportReasons:
6412
+ items:
6413
+ $ref: "#/components/schemas/ReaderReportReason"
6414
+ maxItems: 8
6415
+ type: array
6416
+ uniqueItems: true
6417
+ totalReportCount:
6418
+ format: int64
6419
+ minimum: 0
6420
+ type: integer
6421
+ updatedAt:
6422
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6423
+ required:
6424
+ - commentId
6425
+ - organizationId
6426
+ - publicationId
6427
+ - commentState
6428
+ - openReportCount
6429
+ - totalReportCount
6430
+ - firstReportedAt
6431
+ - lastReportedAt
6432
+ - updatedAt
6433
+ - body
6434
+ - contentId
6435
+ - parentId
6436
+ - reportReasons
6437
+ type: object
6438
+ PlatformAbuseCaseSummary:
6439
+ additionalProperties: false
6440
+ properties:
6441
+ commentId:
6442
+ format: uuid
6443
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6444
+ type: string
6445
+ commentState:
6446
+ $ref: "#/components/schemas/CommentInternalState"
6447
+ firstReportedAt:
6448
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6449
+ lastReportedAt:
6450
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6451
+ openReportCount:
6452
+ format: int64
6453
+ minimum: 0
6454
+ type: integer
6455
+ organizationId:
6456
+ format: uuid
6457
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6458
+ type: string
6459
+ publicationId:
6460
+ format: uuid
6461
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6462
+ type: string
6463
+ totalReportCount:
6464
+ format: int64
6465
+ minimum: 0
6466
+ type: integer
6467
+ updatedAt:
6468
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6469
+ required:
6470
+ - commentId
6471
+ - organizationId
6472
+ - publicationId
6473
+ - commentState
6474
+ - openReportCount
6475
+ - totalReportCount
6476
+ - firstReportedAt
6477
+ - lastReportedAt
6478
+ - updatedAt
6479
+ type: object
5774
6480
  PlatformAdapter:
5775
6481
  additionalProperties: false
5776
6482
  description: One admitted adapter (publish toolchain release or provider adapter). Today every admitted row reads `ADMITTED`; `SUSPENDED` and `SUPERSEDED` are reserved for the suspend/restore and supersession flows.
@@ -5871,6 +6577,49 @@ components:
5871
6577
  - outcomeCode
5872
6578
  - correlationId
5873
6579
  type: object
6580
+ PlatformCache:
6581
+ additionalProperties: false
6582
+ properties:
6583
+ epoch:
6584
+ format: int64
6585
+ minimum: 0
6586
+ type: integer
6587
+ localEntryCount:
6588
+ format: int64
6589
+ minimum: 0
6590
+ type: integer
6591
+ name:
6592
+ enum:
6593
+ - GITHUB_INSTALLATION_TOKEN
6594
+ - GITHUB_REPOSITORY_METADATA
6595
+ - GITHUB_REPOSITORY_CONTENT
6596
+ type: string
6597
+ ttlSeconds:
6598
+ format: int64
6599
+ minimum: 1
6600
+ type: integer
6601
+ updatedAt:
6602
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6603
+ updatedByPersonId:
6604
+ description: The last evicting operator, or null before the cache's first eviction.
6605
+ oneOf:
6606
+ - format: uuid
6607
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6608
+ type: string
6609
+ - type: "null"
6610
+ version:
6611
+ format: int64
6612
+ minimum: 0
6613
+ type: integer
6614
+ required:
6615
+ - name
6616
+ - epoch
6617
+ - localEntryCount
6618
+ - ttlSeconds
6619
+ - updatedByPersonId
6620
+ - updatedAt
6621
+ - version
6622
+ type: object
5874
6623
  PlatformConfigurationKey:
5875
6624
  additionalProperties: false
5876
6625
  description: One configuration value as canonical text (`20`, `false`, `PT5M`); `source` says whether it is the compiled catalog default or an environment override.
@@ -5919,6 +6668,361 @@ components:
5919
6668
  - source
5920
6669
  - description
5921
6670
  type: object
6671
+ PlatformOauthClient:
6672
+ additionalProperties: false
6673
+ properties:
6674
+ accessTokenTtlSeconds:
6675
+ maximum: 86400
6676
+ minimum: 300
6677
+ type: integer
6678
+ clientId:
6679
+ maxLength: 160
6680
+ minLength: 24
6681
+ pattern: ^[A-Za-z0-9._~-]+$
6682
+ type: string
6683
+ clientType:
6684
+ $ref: "#/components/schemas/PlatformOauthClientType"
6685
+ createdAt:
6686
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6687
+ createdByPersonId:
6688
+ format: uuid
6689
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6690
+ type: string
6691
+ description:
6692
+ oneOf:
6693
+ - $ref: "#/components/schemas/PlatformOauthClientDescriptionText"
6694
+ - type: "null"
6695
+ grantTypes:
6696
+ items:
6697
+ $ref: "#/components/schemas/PlatformOauthGrantType"
6698
+ maxItems: 3
6699
+ minItems: 1
6700
+ type: array
6701
+ uniqueItems: true
6702
+ homepageUri:
6703
+ oneOf:
6704
+ - $ref: "#/components/schemas/PlatformOauthClientHttpsUri"
6705
+ - type: "null"
6706
+ id:
6707
+ format: uuid
6708
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6709
+ type: string
6710
+ logoUri:
6711
+ oneOf:
6712
+ - $ref: "#/components/schemas/PlatformOauthClientHttpsUri"
6713
+ - type: "null"
6714
+ name:
6715
+ maxLength: 120
6716
+ minLength: 1
6717
+ type: string
6718
+ redirectUris:
6719
+ items:
6720
+ format: uri
6721
+ maxLength: 2048
6722
+ minLength: 8
6723
+ pattern: ^(?:https://[^/\s#]+/|http://(?:localhost|127\.0\.0\.1|\[::1\])(?::[0-9]+)?/)[^\s#]*$
6724
+ type: string
6725
+ maxItems: 20
6726
+ type: array
6727
+ uniqueItems: true
6728
+ revokedAt:
6729
+ oneOf:
6730
+ - $ref: "#/components/schemas/PortableProblemRfc3339"
6731
+ - type: "null"
6732
+ scopes:
6733
+ items:
6734
+ $ref: "#/components/schemas/PlatformOauthScope"
6735
+ maxItems: 3
6736
+ minItems: 1
6737
+ type: array
6738
+ uniqueItems: true
6739
+ state:
6740
+ enum:
6741
+ - DRAFT
6742
+ - REVOKED
6743
+ type: string
6744
+ updatedAt:
6745
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6746
+ version:
6747
+ format: int64
6748
+ minimum: 0
6749
+ type: integer
6750
+ required:
6751
+ - id
6752
+ - clientId
6753
+ - name
6754
+ - description
6755
+ - clientType
6756
+ - grantTypes
6757
+ - redirectUris
6758
+ - scopes
6759
+ - accessTokenTtlSeconds
6760
+ - logoUri
6761
+ - homepageUri
6762
+ - state
6763
+ - createdByPersonId
6764
+ - createdAt
6765
+ - updatedAt
6766
+ - revokedAt
6767
+ - version
6768
+ type: object
6769
+ PlatformOauthClientDescriptionText:
6770
+ maxLength: 1000
6771
+ minLength: 1
6772
+ type: string
6773
+ PlatformOauthClientHttpsUri:
6774
+ format: uri
6775
+ maxLength: 2048
6776
+ minLength: 8
6777
+ pattern: ^https://[^\s#]+$
6778
+ type: string
6779
+ PlatformOauthClientType:
6780
+ enum:
6781
+ - PUBLIC
6782
+ - CONFIDENTIAL
6783
+ type: string
6784
+ PlatformOauthGrantType:
6785
+ enum:
6786
+ - AUTHORIZATION_CODE
6787
+ - REFRESH_TOKEN
6788
+ - CLIENT_CREDENTIALS
6789
+ type: string
6790
+ PlatformOauthScope:
6791
+ enum:
6792
+ - read
6793
+ - write
6794
+ - metrics:read
6795
+ type: string
6796
+ PlatformOperatorReasonCode:
6797
+ description: Non-sensitive operator reason code recorded in the audit event.
6798
+ maxLength: 80
6799
+ minLength: 1
6800
+ pattern: ^[A-Z][A-Z0-9_]{0,79}$
6801
+ type: string
6802
+ PlatformPersonState:
6803
+ enum:
6804
+ - ACTIVE
6805
+ - SUSPENDED
6806
+ - RESTRICTED
6807
+ - CLOSING
6808
+ - CLOSED
6809
+ type: string
6810
+ PlatformPlan:
6811
+ additionalProperties: false
6812
+ properties:
6813
+ planKey:
6814
+ $ref: "#/components/schemas/PlatformPlanKey"
6815
+ publicationLimit:
6816
+ format: int64
6817
+ minimum: 1
6818
+ type: integer
6819
+ required:
6820
+ - planKey
6821
+ - publicationLimit
6822
+ type: object
6823
+ PlatformPlanCapacityRelease:
6824
+ additionalProperties: false
6825
+ properties:
6826
+ effectiveAt:
6827
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6828
+ items:
6829
+ allOf:
6830
+ - contains:
6831
+ properties:
6832
+ planKey:
6833
+ pattern: ^FREE$
6834
+ type: string
6835
+ x-gala-const: FREE
6836
+ required:
6837
+ - planKey
6838
+ type: object
6839
+ maxContains: 1
6840
+ minContains: 1
6841
+ - contains:
6842
+ properties:
6843
+ planKey:
6844
+ pattern: ^PRO$
6845
+ type: string
6846
+ x-gala-const: PRO
6847
+ required:
6848
+ - planKey
6849
+ type: object
6850
+ maxContains: 1
6851
+ minContains: 1
6852
+ - contains:
6853
+ properties:
6854
+ planKey:
6855
+ pattern: ^BUSINESS$
6856
+ type: string
6857
+ x-gala-const: BUSINESS
6858
+ required:
6859
+ - planKey
6860
+ type: object
6861
+ maxContains: 1
6862
+ minContains: 1
6863
+ items:
6864
+ $ref: "#/components/schemas/PlatformPlan"
6865
+ maxItems: 3
6866
+ minItems: 3
6867
+ type: array
6868
+ releaseId:
6869
+ format: uuid
6870
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6871
+ type: string
6872
+ releaseVersion:
6873
+ format: int64
6874
+ minimum: 1
6875
+ type: integer
6876
+ state:
6877
+ pattern: ^ACTIVE$
6878
+ type: string
6879
+ x-gala-const: ACTIVE
6880
+ updatedAt:
6881
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6882
+ required:
6883
+ - releaseId
6884
+ - releaseVersion
6885
+ - state
6886
+ - effectiveAt
6887
+ - updatedAt
6888
+ - items
6889
+ type: object
6890
+ PlatformPlanKey:
6891
+ enum:
6892
+ - FREE
6893
+ - PRO
6894
+ - BUSINESS
6895
+ type: string
6896
+ PlatformUser:
6897
+ additionalProperties: false
6898
+ properties:
6899
+ createdAt:
6900
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6901
+ displayName:
6902
+ maxLength: 255
6903
+ type:
6904
+ - string
6905
+ - "null"
6906
+ lastSignInAt:
6907
+ oneOf:
6908
+ - $ref: "#/components/schemas/PortableProblemRfc3339"
6909
+ - type: "null"
6910
+ login:
6911
+ maxLength: 80
6912
+ minLength: 1
6913
+ type:
6914
+ - string
6915
+ - "null"
6916
+ personId:
6917
+ format: uuid
6918
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6919
+ type: string
6920
+ planTiers:
6921
+ items:
6922
+ $ref: "#/components/schemas/PlatformPlanKey"
6923
+ maxItems: 3
6924
+ type: array
6925
+ uniqueItems: true
6926
+ publicationCount:
6927
+ format: int64
6928
+ minimum: 0
6929
+ type: integer
6930
+ state:
6931
+ $ref: "#/components/schemas/PlatformPersonState"
6932
+ required:
6933
+ - personId
6934
+ - state
6935
+ - displayName
6936
+ - login
6937
+ - createdAt
6938
+ - lastSignInAt
6939
+ - publicationCount
6940
+ - planTiers
6941
+ type: object
6942
+ PlatformWebhookEvent:
6943
+ additionalProperties: false
6944
+ description: Redacted webhook inbox metadata and immutable routing coordinates. The request body and payload digest are deliberately never exposed.
6945
+ properties:
6946
+ attemptCount:
6947
+ minimum: 0
6948
+ type: integer
6949
+ attemptLimit:
6950
+ minimum: 1
6951
+ type: integer
6952
+ eventId:
6953
+ format: uuid
6954
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6955
+ type: string
6956
+ eventType:
6957
+ $ref: "#/components/schemas/PlatformWebhookEventType"
6958
+ firstSeenAt:
6959
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6960
+ organizationId:
6961
+ format: uuid
6962
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
6963
+ type: string
6964
+ processedAt:
6965
+ oneOf:
6966
+ - $ref: "#/components/schemas/PortableProblemRfc3339"
6967
+ - type: "null"
6968
+ providerRepositoryId:
6969
+ format: int64
6970
+ minimum: 1
6971
+ type:
6972
+ - integer
6973
+ - "null"
6974
+ pullRequestNumber:
6975
+ format: int64
6976
+ minimum: 1
6977
+ type:
6978
+ - integer
6979
+ - "null"
6980
+ resultCode:
6981
+ maxLength: 120
6982
+ minLength: 1
6983
+ pattern: ^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$
6984
+ type:
6985
+ - string
6986
+ - "null"
6987
+ status:
6988
+ $ref: "#/components/schemas/PlatformWebhookProcessingStatus"
6989
+ updatedAt:
6990
+ $ref: "#/components/schemas/PortableProblemRfc3339"
6991
+ workflowRunId:
6992
+ format: int64
6993
+ minimum: 1
6994
+ type:
6995
+ - integer
6996
+ - "null"
6997
+ required:
6998
+ - eventId
6999
+ - organizationId
7000
+ - eventType
7001
+ - status
7002
+ - providerRepositoryId
7003
+ - pullRequestNumber
7004
+ - workflowRunId
7005
+ - attemptCount
7006
+ - attemptLimit
7007
+ - resultCode
7008
+ - firstSeenAt
7009
+ - processedAt
7010
+ - updatedAt
7011
+ type: object
7012
+ PlatformWebhookEventType:
7013
+ enum:
7014
+ - PULL_REQUEST
7015
+ - PUSH
7016
+ - WORKFLOW_RUN
7017
+ - OTHER
7018
+ type: string
7019
+ PlatformWebhookProcessingStatus:
7020
+ enum:
7021
+ - RECEIVED
7022
+ - PROCESSING
7023
+ - PROCESSED
7024
+ - QUARANTINED
7025
+ type: string
5922
7026
  PortableAppearanceAttribution:
5923
7027
  additionalProperties: false
5924
7028
  description: 'Footer attribution. `showMadeWith: false` omits the "Made with Galascribe" mark; an absent `attribution` means it is shown.'
@@ -7041,6 +8145,7 @@ components:
7041
8145
  enum:
7042
8146
  - "@rathnasgala2/theme-default"
7043
8147
  - "@rathnasgala2/theme-amaze"
8148
+ - "@rathnasgala2/theme-editorial"
7044
8149
  - "@rathnasgala2/theme-flashy"
7045
8150
  - "@rathnasgala2/theme-minimal"
7046
8151
  - "@rathnasgala2/theme-zebra"
@@ -13520,6 +14625,180 @@ components:
13520
14625
  - name
13521
14626
  - slug
13522
14627
  type: object
14628
+ PostPlatformAbuseCasesByCommentIdDecideRequest:
14629
+ additionalProperties: false
14630
+ properties:
14631
+ decision:
14632
+ $ref: "#/components/schemas/ModerationDecision"
14633
+ note:
14634
+ maxLength: 1000
14635
+ type:
14636
+ - string
14637
+ - "null"
14638
+ reason:
14639
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
14640
+ required:
14641
+ - decision
14642
+ - note
14643
+ - reason
14644
+ type: object
14645
+ PostPlatformAbuseCasesByCommentIdDecideResponse:
14646
+ $ref: "#/components/schemas/PlatformAbuseCaseDetail"
14647
+ PostPlatformCachesByCacheIdEvictRequest:
14648
+ additionalProperties: false
14649
+ properties:
14650
+ reason:
14651
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
14652
+ required:
14653
+ - reason
14654
+ type: object
14655
+ PostPlatformCachesByCacheIdEvictResponse:
14656
+ $ref: "#/components/schemas/PlatformCache"
14657
+ PostPlatformOauthClientsByOauthClientIdRevokeRequest:
14658
+ additionalProperties: false
14659
+ properties:
14660
+ reason:
14661
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
14662
+ required:
14663
+ - reason
14664
+ type: object
14665
+ PostPlatformOauthClientsByOauthClientIdRevokeResponse:
14666
+ $ref: "#/components/schemas/PlatformOauthClient"
14667
+ PostPlatformOauthClientsRequest:
14668
+ additionalProperties: false
14669
+ allOf:
14670
+ - else:
14671
+ properties:
14672
+ redirectUris:
14673
+ maxItems: 0
14674
+ if:
14675
+ properties:
14676
+ grantTypes:
14677
+ contains:
14678
+ pattern: ^AUTHORIZATION_CODE$
14679
+ type: string
14680
+ x-gala-const: AUTHORIZATION_CODE
14681
+ required:
14682
+ - grantTypes
14683
+ then:
14684
+ properties:
14685
+ redirectUris:
14686
+ minItems: 1
14687
+ - if:
14688
+ properties:
14689
+ grantTypes:
14690
+ contains:
14691
+ pattern: ^REFRESH_TOKEN$
14692
+ type: string
14693
+ x-gala-const: REFRESH_TOKEN
14694
+ required:
14695
+ - grantTypes
14696
+ then:
14697
+ properties:
14698
+ grantTypes:
14699
+ contains:
14700
+ pattern: ^AUTHORIZATION_CODE$
14701
+ type: string
14702
+ x-gala-const: AUTHORIZATION_CODE
14703
+ - if:
14704
+ properties:
14705
+ clientType:
14706
+ pattern: ^PUBLIC$
14707
+ type: string
14708
+ x-gala-const: PUBLIC
14709
+ required:
14710
+ - clientType
14711
+ then:
14712
+ properties:
14713
+ grantTypes:
14714
+ not:
14715
+ contains:
14716
+ pattern: ^CLIENT_CREDENTIALS$
14717
+ type: string
14718
+ x-gala-const: CLIENT_CREDENTIALS
14719
+ properties:
14720
+ accessTokenTtlSeconds:
14721
+ maximum: 86400
14722
+ minimum: 300
14723
+ type: integer
14724
+ clientType:
14725
+ $ref: "#/components/schemas/PlatformOauthClientType"
14726
+ description:
14727
+ maxLength: 1000
14728
+ minLength: 1
14729
+ type:
14730
+ - string
14731
+ - "null"
14732
+ grantTypes:
14733
+ items:
14734
+ $ref: "#/components/schemas/PlatformOauthGrantType"
14735
+ maxItems: 3
14736
+ minItems: 1
14737
+ type: array
14738
+ uniqueItems: true
14739
+ homepageUri:
14740
+ format: uri
14741
+ maxLength: 2048
14742
+ minLength: 8
14743
+ pattern: ^https://[^\s#]+$
14744
+ type:
14745
+ - string
14746
+ - "null"
14747
+ logoUri:
14748
+ format: uri
14749
+ maxLength: 2048
14750
+ minLength: 8
14751
+ pattern: ^https://[^\s#]+$
14752
+ type:
14753
+ - string
14754
+ - "null"
14755
+ name:
14756
+ maxLength: 120
14757
+ minLength: 1
14758
+ type: string
14759
+ reason:
14760
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
14761
+ redirectUris:
14762
+ items:
14763
+ format: uri
14764
+ maxLength: 2048
14765
+ minLength: 8
14766
+ pattern: ^(?:https://[^/\s#]+/|http://(?:localhost|127\.0\.0\.1|\[::1\])(?::[0-9]+)?/)[^\s#]*$
14767
+ type: string
14768
+ maxItems: 20
14769
+ type: array
14770
+ uniqueItems: true
14771
+ scopes:
14772
+ items:
14773
+ $ref: "#/components/schemas/PlatformOauthScope"
14774
+ maxItems: 3
14775
+ minItems: 1
14776
+ type: array
14777
+ uniqueItems: true
14778
+ required:
14779
+ - name
14780
+ - clientType
14781
+ - grantTypes
14782
+ - redirectUris
14783
+ - scopes
14784
+ - accessTokenTtlSeconds
14785
+ - reason
14786
+ type: object
14787
+ PostPlatformOauthClientsResponse:
14788
+ additionalProperties: false
14789
+ description: A CONFIDENTIAL client's secret is disclosed only by the first successful create response. PUBLIC clients and committed idempotent retries return `clientSecret` null or omitted because plaintext secrets are not stored. It is never returned by a later read.
14790
+ properties:
14791
+ client:
14792
+ $ref: "#/components/schemas/PlatformOauthClient"
14793
+ clientSecret:
14794
+ maxLength: 512
14795
+ minLength: 32
14796
+ type:
14797
+ - string
14798
+ - "null"
14799
+ required:
14800
+ - client
14801
+ type: object
13523
14802
  PostPublicCommentsByCommentIdAppealsRequest:
13524
14803
  additionalProperties: false
13525
14804
  properties:
@@ -15022,6 +16301,21 @@ components:
15022
16301
  required:
15023
16302
  - change
15024
16303
  type: object
16304
+ PutPlatformPlansByPlanKeyRequest:
16305
+ additionalProperties: false
16306
+ properties:
16307
+ publicationLimit:
16308
+ format: int64
16309
+ minimum: 1
16310
+ type: integer
16311
+ reason:
16312
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
16313
+ required:
16314
+ - publicationLimit
16315
+ - reason
16316
+ type: object
16317
+ PutPlatformPlansByPlanKeyResponse:
16318
+ $ref: "#/components/schemas/PlatformPlanCapacityRelease"
15025
16319
  PutPublicPublicationsByPublicationIdContentsByContentIdReactionsByReactionKeyResponse:
15026
16320
  additionalProperties: false
15027
16321
  properties:
@@ -15655,6 +16949,7 @@ components:
15655
16949
  enum:
15656
16950
  - "@rathnasgala2/theme-default"
15657
16951
  - "@rathnasgala2/theme-amaze"
16952
+ - "@rathnasgala2/theme-editorial"
15658
16953
  - "@rathnasgala2/theme-flashy"
15659
16954
  - "@rathnasgala2/theme-minimal"
15660
16955
  - "@rathnasgala2/theme-zebra"
@@ -27712,11 +29007,13 @@ paths:
27712
29007
  Reads this publication's theme selection at the linked repository's
27713
29008
  current main branch head: `selected` from `gala/appearance.json`
27714
29009
  (`theme`, `colorMode.default`), `built` from the `theme` block of
27715
- `gala.lock.json`, and the closed five-theme `catalog` the server can
29010
+ `gala.lock.json`, and the closed six-theme `catalog` the server can
27716
29011
  write. `selected.themeId` and `built.themeId` are `null` when that
27717
29012
  file names a package outside the catalog ("Custom theme").
27718
- `consistent` is true when `selected` and `built` name the same
27719
- package. `setUp` matches `GET .../repository/setup`'s `state`.
29013
+ `consistent` is true when a catalog theme's selected contract range
29014
+ and locked exact version equal the catalog release; for a custom
29015
+ theme, package equality is sufficient. `setUp` matches
29016
+ `GET .../repository/setup`'s `state`.
27720
29017
  `openChange` names an existing not-yet-published repository change
27721
29018
  of this publication that touches appearance, or is `null`, so a
27722
29019
  client links to it instead of planning a second one. The browser
@@ -27752,20 +29049,45 @@ paths:
27752
29049
  built:
27753
29050
  themeId: default
27754
29051
  themePackage: "@rathnasgala2/theme-default"
27755
- version: 2.0.0
29052
+ version: 4.0.0
27756
29053
  catalog:
27757
- - description: The calm default look.
29054
+ - description: A newspaper-style home and issue layout for publication-led creators.
27758
29055
  displayName: Default
27759
29056
  package: "@rathnasgala2/theme-default"
27760
29057
  themeId: default
27761
- version: 2.0.0
29058
+ version: 4.0.0
29059
+ - description: A serif-led magazine composition for editorial publications.
29060
+ displayName: Amaze
29061
+ package: "@rathnasgala2/theme-amaze"
29062
+ themeId: amaze
29063
+ version: 4.0.0
29064
+ - description: A magazine-style publication with distinct home, article, and author layouts.
29065
+ displayName: Editorial
29066
+ package: "@rathnasgala2/theme-editorial"
29067
+ themeId: editorial
29068
+ version: 4.0.0
29069
+ - description: An image-led gallery and full-bleed article composition.
29070
+ displayName: Flashy
29071
+ package: "@rathnasgala2/theme-flashy"
29072
+ themeId: flashy
29073
+ version: 4.0.0
29074
+ - description: A quiet chronological home and prose-first reading experience.
29075
+ displayName: Minimal
29076
+ package: "@rathnasgala2/theme-minimal"
29077
+ themeId: minimal
29078
+ version: 4.0.0
29079
+ - description: A compact topic index and technical article layout for developers.
29080
+ displayName: Zebra
29081
+ package: "@rathnasgala2/theme-zebra"
29082
+ themeId: zebra
29083
+ version: 4.0.0
27762
29084
  consistent: true
27763
29085
  head: sha1:0000000000000000000000000000000000000000
27764
29086
  openChange: null
27765
29087
  selected:
27766
29088
  colorModeDefault: system
27767
29089
  themeId: default
27768
- themePackage: "@rathnasgala2/theme-default@^2.0.0"
29090
+ themePackage: "@rathnasgala2/theme-default@^4.0.0"
27769
29091
  setUp: true
27770
29092
  schema:
27771
29093
  $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdAppearanceResponse"
@@ -28809,7 +30131,7 @@ paths:
28809
30131
  - displayName: Example Author
28810
30132
  id: 018f0000-0000-7000-8000-000000000001
28811
30133
  defaultLanguage: en
28812
- theme: "@rathnasgala2/theme-default@^2.0.0"
30134
+ theme: "@rathnasgala2/theme-default@^4.0.0"
28813
30135
  setUp: true
28814
30136
  schema:
28815
30137
  $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentResponse"
@@ -45718,6 +47040,258 @@ paths:
45718
47040
  - NONE
45719
47041
  x-gala-success-category: query
45720
47042
  x-gala-tenant-scope: ORGANIZATION_PATH
47043
+ /v2/platform/abuse-cases:
47044
+ get:
47045
+ description: |
47046
+ Operators only, with recent authentication. Keyset-paged moderation
47047
+ cases across every organization. Rows expose only identifiers, state,
47048
+ report counts, and ordering instants; comment bodies and report reasons
47049
+ are available only from the detail operation.
47050
+ operationId: getPlatformAbuseCases
47051
+ parameters:
47052
+ - $ref: "#/components/parameters/XCorrelationId"
47053
+ - $ref: "#/components/parameters/Cursor"
47054
+ - $ref: "#/components/parameters/Limit"
47055
+ responses:
47056
+ "200":
47057
+ content:
47058
+ application/json:
47059
+ examples:
47060
+ nominal:
47061
+ summary: Nominal successful response
47062
+ value:
47063
+ hasMore: false
47064
+ items:
47065
+ - commentId: 018f0000-0000-7000-8000-000000000003
47066
+ commentState: VISIBLE_PENDING_SCAN
47067
+ firstReportedAt: "2026-10-10T10:30:00.000Z"
47068
+ lastReportedAt: "2026-10-10T11:00:00.000Z"
47069
+ openReportCount: 1
47070
+ organizationId: 018f0000-0000-7000-8000-000000000001
47071
+ publicationId: 018f0000-0000-7000-8000-000000000002
47072
+ totalReportCount: 1
47073
+ updatedAt: "2026-10-10T11:00:00.000Z"
47074
+ nextCursor: null
47075
+ schema:
47076
+ $ref: "#/components/schemas/GetPlatformAbuseCasesResponse"
47077
+ description: list platform abuse cases succeeded
47078
+ headers:
47079
+ Cache-Control:
47080
+ $ref: "#/components/headers/CacheControlNoStore"
47081
+ X-Correlation-Id:
47082
+ $ref: "#/components/headers/XCorrelationId"
47083
+ "400":
47084
+ $ref: "#/components/responses/ValidationFailed"
47085
+ "401":
47086
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47087
+ "403":
47088
+ $ref: "#/components/responses/AuthorizationDenied"
47089
+ security:
47090
+ - browserSession: []
47091
+ summary: list platform abuse cases
47092
+ tags:
47093
+ - platform
47094
+ x-gala-activation-gate: MVP
47095
+ x-gala-activation-guards:
47096
+ - NONE
47097
+ x-gala-capability-key: platform.abuse.view
47098
+ x-gala-concurrency: none
47099
+ x-gala-conditional-capabilities: []
47100
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47101
+ x-gala-nullability: required-and-nullable-are-explicit
47102
+ x-gala-purpose: list platform abuse cases
47103
+ x-gala-reachable-problems:
47104
+ - AUTHENTICATION_REQUIRED
47105
+ - AUTHORIZATION_DENIED
47106
+ - REAUTH_REQUIRED
47107
+ - VALIDATION_FAILED
47108
+ x-gala-replay-identity: safe-query
47109
+ x-gala-state-guards:
47110
+ - NONE
47111
+ x-gala-success-category: query
47112
+ x-gala-tenant-scope: NONE
47113
+ /v2/platform/abuse-cases/{commentId}:
47114
+ get:
47115
+ description: |
47116
+ Operators only, with recent authentication. Reads one cross-platform
47117
+ moderation case by stable comment id, including the comment body,
47118
+ content and parent coordinates, and sorted distinct reasons from open
47119
+ reports. Reporter identities and report notes are never exposed.
47120
+ operationId: getPlatformAbuseCasesByCommentId
47121
+ parameters:
47122
+ - $ref: "#/components/parameters/XCorrelationId"
47123
+ - example: 018f0000-0000-7000-8000-000000000001
47124
+ in: path
47125
+ name: commentId
47126
+ required: true
47127
+ schema:
47128
+ format: uuid
47129
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
47130
+ type: string
47131
+ responses:
47132
+ "200":
47133
+ content:
47134
+ application/json:
47135
+ examples:
47136
+ nominal:
47137
+ summary: Nominal successful response
47138
+ value:
47139
+ body: Great article.
47140
+ commentId: 018f0000-0000-7000-8000-000000000003
47141
+ commentState: VISIBLE_PENDING_SCAN
47142
+ contentId: 018f0000-0000-7000-8000-000000000004
47143
+ firstReportedAt: "2026-10-10T10:30:00.000Z"
47144
+ lastReportedAt: "2026-10-10T11:00:00.000Z"
47145
+ openReportCount: 1
47146
+ organizationId: 018f0000-0000-7000-8000-000000000001
47147
+ parentId: null
47148
+ publicationId: 018f0000-0000-7000-8000-000000000002
47149
+ reportReasons:
47150
+ - OTHER
47151
+ totalReportCount: 1
47152
+ updatedAt: "2026-10-10T11:00:00.000Z"
47153
+ schema:
47154
+ $ref: "#/components/schemas/GetPlatformAbuseCasesByCommentIdResponse"
47155
+ description: read platform abuse case succeeded
47156
+ headers:
47157
+ Cache-Control:
47158
+ $ref: "#/components/headers/CacheControlNoStore"
47159
+ X-Correlation-Id:
47160
+ $ref: "#/components/headers/XCorrelationId"
47161
+ "400":
47162
+ $ref: "#/components/responses/ValidationFailed"
47163
+ "401":
47164
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47165
+ "403":
47166
+ $ref: "#/components/responses/AuthorizationDenied"
47167
+ "404":
47168
+ $ref: "#/components/responses/ResourceNotFound"
47169
+ security:
47170
+ - browserSession: []
47171
+ summary: read platform abuse case
47172
+ tags:
47173
+ - platform
47174
+ x-gala-activation-gate: MVP
47175
+ x-gala-activation-guards:
47176
+ - NONE
47177
+ x-gala-capability-key: platform.abuse.view
47178
+ x-gala-concurrency: none
47179
+ x-gala-conditional-capabilities: []
47180
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47181
+ x-gala-nullability: required-and-nullable-are-explicit
47182
+ x-gala-purpose: read platform abuse case
47183
+ x-gala-reachable-problems:
47184
+ - AUTHENTICATION_REQUIRED
47185
+ - AUTHORIZATION_DENIED
47186
+ - REAUTH_REQUIRED
47187
+ - RESOURCE_NOT_FOUND
47188
+ - VALIDATION_FAILED
47189
+ x-gala-replay-identity: safe-query
47190
+ x-gala-state-guards:
47191
+ - NONE
47192
+ x-gala-success-category: query
47193
+ x-gala-tenant-scope: NONE
47194
+ /v2/platform/abuse-cases/{commentId}:decide:
47195
+ post:
47196
+ description: |
47197
+ Operators only, with recent authentication. Applies one existing
47198
+ `ModerationDecision` after rechecking the comment and appeal state.
47199
+ Inapplicable decisions return `INVALID_DECISION`. `reason` is the
47200
+ non-sensitive operator reason code recorded in the audit event.
47201
+ operationId: postPlatformAbuseCasesByCommentIdDecide
47202
+ parameters:
47203
+ - $ref: "#/components/parameters/XCorrelationId"
47204
+ - example: 018f0000-0000-7000-8000-000000000001
47205
+ in: path
47206
+ name: commentId
47207
+ required: true
47208
+ schema:
47209
+ format: uuid
47210
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
47211
+ type: string
47212
+ - $ref: "#/components/parameters/IdempotencyKey"
47213
+ - $ref: "#/components/parameters/XCsrfToken"
47214
+ requestBody:
47215
+ content:
47216
+ application/json:
47217
+ examples:
47218
+ nominal:
47219
+ summary: Nominal valid request
47220
+ value:
47221
+ decision: HOLD
47222
+ note: Pending a second review.
47223
+ reason: REPORTED_CONTENT_REVIEW
47224
+ schema:
47225
+ $ref: "#/components/schemas/PostPlatformAbuseCasesByCommentIdDecideRequest"
47226
+ required: true
47227
+ responses:
47228
+ "200":
47229
+ content:
47230
+ application/json:
47231
+ examples:
47232
+ nominal:
47233
+ summary: Nominal successful response
47234
+ value:
47235
+ body: Great article.
47236
+ commentId: 018f0000-0000-7000-8000-000000000003
47237
+ commentState: HELD_REVIEW
47238
+ contentId: 018f0000-0000-7000-8000-000000000004
47239
+ firstReportedAt: "2026-10-10T10:30:00.000Z"
47240
+ lastReportedAt: "2026-10-10T11:00:00.000Z"
47241
+ openReportCount: 1
47242
+ organizationId: 018f0000-0000-7000-8000-000000000001
47243
+ parentId: null
47244
+ publicationId: 018f0000-0000-7000-8000-000000000002
47245
+ reportReasons:
47246
+ - OTHER
47247
+ totalReportCount: 1
47248
+ updatedAt: "2026-10-10T12:00:00.000Z"
47249
+ schema:
47250
+ $ref: "#/components/schemas/PostPlatformAbuseCasesByCommentIdDecideResponse"
47251
+ description: decide platform abuse case succeeded
47252
+ headers:
47253
+ Cache-Control:
47254
+ $ref: "#/components/headers/CacheControlNoStore"
47255
+ X-Correlation-Id:
47256
+ $ref: "#/components/headers/XCorrelationId"
47257
+ "400":
47258
+ $ref: "#/components/responses/RequestInvalid"
47259
+ "401":
47260
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47261
+ "403":
47262
+ $ref: "#/components/responses/AuthorizationDenied"
47263
+ "404":
47264
+ $ref: "#/components/responses/ResourceNotFound"
47265
+ "409":
47266
+ $ref: "#/components/responses/InvalidDecisionCommandConflict"
47267
+ security:
47268
+ - browserSession: []
47269
+ summary: decide platform abuse case
47270
+ tags:
47271
+ - platform
47272
+ x-gala-activation-gate: MVP
47273
+ x-gala-activation-guards:
47274
+ - NONE
47275
+ x-gala-capability-key: platform.abuse.remediate
47276
+ x-gala-concurrency: none
47277
+ x-gala-conditional-capabilities: []
47278
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47279
+ x-gala-nullability: required-and-nullable-are-explicit
47280
+ x-gala-purpose: decide platform abuse case
47281
+ x-gala-reachable-problems:
47282
+ - AUTHENTICATION_REQUIRED
47283
+ - AUTHORIZATION_DENIED
47284
+ - COMMAND_REPLAY_CONFLICT
47285
+ - INVALID_DECISION
47286
+ - REAUTH_REQUIRED
47287
+ - REQUEST_FIELD_UNKNOWN
47288
+ - RESOURCE_NOT_FOUND
47289
+ - VALIDATION_FAILED
47290
+ x-gala-replay-identity: idempotency-key
47291
+ x-gala-state-guards:
47292
+ - NONE
47293
+ x-gala-success-category: protocol
47294
+ x-gala-tenant-scope: NONE
45721
47295
  /v2/platform/adapters:
45722
47296
  get:
45723
47297
  description: |
@@ -45843,7 +47417,8 @@ paths:
45843
47417
  Operators only (a configured platform operator with recent
45844
47418
  authentication). Audit events across every organization, newest first,
45845
47419
  filtered by any combination of organization, publication, actor, action
45846
- and time window (`from` inclusive, `to` exclusive).
47420
+ and time window (`from` inclusive, `to` exclusive). The operator App
47421
+ supplies the trailing seven days when the URL has no explicit range.
45847
47422
  operationId: getPlatformAuditEvents
45848
47423
  parameters:
45849
47424
  - $ref: "#/components/parameters/XCorrelationId"
@@ -46050,6 +47625,167 @@ paths:
46050
47625
  - NONE
46051
47626
  x-gala-success-category: query
46052
47627
  x-gala-tenant-scope: NONE
47628
+ /v2/platform/caches:
47629
+ get:
47630
+ description: |
47631
+ Operators only, with recent authentication. Lists the bounded cache
47632
+ inventory, each durable all-instance eviction epoch, this serving
47633
+ instance's entry count, and update version. Cache keys and values are
47634
+ never exposed.
47635
+ operationId: getPlatformCaches
47636
+ parameters:
47637
+ - $ref: "#/components/parameters/XCorrelationId"
47638
+ responses:
47639
+ "200":
47640
+ content:
47641
+ application/json:
47642
+ examples:
47643
+ nominal:
47644
+ summary: Nominal successful response
47645
+ value:
47646
+ items:
47647
+ - epoch: 3
47648
+ localEntryCount: 7
47649
+ name: GITHUB_INSTALLATION_TOKEN
47650
+ ttlSeconds: 300
47651
+ updatedAt: "2026-10-10T12:00:00.000Z"
47652
+ updatedByPersonId: 018f0000-0000-7000-8000-000000000001
47653
+ version: 3
47654
+ schema:
47655
+ $ref: "#/components/schemas/GetPlatformCachesResponse"
47656
+ description: list platform caches succeeded
47657
+ headers:
47658
+ Cache-Control:
47659
+ $ref: "#/components/headers/CacheControlNoStore"
47660
+ X-Correlation-Id:
47661
+ $ref: "#/components/headers/XCorrelationId"
47662
+ "401":
47663
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47664
+ "403":
47665
+ $ref: "#/components/responses/AuthorizationDenied"
47666
+ security:
47667
+ - browserSession: []
47668
+ summary: list platform caches
47669
+ tags:
47670
+ - platform
47671
+ x-gala-activation-gate: MVP
47672
+ x-gala-activation-guards:
47673
+ - NONE
47674
+ x-gala-capability-key: platform.caches.view
47675
+ x-gala-concurrency: none
47676
+ x-gala-conditional-capabilities: []
47677
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47678
+ x-gala-nullability: required-and-nullable-are-explicit
47679
+ x-gala-purpose: list platform caches
47680
+ x-gala-reachable-problems:
47681
+ - AUTHENTICATION_REQUIRED
47682
+ - AUTHORIZATION_DENIED
47683
+ - REAUTH_REQUIRED
47684
+ x-gala-replay-identity: safe-query
47685
+ x-gala-state-guards:
47686
+ - NONE
47687
+ x-gala-success-category: query
47688
+ x-gala-tenant-scope: NONE
47689
+ /v2/platform/caches/{cacheId}:evict:
47690
+ post:
47691
+ description: |
47692
+ Operators only, with recent authentication. Advances the named cache's
47693
+ durable epoch at the exact version in `If-Match`; all serving instances
47694
+ converge on that epoch, while `localEntryCount` reports only the
47695
+ responding instance. `reason` is the non-sensitive reason code recorded
47696
+ in the audit event.
47697
+ operationId: postPlatformCachesByCacheIdEvict
47698
+ parameters:
47699
+ - $ref: "#/components/parameters/XCorrelationId"
47700
+ - example: GITHUB_INSTALLATION_TOKEN
47701
+ in: path
47702
+ name: cacheId
47703
+ required: true
47704
+ schema:
47705
+ enum:
47706
+ - GITHUB_INSTALLATION_TOKEN
47707
+ - GITHUB_REPOSITORY_METADATA
47708
+ - GITHUB_REPOSITORY_CONTENT
47709
+ type: string
47710
+ - $ref: "#/components/parameters/IdempotencyKey"
47711
+ - $ref: "#/components/parameters/IfMatch"
47712
+ - $ref: "#/components/parameters/XCsrfToken"
47713
+ requestBody:
47714
+ content:
47715
+ application/json:
47716
+ examples:
47717
+ nominal:
47718
+ summary: Nominal valid request
47719
+ value:
47720
+ reason: CREDENTIAL_ROTATION
47721
+ schema:
47722
+ $ref: "#/components/schemas/PostPlatformCachesByCacheIdEvictRequest"
47723
+ required: true
47724
+ responses:
47725
+ "200":
47726
+ content:
47727
+ application/json:
47728
+ examples:
47729
+ nominal:
47730
+ summary: Nominal successful response
47731
+ value:
47732
+ epoch: 4
47733
+ localEntryCount: 0
47734
+ name: GITHUB_INSTALLATION_TOKEN
47735
+ ttlSeconds: 300
47736
+ updatedAt: "2026-10-10T12:00:00.000Z"
47737
+ updatedByPersonId: 018f0000-0000-7000-8000-000000000001
47738
+ version: 4
47739
+ schema:
47740
+ $ref: "#/components/schemas/PostPlatformCachesByCacheIdEvictResponse"
47741
+ description: evict platform cache succeeded
47742
+ headers:
47743
+ Cache-Control:
47744
+ $ref: "#/components/headers/CacheControlNoStore"
47745
+ ETag:
47746
+ $ref: "#/components/headers/ETag"
47747
+ X-Correlation-Id:
47748
+ $ref: "#/components/headers/XCorrelationId"
47749
+ "400":
47750
+ $ref: "#/components/responses/RequestInvalid"
47751
+ "401":
47752
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47753
+ "403":
47754
+ $ref: "#/components/responses/AuthorizationDenied"
47755
+ "404":
47756
+ $ref: "#/components/responses/ResourceNotFound"
47757
+ "409":
47758
+ $ref: "#/components/responses/CommandReplayConflict"
47759
+ "412":
47760
+ $ref: "#/components/responses/StaleAggregateVersion"
47761
+ security:
47762
+ - browserSession: []
47763
+ summary: evict platform cache
47764
+ tags:
47765
+ - platform
47766
+ x-gala-activation-gate: MVP
47767
+ x-gala-activation-guards:
47768
+ - NONE
47769
+ x-gala-capability-key: platform.caches.manage
47770
+ x-gala-concurrency: if-match-platform-cache-version
47771
+ x-gala-conditional-capabilities: []
47772
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47773
+ x-gala-nullability: required-and-nullable-are-explicit
47774
+ x-gala-purpose: evict platform cache
47775
+ x-gala-reachable-problems:
47776
+ - AUTHENTICATION_REQUIRED
47777
+ - AUTHORIZATION_DENIED
47778
+ - COMMAND_REPLAY_CONFLICT
47779
+ - REAUTH_REQUIRED
47780
+ - REQUEST_FIELD_UNKNOWN
47781
+ - RESOURCE_NOT_FOUND
47782
+ - STALE_AGGREGATE_VERSION
47783
+ - VALIDATION_FAILED
47784
+ x-gala-replay-identity: idempotency-key
47785
+ x-gala-state-guards:
47786
+ - NONE
47787
+ x-gala-success-category: update
47788
+ x-gala-tenant-scope: NONE
46053
47789
  /v2/platform/configuration:
46054
47790
  get:
46055
47791
  description: |
@@ -46176,6 +47912,836 @@ paths:
46176
47912
  - NONE
46177
47913
  x-gala-success-category: query
46178
47914
  x-gala-tenant-scope: NONE
47915
+ /v2/platform/oauth-clients:
47916
+ get:
47917
+ description: |
47918
+ Operators only, with recent authentication. Lists OAuth client registry
47919
+ metadata. Client secrets are never returned by this or any later read.
47920
+ operationId: getPlatformOauthClients
47921
+ parameters:
47922
+ - $ref: "#/components/parameters/XCorrelationId"
47923
+ responses:
47924
+ "200":
47925
+ content:
47926
+ application/json:
47927
+ examples:
47928
+ nominal:
47929
+ summary: Nominal successful response
47930
+ value:
47931
+ items:
47932
+ - accessTokenTtlSeconds: 3600
47933
+ clientId: gala_0123456789abcdefghijklmnopqrstuv
47934
+ clientType: CONFIDENTIAL
47935
+ createdAt: "2026-10-10T12:00:00.000Z"
47936
+ createdByPersonId: 018f0000-0000-7000-8000-000000000002
47937
+ description: Connect automation and monitoring tools.
47938
+ grantTypes:
47939
+ - AUTHORIZATION_CODE
47940
+ - REFRESH_TOKEN
47941
+ - CLIENT_CREDENTIALS
47942
+ homepageUri: https://example.com/
47943
+ id: 018f0000-0000-7000-8000-000000000001
47944
+ logoUri: https://example.com/logo.png
47945
+ name: Automation client
47946
+ redirectUris:
47947
+ - https://example.com/oauth/callback
47948
+ revokedAt: null
47949
+ scopes:
47950
+ - read
47951
+ - write
47952
+ state: DRAFT
47953
+ updatedAt: "2026-10-10T12:00:00.000Z"
47954
+ version: 0
47955
+ schema:
47956
+ $ref: "#/components/schemas/GetPlatformOauthClientsResponse"
47957
+ description: list OAuth clients succeeded
47958
+ headers:
47959
+ Cache-Control:
47960
+ $ref: "#/components/headers/CacheControlNoStore"
47961
+ X-Correlation-Id:
47962
+ $ref: "#/components/headers/XCorrelationId"
47963
+ "401":
47964
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
47965
+ "403":
47966
+ $ref: "#/components/responses/AuthorizationDenied"
47967
+ security:
47968
+ - browserSession: []
47969
+ summary: list OAuth clients
47970
+ tags:
47971
+ - platform
47972
+ x-gala-activation-gate: MVP
47973
+ x-gala-activation-guards:
47974
+ - NONE
47975
+ x-gala-capability-key: platform.oauth.clients.manage
47976
+ x-gala-concurrency: none
47977
+ x-gala-conditional-capabilities: []
47978
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
47979
+ x-gala-nullability: required-and-nullable-are-explicit
47980
+ x-gala-purpose: list OAuth clients
47981
+ x-gala-reachable-problems:
47982
+ - AUTHENTICATION_REQUIRED
47983
+ - AUTHORIZATION_DENIED
47984
+ - REAUTH_REQUIRED
47985
+ x-gala-replay-identity: safe-query
47986
+ x-gala-state-guards:
47987
+ - NONE
47988
+ x-gala-success-category: query
47989
+ x-gala-tenant-scope: NONE
47990
+ post:
47991
+ description: |
47992
+ Operators only, with recent authentication. Registers one DRAFT OAuth
47993
+ client. `reason` is a non-sensitive operator reason code recorded in
47994
+ the audit event. `Idempotency-Key` is the registry-row identity. The
47995
+ generated CONFIDENTIAL-client secret is disclosed only by the first
47996
+ successful response and is never stored in plaintext; PUBLIC clients
47997
+ and committed retries return `clientSecret` null or omitted.
47998
+ operationId: postPlatformOauthClients
47999
+ parameters:
48000
+ - $ref: "#/components/parameters/XCorrelationId"
48001
+ - $ref: "#/components/parameters/IdempotencyKey"
48002
+ - $ref: "#/components/parameters/XCsrfToken"
48003
+ requestBody:
48004
+ content:
48005
+ application/json:
48006
+ examples:
48007
+ nominal:
48008
+ summary: Nominal valid request
48009
+ value:
48010
+ accessTokenTtlSeconds: 3600
48011
+ clientType: CONFIDENTIAL
48012
+ description: Connect automation and monitoring tools.
48013
+ grantTypes:
48014
+ - AUTHORIZATION_CODE
48015
+ - REFRESH_TOKEN
48016
+ - CLIENT_CREDENTIALS
48017
+ homepageUri: https://example.com/
48018
+ logoUri: https://example.com/logo.png
48019
+ name: Automation client
48020
+ reason: OPERATOR_REQUESTED
48021
+ redirectUris:
48022
+ - https://example.com/oauth/callback
48023
+ scopes:
48024
+ - read
48025
+ - write
48026
+ schema:
48027
+ $ref: "#/components/schemas/PostPlatformOauthClientsRequest"
48028
+ required: true
48029
+ responses:
48030
+ "201":
48031
+ content:
48032
+ application/json:
48033
+ examples:
48034
+ nominal:
48035
+ summary: Nominal successful response
48036
+ value:
48037
+ client:
48038
+ accessTokenTtlSeconds: 3600
48039
+ clientId: gala_0123456789abcdefghijklmnopqrstuv
48040
+ clientType: CONFIDENTIAL
48041
+ createdAt: "2026-10-10T12:00:00.000Z"
48042
+ createdByPersonId: 018f0000-0000-7000-8000-000000000002
48043
+ description: Connect automation and monitoring tools.
48044
+ grantTypes:
48045
+ - AUTHORIZATION_CODE
48046
+ - REFRESH_TOKEN
48047
+ - CLIENT_CREDENTIALS
48048
+ homepageUri: https://example.com/
48049
+ id: 018f0000-0000-7000-8000-000000000001
48050
+ logoUri: https://example.com/logo.png
48051
+ name: Automation client
48052
+ redirectUris:
48053
+ - https://example.com/oauth/callback
48054
+ revokedAt: null
48055
+ scopes:
48056
+ - read
48057
+ - write
48058
+ state: DRAFT
48059
+ updatedAt: "2026-10-10T12:00:00.000Z"
48060
+ version: 0
48061
+ clientSecret: gala_secret_0123456789abcdefghijklmnopqrstuv
48062
+ schema:
48063
+ $ref: "#/components/schemas/PostPlatformOauthClientsResponse"
48064
+ description: register OAuth client succeeded
48065
+ headers:
48066
+ Cache-Control:
48067
+ $ref: "#/components/headers/CacheControlNoStore"
48068
+ Location:
48069
+ $ref: "#/components/headers/Location"
48070
+ X-Correlation-Id:
48071
+ $ref: "#/components/headers/XCorrelationId"
48072
+ "400":
48073
+ $ref: "#/components/responses/RequestInvalid"
48074
+ "401":
48075
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48076
+ "403":
48077
+ $ref: "#/components/responses/AuthorizationDenied"
48078
+ "409":
48079
+ $ref: "#/components/responses/CommandReplayConflict"
48080
+ security:
48081
+ - browserSession: []
48082
+ summary: register OAuth client
48083
+ tags:
48084
+ - platform
48085
+ x-gala-activation-gate: MVP
48086
+ x-gala-activation-guards:
48087
+ - NONE
48088
+ x-gala-capability-key: platform.oauth.clients.manage
48089
+ x-gala-concurrency: none
48090
+ x-gala-conditional-capabilities: []
48091
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48092
+ x-gala-nullability: required-and-nullable-are-explicit
48093
+ x-gala-purpose: register OAuth client
48094
+ x-gala-reachable-problems:
48095
+ - AUTHENTICATION_REQUIRED
48096
+ - AUTHORIZATION_DENIED
48097
+ - COMMAND_REPLAY_CONFLICT
48098
+ - REAUTH_REQUIRED
48099
+ - REQUEST_FIELD_UNKNOWN
48100
+ - VALIDATION_FAILED
48101
+ x-gala-replay-identity: idempotency-key
48102
+ x-gala-state-guards:
48103
+ - NONE
48104
+ x-gala-success-category: create
48105
+ x-gala-tenant-scope: NONE
48106
+ /v2/platform/oauth-clients/{oauthClientId}:revoke:
48107
+ post:
48108
+ description: |
48109
+ Operators only, with recent authentication. Revokes exactly the DRAFT
48110
+ registry entry named by `oauthClientId` (the entry's `id`, a UUID) at the
48111
+ version in `If-Match`; the public OAuth `clientId` remains response
48112
+ metadata. A REVOKED client is
48113
+ rejected with `INVALID_SOURCE_STATE`. `reason` is the non-sensitive
48114
+ reason code recorded in the audit event.
48115
+ operationId: postPlatformOauthClientsByOauthClientIdRevoke
48116
+ parameters:
48117
+ - $ref: "#/components/parameters/XCorrelationId"
48118
+ - example: 018f0000-0000-7000-8000-000000000001
48119
+ in: path
48120
+ name: oauthClientId
48121
+ required: true
48122
+ schema:
48123
+ format: uuid
48124
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
48125
+ type: string
48126
+ - $ref: "#/components/parameters/IdempotencyKey"
48127
+ - $ref: "#/components/parameters/IfMatch"
48128
+ - $ref: "#/components/parameters/XCsrfToken"
48129
+ requestBody:
48130
+ content:
48131
+ application/json:
48132
+ examples:
48133
+ nominal:
48134
+ summary: Nominal valid request
48135
+ value:
48136
+ reason: INTEGRATION_RETIRED
48137
+ schema:
48138
+ $ref: "#/components/schemas/PostPlatformOauthClientsByOauthClientIdRevokeRequest"
48139
+ required: true
48140
+ responses:
48141
+ "200":
48142
+ content:
48143
+ application/json:
48144
+ examples:
48145
+ nominal:
48146
+ summary: Nominal successful response
48147
+ value:
48148
+ accessTokenTtlSeconds: 3600
48149
+ clientId: gala_0123456789abcdefghijklmnopqrstuv
48150
+ clientType: CONFIDENTIAL
48151
+ createdAt: "2026-10-10T12:00:00.000Z"
48152
+ createdByPersonId: 018f0000-0000-7000-8000-000000000002
48153
+ description: Connect automation and monitoring tools.
48154
+ grantTypes:
48155
+ - CLIENT_CREDENTIALS
48156
+ homepageUri: https://example.com/
48157
+ id: 018f0000-0000-7000-8000-000000000001
48158
+ logoUri: https://example.com/logo.png
48159
+ name: Automation client
48160
+ redirectUris: []
48161
+ revokedAt: "2026-10-10T13:00:00.000Z"
48162
+ scopes:
48163
+ - metrics:read
48164
+ state: REVOKED
48165
+ updatedAt: "2026-10-10T13:00:00.000Z"
48166
+ version: 1
48167
+ schema:
48168
+ $ref: "#/components/schemas/PostPlatformOauthClientsByOauthClientIdRevokeResponse"
48169
+ description: revoke OAuth client succeeded
48170
+ headers:
48171
+ Cache-Control:
48172
+ $ref: "#/components/headers/CacheControlNoStore"
48173
+ ETag:
48174
+ $ref: "#/components/headers/ETag"
48175
+ X-Correlation-Id:
48176
+ $ref: "#/components/headers/XCorrelationId"
48177
+ "400":
48178
+ $ref: "#/components/responses/RequestInvalid"
48179
+ "401":
48180
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48181
+ "403":
48182
+ $ref: "#/components/responses/AuthorizationDenied"
48183
+ "404":
48184
+ $ref: "#/components/responses/ResourceNotFound"
48185
+ "409":
48186
+ $ref: "#/components/responses/InvalidSourceStateCommandConflict"
48187
+ "412":
48188
+ $ref: "#/components/responses/StaleAggregateVersion"
48189
+ security:
48190
+ - browserSession: []
48191
+ summary: revoke OAuth client
48192
+ tags:
48193
+ - platform
48194
+ x-gala-activation-gate: MVP
48195
+ x-gala-activation-guards:
48196
+ - NONE
48197
+ x-gala-capability-key: platform.oauth.clients.manage
48198
+ x-gala-concurrency: if-match-oauth-client-version
48199
+ x-gala-conditional-capabilities: []
48200
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48201
+ x-gala-nullability: required-and-nullable-are-explicit
48202
+ x-gala-purpose: revoke OAuth client
48203
+ x-gala-reachable-problems:
48204
+ - AUTHENTICATION_REQUIRED
48205
+ - AUTHORIZATION_DENIED
48206
+ - COMMAND_REPLAY_CONFLICT
48207
+ - INVALID_SOURCE_STATE
48208
+ - REAUTH_REQUIRED
48209
+ - REQUEST_FIELD_UNKNOWN
48210
+ - RESOURCE_NOT_FOUND
48211
+ - STALE_AGGREGATE_VERSION
48212
+ - VALIDATION_FAILED
48213
+ x-gala-replay-identity: idempotency-key
48214
+ x-gala-state-guards:
48215
+ - OAuthClient:DRAFT -> REVOKED
48216
+ x-gala-success-category: update
48217
+ x-gala-tenant-scope: NONE
48218
+ /v2/platform/overview:
48219
+ get:
48220
+ description: |
48221
+ Operators only, with recent authentication. A bounded platform summary
48222
+ for the dashboard landing page. Counts use exact persisted person,
48223
+ organization, publication, comment, reaction, OAuth client, abuse, and
48224
+ webhook states. The webhook counters cover the trailing seven days;
48225
+ no traffic or subscription fact is inferred.
48226
+ operationId: getPlatformOverview
48227
+ parameters:
48228
+ - $ref: "#/components/parameters/XCorrelationId"
48229
+ responses:
48230
+ "200":
48231
+ content:
48232
+ application/json:
48233
+ examples:
48234
+ nominal:
48235
+ summary: Nominal successful response
48236
+ value:
48237
+ commentDeletedByAuthor: 1
48238
+ commentHeldReview: 2
48239
+ commentRemoved: 3
48240
+ commentVisible: 41
48241
+ commentVisibleFlagged: 4
48242
+ commentVisiblePendingScan: 2
48243
+ oauthClientDraft: 2
48244
+ oauthClientRevoked: 1
48245
+ openAbuseCases: 3
48246
+ organizationActive: 5
48247
+ organizationBusiness: 1
48248
+ organizationClosed: 0
48249
+ organizationClosing: 0
48250
+ organizationFree: 2
48251
+ organizationPro: 2
48252
+ organizationProvisioning: 1
48253
+ organizationSuspended: 0
48254
+ personActive: 8
48255
+ personClosed: 1
48256
+ personClosing: 0
48257
+ personRestricted: 1
48258
+ personSuspended: 1
48259
+ publicationActive: 12
48260
+ publicationPaused: 1
48261
+ publicationProvisioning: 1
48262
+ publicationRetired: 2
48263
+ publicationRetiring: 1
48264
+ reactionActive: 63
48265
+ reactionInactive: 4
48266
+ webhookProcessed7d: 25
48267
+ webhookProcessing7d: 1
48268
+ webhookQuarantined7d: 1
48269
+ webhookReceived7d: 2
48270
+ schema:
48271
+ $ref: "#/components/schemas/GetPlatformOverviewResponse"
48272
+ description: read the platform dashboard overview succeeded
48273
+ headers:
48274
+ Cache-Control:
48275
+ $ref: "#/components/headers/CacheControlNoStore"
48276
+ X-Correlation-Id:
48277
+ $ref: "#/components/headers/XCorrelationId"
48278
+ "401":
48279
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48280
+ "403":
48281
+ $ref: "#/components/responses/AuthorizationDenied"
48282
+ security:
48283
+ - browserSession: []
48284
+ summary: read the platform dashboard overview
48285
+ tags:
48286
+ - platform
48287
+ x-gala-activation-gate: MVP
48288
+ x-gala-activation-guards:
48289
+ - NONE
48290
+ x-gala-capability-key: platform.users.view
48291
+ x-gala-concurrency: none
48292
+ x-gala-conditional-capabilities: []
48293
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48294
+ x-gala-nullability: required-and-nullable-are-explicit
48295
+ x-gala-purpose: read the platform dashboard overview
48296
+ x-gala-reachable-problems:
48297
+ - AUTHENTICATION_REQUIRED
48298
+ - AUTHORIZATION_DENIED
48299
+ - REAUTH_REQUIRED
48300
+ x-gala-replay-identity: safe-query
48301
+ x-gala-state-guards:
48302
+ - NONE
48303
+ x-gala-success-category: query
48304
+ x-gala-tenant-scope: NONE
48305
+ /v2/platform/plans:
48306
+ get:
48307
+ description: |
48308
+ Operators only, with recent authentication. Returns the complete,
48309
+ active publication-capacity release with its single optimistic-lock
48310
+ version and the closed FREE, PRO, and BUSINESS plan catalog.
48311
+ operationId: getPlatformPlans
48312
+ parameters:
48313
+ - $ref: "#/components/parameters/XCorrelationId"
48314
+ responses:
48315
+ "200":
48316
+ content:
48317
+ application/json:
48318
+ examples:
48319
+ nominal:
48320
+ summary: Nominal successful response
48321
+ value:
48322
+ effectiveAt: "2026-10-10T00:00:04.000Z"
48323
+ items:
48324
+ - planKey: FREE
48325
+ publicationLimit: 1
48326
+ - planKey: PRO
48327
+ publicationLimit: 10
48328
+ - planKey: BUSINESS
48329
+ publicationLimit: 50
48330
+ releaseId: 019d0000-2000-7000-8000-000000000001
48331
+ releaseVersion: 2
48332
+ state: ACTIVE
48333
+ updatedAt: "2026-10-10T00:00:04.000Z"
48334
+ schema:
48335
+ $ref: "#/components/schemas/GetPlatformPlansResponse"
48336
+ description: list platform plans succeeded
48337
+ headers:
48338
+ Cache-Control:
48339
+ $ref: "#/components/headers/CacheControlNoStore"
48340
+ X-Correlation-Id:
48341
+ $ref: "#/components/headers/XCorrelationId"
48342
+ "401":
48343
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48344
+ "403":
48345
+ $ref: "#/components/responses/AuthorizationDenied"
48346
+ security:
48347
+ - browserSession: []
48348
+ summary: list platform plans
48349
+ tags:
48350
+ - platform
48351
+ x-gala-activation-gate: MVP
48352
+ x-gala-activation-guards:
48353
+ - NONE
48354
+ x-gala-capability-key: platform.plans.view
48355
+ x-gala-concurrency: none
48356
+ x-gala-conditional-capabilities: []
48357
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48358
+ x-gala-nullability: required-and-nullable-are-explicit
48359
+ x-gala-purpose: list platform plans
48360
+ x-gala-reachable-problems:
48361
+ - AUTHENTICATION_REQUIRED
48362
+ - AUTHORIZATION_DENIED
48363
+ - REAUTH_REQUIRED
48364
+ x-gala-replay-identity: safe-query
48365
+ x-gala-state-guards:
48366
+ - NONE
48367
+ x-gala-success-category: query
48368
+ x-gala-tenant-scope: NONE
48369
+ /v2/platform/plans/{planKey}:
48370
+ put:
48371
+ description: |
48372
+ Operators only, with recent authentication. Atomically replaces the
48373
+ complete publication-capacity release, changing the named plan's limit
48374
+ while retaining the other two, at the release version in `If-Match`.
48375
+ The invariant FREE <= PRO <= BUSINESS is enforced. `reason` is a
48376
+ non-sensitive operator reason code recorded in the audit event.
48377
+ operationId: putPlatformPlansByPlanKey
48378
+ parameters:
48379
+ - $ref: "#/components/parameters/XCorrelationId"
48380
+ - example: PRO
48381
+ in: path
48382
+ name: planKey
48383
+ required: true
48384
+ schema:
48385
+ $ref: "#/components/schemas/PlatformPlanKey"
48386
+ - $ref: "#/components/parameters/IdempotencyKey"
48387
+ - $ref: "#/components/parameters/IfMatch"
48388
+ - $ref: "#/components/parameters/XCsrfToken"
48389
+ requestBody:
48390
+ content:
48391
+ application/json:
48392
+ examples:
48393
+ nominal:
48394
+ summary: Nominal valid request
48395
+ value:
48396
+ publicationLimit: 12
48397
+ reason: PLAN_LIMIT_UPDATE
48398
+ schema:
48399
+ $ref: "#/components/schemas/PutPlatformPlansByPlanKeyRequest"
48400
+ required: true
48401
+ responses:
48402
+ "200":
48403
+ content:
48404
+ application/json:
48405
+ examples:
48406
+ nominal:
48407
+ summary: Nominal successful response
48408
+ value:
48409
+ effectiveAt: "2026-10-10T12:00:00.000Z"
48410
+ items:
48411
+ - planKey: FREE
48412
+ publicationLimit: 1
48413
+ - planKey: PRO
48414
+ publicationLimit: 12
48415
+ - planKey: BUSINESS
48416
+ publicationLimit: 50
48417
+ releaseId: 019d0000-2000-7000-8000-000000000002
48418
+ releaseVersion: 3
48419
+ state: ACTIVE
48420
+ updatedAt: "2026-10-10T12:00:00.000Z"
48421
+ schema:
48422
+ $ref: "#/components/schemas/PutPlatformPlansByPlanKeyResponse"
48423
+ description: update platform plan succeeded
48424
+ headers:
48425
+ Cache-Control:
48426
+ $ref: "#/components/headers/CacheControlNoStore"
48427
+ ETag:
48428
+ $ref: "#/components/headers/ETag"
48429
+ X-Correlation-Id:
48430
+ $ref: "#/components/headers/XCorrelationId"
48431
+ "400":
48432
+ $ref: "#/components/responses/RequestInvalid"
48433
+ "401":
48434
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48435
+ "403":
48436
+ $ref: "#/components/responses/AuthorizationDenied"
48437
+ "404":
48438
+ $ref: "#/components/responses/ResourceNotFound"
48439
+ "409":
48440
+ $ref: "#/components/responses/CommandReplayConflict"
48441
+ "412":
48442
+ $ref: "#/components/responses/StaleAggregateVersion"
48443
+ security:
48444
+ - browserSession: []
48445
+ summary: update platform plan
48446
+ tags:
48447
+ - platform
48448
+ x-gala-activation-gate: MVP
48449
+ x-gala-activation-guards:
48450
+ - NONE
48451
+ x-gala-capability-key: platform.plans.manage
48452
+ x-gala-concurrency: if-match-platform-plan-release-version
48453
+ x-gala-conditional-capabilities: []
48454
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48455
+ x-gala-nullability: required-and-nullable-are-explicit
48456
+ x-gala-purpose: update platform plan
48457
+ x-gala-reachable-problems:
48458
+ - AUTHENTICATION_REQUIRED
48459
+ - AUTHORIZATION_DENIED
48460
+ - COMMAND_REPLAY_CONFLICT
48461
+ - REAUTH_REQUIRED
48462
+ - REQUEST_FIELD_UNKNOWN
48463
+ - RESOURCE_NOT_FOUND
48464
+ - STALE_AGGREGATE_VERSION
48465
+ - VALIDATION_FAILED
48466
+ x-gala-replay-identity: idempotency-key
48467
+ x-gala-state-guards:
48468
+ - NONE
48469
+ x-gala-success-category: update
48470
+ x-gala-tenant-scope: NONE
48471
+ /v2/platform/users:
48472
+ get:
48473
+ description: |
48474
+ Operators only, with recent authentication. Keyset-paged principals
48475
+ across the platform with exact person state, provider display snapshots,
48476
+ creation and last-sign-in instants, accessible publication count, and
48477
+ the distinct organization plan tiers reached through current grants.
48478
+ Subscription and per-user traffic data are not inferred.
48479
+ operationId: getPlatformUsers
48480
+ parameters:
48481
+ - $ref: "#/components/parameters/XCorrelationId"
48482
+ - description: Only people in this exact persisted state.
48483
+ example: ACTIVE
48484
+ in: query
48485
+ name: state
48486
+ required: false
48487
+ schema:
48488
+ $ref: "#/components/schemas/PlatformPersonState"
48489
+ - description: Case-insensitive match against person id, display name, or login.
48490
+ example: ada
48491
+ in: query
48492
+ name: search
48493
+ required: false
48494
+ schema:
48495
+ maxLength: 200
48496
+ minLength: 1
48497
+ type: string
48498
+ - $ref: "#/components/parameters/Cursor"
48499
+ - $ref: "#/components/parameters/Limit"
48500
+ responses:
48501
+ "200":
48502
+ content:
48503
+ application/json:
48504
+ examples:
48505
+ nominal:
48506
+ summary: Nominal successful response
48507
+ value:
48508
+ hasMore: false
48509
+ items:
48510
+ - createdAt: "2026-09-01T12:00:00.000Z"
48511
+ displayName: Ada Reader
48512
+ lastSignInAt: "2026-10-10T11:30:00.000Z"
48513
+ login: ada-reader
48514
+ personId: 018f0000-0000-7000-8000-000000000001
48515
+ planTiers:
48516
+ - FREE
48517
+ - PRO
48518
+ publicationCount: 2
48519
+ state: ACTIVE
48520
+ nextCursor: null
48521
+ schema:
48522
+ $ref: "#/components/schemas/GetPlatformUsersResponse"
48523
+ description: list platform users succeeded
48524
+ headers:
48525
+ Cache-Control:
48526
+ $ref: "#/components/headers/CacheControlNoStore"
48527
+ X-Correlation-Id:
48528
+ $ref: "#/components/headers/XCorrelationId"
48529
+ "400":
48530
+ $ref: "#/components/responses/ValidationFailed"
48531
+ "401":
48532
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48533
+ "403":
48534
+ $ref: "#/components/responses/AuthorizationDenied"
48535
+ security:
48536
+ - browserSession: []
48537
+ summary: list platform users
48538
+ tags:
48539
+ - platform
48540
+ x-gala-activation-gate: MVP
48541
+ x-gala-activation-guards:
48542
+ - NONE
48543
+ x-gala-capability-key: platform.users.view
48544
+ x-gala-concurrency: none
48545
+ x-gala-conditional-capabilities: []
48546
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48547
+ x-gala-nullability: required-and-nullable-are-explicit
48548
+ x-gala-purpose: list platform users
48549
+ x-gala-reachable-problems:
48550
+ - AUTHENTICATION_REQUIRED
48551
+ - AUTHORIZATION_DENIED
48552
+ - REAUTH_REQUIRED
48553
+ - VALIDATION_FAILED
48554
+ x-gala-replay-identity: safe-query
48555
+ x-gala-state-guards:
48556
+ - NONE
48557
+ x-gala-success-category: query
48558
+ x-gala-tenant-scope: NONE
48559
+ /v2/platform/webhook-events:
48560
+ get:
48561
+ description: |
48562
+ Operators only, with recent authentication. Returns redacted GitHub
48563
+ webhook inbox metadata, newest first. Bodies and payload digests are
48564
+ never exposed. `from` is inclusive and `to` is exclusive; the operator
48565
+ App supplies the trailing seven days when the URL has no explicit
48566
+ range.
48567
+ operationId: getPlatformWebhookEvents
48568
+ parameters:
48569
+ - $ref: "#/components/parameters/XCorrelationId"
48570
+ - description: Only events with this GitHub event type.
48571
+ example: PUSH
48572
+ in: query
48573
+ name: eventType
48574
+ required: false
48575
+ schema:
48576
+ $ref: "#/components/schemas/PlatformWebhookEventType"
48577
+ - description: Only events in this processing state.
48578
+ example: PROCESSED
48579
+ in: query
48580
+ name: status
48581
+ required: false
48582
+ schema:
48583
+ $ref: "#/components/schemas/PlatformWebhookProcessingStatus"
48584
+ - description: Only events first seen at or after this instant.
48585
+ example: "2026-10-03T12:00:00.000Z"
48586
+ in: query
48587
+ name: from
48588
+ required: false
48589
+ schema:
48590
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
48591
+ format: date-time
48592
+ type: string
48593
+ - description: Only events first seen before this instant.
48594
+ example: "2026-10-10T12:00:00.000Z"
48595
+ in: query
48596
+ name: to
48597
+ required: false
48598
+ schema:
48599
+ description: "Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56)."
48600
+ format: date-time
48601
+ type: string
48602
+ - $ref: "#/components/parameters/Cursor"
48603
+ - $ref: "#/components/parameters/Limit"
48604
+ responses:
48605
+ "200":
48606
+ content:
48607
+ application/json:
48608
+ examples:
48609
+ nominal:
48610
+ summary: Nominal successful response
48611
+ value:
48612
+ hasMore: false
48613
+ items:
48614
+ - attemptCount: 1
48615
+ attemptLimit: 12
48616
+ eventId: 018f0000-0000-7000-8000-000000000001
48617
+ eventType: PUSH
48618
+ firstSeenAt: "2026-10-10T11:59:58.000Z"
48619
+ organizationId: 018f0000-0000-7000-8000-000000000003
48620
+ processedAt: "2026-10-10T12:00:00.000Z"
48621
+ providerRepositoryId: 123456789
48622
+ pullRequestNumber: null
48623
+ resultCode: APPLIED
48624
+ status: PROCESSED
48625
+ updatedAt: "2026-10-10T12:00:00.000Z"
48626
+ workflowRunId: null
48627
+ nextCursor: null
48628
+ schema:
48629
+ $ref: "#/components/schemas/GetPlatformWebhookEventsResponse"
48630
+ description: list platform webhook events succeeded
48631
+ headers:
48632
+ Cache-Control:
48633
+ $ref: "#/components/headers/CacheControlNoStore"
48634
+ X-Correlation-Id:
48635
+ $ref: "#/components/headers/XCorrelationId"
48636
+ "400":
48637
+ $ref: "#/components/responses/ValidationFailed"
48638
+ "401":
48639
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48640
+ "403":
48641
+ $ref: "#/components/responses/AuthorizationDenied"
48642
+ security:
48643
+ - browserSession: []
48644
+ summary: list platform webhook events
48645
+ tags:
48646
+ - platform
48647
+ x-gala-activation-gate: MVP
48648
+ x-gala-activation-guards:
48649
+ - NONE
48650
+ x-gala-capability-key: platform.webhooks.view
48651
+ x-gala-concurrency: none
48652
+ x-gala-conditional-capabilities: []
48653
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48654
+ x-gala-nullability: required-and-nullable-are-explicit
48655
+ x-gala-purpose: list platform webhook events
48656
+ x-gala-reachable-problems:
48657
+ - AUTHENTICATION_REQUIRED
48658
+ - AUTHORIZATION_DENIED
48659
+ - REAUTH_REQUIRED
48660
+ - VALIDATION_FAILED
48661
+ x-gala-replay-identity: safe-query
48662
+ x-gala-state-guards:
48663
+ - NONE
48664
+ x-gala-success-category: query
48665
+ x-gala-tenant-scope: NONE
48666
+ /v2/platform/webhook-events/{eventId}:
48667
+ get:
48668
+ description: |
48669
+ Operators only, with recent authentication. Reads one redacted webhook
48670
+ inbox event by stable id. The request body and payload digest are never
48671
+ exposed.
48672
+ operationId: getPlatformWebhookEventsByEventId
48673
+ parameters:
48674
+ - $ref: "#/components/parameters/XCorrelationId"
48675
+ - example: 018f0000-0000-7000-8000-000000000001
48676
+ in: path
48677
+ name: eventId
48678
+ required: true
48679
+ schema:
48680
+ format: uuid
48681
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
48682
+ type: string
48683
+ responses:
48684
+ "200":
48685
+ content:
48686
+ application/json:
48687
+ examples:
48688
+ nominal:
48689
+ summary: Nominal successful response
48690
+ value:
48691
+ attemptCount: 1
48692
+ attemptLimit: 12
48693
+ eventId: 018f0000-0000-7000-8000-000000000001
48694
+ eventType: PUSH
48695
+ firstSeenAt: "2026-10-10T11:59:58.000Z"
48696
+ organizationId: 018f0000-0000-7000-8000-000000000003
48697
+ processedAt: "2026-10-10T12:00:00.000Z"
48698
+ providerRepositoryId: 123456789
48699
+ pullRequestNumber: null
48700
+ resultCode: APPLIED
48701
+ status: PROCESSED
48702
+ updatedAt: "2026-10-10T12:00:00.000Z"
48703
+ workflowRunId: null
48704
+ schema:
48705
+ $ref: "#/components/schemas/GetPlatformWebhookEventsByEventIdResponse"
48706
+ description: read platform webhook event succeeded
48707
+ headers:
48708
+ Cache-Control:
48709
+ $ref: "#/components/headers/CacheControlNoStore"
48710
+ X-Correlation-Id:
48711
+ $ref: "#/components/headers/XCorrelationId"
48712
+ "400":
48713
+ $ref: "#/components/responses/ValidationFailed"
48714
+ "401":
48715
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48716
+ "403":
48717
+ $ref: "#/components/responses/AuthorizationDenied"
48718
+ "404":
48719
+ $ref: "#/components/responses/ResourceNotFound"
48720
+ security:
48721
+ - browserSession: []
48722
+ summary: read platform webhook event
48723
+ tags:
48724
+ - platform
48725
+ x-gala-activation-gate: MVP
48726
+ x-gala-activation-guards:
48727
+ - NONE
48728
+ x-gala-capability-key: platform.webhooks.view
48729
+ x-gala-concurrency: none
48730
+ x-gala-conditional-capabilities: []
48731
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48732
+ x-gala-nullability: required-and-nullable-are-explicit
48733
+ x-gala-purpose: read platform webhook event
48734
+ x-gala-reachable-problems:
48735
+ - AUTHENTICATION_REQUIRED
48736
+ - AUTHORIZATION_DENIED
48737
+ - REAUTH_REQUIRED
48738
+ - RESOURCE_NOT_FOUND
48739
+ - VALIDATION_FAILED
48740
+ x-gala-replay-identity: safe-query
48741
+ x-gala-state-guards:
48742
+ - NONE
48743
+ x-gala-success-category: query
48744
+ x-gala-tenant-scope: NONE
46179
48745
  /v2/public/comments/{commentId}:
46180
48746
  delete:
46181
48747
  description: A comment that has replies stays as a tombstone.