@rathnasgala2/schemas 3.10.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "package": "@rathnasgala2/schemas@3.10.0",
3
+ "package": "@rathnasgala2/schemas@3.11.0",
4
4
  "source": "package-lock.json",
5
5
  "dependencies": [
6
6
  {
@@ -6232,6 +6232,34 @@
6232
6232
  "placeholders": {},
6233
6233
  "sensitivity": "AUTHENTICATED"
6234
6234
  },
6235
+ {
6236
+ "contentKey": "platform.users.screen.conflicted.recovery",
6237
+ "defaultMessage": "Refresh the page, review the current version, and reconfirm before resubmitting.",
6238
+ "description": "Default recovery guidance for the platform.users screen in the CONFLICTED state.",
6239
+ "placeholders": {},
6240
+ "sensitivity": "AUTHENTICATED"
6241
+ },
6242
+ {
6243
+ "contentKey": "platform.users.screen.conflicted.status",
6244
+ "defaultMessage": "The resource changed; review the current version.",
6245
+ "description": "Closed default status text for the platform.users screen in the CONFLICTED state.",
6246
+ "placeholders": {},
6247
+ "sensitivity": "AUTHENTICATED"
6248
+ },
6249
+ {
6250
+ "contentKey": "platform.users.screen.dirty.recovery",
6251
+ "defaultMessage": "Save or submit your changes, or discard them.",
6252
+ "description": "Default recovery guidance for the platform.users screen in the DIRTY state.",
6253
+ "placeholders": {},
6254
+ "sensitivity": "AUTHENTICATED"
6255
+ },
6256
+ {
6257
+ "contentKey": "platform.users.screen.dirty.status",
6258
+ "defaultMessage": "Changes have not been submitted.",
6259
+ "description": "Closed default status text for the platform.users screen in the DIRTY state.",
6260
+ "placeholders": {},
6261
+ "sensitivity": "AUTHENTICATED"
6262
+ },
6235
6263
  {
6236
6264
  "contentKey": "platform.users.screen.empty.recovery",
6237
6265
  "defaultMessage": "Try a different search or filter.",
@@ -6302,6 +6330,20 @@
6302
6330
  "placeholders": {},
6303
6331
  "sensitivity": "AUTHENTICATED"
6304
6332
  },
6333
+ {
6334
+ "contentKey": "platform.users.screen.rate_limited.recovery",
6335
+ "defaultMessage": "Wait for the indicated time before retrying.",
6336
+ "description": "Default recovery guidance for the platform.users screen in the RATE_LIMITED state.",
6337
+ "placeholders": {},
6338
+ "sensitivity": "AUTHENTICATED"
6339
+ },
6340
+ {
6341
+ "contentKey": "platform.users.screen.rate_limited.status",
6342
+ "defaultMessage": "Too many requests; wait before retrying.",
6343
+ "description": "Closed default status text for the platform.users screen in the RATE_LIMITED state.",
6344
+ "placeholders": {},
6345
+ "sensitivity": "AUTHENTICATED"
6346
+ },
6305
6347
  {
6306
6348
  "contentKey": "platform.users.screen.ready.recovery",
6307
6349
  "defaultMessage": "No further action is needed.",
@@ -6358,6 +6400,20 @@
6358
6400
  "placeholders": {},
6359
6401
  "sensitivity": "AUTHENTICATED"
6360
6402
  },
6403
+ {
6404
+ "contentKey": "platform.users.screen.submitting.recovery",
6405
+ "defaultMessage": "This usually takes a moment.",
6406
+ "description": "Default recovery guidance for the platform.users screen in the SUBMITTING state.",
6407
+ "placeholders": {},
6408
+ "sensitivity": "AUTHENTICATED"
6409
+ },
6410
+ {
6411
+ "contentKey": "platform.users.screen.submitting.status",
6412
+ "defaultMessage": "Submitting…",
6413
+ "description": "Closed default status text for the platform.users screen in the SUBMITTING state.",
6414
+ "placeholders": {},
6415
+ "sensitivity": "AUTHENTICATED"
6416
+ },
6361
6417
  {
6362
6418
  "contentKey": "platform.users.screen.success.recovery",
6363
6419
  "defaultMessage": "No further action is needed.",
@@ -6386,6 +6442,20 @@
6386
6442
  "placeholders": {},
6387
6443
  "sensitivity": "AUTHENTICATED"
6388
6444
  },
6445
+ {
6446
+ "contentKey": "platform.users.screen.validating.recovery",
6447
+ "defaultMessage": "This usually takes a moment.",
6448
+ "description": "Default recovery guidance for the platform.users screen in the VALIDATING state.",
6449
+ "placeholders": {},
6450
+ "sensitivity": "AUTHENTICATED"
6451
+ },
6452
+ {
6453
+ "contentKey": "platform.users.screen.validating.status",
6454
+ "defaultMessage": "Validating…",
6455
+ "description": "Closed default status text for the platform.users screen in the VALIDATING state.",
6456
+ "placeholders": {},
6457
+ "sensitivity": "AUTHENTICATED"
6458
+ },
6389
6459
  {
6390
6460
  "contentKey": "platform.webhooks.by-event-id.screen.capability_unavailable.recovery",
6391
6461
  "defaultMessage": "This isn't available yet. Check back later, or contact support if you need it now.",
@@ -8711,5 +8781,5 @@
8711
8781
  "sensitivity": "AUTHENTICATED"
8712
8782
  }
8713
8783
  ],
8714
- "digest": "sha256:d0bd001521ad67c76424fd5fc2f98c1f06b3d2731ed7a642bc0d7a6ea9865c49"
8784
+ "digest": "sha256:3d639f35e25361918ebb8ee613c4af3629b7f240df57a61a8ca8d7390852694f"
8715
8785
  }
@@ -124,6 +124,8 @@
124
124
  "getGithubInstallations",
125
125
  "getSelfAuthenticators",
126
126
  "getSelfReaderConnections",
127
+ "postSelfContactEmailGrant",
128
+ "postSelfContactEmailWithdraw",
127
129
  "postSelfIdentityLinks"
128
130
  ],
129
131
  "componentIds": [
@@ -2234,18 +2236,28 @@
2234
2236
  "pathTemplate": "/platform/users",
2235
2237
  "screenId": "platform.users.screen",
2236
2238
  "authenticationClass": "SESSION_REQUIRED",
2237
- "capabilityKeys": ["platform.users.view"],
2238
- "apiOperationIds": ["getPlatformUsers"],
2239
+ "capabilityKeys": ["platform.users.contact", "platform.users.view"],
2240
+ "apiOperationIds": [
2241
+ "getPlatformUsers",
2242
+ "postPlatformUsersByPersonIdContact"
2243
+ ],
2239
2244
  "componentIds": [
2240
2245
  "AppShell",
2241
2246
  "Breadcrumbs",
2242
2247
  "ContextHeader",
2243
2248
  "StatePanel",
2249
+ "FormField",
2250
+ "ValidationSummary",
2251
+ "AsyncCommand",
2244
2252
  "DataTable"
2245
2253
  ],
2246
2254
  "contentKeyIds": [
2247
2255
  "platform.users.screen.capability_unavailable.recovery",
2248
2256
  "platform.users.screen.capability_unavailable.status",
2257
+ "platform.users.screen.conflicted.recovery",
2258
+ "platform.users.screen.conflicted.status",
2259
+ "platform.users.screen.dirty.recovery",
2260
+ "platform.users.screen.dirty.status",
2249
2261
  "platform.users.screen.empty.recovery",
2250
2262
  "platform.users.screen.empty.status",
2251
2263
  "platform.users.screen.forbidden.recovery",
@@ -2256,6 +2268,8 @@
2256
2268
  "platform.users.screen.not_found.status",
2257
2269
  "platform.users.screen.offline.recovery",
2258
2270
  "platform.users.screen.offline.status",
2271
+ "platform.users.screen.rate_limited.recovery",
2272
+ "platform.users.screen.rate_limited.status",
2259
2273
  "platform.users.screen.ready.recovery",
2260
2274
  "platform.users.screen.ready.status",
2261
2275
  "platform.users.screen.ready.summary",
@@ -2264,10 +2278,14 @@
2264
2278
  "platform.users.screen.reconciling.status",
2265
2279
  "platform.users.screen.refreshing.recovery",
2266
2280
  "platform.users.screen.refreshing.status",
2281
+ "platform.users.screen.submitting.recovery",
2282
+ "platform.users.screen.submitting.status",
2267
2283
  "platform.users.screen.success.recovery",
2268
2284
  "platform.users.screen.success.status",
2269
2285
  "platform.users.screen.terminal_failure.recovery",
2270
- "platform.users.screen.terminal_failure.status"
2286
+ "platform.users.screen.terminal_failure.status",
2287
+ "platform.users.screen.validating.recovery",
2288
+ "platform.users.screen.validating.status"
2271
2289
  ],
2272
2290
  "tokenBearing": false,
2273
2291
  "requiredStates": [
@@ -2281,6 +2299,11 @@
2281
2299
  "CAPABILITY_UNAVAILABLE",
2282
2300
  "RECONCILING",
2283
2301
  "TERMINAL_FAILURE",
2302
+ "DIRTY",
2303
+ "VALIDATING",
2304
+ "SUBMITTING",
2305
+ "CONFLICTED",
2306
+ "RATE_LIMITED",
2284
2307
  "SUCCESS"
2285
2308
  ]
2286
2309
  },
@@ -3181,5 +3204,5 @@
3181
3204
  ]
3182
3205
  }
3183
3206
  ],
3184
- "digest": "sha256:89469bb975394d8bb896f2419d425f10ade1c2460780b656fec4ce084360f279"
3207
+ "digest": "sha256:c7b9a0364eed013e5fb791e4de022b7630e261717325951bdba044779df1c84c"
3185
3208
  }
@@ -219,9 +219,9 @@
219
219
  "version": "2.0.0",
220
220
  "path": "openapi/openapi.yaml",
221
221
  "materialized": true,
222
- "sourceDigest": "sha256:6cb44277f117370a70e3828a1a5fdadbfbd1ddb5df3e84b317acf205d5913aeb",
222
+ "sourceDigest": "sha256:b5ab8902d0a3d6990cd2c4bcdc51e6f007ceb33d65119fc2f5e526c0a2260bb1",
223
223
  "typescriptRootType": null
224
224
  }
225
225
  ],
226
- "digest": "sha256:d4e90b9bc72fc1069961b4d28223815fd441948bfd67180c01f81ffbd7008eca"
226
+ "digest": "sha256:1674799155c63105805d8c03254eb52a93e8b0a2db47890d75b79abc9edbd274"
227
227
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "2.0.0",
3
3
  "sourceDesignRevision": "a53052955ceb6c1aa10c886289dc832eedfe6de0a00004df07d353ac19c4403a",
4
- "openApiDigest": "sha256:6cb44277f117370a70e3828a1a5fdadbfbd1ddb5df3e84b317acf205d5913aeb",
4
+ "openApiDigest": "sha256:b5ab8902d0a3d6990cd2c4bcdc51e6f007ceb33d65119fc2f5e526c0a2260bb1",
5
5
  "operations": [
6
6
  {
7
7
  "operationId": "getInternalHealth",
@@ -1604,6 +1604,18 @@
1604
1604
  "actionGrant": "none",
1605
1605
  "sourceFragment": "platform"
1606
1606
  },
1607
+ {
1608
+ "operationId": "postPlatformUsersByPersonIdContact",
1609
+ "method": "POST",
1610
+ "path": "/v2/platform/users/{personId}:contact",
1611
+ "purpose": "contact platform user",
1612
+ "capabilityKey": "platform.users.contact",
1613
+ "conditionalCapabilityKeys": [],
1614
+ "activationGate": "MVP",
1615
+ "assuranceClass": "SESSION",
1616
+ "actionGrant": "none",
1617
+ "sourceFragment": "platform"
1618
+ },
1607
1619
  {
1608
1620
  "operationId": "getPlatformWebhookEvents",
1609
1621
  "method": "GET",
@@ -1844,6 +1856,30 @@
1844
1856
  "actionGrant": "none",
1845
1857
  "sourceFragment": "self"
1846
1858
  },
1859
+ {
1860
+ "operationId": "postSelfContactEmailGrant",
1861
+ "method": "POST",
1862
+ "path": "/v2/self/contact-email:grant",
1863
+ "purpose": "grant contact email",
1864
+ "capabilityKey": null,
1865
+ "conditionalCapabilityKeys": [],
1866
+ "activationGate": "MVP",
1867
+ "assuranceClass": "SESSION",
1868
+ "actionGrant": "none",
1869
+ "sourceFragment": "self"
1870
+ },
1871
+ {
1872
+ "operationId": "postSelfContactEmailWithdraw",
1873
+ "method": "POST",
1874
+ "path": "/v2/self/contact-email:withdraw",
1875
+ "purpose": "withdraw contact email",
1876
+ "capabilityKey": null,
1877
+ "conditionalCapabilityKeys": [],
1878
+ "activationGate": "MVP",
1879
+ "assuranceClass": "SESSION",
1880
+ "actionGrant": "none",
1881
+ "sourceFragment": "self"
1882
+ },
1847
1883
  {
1848
1884
  "operationId": "getSelfExports",
1849
1885
  "method": "GET",
@@ -2121,5 +2157,5 @@
2121
2157
  "sourceFragment": "workloads"
2122
2158
  }
2123
2159
  ],
2124
- "digest": "sha256:161281d4484ec95bf4980bbd15129efca7630a14a23ba66d30b3820294df714b"
2160
+ "digest": "sha256:e0e3e201cb7a5b7004e158e7bc48261f82817929bdadfde6d4aa0373e9174ecd"
2125
2161
  }
@@ -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: |
@@ -4222,6 +4243,8 @@ components:
4222
4243
  uniqueItems: true
4223
4244
  closure:
4224
4245
  $ref: "#/components/schemas/SessionClosure"
4246
+ contactEmail:
4247
+ $ref: "#/components/schemas/ContactEmail"
4225
4248
  credentialEpoch:
4226
4249
  format: int64
4227
4250
  minimum: 0
@@ -6901,6 +6924,9 @@ components:
6901
6924
  PlatformUser:
6902
6925
  additionalProperties: false
6903
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
6904
6930
  createdAt:
6905
6931
  $ref: "#/components/schemas/PortableProblemRfc3339"
6906
6932
  displayName:
@@ -6943,6 +6969,7 @@ components:
6943
6969
  - lastSignInAt
6944
6970
  - publicationCount
6945
6971
  - planTiers
6972
+ - contactEmailOnFile
6946
6973
  type: object
6947
6974
  PlatformWebhookEvent:
6948
6975
  additionalProperties: false
@@ -14869,6 +14896,46 @@ components:
14869
14896
  required:
14870
14897
  - client
14871
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
14872
14939
  PostPublicCommentsByCommentIdAppealsRequest:
14873
14940
  additionalProperties: false
14874
14941
  properties:
@@ -15119,6 +15186,22 @@ components:
15119
15186
  - state
15120
15187
  - fenceAt
15121
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
15122
15205
  PostSelfExportsByExportIdDownloadResponse:
15123
15206
  additionalProperties: false
15124
15207
  properties:
@@ -48601,7 +48684,8 @@ paths:
48601
48684
  value:
48602
48685
  hasMore: false
48603
48686
  items:
48604
- - createdAt: "2026-09-01T12:00:00.000Z"
48687
+ - contactEmailOnFile: true
48688
+ createdAt: "2026-09-01T12:00:00.000Z"
48605
48689
  displayName: Ada Reader
48606
48690
  lastSignInAt: "2026-10-10T11:30:00.000Z"
48607
48691
  login: ada-reader
@@ -48650,6 +48734,140 @@ paths:
48650
48734
  - NONE
48651
48735
  x-gala-success-category: query
48652
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
48653
48871
  /v2/platform/webhook-events:
48654
48872
  get:
48655
48873
  description: |
@@ -51775,6 +51993,329 @@ paths:
51775
51993
  - NONE
51776
51994
  x-gala-success-category: protocol
51777
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
51778
52319
  /v2/self/exports:
51779
52320
  get:
51780
52321
  description: |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rathnasgala2/schemas",
3
- "version": "3.10.0",
3
+ "version": "3.11.0",
4
4
  "description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
package/sbom.cdx.json CHANGED
@@ -97,8 +97,8 @@
97
97
  "type": "library",
98
98
  "name": "schemas",
99
99
  "group": "@rathnasgala2",
100
- "version": "3.10.0",
101
- "bom-ref": "@rathnasgala2/schemas@3.10.0",
100
+ "version": "3.11.0",
101
+ "bom-ref": "@rathnasgala2/schemas@3.11.0",
102
102
  "description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
103
103
  "licenses": [
104
104
  {
@@ -108,7 +108,7 @@
108
108
  }
109
109
  }
110
110
  ],
111
- "purl": "pkg:npm/%40rathnasgala2/schemas@3.10.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Frathnasgala2%2Fschema.git",
111
+ "purl": "pkg:npm/%40rathnasgala2/schemas@3.11.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Frathnasgala2%2Fschema.git",
112
112
  "externalReferences": [
113
113
  {
114
114
  "url": "https://github.com/rathnasgala2/schema/issues",
@@ -153,7 +153,7 @@
153
153
  "type": "library",
154
154
  "name": "ajv-formats",
155
155
  "version": "3.0.1",
156
- "bom-ref": "@rathnasgala2/schemas@3.10.0|ajv-formats@3.0.1",
156
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|ajv-formats@3.0.1",
157
157
  "licenses": [
158
158
  {
159
159
  "license": {
@@ -187,7 +187,7 @@
187
187
  "type": "library",
188
188
  "name": "ajv",
189
189
  "version": "8.20.0",
190
- "bom-ref": "@rathnasgala2/schemas@3.10.0|ajv@8.20.0",
190
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|ajv@8.20.0",
191
191
  "licenses": [
192
192
  {
193
193
  "license": {
@@ -221,7 +221,7 @@
221
221
  "type": "library",
222
222
  "name": "fast-deep-equal",
223
223
  "version": "3.1.3",
224
- "bom-ref": "@rathnasgala2/schemas@3.10.0|fast-deep-equal@3.1.3",
224
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|fast-deep-equal@3.1.3",
225
225
  "licenses": [
226
226
  {
227
227
  "license": {
@@ -255,7 +255,7 @@
255
255
  "type": "library",
256
256
  "name": "fast-uri",
257
257
  "version": "3.1.8",
258
- "bom-ref": "@rathnasgala2/schemas@3.10.0|fast-uri@3.1.8",
258
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|fast-uri@3.1.8",
259
259
  "licenses": [
260
260
  {
261
261
  "license": {
@@ -289,7 +289,7 @@
289
289
  "type": "library",
290
290
  "name": "json-schema-traverse",
291
291
  "version": "1.0.0",
292
- "bom-ref": "@rathnasgala2/schemas@3.10.0|json-schema-traverse@1.0.0",
292
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|json-schema-traverse@1.0.0",
293
293
  "licenses": [
294
294
  {
295
295
  "license": {
@@ -323,7 +323,7 @@
323
323
  "type": "library",
324
324
  "name": "require-from-string",
325
325
  "version": "2.0.2",
326
- "bom-ref": "@rathnasgala2/schemas@3.10.0|require-from-string@2.0.2",
326
+ "bom-ref": "@rathnasgala2/schemas@3.11.0|require-from-string@2.0.2",
327
327
  "licenses": [
328
328
  {
329
329
  "license": {
@@ -1064,10 +1064,10 @@
1064
1064
  ],
1065
1065
  "dependencies": [
1066
1066
  {
1067
- "ref": "@rathnasgala2/schemas@3.10.0",
1067
+ "ref": "@rathnasgala2/schemas@3.11.0",
1068
1068
  "dependsOn": [
1069
- "@rathnasgala2/schemas@3.10.0|ajv-formats@3.0.1",
1070
- "@rathnasgala2/schemas@3.10.0|ajv@8.20.0",
1069
+ "@rathnasgala2/schemas@3.11.0|ajv-formats@3.0.1",
1070
+ "@rathnasgala2/schemas@3.11.0|ajv@8.20.0",
1071
1071
  "pkg:npm/semver@7.8.5",
1072
1072
  "urn:gala:source-data:iana-ipv4-special-registry",
1073
1073
  "urn:gala:source-data:iana-ipv6-special-registry",
@@ -1089,31 +1089,31 @@
1089
1089
  ]
1090
1090
  },
1091
1091
  {
1092
- "ref": "@rathnasgala2/schemas@3.10.0|ajv-formats@3.0.1",
1092
+ "ref": "@rathnasgala2/schemas@3.11.0|ajv-formats@3.0.1",
1093
1093
  "dependsOn": [
1094
- "@rathnasgala2/schemas@3.10.0|ajv@8.20.0"
1094
+ "@rathnasgala2/schemas@3.11.0|ajv@8.20.0"
1095
1095
  ]
1096
1096
  },
1097
1097
  {
1098
- "ref": "@rathnasgala2/schemas@3.10.0|ajv@8.20.0",
1098
+ "ref": "@rathnasgala2/schemas@3.11.0|ajv@8.20.0",
1099
1099
  "dependsOn": [
1100
- "@rathnasgala2/schemas@3.10.0|fast-deep-equal@3.1.3",
1101
- "@rathnasgala2/schemas@3.10.0|fast-uri@3.1.8",
1102
- "@rathnasgala2/schemas@3.10.0|json-schema-traverse@1.0.0",
1103
- "@rathnasgala2/schemas@3.10.0|require-from-string@2.0.2"
1100
+ "@rathnasgala2/schemas@3.11.0|fast-deep-equal@3.1.3",
1101
+ "@rathnasgala2/schemas@3.11.0|fast-uri@3.1.8",
1102
+ "@rathnasgala2/schemas@3.11.0|json-schema-traverse@1.0.0",
1103
+ "@rathnasgala2/schemas@3.11.0|require-from-string@2.0.2"
1104
1104
  ]
1105
1105
  },
1106
1106
  {
1107
- "ref": "@rathnasgala2/schemas@3.10.0|fast-deep-equal@3.1.3"
1107
+ "ref": "@rathnasgala2/schemas@3.11.0|fast-deep-equal@3.1.3"
1108
1108
  },
1109
1109
  {
1110
- "ref": "@rathnasgala2/schemas@3.10.0|fast-uri@3.1.8"
1110
+ "ref": "@rathnasgala2/schemas@3.11.0|fast-uri@3.1.8"
1111
1111
  },
1112
1112
  {
1113
- "ref": "@rathnasgala2/schemas@3.10.0|json-schema-traverse@1.0.0"
1113
+ "ref": "@rathnasgala2/schemas@3.11.0|json-schema-traverse@1.0.0"
1114
1114
  },
1115
1115
  {
1116
- "ref": "@rathnasgala2/schemas@3.10.0|require-from-string@2.0.2"
1116
+ "ref": "@rathnasgala2/schemas@3.11.0|require-from-string@2.0.2"
1117
1117
  },
1118
1118
  {
1119
1119
  "ref": "pkg:npm/semver@7.8.5"