social.passports.place
Schema Diff
+51 -30
Compatibility Analysis
Breaking Changes Detected
18 breaking changes, 20 non-breaking changes.
Breaking Changes (18)
- RemovedVertex RemovedVertex { vertex_id: "social.passports.place:body" }
- RemovedVertex RemovedVertex { vertex_id: "social.passports.place:body.city" }
- RemovedVertex RemovedVertex { vertex_id: "social.passports.place:body.createdAt" }
- RemovedVertex RemovedVertex { vertex_id: "social.passports.place:body.transportCode" }
- RemovedVertex RemovedVertex { vertex_id: "social.passports.place:body.unlocode" }
- RemovedEdge RemovedEdge { src: "social.passports.place", tgt: "social.passports.place:body", kind: "record-schema", name: None }
- RemovedEdge RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.city", kind: "prop", name: Some("city") }
- RemovedEdge RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.createdAt", kind: "prop", name: Some("createdAt") }
- RemovedEdge RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.transportCode", kind: "prop", name: Some("transportCode") }
- RemovedEdge RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.unlocode", kind: "prop", name: Some("unlocode") }
- KindChanged KindChanged { vertex_id: "social.passports.place", old_kind: "record", new_kind: "object" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.atgeoRkey", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.locality", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.countryIso", sort: "maxLength", value: "2" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.atgeoCollection", sort: "maxLength", value: "100" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.name", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.unlocode", sort: "minLength", value: "5" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.unlocode", sort: "maxLength", value: "5" }
Non-Breaking Changes (20)
- AddedVertex AddedVertex { vertex_id: "social.passports.place.atgeoCollection" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.atgeoRkey" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.category" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.countryIso" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.geo" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.locality" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.name" }
- AddedVertex AddedVertex { vertex_id: "social.passports.place.unlocode" }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.atgeoCollection", kind: "prop", name: Some("atgeoCollection") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.atgeoRkey", kind: "prop", name: Some("atgeoRkey") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.category", kind: "prop", name: Some("category") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.countryIso", kind: "prop", name: Some("countryIso") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.geo", kind: "prop", name: Some("geo") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.locality", kind: "prop", name: Some("locality") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.name", kind: "prop", name: Some("name") }
- AddedEdge AddedEdge { src: "social.passports.place", tgt: "social.passports.place.unlocode", kind: "prop", name: Some("unlocode") }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.transportCode", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.city", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.unlocode", sort: "minLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.unlocode", sort: "maxLength" }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "social.passports.place:body" }RemovedVertex { vertex_id: "social.passports.place:body.city" }RemovedVertex { vertex_id: "social.passports.place:body.createdAt" }RemovedVertex { vertex_id: "social.passports.place:body.transportCode" }RemovedVertex { vertex_id: "social.passports.place:body.unlocode" }
Added Elements
AddedVertex { vertex_id: "social.passports.place.atgeoCollection" }AddedVertex { vertex_id: "social.passports.place.atgeoRkey" }AddedVertex { vertex_id: "social.passports.place.category" }AddedVertex { vertex_id: "social.passports.place.countryIso" }AddedVertex { vertex_id: "social.passports.place.geo" }AddedVertex { vertex_id: "social.passports.place.locality" }AddedVertex { vertex_id: "social.passports.place.name" }AddedVertex { vertex_id: "social.passports.place.unlocode" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.locality", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.name", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.atgeoCollection", sort: "maxLength", value: "100" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.unlocode", sort: "minLength", value: "5" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.unlocode", sort: "maxLength", value: "5" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.countryIso", sort: "maxLength", value: "2" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.passports.place.atgeoRkey", sort: "maxLength", value: "200" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.city", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.unlocode", sort: "minLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.unlocode", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.passports.place:body.transportCode", sort: "maxLength" }
Additional Notes
- Breaking: RemovedEdge { src: "social.passports.place", tgt: "social.passports.place:body", kind: "record-schema", name: None }
- Breaking: RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.city", kind: "prop", name: Some("city") }
- Breaking: RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.createdAt", kind: "prop", name: Some("createdAt") }
- Breaking: RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.transportCode", kind: "prop", name: Some("transportCode") }
- Breaking: RemovedEdge { src: "social.passports.place:body", tgt: "social.passports.place:body.unlocode", kind: "prop", name: Some("unlocode") }
- Breaking: KindChanged { vertex_id: "social.passports.place", old_kind: "record", new_kind: "object" }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.atgeoCollection", kind: "prop", name: Some("atgeoCollection") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.atgeoRkey", kind: "prop", name: Some("atgeoRkey") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.category", kind: "prop", name: Some("category") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.countryIso", kind: "prop", name: Some("countryIso") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.geo", kind: "prop", name: Some("geo") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.locality", kind: "prop", name: Some("locality") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.name", kind: "prop", name: Some("name") }
- Non-breaking: AddedEdge { src: "social.passports.place", tgt: "social.passports.place.unlocode", kind: "prop", name: Some("unlocode") }
1
1
{
2
2
"id": "social.passports.place",
3
3
"defs": {
4
4
"main": {
5
-
"key": "tid",
6
-
"type": "record",
7
-
"record": {
8
-
"type": "object",
9
-
"required": [
10
-
"city",
11
-
"createdAt"
12
-
],
13
-
"properties": {
14
-
"city": {
15
-
"type": "string",
16
-
"maxLength": 100,
17
-
"description": "Human-readable city name for display, e.g. 'New York City'."
18
-
},
19
-
"unlocode": {
20
-
"type": "string",
21
-
"maxLength": 5,
22
-
"minLength": 5,
23
-
"description": "City-level UN/LOCODE — the canonical cross-user match key. Always the city-level code, not a terminal-specific airport or station node (e.g. 'USNYC' for New York City, not 'USJFK'). First two characters are the ISO 3166-1 alpha-2 country code. Disambiguates same-name cities in different subdivisions (e.g. 'USPDX' = Portland OR, 'USPOD' = Portland ME)."
24
-
},
25
-
"createdAt": {
26
-
"type": "string",
27
-
"format": "datetime"
28
-
},
29
-
"transportCode": {
30
-
"type": "string",
31
-
"maxLength": 10,
32
-
"description": "Terminal-specific code for the place of arrival/departure. IATA airport code for flights (e.g. 'JFK'), train station code for rail (e.g. 'NYP' for New York Penn Station), ferry terminal code, etc. Null for general city-level legs with no specific terminal."
33
-
}
5
+
"type": "object",
6
+
"required": [
7
+
"name",
8
+
"category"
9
+
],
10
+
"properties": {
11
+
"geo": {
12
+
"ref": "community.lexicon.location.geo",
13
+
"type": "ref",
14
+
"description": "WGS84 coordinates as decimal strings, per the community location lexicon."
15
+
},
16
+
"name": {
17
+
"type": "string",
18
+
"maxLength": 200,
19
+
"description": "Human-readable place name for display."
20
+
},
21
+
"category": {
22
+
"type": "string",
23
+
"description": "Place type.",
24
+
"knownValues": [
25
+
"city",
26
+
"town",
27
+
"venue"
28
+
]
29
+
},
30
+
"locality": {
31
+
"type": "string",
32
+
"maxLength": 200,
33
+
"description": "Human-readable city or neighborhood for display, used when no unlocode is available (e.g. venues in cities not in UN/LOCODE)."
34
+
},
35
+
"unlocode": {
36
+
"type": "string",
37
+
"maxLength": 5,
38
+
"minLength": 5,
39
+
"description": "UN/LOCODE for this place (5 characters: 2-char country + 3-char code). Canonical cross-user match key for cities and towns that have one."
40
+
},
41
+
"atgeoRkey": {
42
+
"type": "string",
43
+
"maxLength": 200,
44
+
"description": "Record key within the ATGeo collection, e.g. 'node/249132774' for OSM, the FSQ ID for Foursquare, or a UUID for social.passports-sourced places."
45
+
},
46
+
"countryIso": {
47
+
"type": "string",
48
+
"maxLength": 2,
49
+
"description": "ISO 3166-1 alpha-2 country code."
50
+
},
51
+
"atgeoCollection": {
52
+
"type": "string",
53
+
"maxLength": 100,
54
+
"description": "ATGeo source dataset: 'osm', 'overture', 'foursquare', or 'social.passports' for places not yet covered by ATGeo."
34
55
}
35
56
},
36
-
"description": "A named city/country location. Stored once per city on the user's PDS and referenced by travel legs via strongref. Country, subdivision, and coordinates are all derivable from the unlocode field and are not stored redundantly."
57
+
"description": "A place embedded inline in a passport entry. Self-contained: carries name, coordinates, and enough identifiers for any AT Proto consumer to look up richer data from ATGeo (https://atgeo.org). atgeoCollection + atgeoRkey let consumers fetch full detail (alt names, categories, address) without this record depending on an external service at read time."
37
58
}
38
59
},
39
60
"$type": "com.atproto.lexicon.schema",
40
61
"lexicon": 1
41
62
}