at.adsb.receiver.sighting
Schema Diff
+61 -34
Compatibility Analysis
Breaking Changes Detected
17 breaking changes, 25 non-breaking changes.
Breaking Changes (17)
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.callsign" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.firstSeen" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.icaoHex" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.lastSeen" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.messageCount" }
- RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.positionCount" }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.callsign", kind: "prop", name: Some("callsign") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.firstSeen", kind: "prop", name: Some("firstSeen") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.icaoHex", kind: "prop", name: Some("icaoHex") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.lastSeen", kind: "prop", name: Some("lastSeen") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.maxRangeNm", kind: "prop", name: Some("maxRangeNm") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.messageCount", kind: "prop", name: Some("messageCount") }
- RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.positionCount", kind: "prop", name: Some("positionCount") }
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting:body.sources:items", sort: "maxLength", value: "32" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "minLength", value: "6" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "maxLength", value: "6" }
Non-Breaking Changes (25)
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest:items" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.rawCapture" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.sources" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.sources:items" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.telemetry" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowEnd" }
- AddedVertex AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowStart" }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting#manifestEntry", tgt: "at.adsb.receiver.sighting#manifestEntry.icaoHex", kind: "prop", name: Some("icaoHex") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.manifest", kind: "prop", name: Some("manifest") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.rawCapture", kind: "prop", name: Some("rawCapture") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.sources", kind: "prop", name: Some("sources") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.telemetry", kind: "prop", name: Some("telemetry") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowEnd", kind: "prop", name: Some("windowEnd") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowStart", kind: "prop", name: Some("windowStart") }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body.manifest", tgt: "at.adsb.receiver.sighting:body.manifest:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body.sources", tgt: "at.adsb.receiver.sighting:body.sources:items", kind: "items", name: None }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "minLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.callsign", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.positionCount", sort: "minimum" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.messageCount", sort: "minimum" }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.callsign" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.firstSeen" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.icaoHex" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.lastSeen" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.messageCount" }RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.positionCount" }
Added Elements
AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry" }AddedVertex { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.manifest:items" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.rawCapture" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.sources" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.sources:items" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.telemetry" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowEnd" }AddedVertex { vertex_id: "at.adsb.receiver.sighting:body.windowStart" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting:body.sources:items", sort: "maxLength", value: "32" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "minLength", value: "6" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry.icaoHex", sort: "maxLength", value: "6" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.positionCount", sort: "minimum" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.messageCount", sort: "minimum" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.maxRangeNm", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "minLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.icaoHex", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "at.adsb.receiver.sighting:body.callsign", sort: "maxLength" }
Additional Notes
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.callsign", kind: "prop", name: Some("callsign") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.firstSeen", kind: "prop", name: Some("firstSeen") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.icaoHex", kind: "prop", name: Some("icaoHex") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.lastSeen", kind: "prop", name: Some("lastSeen") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.maxRangeNm", kind: "prop", name: Some("maxRangeNm") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.messageCount", kind: "prop", name: Some("messageCount") }
- Breaking: RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.positionCount", kind: "prop", name: Some("positionCount") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting#manifestEntry", tgt: "at.adsb.receiver.sighting#manifestEntry.icaoHex", kind: "prop", name: Some("icaoHex") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.manifest", kind: "prop", name: Some("manifest") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.rawCapture", kind: "prop", name: Some("rawCapture") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.sources", kind: "prop", name: Some("sources") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.telemetry", kind: "prop", name: Some("telemetry") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowEnd", kind: "prop", name: Some("windowEnd") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowStart", kind: "prop", name: Some("windowStart") }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body.manifest", tgt: "at.adsb.receiver.sighting:body.manifest:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "at.adsb.receiver.sighting:body.sources", tgt: "at.adsb.receiver.sighting:body.sources:items", kind: "items", name: None }
1
1
{
2
2
"id": "at.adsb.receiver.sighting",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
-
"icaoHex",
11
-
"firstSeen",
12
-
"lastSeen",
10
+
"windowStart",
11
+
"windowEnd",
12
+
"manifest",
13
+
"telemetry",
14
+
"sources",
13
15
"createdAt"
14
16
],
15
17
"properties": {
16
-
"icaoHex": {
17
-
"type": "string",
18
-
"maxLength": 6,
19
-
"minLength": 6,
20
-
"description": "ICAO 24-bit aircraft address in hexadecimal (e.g. 'A1B2C3')."
18
+
"sources": {
19
+
"type": "array",
20
+
"items": {
21
+
"type": "string",
22
+
"maxLength": 32
23
+
},
24
+
"maxLength": 50,
25
+
"minLength": 1,
26
+
"description": "Deduplicated list of decoder source types that contributed position fixes in this batch window."
21
27
},
22
-
"callsign": {
23
-
"type": "string",
24
-
"maxLength": 8,
25
-
"description": "Flight callsign as broadcast (e.g. 'UAL123')."
26
-
},
27
-
"lastSeen": {
28
-
"type": "string",
29
-
"format": "datetime",
30
-
"description": "When this receiver last detected the aircraft."
28
+
"manifest": {
29
+
"type": "array",
30
+
"items": {
31
+
"ref": "#manifestEntry",
32
+
"type": "ref"
33
+
},
34
+
"maxLength": 1000,
35
+
"minLength": 1,
36
+
"description": "Lightweight list of all aircraft observed in this window."
31
37
},
32
38
"createdAt": {
33
39
"type": "string",
34
40
"format": "datetime"
35
41
},
36
-
"firstSeen": {
37
-
"type": "string",
38
-
"format": "datetime",
39
-
"description": "When this receiver first detected the aircraft."
42
+
"telemetry": {
43
+
"type": "blob",
44
+
"accept": [
45
+
"application/zstd"
46
+
],
47
+
"maxSize": 2000000,
48
+
"description": "Zstd-compressed JSON object keyed by ICAO hex, values are arrays of at.adsb.flight.defs#position objects."
40
49
},
41
-
"maxRangeNm": {
50
+
"windowEnd": {
42
51
"type": "string",
43
-
"maxLength": 20,
44
-
"description": "Furthest distance to this aircraft during the sighting, in nautical miles."
52
+
"format": "datetime",
53
+
"description": "End of the observation window (exclusive)."
45
54
},
46
-
"messageCount": {
47
-
"type": "integer",
48
-
"minimum": 0,
49
-
"description": "Total messages received from this aircraft."
55
+
"rawCapture": {
56
+
"type": "blob",
57
+
"accept": [
58
+
"application/vnd.at-adsb.raw-capture+zstd"
59
+
],
60
+
"maxSize": 2000000,
61
+
"description": "Raw demodulated SDR frames captured during this window, in ATRX envelope format. Optional — strengthens provenance but not required."
50
62
},
51
-
"positionCount": {
52
-
"type": "integer",
53
-
"minimum": 0,
54
-
"description": "Number of position reports received."
63
+
"windowStart": {
64
+
"type": "string",
65
+
"format": "datetime",
66
+
"description": "Start of the observation window (inclusive)."
55
67
}
56
68
}
57
69
},
58
-
"description": "A receiver's sighting of an aircraft transit through its coverage area."
70
+
"description": "A receiver's batch sighting covering a configurable observation window."
71
+
},
72
+
"manifestEntry": {
73
+
"type": "object",
74
+
"required": [
75
+
"icaoHex"
76
+
],
77
+
"properties": {
78
+
"icaoHex": {
79
+
"type": "string",
80
+
"maxLength": 6,
81
+
"minLength": 6,
82
+
"description": "ICAO 24-bit hex address (uppercased)."
83
+
}
84
+
},
85
+
"description": "An aircraft observed in this batch window."
59
86
}
60
87
},
61
88
"$type": "com.atproto.lexicon.schema",
62
89
"lexicon": 1,
63
-
"description": "A single receiver's sighting of an aircraft. Created when the aircraft leaves the receiver's coverage area. Feeder-authoritative — published immediately without waiting for the full flight to complete."
90
+
"description": "A batch of aircraft observations from a single receiver covering a configurable time window (default 60 seconds). Contains a manifest of observed aircraft and blobbed telemetry data."
64
91
}