com.cultureblocs.defs
Schema Diff
+48 -1
Compatibility Analysis
Breaking Changes Detected
3 breaking changes, 13 non-breaking changes.
Breaking Changes (3)
- 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#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 (13)
- 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#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" }
- 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 }
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#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" }
Additional Notes
- 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#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
- 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 }
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
30
"didRef": {
31
31
"type": "object",
32
32
"required": [
33
33
"did"
34
34
],
35
35
"properties": {
36
36
"did": {
37
37
"type": "string",
38
38
"format": "did"
39
39
},
40
40
"name": {
41
41
"type": "string",
42
42
"maxGraphemes": 300
43
43
}
44
44
},
45
45
"description": "A person or organisation by DID, with a descriptive fallback name."
46
46
},
47
47
"linkRef": {
48
48
"type": "object",
49
49
"required": [
50
50
"uri"
51
51
],
52
52
"properties": {
53
53
"uri": {
54
54
"type": "string",
55
55
"format": "uri"
56
56
},
57
57
"title": {
58
58
"type": "string",
59
59
"maxGraphemes": 300
60
60
}
61
61
},
62
62
"description": "External link attached to a bead or strand: event page, venue page, ticket listing."
63
63
},
64
64
"workRef": {
65
65
"type": "object",
66
66
"properties": {
67
67
"date": {
68
68
"type": "string",
69
69
"description": "Freeform creation date, e.g. '1972' or 'c. 1889'",
70
70
"maxGraphemes": 100
71
71
},
72
72
"image": {
73
73
"ref": "#mediaRef",
74
74
"type": "ref"
75
75
},
76
76
"title": {
77
77
"type": "string",
78
78
"maxGraphemes": 500
79
79
},
80
80
"creator": {
81
81
"type": "string",
82
82
"maxGraphemes": 300
83
83
},
84
84
"wikidata": {
85
85
"type": "string",
86
86
"description": "Wikidata QID, e.g. Q1892745"
87
87
},
88
88
"accession": {
89
89
"ref": "#accessionRef",
90
90
"type": "ref"
91
91
},
92
92
"linkedArt": {
93
93
"type": "string",
94
94
"format": "uri",
95
95
"description": "Linked Art object URI"
96
96
},
97
97
"creatorDid": {
98
98
"type": "string",
99
99
"format": "did",
100
100
"description": "DID of the creative who made this work, when known. The `creator` string remains the descriptive fallback."
101
101
}
102
102
},
103
103
"description": "Reference to an artwork/creative work. At least one resolvable ID or a descriptive fallback (title)."
104
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
+
},
105
130
"mediaRef": {
106
131
"type": "object",
107
132
"required": [
108
133
"uri"
109
134
],
110
135
"properties": {
111
136
"alt": {
112
137
"type": "string",
113
138
"maxGraphemes": 1000
114
139
},
115
140
"uri": {
116
141
"type": "string",
117
142
"format": "uri"
118
143
},
119
144
"mime": {
120
145
"type": "string",
121
146
"maxGraphemes": 100
147
+
},
148
+
"aspectRatio": {
149
+
"ref": "#aspectRatio",
150
+
"type": "ref"
122
151
}
123
152
},
124
-
"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."
125
154
},
126
155
"placeRef": {
127
156
"type": "object",
128
157
"properties": {
129
158
"did": {
130
159
"type": "string",
131
160
"format": "did",
132
161
"description": "Venue DID if it has an ATProto account"
133
162
},
134
163
"geo": {
135
164
"ref": "#geo",
136
165
"type": "ref"
137
166
},
138
167
"name": {
139
168
"type": "string",
140
169
"maxGraphemes": 300
141
170
}
142
171
},
143
172
"description": "A venue with an ATProto identity, or an ad-hoc named place."
144
173
},
145
174
"creditRef": {
146
175
"type": "object",
147
176
"required": [
148
177
"name"
149
178
],
150
179
"properties": {
151
180
"did": {
152
181
"type": "string",
153
182
"format": "did"
154
183
},
155
184
"name": {
156
185
"type": "string",
157
186
"maxGraphemes": 300
158
187
},
159
188
"role": {
160
189
"type": "string",
161
190
"maxGraphemes": 100
162
191
}
163
192
},
164
193
"description": "A named contributor. `role` is deliberately freeform: role vocabularies differ per industry and belong in referencing layers, not in this schema."
165
194
},
166
195
"strongRef": {
167
196
"type": "object",
168
197
"required": [
169
198
"uri"
170
199
],
171
200
"properties": {
172
201
"cid": {
173
202
"type": "string"
174
203
},
175
204
"uri": {
176
205
"type": "string",
177
206
"format": "uri"
178
207
}
179
208
},
180
209
"description": "Local stand-in for com.atproto.repo.strongRef"
181
210
},
182
211
"externalId": {
183
212
"type": "object",
184
213
"required": [
185
214
"scheme",
186
215
"id"
187
216
],
188
217
"properties": {
189
218
"id": {
190
219
"type": "string",
191
220
"maxGraphemes": 200
192
221
},
193
222
"uri": {
194
223
"type": "string",
195
224
"format": "uri",
196
225
"description": "Resolvable URL for this identifier, where one exists."
197
226
},
198
227
"scheme": {
199
228
"type": "string",
200
229
"knownValues": [
201
230
"isni",
202
231
"ipi",
203
232
"ipn",
204
233
"orcid",
205
234
"wikidata",
206
235
"musicbrainz",
207
236
"auracle",
208
237
"isrc",
209
238
"iswc",
210
239
"isan",
211
240
"doi",
212
241
"viaf",
213
242
"discogs",
214
243
"rsl"
215
244
],
216
245
"maxGraphemes": 64
217
246
}
218
247
},
219
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."
220
249
},
221
250
"provenance": {
222
251
"type": "object",
223
252
"required": [
224
253
"app",
225
254
"mintedAt"
226
255
],
227
256
"properties": {
228
257
"app": {
229
258
"type": "string",
230
259
"description": "Producing app id, e.g. 'culturebloc', 'ar-gallery'",
231
260
"maxGraphemes": 100
232
261
},
233
262
"device": {
234
263
"type": "string",
235
264
"description": "Device identifier, e.g. StickS3 id",
236
265
"maxGraphemes": 100
237
266
},
238
267
"mintId": {
239
268
"type": "string",
240
269
"description": "Device-generated mint identifier (hex). Shared between both parties' beads on a mutual mint — the encounter join key.",
241
270
"maxGraphemes": 64
242
271
},
243
272
"mintedAt": {
244
273
"type": "string",
245
274
"format": "datetime"
246
275
},
247
276
"mutualMint": {
248
277
"type": "boolean",
249
278
"description": "True if created by a mutual-press ceremony"
250
279
},
251
280
"timeAnchored": {
252
281
"type": "boolean",
253
282
"description": "False when the device knew only the time-of-day or nothing; createdAt is then a best guess"
254
283
}
255
284
}
256
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
+
},
257
304
"accessionRef": {
258
305
"type": "object",
259
306
"required": [
260
307
"institution",
261
308
"id"
262
309
],
263
310
"properties": {
264
311
"id": {
265
312
"type": "string",
266
313
"description": "Accession/inventory number",
267
314
"maxGraphemes": 200
268
315
},
269
316
"institution": {
270
317
"type": "string",
271
318
"format": "did",
272
319
"description": "DID of the holding institution"
273
320
}
274
321
}
275
322
}
276
323
},
277
324
"$type": "com.atproto.lexicon.schema",
278
325
"lexicon": 1
279
326
}