@rathnasgala2/schemas 3.9.0 → 3.11.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 (47) hide show
  1. package/THIRD_PARTY_LICENSES.json +1 -1
  2. package/diagnostics/diagnostic-map.json +255 -9
  3. package/docs/catalogs/app-components.json +71 -1
  4. package/docs/catalogs/app-routes.json +27 -4
  5. package/docs/catalogs/schema-inventory.json +5 -5
  6. package/examples/valid/appearance/rules.json +105 -1
  7. package/examples/valid/build-input/rules.json +105 -1
  8. package/examples/valid/theme-contract/rules.json +276 -2
  9. package/fixtures/boundary/appearance/rules.json +105 -12
  10. package/fixtures/boundary/build-input/rules.json +105 -12
  11. package/fixtures/boundary/theme-contract/rules.json +386 -2
  12. package/fixtures/invalid/appearance/REQUEST_FIELD_UNKNOWN/cases.json +33 -0
  13. package/fixtures/invalid/appearance/SCHEMA_OBJECT_TOO_LARGE/cases.json +0 -13
  14. package/fixtures/invalid/appearance/SCHEMA_PATTERN_INVALID/cases.json +68 -0
  15. package/fixtures/invalid/appearance/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +66 -0
  16. package/fixtures/invalid/appearance/SCHEMA_TYPE_INVALID/cases.json +99 -0
  17. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +33 -0
  18. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +66 -0
  19. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +66 -0
  20. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +99 -0
  21. package/fixtures/invalid/theme-contract/REQUEST_FIELD_UNKNOWN/cases.json +33 -0
  22. package/fixtures/invalid/theme-contract/SCHEMA_ARRAY_TOO_LONG/cases.json +165 -0
  23. package/fixtures/invalid/theme-contract/SCHEMA_CONSTANT_INVALID/cases.json +11 -11
  24. package/fixtures/invalid/theme-contract/SCHEMA_ENUM_INVALID/cases.json +88 -0
  25. package/fixtures/invalid/theme-contract/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +93 -0
  26. package/fixtures/invalid/theme-contract/SCHEMA_TYPE_INVALID/cases.json +51 -0
  27. package/fixtures/manifest.json +1955 -35
  28. package/fixtures/unknown-field/appearance/rules.json +54 -1
  29. package/fixtures/unknown-field/build-input/rules.json +54 -1
  30. package/fixtures/unknown-field/theme-contract/rules.json +70 -1
  31. package/generated/browser/validator-core.mjs +3 -3
  32. package/generated/typescript/contracts/appearance.d.ts +14 -1
  33. package/generated/typescript/contracts/build-input.d.ts +14 -1
  34. package/generated/typescript/contracts/theme-contract.d.ts +51 -0
  35. package/openapi/http-catalog.json +38 -2
  36. package/openapi/openapi.yaml +598 -3
  37. package/package.json +10 -1
  38. package/parity/palette/golden-vectors.json +883 -0
  39. package/parity/palette/stress-corpus.json +521 -0
  40. package/parity/palette/theme-default.fixture.json +698 -0
  41. package/sbom.cdx.json +23 -23
  42. package/schemas/appearance.schema.json +30 -3
  43. package/schemas/build-input.schema.json +30 -3
  44. package/schemas/theme-contract.schema.json +185 -1
  45. package/src/palette.js +919 -0
  46. package/types/palette.d.ts +305 -0
  47. package/fixtures/invalid/build-input/SCHEMA_OBJECT_TOO_LARGE/cases.json +0 -15
@@ -1048,6 +1048,27 @@ components:
1048
1048
  - detail
1049
1049
  - reversible
1050
1050
  type: object
1051
+ ContactEmail:
1052
+ additionalProperties: false
1053
+ description: The verified GitHub primary email the person agreed to receive account and security notices at. The full address never leaves the server; only a masked form is shown.
1054
+ properties:
1055
+ maskedAddress:
1056
+ description: Masked form such as `a…d@example.com`, never the full address. Null or absent unless `state` is `ON_FILE`.
1057
+ maxLength: 320
1058
+ type:
1059
+ - string
1060
+ - "null"
1061
+ state:
1062
+ enum:
1063
+ - NONE
1064
+ - ON_FILE
1065
+ - WITHDRAWN
1066
+ type: string
1067
+ updatedAt:
1068
+ $ref: "#/components/schemas/PortableProblemRfc3339"
1069
+ required:
1070
+ - state
1071
+ type: object
1051
1072
  ContentChangeAppearanceEntry:
1052
1073
  additionalProperties: false
1053
1074
  description: |
@@ -1056,7 +1077,10 @@ components:
1056
1077
  values to change only `attribution`. `attribution` (SCHEMA-3.3.0) is
1057
1078
  optional: when present the server writes it as
1058
1079
  `gala/appearance.json`'s `attribution`; when absent the file's
1059
- `attribution` is preserved unchanged.
1080
+ `attribution` is preserved unchanged. `tokens` (SCHEMA-3.10.0) is
1081
+ optional: the author's publication palette, written as
1082
+ `gala/appearance.json`'s `tokens`; when absent the file's `tokens`
1083
+ are preserved unchanged, and `{}` resets to the theme's own colours.
1060
1084
  properties:
1061
1085
  attribution:
1062
1086
  $ref: "#/components/schemas/PortableAppearanceAttribution"
@@ -1064,6 +1088,8 @@ components:
1064
1088
  $ref: "#/components/schemas/AppearanceColorMode"
1065
1089
  themeId:
1066
1090
  $ref: "#/components/schemas/AppearanceThemeId"
1091
+ tokens:
1092
+ $ref: "#/components/schemas/PortableAppearanceSemanticTokens"
1067
1093
  required:
1068
1094
  - themeId
1069
1095
  - colorModeDefault
@@ -4217,6 +4243,8 @@ components:
4217
4243
  uniqueItems: true
4218
4244
  closure:
4219
4245
  $ref: "#/components/schemas/SessionClosure"
4246
+ contactEmail:
4247
+ $ref: "#/components/schemas/ContactEmail"
4220
4248
  credentialEpoch:
4221
4249
  format: int64
4222
4250
  minimum: 0
@@ -6896,6 +6924,9 @@ components:
6896
6924
  PlatformUser:
6897
6925
  additionalProperties: false
6898
6926
  properties:
6927
+ contactEmailOnFile:
6928
+ description: Whether a contact email the person agreed to is on file. The address itself is never returned.
6929
+ type: boolean
6899
6930
  createdAt:
6900
6931
  $ref: "#/components/schemas/PortableProblemRfc3339"
6901
6932
  displayName:
@@ -6938,6 +6969,7 @@ components:
6938
6969
  - lastSignInAt
6939
6970
  - publicationCount
6940
6971
  - planTiers
6972
+ - contactEmailOnFile
6941
6973
  type: object
6942
6974
  PlatformWebhookEvent:
6943
6975
  additionalProperties: false
@@ -7038,6 +7070,51 @@ components:
7038
7070
  minLength: 3
7039
7071
  pattern: ^(?:@[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?/[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?|[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?)@(?:\S+|\S+ \S+)$
7040
7072
  type: string
7073
+ PortableAppearanceSemanticTokens:
7074
+ additionalProperties: false
7075
+ description: "SCHEMA-3.10.0: the author's publication palette. Each role (accent, canvas, text) is optional; when present it carries both light and dark as opaque lowercase #rrggbb. An absent role uses the theme's default; `{}` selects the theme's default palette entirely."
7076
+ properties:
7077
+ accent:
7078
+ additionalProperties: false
7079
+ properties:
7080
+ dark:
7081
+ pattern: ^#[0-9a-f]{6}$
7082
+ type: string
7083
+ light:
7084
+ pattern: ^#[0-9a-f]{6}$
7085
+ type: string
7086
+ required:
7087
+ - light
7088
+ - dark
7089
+ type: object
7090
+ canvas:
7091
+ additionalProperties: false
7092
+ properties:
7093
+ dark:
7094
+ pattern: ^#[0-9a-f]{6}$
7095
+ type: string
7096
+ light:
7097
+ pattern: ^#[0-9a-f]{6}$
7098
+ type: string
7099
+ required:
7100
+ - light
7101
+ - dark
7102
+ type: object
7103
+ text:
7104
+ additionalProperties: false
7105
+ properties:
7106
+ dark:
7107
+ pattern: ^#[0-9a-f]{6}$
7108
+ type: string
7109
+ light:
7110
+ pattern: ^#[0-9a-f]{6}$
7111
+ type: string
7112
+ required:
7113
+ - light
7114
+ - dark
7115
+ type: object
7116
+ required: []
7117
+ type: object
7041
7118
  PortableAuthorPlainText:
7042
7119
  description: NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls.
7043
7120
  format: gala-plain-text
@@ -14819,6 +14896,46 @@ components:
14819
14896
  required:
14820
14897
  - client
14821
14898
  type: object
14899
+ PostPlatformUsersByPersonIdContactRequest:
14900
+ additionalProperties: false
14901
+ properties:
14902
+ body:
14903
+ maxLength: 5000
14904
+ minLength: 1
14905
+ type: string
14906
+ category:
14907
+ enum:
14908
+ - ACCOUNT
14909
+ - SECURITY
14910
+ - SERVICE
14911
+ type: string
14912
+ reason:
14913
+ $ref: "#/components/schemas/PlatformOperatorReasonCode"
14914
+ subject:
14915
+ maxLength: 200
14916
+ minLength: 1
14917
+ type: string
14918
+ required:
14919
+ - category
14920
+ - subject
14921
+ - body
14922
+ - reason
14923
+ type: object
14924
+ PostPlatformUsersByPersonIdContactResponse:
14925
+ additionalProperties: false
14926
+ properties:
14927
+ messageId:
14928
+ format: uuid
14929
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
14930
+ type: string
14931
+ state:
14932
+ enum:
14933
+ - QUEUED
14934
+ type: string
14935
+ required:
14936
+ - messageId
14937
+ - state
14938
+ type: object
14822
14939
  PostPublicCommentsByCommentIdAppealsRequest:
14823
14940
  additionalProperties: false
14824
14941
  properties:
@@ -15069,6 +15186,22 @@ components:
15069
15186
  - state
15070
15187
  - fenceAt
15071
15188
  type: object
15189
+ PostSelfContactEmailGrantResponse:
15190
+ additionalProperties: false
15191
+ properties:
15192
+ contactEmail:
15193
+ $ref: "#/components/schemas/ContactEmail"
15194
+ required:
15195
+ - contactEmail
15196
+ type: object
15197
+ PostSelfContactEmailWithdrawResponse:
15198
+ additionalProperties: false
15199
+ properties:
15200
+ contactEmail:
15201
+ $ref: "#/components/schemas/ContactEmail"
15202
+ required:
15203
+ - contactEmail
15204
+ type: object
15072
15205
  PostSelfExportsByExportIdDownloadResponse:
15073
15206
  additionalProperties: false
15074
15207
  properties:
@@ -15677,7 +15810,9 @@ components:
15677
15810
  `themePackage` is not in the catalog. `themePackage` is the file's
15678
15811
  `theme` value, a package with its version range. `attribution`
15679
15812
  (SCHEMA-3.3.0, optional) is the file's footer attribution switch;
15680
- absent means the file has none, which renders as shown.
15813
+ absent means the file has none, which renders as shown. `tokens`
15814
+ (SCHEMA-3.10.0, optional) is the file's publication palette as read;
15815
+ absent or `{}` means the theme's own colours.
15681
15816
  properties:
15682
15817
  attribution:
15683
15818
  $ref: "#/components/schemas/PortableAppearanceAttribution"
@@ -15689,6 +15824,8 @@ components:
15689
15824
  - type: "null"
15690
15825
  themePackage:
15691
15826
  $ref: "#/components/schemas/PortableAppearancePackageRange"
15827
+ tokens:
15828
+ $ref: "#/components/schemas/PortableAppearanceSemanticTokens"
15692
15829
  required:
15693
15830
  - themeId
15694
15831
  - themePackage
@@ -48547,7 +48684,8 @@ paths:
48547
48684
  value:
48548
48685
  hasMore: false
48549
48686
  items:
48550
- - createdAt: "2026-09-01T12:00:00.000Z"
48687
+ - contactEmailOnFile: true
48688
+ createdAt: "2026-09-01T12:00:00.000Z"
48551
48689
  displayName: Ada Reader
48552
48690
  lastSignInAt: "2026-10-10T11:30:00.000Z"
48553
48691
  login: ada-reader
@@ -48596,6 +48734,140 @@ paths:
48596
48734
  - NONE
48597
48735
  x-gala-success-category: query
48598
48736
  x-gala-tenant-scope: NONE
48737
+ /v2/platform/users/{personId}:contact:
48738
+ post:
48739
+ description: |
48740
+ Operators only, with recent authentication. Queues one message to the
48741
+ person's contact email, which they agreed to at sign-in. The address is
48742
+ never returned; the message carries the fixed Galascribe wrapper and
48743
+ the operator's text. `category` is `ACCOUNT`, `SECURITY` or `SERVICE`.
48744
+ `reason` is a non-sensitive operator reason code recorded in the audit
48745
+ event. `Idempotency-Key` is the queued-message identity. `202` means the
48746
+ message is queued, not delivered. `404 RESOURCE_NOT_FOUND` for an
48747
+ unknown person; `409 CONTACT_EMAIL_ABSENT` when no contact email is on
48748
+ file or it was withdrawn.
48749
+ operationId: postPlatformUsersByPersonIdContact
48750
+ parameters:
48751
+ - $ref: "#/components/parameters/XCorrelationId"
48752
+ - example: 018f0000-0000-7000-8000-000000000001
48753
+ in: path
48754
+ name: personId
48755
+ required: true
48756
+ schema:
48757
+ format: uuid
48758
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
48759
+ type: string
48760
+ - $ref: "#/components/parameters/IdempotencyKey"
48761
+ - $ref: "#/components/parameters/XCsrfToken"
48762
+ requestBody:
48763
+ content:
48764
+ application/json:
48765
+ examples:
48766
+ nominal:
48767
+ summary: Nominal valid request
48768
+ value:
48769
+ body: Your site repository needs attention before we can publish.
48770
+ category: SERVICE
48771
+ reason: OPERATOR_REQUESTED
48772
+ subject: Action needed on your Galascribe site
48773
+ schema:
48774
+ $ref: "#/components/schemas/PostPlatformUsersByPersonIdContactRequest"
48775
+ required: true
48776
+ responses:
48777
+ "202":
48778
+ content:
48779
+ application/json:
48780
+ examples:
48781
+ nominal:
48782
+ summary: Nominal successful response
48783
+ value:
48784
+ messageId: 018f0000-0000-7000-8000-000000000003
48785
+ state: QUEUED
48786
+ schema:
48787
+ $ref: "#/components/schemas/PostPlatformUsersByPersonIdContactResponse"
48788
+ description: contact platform user accepted
48789
+ headers:
48790
+ Cache-Control:
48791
+ $ref: "#/components/headers/CacheControlNoStore"
48792
+ X-Correlation-Id:
48793
+ $ref: "#/components/headers/XCorrelationId"
48794
+ "400":
48795
+ $ref: "#/components/responses/RequestInvalid"
48796
+ "401":
48797
+ $ref: "#/components/responses/PlatformAuthenticationRequired"
48798
+ "403":
48799
+ $ref: "#/components/responses/AuthorizationDenied"
48800
+ "404":
48801
+ $ref: "#/components/responses/ResourceNotFound"
48802
+ "409":
48803
+ content:
48804
+ application/problem+json:
48805
+ examples:
48806
+ COMMAND_REPLAY_CONFLICT:
48807
+ summary: COMMAND_REPLAY_CONFLICT
48808
+ value:
48809
+ code: COMMAND_REPLAY_CONFLICT
48810
+ correlationId: 018f0000-0000-7000-8000-000000000001
48811
+ detail: See the operation contract.
48812
+ errors: []
48813
+ retryable: false
48814
+ schemaId: urn:gala:schema:problem:2.0.0
48815
+ schemaVersion: 2.0.0
48816
+ status: 409
48817
+ title: COMMAND_REPLAY_CONFLICT
48818
+ type: urn:gala:problem:command-replay-conflict
48819
+ CONTACT_EMAIL_ABSENT:
48820
+ summary: CONTACT_EMAIL_ABSENT
48821
+ value:
48822
+ code: CONTACT_EMAIL_ABSENT
48823
+ correlationId: 018f0000-0000-7000-8000-000000000001
48824
+ detail: See the operation contract.
48825
+ errors: []
48826
+ retryable: false
48827
+ schemaId: urn:gala:schema:problem:2.0.0
48828
+ schemaVersion: 2.0.0
48829
+ status: 409
48830
+ title: CONTACT_EMAIL_ABSENT
48831
+ type: urn:gala:problem:contact-email-absent
48832
+ schema:
48833
+ $ref: "#/components/schemas/Problem"
48834
+ description: COMMAND_REPLAY_CONFLICT, CONTACT_EMAIL_ABSENT
48835
+ headers:
48836
+ Cache-Control:
48837
+ $ref: "#/components/headers/CacheControlNoStore"
48838
+ X-Correlation-Id:
48839
+ $ref: "#/components/headers/XCorrelationId"
48840
+ x-gala-problem-codes:
48841
+ - COMMAND_REPLAY_CONFLICT
48842
+ - CONTACT_EMAIL_ABSENT
48843
+ security:
48844
+ - browserSession: []
48845
+ summary: contact platform user
48846
+ tags:
48847
+ - platform
48848
+ x-gala-activation-gate: MVP
48849
+ x-gala-activation-guards:
48850
+ - NONE
48851
+ x-gala-capability-key: platform.users.contact
48852
+ x-gala-concurrency: none
48853
+ x-gala-conditional-capabilities: []
48854
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
48855
+ x-gala-nullability: required-and-nullable-are-explicit
48856
+ x-gala-purpose: contact platform user
48857
+ x-gala-reachable-problems:
48858
+ - AUTHENTICATION_REQUIRED
48859
+ - AUTHORIZATION_DENIED
48860
+ - COMMAND_REPLAY_CONFLICT
48861
+ - CONTACT_EMAIL_ABSENT
48862
+ - REAUTH_REQUIRED
48863
+ - REQUEST_FIELD_UNKNOWN
48864
+ - RESOURCE_NOT_FOUND
48865
+ - VALIDATION_FAILED
48866
+ x-gala-replay-identity: idempotency-key
48867
+ x-gala-state-guards:
48868
+ - NONE
48869
+ x-gala-success-category: async
48870
+ x-gala-tenant-scope: NONE
48599
48871
  /v2/platform/webhook-events:
48600
48872
  get:
48601
48873
  description: |
@@ -51721,6 +51993,329 @@ paths:
51721
51993
  - NONE
51722
51994
  x-gala-success-category: protocol
51723
51995
  x-gala-tenant-scope: NONE
51996
+ /v2/self/contact-email:grant:
51997
+ post:
51998
+ description: |
51999
+ Records the person's agreement to receive account and security notices
52000
+ at their verified GitHub primary email. The server reads the address from
52001
+ GitHub with the stored sign-in token, seals it, and answers with the
52002
+ masked form only; the full address never leaves the server. Needs
52003
+ recent authentication: a stale session gets `401 REAUTH_REQUIRED`.
52004
+ `409 CONTACT_EMAIL_UNAVAILABLE` when GitHub reports no verified primary
52005
+ email (`errors[].code` `NO_VERIFIED_PRIMARY_EMAIL`) or the sign-in did
52006
+ not grant the email scope (`SCOPE_NOT_GRANTED`), both at pointer
52007
+ `/contactEmail`; the person signs in again to grant the scope.
52008
+ operationId: postSelfContactEmailGrant
52009
+ parameters:
52010
+ - $ref: "#/components/parameters/XCorrelationId"
52011
+ - $ref: "#/components/parameters/IdempotencyKey"
52012
+ - $ref: "#/components/parameters/XCsrfToken"
52013
+ responses:
52014
+ "200":
52015
+ content:
52016
+ application/json:
52017
+ examples:
52018
+ nominal:
52019
+ summary: Nominal successful response
52020
+ value:
52021
+ contactEmail:
52022
+ maskedAddress: a…d@example.com
52023
+ state: ON_FILE
52024
+ updatedAt: "2026-10-13T12:00:00.000Z"
52025
+ schema:
52026
+ $ref: "#/components/schemas/PostSelfContactEmailGrantResponse"
52027
+ description: grant contact email succeeded
52028
+ headers:
52029
+ Cache-Control:
52030
+ $ref: "#/components/headers/CacheControlNoStore"
52031
+ X-Correlation-Id:
52032
+ $ref: "#/components/headers/XCorrelationId"
52033
+ "400":
52034
+ content:
52035
+ application/problem+json:
52036
+ examples:
52037
+ VALIDATION_FAILED:
52038
+ summary: VALIDATION_FAILED
52039
+ value:
52040
+ code: VALIDATION_FAILED
52041
+ correlationId: 018f0000-0000-7000-8000-000000000001
52042
+ detail: See the operation contract.
52043
+ errors: []
52044
+ retryable: false
52045
+ schemaId: urn:gala:schema:problem:2.0.0
52046
+ schemaVersion: 2.0.0
52047
+ status: 400
52048
+ title: VALIDATION_FAILED
52049
+ type: urn:gala:problem:validation-failed
52050
+ schema:
52051
+ $ref: "#/components/schemas/Problem"
52052
+ description: VALIDATION_FAILED
52053
+ headers:
52054
+ Cache-Control:
52055
+ $ref: "#/components/headers/CacheControlNoStore"
52056
+ X-Correlation-Id:
52057
+ $ref: "#/components/headers/XCorrelationId"
52058
+ x-gala-problem-codes:
52059
+ - VALIDATION_FAILED
52060
+ "401":
52061
+ content:
52062
+ application/problem+json:
52063
+ examples:
52064
+ AUTHENTICATION_REQUIRED:
52065
+ summary: AUTHENTICATION_REQUIRED
52066
+ value:
52067
+ code: AUTHENTICATION_REQUIRED
52068
+ correlationId: 018f0000-0000-7000-8000-000000000001
52069
+ detail: See the operation contract.
52070
+ errors: []
52071
+ retryable: false
52072
+ schemaId: urn:gala:schema:problem:2.0.0
52073
+ schemaVersion: 2.0.0
52074
+ status: 401
52075
+ title: AUTHENTICATION_REQUIRED
52076
+ type: urn:gala:problem:authentication-required
52077
+ REAUTH_REQUIRED:
52078
+ summary: REAUTH_REQUIRED
52079
+ value:
52080
+ code: REAUTH_REQUIRED
52081
+ correlationId: 018f0000-0000-7000-8000-000000000001
52082
+ detail: See the operation contract.
52083
+ errors: []
52084
+ retryable: false
52085
+ schemaId: urn:gala:schema:problem:2.0.0
52086
+ schemaVersion: 2.0.0
52087
+ status: 401
52088
+ title: REAUTH_REQUIRED
52089
+ type: urn:gala:problem:reauth-required
52090
+ schema:
52091
+ $ref: "#/components/schemas/Problem"
52092
+ description: AUTHENTICATION_REQUIRED, REAUTH_REQUIRED
52093
+ headers:
52094
+ Cache-Control:
52095
+ $ref: "#/components/headers/CacheControlNoStore"
52096
+ X-Correlation-Id:
52097
+ $ref: "#/components/headers/XCorrelationId"
52098
+ x-gala-problem-codes:
52099
+ - AUTHENTICATION_REQUIRED
52100
+ - REAUTH_REQUIRED
52101
+ "409":
52102
+ content:
52103
+ application/problem+json:
52104
+ examples:
52105
+ COMMAND_REPLAY_CONFLICT:
52106
+ summary: COMMAND_REPLAY_CONFLICT
52107
+ value:
52108
+ code: COMMAND_REPLAY_CONFLICT
52109
+ correlationId: 018f0000-0000-7000-8000-000000000001
52110
+ detail: See the operation contract.
52111
+ errors: []
52112
+ retryable: false
52113
+ schemaId: urn:gala:schema:problem:2.0.0
52114
+ schemaVersion: 2.0.0
52115
+ status: 409
52116
+ title: COMMAND_REPLAY_CONFLICT
52117
+ type: urn:gala:problem:command-replay-conflict
52118
+ CONTACT_EMAIL_UNAVAILABLE:
52119
+ summary: CONTACT_EMAIL_UNAVAILABLE
52120
+ value:
52121
+ code: CONTACT_EMAIL_UNAVAILABLE
52122
+ correlationId: 018f0000-0000-7000-8000-000000000001
52123
+ detail: See the operation contract.
52124
+ errors:
52125
+ - code: NO_VERIFIED_PRIMARY_EMAIL
52126
+ pointer: /contactEmail
52127
+ retryable: false
52128
+ schemaId: urn:gala:schema:problem:2.0.0
52129
+ schemaVersion: 2.0.0
52130
+ status: 409
52131
+ title: CONTACT_EMAIL_UNAVAILABLE
52132
+ type: urn:gala:problem:contact-email-unavailable
52133
+ schema:
52134
+ $ref: "#/components/schemas/Problem"
52135
+ description: COMMAND_REPLAY_CONFLICT, CONTACT_EMAIL_UNAVAILABLE
52136
+ headers:
52137
+ Cache-Control:
52138
+ $ref: "#/components/headers/CacheControlNoStore"
52139
+ X-Correlation-Id:
52140
+ $ref: "#/components/headers/XCorrelationId"
52141
+ x-gala-problem-codes:
52142
+ - COMMAND_REPLAY_CONFLICT
52143
+ - CONTACT_EMAIL_UNAVAILABLE
52144
+ security:
52145
+ - browserSession: []
52146
+ summary: grant contact email
52147
+ tags:
52148
+ - self
52149
+ x-gala-activation-gate: MVP
52150
+ x-gala-activation-guards:
52151
+ - NONE
52152
+ x-gala-capability-key: null
52153
+ x-gala-concurrency: principal-epoch
52154
+ x-gala-conditional-capabilities: []
52155
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
52156
+ x-gala-nullability: required-and-nullable-are-explicit
52157
+ x-gala-purpose: grant contact email
52158
+ x-gala-reachable-problems:
52159
+ - AUTHENTICATION_REQUIRED
52160
+ - COMMAND_REPLAY_CONFLICT
52161
+ - CONTACT_EMAIL_UNAVAILABLE
52162
+ - REAUTH_REQUIRED
52163
+ - VALIDATION_FAILED
52164
+ x-gala-replay-identity: idempotency-key
52165
+ x-gala-state-guards:
52166
+ - NONE
52167
+ x-gala-success-category: protocol
52168
+ x-gala-tenant-scope: NONE
52169
+ /v2/self/contact-email:withdraw:
52170
+ post:
52171
+ description: |
52172
+ Withdraws the agreement to receive notices by email. The sealed address
52173
+ is deleted, the state reads `WITHDRAWN`, and the person is not asked
52174
+ again. Safe to repeat. Needs recent authentication: a stale session
52175
+ gets `401 REAUTH_REQUIRED`.
52176
+ operationId: postSelfContactEmailWithdraw
52177
+ parameters:
52178
+ - $ref: "#/components/parameters/XCorrelationId"
52179
+ - $ref: "#/components/parameters/IdempotencyKey"
52180
+ - $ref: "#/components/parameters/XCsrfToken"
52181
+ responses:
52182
+ "200":
52183
+ content:
52184
+ application/json:
52185
+ examples:
52186
+ nominal:
52187
+ summary: Nominal successful response
52188
+ value:
52189
+ contactEmail:
52190
+ state: WITHDRAWN
52191
+ updatedAt: "2026-10-13T12:00:00.000Z"
52192
+ schema:
52193
+ $ref: "#/components/schemas/PostSelfContactEmailWithdrawResponse"
52194
+ description: withdraw contact email succeeded
52195
+ headers:
52196
+ Cache-Control:
52197
+ $ref: "#/components/headers/CacheControlNoStore"
52198
+ X-Correlation-Id:
52199
+ $ref: "#/components/headers/XCorrelationId"
52200
+ "400":
52201
+ content:
52202
+ application/problem+json:
52203
+ examples:
52204
+ VALIDATION_FAILED:
52205
+ summary: VALIDATION_FAILED
52206
+ value:
52207
+ code: VALIDATION_FAILED
52208
+ correlationId: 018f0000-0000-7000-8000-000000000001
52209
+ detail: See the operation contract.
52210
+ errors: []
52211
+ retryable: false
52212
+ schemaId: urn:gala:schema:problem:2.0.0
52213
+ schemaVersion: 2.0.0
52214
+ status: 400
52215
+ title: VALIDATION_FAILED
52216
+ type: urn:gala:problem:validation-failed
52217
+ schema:
52218
+ $ref: "#/components/schemas/Problem"
52219
+ description: VALIDATION_FAILED
52220
+ headers:
52221
+ Cache-Control:
52222
+ $ref: "#/components/headers/CacheControlNoStore"
52223
+ X-Correlation-Id:
52224
+ $ref: "#/components/headers/XCorrelationId"
52225
+ x-gala-problem-codes:
52226
+ - VALIDATION_FAILED
52227
+ "401":
52228
+ content:
52229
+ application/problem+json:
52230
+ examples:
52231
+ AUTHENTICATION_REQUIRED:
52232
+ summary: AUTHENTICATION_REQUIRED
52233
+ value:
52234
+ code: AUTHENTICATION_REQUIRED
52235
+ correlationId: 018f0000-0000-7000-8000-000000000001
52236
+ detail: See the operation contract.
52237
+ errors: []
52238
+ retryable: false
52239
+ schemaId: urn:gala:schema:problem:2.0.0
52240
+ schemaVersion: 2.0.0
52241
+ status: 401
52242
+ title: AUTHENTICATION_REQUIRED
52243
+ type: urn:gala:problem:authentication-required
52244
+ REAUTH_REQUIRED:
52245
+ summary: REAUTH_REQUIRED
52246
+ value:
52247
+ code: REAUTH_REQUIRED
52248
+ correlationId: 018f0000-0000-7000-8000-000000000001
52249
+ detail: See the operation contract.
52250
+ errors: []
52251
+ retryable: false
52252
+ schemaId: urn:gala:schema:problem:2.0.0
52253
+ schemaVersion: 2.0.0
52254
+ status: 401
52255
+ title: REAUTH_REQUIRED
52256
+ type: urn:gala:problem:reauth-required
52257
+ schema:
52258
+ $ref: "#/components/schemas/Problem"
52259
+ description: AUTHENTICATION_REQUIRED, REAUTH_REQUIRED
52260
+ headers:
52261
+ Cache-Control:
52262
+ $ref: "#/components/headers/CacheControlNoStore"
52263
+ X-Correlation-Id:
52264
+ $ref: "#/components/headers/XCorrelationId"
52265
+ x-gala-problem-codes:
52266
+ - AUTHENTICATION_REQUIRED
52267
+ - REAUTH_REQUIRED
52268
+ "409":
52269
+ content:
52270
+ application/problem+json:
52271
+ examples:
52272
+ COMMAND_REPLAY_CONFLICT:
52273
+ summary: COMMAND_REPLAY_CONFLICT
52274
+ value:
52275
+ code: COMMAND_REPLAY_CONFLICT
52276
+ correlationId: 018f0000-0000-7000-8000-000000000001
52277
+ detail: See the operation contract.
52278
+ errors: []
52279
+ retryable: false
52280
+ schemaId: urn:gala:schema:problem:2.0.0
52281
+ schemaVersion: 2.0.0
52282
+ status: 409
52283
+ title: COMMAND_REPLAY_CONFLICT
52284
+ type: urn:gala:problem:command-replay-conflict
52285
+ schema:
52286
+ $ref: "#/components/schemas/Problem"
52287
+ description: COMMAND_REPLAY_CONFLICT
52288
+ headers:
52289
+ Cache-Control:
52290
+ $ref: "#/components/headers/CacheControlNoStore"
52291
+ X-Correlation-Id:
52292
+ $ref: "#/components/headers/XCorrelationId"
52293
+ x-gala-problem-codes:
52294
+ - COMMAND_REPLAY_CONFLICT
52295
+ security:
52296
+ - browserSession: []
52297
+ summary: withdraw contact email
52298
+ tags:
52299
+ - self
52300
+ x-gala-activation-gate: MVP
52301
+ x-gala-activation-guards:
52302
+ - NONE
52303
+ x-gala-capability-key: null
52304
+ x-gala-concurrency: principal-epoch
52305
+ x-gala-conditional-capabilities: []
52306
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
52307
+ x-gala-nullability: required-and-nullable-are-explicit
52308
+ x-gala-purpose: withdraw contact email
52309
+ x-gala-reachable-problems:
52310
+ - AUTHENTICATION_REQUIRED
52311
+ - COMMAND_REPLAY_CONFLICT
52312
+ - REAUTH_REQUIRED
52313
+ - VALIDATION_FAILED
52314
+ x-gala-replay-identity: idempotency-key
52315
+ x-gala-state-guards:
52316
+ - NONE
52317
+ x-gala-success-category: protocol
52318
+ x-gala-tenant-scope: NONE
51724
52319
  /v2/self/exports:
51725
52320
  get:
51726
52321
  description: |