com.cultureblocs.defs
Schema Diff
+130 -1
Compatibility Analysis
Breaking Changes Detected
7 breaking changes, 30 non-breaking changes.
Breaking Changes (7)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#creditRef", src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.name", kind: "prop", name: Some("name") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#didRef", src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.did", kind: "prop", name: Some("did") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.scheme", kind: "prop", name: Some("scheme") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.id", kind: "prop", name: Some("id") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.width", kind: "prop", name: Some("width") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.height", kind: "prop", name: Some("height") }
Non-Breaking Changes (30)
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.height" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.width" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.did" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.name" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.role" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.did" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.name" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.id" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.scheme" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.uri" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.alt" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.aspectRatio" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.image" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#mediaRef.aspectRatio" }
- AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#workRef.creatorDid" }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.did", kind: "prop", name: Some("did") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.role", kind: "prop", name: Some("role") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.name", kind: "prop", name: Some("name") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.uri", kind: "prop", name: Some("uri") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.alt", kind: "prop", name: Some("alt") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#mediaRef", tgt: "com.cultureblocs.defs#mediaRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#mediaRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "com.cultureblocs.defs#workRef", tgt: "com.cultureblocs.defs#workRef.creatorDid", kind: "prop", name: Some("creatorDid") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio" }AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.height" }AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.width" }AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef" }AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.did" }AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.name" }AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.role" }AddedVertex { vertex_id: "com.cultureblocs.defs#didRef" }AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.did" }AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.name" }AddedVertex { vertex_id: "com.cultureblocs.defs#externalId" }AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.id" }AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.scheme" }AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.uri" }AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef" }AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.alt" }AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.aspectRatio" }AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.image" }AddedVertex { vertex_id: "com.cultureblocs.defs#mediaRef.aspectRatio" }AddedVertex { vertex_id: "com.cultureblocs.defs#workRef.creatorDid" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#creditRef", src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.name", kind: "prop", name: Some("name") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.width", kind: "prop", name: Some("width") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.height", kind: "prop", name: Some("height") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.scheme", kind: "prop", name: Some("scheme") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.id", kind: "prop", name: Some("id") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#didRef", src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.did", kind: "prop", name: Some("did") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.did", kind: "prop", name: Some("did") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.role", kind: "prop", name: Some("role") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.name", kind: "prop", name: Some("name") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.uri", kind: "prop", name: Some("uri") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.alt", kind: "prop", name: Some("alt") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#mediaRef", tgt: "com.cultureblocs.defs#mediaRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#mediaRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "com.cultureblocs.defs#workRef", tgt: "com.cultureblocs.defs#workRef.creatorDid", kind: "prop", name: Some("creatorDid") }
1
1
{
2
2
"id": "com.cultureblocs.defs",
3
3
"defs": {
4
4
"geo": {
5
5
"type": "object",
6
6
"required": [
7
7
"lat",
8
8
"lng",
9
9
"precision"
10
10
],
11
11
"properties": {
12
12
"lat": {
13
13
"type": "number"
14
14
},
15
15
"lng": {
16
16
"type": "number"
17
17
},
18
18
"precision": {
19
19
"type": "string",
20
20
"description": "Declared coordinate fuzzing level. Coordinates MUST already be fuzzed to this precision before the record leaves Tier 0.",
21
21
"knownValues": [
22
22
"exact",
23
23
"100m",
24
24
"1km",
25
25
"city"
26
26
]
27
27
}
28
28
}
29
29
},
30
+
"didRef": {
31
+
"type": "object",
32
+
"required": [
33
+
"did"
34
+
],
35
+
"properties": {
36
+
"did": {
37
+
"type": "string",
38
+
"format": "did"
39
+
},
40
+
"name": {
41
+
"type": "string",
42
+
"maxGraphemes": 300
43
+
}
44
+
},
45
+
"description": "A person or organisation by DID, with a descriptive fallback name."
46
+
},
30
47
"linkRef": {
31
48
"type": "object",
32
49
"required": [
33
50
"uri"
34
51
],
35
52
"properties": {
36
53
"uri": {
37
54
"type": "string",
38
55
"format": "uri"
39
56
},
40
57
"title": {
41
58
"type": "string",
42
59
"maxGraphemes": 300
43
60
}
44
61
},
45
62
"description": "External link attached to a bead or strand: event page, venue page, ticket listing."
46
63
},
47
64
"workRef": {
48
65
"type": "object",
49
66
"properties": {
50
67
"date": {
51
68
"type": "string",
52
69
"description": "Freeform creation date, e.g. '1972' or 'c. 1889'",
53
70
"maxGraphemes": 100
54
71
},
55
72
"image": {
56
73
"ref": "#mediaRef",
57
74
"type": "ref"
58
75
},
59
76
"title": {
60
77
"type": "string",
61
78
"maxGraphemes": 500
62
79
},
63
80
"creator": {
64
81
"type": "string",
65
82
"maxGraphemes": 300
66
83
},
67
84
"wikidata": {
68
85
"type": "string",
69
86
"description": "Wikidata QID, e.g. Q1892745"
70
87
},
71
88
"accession": {
72
89
"ref": "#accessionRef",
73
90
"type": "ref"
74
91
},
75
92
"linkedArt": {
76
93
"type": "string",
77
94
"format": "uri",
78
95
"description": "Linked Art object URI"
96
+
},
97
+
"creatorDid": {
98
+
"type": "string",
99
+
"format": "did",
100
+
"description": "DID of the creative who made this work, when known. The `creator` string remains the descriptive fallback."
79
101
}
80
102
},
81
103
"description": "Reference to an artwork/creative work. At least one resolvable ID or a descriptive fallback (title)."
82
104
},
105
+
"imageRef": {
106
+
"type": "object",
107
+
"required": [
108
+
"image"
109
+
],
110
+
"properties": {
111
+
"alt": {
112
+
"type": "string",
113
+
"description": "What the image shows. Absent means absent — readers must not substitute a title.",
114
+
"maxGraphemes": 2000
115
+
},
116
+
"image": {
117
+
"type": "blob",
118
+
"accept": [
119
+
"image/*"
120
+
],
121
+
"maxSize": 2000000
122
+
},
123
+
"aspectRatio": {
124
+
"ref": "#aspectRatio",
125
+
"type": "ref"
126
+
}
127
+
},
128
+
"description": "A published image and the two things a reader needs to present it honestly: what it shows, and how much room it takes. Field names match app.bsky.embed.images#image and the community standalone-image proposal, so this can become a ref to a shared lexicon without changing the published payload."
129
+
},
83
130
"mediaRef": {
84
131
"type": "object",
85
132
"required": [
86
133
"uri"
87
134
],
88
135
"properties": {
89
136
"alt": {
90
137
"type": "string",
91
138
"maxGraphemes": 1000
92
139
},
93
140
"uri": {
94
141
"type": "string",
95
142
"format": "uri"
96
143
},
97
144
"mime": {
98
145
"type": "string",
99
146
"maxGraphemes": 100
147
+
},
148
+
"aspectRatio": {
149
+
"ref": "#aspectRatio",
150
+
"type": "ref"
100
151
}
101
152
},
102
-
"description": "Tier 0/1 media reference. Replaced by an atproto blob at promotion time."
153
+
"description": "Tier 0/1 media reference. Replaced by an imageRef at promotion time; alt text and aspectRatio carry across unchanged."
103
154
},
104
155
"placeRef": {
105
156
"type": "object",
106
157
"properties": {
107
158
"did": {
108
159
"type": "string",
109
160
"format": "did",
110
161
"description": "Venue DID if it has an ATProto account"
111
162
},
112
163
"geo": {
113
164
"ref": "#geo",
114
165
"type": "ref"
115
166
},
116
167
"name": {
117
168
"type": "string",
118
169
"maxGraphemes": 300
119
170
}
120
171
},
121
172
"description": "A venue with an ATProto identity, or an ad-hoc named place."
122
173
},
174
+
"creditRef": {
175
+
"type": "object",
176
+
"required": [
177
+
"name"
178
+
],
179
+
"properties": {
180
+
"did": {
181
+
"type": "string",
182
+
"format": "did"
183
+
},
184
+
"name": {
185
+
"type": "string",
186
+
"maxGraphemes": 300
187
+
},
188
+
"role": {
189
+
"type": "string",
190
+
"maxGraphemes": 100
191
+
}
192
+
},
193
+
"description": "A named contributor. `role` is deliberately freeform: role vocabularies differ per industry and belong in referencing layers, not in this schema."
194
+
},
123
195
"strongRef": {
124
196
"type": "object",
125
197
"required": [
126
198
"uri"
127
199
],
128
200
"properties": {
129
201
"cid": {
130
202
"type": "string"
131
203
},
132
204
"uri": {
133
205
"type": "string",
134
206
"format": "uri"
135
207
}
136
208
},
137
209
"description": "Local stand-in for com.atproto.repo.strongRef"
138
210
},
211
+
"externalId": {
212
+
"type": "object",
213
+
"required": [
214
+
"scheme",
215
+
"id"
216
+
],
217
+
"properties": {
218
+
"id": {
219
+
"type": "string",
220
+
"maxGraphemes": 200
221
+
},
222
+
"uri": {
223
+
"type": "string",
224
+
"format": "uri",
225
+
"description": "Resolvable URL for this identifier, where one exists."
226
+
},
227
+
"scheme": {
228
+
"type": "string",
229
+
"knownValues": [
230
+
"isni",
231
+
"ipi",
232
+
"ipn",
233
+
"orcid",
234
+
"wikidata",
235
+
"musicbrainz",
236
+
"auracle",
237
+
"isrc",
238
+
"iswc",
239
+
"isan",
240
+
"doi",
241
+
"viaf",
242
+
"discogs",
243
+
"rsl"
244
+
],
245
+
"maxGraphemes": 64
246
+
}
247
+
},
248
+
"description": "An identifier for this subject in another system. Registries are peers: no scheme is privileged, and knownValues is advisory so new schemes need no schema change."
249
+
},
139
250
"provenance": {
140
251
"type": "object",
141
252
"required": [
142
253
"app",
143
254
"mintedAt"
144
255
],
145
256
"properties": {
146
257
"app": {
147
258
"type": "string",
148
259
"description": "Producing app id, e.g. 'culturebloc', 'ar-gallery'",
149
260
"maxGraphemes": 100
150
261
},
151
262
"device": {
152
263
"type": "string",
153
264
"description": "Device identifier, e.g. StickS3 id",
154
265
"maxGraphemes": 100
155
266
},
156
267
"mintId": {
157
268
"type": "string",
158
269
"description": "Device-generated mint identifier (hex). Shared between both parties' beads on a mutual mint — the encounter join key.",
159
270
"maxGraphemes": 64
160
271
},
161
272
"mintedAt": {
162
273
"type": "string",
163
274
"format": "datetime"
164
275
},
165
276
"mutualMint": {
166
277
"type": "boolean",
167
278
"description": "True if created by a mutual-press ceremony"
168
279
},
169
280
"timeAnchored": {
170
281
"type": "boolean",
171
282
"description": "False when the device knew only the time-of-day or nothing; createdAt is then a best guess"
172
283
}
173
284
}
174
285
},
286
+
"aspectRatio": {
287
+
"type": "object",
288
+
"required": [
289
+
"width",
290
+
"height"
291
+
],
292
+
"properties": {
293
+
"width": {
294
+
"type": "integer",
295
+
"minimum": 1
296
+
},
297
+
"height": {
298
+
"type": "integer",
299
+
"minimum": 1
300
+
}
301
+
},
302
+
"description": "Pixel dimensions, so a reader can reserve layout space before the image bytes arrive. Shape matches app.bsky.embed.images#aspectRatio."
303
+
},
175
304
"accessionRef": {
176
305
"type": "object",
177
306
"required": [
178
307
"institution",
179
308
"id"
180
309
],
181
310
"properties": {
182
311
"id": {
183
312
"type": "string",
184
313
"description": "Accession/inventory number",
185
314
"maxGraphemes": 200
186
315
},
187
316
"institution": {
188
317
"type": "string",
189
318
"format": "did",
190
319
"description": "DID of the holding institution"
191
320
}
192
321
}
193
322
}
194
323
},
195
324
"$type": "com.atproto.lexicon.schema",
196
325
"lexicon": 1
197
326
}