@vev-software/atlas-contracts 0.1.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.
- package/dist/index.d.ts +341 -0
- package/dist/index.js +7 -0
- package/package.json +21 -0
- package/schemas/v1/asset.schema.json +78 -0
- package/schemas/v1/bundle.schema.json +411 -0
- package/schemas/v1/common.schema.json +129 -0
- package/schemas/v1/discovery-observation.schema.json +218 -0
- package/schemas/v1/import.schema.json +104 -0
- package/schemas/v1/landscape.schema.json +36 -0
- package/schemas/v1/relationship.schema.json +23 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.vev.software/atlas/v1/bundle.schema.json",
|
|
4
|
+
"title": "Portable Atlas bundle (v1)",
|
|
5
|
+
"description": "The public, versioned portable Atlas bundle: a self-contained migration package layered ON TOP of the landscape export (landscape.schema.json). It carries the resolved landscape plus the additional Atlas-domain metadata a hosted <-> self-hosted move needs — workspace metadata, diagrams, an attachment manifest, public module/extension data and restore hints — without becoming a private hosted-only escape hatch. It carries Atlas domain data and migration metadata only: NEVER entitlement/subscription/billing state, live identity credentials or raw secret values (those are Fabric/control-plane concerns or are represented as references/rebind instructions). See handbook 11 §3, 11 §7, 12 §Phase C and ADR 0003.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["contractVersion", "kind", "manifest", "landscape"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"contractVersion": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "The atlas-contracts schema major version this bundle conforms to.",
|
|
13
|
+
"const": "1"
|
|
14
|
+
},
|
|
15
|
+
"kind": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Discriminates a portable bundle from the import/export/discovery documents.",
|
|
18
|
+
"const": "atlas-bundle"
|
|
19
|
+
},
|
|
20
|
+
"createdAt": {
|
|
21
|
+
"type": ["string", "null"],
|
|
22
|
+
"description": "When the bundle was produced, if known.",
|
|
23
|
+
"format": "date-time"
|
|
24
|
+
},
|
|
25
|
+
"generator": {
|
|
26
|
+
"description": "Optional provenance: what produced this bundle.",
|
|
27
|
+
"oneOf": [
|
|
28
|
+
{ "type": "null" },
|
|
29
|
+
{ "$ref": "common.schema.json#/$defs/Generator" }
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"compatibility": {
|
|
33
|
+
"description": "Producer-declared compatibility so a reader can decide, before importing, whether it can safely consume the bundle.",
|
|
34
|
+
"oneOf": [
|
|
35
|
+
{ "type": "null" },
|
|
36
|
+
{ "$ref": "#/$defs/BundleCompatibility" }
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"manifest": {
|
|
40
|
+
"description": "Machine-checkable inventory of what the bundle carries, so a reader can verify completeness before importing. The counts must match the actual section sizes — a bundle-level rule the conformance kit checks.",
|
|
41
|
+
"$ref": "#/$defs/BundleManifest"
|
|
42
|
+
},
|
|
43
|
+
"landscape": {
|
|
44
|
+
"description": "The resolved landscape core: assets and manual relationships, exactly as the export contract defines them. Every reference elsewhere in the bundle points at ids in here.",
|
|
45
|
+
"$ref": "landscape.schema.json"
|
|
46
|
+
},
|
|
47
|
+
"workspace": {
|
|
48
|
+
"description": "Held, portable workspace metadata (display identity only — never tenant shell, subscription or entitlement state).",
|
|
49
|
+
"oneOf": [
|
|
50
|
+
{ "type": "null" },
|
|
51
|
+
{ "$ref": "#/$defs/WorkspaceMetadata" }
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"diagrams": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"description": "Portable Atlas diagrams: held layouts over the landscape, referencing asset and relationship ids present in it.",
|
|
57
|
+
"items": { "$ref": "#/$defs/Diagram" },
|
|
58
|
+
"default": []
|
|
59
|
+
},
|
|
60
|
+
"attachments": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"description": "Attachment MANIFEST: references to binary attachments with integrity digests, never inline secret bytes. The bytes themselves travel out of band; this lists what belongs to the bundle and how to verify it.",
|
|
63
|
+
"items": { "$ref": "#/$defs/AttachmentManifestEntry" },
|
|
64
|
+
"default": []
|
|
65
|
+
},
|
|
66
|
+
"modules": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"description": "Public module / extension data sections. Each carries a public module id and the version of that module's OWN public data contract; the payload is governed by that module contract, not this one.",
|
|
69
|
+
"items": { "$ref": "#/$defs/ModuleData" },
|
|
70
|
+
"default": []
|
|
71
|
+
},
|
|
72
|
+
"restore": {
|
|
73
|
+
"description": "Restore HINTS for reconstructing the workspace at the destination: identity-mapping placeholders and secret-rebind instructions. Instructions and references only — never password/session material or secret values.",
|
|
74
|
+
"oneOf": [
|
|
75
|
+
{ "type": "null" },
|
|
76
|
+
{ "$ref": "#/$defs/RestoreHints" }
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"excluded": {
|
|
80
|
+
"type": "array",
|
|
81
|
+
"description": "The non-portable categories the producer asserts it deliberately left out. Makes the exclusions machine-visible so a reader knows the bundle is complete-by-design, not truncated. The schema also structurally forbids carrying these (additionalProperties: false everywhere).",
|
|
82
|
+
"items": { "$ref": "#/$defs/ExcludedCategory" },
|
|
83
|
+
"uniqueItems": true,
|
|
84
|
+
"default": []
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"$defs": {
|
|
88
|
+
"BundleCompatibility": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"description": "Producer-declared compatibility floor and provenance. Additive changes keep a bundle readable by older readers within the same contract major; breaking changes raise the contract major (schemas/v2) with an ADR and migration.",
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"required": ["minReaderContractVersion"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"minReaderContractVersion": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "The minimum atlas-contracts schema major version a reader must implement to safely import this bundle. For v1 this is '1'; a reader on an older major must refuse rather than silently drop data.",
|
|
97
|
+
"const": "1"
|
|
98
|
+
},
|
|
99
|
+
"producerAtlasVersion": {
|
|
100
|
+
"type": ["string", "null"],
|
|
101
|
+
"description": "The version of the Atlas runtime that produced the bundle, if known. A hint for the destination, not a gate.",
|
|
102
|
+
"maxLength": 64
|
|
103
|
+
},
|
|
104
|
+
"requiredModules": {
|
|
105
|
+
"type": "array",
|
|
106
|
+
"description": "Public module ids (and minimum versions) the destination must have available to fully restore the module sections. A reader missing one can still import the landscape core.",
|
|
107
|
+
"items": { "$ref": "#/$defs/ModuleRequirement" },
|
|
108
|
+
"default": []
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"ModuleRequirement": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"description": "A public module the destination should have to consume a module data section.",
|
|
115
|
+
"additionalProperties": false,
|
|
116
|
+
"required": ["id"],
|
|
117
|
+
"properties": {
|
|
118
|
+
"id": { "$ref": "#/$defs/ModuleId" },
|
|
119
|
+
"minVersion": {
|
|
120
|
+
"type": ["string", "null"],
|
|
121
|
+
"description": "The minimum public data-contract version of the module the destination needs.",
|
|
122
|
+
"maxLength": 64
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"BundleManifest": {
|
|
127
|
+
"type": "object",
|
|
128
|
+
"description": "Inventory of the bundle's sections. Counts must equal the actual array sizes; the SDK exposes the check and the conformance kit enforces it.",
|
|
129
|
+
"additionalProperties": false,
|
|
130
|
+
"required": ["landscape"],
|
|
131
|
+
"properties": {
|
|
132
|
+
"landscape": {
|
|
133
|
+
"type": "object",
|
|
134
|
+
"description": "Counts for the embedded landscape core.",
|
|
135
|
+
"additionalProperties": false,
|
|
136
|
+
"required": ["assetCount", "relationshipCount"],
|
|
137
|
+
"properties": {
|
|
138
|
+
"assetCount": { "type": "integer", "minimum": 0 },
|
|
139
|
+
"relationshipCount": { "type": "integer", "minimum": 0 }
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"diagramCount": { "type": "integer", "minimum": 0, "default": 0 },
|
|
143
|
+
"attachmentCount": { "type": "integer", "minimum": 0, "default": 0 },
|
|
144
|
+
"moduleCount": { "type": "integer", "minimum": 0, "default": 0 }
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"WorkspaceMetadata": {
|
|
148
|
+
"type": "object",
|
|
149
|
+
"description": "Portable workspace display metadata. Cataloguing/presentation only: NO tenant shell, subscription, entitlement, trial or billing state (Fabric/control-plane, recreated or remapped at the destination).",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"required": ["name"],
|
|
152
|
+
"properties": {
|
|
153
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 256 },
|
|
154
|
+
"slug": {
|
|
155
|
+
"type": ["string", "null"],
|
|
156
|
+
"description": "A stable, URL-safe short name, if the workspace has one.",
|
|
157
|
+
"maxLength": 128,
|
|
158
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
159
|
+
},
|
|
160
|
+
"description": { "type": ["string", "null"], "maxLength": 4096 },
|
|
161
|
+
"locale": {
|
|
162
|
+
"type": ["string", "null"],
|
|
163
|
+
"description": "Preferred display locale (BCP-47 tag, e.g. 'da-DK'). Presentation preference, not policy.",
|
|
164
|
+
"maxLength": 35
|
|
165
|
+
},
|
|
166
|
+
"timeZone": {
|
|
167
|
+
"type": ["string", "null"],
|
|
168
|
+
"description": "Preferred display time zone (IANA tz id, e.g. 'Europe/Copenhagen').",
|
|
169
|
+
"maxLength": 64
|
|
170
|
+
},
|
|
171
|
+
"tags": {
|
|
172
|
+
"type": "array",
|
|
173
|
+
"items": { "$ref": "common.schema.json#/$defs/Tag" },
|
|
174
|
+
"default": []
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"Diagram": {
|
|
179
|
+
"type": "object",
|
|
180
|
+
"description": "A portable diagram: a held visual layout over the landscape. Node placements reference asset ids and edges reference relationship ids that MUST be present in the embedded landscape (a bundle-level rule the conformance kit checks). A rendered image, if any, is carried as an attachment, not inline.",
|
|
181
|
+
"additionalProperties": false,
|
|
182
|
+
"required": ["id", "name", "format"],
|
|
183
|
+
"properties": {
|
|
184
|
+
"id": {
|
|
185
|
+
"$ref": "common.schema.json#/$defs/AssetId",
|
|
186
|
+
"description": "Stable diagram identifier, unique within the bundle."
|
|
187
|
+
},
|
|
188
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 256 },
|
|
189
|
+
"description": { "type": ["string", "null"], "maxLength": 4096 },
|
|
190
|
+
"format": {
|
|
191
|
+
"type": "string",
|
|
192
|
+
"description": "The layout format. 'atlas-layout' is the held node/edge placement below; other public formats may be added additively.",
|
|
193
|
+
"enum": ["atlas-layout"]
|
|
194
|
+
},
|
|
195
|
+
"nodes": {
|
|
196
|
+
"type": "array",
|
|
197
|
+
"description": "Placed assets. Each 'ref' matches an asset 'id' in the embedded landscape.",
|
|
198
|
+
"items": { "$ref": "#/$defs/DiagramNode" },
|
|
199
|
+
"default": []
|
|
200
|
+
},
|
|
201
|
+
"edges": {
|
|
202
|
+
"type": "array",
|
|
203
|
+
"description": "Drawn relationships. Each 'ref' matches a relationship 'id' in the embedded landscape.",
|
|
204
|
+
"items": { "$ref": "#/$defs/DiagramEdge" },
|
|
205
|
+
"default": []
|
|
206
|
+
},
|
|
207
|
+
"renderRef": {
|
|
208
|
+
"type": ["string", "null"],
|
|
209
|
+
"description": "Optional attachment id (an entry in 'attachments') of a rendered image of this diagram.",
|
|
210
|
+
"maxLength": 128
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"DiagramNode": {
|
|
215
|
+
"type": "object",
|
|
216
|
+
"description": "A placed asset in a diagram. Position is a held layout fact, not analysis.",
|
|
217
|
+
"additionalProperties": false,
|
|
218
|
+
"required": ["ref", "x", "y"],
|
|
219
|
+
"properties": {
|
|
220
|
+
"ref": {
|
|
221
|
+
"$ref": "common.schema.json#/$defs/AssetId",
|
|
222
|
+
"description": "The asset id this node draws, present in the embedded landscape."
|
|
223
|
+
},
|
|
224
|
+
"x": { "type": "number" },
|
|
225
|
+
"y": { "type": "number" },
|
|
226
|
+
"label": { "type": ["string", "null"], "maxLength": 256 }
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
"DiagramEdge": {
|
|
230
|
+
"type": "object",
|
|
231
|
+
"description": "A drawn relationship in a diagram.",
|
|
232
|
+
"additionalProperties": false,
|
|
233
|
+
"required": ["ref"],
|
|
234
|
+
"properties": {
|
|
235
|
+
"ref": {
|
|
236
|
+
"$ref": "common.schema.json#/$defs/AssetId",
|
|
237
|
+
"description": "The relationship id this edge draws, present in the embedded landscape."
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
"AttachmentManifestEntry": {
|
|
242
|
+
"type": "object",
|
|
243
|
+
"description": "One attachment listed by reference and integrity digest — never inline secret bytes. The bytes travel out of band (an external store, or a sidecar in the transport container); this entry lets the destination locate and verify them.",
|
|
244
|
+
"additionalProperties": false,
|
|
245
|
+
"required": ["id", "name", "mediaType", "byteSize", "digest"],
|
|
246
|
+
"properties": {
|
|
247
|
+
"id": {
|
|
248
|
+
"type": "string",
|
|
249
|
+
"description": "Stable attachment identifier, unique within the bundle. Referenced by diagrams' 'renderRef' and by 'attachedToRef'.",
|
|
250
|
+
"minLength": 1,
|
|
251
|
+
"maxLength": 128,
|
|
252
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
|
|
253
|
+
},
|
|
254
|
+
"name": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"description": "The attachment's file name.",
|
|
257
|
+
"minLength": 1,
|
|
258
|
+
"maxLength": 256
|
|
259
|
+
},
|
|
260
|
+
"mediaType": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"description": "IANA media type, e.g. 'image/png' or 'application/pdf'.",
|
|
263
|
+
"minLength": 1,
|
|
264
|
+
"maxLength": 128
|
|
265
|
+
},
|
|
266
|
+
"byteSize": {
|
|
267
|
+
"type": "integer",
|
|
268
|
+
"description": "Size of the attachment in bytes.",
|
|
269
|
+
"minimum": 0
|
|
270
|
+
},
|
|
271
|
+
"digest": {
|
|
272
|
+
"description": "Content digest so the destination can verify the out-of-band bytes.",
|
|
273
|
+
"$ref": "#/$defs/Digest"
|
|
274
|
+
},
|
|
275
|
+
"attachedToRef": {
|
|
276
|
+
"type": ["string", "null"],
|
|
277
|
+
"description": "Optional id of the asset, relationship or diagram this attachment belongs to. When set, it must resolve within the bundle.",
|
|
278
|
+
"maxLength": 128
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
"Digest": {
|
|
283
|
+
"type": "object",
|
|
284
|
+
"description": "A content digest. SHA-256 is the required baseline; other algorithms may be added additively.",
|
|
285
|
+
"additionalProperties": false,
|
|
286
|
+
"required": ["algorithm", "value"],
|
|
287
|
+
"properties": {
|
|
288
|
+
"algorithm": {
|
|
289
|
+
"type": "string",
|
|
290
|
+
"enum": ["sha-256"]
|
|
291
|
+
},
|
|
292
|
+
"value": {
|
|
293
|
+
"type": "string",
|
|
294
|
+
"description": "Lower-case hex digest.",
|
|
295
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
"ModuleData": {
|
|
300
|
+
"type": "object",
|
|
301
|
+
"description": "A public module / extension data section. The bundle contract fixes only the envelope (which module, which of ITS contract versions); the payload shape is governed by that module's own public contract and is therefore opaque here. A module must never use this section to smuggle secrets or entitlement state — the same exclusions apply.",
|
|
302
|
+
"additionalProperties": false,
|
|
303
|
+
"required": ["id", "version"],
|
|
304
|
+
"properties": {
|
|
305
|
+
"id": { "$ref": "#/$defs/ModuleId" },
|
|
306
|
+
"version": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"description": "The version of the module's OWN public data contract that governs 'data'.",
|
|
309
|
+
"minLength": 1,
|
|
310
|
+
"maxLength": 64
|
|
311
|
+
},
|
|
312
|
+
"itemCount": {
|
|
313
|
+
"type": ["integer", "null"],
|
|
314
|
+
"description": "Optional count of items in 'data', for manifest-style verification by the module's reader.",
|
|
315
|
+
"minimum": 0
|
|
316
|
+
},
|
|
317
|
+
"data": {
|
|
318
|
+
"type": "object",
|
|
319
|
+
"description": "The module's portable payload, governed by the module's own public contract (referenced by 'id'+'version'). Opaque to this contract."
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"ModuleId": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"description": "A public module / extension identifier, e.g. 'atlas.diagramming' or a third-party reverse-DNS id.",
|
|
326
|
+
"minLength": 1,
|
|
327
|
+
"maxLength": 128,
|
|
328
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$"
|
|
329
|
+
},
|
|
330
|
+
"RestoreHints": {
|
|
331
|
+
"type": "object",
|
|
332
|
+
"description": "Non-data instructions for reconstructing the workspace at the destination. Placeholders and instructions only: identity is rebound to the destination IdP, and secrets are rebound at the destination — this section NEVER carries password/session material or secret values.",
|
|
333
|
+
"additionalProperties": false,
|
|
334
|
+
"properties": {
|
|
335
|
+
"identityMappings": {
|
|
336
|
+
"type": "array",
|
|
337
|
+
"description": "Placeholders mapping a source principal reference to a destination-binding hint. No credentials — the destination binds identities to its own IdP.",
|
|
338
|
+
"items": { "$ref": "#/$defs/IdentityMapping" },
|
|
339
|
+
"default": []
|
|
340
|
+
},
|
|
341
|
+
"secretRebinds": {
|
|
342
|
+
"type": "array",
|
|
343
|
+
"description": "Instructions for rebinding a secret at the destination, keyed by an opaque reference. No secret values.",
|
|
344
|
+
"items": { "$ref": "#/$defs/SecretRebind" },
|
|
345
|
+
"default": []
|
|
346
|
+
},
|
|
347
|
+
"notes": {
|
|
348
|
+
"type": ["string", "null"],
|
|
349
|
+
"description": "Free-text operator notes for the restore.",
|
|
350
|
+
"maxLength": 4096
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"IdentityMapping": {
|
|
355
|
+
"type": "object",
|
|
356
|
+
"description": "One identity-mapping placeholder. Carries references and hints, never credentials.",
|
|
357
|
+
"additionalProperties": false,
|
|
358
|
+
"required": ["sourceRef"],
|
|
359
|
+
"properties": {
|
|
360
|
+
"sourceRef": {
|
|
361
|
+
"type": "string",
|
|
362
|
+
"description": "An opaque reference to the source principal (e.g. a stable user key). Not an email, not a credential.",
|
|
363
|
+
"minLength": 1,
|
|
364
|
+
"maxLength": 256
|
|
365
|
+
},
|
|
366
|
+
"displayName": {
|
|
367
|
+
"type": ["string", "null"],
|
|
368
|
+
"description": "Optional display name to help an operator match the principal at the destination.",
|
|
369
|
+
"maxLength": 256
|
|
370
|
+
},
|
|
371
|
+
"bindHint": {
|
|
372
|
+
"type": ["string", "null"],
|
|
373
|
+
"description": "Optional hint for binding at the destination (e.g. 'match by corporate directory group X').",
|
|
374
|
+
"maxLength": 512
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"SecretRebind": {
|
|
379
|
+
"type": "object",
|
|
380
|
+
"description": "One secret-rebind instruction. Names WHAT must be re-provided at the destination, never the value.",
|
|
381
|
+
"additionalProperties": false,
|
|
382
|
+
"required": ["ref"],
|
|
383
|
+
"properties": {
|
|
384
|
+
"ref": {
|
|
385
|
+
"type": "string",
|
|
386
|
+
"description": "An opaque reference to the secret in the source (e.g. a key-vault path or logical name). Not the secret itself.",
|
|
387
|
+
"minLength": 1,
|
|
388
|
+
"maxLength": 256
|
|
389
|
+
},
|
|
390
|
+
"instruction": {
|
|
391
|
+
"type": ["string", "null"],
|
|
392
|
+
"description": "How to re-provide the secret at the destination.",
|
|
393
|
+
"maxLength": 1024
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
"ExcludedCategory": {
|
|
398
|
+
"type": "string",
|
|
399
|
+
"description": "A category of state that is deliberately NOT portable through the bundle.",
|
|
400
|
+
"enum": [
|
|
401
|
+
"secrets",
|
|
402
|
+
"live-credentials",
|
|
403
|
+
"entitlements",
|
|
404
|
+
"subscription",
|
|
405
|
+
"billing",
|
|
406
|
+
"audit-logs",
|
|
407
|
+
"telemetry"
|
|
408
|
+
]
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.vev.software/atlas/v1/common.schema.json",
|
|
4
|
+
"title": "Atlas contracts — common types (v1)",
|
|
5
|
+
"description": "Shared catalogue vocabulary for the Atlas asset model. Catalogue concepts only: no integration-criticality, EOL risk, portfolio scoring or AI review (those work with the data and live in the private Atlas core). See handbook 11 §1.",
|
|
6
|
+
"$defs": {
|
|
7
|
+
"AssetKind": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "The kind of asset held in the catalogue. The data-layer kinds (data-area, dataset, column) model the data architecture beneath a system, down to the column.",
|
|
10
|
+
"enum": ["system", "application", "server", "infrastructure", "data-area", "dataset", "column"]
|
|
11
|
+
},
|
|
12
|
+
"Lifecycle": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Catalogue lifecycle state. Held metadata, not analysis.",
|
|
15
|
+
"enum": ["draft", "active", "retired"]
|
|
16
|
+
},
|
|
17
|
+
"AssetId": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Stable, opaque identifier for an asset. Never reused, never re-meaning'd once published.",
|
|
20
|
+
"minLength": 1,
|
|
21
|
+
"maxLength": 128,
|
|
22
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
|
|
23
|
+
},
|
|
24
|
+
"Tag": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"description": "Manual, lightweight classification. A key with an optional value.",
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"required": ["key"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"key": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"minLength": 1,
|
|
33
|
+
"maxLength": 64,
|
|
34
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._/-]*$"
|
|
35
|
+
},
|
|
36
|
+
"value": {
|
|
37
|
+
"type": ["string", "null"],
|
|
38
|
+
"maxLength": 256
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"ExternalId": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"description": "An importer-supplied identifier from a source system, used to resolve references and to match on re-import. Opaque to Atlas; only unique within a single import bundle.",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"maxLength": 256
|
|
47
|
+
},
|
|
48
|
+
"Ref": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"description": "A reference to an asset within an import bundle — matching either an asset's 'id' or its 'externalId' present in the same bundle. Resolution is a bundle-level rule the conformance kit checks; JSON Schema only fixes the shape.",
|
|
51
|
+
"minLength": 1,
|
|
52
|
+
"maxLength": 256
|
|
53
|
+
},
|
|
54
|
+
"Generator": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"description": "Provenance for an export: what produced the document. Held metadata, not analysis.",
|
|
57
|
+
"additionalProperties": false,
|
|
58
|
+
"required": ["name"],
|
|
59
|
+
"properties": {
|
|
60
|
+
"name": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "The producing tool, e.g. 'Atlas Community'.",
|
|
63
|
+
"minLength": 1,
|
|
64
|
+
"maxLength": 128
|
|
65
|
+
},
|
|
66
|
+
"version": {
|
|
67
|
+
"type": ["string", "null"],
|
|
68
|
+
"description": "The producing tool's version, if known.",
|
|
69
|
+
"maxLength": 64
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"ApplicationDetails": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"description": "Held application metadata. Cataloguing only.",
|
|
76
|
+
"additionalProperties": false,
|
|
77
|
+
"properties": {
|
|
78
|
+
"version": { "type": ["string", "null"], "maxLength": 64 },
|
|
79
|
+
"vendor": { "type": ["string", "null"], "maxLength": 128 },
|
|
80
|
+
"businessOwner": { "type": ["string", "null"], "maxLength": 128 }
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"ServerDetails": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"description": "Held server metadata. OS is a recorded fact, not an EOL/risk assessment (that is paid Atlas core).",
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"properties": {
|
|
88
|
+
"hostname": { "type": ["string", "null"], "maxLength": 253 },
|
|
89
|
+
"environment": { "type": ["string", "null"], "maxLength": 64 },
|
|
90
|
+
"operatingSystem": { "type": ["string", "null"], "maxLength": 128 }
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"InfrastructureDetails": {
|
|
94
|
+
"type": "object",
|
|
95
|
+
"description": "Held infrastructure metadata. Cataloguing only.",
|
|
96
|
+
"additionalProperties": false,
|
|
97
|
+
"properties": {
|
|
98
|
+
"category": { "type": ["string", "null"], "maxLength": 64 },
|
|
99
|
+
"location": { "type": ["string", "null"], "maxLength": 128 }
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"DataAreaDetails": {
|
|
103
|
+
"type": "object",
|
|
104
|
+
"description": "Held metadata for a data area (dataområde) — a logical grouping of datasets inside one system. Cataloguing only; 'realisation' is free metadata (e.g. microservice, reference-catalogue, spreadsheet), not a locked vocabulary and not analysis.",
|
|
105
|
+
"additionalProperties": false,
|
|
106
|
+
"properties": {
|
|
107
|
+
"realisation": { "type": ["string", "null"], "maxLength": 128 }
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"DatasetDetails": {
|
|
111
|
+
"type": "object",
|
|
112
|
+
"description": "Held metadata for a dataset (datamodel) — one table / one dataset. Cataloguing only: physical name and ownership are recorded facts, never quality or classification verdicts (those work with the data and are paid Atlas core).",
|
|
113
|
+
"additionalProperties": false,
|
|
114
|
+
"properties": {
|
|
115
|
+
"physicalName": { "type": ["string", "null"], "maxLength": 256 },
|
|
116
|
+
"owner": { "type": ["string", "null"], "maxLength": 128 }
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"ColumnDetails": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"description": "Held metadata for a column (kolonne) — a concrete field on a dataset. The declared data type and nullability are recorded facts. NO analysis: no quality score, no classification verdict, no PII/sensitivity flag (those are paid Atlas core, handbook 11 §1).",
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"properties": {
|
|
124
|
+
"dataType": { "type": ["string", "null"], "maxLength": 128 },
|
|
125
|
+
"nullable": { "type": ["boolean", "null"] }
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|