@rathnasgala2/schemas 2.21.0 → 3.0.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 (51) hide show
  1. package/README.md +31 -30
  2. package/THIRD_PARTY_LICENSES.json +3 -3
  3. package/diagnostics/diagnostic-map.json +706 -4
  4. package/docs/catalogs/app-components.json +1107 -1
  5. package/docs/catalogs/app-routes.json +444 -1
  6. package/docs/catalogs/schema-inventory.json +5 -5
  7. package/examples/valid/build-input/rules.json +50 -0
  8. package/examples/valid/publication/rules.json +48 -0
  9. package/examples/valid/theme-contract/canonical.json +355 -19
  10. package/examples/valid/theme-contract/default-3.0.json +660 -0
  11. package/examples/valid/theme-contract/rules.json +3456 -552
  12. package/fixtures/boundary/build-input/rules.json +55 -0
  13. package/fixtures/boundary/publication/rules.json +53 -0
  14. package/fixtures/boundary/theme-contract/root.json +355 -19
  15. package/fixtures/boundary/theme-contract/rules.json +4158 -1226
  16. package/fixtures/invalid/build-input/GRAPHEME_LENGTH_INVALID/cases.json +11 -0
  17. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +27 -0
  18. package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +11 -0
  19. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +50 -0
  20. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +22 -0
  21. package/fixtures/invalid/publication/GRAPHEME_LENGTH_INVALID/cases.json +11 -0
  22. package/fixtures/invalid/publication/REQUEST_FIELD_UNKNOWN/cases.json +23 -0
  23. package/fixtures/invalid/publication/SCHEMA_ENUM_INVALID/cases.json +9 -0
  24. package/fixtures/invalid/publication/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +42 -0
  25. package/fixtures/invalid/publication/SCHEMA_TYPE_INVALID/cases.json +18 -0
  26. package/fixtures/invalid/theme-contract/REQUEST_FIELD_UNKNOWN/cases.json +421 -20
  27. package/fixtures/invalid/theme-contract/SCHEMA_ARRAY_TOO_LONG/cases.json +2 -2
  28. package/fixtures/invalid/theme-contract/SCHEMA_ARRAY_TOO_SHORT/cases.json +1 -1
  29. package/fixtures/invalid/theme-contract/SCHEMA_CONSTANT_INVALID/cases.json +2155 -296
  30. package/fixtures/invalid/theme-contract/SCHEMA_ENUM_INVALID/cases.json +229 -9
  31. package/fixtures/invalid/theme-contract/SCHEMA_PATTERN_INVALID/cases.json +176 -0
  32. package/fixtures/invalid/theme-contract/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +8812 -1517
  33. package/fixtures/invalid/theme-contract/SCHEMA_STRING_TOO_LONG/cases.json +22 -0
  34. package/fixtures/manifest.json +5543 -161
  35. package/fixtures/s2/manifest.json +1 -1
  36. package/fixtures/s2/theme-contracts-digest-cycle.json +888 -36
  37. package/fixtures/unknown-field/build-input/rules.json +35 -0
  38. package/fixtures/unknown-field/publication/rules.json +35 -0
  39. package/fixtures/unknown-field/theme-contract/root.json +355 -19
  40. package/fixtures/unknown-field/theme-contract/rules.json +637 -22
  41. package/generated/browser/validator-core.mjs +3 -3
  42. package/generated/typescript/contracts/build-input.d.ts +8 -0
  43. package/generated/typescript/contracts/publication.d.ts +12 -0
  44. package/generated/typescript/contracts/theme-contract.d.ts +529 -9
  45. package/openapi/http-catalog.json +40 -2
  46. package/openapi/openapi.yaml +1348 -162
  47. package/package.json +1 -1
  48. package/sbom.cdx.json +23 -23
  49. package/schemas/build-input.schema.json +19 -0
  50. package/schemas/publication.schema.json +21 -0
  51. package/schemas/theme-contract.schema.json +1178 -83
@@ -1512,6 +1512,48 @@ components:
1512
1512
  - version
1513
1513
  - state
1514
1514
  type: object
1515
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdHistoryResponse:
1516
+ additionalProperties: false
1517
+ allOf:
1518
+ - else:
1519
+ properties:
1520
+ nextCursor:
1521
+ type: "null"
1522
+ if:
1523
+ properties:
1524
+ hasMore:
1525
+ not:
1526
+ enum:
1527
+ - false
1528
+ type: boolean
1529
+ x-gala-const: true
1530
+ required:
1531
+ - hasMore
1532
+ then:
1533
+ properties:
1534
+ nextCursor:
1535
+ type: string
1536
+ required:
1537
+ - nextCursor
1538
+ properties:
1539
+ hasMore:
1540
+ type: boolean
1541
+ items:
1542
+ items:
1543
+ $ref: "#/components/schemas/HistoryEntry"
1544
+ maxItems: 100
1545
+ type: array
1546
+ nextCursor:
1547
+ 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.
1548
+ maxLength: 2048
1549
+ minLength: 1
1550
+ type:
1551
+ - string
1552
+ - "null"
1553
+ required:
1554
+ - items
1555
+ - hasMore
1556
+ type: object
1515
1557
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdRepositoryBindingsCurrentResponse:
1516
1558
  additionalProperties: false
1517
1559
  properties:
@@ -1644,6 +1686,8 @@ components:
1644
1686
  format: uuid
1645
1687
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1646
1688
  type: string
1689
+ publishingPolicy:
1690
+ $ref: "#/components/schemas/PublishingPolicy"
1647
1691
  slug:
1648
1692
  maxLength: 80
1649
1693
  minLength: 1
@@ -1709,6 +1753,61 @@ components:
1709
1753
  - items
1710
1754
  - hasMore
1711
1755
  type: object
1756
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteResponse:
1757
+ additionalProperties: false
1758
+ allOf:
1759
+ - else:
1760
+ not:
1761
+ required:
1762
+ - publishing
1763
+ if:
1764
+ properties:
1765
+ state:
1766
+ pattern: ^PUBLISHING$
1767
+ type: string
1768
+ x-gala-const: PUBLISHING
1769
+ required:
1770
+ - state
1771
+ then:
1772
+ required:
1773
+ - publishing
1774
+ description: Everything a Home screen needs in one read. `url` is the live site address, `null` when nothing has been published. `lastPublished` is absent when `state` is `NEVER_PUBLISHED`. `publishing` is present exactly while `state` is `PUBLISHING`.
1775
+ properties:
1776
+ attention:
1777
+ items:
1778
+ $ref: "#/components/schemas/SiteAttentionItem"
1779
+ maxItems: 20
1780
+ type: array
1781
+ lastPublished:
1782
+ $ref: "#/components/schemas/SiteLastPublished"
1783
+ pendingChanges:
1784
+ items:
1785
+ $ref: "#/components/schemas/SitePendingChange"
1786
+ maxItems: 200
1787
+ type: array
1788
+ publishing:
1789
+ $ref: "#/components/schemas/SitePublishing"
1790
+ state:
1791
+ enum:
1792
+ - LIVE
1793
+ - PUBLISHING
1794
+ - NEVER_PUBLISHED
1795
+ - FAILED
1796
+ - UNKNOWN
1797
+ type: string
1798
+ url:
1799
+ maxLength: 2048
1800
+ minLength: 1
1801
+ pattern: ^https://
1802
+ type:
1803
+ - string
1804
+ - "null"
1805
+ required:
1806
+ - url
1807
+ - state
1808
+ - pendingChanges
1809
+ - attention
1810
+ type: object
1712
1811
  GetOrganizationsByOrganizationIdPublicationsResponse:
1713
1812
  additionalProperties: false
1714
1813
  allOf:
@@ -2231,6 +2330,149 @@ components:
2231
2330
  - PRIVATE
2232
2331
  - PUBLIC
2233
2332
  type: string
2333
+ HistoryChange:
2334
+ additionalProperties: false
2335
+ allOf:
2336
+ - else:
2337
+ properties:
2338
+ action:
2339
+ enum:
2340
+ - CREATE
2341
+ - EDIT
2342
+ - DELETE
2343
+ if:
2344
+ properties:
2345
+ kind:
2346
+ pattern: ^LOOK$
2347
+ type: string
2348
+ x-gala-const: LOOK
2349
+ required:
2350
+ - kind
2351
+ then:
2352
+ properties:
2353
+ action:
2354
+ pattern: ^CHANGE$
2355
+ type: string
2356
+ x-gala-const: CHANGE
2357
+ properties:
2358
+ action:
2359
+ description: "`CHANGE` is used for `LOOK` and only for `LOOK`; `POST` and `PAGE` use `CREATE`, `EDIT` or `DELETE`."
2360
+ enum:
2361
+ - CREATE
2362
+ - EDIT
2363
+ - DELETE
2364
+ - CHANGE
2365
+ type: string
2366
+ kind:
2367
+ enum:
2368
+ - POST
2369
+ - PAGE
2370
+ - LOOK
2371
+ type: string
2372
+ path:
2373
+ description: Repository path of the post or page; absent for `LOOK`.
2374
+ maxLength: 512
2375
+ minLength: 1
2376
+ type: string
2377
+ theme:
2378
+ $ref: "#/components/schemas/SiteThemeChange"
2379
+ title:
2380
+ maxLength: 200
2381
+ minLength: 1
2382
+ type: string
2383
+ required:
2384
+ - kind
2385
+ - action
2386
+ - title
2387
+ type: object
2388
+ HistoryEntry:
2389
+ additionalProperties: false
2390
+ allOf:
2391
+ - else:
2392
+ not:
2393
+ required:
2394
+ - failure
2395
+ required:
2396
+ - versionId
2397
+ if:
2398
+ properties:
2399
+ outcome:
2400
+ pattern: ^FAILED$
2401
+ type: string
2402
+ x-gala-const: FAILED
2403
+ required:
2404
+ - outcome
2405
+ then:
2406
+ not:
2407
+ required:
2408
+ - versionId
2409
+ required:
2410
+ - failure
2411
+ description: One version that went live, or the trailing failed attempt. `versionId` is the deployment generation id and is accepted by `POST .../deployments:rollback` as `generationId`.
2412
+ properties:
2413
+ actor:
2414
+ $ref: "#/components/schemas/SiteActor"
2415
+ at:
2416
+ $ref: "#/components/schemas/PortableProblemRfc3339"
2417
+ changes:
2418
+ items:
2419
+ $ref: "#/components/schemas/HistoryChange"
2420
+ maxItems: 200
2421
+ type: array
2422
+ failedAttemptsBefore:
2423
+ $ref: "#/components/schemas/HistoryFailedAttempts"
2424
+ failure:
2425
+ $ref: "#/components/schemas/HistoryFailure"
2426
+ outcome:
2427
+ description: "`LIVE`: serving visitors now. `REPLACED`: went live and was superseded. `RESTORED`: went live by restoring an earlier version (`restoredFromVersionId`); once superseded it reads `REPLACED`. `FAILED`: only the trailing entry when the latest attempt failed."
2428
+ enum:
2429
+ - LIVE
2430
+ - REPLACED
2431
+ - RESTORED
2432
+ - FAILED
2433
+ type: string
2434
+ restoredFromVersionId:
2435
+ format: uuid
2436
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2437
+ type: string
2438
+ versionId:
2439
+ format: uuid
2440
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2441
+ type: string
2442
+ required:
2443
+ - at
2444
+ - actor
2445
+ - outcome
2446
+ - changes
2447
+ - failedAttemptsBefore
2448
+ type: object
2449
+ HistoryFailedAttempts:
2450
+ additionalProperties: false
2451
+ description: Failed publish attempts since the previous entry, folded into this one.
2452
+ properties:
2453
+ count:
2454
+ minimum: 0
2455
+ type: integer
2456
+ lastReason:
2457
+ maxLength: 80
2458
+ minLength: 1
2459
+ type: string
2460
+ required:
2461
+ - count
2462
+ type: object
2463
+ HistoryFailure:
2464
+ additionalProperties: false
2465
+ properties:
2466
+ reasonCode:
2467
+ maxLength: 80
2468
+ minLength: 1
2469
+ type: string
2470
+ retryable:
2471
+ type: boolean
2472
+ required:
2473
+ - reasonCode
2474
+ - retryable
2475
+ type: object
2234
2476
  KernelAttemptSubmission:
2235
2477
  additionalProperties: false
2236
2478
  allOf:
@@ -3520,6 +3762,16 @@ components:
3520
3762
  maxLength: 80
3521
3763
  minLength: 1
3522
3764
  type: string
3765
+ publishingPolicy:
3766
+ additionalProperties: false
3767
+ description: "A partial update of `PublishingPolicy`: an omitted member keeps its current value."
3768
+ minProperties: 1
3769
+ properties:
3770
+ galascribeMerges:
3771
+ type: boolean
3772
+ requireReview:
3773
+ type: boolean
3774
+ type: object
3523
3775
  slug:
3524
3776
  maxLength: 80
3525
3777
  minLength: 1
@@ -3537,6 +3789,8 @@ components:
3537
3789
  format: uuid
3538
3790
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
3539
3791
  type: string
3792
+ publishingPolicy:
3793
+ $ref: "#/components/schemas/PublishingPolicy"
3540
3794
  slug:
3541
3795
  maxLength: 80
3542
3796
  minLength: 1
@@ -9831,6 +10085,26 @@ components:
9831
10085
  PostOrganizationsByOrganizationIdPublicationImportsResponse:
9832
10086
  allOf:
9833
10087
  - $ref: "#/components/schemas/OperationResponse"
10088
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest:
10089
+ additionalProperties: false
10090
+ properties:
10091
+ changeIds:
10092
+ items:
10093
+ format: uuid
10094
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
10095
+ type: string
10096
+ maxItems: 20
10097
+ minItems: 1
10098
+ type: array
10099
+ uniqueItems: true
10100
+ scheduledFor:
10101
+ $ref: "#/components/schemas/PortableProblemRfc3339"
10102
+ required:
10103
+ - changeIds
10104
+ type: object
10105
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse:
10106
+ allOf:
10107
+ - $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdPublishesResponse"
9834
10108
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest:
9835
10109
  oneOf:
9836
10110
  - additionalProperties: false
@@ -11121,6 +11395,20 @@ components:
11121
11395
  - CANCELLED
11122
11396
  - FINAL_FAILED
11123
11397
  type: string
11398
+ PublishingPolicy:
11399
+ additionalProperties: false
11400
+ description: "How this publication publishes. Absence of the member on the publication resource means the defaults: `requireReview` false, `galascribeMerges` true."
11401
+ properties:
11402
+ galascribeMerges:
11403
+ description: Default true. When true Galascribe opens and merges the pull request itself through the GitHub App; when false each change must already be merged on GitHub before it can be published.
11404
+ type: boolean
11405
+ requireReview:
11406
+ description: Default false. When true a change needs an approved review before it can be published.
11407
+ type: boolean
11408
+ required:
11409
+ - requireReview
11410
+ - galascribeMerges
11411
+ type: object
11124
11412
  PutOrganizationsByOrganizationIdPublicationsByPublicationIdDestinationRequest:
11125
11413
  additionalProperties: false
11126
11414
  allOf:
@@ -12264,72 +12552,232 @@ components:
12264
12552
  - lastSeenAt
12265
12553
  - current
12266
12554
  type: object
12267
- VerificationPlanEntry:
12555
+ SiteActor:
12268
12556
  additionalProperties: false
12557
+ description: A person named in words. The identity is the display name; no principal id is exposed on this surface.
12269
12558
  properties:
12270
- byteLength:
12271
- format: int64
12272
- minimum: 0
12273
- type: integer
12274
- expectedCandidateDigest:
12275
- pattern: ^sha256:[0-9a-f]{64}$
12276
- type: string
12277
- expectedContentType:
12278
- maxLength: 128
12279
- minLength: 3
12280
- pattern: ^[a-z0-9][a-z0-9!#$&^_.+-]{0,62}/[a-z0-9][a-z0-9!#$&^_.+-]{0,62}(?:; charset=utf-8)?$
12281
- type: string
12282
- path:
12283
- $ref: "#/components/schemas/PortableDeploymentReceiptRepoRelativePath"
12284
- publicRoute:
12285
- $ref: "#/components/schemas/PortableDeploymentReceiptCanonicalRoute"
12286
- routeClass:
12287
- enum:
12288
- - html
12289
- - feed
12290
- - sitemap
12291
- - asset
12292
- - error
12559
+ displayName:
12560
+ maxLength: 200
12561
+ minLength: 1
12293
12562
  type: string
12294
12563
  required:
12295
- - path
12296
- - publicRoute
12297
- - routeClass
12298
- - expectedContentType
12299
- - byteLength
12300
- - expectedCandidateDigest
12564
+ - displayName
12301
12565
  type: object
12302
- VerificationSubmissionFit:
12566
+ SiteAttentionItem:
12303
12567
  additionalProperties: false
12304
- description: The complete verification plan fits one request, and the request carries every entry.
12568
+ description: Something that needs a person to act. The list is empty when nothing does.
12305
12569
  properties:
12306
- state:
12307
- pattern: ^fit$
12570
+ code:
12571
+ enum:
12572
+ - REPOSITORY_NEEDS_UPDATE
12573
+ - CONTENT_CONFLICT
12574
+ - PUBLISH_FAILED
12575
+ - AUTHORIZATION_LOST
12576
+ - REPOSITORY_NOT_SET_UP
12577
+ - DESTINATION_NOT_CHOSEN
12578
+ type: string
12579
+ relatedChangeId:
12580
+ format: uuid
12581
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12308
12582
  type: string
12309
- x-gala-const: fit
12310
- verificationEntries:
12311
- items:
12312
- $ref: "#/components/schemas/VerificationPlanEntry"
12313
- maxItems: 900
12314
- minItems: 1
12315
- type: array
12316
12583
  required:
12317
- - state
12318
- - verificationEntries
12584
+ - code
12319
12585
  type: object
12320
- VerificationSubmissionUnfit:
12586
+ SiteLastPublished:
12321
12587
  additionalProperties: false
12322
- description: The complete verification plan does not fit one request, so the request states why and by how much instead of carrying a truncated plan.
12323
12588
  properties:
12324
- canonicalFitRequestByteCount:
12325
- format: int64
12326
- minimum: 1
12327
- type: integer
12328
- reason:
12329
- enum:
12330
- - entry-count-exceeded
12331
- - encoded-request-limit-exceeded
12332
- type: string
12589
+ actor:
12590
+ $ref: "#/components/schemas/SiteActor"
12591
+ at:
12592
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12593
+ required:
12594
+ - at
12595
+ - actor
12596
+ type: object
12597
+ SitePendingChange:
12598
+ additionalProperties: false
12599
+ allOf:
12600
+ - else:
12601
+ properties:
12602
+ action:
12603
+ enum:
12604
+ - CREATE
12605
+ - EDIT
12606
+ - DELETE
12607
+ if:
12608
+ properties:
12609
+ kind:
12610
+ pattern: ^LOOK$
12611
+ type: string
12612
+ x-gala-const: LOOK
12613
+ required:
12614
+ - kind
12615
+ then:
12616
+ properties:
12617
+ action:
12618
+ pattern: ^CHANGE$
12619
+ type: string
12620
+ x-gala-const: CHANGE
12621
+ description: "One unpublished change in words. Exactly one entry exists per path (and one for the look): when several unpublished changes touch the same path only the newest is listed and older ones are superseded and omitted."
12622
+ properties:
12623
+ action:
12624
+ description: "`CHANGE` is used for `LOOK` and only for `LOOK`; `POST` and `PAGE` use `CREATE`, `EDIT` or `DELETE`."
12625
+ enum:
12626
+ - CREATE
12627
+ - EDIT
12628
+ - DELETE
12629
+ - CHANGE
12630
+ type: string
12631
+ author:
12632
+ $ref: "#/components/schemas/SiteActor"
12633
+ changeId:
12634
+ format: uuid
12635
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12636
+ type: string
12637
+ kind:
12638
+ enum:
12639
+ - POST
12640
+ - PAGE
12641
+ - LOOK
12642
+ type: string
12643
+ path:
12644
+ description: Repository path of the post or page; absent for `LOOK`.
12645
+ maxLength: 512
12646
+ minLength: 1
12647
+ type: string
12648
+ review:
12649
+ description: "`NOT_REQUIRED` when the publication does not require review; otherwise `WAITING`, `APPROVED` or `CHANGES_REQUESTED`."
12650
+ enum:
12651
+ - NOT_REQUIRED
12652
+ - WAITING
12653
+ - APPROVED
12654
+ - CHANGES_REQUESTED
12655
+ type: string
12656
+ reviewId:
12657
+ description: The review a reviewer decides through `POST .../reviews/{reviewId}:decide`. Present when a review exists.
12658
+ format: uuid
12659
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12660
+ type: string
12661
+ theme:
12662
+ $ref: "#/components/schemas/SiteThemeChange"
12663
+ title:
12664
+ maxLength: 200
12665
+ minLength: 1
12666
+ type: string
12667
+ updatedAt:
12668
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12669
+ required:
12670
+ - changeId
12671
+ - kind
12672
+ - action
12673
+ - title
12674
+ - review
12675
+ - updatedAt
12676
+ - author
12677
+ type: object
12678
+ SitePublishing:
12679
+ additionalProperties: false
12680
+ properties:
12681
+ operationId:
12682
+ format: uuid
12683
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12684
+ type: string
12685
+ stage:
12686
+ enum:
12687
+ - PREPARING
12688
+ - BUILDING
12689
+ - GOING_LIVE
12690
+ type: string
12691
+ startedAt:
12692
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12693
+ required:
12694
+ - operationId
12695
+ - stage
12696
+ - startedAt
12697
+ type: object
12698
+ SiteThemeChange:
12699
+ additionalProperties: false
12700
+ properties:
12701
+ from:
12702
+ maxLength: 200
12703
+ minLength: 1
12704
+ type:
12705
+ - string
12706
+ - "null"
12707
+ to:
12708
+ maxLength: 200
12709
+ minLength: 1
12710
+ type: string
12711
+ required:
12712
+ - from
12713
+ - to
12714
+ type: object
12715
+ VerificationPlanEntry:
12716
+ additionalProperties: false
12717
+ properties:
12718
+ byteLength:
12719
+ format: int64
12720
+ minimum: 0
12721
+ type: integer
12722
+ expectedCandidateDigest:
12723
+ pattern: ^sha256:[0-9a-f]{64}$
12724
+ type: string
12725
+ expectedContentType:
12726
+ maxLength: 128
12727
+ minLength: 3
12728
+ pattern: ^[a-z0-9][a-z0-9!#$&^_.+-]{0,62}/[a-z0-9][a-z0-9!#$&^_.+-]{0,62}(?:; charset=utf-8)?$
12729
+ type: string
12730
+ path:
12731
+ $ref: "#/components/schemas/PortableDeploymentReceiptRepoRelativePath"
12732
+ publicRoute:
12733
+ $ref: "#/components/schemas/PortableDeploymentReceiptCanonicalRoute"
12734
+ routeClass:
12735
+ enum:
12736
+ - html
12737
+ - feed
12738
+ - sitemap
12739
+ - asset
12740
+ - error
12741
+ type: string
12742
+ required:
12743
+ - path
12744
+ - publicRoute
12745
+ - routeClass
12746
+ - expectedContentType
12747
+ - byteLength
12748
+ - expectedCandidateDigest
12749
+ type: object
12750
+ VerificationSubmissionFit:
12751
+ additionalProperties: false
12752
+ description: The complete verification plan fits one request, and the request carries every entry.
12753
+ properties:
12754
+ state:
12755
+ pattern: ^fit$
12756
+ type: string
12757
+ x-gala-const: fit
12758
+ verificationEntries:
12759
+ items:
12760
+ $ref: "#/components/schemas/VerificationPlanEntry"
12761
+ maxItems: 900
12762
+ minItems: 1
12763
+ type: array
12764
+ required:
12765
+ - state
12766
+ - verificationEntries
12767
+ type: object
12768
+ VerificationSubmissionUnfit:
12769
+ additionalProperties: false
12770
+ description: The complete verification plan does not fit one request, so the request states why and by how much instead of carrying a truncated plan.
12771
+ properties:
12772
+ canonicalFitRequestByteCount:
12773
+ format: int64
12774
+ minimum: 1
12775
+ type: integer
12776
+ reason:
12777
+ enum:
12778
+ - entry-count-exceeded
12779
+ - encoded-request-limit-exceeded
12780
+ type: string
12333
12781
  requiredVerificationEntryCount:
12334
12782
  maximum: 200000
12335
12783
  minimum: 1
@@ -19688,6 +20136,8 @@ paths:
19688
20136
  x-gala-success-category: query
19689
20137
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
19690
20138
  patch:
20139
+ description: |
20140
+ Updates publication metadata and state. As of schema 2.22.0 the request may also carry `publishingPolicy` (`requireReview`, `galascribeMerges`), a partial update: an omitted member keeps its value. The publication resource (`GET` and this response) returns `publishingPolicy`; its absence means the defaults, `requireReview` false and `galascribeMerges` true. The policy governs `POST .../changes:publish` and the review of changes.
19691
20141
  operationId: patchOrganizationsByOrganizationIdPublicationsByPublicationId
19692
20142
  parameters:
19693
20143
  - $ref: "#/components/parameters/XCorrelationId"
@@ -20266,9 +20716,17 @@ paths:
20266
20716
  - NONE
20267
20717
  x-gala-success-category: query
20268
20718
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
20269
- /v2/organizations/{organizationId}/publications/{publicationId}/configuration-changes:plan:
20719
+ /v2/organizations/{organizationId}/publications/{publicationId}/changes:publish:
20270
20720
  post:
20271
- operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlan
20721
+ description: |
20722
+ Publishes the named repository changes together. For each change, in order:
20723
+
20724
+ 1. If the change is behind the main branch head it is brought up to date automatically when that is clean (the same file-level merge as `:bring-up-to-date`). When it is not clean nothing is written for any change and the response is `409 INVALID_SOURCE_STATE` with one error per conflicting path (`code: CONTENT_CONFLICT`, `pointer: /documents/<path>` or `/assets/<path>`) and the live head on `X-Gala-Current-Head`.
20725
+ 2. If the publication's `publishingPolicy.requireReview` is true and the change has no approval, `409 INVALID_SOURCE_STATE` with `errors[].code REVIEW_REQUIRED` pointed at `/changeIds/<index>`.
20726
+ 3. If `publishingPolicy.galascribeMerges` is true (the default) the server opens and merges the pull request itself through the GitHub App. Otherwise each change must already be merged on GitHub; one that is not is `409 INVALID_SOURCE_STATE` with `errors[].code SOURCE_NOT_MERGED` pointed at `/changeIds/<index>`.
20727
+
20728
+ Then ONE deploy of the resulting main head is started. Success is `202` with the accepted operation (kind `publish`; `publishId` names it, and the operation's `subject.generationId` names the generation once it exists). `scheduledFor` schedules the deploy instead of starting it now and additionally needs `publication.schedule`; it is cancelled with `:cancel` on the publish. `Idempotency-Key` replays the same acceptance. Whole-request validation happens before any change is merged: a refused request merges nothing.
20729
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublish
20272
20730
  parameters:
20273
20731
  - $ref: "#/components/parameters/XCorrelationId"
20274
20732
  - example: 018f0000-0000-7000-8000-000000000001
@@ -20296,33 +20754,31 @@ paths:
20296
20754
  nominal:
20297
20755
  summary: Nominal valid request
20298
20756
  value:
20299
- changeKind: PORTABLE_SETTINGS
20300
- expectedHead: sha1:0000000000000000000000000000000000000000
20301
- inputDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
20757
+ changeIds:
20758
+ - 018f0000-0000-7000-8000-000000000001
20302
20759
  schema:
20303
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest"
20760
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest"
20304
20761
  required: true
20305
20762
  responses:
20306
- "201":
20763
+ "202":
20307
20764
  content:
20308
20765
  application/json:
20309
20766
  examples:
20310
20767
  nominal:
20311
20768
  summary: Nominal successful response
20312
20769
  value:
20313
- changeId: 018f0000-0000-7000-8000-000000000001
20314
- diffDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
20315
- expectedHead: sha1:0000000000000000000000000000000000000000
20316
- state: REQUESTED
20317
- version: 0
20770
+ commandId: 018f0000-0000-7000-8000-000000000001
20771
+ operationId: 018f0000-0000-7000-8000-000000000001
20772
+ phase: accepted
20773
+ publishId: 018f0000-0000-7000-8000-000000000003
20774
+ resourceVersion: 0
20775
+ statusUrl: /v2/organizations/018f0000-0000-7000-8000-000000000001/operations/018f0000-0000-7000-8000-000000000002
20318
20776
  schema:
20319
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanResponse"
20320
- description: plan typed publication or module configuration diff against exact Git head succeeded
20777
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse"
20778
+ description: publish a batch of changes with one deploy of the resulting main head succeeded
20321
20779
  headers:
20322
20780
  Cache-Control:
20323
20781
  $ref: "#/components/headers/CacheControlNoStore"
20324
- Location:
20325
- $ref: "#/components/headers/Location"
20326
20782
  X-Correlation-Id:
20327
20783
  $ref: "#/components/headers/XCorrelationId"
20328
20784
  "400":
@@ -20469,8 +20925,12 @@ paths:
20469
20925
  value:
20470
20926
  code: INVALID_SOURCE_STATE
20471
20927
  correlationId: 018f0000-0000-7000-8000-000000000001
20472
- detail: See the operation contract.
20473
- errors: []
20928
+ detail: "One or more changes cannot be published yet. Each error points at the change or path: CONTENT_CONFLICT at /documents/<path> or /assets/<path>, REVIEW_REQUIRED or SOURCE_NOT_MERGED at /changeIds/<index>. See the operation contract."
20929
+ errors:
20930
+ - code: CONTENT_CONFLICT
20931
+ pointer: /documents/content~1articles~1example.md
20932
+ - code: REVIEW_REQUIRED
20933
+ pointer: /changeIds/1
20474
20934
  retryable: false
20475
20935
  schemaId: urn:gala:schema:problem:2.0.0
20476
20936
  schemaVersion: 2.0.0
@@ -20485,36 +20945,40 @@ paths:
20485
20945
  $ref: "#/components/headers/CacheControlNoStore"
20486
20946
  X-Correlation-Id:
20487
20947
  $ref: "#/components/headers/XCorrelationId"
20948
+ X-Gala-Current-Head:
20949
+ $ref: "#/components/headers/XGalaCurrentHead"
20488
20950
  x-gala-problem-codes:
20489
20951
  - COMMAND_REPLAY_CONFLICT
20490
20952
  - INVALID_SOURCE_STATE
20491
- "422":
20953
+ "429":
20492
20954
  content:
20493
20955
  application/problem+json:
20494
20956
  examples:
20495
- VALIDATION_FAILED:
20496
- summary: VALIDATION_FAILED
20957
+ RATE_LIMITED:
20958
+ summary: RATE_LIMITED
20497
20959
  value:
20498
- code: VALIDATION_FAILED
20960
+ code: RATE_LIMITED
20499
20961
  correlationId: 018f0000-0000-7000-8000-000000000001
20500
20962
  detail: See the operation contract.
20501
20963
  errors: []
20502
- retryable: false
20964
+ retryable: true
20503
20965
  schemaId: urn:gala:schema:problem:2.0.0
20504
20966
  schemaVersion: 2.0.0
20505
- status: 422
20506
- title: VALIDATION_FAILED
20507
- type: urn:gala:problem:validation-failed
20967
+ status: 429
20968
+ title: RATE_LIMITED
20969
+ type: urn:gala:problem:rate-limited
20508
20970
  schema:
20509
20971
  $ref: "#/components/schemas/Problem"
20510
- description: VALIDATION_FAILED
20972
+ description: RATE_LIMITED
20511
20973
  headers:
20512
20974
  Cache-Control:
20513
20975
  $ref: "#/components/headers/CacheControlNoStore"
20976
+ Retry-After:
20977
+ $ref: "#/components/headers/RetryAfter"
20514
20978
  X-Correlation-Id:
20515
20979
  $ref: "#/components/headers/XCorrelationId"
20516
20980
  x-gala-problem-codes:
20517
- - VALIDATION_FAILED
20981
+ - RATE_LIMITED
20518
20982
  "503":
20519
20983
  content:
20520
20984
  application/problem+json:
@@ -20532,9 +20996,22 @@ paths:
20532
20996
  status: 503
20533
20997
  title: CAPABILITY_UNAVAILABLE
20534
20998
  type: urn:gala:problem:capability-unavailable
20999
+ DEPENDENCY_UNAVAILABLE:
21000
+ summary: DEPENDENCY_UNAVAILABLE
21001
+ value:
21002
+ code: DEPENDENCY_UNAVAILABLE
21003
+ correlationId: 018f0000-0000-7000-8000-000000000001
21004
+ detail: See the operation contract.
21005
+ errors: []
21006
+ retryable: true
21007
+ schemaId: urn:gala:schema:problem:2.0.0
21008
+ schemaVersion: 2.0.0
21009
+ status: 503
21010
+ title: DEPENDENCY_UNAVAILABLE
21011
+ type: urn:gala:problem:dependency-unavailable
20535
21012
  schema:
20536
21013
  $ref: "#/components/schemas/Problem"
20537
- description: CAPABILITY_UNAVAILABLE
21014
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
20538
21015
  headers:
20539
21016
  Cache-Control:
20540
21017
  $ref: "#/components/headers/CacheControlNoStore"
@@ -20542,30 +21019,31 @@ paths:
20542
21019
  $ref: "#/components/headers/XCorrelationId"
20543
21020
  x-gala-problem-codes:
20544
21021
  - CAPABILITY_UNAVAILABLE
21022
+ - DEPENDENCY_UNAVAILABLE
20545
21023
  security:
20546
21024
  - browserSession: []
20547
- summary: plan typed publication or module configuration diff against exact Git head
21025
+ summary: publish a batch of changes with one deploy of the resulting main head
20548
21026
  tags:
20549
21027
  - organizations
20550
21028
  x-gala-activation-gate: MVP
20551
21029
  x-gala-activation-guards:
20552
- - Current expected Git head, active binding epoch, and admitted typed configuration contract
20553
- x-gala-capability-key: publication.settings.manage
20554
- x-gala-concurrency: expected-git-head-and-binding-epoch
21030
+ - Active binding epoch, admitted author-source contract, admitted destination, and no transfer or retirement fence
21031
+ x-gala-capability-key: publication.publish
21032
+ x-gala-concurrency: publication-and-destination-epochs
20555
21033
  x-gala-conditional-capabilities:
20556
- - capabilityKey: publication.modules.manage
20557
- when: changeKind == MODULES
20558
- - capabilityKey: publication.policy.manage
20559
- when: changeKind == POLICY
21034
+ - capabilityKey: publication.schedule
21035
+ when: scheduledFor is present
20560
21036
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
20561
21037
  x-gala-nullability: required-and-nullable-are-explicit
20562
- x-gala-purpose: plan typed publication or module configuration diff against exact Git head
21038
+ x-gala-purpose: publish a batch of changes with one deploy of the resulting main head
20563
21039
  x-gala-reachable-problems:
20564
21040
  - AUTHENTICATION_REQUIRED
20565
21041
  - AUTHORIZATION_DENIED
20566
21042
  - CAPABILITY_UNAVAILABLE
20567
21043
  - COMMAND_REPLAY_CONFLICT
21044
+ - DEPENDENCY_UNAVAILABLE
20568
21045
  - INVALID_SOURCE_STATE
21046
+ - RATE_LIMITED
20569
21047
  - REQUEST_FIELD_UNKNOWN
20570
21048
  - RESOURCE_NOT_FOUND
20571
21049
  - VALIDATION_FAILED
@@ -20573,29 +21051,340 @@ paths:
20573
21051
  x-gala-state-guards:
20574
21052
  - Publication:ACTIVE
20575
21053
  - RepositoryBinding:ACTIVE
20576
- - RepositoryChange:REQUESTED -> PLANNED
20577
- x-gala-success-category: create
21054
+ - PublicationDestination:SET|LOCKED
21055
+ - RepositoryChange:PLANNED|AWAITING_CONFIRMATION|COMMITTED -> merged -> published
21056
+ x-gala-success-category: async
20578
21057
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
20579
- /v2/organizations/{organizationId}/publications/{publicationId}/content:
20580
- get:
20581
- description: |
20582
- One git-trees read per declared content root at the linked repository's
20583
- current main branch head, bounded at 2,000 entries. For each listed
20584
- path the server additionally reads that file's header block (bounded,
20585
- from the person's repository, nothing stored) to fill `summary`.
20586
- Exactly one of `summary` or `unreadable` is present on every item this
20587
- operation returns from schema 2.15.0 on: `summary` when the header
20588
- parses, `unreadable` (with a closed `reason`) when it does not or the
20589
- file exceeds the read bound. `kind` comes from the header's own
20590
- `kind` when `summary` is present, and from which declared content
20591
- root the path is under (ARTICLE for `content/articles/`, PAGE for
20592
- `content/pages/`) when it is not. `limit` defaults to 50 here (the
20593
- shared default is 25) because a content list row needs more per
20594
- round trip than most lists; the server may return fewer items than
20595
- `limit` even when more are available. `setUp` reports whether
20596
- `gala/repository.json` is present on main, matching
20597
- `GET .../repository/setup`'s `state`. `publication` is read from the
20598
- settings files
21058
+ /v2/organizations/{organizationId}/publications/{publicationId}/configuration-changes:plan:
21059
+ post:
21060
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlan
21061
+ parameters:
21062
+ - $ref: "#/components/parameters/XCorrelationId"
21063
+ - example: 018f0000-0000-7000-8000-000000000001
21064
+ in: path
21065
+ name: organizationId
21066
+ required: true
21067
+ schema:
21068
+ format: uuid
21069
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
21070
+ type: string
21071
+ - example: 018f0000-0000-7000-8000-000000000001
21072
+ in: path
21073
+ name: publicationId
21074
+ required: true
21075
+ schema:
21076
+ format: uuid
21077
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
21078
+ type: string
21079
+ - $ref: "#/components/parameters/IdempotencyKey"
21080
+ - $ref: "#/components/parameters/XCsrfToken"
21081
+ requestBody:
21082
+ content:
21083
+ application/json:
21084
+ examples:
21085
+ nominal:
21086
+ summary: Nominal valid request
21087
+ value:
21088
+ changeKind: PORTABLE_SETTINGS
21089
+ expectedHead: sha1:0000000000000000000000000000000000000000
21090
+ inputDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
21091
+ schema:
21092
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest"
21093
+ required: true
21094
+ responses:
21095
+ "201":
21096
+ content:
21097
+ application/json:
21098
+ examples:
21099
+ nominal:
21100
+ summary: Nominal successful response
21101
+ value:
21102
+ changeId: 018f0000-0000-7000-8000-000000000001
21103
+ diffDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
21104
+ expectedHead: sha1:0000000000000000000000000000000000000000
21105
+ state: REQUESTED
21106
+ version: 0
21107
+ schema:
21108
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanResponse"
21109
+ description: plan typed publication or module configuration diff against exact Git head succeeded
21110
+ headers:
21111
+ Cache-Control:
21112
+ $ref: "#/components/headers/CacheControlNoStore"
21113
+ Location:
21114
+ $ref: "#/components/headers/Location"
21115
+ X-Correlation-Id:
21116
+ $ref: "#/components/headers/XCorrelationId"
21117
+ "400":
21118
+ content:
21119
+ application/problem+json:
21120
+ examples:
21121
+ REQUEST_FIELD_UNKNOWN:
21122
+ summary: REQUEST_FIELD_UNKNOWN
21123
+ value:
21124
+ code: REQUEST_FIELD_UNKNOWN
21125
+ correlationId: 018f0000-0000-7000-8000-000000000001
21126
+ detail: See the operation contract.
21127
+ errors: []
21128
+ retryable: false
21129
+ schemaId: urn:gala:schema:problem:2.0.0
21130
+ schemaVersion: 2.0.0
21131
+ status: 400
21132
+ title: REQUEST_FIELD_UNKNOWN
21133
+ type: urn:gala:problem:request-field-unknown
21134
+ VALIDATION_FAILED:
21135
+ summary: VALIDATION_FAILED
21136
+ value:
21137
+ code: VALIDATION_FAILED
21138
+ correlationId: 018f0000-0000-7000-8000-000000000001
21139
+ detail: See the operation contract.
21140
+ errors: []
21141
+ retryable: false
21142
+ schemaId: urn:gala:schema:problem:2.0.0
21143
+ schemaVersion: 2.0.0
21144
+ status: 400
21145
+ title: VALIDATION_FAILED
21146
+ type: urn:gala:problem:validation-failed
21147
+ schema:
21148
+ $ref: "#/components/schemas/Problem"
21149
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
21150
+ headers:
21151
+ Cache-Control:
21152
+ $ref: "#/components/headers/CacheControlNoStore"
21153
+ X-Correlation-Id:
21154
+ $ref: "#/components/headers/XCorrelationId"
21155
+ x-gala-problem-codes:
21156
+ - REQUEST_FIELD_UNKNOWN
21157
+ - VALIDATION_FAILED
21158
+ "401":
21159
+ content:
21160
+ application/problem+json:
21161
+ examples:
21162
+ AUTHENTICATION_REQUIRED:
21163
+ summary: AUTHENTICATION_REQUIRED
21164
+ value:
21165
+ code: AUTHENTICATION_REQUIRED
21166
+ correlationId: 018f0000-0000-7000-8000-000000000001
21167
+ detail: See the operation contract.
21168
+ errors: []
21169
+ retryable: false
21170
+ schemaId: urn:gala:schema:problem:2.0.0
21171
+ schemaVersion: 2.0.0
21172
+ status: 401
21173
+ title: AUTHENTICATION_REQUIRED
21174
+ type: urn:gala:problem:authentication-required
21175
+ schema:
21176
+ $ref: "#/components/schemas/Problem"
21177
+ description: AUTHENTICATION_REQUIRED
21178
+ headers:
21179
+ Cache-Control:
21180
+ $ref: "#/components/headers/CacheControlNoStore"
21181
+ X-Correlation-Id:
21182
+ $ref: "#/components/headers/XCorrelationId"
21183
+ x-gala-problem-codes:
21184
+ - AUTHENTICATION_REQUIRED
21185
+ "403":
21186
+ content:
21187
+ application/problem+json:
21188
+ examples:
21189
+ AUTHORIZATION_DENIED:
21190
+ summary: AUTHORIZATION_DENIED
21191
+ value:
21192
+ code: AUTHORIZATION_DENIED
21193
+ correlationId: 018f0000-0000-7000-8000-000000000001
21194
+ detail: See the operation contract.
21195
+ errors: []
21196
+ retryable: false
21197
+ schemaId: urn:gala:schema:problem:2.0.0
21198
+ schemaVersion: 2.0.0
21199
+ status: 403
21200
+ title: AUTHORIZATION_DENIED
21201
+ type: urn:gala:problem:authorization-denied
21202
+ schema:
21203
+ $ref: "#/components/schemas/Problem"
21204
+ description: AUTHORIZATION_DENIED
21205
+ headers:
21206
+ Cache-Control:
21207
+ $ref: "#/components/headers/CacheControlNoStore"
21208
+ X-Correlation-Id:
21209
+ $ref: "#/components/headers/XCorrelationId"
21210
+ x-gala-problem-codes:
21211
+ - AUTHORIZATION_DENIED
21212
+ "404":
21213
+ content:
21214
+ application/problem+json:
21215
+ examples:
21216
+ RESOURCE_NOT_FOUND:
21217
+ summary: RESOURCE_NOT_FOUND
21218
+ value:
21219
+ code: RESOURCE_NOT_FOUND
21220
+ correlationId: 018f0000-0000-7000-8000-000000000001
21221
+ detail: See the operation contract.
21222
+ errors: []
21223
+ retryable: false
21224
+ schemaId: urn:gala:schema:problem:2.0.0
21225
+ schemaVersion: 2.0.0
21226
+ status: 404
21227
+ title: RESOURCE_NOT_FOUND
21228
+ type: urn:gala:problem:resource-not-found
21229
+ schema:
21230
+ $ref: "#/components/schemas/Problem"
21231
+ description: RESOURCE_NOT_FOUND
21232
+ headers:
21233
+ Cache-Control:
21234
+ $ref: "#/components/headers/CacheControlNoStore"
21235
+ X-Correlation-Id:
21236
+ $ref: "#/components/headers/XCorrelationId"
21237
+ x-gala-problem-codes:
21238
+ - RESOURCE_NOT_FOUND
21239
+ "409":
21240
+ content:
21241
+ application/problem+json:
21242
+ examples:
21243
+ COMMAND_REPLAY_CONFLICT:
21244
+ summary: COMMAND_REPLAY_CONFLICT
21245
+ value:
21246
+ code: COMMAND_REPLAY_CONFLICT
21247
+ correlationId: 018f0000-0000-7000-8000-000000000001
21248
+ detail: See the operation contract.
21249
+ errors: []
21250
+ retryable: false
21251
+ schemaId: urn:gala:schema:problem:2.0.0
21252
+ schemaVersion: 2.0.0
21253
+ status: 409
21254
+ title: COMMAND_REPLAY_CONFLICT
21255
+ type: urn:gala:problem:command-replay-conflict
21256
+ INVALID_SOURCE_STATE:
21257
+ summary: INVALID_SOURCE_STATE
21258
+ value:
21259
+ code: INVALID_SOURCE_STATE
21260
+ correlationId: 018f0000-0000-7000-8000-000000000001
21261
+ detail: See the operation contract.
21262
+ errors: []
21263
+ retryable: false
21264
+ schemaId: urn:gala:schema:problem:2.0.0
21265
+ schemaVersion: 2.0.0
21266
+ status: 409
21267
+ title: INVALID_SOURCE_STATE
21268
+ type: urn:gala:problem:invalid-source-state
21269
+ schema:
21270
+ $ref: "#/components/schemas/Problem"
21271
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
21272
+ headers:
21273
+ Cache-Control:
21274
+ $ref: "#/components/headers/CacheControlNoStore"
21275
+ X-Correlation-Id:
21276
+ $ref: "#/components/headers/XCorrelationId"
21277
+ x-gala-problem-codes:
21278
+ - COMMAND_REPLAY_CONFLICT
21279
+ - INVALID_SOURCE_STATE
21280
+ "422":
21281
+ content:
21282
+ application/problem+json:
21283
+ examples:
21284
+ VALIDATION_FAILED:
21285
+ summary: VALIDATION_FAILED
21286
+ value:
21287
+ code: VALIDATION_FAILED
21288
+ correlationId: 018f0000-0000-7000-8000-000000000001
21289
+ detail: See the operation contract.
21290
+ errors: []
21291
+ retryable: false
21292
+ schemaId: urn:gala:schema:problem:2.0.0
21293
+ schemaVersion: 2.0.0
21294
+ status: 422
21295
+ title: VALIDATION_FAILED
21296
+ type: urn:gala:problem:validation-failed
21297
+ schema:
21298
+ $ref: "#/components/schemas/Problem"
21299
+ description: VALIDATION_FAILED
21300
+ headers:
21301
+ Cache-Control:
21302
+ $ref: "#/components/headers/CacheControlNoStore"
21303
+ X-Correlation-Id:
21304
+ $ref: "#/components/headers/XCorrelationId"
21305
+ x-gala-problem-codes:
21306
+ - VALIDATION_FAILED
21307
+ "503":
21308
+ content:
21309
+ application/problem+json:
21310
+ examples:
21311
+ CAPABILITY_UNAVAILABLE:
21312
+ summary: CAPABILITY_UNAVAILABLE
21313
+ value:
21314
+ code: CAPABILITY_UNAVAILABLE
21315
+ correlationId: 018f0000-0000-7000-8000-000000000001
21316
+ detail: See the operation contract.
21317
+ errors: []
21318
+ retryable: false
21319
+ schemaId: urn:gala:schema:problem:2.0.0
21320
+ schemaVersion: 2.0.0
21321
+ status: 503
21322
+ title: CAPABILITY_UNAVAILABLE
21323
+ type: urn:gala:problem:capability-unavailable
21324
+ schema:
21325
+ $ref: "#/components/schemas/Problem"
21326
+ description: CAPABILITY_UNAVAILABLE
21327
+ headers:
21328
+ Cache-Control:
21329
+ $ref: "#/components/headers/CacheControlNoStore"
21330
+ X-Correlation-Id:
21331
+ $ref: "#/components/headers/XCorrelationId"
21332
+ x-gala-problem-codes:
21333
+ - CAPABILITY_UNAVAILABLE
21334
+ security:
21335
+ - browserSession: []
21336
+ summary: plan typed publication or module configuration diff against exact Git head
21337
+ tags:
21338
+ - organizations
21339
+ x-gala-activation-gate: MVP
21340
+ x-gala-activation-guards:
21341
+ - Current expected Git head, active binding epoch, and admitted typed configuration contract
21342
+ x-gala-capability-key: publication.settings.manage
21343
+ x-gala-concurrency: expected-git-head-and-binding-epoch
21344
+ x-gala-conditional-capabilities:
21345
+ - capabilityKey: publication.modules.manage
21346
+ when: changeKind == MODULES
21347
+ - capabilityKey: publication.policy.manage
21348
+ when: changeKind == POLICY
21349
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
21350
+ x-gala-nullability: required-and-nullable-are-explicit
21351
+ x-gala-purpose: plan typed publication or module configuration diff against exact Git head
21352
+ x-gala-reachable-problems:
21353
+ - AUTHENTICATION_REQUIRED
21354
+ - AUTHORIZATION_DENIED
21355
+ - CAPABILITY_UNAVAILABLE
21356
+ - COMMAND_REPLAY_CONFLICT
21357
+ - INVALID_SOURCE_STATE
21358
+ - REQUEST_FIELD_UNKNOWN
21359
+ - RESOURCE_NOT_FOUND
21360
+ - VALIDATION_FAILED
21361
+ x-gala-replay-identity: idempotency-key
21362
+ x-gala-state-guards:
21363
+ - Publication:ACTIVE
21364
+ - RepositoryBinding:ACTIVE
21365
+ - RepositoryChange:REQUESTED -> PLANNED
21366
+ x-gala-success-category: create
21367
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
21368
+ /v2/organizations/{organizationId}/publications/{publicationId}/content:
21369
+ get:
21370
+ description: |
21371
+ One git-trees read per declared content root at the linked repository's
21372
+ current main branch head, bounded at 2,000 entries. For each listed
21373
+ path the server additionally reads that file's header block (bounded,
21374
+ from the person's repository, nothing stored) to fill `summary`.
21375
+ Exactly one of `summary` or `unreadable` is present on every item this
21376
+ operation returns from schema 2.15.0 on: `summary` when the header
21377
+ parses, `unreadable` (with a closed `reason`) when it does not or the
21378
+ file exceeds the read bound. `kind` comes from the header's own
21379
+ `kind` when `summary` is present, and from which declared content
21380
+ root the path is under (ARTICLE for `content/articles/`, PAGE for
21381
+ `content/pages/`) when it is not. `limit` defaults to 50 here (the
21382
+ shared default is 25) because a content list row needs more per
21383
+ round trip than most lists; the server may return fewer items than
21384
+ `limit` even when more are available. `setUp` reports whether
21385
+ `gala/repository.json` is present on main, matching
21386
+ `GET .../repository/setup`'s `state`. `publication` is read from the
21387
+ settings files
20599
21388
  (`gala/repository.json`, `gala/appearance.json`, `gala/authors/`) at
20600
21389
  this same main-branch head, and is returned on every page of the
20601
21390
  inventory, not only the first, so the editor has these facts
@@ -22594,6 +23383,8 @@ paths:
22594
23383
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
22595
23384
  /v2/organizations/{organizationId}/publications/{publicationId}/deployments:rollback:
22596
23385
  post:
23386
+ description: |
23387
+ Also the restore operation of the history read: `generationId` is a history entry's `versionId`. Only a generation that went live is accepted; any other generation is `409 INVALID_SOURCE_STATE`. A restore is recorded in `GET .../history` as an entry with `outcome: RESTORED`. Clients pass a short `reasonCode` such as `RESTORE_FROM_HISTORY`.
22597
23388
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsRollback
22598
23389
  parameters:
22599
23390
  - $ref: "#/components/parameters/XCorrelationId"
@@ -23349,127 +24140,317 @@ paths:
23349
24140
  type: urn:gala:problem:invalid-source-state
23350
24141
  schema:
23351
24142
  $ref: "#/components/schemas/Problem"
23352
- description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
24143
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
24144
+ headers:
24145
+ Cache-Control:
24146
+ $ref: "#/components/headers/CacheControlNoStore"
24147
+ X-Correlation-Id:
24148
+ $ref: "#/components/headers/XCorrelationId"
24149
+ x-gala-problem-codes:
24150
+ - COMMAND_REPLAY_CONFLICT
24151
+ - INVALID_SOURCE_STATE
24152
+ "412":
24153
+ content:
24154
+ application/problem+json:
24155
+ examples:
24156
+ STALE_AGGREGATE_VERSION:
24157
+ summary: STALE_AGGREGATE_VERSION
24158
+ value:
24159
+ code: STALE_AGGREGATE_VERSION
24160
+ correlationId: 018f0000-0000-7000-8000-000000000001
24161
+ detail: See the operation contract.
24162
+ errors: []
24163
+ retryable: false
24164
+ schemaId: urn:gala:schema:problem:2.0.0
24165
+ schemaVersion: 2.0.0
24166
+ status: 412
24167
+ title: STALE_AGGREGATE_VERSION
24168
+ type: urn:gala:problem:stale-aggregate-version
24169
+ schema:
24170
+ $ref: "#/components/schemas/Problem"
24171
+ description: STALE_AGGREGATE_VERSION
24172
+ headers:
24173
+ Cache-Control:
24174
+ $ref: "#/components/headers/CacheControlNoStore"
24175
+ X-Correlation-Id:
24176
+ $ref: "#/components/headers/XCorrelationId"
24177
+ x-gala-problem-codes:
24178
+ - STALE_AGGREGATE_VERSION
24179
+ "422":
24180
+ content:
24181
+ application/problem+json:
24182
+ examples:
24183
+ VALIDATION_FAILED:
24184
+ summary: VALIDATION_FAILED
24185
+ value:
24186
+ code: VALIDATION_FAILED
24187
+ correlationId: 018f0000-0000-7000-8000-000000000001
24188
+ detail: Region is not one row of the accepted region catalog. See the operation contract for the served/staging-bucket-equal and forbidden-providerBinding variants of this problem.
24189
+ errors:
24190
+ - code: VALIDATION_FAILED
24191
+ pointer: /providerBinding/region
24192
+ retryable: false
24193
+ schemaId: urn:gala:schema:problem:2.0.0
24194
+ schemaVersion: 2.0.0
24195
+ status: 422
24196
+ title: VALIDATION_FAILED
24197
+ type: urn:gala:problem:validation-failed
24198
+ schema:
24199
+ $ref: "#/components/schemas/Problem"
24200
+ description: VALIDATION_FAILED
24201
+ headers:
24202
+ Cache-Control:
24203
+ $ref: "#/components/headers/CacheControlNoStore"
24204
+ X-Correlation-Id:
24205
+ $ref: "#/components/headers/XCorrelationId"
24206
+ x-gala-problem-codes:
24207
+ - VALIDATION_FAILED
24208
+ "503":
24209
+ content:
24210
+ application/problem+json:
24211
+ examples:
24212
+ CAPABILITY_UNAVAILABLE:
24213
+ summary: CAPABILITY_UNAVAILABLE
24214
+ value:
24215
+ code: CAPABILITY_UNAVAILABLE
24216
+ correlationId: 018f0000-0000-7000-8000-000000000001
24217
+ detail: See the operation contract.
24218
+ errors: []
24219
+ retryable: false
24220
+ schemaId: urn:gala:schema:problem:2.0.0
24221
+ schemaVersion: 2.0.0
24222
+ status: 503
24223
+ title: CAPABILITY_UNAVAILABLE
24224
+ type: urn:gala:problem:capability-unavailable
24225
+ schema:
24226
+ $ref: "#/components/schemas/Problem"
24227
+ description: CAPABILITY_UNAVAILABLE
24228
+ headers:
24229
+ Cache-Control:
24230
+ $ref: "#/components/headers/CacheControlNoStore"
24231
+ X-Correlation-Id:
24232
+ $ref: "#/components/headers/XCorrelationId"
24233
+ x-gala-problem-codes:
24234
+ - CAPABILITY_UNAVAILABLE
24235
+ security:
24236
+ - browserSession: []
24237
+ summary: set publication destination
24238
+ tags:
24239
+ - organizations
24240
+ x-gala-activation-gate: MVP
24241
+ x-gala-activation-guards:
24242
+ - Accepted region catalog membership, globally unique Spaces bucket names, and an unlocked destination
24243
+ x-gala-capability-key: publication.settings.manage
24244
+ x-gala-concurrency: if-match
24245
+ x-gala-conditional-capabilities: []
24246
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
24247
+ x-gala-nullability: required-and-nullable-are-explicit
24248
+ x-gala-purpose: set publication destination
24249
+ x-gala-reachable-problems:
24250
+ - AUTHENTICATION_REQUIRED
24251
+ - AUTHORIZATION_DENIED
24252
+ - CAPABILITY_UNAVAILABLE
24253
+ - COMMAND_REPLAY_CONFLICT
24254
+ - INVALID_SOURCE_STATE
24255
+ - REQUEST_FIELD_UNKNOWN
24256
+ - RESOURCE_NOT_FOUND
24257
+ - STALE_AGGREGATE_VERSION
24258
+ - VALIDATION_FAILED
24259
+ x-gala-replay-identity: idempotency-key
24260
+ x-gala-state-guards:
24261
+ - Publication:PROVISIONING|ACTIVE|PAUSED
24262
+ - PublicationDestination:UNSET|SET
24263
+ x-gala-success-category: update
24264
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
24265
+ /v2/organizations/{organizationId}/publications/{publicationId}/history:
24266
+ get:
24267
+ description: |
24268
+ Versions of the site that went live, newest first, on a stable keyset cursor, each described by who published it, when, and what changed in words. A failed attempt is never an entry of its own: failed attempts since the previous entry are folded into the next entry that went live as `failedAttemptsBefore`. Only when the latest attempt failed is there one trailing entry with `outcome: FAILED` (the first entry in the list), carrying `failure.reasonCode` and `failure.retryable` and no `versionId`.
24269
+
24270
+ `versionId` is the deployment generation id. To restore a version call `POST .../deployments:rollback` with `generationId` set to `versionId`; no separate restore operation exists. Only a version that went live is accepted; any other generation is `409 INVALID_SOURCE_STATE`.
24271
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdHistory
24272
+ parameters:
24273
+ - $ref: "#/components/parameters/XCorrelationId"
24274
+ - example: 018f0000-0000-7000-8000-000000000001
24275
+ in: path
24276
+ name: organizationId
24277
+ required: true
24278
+ schema:
24279
+ format: uuid
24280
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
24281
+ type: string
24282
+ - example: 018f0000-0000-7000-8000-000000000001
24283
+ in: path
24284
+ name: publicationId
24285
+ required: true
24286
+ schema:
24287
+ format: uuid
24288
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
24289
+ type: string
24290
+ - $ref: "#/components/parameters/Cursor"
24291
+ - $ref: "#/components/parameters/Limit"
24292
+ responses:
24293
+ "200":
24294
+ content:
24295
+ application/json:
24296
+ examples:
24297
+ nominal:
24298
+ summary: Nominal successful response
24299
+ value:
24300
+ hasMore: false
24301
+ items:
24302
+ - actor:
24303
+ displayName: Asha Rao
24304
+ at: "2026-10-05T09:30:00Z"
24305
+ changes:
24306
+ - action: EDIT
24307
+ kind: POST
24308
+ path: content/articles/hello.md
24309
+ title: Hello, world
24310
+ failedAttemptsBefore:
24311
+ count: 1
24312
+ lastReason: BUILD_FAILED
24313
+ outcome: LIVE
24314
+ versionId: 018f0000-0000-7000-8000-000000000001
24315
+ schema:
24316
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHistoryResponse"
24317
+ description: list the versions of this publication that went live succeeded
24318
+ headers:
24319
+ Cache-Control:
24320
+ $ref: "#/components/headers/CacheControlNoStore"
24321
+ X-Correlation-Id:
24322
+ $ref: "#/components/headers/XCorrelationId"
24323
+ "400":
24324
+ content:
24325
+ application/problem+json:
24326
+ examples:
24327
+ VALIDATION_FAILED:
24328
+ summary: VALIDATION_FAILED
24329
+ value:
24330
+ code: VALIDATION_FAILED
24331
+ correlationId: 018f0000-0000-7000-8000-000000000001
24332
+ detail: See the operation contract.
24333
+ errors: []
24334
+ retryable: false
24335
+ schemaId: urn:gala:schema:problem:2.0.0
24336
+ schemaVersion: 2.0.0
24337
+ status: 400
24338
+ title: VALIDATION_FAILED
24339
+ type: urn:gala:problem:validation-failed
24340
+ schema:
24341
+ $ref: "#/components/schemas/Problem"
24342
+ description: VALIDATION_FAILED
23353
24343
  headers:
23354
24344
  Cache-Control:
23355
24345
  $ref: "#/components/headers/CacheControlNoStore"
23356
24346
  X-Correlation-Id:
23357
24347
  $ref: "#/components/headers/XCorrelationId"
23358
24348
  x-gala-problem-codes:
23359
- - COMMAND_REPLAY_CONFLICT
23360
- - INVALID_SOURCE_STATE
23361
- "412":
24349
+ - VALIDATION_FAILED
24350
+ "401":
23362
24351
  content:
23363
24352
  application/problem+json:
23364
24353
  examples:
23365
- STALE_AGGREGATE_VERSION:
23366
- summary: STALE_AGGREGATE_VERSION
24354
+ AUTHENTICATION_REQUIRED:
24355
+ summary: AUTHENTICATION_REQUIRED
23367
24356
  value:
23368
- code: STALE_AGGREGATE_VERSION
24357
+ code: AUTHENTICATION_REQUIRED
23369
24358
  correlationId: 018f0000-0000-7000-8000-000000000001
23370
24359
  detail: See the operation contract.
23371
24360
  errors: []
23372
24361
  retryable: false
23373
24362
  schemaId: urn:gala:schema:problem:2.0.0
23374
24363
  schemaVersion: 2.0.0
23375
- status: 412
23376
- title: STALE_AGGREGATE_VERSION
23377
- type: urn:gala:problem:stale-aggregate-version
24364
+ status: 401
24365
+ title: AUTHENTICATION_REQUIRED
24366
+ type: urn:gala:problem:authentication-required
23378
24367
  schema:
23379
24368
  $ref: "#/components/schemas/Problem"
23380
- description: STALE_AGGREGATE_VERSION
24369
+ description: AUTHENTICATION_REQUIRED
23381
24370
  headers:
23382
24371
  Cache-Control:
23383
24372
  $ref: "#/components/headers/CacheControlNoStore"
23384
24373
  X-Correlation-Id:
23385
24374
  $ref: "#/components/headers/XCorrelationId"
23386
24375
  x-gala-problem-codes:
23387
- - STALE_AGGREGATE_VERSION
23388
- "422":
24376
+ - AUTHENTICATION_REQUIRED
24377
+ "403":
23389
24378
  content:
23390
24379
  application/problem+json:
23391
24380
  examples:
23392
- VALIDATION_FAILED:
23393
- summary: VALIDATION_FAILED
24381
+ AUTHORIZATION_DENIED:
24382
+ summary: AUTHORIZATION_DENIED
23394
24383
  value:
23395
- code: VALIDATION_FAILED
24384
+ code: AUTHORIZATION_DENIED
23396
24385
  correlationId: 018f0000-0000-7000-8000-000000000001
23397
- detail: Region is not one row of the accepted region catalog. See the operation contract for the served/staging-bucket-equal and forbidden-providerBinding variants of this problem.
23398
- errors:
23399
- - code: VALIDATION_FAILED
23400
- pointer: /providerBinding/region
24386
+ detail: See the operation contract.
24387
+ errors: []
23401
24388
  retryable: false
23402
24389
  schemaId: urn:gala:schema:problem:2.0.0
23403
24390
  schemaVersion: 2.0.0
23404
- status: 422
23405
- title: VALIDATION_FAILED
23406
- type: urn:gala:problem:validation-failed
24391
+ status: 403
24392
+ title: AUTHORIZATION_DENIED
24393
+ type: urn:gala:problem:authorization-denied
23407
24394
  schema:
23408
24395
  $ref: "#/components/schemas/Problem"
23409
- description: VALIDATION_FAILED
24396
+ description: AUTHORIZATION_DENIED
23410
24397
  headers:
23411
24398
  Cache-Control:
23412
24399
  $ref: "#/components/headers/CacheControlNoStore"
23413
24400
  X-Correlation-Id:
23414
24401
  $ref: "#/components/headers/XCorrelationId"
23415
24402
  x-gala-problem-codes:
23416
- - VALIDATION_FAILED
23417
- "503":
24403
+ - AUTHORIZATION_DENIED
24404
+ "404":
23418
24405
  content:
23419
24406
  application/problem+json:
23420
24407
  examples:
23421
- CAPABILITY_UNAVAILABLE:
23422
- summary: CAPABILITY_UNAVAILABLE
24408
+ RESOURCE_NOT_FOUND:
24409
+ summary: RESOURCE_NOT_FOUND
23423
24410
  value:
23424
- code: CAPABILITY_UNAVAILABLE
24411
+ code: RESOURCE_NOT_FOUND
23425
24412
  correlationId: 018f0000-0000-7000-8000-000000000001
23426
24413
  detail: See the operation contract.
23427
24414
  errors: []
23428
24415
  retryable: false
23429
24416
  schemaId: urn:gala:schema:problem:2.0.0
23430
24417
  schemaVersion: 2.0.0
23431
- status: 503
23432
- title: CAPABILITY_UNAVAILABLE
23433
- type: urn:gala:problem:capability-unavailable
24418
+ status: 404
24419
+ title: RESOURCE_NOT_FOUND
24420
+ type: urn:gala:problem:resource-not-found
23434
24421
  schema:
23435
24422
  $ref: "#/components/schemas/Problem"
23436
- description: CAPABILITY_UNAVAILABLE
24423
+ description: RESOURCE_NOT_FOUND
23437
24424
  headers:
23438
24425
  Cache-Control:
23439
24426
  $ref: "#/components/headers/CacheControlNoStore"
23440
24427
  X-Correlation-Id:
23441
24428
  $ref: "#/components/headers/XCorrelationId"
23442
24429
  x-gala-problem-codes:
23443
- - CAPABILITY_UNAVAILABLE
24430
+ - RESOURCE_NOT_FOUND
23444
24431
  security:
23445
24432
  - browserSession: []
23446
- summary: set publication destination
24433
+ summary: list the versions of this publication that went live
23447
24434
  tags:
23448
24435
  - organizations
23449
24436
  x-gala-activation-gate: MVP
23450
24437
  x-gala-activation-guards:
23451
- - Accepted region catalog membership, globally unique Spaces bucket names, and an unlocked destination
23452
- x-gala-capability-key: publication.settings.manage
23453
- x-gala-concurrency: if-match
24438
+ - NONE
24439
+ x-gala-capability-key: publication.view
24440
+ x-gala-concurrency: publication-and-destination-epochs
23454
24441
  x-gala-conditional-capabilities: []
23455
24442
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
23456
24443
  x-gala-nullability: required-and-nullable-are-explicit
23457
- x-gala-purpose: set publication destination
24444
+ x-gala-purpose: list the versions of this publication that went live
23458
24445
  x-gala-reachable-problems:
23459
24446
  - AUTHENTICATION_REQUIRED
23460
24447
  - AUTHORIZATION_DENIED
23461
- - CAPABILITY_UNAVAILABLE
23462
- - COMMAND_REPLAY_CONFLICT
23463
- - INVALID_SOURCE_STATE
23464
- - REQUEST_FIELD_UNKNOWN
23465
24448
  - RESOURCE_NOT_FOUND
23466
- - STALE_AGGREGATE_VERSION
23467
24449
  - VALIDATION_FAILED
23468
- x-gala-replay-identity: idempotency-key
24450
+ x-gala-replay-identity: safe-query
23469
24451
  x-gala-state-guards:
23470
- - Publication:PROVISIONING|ACTIVE|PAUSED
23471
- - PublicationDestination:UNSET|SET
23472
- x-gala-success-category: update
24452
+ - NONE
24453
+ x-gala-success-category: query
23473
24454
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
23474
24455
  /v2/organizations/{organizationId}/publications/{publicationId}/publishes:
23475
24456
  post:
@@ -27877,6 +28858,8 @@ paths:
27877
28858
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
27878
28859
  /v2/organizations/{organizationId}/publications/{publicationId}/reviews/{reviewId}:decide:
27879
28860
  post:
28861
+ description: |
28862
+ The in-Galascribe approval. `APPROVE` approves; `REJECT` is the request-changes decision shown to people as "changes requested". When the publication's `publishingPolicy.galascribeMerges` is true (the default), approving also triggers the merge of the change's pull request through the GitHub App; the pull request is a mirror of the decision, not a second approval. `reviewId` for a pending change is `pendingChanges[].reviewId` of `GET .../site`.
27880
28863
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdReviewsByReviewIdDecide
27881
28864
  parameters:
27882
28865
  - $ref: "#/components/parameters/XCorrelationId"
@@ -28216,6 +29199,209 @@ paths:
28216
29199
  - Review:REQUESTED -> APPROVED|REJECTED
28217
29200
  x-gala-success-category: update
28218
29201
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
29202
+ /v2/organizations/{organizationId}/publications/{publicationId}/site:
29203
+ get:
29204
+ description: |
29205
+ The one read behind a Home screen: the live address, whether the site is live, publishing or has never been published, who published last, the unpublished changes in words, and what needs attention.
29206
+
29207
+ `pendingChanges` holds exactly one entry per path (and one for the look): the newest unpublished change for a path wins, older ones are superseded and omitted. `review` is `NOT_REQUIRED` unless the publication's `publishingPolicy.requireReview` is true. `attention[].code` is a closed vocabulary; `relatedChangeId` names the change that needs the action. `publishing.stage` follows `PREPARING`, `BUILDING`, `GOING_LIVE`. Read from the platform's own records; nothing is read from the person's repository.
29208
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdSite
29209
+ parameters:
29210
+ - $ref: "#/components/parameters/XCorrelationId"
29211
+ - example: 018f0000-0000-7000-8000-000000000001
29212
+ in: path
29213
+ name: organizationId
29214
+ required: true
29215
+ schema:
29216
+ format: uuid
29217
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
29218
+ type: string
29219
+ - example: 018f0000-0000-7000-8000-000000000001
29220
+ in: path
29221
+ name: publicationId
29222
+ required: true
29223
+ schema:
29224
+ format: uuid
29225
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
29226
+ type: string
29227
+ responses:
29228
+ "200":
29229
+ content:
29230
+ application/json:
29231
+ examples:
29232
+ nominal:
29233
+ summary: Nominal successful response
29234
+ value:
29235
+ attention:
29236
+ - code: REPOSITORY_NEEDS_UPDATE
29237
+ relatedChangeId: 018f0000-0000-7000-8000-000000000002
29238
+ lastPublished:
29239
+ actor:
29240
+ displayName: Asha Rao
29241
+ at: "2026-10-05T09:30:00Z"
29242
+ pendingChanges:
29243
+ - action: EDIT
29244
+ author:
29245
+ displayName: Asha Rao
29246
+ changeId: 018f0000-0000-7000-8000-000000000002
29247
+ kind: POST
29248
+ path: content/articles/hello.md
29249
+ review: NOT_REQUIRED
29250
+ title: Hello, world
29251
+ updatedAt: "2026-10-05T09:30:00Z"
29252
+ - action: CHANGE
29253
+ author:
29254
+ displayName: Asha Rao
29255
+ changeId: 018f0000-0000-7000-8000-000000000003
29256
+ kind: LOOK
29257
+ review: NOT_REQUIRED
29258
+ theme:
29259
+ from: Default
29260
+ to: Journal
29261
+ title: Look
29262
+ updatedAt: "2026-10-05T09:30:00Z"
29263
+ state: LIVE
29264
+ url: https://example.galascribe.com/
29265
+ schema:
29266
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteResponse"
29267
+ description: read the site summary of this publication succeeded
29268
+ headers:
29269
+ Cache-Control:
29270
+ $ref: "#/components/headers/CacheControlNoStore"
29271
+ X-Correlation-Id:
29272
+ $ref: "#/components/headers/XCorrelationId"
29273
+ "400":
29274
+ content:
29275
+ application/problem+json:
29276
+ examples:
29277
+ VALIDATION_FAILED:
29278
+ summary: VALIDATION_FAILED
29279
+ value:
29280
+ code: VALIDATION_FAILED
29281
+ correlationId: 018f0000-0000-7000-8000-000000000001
29282
+ detail: See the operation contract.
29283
+ errors: []
29284
+ retryable: false
29285
+ schemaId: urn:gala:schema:problem:2.0.0
29286
+ schemaVersion: 2.0.0
29287
+ status: 400
29288
+ title: VALIDATION_FAILED
29289
+ type: urn:gala:problem:validation-failed
29290
+ schema:
29291
+ $ref: "#/components/schemas/Problem"
29292
+ description: VALIDATION_FAILED
29293
+ headers:
29294
+ Cache-Control:
29295
+ $ref: "#/components/headers/CacheControlNoStore"
29296
+ X-Correlation-Id:
29297
+ $ref: "#/components/headers/XCorrelationId"
29298
+ x-gala-problem-codes:
29299
+ - VALIDATION_FAILED
29300
+ "401":
29301
+ content:
29302
+ application/problem+json:
29303
+ examples:
29304
+ AUTHENTICATION_REQUIRED:
29305
+ summary: AUTHENTICATION_REQUIRED
29306
+ value:
29307
+ code: AUTHENTICATION_REQUIRED
29308
+ correlationId: 018f0000-0000-7000-8000-000000000001
29309
+ detail: See the operation contract.
29310
+ errors: []
29311
+ retryable: false
29312
+ schemaId: urn:gala:schema:problem:2.0.0
29313
+ schemaVersion: 2.0.0
29314
+ status: 401
29315
+ title: AUTHENTICATION_REQUIRED
29316
+ type: urn:gala:problem:authentication-required
29317
+ schema:
29318
+ $ref: "#/components/schemas/Problem"
29319
+ description: AUTHENTICATION_REQUIRED
29320
+ headers:
29321
+ Cache-Control:
29322
+ $ref: "#/components/headers/CacheControlNoStore"
29323
+ X-Correlation-Id:
29324
+ $ref: "#/components/headers/XCorrelationId"
29325
+ x-gala-problem-codes:
29326
+ - AUTHENTICATION_REQUIRED
29327
+ "403":
29328
+ content:
29329
+ application/problem+json:
29330
+ examples:
29331
+ AUTHORIZATION_DENIED:
29332
+ summary: AUTHORIZATION_DENIED
29333
+ value:
29334
+ code: AUTHORIZATION_DENIED
29335
+ correlationId: 018f0000-0000-7000-8000-000000000001
29336
+ detail: See the operation contract.
29337
+ errors: []
29338
+ retryable: false
29339
+ schemaId: urn:gala:schema:problem:2.0.0
29340
+ schemaVersion: 2.0.0
29341
+ status: 403
29342
+ title: AUTHORIZATION_DENIED
29343
+ type: urn:gala:problem:authorization-denied
29344
+ schema:
29345
+ $ref: "#/components/schemas/Problem"
29346
+ description: AUTHORIZATION_DENIED
29347
+ headers:
29348
+ Cache-Control:
29349
+ $ref: "#/components/headers/CacheControlNoStore"
29350
+ X-Correlation-Id:
29351
+ $ref: "#/components/headers/XCorrelationId"
29352
+ x-gala-problem-codes:
29353
+ - AUTHORIZATION_DENIED
29354
+ "404":
29355
+ content:
29356
+ application/problem+json:
29357
+ examples:
29358
+ RESOURCE_NOT_FOUND:
29359
+ summary: RESOURCE_NOT_FOUND
29360
+ value:
29361
+ code: RESOURCE_NOT_FOUND
29362
+ correlationId: 018f0000-0000-7000-8000-000000000001
29363
+ detail: See the operation contract.
29364
+ errors: []
29365
+ retryable: false
29366
+ schemaId: urn:gala:schema:problem:2.0.0
29367
+ schemaVersion: 2.0.0
29368
+ status: 404
29369
+ title: RESOURCE_NOT_FOUND
29370
+ type: urn:gala:problem:resource-not-found
29371
+ schema:
29372
+ $ref: "#/components/schemas/Problem"
29373
+ description: RESOURCE_NOT_FOUND
29374
+ headers:
29375
+ Cache-Control:
29376
+ $ref: "#/components/headers/CacheControlNoStore"
29377
+ X-Correlation-Id:
29378
+ $ref: "#/components/headers/XCorrelationId"
29379
+ x-gala-problem-codes:
29380
+ - RESOURCE_NOT_FOUND
29381
+ security:
29382
+ - browserSession: []
29383
+ summary: read the site summary of this publication
29384
+ tags:
29385
+ - organizations
29386
+ x-gala-activation-gate: MVP
29387
+ x-gala-activation-guards:
29388
+ - NONE
29389
+ x-gala-capability-key: publication.view
29390
+ x-gala-concurrency: publication-and-destination-epochs
29391
+ x-gala-conditional-capabilities: []
29392
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
29393
+ x-gala-nullability: required-and-nullable-are-explicit
29394
+ x-gala-purpose: read the site summary of this publication
29395
+ x-gala-reachable-problems:
29396
+ - AUTHENTICATION_REQUIRED
29397
+ - AUTHORIZATION_DENIED
29398
+ - RESOURCE_NOT_FOUND
29399
+ - VALIDATION_FAILED
29400
+ x-gala-replay-identity: safe-query
29401
+ x-gala-state-guards:
29402
+ - NONE
29403
+ x-gala-success-category: query
29404
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
28219
29405
  /v2/organizations/{organizationId}/publications/{publicationId}:previewRetirement:
28220
29406
  post:
28221
29407
  description: |