Units in names. Every numeric member carries its unit suffix: _m, _mps, _deg, _degps, _pct, _v, _a, _s, _ms, _dbm, _kbps. No alternative units exist on the wire (ADR-0006).
References in names. Altitude is never bare; see altitude_msl_m, altitude_ellipsoid_m, altitude_agl_m, altitude_rel_m.
Absence means unknown. A member that is not present is unknown. null is NOT used for numeric members. Enumerations use the explicit UNKNOWN value.
One timestamp per sample.timestamp is the time of validity of the sample (sensor time), not transmission time. Members measured at materially different times (for example GNSS at 1 Hz, attitude at 50 Hz) are reported as of timestamp with the device choosing the most recent values; where the age matters, an age_ms member MAY be given in position, motion, power or a payloads[] entry (the age of that object's values at timestamp), and MUST be given for values carried over from a source that has stopped (§7.11).
Monotonic sequence.sequence increases by one per sample per operation and allows gap detection.
When no position estimate exists, position is omitted and health.gnss.fix is NONE. Underwater vehicles without GNSS report health.gnss.fix: NONE and a non-GNSS position.source; horizontal_accuracy_m is then REQUIRED.
REQUIRED (S) while the source is reporting. When the source has stopped (§7.11) the device either omits power or repeats the last known values with age_ms.
{ "code": "IMU_CALIBRATION", "severity": "WARNING", "message": "...", "since": "..." }. Codes are vendor strings; standard codes listed in Part 08 §8.5 SHOULD be used where they apply.
Profile S: ≥ 1 Hz powered, ≥ 2 Hz deployed; device SHOULD support ≥ 5 Hz. The client MAY request a rate via welcome or PATCH /config. A device whose link or source cannot sustain this (an acoustic link, or a vendor protocol that reports state at 0.5 Hz) MUST declare a lower telemetry.rate_hz.max in capabilities and is then held to that value; its staleness threshold below is then at least 2.5 sample periods.
A requested or applied rate is an upper bound. A device publishes each sample of its source at most once and MUST NOT repeat a sample to reach a rate higher than the source provides; the effective rate is then the source's rate.
A device MUST NOT fabricate samples; when the underlying source stops, the device MUST stop publishing position and motion, MUST keep publishing at ≥ 1 Hz with link.state: LOST (or UNKNOWN where it cannot observe the link), vehicle.vehicle_state: UNKNOWN and health.status: UNKNOWN, and MUST publish vehicle.telemetry.stale after 5 s. Any value it repeats from before the stop carries age_ms (§7.1).
Clients MUST tolerate gaps and MUST NOT interpolate across a gap longer than 2 s without marking the result as estimated. A client SHOULD show telemetry as stale when no sample has arrived for max(3 / applied_rate_hz s, 2 s), while the device is offline, or while vehicle.telemetry.stale is active, and SHOULD display the age of what it shows.
vehicle_state SHOULD NOT oscillate: a device reports HOLDING only after the vehicle has stayed below 0.5 m/s ground speed for 2 s and leaves it only when that no longer holds (the dwell of Annex A.2.2 applies to every device).