org.latha.gathering
Schema Diff
+17 -124
Compatibility Analysis
Breaking Changes Detected
29 breaking changes, 20 non-breaking changes.
Breaking Changes (29)
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#cancelled" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#hybrid" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#inperson" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.address" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.country" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.locality" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.name" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.postalCode" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#location.region" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#mode" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#planned" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#postponed" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#rescheduled" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#scheduled" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#status" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#uri" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#uri.name" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#uri.uri" }
- RemovedVertex RemovedVertex { vertex_id: "org.latha.gathering#virtual" }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.address", kind: "prop", name: Some("address") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.country", kind: "prop", name: Some("country") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.locality", kind: "prop", name: Some("locality") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.name", kind: "prop", name: Some("name") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.postalCode", kind: "prop", name: Some("postalCode") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.region", kind: "prop", name: Some("region") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#uri", tgt: "org.latha.gathering#uri.name", kind: "prop", name: Some("name") }
- RemovedEdge RemovedEdge { src: "org.latha.gathering#uri", tgt: "org.latha.gathering#uri.uri", kind: "prop", name: Some("uri") }
- KindChanged KindChanged { vertex_id: "org.latha.gathering:body.locations:items", old_kind: "ref", new_kind: "union" }
Non-Breaking Changes (20)
- AddedVertex AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant2" }
- AddedVertex AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant3" }
- AddedEdge AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant0", kind: "variant", name: Some("community.lexicon.location.address") }
- AddedEdge AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant1", kind: "variant", name: Some("community.lexicon.location.geo") }
- AddedEdge AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant2", kind: "variant", name: Some("community.lexicon.location.fsq") }
- AddedEdge AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant3", kind: "variant", name: Some("community.lexicon.location.hthree") }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.postalCode", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.country", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.address", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.address", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.region", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.region", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.name", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.name", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#uri.name", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#uri.name", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.locality", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.locality", sort: "maxGraphemes" }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "org.latha.gathering#cancelled" }RemovedVertex { vertex_id: "org.latha.gathering#hybrid" }RemovedVertex { vertex_id: "org.latha.gathering#inperson" }RemovedVertex { vertex_id: "org.latha.gathering#location" }RemovedVertex { vertex_id: "org.latha.gathering#location.address" }RemovedVertex { vertex_id: "org.latha.gathering#location.country" }RemovedVertex { vertex_id: "org.latha.gathering#location.locality" }RemovedVertex { vertex_id: "org.latha.gathering#location.name" }RemovedVertex { vertex_id: "org.latha.gathering#location.postalCode" }RemovedVertex { vertex_id: "org.latha.gathering#location.region" }RemovedVertex { vertex_id: "org.latha.gathering#mode" }RemovedVertex { vertex_id: "org.latha.gathering#planned" }RemovedVertex { vertex_id: "org.latha.gathering#postponed" }RemovedVertex { vertex_id: "org.latha.gathering#rescheduled" }RemovedVertex { vertex_id: "org.latha.gathering#scheduled" }RemovedVertex { vertex_id: "org.latha.gathering#status" }RemovedVertex { vertex_id: "org.latha.gathering#uri" }RemovedVertex { vertex_id: "org.latha.gathering#uri.name" }RemovedVertex { vertex_id: "org.latha.gathering#uri.uri" }RemovedVertex { vertex_id: "org.latha.gathering#virtual" }
Added Elements
AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant0" }AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant1" }AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant2" }AddedVertex { vertex_id: "org.latha.gathering:body.locations:items:variant3" }
Constraint Changes
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.region", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.region", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.postalCode", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.name", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.name", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.locality", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.locality", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.country", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.address", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#location.address", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#uri.name", sort: "maxGraphemes" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "org.latha.gathering#uri.name", sort: "maxLength" }
Additional Notes
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.address", kind: "prop", name: Some("address") }
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.country", kind: "prop", name: Some("country") }
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.locality", kind: "prop", name: Some("locality") }
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.name", kind: "prop", name: Some("name") }
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.postalCode", kind: "prop", name: Some("postalCode") }
- Breaking: RemovedEdge { src: "org.latha.gathering#location", tgt: "org.latha.gathering#location.region", kind: "prop", name: Some("region") }
- Breaking: RemovedEdge { src: "org.latha.gathering#uri", tgt: "org.latha.gathering#uri.name", kind: "prop", name: Some("name") }
- Breaking: RemovedEdge { src: "org.latha.gathering#uri", tgt: "org.latha.gathering#uri.uri", kind: "prop", name: Some("uri") }
- Breaking: KindChanged { vertex_id: "org.latha.gathering:body.locations:items", old_kind: "ref", new_kind: "union" }
- Non-breaking: AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant0", kind: "variant", name: Some("community.lexicon.location.address") }
- Non-breaking: AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant1", kind: "variant", name: Some("community.lexicon.location.geo") }
- Non-breaking: AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant2", kind: "variant", name: Some("community.lexicon.location.fsq") }
- Non-breaking: AddedEdge { src: "org.latha.gathering:body.locations:items", tgt: "org.latha.gathering:body.locations:items:variant3", kind: "variant", name: Some("community.lexicon.location.hthree") }
1
1
{
2
2
"id": "org.latha.gathering",
3
3
"defs": {
4
-
"uri": {
5
-
"type": "object",
6
-
"required": [
7
-
"uri"
8
-
],
9
-
"properties": {
10
-
"uri": {
11
-
"type": "string",
12
-
"format": "uri",
13
-
"description": "The URI."
14
-
},
15
-
"name": {
16
-
"type": "string",
17
-
"maxLength": 500,
18
-
"description": "Label for the URI.",
19
-
"maxGraphemes": 50
20
-
}
21
-
},
22
-
"description": "A named link."
23
-
},
24
4
"host": {
25
5
"type": "token",
26
6
"description": "Host of the gathering."
27
7
},
28
8
"main": {
29
9
"key": "tid",
30
10
"type": "record",
31
11
"record": {
32
12
"type": "object",
33
13
"required": [
34
14
"name",
35
15
"createdAt"
36
16
],
37
17
"properties": {
38
18
"host": {
39
19
"ref": "org.latha.gathering#actorRef",
40
20
"type": "ref",
41
21
"description": "The primary host or organizing identity."
42
22
},
43
23
"mode": {
44
-
"ref": "org.latha.gathering#mode",
24
+
"ref": "community.lexicon.calendar.event#mode",
45
25
"type": "ref",
46
-
"description": "The attendance mode of the gathering."
26
+
"description": "The attendance mode of the gathering. Reuses community.lexicon.calendar.event#mode."
47
27
},
48
28
"name": {
49
29
"type": "string",
50
30
"maxLength": 2000,
51
31
"description": "Name of the gathering.",
52
32
"maxGraphemes": 200
53
33
},
54
34
"uris": {
55
35
"type": "array",
56
36
"items": {
57
-
"ref": "org.latha.gathering#uri",
37
+
"ref": "community.lexicon.calendar.event#uri",
58
38
"type": "ref"
59
39
},
60
-
"description": "Platform links (OpenMeet, Meetup.com, etc.)."
40
+
"description": "Platform links (OpenMeet, Meetup.com, etc.). Reuses community.lexicon.calendar.event#uri."
61
41
},
62
42
"endsAt": {
63
43
"type": "string",
64
44
"format": "datetime",
65
45
"description": "Client-declared timestamp when the gathering ends."
66
46
},
67
47
"format": {
68
48
"type": "string",
69
49
"maxLength": 1000,
70
50
"description": "Gathering format (e.g., unconference, workshop, hackathon, panel).",
71
51
"maxGraphemes": 100
72
52
},
73
53
"status": {
74
-
"ref": "org.latha.gathering#status",
54
+
"ref": "community.lexicon.calendar.event#status",
75
55
"type": "ref",
76
-
"description": "The status of the gathering."
56
+
"description": "The status of the gathering. Reuses community.lexicon.calendar.event#status."
77
57
},
78
58
"sections": {
79
59
"type": "array",
80
60
"items": {
81
61
"refs": [
82
62
"org.latha.gathering#thematicCluster"
83
63
],
84
64
"type": "union",
85
65
"closed": false
86
66
},
87
67
"description": "Modular sections for grouping and analyzing the gathering. Each entry must specify a $type. Built-in: thematicCluster. Other lexicons may add more."
88
68
},
89
69
"startsAt": {
90
70
"type": "string",
91
71
"format": "datetime",
92
72
"description": "Client-declared timestamp when the gathering starts."
93
73
},
94
74
"attendees": {
95
75
"type": "array",
96
76
"items": {
97
77
"ref": "org.latha.gathering#attendee",
98
78
"type": "ref"
99
79
},
100
80
"description": "People who attended the gathering, with roles and metadata."
101
81
},
102
82
"createdAt": {
103
83
"type": "string",
104
84
"format": "datetime",
105
85
"description": "Client-declared timestamp when this record was created."
106
86
},
107
87
"locations": {
108
88
"type": "array",
109
89
"items": {
110
-
"ref": "org.latha.gathering#location",
111
-
"type": "ref"
90
+
"refs": [
91
+
"community.lexicon.location.address",
92
+
"community.lexicon.location.geo",
93
+
"community.lexicon.location.fsq",
94
+
"community.lexicon.location.hthree"
95
+
],
96
+
"type": "union"
112
97
},
113
-
"description": "Where the gathering takes place."
98
+
"description": "Where the gathering takes place. Reuses community.lexicon.location union (address, geo, fsq, hthree)."
114
99
},
115
100
"description": {
116
101
"type": "string",
117
102
"maxLength": 20000,
118
103
"description": "Brief description of the gathering.",
119
104
"maxGraphemes": 2000
120
105
}
121
106
}
122
107
},
123
108
"description": "A community gathering or meetup with structured attendee data and extensible thematic sections."
124
-
},
125
-
"mode": {
126
-
"type": "string",
127
-
"description": "Attendance mode of the gathering.",
128
-
"knownValues": [
129
-
"org.latha.gathering#inperson",
130
-
"org.latha.gathering#hybrid",
131
-
"org.latha.gathering#virtual"
132
-
]
133
109
},
134
110
"role": {
135
111
"type": "string",
136
-
"description": "Role of an attendee in the gathering.",
112
+
"description": "Role of an attendee in the gathering. No existing lexicon defines attendee roles; community.lexicon.calendar.rsvp only has going/interested/notgoing.",
137
113
"knownValues": [
138
114
"org.latha.gathering#host",
139
115
"org.latha.gathering#organizer",
140
116
"org.latha.gathering#participant",
141
117
"org.latha.gathering#speaker",
142
118
"org.latha.gathering#volunteer"
143
119
]
144
120
},
145
-
"hybrid": {
146
-
"type": "token",
147
-
"description": "Hybrid (in-person and virtual) gathering."
148
-
},
149
-
"status": {
150
-
"type": "string",
151
-
"description": "Status of the gathering.",
152
-
"knownValues": [
153
-
"org.latha.gathering#planned",
154
-
"org.latha.gathering#scheduled",
155
-
"org.latha.gathering#rescheduled",
156
-
"org.latha.gathering#postponed",
157
-
"org.latha.gathering#cancelled"
158
-
]
159
-
},
160
-
"planned": {
161
-
"type": "token",
162
-
"description": "Gathering is planned."
163
-
},
164
121
"speaker": {
165
122
"type": "token",
166
123
"description": "Speaker at the gathering."
167
124
},
168
-
"virtual": {
169
-
"type": "token",
170
-
"description": "Virtual gathering."
171
-
},
172
125
"actorRef": {
173
126
"type": "object",
174
127
"required": [
175
128
"did"
176
129
],
177
130
"properties": {
178
131
"did": {
179
132
"type": "string",
180
133
"format": "did",
181
134
"description": "ATProto DID."
182
135
},
183
136
"handle": {
184
137
"type": "string",
185
138
"description": "Current ATProto handle."
186
139
}
187
140
},
188
141
"description": "A lightweight reference to an ATProto identity."
189
142
},
190
143
"attendee": {
191
144
"type": "object",
192
145
"required": [
193
146
"did"
194
147
],
195
148
"properties": {
196
149
"bio": {
197
150
"type": "string",
198
151
"maxLength": 5000,
199
152
"description": "Short bio or tagline.",
200
153
"maxGraphemes": 500
201
154
},
202
155
"did": {
203
156
"type": "string",
204
157
"format": "did",
205
158
"description": "ATProto DID."
206
159
},
207
160
"role": {
208
161
"ref": "org.latha.gathering#role",
209
162
"type": "ref",
210
163
"description": "Role in the gathering: host, organizer, participant, speaker, volunteer."
211
164
},
212
165
"tags": {
213
166
"type": "array",
214
167
"items": {
215
168
"type": "string",
216
169
"maxLength": 640
217
170
},
218
171
"description": "Interest tags (a11y, privacy, transit, category-theory, etc.)."
219
172
},
220
173
"notes": {
221
174
"type": "string",
222
175
"maxLength": 10000,
223
176
"description": "Researcher notes about this attendee.",
224
177
"maxGraphemes": 1000
225
178
},
226
179
"handle": {
227
180
"type": "string",
228
181
"description": "ATProto handle."
229
182
},
230
183
"projects": {
231
184
"type": "array",
232
185
"items": {
233
186
"ref": "org.latha.gathering#projectRef",
234
187
"type": "ref"
235
188
},
236
189
"description": "Projects this person builds or maintains."
237
190
},
238
191
"displayName": {
239
192
"type": "string",
240
193
"maxLength": 1000,
241
194
"description": "Display name.",
242
195
"maxGraphemes": 100
243
196
}
244
197
},
245
-
"description": "A rich attendee record with role, projects, and metadata. Extends community.lexicon.calendar.rsvp with role, bio, projects, and tags."
246
-
},
247
-
"inperson": {
248
-
"type": "token",
249
-
"description": "In-person gathering."
250
-
},
251
-
"location": {
252
-
"type": "object",
253
-
"properties": {
254
-
"name": {
255
-
"type": "string",
256
-
"maxLength": 1000,
257
-
"description": "Venue name.",
258
-
"maxGraphemes": 100
259
-
},
260
-
"region": {
261
-
"type": "string",
262
-
"maxLength": 500,
263
-
"description": "State or province.",
264
-
"maxGraphemes": 50
265
-
},
266
-
"address": {
267
-
"type": "string",
268
-
"maxLength": 2000,
269
-
"description": "Street address.",
270
-
"maxGraphemes": 200
271
-
},
272
-
"country": {
273
-
"type": "string",
274
-
"maxLength": 2,
275
-
"description": "ISO 3166-1 alpha-2 country code."
276
-
},
277
-
"locality": {
278
-
"type": "string",
279
-
"maxLength": 500,
280
-
"description": "City or locality.",
281
-
"maxGraphemes": 50
282
-
},
283
-
"postalCode": {
284
-
"type": "string",
285
-
"maxLength": 20,
286
-
"description": "Postal code."
287
-
}
288
-
},
289
-
"description": "A physical location."
198
+
"description": "A rich attendee record extending community.lexicon.calendar.rsvp with role, bio, projects, and tags. While rsvp is a separate record linking a subject to a status, attendee embeds identity and metadata directly."
290
199
},
291
-
"cancelled": {
292
-
"type": "token",
293
-
"description": "Gathering has been cancelled."
294
-
},
295
200
"organizer": {
296
201
"type": "token",
297
202
"description": "Organizer of the gathering."
298
203
},
299
-
"postponed": {
300
-
"type": "token",
301
-
"description": "Gathering has been postponed."
302
-
},
303
-
"scheduled": {
304
-
"type": "token",
305
-
"description": "Gathering is scheduled."
306
-
},
307
204
"volunteer": {
308
205
"type": "token",
309
206
"description": "Volunteer at the gathering."
310
207
},
311
208
"projectRef": {
312
209
"type": "object",
313
210
"required": [
314
211
"name"
315
212
],
316
213
"properties": {
317
214
"uri": {
318
215
"type": "string",
319
216
"format": "uri",
320
217
"description": "Link to the project."
321
218
},
322
219
"name": {
323
220
"type": "string",
324
221
"maxLength": 1000,
325
222
"description": "Project name.",
326
223
"maxGraphemes": 100
327
224
}
328
225
},
329
226
"description": "A reference to a project or tool."
330
227
},
331
228
"participant": {
332
229
"type": "token",
333
230
"description": "Participant in the gathering."
334
-
},
335
-
"rescheduled": {
336
-
"type": "token",
337
-
"description": "Gathering has been rescheduled."
338
231
},
339
232
"thematicCluster": {
340
233
"type": "object",
341
234
"required": [
342
235
"name"
343
236
],
344
237
"properties": {
345
238
"name": {
346
239
"type": "string",
347
240
"maxLength": 1000,
348
241
"description": "Cluster name (e.g., Organizer Core, Protocol Infrastructure, Technologist-Philosophers).",
349
242
"maxGraphemes": 100
350
243
},
351
244
"members": {
352
245
"type": "array",
353
246
"items": {
354
247
"ref": "org.latha.gathering#actorRef",
355
248
"type": "ref"
356
249
},
357
250
"description": "People in this cluster."
358
251
},
359
252
"description": {
360
253
"type": "string",
361
254
"maxLength": 10000,
362
255
"description": "What brings this group together or what they provide.",
363
256
"maxGraphemes": 1000
364
257
}
365
258
},
366
259
"description": "A group of attendees united by a shared theme, practice, or infrastructure role. Each cluster names a social or technical layer present at the gathering."
367
260
}
368
261
},
369
262
"$type": "com.atproto.lexicon.schema",
370
263
"lexicon": 1,
371
-
"description": "A community gathering or meetup record with attendees and extensible thematic sections. Covers event metadata, rich attendee data, and modular grouping of people by theme or infrastructure role. Schema: https://gathering.latha.org/#at://did:plc:ngokl2gnmpbvuvrfckja3g7p/org.latha.gathering/3mkdvt6ljja2e"
264
+
"description": "A community gathering or meetup with structured attendee data and extensible thematic sections. Reuses community.lexicon.calendar.event for mode/status/uris and community.lexicon.location for locations. Adds rich attendee records (role, bio, projects, tags) and thematic clustering."
372
265
}