at.adsb.receiver.sighting

adsb.at

Schema Diff

+59 -41

From

CID
bafyreihgoc5ebgc...
Indexed At
2026-05-23 21:30 UTC
View this version

To

CID
bafyreifd2vyeji2...
Indexed At
2026-05-27 12:56 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

22 breaking changes, 14 non-breaking changes.

Breaking Changes (22)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting#manifestEntry", src: "at.adsb.receiver.sighting#manifestEntry", tgt: "at.adsb.receiver.sighting#manifestEntry.icaoHex", kind: "prop", name: Some("icaoHex") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowStart", kind: "prop", name: Some("windowStart") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.sources", kind: "prop", name: Some("sources") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.manifest", kind: "prop", name: Some("manifest") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.telemetry", kind: "prop", name: Some("telemetry") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.windowEnd", kind: "prop", name: Some("windowEnd") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.icaoHex", kind: "prop", name: Some("icaoHex") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.lastSeen", kind: "prop", name: Some("lastSeen") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.adsb.receiver.sighting:body", src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.firstSeen", kind: "prop", name: Some("firstSeen") }
  • 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" }
  • RemovedVertex RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.track" }
  • 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.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") }
  • RemovedEdge RemovedEdge { src: "at.adsb.receiver.sighting:body", tgt: "at.adsb.receiver.sighting:body.track", kind: "prop", name: Some("track") }
Non-Breaking Changes (14)
  • 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:body", tgt: "at.adsb.receiver.sighting:body.rawCapture", kind: "prop", name: Some("rawCapture") }
  • 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.manifest:items", tgt: "at.adsb.receiver.sighting#manifestEntry", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "at.adsb.receiver.sighting:body.sources", tgt: "at.adsb.receiver.sighting:body.sources:items", kind: "items", name: None }

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" }
  • RemovedVertex { vertex_id: "at.adsb.receiver.sighting:body.track" }

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" }

Additional Notes

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

Compare Other Versions

Lexicon Garden

@