@mnstry/atelier 0.2.0-alpha.1

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 (260) hide show
  1. package/CHANGELOG.md +383 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +262 -0
  5. package/SECURITY.md +93 -0
  6. package/TRADEMARKS.md +88 -0
  7. package/announcements/2026-08-06-announcements-channel.v1.json +12 -0
  8. package/announcements/keys/mnstry-announcements.public.v1.json +9 -0
  9. package/bin/atelier.mjs +2 -0
  10. package/bin/mnstry-atelier.mjs +3 -0
  11. package/contracts/analysis-adapter.v1.schema.json +248 -0
  12. package/contracts/atelier-action-intent.v1.schema.json +143 -0
  13. package/contracts/atelier-analysis-adapter.v1.schema.json +360 -0
  14. package/contracts/atelier-attestation.v1.schema.json +239 -0
  15. package/contracts/atelier-boundary-policy.v1.schema.json +339 -0
  16. package/contracts/atelier-claim.v1.schema.json +97 -0
  17. package/contracts/atelier-export.v1.schema.json +1015 -0
  18. package/contracts/atelier-extension-pack.v1.schema.json +290 -0
  19. package/contracts/atelier-kit-manifest.v1.schema.json +273 -0
  20. package/contracts/atelier-lock.v1.schema.json +364 -0
  21. package/contracts/atelier-migration.v1.schema.json +162 -0
  22. package/contracts/atelier-project-config.v1.schema.json +352 -0
  23. package/contracts/atelier-readiness-protocol.v1.schema.json +517 -0
  24. package/contracts/atelier-readiness-run.v1.schema.json +229 -0
  25. package/contracts/atelier-readiness.v1.schema.json +457 -0
  26. package/contracts/compat-baseline.json +10 -0
  27. package/contracts/git-promote-event.v1.schema.json +145 -0
  28. package/contracts/knowledge-source-sidecar.v1.schema.json +157 -0
  29. package/contracts/mnstry-atelier-semantic-profile.v1.json +254 -0
  30. package/docs/announcements.md +101 -0
  31. package/docs/atelier-runtime.md +34 -0
  32. package/docs/attestation.md +201 -0
  33. package/docs/continuity.md +55 -0
  34. package/docs/contract-stability.md +111 -0
  35. package/docs/distributions.md +220 -0
  36. package/docs/install.md +140 -0
  37. package/docs/knowledge-graph.md +140 -0
  38. package/docs/ontology.md +206 -0
  39. package/docs/release-engineering.md +151 -0
  40. package/docs/repo-boundary-guard.md +199 -0
  41. package/docs/tenant-readiness.md +64 -0
  42. package/docs/upgrade.md +124 -0
  43. package/fixtures/analysis/invalid/native-graph.v1.json +4 -0
  44. package/fixtures/analysis/invalid/promoted-claim.v1.json +17 -0
  45. package/fixtures/analysis/invalid/runtime-import.v1.json +20 -0
  46. package/fixtures/analysis/valid/output.claims.v1.json +17 -0
  47. package/fixtures/analysis-adapter/invalid/manifest-hidden-provider.v1.json +24 -0
  48. package/fixtures/analysis-adapter/invalid/output-frontmatter-mutation.v1.json +21 -0
  49. package/fixtures/analysis-adapter/invalid/output-native-graph.v1.json +14 -0
  50. package/fixtures/analysis-adapter/manifest.disabled.v1.json +22 -0
  51. package/fixtures/analysis-adapter/manifest.enabled-local.v1.json +23 -0
  52. package/fixtures/analysis-adapter/output.claims.v1.json +21 -0
  53. package/fixtures/atelier-action-intent/invalid/runtime-mutation-authority.v1.json +16 -0
  54. package/fixtures/atelier-action-intent/invalid/unknown-top-level-field.v1.json +17 -0
  55. package/fixtures/atelier-action-intent/invalid/writes-beyond-clipboard.v1.json +16 -0
  56. package/fixtures/atelier-action-intent/valid/copy-agent-prompt.v1.json +16 -0
  57. package/fixtures/atelier-action-intent/valid/copy-repo-path.v1.json +22 -0
  58. package/fixtures/atelier-analysis-adapter/invalid/hidden-model-provider.v1.json +24 -0
  59. package/fixtures/atelier-analysis-adapter/invalid/inert-with-execute-command.v1.json +24 -0
  60. package/fixtures/atelier-analysis-adapter/invalid/proposals-with-runtime-import.v1.json +30 -0
  61. package/fixtures/atelier-analysis-adapter/valid/manifest-inert.v1.json +24 -0
  62. package/fixtures/atelier-analysis-adapter/valid/proposals-claim-only.v1.json +27 -0
  63. package/fixtures/atelier-attestation/invalid/bad-digest.v1.json +23 -0
  64. package/fixtures/atelier-attestation/invalid/conformance-scope.v1.json +23 -0
  65. package/fixtures/atelier-attestation/invalid/missing-signature.v1.json +22 -0
  66. package/fixtures/atelier-attestation/invalid/unknown-root-field.v1.json +24 -0
  67. package/fixtures/atelier-attestation/keys/roundtrip-issuer.public.v1.json +9 -0
  68. package/fixtures/atelier-attestation/valid/rejected-with-reasons.v1.json +49 -0
  69. package/fixtures/atelier-attestation/valid/signed-admitted.v1.json +35 -0
  70. package/fixtures/atelier-attestation/valid/signed-roundtrip.v1.json +29 -0
  71. package/fixtures/atelier-attestation/valid/unsigned-advisory.v1.json +23 -0
  72. package/fixtures/atelier-claim/invalid/unknown-provider.v1.json +15 -0
  73. package/fixtures/atelier-claim/invalid/unknown-top-level-field.v1.json +16 -0
  74. package/fixtures/atelier-claim/invalid/wrong-schema-const.v1.json +15 -0
  75. package/fixtures/atelier-claim/valid/adapter-style-proposed-relation.v1.json +19 -0
  76. package/fixtures/atelier-claim/valid/codex-proposed-relation.v1.json +16 -0
  77. package/fixtures/atelier-claim/valid/manual-proposed-relation.v1.json +16 -0
  78. package/fixtures/atelier-claim/valid/readiness-proposed-relation.v1.json +18 -0
  79. package/fixtures/atelier-export/invalid/dirty-unforced-empty-taint.v1.json +19 -0
  80. package/fixtures/atelier-export/invalid/object-local-audience-visibility.v1.json +11 -0
  81. package/fixtures/atelier-export/invalid/open-object-class-owner.v1.json +23 -0
  82. package/fixtures/atelier-export/invalid/pricing-legacy-amount.v1.json +23 -0
  83. package/fixtures/atelier-export/invalid/public-disguised-internal-source-ref.v1.json +11 -0
  84. package/fixtures/atelier-export/invalid/public-nested-private-source-ref.v1.json +17 -0
  85. package/fixtures/atelier-export/invalid/public-resolved-private-source-ref.v1.json +13 -0
  86. package/fixtures/atelier-export/invalid/public-resolved-sensitive-source-ref.v1.json +13 -0
  87. package/fixtures/atelier-export/invalid/public-source-ref-missing-provenance.v1.json +20 -0
  88. package/fixtures/atelier-export/invalid/public-source-team-kg.json +12 -0
  89. package/fixtures/atelier-export/invalid/source-node-legacy-visibility.v1.json +21 -0
  90. package/fixtures/atelier-export/invalid/source-node-unknown-field.v1.json +18 -0
  91. package/fixtures/atelier-export/invalid/unresolved-public-source-ref.v1.json +11 -0
  92. package/fixtures/atelier-export/sample-studio-offer.v1.json +397 -0
  93. package/fixtures/atelier-extension-pack/invalid/bundled-slug-collision.v1.json +22 -0
  94. package/fixtures/atelier-extension-pack/invalid/escapes-root.v1.json +22 -0
  95. package/fixtures/atelier-extension-pack/invalid/posture-tampered.v1.json +22 -0
  96. package/fixtures/atelier-extension-pack/invalid/protocols/autonomous-authority.v1.json +118 -0
  97. package/fixtures/atelier-extension-pack/invalid/protocols/offer-map.v1.json +109 -0
  98. package/fixtures/atelier-extension-pack/invalid/redefines-runtime-term.v1.json +19 -0
  99. package/fixtures/atelier-extension-pack/invalid/wrong-namespace.v1.json +19 -0
  100. package/fixtures/atelier-extension-pack/valid/protocols/contract-gate.v1.json +109 -0
  101. package/fixtures/atelier-extension-pack/valid/sample-pack.v1.json +48 -0
  102. package/fixtures/atelier-kit-manifest/invalid/runtime-copy-without-canonical-role.v1.json +53 -0
  103. package/fixtures/atelier-kit-manifest/invalid/telemetry-send-path.v1.json +21 -0
  104. package/fixtures/atelier-kit-manifest/valid/mnstry-atelier.valid.v1.json +76 -0
  105. package/fixtures/atelier-lock/invalid/absolute-contract-path.v1.json +40 -0
  106. package/fixtures/atelier-lock/invalid/runtime-mutation-enabled.v1.json +41 -0
  107. package/fixtures/atelier-lock/invalid/unknown-top-level-field.v1.json +42 -0
  108. package/fixtures/atelier-lock/valid/extension-pack.v1.json +55 -0
  109. package/fixtures/atelier-lock/valid/minimal.v1.json +44 -0
  110. package/fixtures/atelier-migration/invalid/live-apply-mode.v1.json +21 -0
  111. package/fixtures/atelier-migration/invalid/missing-review-evidence.v1.json +20 -0
  112. package/fixtures/atelier-migration/invalid/runtime-mutation-enabled.v1.json +21 -0
  113. package/fixtures/atelier-migration/valid/minimal.v1.json +32 -0
  114. package/fixtures/atelier-project-config/invalid/absolute-repo-path.v1.json +11 -0
  115. package/fixtures/atelier-project-config/invalid/ext-not-object.v1.json +12 -0
  116. package/fixtures/atelier-project-config/invalid/external-kind-read-boundary.v1.json +12 -0
  117. package/fixtures/atelier-project-config/invalid/missing-repos-and-alignment.v1.json +7 -0
  118. package/fixtures/atelier-project-config/invalid/unknown-top-level-field.v1.json +14 -0
  119. package/fixtures/atelier-project-config/valid/alignment-scaffold.v1.json +15 -0
  120. package/fixtures/atelier-project-config/valid/ext-extension-packs.v1.json +36 -0
  121. package/fixtures/atelier-project-config/valid/repo-workspace.v1.json +23 -0
  122. package/fixtures/atelier-project-config/validator-only/ext-member-not-object.v1.json +14 -0
  123. package/fixtures/atelier-readiness/invalid/dry-run-only-false.v1.json +87 -0
  124. package/fixtures/atelier-readiness/invalid/support-bundle-send-path.v1.json +87 -0
  125. package/fixtures/atelier-readiness/invalid/unknown-top-level-field.v1.json +88 -0
  126. package/fixtures/atelier-readiness/valid/ready-workspace.v1.json +84 -0
  127. package/fixtures/boundary-policy/invalid/content-rule-exception-blanket-path.v1.json +67 -0
  128. package/fixtures/boundary-policy/invalid/invalid-actor-private-repo-mapping.v1.json +20 -0
  129. package/fixtures/boundary-policy/invalid/legacy-warning-missing-warning.v1.json +20 -0
  130. package/fixtures/boundary-policy/invalid/missing-repo-coverage.v1.json +19 -0
  131. package/fixtures/boundary-policy/invalid/unknown-key.v1.json +12 -0
  132. package/fixtures/boundary-policy/valid/content-rule-exception.v1.json +67 -0
  133. package/fixtures/boundary-policy/valid/legacy-warning.v1.json +33 -0
  134. package/fixtures/boundary-policy/valid/strict-private-shared.v1.json +40 -0
  135. package/fixtures/git-promote/invalid/provision-named-revocable.v1.json +29 -0
  136. package/fixtures/git-promote/private-to-team.v1.json +29 -0
  137. package/fixtures/knowledge-source-sidecar/invalid/legacy-visibility-field.v1.json +17 -0
  138. package/fixtures/knowledge-source-sidecar/invalid/missing-audience.v1.json +15 -0
  139. package/fixtures/knowledge-source-sidecar/invalid/unknown-relation-kind.v1.json +18 -0
  140. package/fixtures/knowledge-source-sidecar/valid/html-source.v1.json +18 -0
  141. package/fixtures/knowledge-source-sidecar/valid/pdf-evidence.v1.json +18 -0
  142. package/fixtures/projects/neutral-project/atelier.project.json +15 -0
  143. package/fixtures/projects/neutral-project/ops/config/repo-access.v1.json +12 -0
  144. package/fixtures/projects/neutral-project/project-knowledge.graph.json +69 -0
  145. package/fixtures/projects/sample-workspace/atelier.project.json +23 -0
  146. package/fixtures/projects/sample-workspace/boundary-policy.v1.json +59 -0
  147. package/fixtures/projects/sample-workspace/content/README.md +16 -0
  148. package/fixtures/projects/sample-workspace/content/source.html +5 -0
  149. package/fixtures/projects/sample-workspace/content/source.html.kg.json +15 -0
  150. package/fixtures/projects/sample-workspace/repo-access.v1.json +9 -0
  151. package/fixtures/projects/source-formats-workspace/atelier.project.json +23 -0
  152. package/fixtures/projects/source-formats-workspace/content/README.md +17 -0
  153. package/fixtures/projects/source-formats-workspace/content/data.json +7 -0
  154. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +15 -0
  155. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +15 -0
  156. package/fixtures/projects/source-formats-workspace/content/metrics.csv +3 -0
  157. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +15 -0
  158. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml +4 -0
  159. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +15 -0
  160. package/fixtures/projects/source-formats-workspace/repo-access.v1.json +9 -0
  161. package/fixtures/readiness-protocols/extension-pack/invalid/protocol-missing-path.v1.json +20 -0
  162. package/fixtures/readiness-protocols/extension-pack/valid/with-protocol.v1.json +24 -0
  163. package/fixtures/readiness-protocols/protocol/invalid/missing-check-target.v1.json +103 -0
  164. package/fixtures/readiness-protocols/protocol/invalid/runtime-mutation-enabled.v1.json +107 -0
  165. package/fixtures/readiness-protocols/protocol/valid/minimal.v1.json +100 -0
  166. package/fixtures/readiness-protocols/run/invalid/missing-evidence.v1.json +37 -0
  167. package/fixtures/readiness-protocols/run/invalid/pass-with-blocker.v1.json +22 -0
  168. package/fixtures/readiness-protocols/run/invalid/runtime-mutation-enabled.v1.json +22 -0
  169. package/fixtures/readiness-protocols/run/valid/pass.v1.json +44 -0
  170. package/fixtures/support/invalid/leaky-support.v1.json +13 -0
  171. package/fixtures/support/valid/minimal-safe.v1.json +20 -0
  172. package/package.json +98 -0
  173. package/skills/claude/atelier-open/SKILL.md +68 -0
  174. package/skills/claude/mnstry-readiness/SKILL.md +41 -0
  175. package/skills/codex/atelier-open/SKILL.md +68 -0
  176. package/skills/codex/mnstry-readiness/SKILL.md +41 -0
  177. package/src/analysis/adapter.mjs +20 -0
  178. package/src/analysis/analysis-claim-contract.mjs +335 -0
  179. package/src/attestation/jcs.mjs +64 -0
  180. package/src/attestation/sign.mjs +305 -0
  181. package/src/boundary/content-rules.mjs +262 -0
  182. package/src/boundary/policy.mjs +806 -0
  183. package/src/check-atelier-export-contract.mjs +116 -0
  184. package/src/cli/run.mjs +283 -0
  185. package/src/collaboration/proposals.mjs +262 -0
  186. package/src/commands/analysis.mjs +8 -0
  187. package/src/commands/announcements.mjs +308 -0
  188. package/src/commands/attestation.mjs +198 -0
  189. package/src/commands/boundary.mjs +25 -0
  190. package/src/commands/config.mjs +4 -0
  191. package/src/commands/context.mjs +3 -0
  192. package/src/commands/distribution.mjs +224 -0
  193. package/src/commands/egress.mjs +11 -0
  194. package/src/commands/extension-pack.mjs +209 -0
  195. package/src/commands/feedback.mjs +3 -0
  196. package/src/commands/graph.mjs +3 -0
  197. package/src/commands/init.mjs +130 -0
  198. package/src/commands/lock.mjs +3 -0
  199. package/src/commands/project.mjs +3 -0
  200. package/src/commands/promote.mjs +4 -0
  201. package/src/commands/readiness.mjs +3 -0
  202. package/src/commands/server.mjs +6 -0
  203. package/src/commands/setup.mjs +250 -0
  204. package/src/commands/support.mjs +3 -0
  205. package/src/commands/upgrade.mjs +3 -0
  206. package/src/contracts/corpus.mjs +171 -0
  207. package/src/egress/check.mjs +45 -0
  208. package/src/egress/forbidden-egress.mjs +323 -0
  209. package/src/export/atelier-export-contract.mjs +722 -0
  210. package/src/extension-packs/loader.mjs +491 -0
  211. package/src/graph/graph.mjs +370 -0
  212. package/src/graph/knowledge-graph.mjs +887 -0
  213. package/src/harness/context-client.mjs +144 -0
  214. package/src/harness/context.mjs +27 -0
  215. package/src/index.mjs +88 -0
  216. package/src/project/config.mjs +557 -0
  217. package/src/project/file-class.mjs +113 -0
  218. package/src/project/git-ignore.mjs +31 -0
  219. package/src/project/path-match.mjs +30 -0
  220. package/src/project/repo-identity.mjs +176 -0
  221. package/src/projection/alignment-projection.mjs +169 -0
  222. package/src/projection/policy.mjs +90 -0
  223. package/src/projection/project.mjs +152 -0
  224. package/src/readiness/readiness.mjs +312 -0
  225. package/src/readiness-protocols/bundled-pack.mjs +766 -0
  226. package/src/readiness-protocols/runtime.mjs +419 -0
  227. package/src/server/local-sidecar.mjs +640 -0
  228. package/src/server/security.mjs +229 -0
  229. package/src/server/server.mjs +42 -0
  230. package/src/support/feedback-report.mjs +414 -0
  231. package/src/support/support-bundle.mjs +226 -0
  232. package/src/ui/html-primitives.mjs +104 -0
  233. package/src/upgrade/upgrade.mjs +701 -0
  234. package/src/validate-atelier-export-dry-run.mjs +75 -0
  235. package/templates/atelier.project.example.json +23 -0
  236. package/templates/distribution-workspace/.claude/launch.json +12 -0
  237. package/templates/distribution-workspace/README.md +86 -0
  238. package/templates/distribution-workspace/atelier.project.json +36 -0
  239. package/templates/distribution-workspace/boundary-policy.v1.json +61 -0
  240. package/templates/distribution-workspace/gitignore +29 -0
  241. package/templates/distribution-workspace/governance/repo-boundary-ledger.md +5 -0
  242. package/templates/distribution-workspace/project/README.md +19 -0
  243. package/templates/distribution-workspace/repo-access.v1.json +9 -0
  244. package/templates/launch.json +12 -0
  245. package/templates/private-domain-workspace/.claude/launch.json +12 -0
  246. package/templates/private-domain-workspace/README.md +50 -0
  247. package/templates/private-domain-workspace/atelier.project.json +28 -0
  248. package/templates/private-domain-workspace/boundary-policy.v1.json +54 -0
  249. package/templates/private-domain-workspace/domain/README.md +19 -0
  250. package/templates/private-domain-workspace/gitignore +29 -0
  251. package/templates/private-domain-workspace/governance/repo-boundary-ledger.md +4 -0
  252. package/templates/private-domain-workspace/repo-access.v1.json +9 -0
  253. package/templates/shared-project-workspace/.claude/launch.json +12 -0
  254. package/templates/shared-project-workspace/README.md +51 -0
  255. package/templates/shared-project-workspace/atelier.project.json +28 -0
  256. package/templates/shared-project-workspace/boundary-policy.v1.json +61 -0
  257. package/templates/shared-project-workspace/gitignore +29 -0
  258. package/templates/shared-project-workspace/governance/repo-boundary-ledger.md +5 -0
  259. package/templates/shared-project-workspace/project/README.md +19 -0
  260. package/templates/shared-project-workspace/repo-access.v1.json +9 -0
@@ -0,0 +1,1015 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-export.v1.schema.json",
4
+ "$comment": "contract revision 1.1.0 (contract-stability epoch)",
5
+ "title": "atelier-export@v1",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "exportId",
11
+ "createdAt",
12
+ "sourceWorkspace",
13
+ "sourceCommit",
14
+ "dirtyTree",
15
+ "forced",
16
+ "provenance",
17
+ "validation",
18
+ "visibilityGate",
19
+ "objects",
20
+ "importPlan",
21
+ "blockers"
22
+ ],
23
+ "allOf": [
24
+ {
25
+ "if": {
26
+ "required": [
27
+ "dirtyTree"
28
+ ],
29
+ "properties": {
30
+ "dirtyTree": {
31
+ "const": true
32
+ }
33
+ }
34
+ },
35
+ "then": {
36
+ "required": [
37
+ "forced",
38
+ "visibilityGate"
39
+ ],
40
+ "properties": {
41
+ "forced": {
42
+ "const": true
43
+ },
44
+ "visibilityGate": {
45
+ "required": [
46
+ "taint"
47
+ ],
48
+ "properties": {
49
+ "taint": {
50
+ "type": "array",
51
+ "minItems": 1
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ ],
59
+ "properties": {
60
+ "schema": {
61
+ "const": "atelier-export@v1"
62
+ },
63
+ "contractVersion": {
64
+ "type": "string",
65
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
66
+ },
67
+ "exportId": {
68
+ "type": "string",
69
+ "pattern": "^export:[a-z0-9][a-z0-9:-]*$"
70
+ },
71
+ "createdAt": {
72
+ "type": "string",
73
+ "format": "date-time"
74
+ },
75
+ "sourceWorkspace": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": [
79
+ "id",
80
+ "rootName"
81
+ ],
82
+ "properties": {
83
+ "id": {
84
+ "type": "string"
85
+ },
86
+ "rootName": {
87
+ "type": "string"
88
+ },
89
+ "workspacePath": {
90
+ "type": "string"
91
+ },
92
+ "ext": {
93
+ "type": "object",
94
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
95
+ }
96
+ }
97
+ },
98
+ "sourceCommit": {
99
+ "description": "The commit SHA of the repository used to define the export contract fixture. Per-repo SHAs remain in sourceCommit.repos.",
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "required": [
103
+ "sha",
104
+ "repos"
105
+ ],
106
+ "properties": {
107
+ "sha": {
108
+ "type": "string",
109
+ "pattern": "^[0-9a-f]{40}$"
110
+ },
111
+ "repos": {
112
+ "type": "array",
113
+ "items": {
114
+ "$ref": "#/$defs/repoCommit"
115
+ },
116
+ "minItems": 1
117
+ },
118
+ "ext": {
119
+ "type": "object",
120
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
121
+ }
122
+ }
123
+ },
124
+ "dirtyTree": {
125
+ "type": "boolean"
126
+ },
127
+ "forced": {
128
+ "type": "boolean"
129
+ },
130
+ "provenance": {
131
+ "type": "object",
132
+ "additionalProperties": false,
133
+ "required": [
134
+ "generatedBy",
135
+ "sourceNodes"
136
+ ],
137
+ "properties": {
138
+ "generatedBy": {
139
+ "type": "string"
140
+ },
141
+ "sourceNodes": {
142
+ "type": "array",
143
+ "items": {
144
+ "$ref": "#/$defs/sourceNode"
145
+ },
146
+ "minItems": 1
147
+ },
148
+ "notes": {
149
+ "type": "array",
150
+ "items": {
151
+ "type": "string"
152
+ }
153
+ },
154
+ "ext": {
155
+ "type": "object",
156
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
157
+ }
158
+ }
159
+ },
160
+ "validation": {
161
+ "type": "object",
162
+ "additionalProperties": false,
163
+ "required": [
164
+ "status",
165
+ "checks"
166
+ ],
167
+ "properties": {
168
+ "status": {
169
+ "enum": [
170
+ "pass",
171
+ "warn",
172
+ "fail"
173
+ ]
174
+ },
175
+ "checks": {
176
+ "type": "array",
177
+ "items": {
178
+ "$ref": "#/$defs/check"
179
+ }
180
+ },
181
+ "ext": {
182
+ "type": "object",
183
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
184
+ }
185
+ }
186
+ },
187
+ "visibilityGate": {
188
+ "type": "object",
189
+ "additionalProperties": false,
190
+ "required": [
191
+ "status",
192
+ "defaultVisibility",
193
+ "publicSourcePolicy"
194
+ ],
195
+ "properties": {
196
+ "status": {
197
+ "enum": [
198
+ "pass",
199
+ "warn",
200
+ "fail"
201
+ ]
202
+ },
203
+ "defaultVisibility": {
204
+ "enum": [
205
+ "private"
206
+ ]
207
+ },
208
+ "publicSourcePolicy": {
209
+ "enum": [
210
+ "public-only"
211
+ ]
212
+ },
213
+ "taint": {
214
+ "type": "array",
215
+ "items": {
216
+ "type": "string"
217
+ }
218
+ },
219
+ "ext": {
220
+ "type": "object",
221
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
222
+ }
223
+ }
224
+ },
225
+ "objects": {
226
+ "type": "object",
227
+ "additionalProperties": false,
228
+ "required": [
229
+ "offers",
230
+ "surfaces",
231
+ "sdui",
232
+ "commitmentPaths",
233
+ "spaces",
234
+ "trackables",
235
+ "consentBoundaries",
236
+ "staffPrep",
237
+ "providerEgress"
238
+ ],
239
+ "properties": {
240
+ "offers": {
241
+ "type": "array",
242
+ "items": {
243
+ "$ref": "#/$defs/offer"
244
+ }
245
+ },
246
+ "surfaces": {
247
+ "type": "array",
248
+ "items": {
249
+ "$ref": "#/$defs/surface"
250
+ }
251
+ },
252
+ "sdui": {
253
+ "type": "array",
254
+ "items": {
255
+ "$ref": "#/$defs/sduiBlock"
256
+ }
257
+ },
258
+ "commitmentPaths": {
259
+ "type": "array",
260
+ "items": {
261
+ "$ref": "#/$defs/commitmentPath"
262
+ }
263
+ },
264
+ "spaces": {
265
+ "type": "array",
266
+ "items": {
267
+ "$ref": "#/$defs/space"
268
+ }
269
+ },
270
+ "trackables": {
271
+ "type": "array",
272
+ "items": {
273
+ "$ref": "#/$defs/trackable"
274
+ }
275
+ },
276
+ "consentBoundaries": {
277
+ "type": "array",
278
+ "items": {
279
+ "$ref": "#/$defs/consentBoundary"
280
+ }
281
+ },
282
+ "staffPrep": {
283
+ "type": "array",
284
+ "items": {
285
+ "$ref": "#/$defs/staffPrep"
286
+ }
287
+ },
288
+ "providerEgress": {
289
+ "type": "array",
290
+ "items": {
291
+ "$ref": "#/$defs/providerEgress"
292
+ }
293
+ },
294
+ "ext": {
295
+ "type": "object",
296
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
297
+ }
298
+ }
299
+ },
300
+ "importPlan": {
301
+ "type": "object",
302
+ "additionalProperties": false,
303
+ "required": [
304
+ "mode",
305
+ "transactional",
306
+ "tenant",
307
+ "runtimeOwners",
308
+ "operations"
309
+ ],
310
+ "properties": {
311
+ "mode": {
312
+ "enum": [
313
+ "dry-run",
314
+ "apply"
315
+ ]
316
+ },
317
+ "transactional": {
318
+ "const": true
319
+ },
320
+ "tenant": {
321
+ "type": "string"
322
+ },
323
+ "runtimeOwners": {
324
+ "type": "array",
325
+ "items": {
326
+ "$ref": "#/$defs/runtimeOwner"
327
+ }
328
+ },
329
+ "operations": {
330
+ "type": "array",
331
+ "items": {
332
+ "$ref": "#/$defs/importOperation"
333
+ }
334
+ },
335
+ "ext": {
336
+ "type": "object",
337
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
338
+ }
339
+ }
340
+ },
341
+ "blockers": {
342
+ "type": "array",
343
+ "items": {
344
+ "$ref": "#/$defs/blocker"
345
+ }
346
+ },
347
+ "ext": {
348
+ "type": "object",
349
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
350
+ }
351
+ },
352
+ "$defs": {
353
+ "visibility": {
354
+ "description": "Runtime/export visibility. Local source readership belongs in audience, not this field.",
355
+ "enum": [
356
+ "private",
357
+ "shared",
358
+ "platform",
359
+ "public"
360
+ ]
361
+ },
362
+ "audience": {
363
+ "enum": [
364
+ "public",
365
+ "team",
366
+ "operator",
367
+ "staff",
368
+ "private",
369
+ "sensitive"
370
+ ]
371
+ },
372
+ "approvalStatus": {
373
+ "enum": [
374
+ "approved",
375
+ "draft",
376
+ "blocked",
377
+ "needs-review"
378
+ ]
379
+ },
380
+ "repoCommit": {
381
+ "type": "object",
382
+ "additionalProperties": false,
383
+ "required": [
384
+ "repo",
385
+ "sha"
386
+ ],
387
+ "properties": {
388
+ "repo": {
389
+ "type": "string"
390
+ },
391
+ "sha": {
392
+ "type": "string"
393
+ },
394
+ "branch": {
395
+ "type": "string"
396
+ },
397
+ "dirty": {
398
+ "type": "boolean"
399
+ },
400
+ "ext": {
401
+ "type": "object",
402
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
403
+ }
404
+ }
405
+ },
406
+ "sourceNode": {
407
+ "type": "object",
408
+ "additionalProperties": false,
409
+ "required": [
410
+ "kgId",
411
+ "repo",
412
+ "path",
413
+ "audience",
414
+ "sourceRole"
415
+ ],
416
+ "properties": {
417
+ "kgId": {
418
+ "type": "string"
419
+ },
420
+ "repo": {
421
+ "type": "string"
422
+ },
423
+ "path": {
424
+ "type": "string"
425
+ },
426
+ "audience": {
427
+ "$ref": "#/$defs/audience"
428
+ },
429
+ "sourceRole": {
430
+ "type": "string"
431
+ },
432
+ "ext": {
433
+ "type": "object",
434
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
435
+ }
436
+ }
437
+ },
438
+ "check": {
439
+ "type": "object",
440
+ "additionalProperties": false,
441
+ "required": [
442
+ "id",
443
+ "status"
444
+ ],
445
+ "properties": {
446
+ "id": {
447
+ "type": "string"
448
+ },
449
+ "status": {
450
+ "enum": [
451
+ "pass",
452
+ "warn",
453
+ "fail"
454
+ ]
455
+ },
456
+ "detail": {
457
+ "type": "string"
458
+ },
459
+ "ext": {
460
+ "type": "object",
461
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
462
+ }
463
+ }
464
+ },
465
+ "offer": {
466
+ "type": "object",
467
+ "additionalProperties": false,
468
+ "required": [
469
+ "id",
470
+ "title",
471
+ "visibility",
472
+ "approvalStatus",
473
+ "entryModes",
474
+ "capacity",
475
+ "pricing",
476
+ "sourceRefs"
477
+ ],
478
+ "properties": {
479
+ "id": {
480
+ "type": "string"
481
+ },
482
+ "title": {
483
+ "type": "string"
484
+ },
485
+ "visibility": {
486
+ "$ref": "#/$defs/visibility"
487
+ },
488
+ "approvalStatus": {
489
+ "$ref": "#/$defs/approvalStatus"
490
+ },
491
+ "entryModes": {
492
+ "type": "array",
493
+ "items": {
494
+ "type": "string"
495
+ },
496
+ "minItems": 1
497
+ },
498
+ "capacity": {
499
+ "type": "object",
500
+ "additionalProperties": false,
501
+ "required": [
502
+ "min",
503
+ "preferredMax",
504
+ "absoluteMax"
505
+ ],
506
+ "properties": {
507
+ "min": {
508
+ "type": "integer",
509
+ "minimum": 1
510
+ },
511
+ "preferredMax": {
512
+ "type": "integer",
513
+ "minimum": 1
514
+ },
515
+ "absoluteMax": {
516
+ "type": "integer",
517
+ "minimum": 1
518
+ },
519
+ "ext": {
520
+ "type": "object",
521
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
522
+ }
523
+ }
524
+ },
525
+ "pricing": {
526
+ "type": "object",
527
+ "additionalProperties": false,
528
+ "required": [
529
+ "currency",
530
+ "posture",
531
+ "approvalStatus"
532
+ ],
533
+ "properties": {
534
+ "currency": {
535
+ "type": "string",
536
+ "pattern": "^[A-Z]{3}$"
537
+ },
538
+ "posture": {
539
+ "type": "string"
540
+ },
541
+ "approvalStatus": {
542
+ "$ref": "#/$defs/approvalStatus"
543
+ },
544
+ "bands": {
545
+ "type": "array",
546
+ "items": {
547
+ "type": "object",
548
+ "additionalProperties": false,
549
+ "required": [
550
+ "label",
551
+ "amountMinor"
552
+ ],
553
+ "properties": {
554
+ "label": {
555
+ "type": "string"
556
+ },
557
+ "amountMinor": {
558
+ "type": "integer",
559
+ "minimum": 0
560
+ },
561
+ "notes": {
562
+ "type": "string"
563
+ },
564
+ "ext": {
565
+ "type": "object",
566
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
567
+ }
568
+ }
569
+ }
570
+ },
571
+ "ext": {
572
+ "type": "object",
573
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
574
+ }
575
+ }
576
+ },
577
+ "sourceRefs": {
578
+ "type": "array",
579
+ "items": {
580
+ "type": "string"
581
+ }
582
+ },
583
+ "ext": {
584
+ "type": "object",
585
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
586
+ }
587
+ }
588
+ },
589
+ "surface": {
590
+ "type": "object",
591
+ "additionalProperties": false,
592
+ "required": [
593
+ "id",
594
+ "type",
595
+ "visibility",
596
+ "title",
597
+ "slug",
598
+ "sourceRefs"
599
+ ],
600
+ "properties": {
601
+ "id": {
602
+ "type": "string"
603
+ },
604
+ "type": {
605
+ "type": "string"
606
+ },
607
+ "visibility": {
608
+ "$ref": "#/$defs/visibility"
609
+ },
610
+ "title": {
611
+ "type": "string"
612
+ },
613
+ "slug": {
614
+ "type": "string"
615
+ },
616
+ "summary": {
617
+ "type": "string"
618
+ },
619
+ "sourceRefs": {
620
+ "type": "array",
621
+ "items": {
622
+ "type": "string"
623
+ }
624
+ },
625
+ "ext": {
626
+ "type": "object",
627
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
628
+ }
629
+ }
630
+ },
631
+ "sduiBlock": {
632
+ "type": "object",
633
+ "additionalProperties": false,
634
+ "required": [
635
+ "id",
636
+ "primitive",
637
+ "visibility",
638
+ "props"
639
+ ],
640
+ "properties": {
641
+ "id": {
642
+ "type": "string"
643
+ },
644
+ "primitive": {
645
+ "type": "string"
646
+ },
647
+ "visibility": {
648
+ "$ref": "#/$defs/visibility"
649
+ },
650
+ "props": {
651
+ "type": "object"
652
+ },
653
+ "ext": {
654
+ "type": "object",
655
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
656
+ }
657
+ }
658
+ },
659
+ "commitmentPath": {
660
+ "type": "object",
661
+ "additionalProperties": false,
662
+ "required": [
663
+ "id",
664
+ "offerId",
665
+ "mode",
666
+ "steps",
667
+ "approvalStatus"
668
+ ],
669
+ "properties": {
670
+ "id": {
671
+ "type": "string"
672
+ },
673
+ "offerId": {
674
+ "type": "string"
675
+ },
676
+ "mode": {
677
+ "type": "string"
678
+ },
679
+ "approvalStatus": {
680
+ "$ref": "#/$defs/approvalStatus"
681
+ },
682
+ "steps": {
683
+ "type": "array",
684
+ "items": {
685
+ "type": "string"
686
+ },
687
+ "minItems": 1
688
+ },
689
+ "ext": {
690
+ "type": "object",
691
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
692
+ }
693
+ }
694
+ },
695
+ "space": {
696
+ "type": "object",
697
+ "additionalProperties": false,
698
+ "required": [
699
+ "id",
700
+ "title",
701
+ "type",
702
+ "visibility",
703
+ "roles"
704
+ ],
705
+ "properties": {
706
+ "id": {
707
+ "type": "string"
708
+ },
709
+ "title": {
710
+ "type": "string"
711
+ },
712
+ "type": {
713
+ "type": "string"
714
+ },
715
+ "visibility": {
716
+ "$ref": "#/$defs/visibility"
717
+ },
718
+ "roles": {
719
+ "type": "array",
720
+ "items": {
721
+ "type": "string"
722
+ }
723
+ },
724
+ "ext": {
725
+ "type": "object",
726
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
727
+ }
728
+ }
729
+ },
730
+ "trackable": {
731
+ "type": "object",
732
+ "additionalProperties": false,
733
+ "required": [
734
+ "id",
735
+ "title",
736
+ "type",
737
+ "visibility",
738
+ "events"
739
+ ],
740
+ "properties": {
741
+ "id": {
742
+ "type": "string"
743
+ },
744
+ "title": {
745
+ "type": "string"
746
+ },
747
+ "type": {
748
+ "type": "string"
749
+ },
750
+ "visibility": {
751
+ "$ref": "#/$defs/visibility"
752
+ },
753
+ "events": {
754
+ "type": "array",
755
+ "items": {
756
+ "type": "string"
757
+ }
758
+ },
759
+ "ext": {
760
+ "type": "object",
761
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
762
+ }
763
+ }
764
+ },
765
+ "consentBoundary": {
766
+ "type": "object",
767
+ "additionalProperties": false,
768
+ "required": [
769
+ "id",
770
+ "title",
771
+ "visibility",
772
+ "rules"
773
+ ],
774
+ "properties": {
775
+ "id": {
776
+ "type": "string"
777
+ },
778
+ "title": {
779
+ "type": "string"
780
+ },
781
+ "visibility": {
782
+ "$ref": "#/$defs/visibility"
783
+ },
784
+ "rules": {
785
+ "type": "array",
786
+ "items": {
787
+ "type": "object",
788
+ "additionalProperties": false,
789
+ "required": [
790
+ "id",
791
+ "decision"
792
+ ],
793
+ "properties": {
794
+ "id": {
795
+ "type": "string"
796
+ },
797
+ "decision": {
798
+ "enum": [
799
+ "allow",
800
+ "deny",
801
+ "review"
802
+ ]
803
+ },
804
+ "reason": {
805
+ "type": "string"
806
+ },
807
+ "ext": {
808
+ "type": "object",
809
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
810
+ }
811
+ }
812
+ }
813
+ },
814
+ "ext": {
815
+ "type": "object",
816
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
817
+ }
818
+ }
819
+ },
820
+ "staffPrep": {
821
+ "type": "object",
822
+ "additionalProperties": false,
823
+ "required": [
824
+ "id",
825
+ "title",
826
+ "visibility",
827
+ "allowedFields",
828
+ "prohibitedFields"
829
+ ],
830
+ "properties": {
831
+ "id": {
832
+ "type": "string"
833
+ },
834
+ "title": {
835
+ "type": "string"
836
+ },
837
+ "visibility": {
838
+ "$ref": "#/$defs/visibility"
839
+ },
840
+ "allowedFields": {
841
+ "type": "array",
842
+ "items": {
843
+ "type": "string"
844
+ }
845
+ },
846
+ "prohibitedFields": {
847
+ "type": "array",
848
+ "items": {
849
+ "type": "string"
850
+ }
851
+ },
852
+ "ext": {
853
+ "type": "object",
854
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
855
+ }
856
+ }
857
+ },
858
+ "providerEgress": {
859
+ "type": "object",
860
+ "additionalProperties": false,
861
+ "required": [
862
+ "providerClass",
863
+ "defaultDecision",
864
+ "allowedPayloads",
865
+ "deniedPayloads"
866
+ ],
867
+ "properties": {
868
+ "providerClass": {
869
+ "type": "string"
870
+ },
871
+ "defaultDecision": {
872
+ "enum": [
873
+ "allow",
874
+ "deny",
875
+ "review"
876
+ ]
877
+ },
878
+ "allowedPayloads": {
879
+ "type": "array",
880
+ "items": {
881
+ "type": "string"
882
+ }
883
+ },
884
+ "deniedPayloads": {
885
+ "type": "array",
886
+ "items": {
887
+ "type": "string"
888
+ }
889
+ },
890
+ "ext": {
891
+ "type": "object",
892
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
893
+ }
894
+ }
895
+ },
896
+ "runtimeOwner": {
897
+ "type": "object",
898
+ "additionalProperties": false,
899
+ "required": [
900
+ "objectClass",
901
+ "owner"
902
+ ],
903
+ "properties": {
904
+ "objectClass": {
905
+ "$ref": "#/$defs/objectClass"
906
+ },
907
+ "owner": {
908
+ "$ref": "#/$defs/runtimeOwnerName"
909
+ },
910
+ "ext": {
911
+ "type": "object",
912
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
913
+ }
914
+ }
915
+ },
916
+ "importOperation": {
917
+ "type": "object",
918
+ "additionalProperties": false,
919
+ "required": [
920
+ "op",
921
+ "objectClass",
922
+ "externalId",
923
+ "status"
924
+ ],
925
+ "properties": {
926
+ "op": {
927
+ "enum": [
928
+ "create",
929
+ "update",
930
+ "skip"
931
+ ]
932
+ },
933
+ "objectClass": {
934
+ "$ref": "#/$defs/objectClass"
935
+ },
936
+ "externalId": {
937
+ "type": "string"
938
+ },
939
+ "status": {
940
+ "enum": [
941
+ "ready",
942
+ "blocked",
943
+ "warning"
944
+ ]
945
+ },
946
+ "reason": {
947
+ "type": "string"
948
+ },
949
+ "ext": {
950
+ "type": "object",
951
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
952
+ }
953
+ }
954
+ },
955
+ "objectClass": {
956
+ "enum": [
957
+ "offer",
958
+ "public_surface",
959
+ "surface",
960
+ "sdui_block",
961
+ "commitment_path",
962
+ "space",
963
+ "trackable",
964
+ "consent_boundary",
965
+ "staff_prep",
966
+ "provider_egress"
967
+ ]
968
+ },
969
+ "runtimeOwnerName": {
970
+ "enum": [
971
+ "identity",
972
+ "catalog",
973
+ "commitments",
974
+ "events",
975
+ "projection",
976
+ "consent",
977
+ "messaging",
978
+ "providers",
979
+ "audit"
980
+ ]
981
+ },
982
+ "blocker": {
983
+ "type": "object",
984
+ "additionalProperties": false,
985
+ "required": [
986
+ "id",
987
+ "severity",
988
+ "message",
989
+ "owner"
990
+ ],
991
+ "properties": {
992
+ "id": {
993
+ "type": "string"
994
+ },
995
+ "severity": {
996
+ "enum": [
997
+ "p0",
998
+ "p1",
999
+ "p2"
1000
+ ]
1001
+ },
1002
+ "message": {
1003
+ "type": "string"
1004
+ },
1005
+ "owner": {
1006
+ "type": "string"
1007
+ },
1008
+ "ext": {
1009
+ "type": "object",
1010
+ "description": "Reserved extension container. Producers MAY add namespaced members (recommend vendor-prefixed keys). Consumers MUST ignore members they do not recognize. Contents are not validated at v1 and carry no authority over first-class fields."
1011
+ }
1012
+ }
1013
+ }
1014
+ }
1015
+ }