org.passingreads.book.event
Schema Diff
+99 -5
Compatibility Analysis
Breaking Changes Detected
5 breaking changes, 55 non-breaking changes.
Breaking Changes (5)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#giftAcceptance", src: "org.passingreads.book.event#giftAcceptance", tgt: "org.passingreads.book.event#giftAcceptance.gift", kind: "prop", name: Some("gift") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#checkin", src: "org.passingreads.book.event#checkin", tgt: "org.passingreads.book.event#checkin.location", kind: "prop", name: Some("location") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#gift", src: "org.passingreads.book.event#gift", tgt: "org.passingreads.book.event#gift.recipient", kind: "prop", name: Some("recipient") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#drop", src: "org.passingreads.book.event#drop", tgt: "org.passingreads.book.event#drop.location", kind: "prop", name: Some("location") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "org.passingreads.book.event:body", src: "org.passingreads.book.event:body", tgt: "org.passingreads.book.event:body.location", kind: "prop", name: Some("location") }
Non-Breaking Changes (55)
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#checkin" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#drop" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#drop.location" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#drop.location:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#drop.location:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#find" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#find.location" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#find.location:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#find.location:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#gift" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#gift.location" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#gift.location:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#gift.location:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#gift.recipient" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#giftAcceptance" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event#giftAcceptance.gift" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant2" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant3" }
- AddedVertex AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant4" }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#checkin.location", tgt: "org.passingreads.book.event#checkin.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#checkin.location", tgt: "org.passingreads.book.event#checkin.location:variant1", kind: "variant", name: Some("#osmLocation") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#checkin.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#checkin.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#drop.location", tgt: "org.passingreads.book.event#drop.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#drop.location", tgt: "org.passingreads.book.event#drop.location:variant1", kind: "variant", name: Some("#osmLocation") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#drop.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#drop.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#find", tgt: "org.passingreads.book.event#find.location", kind: "prop", name: Some("location") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#find.location", tgt: "org.passingreads.book.event#find.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#find.location", tgt: "org.passingreads.book.event#find.location:variant1", kind: "variant", name: Some("#osmLocation") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#find.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#find.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#gift", tgt: "org.passingreads.book.event#gift.location", kind: "prop", name: Some("location") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#gift.location", tgt: "org.passingreads.book.event#gift.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#gift.location", tgt: "org.passingreads.book.event#gift.location:variant1", kind: "variant", name: Some("#osmLocation") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#gift.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#gift.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event#giftAcceptance.gift", tgt: "com.atproto.repo.strongRef#main", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body", tgt: "org.passingreads.book.event:body.details", kind: "prop", name: Some("details") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant0", kind: "variant", name: Some("#drop") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant1", kind: "variant", name: Some("#find") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant2", kind: "variant", name: Some("#checkin") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant3", kind: "variant", name: Some("#gift") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant4", kind: "variant", name: Some("#giftAcceptance") }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details:variant0", tgt: "org.passingreads.book.event#drop", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details:variant1", tgt: "org.passingreads.book.event#find", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details:variant2", tgt: "org.passingreads.book.event#checkin", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details:variant3", tgt: "org.passingreads.book.event#gift", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.passingreads.book.event:body.details:variant4", tgt: "org.passingreads.book.event#giftAcceptance", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "org.passingreads.book.event#checkin" }AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location" }AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location:variant0" }AddedVertex { vertex_id: "org.passingreads.book.event#checkin.location:variant1" }AddedVertex { vertex_id: "org.passingreads.book.event#drop" }AddedVertex { vertex_id: "org.passingreads.book.event#drop.location" }AddedVertex { vertex_id: "org.passingreads.book.event#drop.location:variant0" }AddedVertex { vertex_id: "org.passingreads.book.event#drop.location:variant1" }AddedVertex { vertex_id: "org.passingreads.book.event#find" }AddedVertex { vertex_id: "org.passingreads.book.event#find.location" }AddedVertex { vertex_id: "org.passingreads.book.event#find.location:variant0" }AddedVertex { vertex_id: "org.passingreads.book.event#find.location:variant1" }AddedVertex { vertex_id: "org.passingreads.book.event#gift" }AddedVertex { vertex_id: "org.passingreads.book.event#gift.location" }AddedVertex { vertex_id: "org.passingreads.book.event#gift.location:variant0" }AddedVertex { vertex_id: "org.passingreads.book.event#gift.location:variant1" }AddedVertex { vertex_id: "org.passingreads.book.event#gift.recipient" }AddedVertex { vertex_id: "org.passingreads.book.event#giftAcceptance" }AddedVertex { vertex_id: "org.passingreads.book.event#giftAcceptance.gift" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant0" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant1" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant2" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant3" }AddedVertex { vertex_id: "org.passingreads.book.event:body.details:variant4" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#giftAcceptance", src: "org.passingreads.book.event#giftAcceptance", tgt: "org.passingreads.book.event#giftAcceptance.gift", kind: "prop", name: Some("gift") }
- Breaking: RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#checkin", src: "org.passingreads.book.event#checkin", tgt: "org.passingreads.book.event#checkin.location", kind: "prop", name: Some("location") }
- Breaking: RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#gift", src: "org.passingreads.book.event#gift", tgt: "org.passingreads.book.event#gift.recipient", kind: "prop", name: Some("recipient") }
- Breaking: RequiredEdgeAdded { vertex_id: "org.passingreads.book.event#drop", src: "org.passingreads.book.event#drop", tgt: "org.passingreads.book.event#drop.location", kind: "prop", name: Some("location") }
- Breaking: RequiredEdgeRemoved { vertex_id: "org.passingreads.book.event:body", src: "org.passingreads.book.event:body", tgt: "org.passingreads.book.event:body.location", kind: "prop", name: Some("location") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#checkin.location", tgt: "org.passingreads.book.event#checkin.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#checkin.location", tgt: "org.passingreads.book.event#checkin.location:variant1", kind: "variant", name: Some("#osmLocation") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#checkin.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#checkin.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#drop.location", tgt: "org.passingreads.book.event#drop.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#drop.location", tgt: "org.passingreads.book.event#drop.location:variant1", kind: "variant", name: Some("#osmLocation") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#drop.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#drop.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#find", tgt: "org.passingreads.book.event#find.location", kind: "prop", name: Some("location") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#find.location", tgt: "org.passingreads.book.event#find.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#find.location", tgt: "org.passingreads.book.event#find.location:variant1", kind: "variant", name: Some("#osmLocation") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#find.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#find.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#gift", tgt: "org.passingreads.book.event#gift.location", kind: "prop", name: Some("location") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#gift.location", tgt: "org.passingreads.book.event#gift.location:variant0", kind: "variant", name: Some("community.lexicon.location.hthree#main") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#gift.location", tgt: "org.passingreads.book.event#gift.location:variant1", kind: "variant", name: Some("#osmLocation") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#gift.location:variant0", tgt: "community.lexicon.location.hthree#main", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#gift.location:variant1", tgt: "org.passingreads.book.event#osmLocation", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event#giftAcceptance.gift", tgt: "com.atproto.repo.strongRef#main", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body", tgt: "org.passingreads.book.event:body.details", kind: "prop", name: Some("details") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant0", kind: "variant", name: Some("#drop") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant1", kind: "variant", name: Some("#find") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant2", kind: "variant", name: Some("#checkin") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant3", kind: "variant", name: Some("#gift") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details", tgt: "org.passingreads.book.event:body.details:variant4", kind: "variant", name: Some("#giftAcceptance") }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details:variant0", tgt: "org.passingreads.book.event#drop", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details:variant1", tgt: "org.passingreads.book.event#find", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details:variant2", tgt: "org.passingreads.book.event#checkin", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details:variant3", tgt: "org.passingreads.book.event#gift", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.passingreads.book.event:body.details:variant4", tgt: "org.passingreads.book.event#giftAcceptance", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
+
"checkin": {
5
+
"description": "The book has moved, but has not changed hands.",
6
+
"properties": {
7
+
"location": {
8
+
"description": "Where the book is now (an h3 cell or an OSM place)",
9
+
"refs": [
10
+
"community.lexicon.location.hthree#main",
11
+
"#osmLocation"
12
+
],
13
+
"type": "union"
14
+
}
15
+
},
16
+
"required": [
17
+
"location"
18
+
],
19
+
"type": "object"
20
+
},
21
+
"drop": {
22
+
"description": "The book was left at a location for someone else to take.",
23
+
"properties": {
24
+
"location": {
25
+
"description": "Where the book was left (an h3 cell or an OSM place)",
26
+
"refs": [
27
+
"community.lexicon.location.hthree#main",
28
+
"#osmLocation"
29
+
],
30
+
"type": "union"
31
+
}
32
+
},
33
+
"required": [
34
+
"location"
35
+
],
36
+
"type": "object"
37
+
},
38
+
"find": {
39
+
"description": "The book was picked up, and is now held by the actor.",
40
+
"properties": {
41
+
"location": {
42
+
"description": "Where the book was picked up (an h3 cell or an OSM place), if the finder chose to record it",
43
+
"refs": [
44
+
"community.lexicon.location.hthree#main",
45
+
"#osmLocation"
46
+
],
47
+
"type": "union"
48
+
}
49
+
},
50
+
"type": "object"
51
+
},
52
+
"gift": {
53
+
"description": "The book was handed to a named person. It is theirs once they publish a #giftAcceptance.",
54
+
"properties": {
55
+
"location": {
56
+
"description": "Where the handover happened, if the giver chose to record it.",
57
+
"refs": [
58
+
"community.lexicon.location.hthree#main",
59
+
"#osmLocation"
60
+
],
61
+
"type": "union"
62
+
},
63
+
"recipient": {
64
+
"description": "The person the book was handed to, and the only one who may accept it.",
65
+
"format": "did",
66
+
"type": "string"
67
+
}
68
+
},
69
+
"required": [
70
+
"recipient"
71
+
],
72
+
"type": "object"
73
+
},
74
+
"giftAcceptance": {
75
+
"description": "The named recipient of a #gift has taken the book. Carries no signatures: the recipient need not hold the book's keypair, and the signed gift naming their repository is the authority instead.",
76
+
"properties": {
77
+
"gift": {
78
+
"description": "The org.passingreads.book.event whose #gift is being accepted.",
79
+
"ref": "com.atproto.repo.strongRef#main",
80
+
"type": "ref"
81
+
}
82
+
},
83
+
"required": [
84
+
"gift"
85
+
],
86
+
"type": "object"
87
+
},
4
88
"main": {
5
89
"description": "The status of a book has changed.",
6
90
"key": "tid",
7
91
"record": {
8
92
"properties": {
9
93
"book": {
10
94
"description": "The book that was dropped (a org.passingreads.book.registration)",
11
95
"ref": "com.atproto.repo.strongRef#main",
12
96
"type": "ref"
13
97
},
98
+
"details": {
99
+
"description": "What happened to the book. Each member carries the fields that event type requires — notably whether a `location` is mandatory. Absent only on records written before this union existed, which carry `event` and a top-level `location` instead.",
100
+
"refs": [
101
+
"#drop",
102
+
"#find",
103
+
"#checkin",
104
+
"#gift",
105
+
"#giftAcceptance"
106
+
],
107
+
"type": "union"
108
+
},
14
109
"event": {
15
-
"description": "What event has occurred",
110
+
"description": "DEPRECATED: superseded by `details`, and ignored whenever `details` is present. Retained so this lexicon still describes records written before the union existed.",
16
111
"knownValues": [
17
112
"org.passingreads.book.checkin",
18
113
"org.passingreads.book.drop",
19
114
"org.passingreads.book.find"
20
115
],
21
116
"type": "string"
22
117
},
23
118
"location": {
24
-
"description": "Where this event occurred (an h3 cell or an OSM place)",
119
+
"description": "DEPRECATED: superseded by the `location` inside `details`, and ignored whenever `details` is present. Retained so this lexicon still describes records written before the union existed.",
25
120
"refs": [
26
121
"community.lexicon.location.hthree#main",
27
122
"#osmLocation"
28
123
],
29
124
"type": "union"
30
125
},
31
126
"occurredAt": {
32
127
"description": "Client-declared timestamp of when the book was dropped",
33
128
"format": "datetime",
34
129
"type": "string"
35
130
},
36
131
"signatures": {
37
-
"description": "Inline attestations binding this event to the book's keypair.",
132
+
"description": "Inline attestations binding this event to the book's keypair. Empty only on a #giftAcceptance, whose authority is the referenced gift naming the accepting repository.",
38
133
"items": {
39
134
"ref": "org.passingreads.signature.book#main",
40
135
"type": "ref"
41
136
},
42
-
"minLength": 1,
137
+
"minLength": 0,
43
138
"type": "array"
44
139
}
45
140
},
46
141
"required": [
47
142
"book",
48
-
"location",
49
143
"signatures",
50
144
"occurredAt"
51
145
],
52
146
"type": "object"
53
147
},
54
148
"type": "record"
55
149
},
56
150
"osmLocation": {
57
151
"description": "A physical location from OpenStreetMap.",
58
152
"properties": {
59
153
"category": {
60
154
"description": "The type of place (e.g., cafe, library, park).",
61
155
"type": "string"
62
156
},
63
157
"name": {
64
158
"description": "The name of the place from OpenStreetMap.",
65
159
"type": "string"
66
160
},
67
161
"osmId": {
68
162
"description": "The OpenStreetMap element ID in interoperable format: N (node), W (way), or R (relation) prefix followed by numeric ID. Example: N123456789",
69
163
"type": "string"
70
164
},
71
165
"value": {
72
166
"description": "The H3 cell index for proximity queries.",
73
167
"type": "string"
74
168
}
75
169
},
76
170
"required": [
77
171
"osmId",
78
172
"name",
79
173
"value"
80
174
],
81
175
"type": "object"
82
176
}
83
177
},
84
178
"id": "org.passingreads.book.event",
85
179
"lexicon": 1
86
180
}