Introduction
One of the fundamental aspects of aviation is the concept of a "flight" and by providing a standardized taxonomy to describe flight segments, Contrail defines a structure to build aviation webapps using AT Protocol. I built Contrail primarily as a way to explore ATProto, but I also believe these lexicons could provide real value to the aviation community. At its core, a Contrail record just asserts that a particular flight existed, many additional (optional) fields serve to add context, ideally in a way that can holistically describe most aspects of a given flight.
Definitions
The following schemas are published to did:plc:5jsivedaksbcc4n2epiegflk and resolve by NSID.
com.airplaneian.contrail.temp.flightrecord, key: tidAn assertion that a particular flight existed, rather than a personal log entry about the author. Only 'createdAt' is required. Every other field is optional, and absent means unknown or not applicable rather than empty or zero.
The exception is 'relationship', where absent means no claim is being made. Records of the same flight written by different people are expected, so write the identifying fields consistently. Any kind of flying is in scope, and origin may equal destination.
32 fields, 1 required
createdAtstring:datetimerequiredWhen this record was written, not when the flight happened. Explicit UTC offset, no fractional seconds.
datestringCalendar date of departure at the origin, as 'YYYY-MM-DD'. Part of the identity key with 'operator' and 'flightNumber'. Must agree with any departure timestamp.
origincom.airplaneian.contrail.temp.defs#placeWhere the flight departed. May equal 'destination'; local flights are ordinary.
destinationcom.airplaneian.contrail.temp.defs#placeWhere the flight arrived, or was intended to arrive if it was cancelled. If it diverted, this stays the intended destination and 'diversionAirport' holds where it landed.
routestringThe route as filed, written as the flight plan expressed it, for example 'SSTIK2 SSTIK Q90 AVOSE'. Free text, not normalised and not reliable for matching.
This is the planned route, not the flown track: a track belongs in a surveillance archive, which 'icao24' and a departure time are enough to query.
sourcestringShort identifier for the tool or dataset that wrote this record, for example 'flighty', 'manual', or 'adsb'.
sourceIdstringThat tool's own identifier for this flight. Kept in the record body rather than the record key, so a record can be corrected without becoming a new one. Meaningful only with 'source'.
callsignstringThe flight identification the aircraft broadcast, uppercase and exactly as transmitted. Holds the whole callsign, never a fragment of one. May be an operator designator followed by a flight number, a registration, or a string with no internal structure.
operatorstringICAO designator of the agency that operated the flight, three letters, uppercase. Not airlines only: 'UAL', 'FDX', 'RCH'. Use 'operatorName' where no designator exists.
operatorNamestringFree-text name of the operating agency, for operators with no ICAO designator. Not reliable for matching. This is who flew the aircraft, which is often not who owns it.
flightNumberstringThe operating agency's flight number, as a string. Digits only, without the operator prefix.
marketingAirlinestringICAO designator of the airline that sold the flight, when it differs from 'operator'. Codeshares only.
marketingFlightNumberstringFlight number under which the flight was sold, when it differs from 'flightNumber'.
registrationstringRegistration or tail number, uppercase with no hyphens or spaces, so that 'G-VBOW' and 'GVBOW' are one aircraft. Military and state identifiers go here too.
registeredOwnerstringFree-text name of the party the airframe is registered to. Often a trust or holding company, and frequently not the operator.
aircraftTypestringFree-text aircraft type as the source expressed it, for example 'Boeing 737-800'. Not normalised and not reliable for matching. Several distinct ICAO designators can share one marketing name.
icaoTypeDesignatorstringICAO aircraft type designator, for example 'B77W'.
icao24stringThe airframe's 24-bit ICAO address, six lowercase hexadecimal characters. With an actual departure time this is the identity key for flights with no flight number.
scheduledGateDeparturestring:datetimeScheduled 'out' time, leaving the gate or parking position. Explicit UTC offset, no fractional seconds.
actualGateDeparturestring:datetimeActual 'out' time, leaving the gate or parking position. Explicit UTC offset, no fractional seconds.
scheduledTakeoffstring:datetimeScheduled 'off' time, wheels off. Explicit UTC offset, no fractional seconds.
actualTakeoffstring:datetimeActual 'off' time, wheels off. Explicit UTC offset, no fractional seconds.
scheduledLandingstring:datetimeScheduled 'on' time, wheels on. Explicit UTC offset, no fractional seconds.
actualLandingstring:datetimeActual 'on' time, wheels on. Explicit UTC offset, no fractional seconds.
scheduledGateArrivalstring:datetimeScheduled 'in' time, reaching the gate or parking position. Explicit UTC offset, no fractional seconds.
actualGateArrivalstring:datetimeActual 'in' time, reaching the gate or parking position. Explicit UTC offset, no fractional seconds.
relationshipstringpassengerpicsicstudentinstructorcrewobserverThe author's connection to this flight. Absent means no claim is being made, unlike every other field where absent means unknown. An open string: the known values are not exhaustive.
seatstringSeat occupied, as a string, for example '14C'.
cabinstringeconomypremiumEconomybusinessfirstCabin or class of service. An open string in lower camel case; the known values are not exhaustive.
statusstringnormalcancelleddivertedHow the flight concluded. Absent means unknown, so write 'normal' explicitly when the flight operated as planned.
diversionAirportcom.airplaneian.contrail.temp.defs#placeWhere the flight actually landed, when that was not 'destination'. Present only when 'status' is 'diverted'.
notesstringFree-text note. Public as soon as the record is written, and copies may persist after the record is deleted. Do not put booking references or other credentials here.
com.airplaneian.contrail.temp.triprecord, key: tidAn assertion that a set of flights belonged to one journey. Only 'createdAt' is required, and absent means unknown or not applicable. The reference points one way only, from trip to flight, and a trip references only flight records the author wrote.
5 fields, 1 required
createdAtstring:datetimerequiredWhen this record was written, not when the trip happened. Explicit UTC offset, no fractional seconds.
namestringFree-text name for the trip. Public as soon as the record is written, and copies may persist after the record is deleted.
flightsarray<string:at-uri>The flights in this trip, in the order flown, as AT-URIs to flight records. Plain AT-URIs rather than strong references, so a reference stays valid when a flight record is corrected in place. A reference may dangle if a flight is later deleted.
sourcestringShort identifier for the tool that wrote this record.
sourceIdstringThat tool's own identifier for this trip. A grouping key may be sensitive even when the grouping is not: never write a booking reference here.
com.airplaneian.contrail.temp.defs#placeobjectAn airport, airfield, or landing site referenced by a flight record. Every field is optional, and absent means unknown or not applicable. The identifier fields come from different systems and a place may have any combination of them, so write each one the place actually has.
A place with no published identifier is described by 'name' and 'geo' alone.
7 fields, 0 required
icaostringICAO location indicator, four characters, uppercase, for example 'KOAK'. Preferred for matching. Many small airfields have none.
iatastringIATA location code, three characters, uppercase, for example 'OAK'. Reassigned between airports over time, so pair it with 'icao' or 'geo' where possible.
faaLidstringFAA Location Identifier, for United States airfields that have one, for example '1G5'. Many US fields have this and no ICAO indicator.
namestringFree-text name, for landing sites that no identifier system covers. Carries no matching guarantees.
geocommunity.lexicon.location.geoCoordinates, for landing sites that no identifier system covers. Do not write coordinates looked up from an identifier already in this object.
terminalstringTerminal used by this flight at this place, as free text. A fact about the flight, not about the place.
gatestringGate or stand used by this flight at this place, as free text.