Repository navigation
T-018: warn on a clock-fault RATE, not a lifetime counter - #6
Merged
Merged
Conversation
+ file T-019 (.local resolution fallback)
HARDWARE-FOUND. The diagnostics dot was permanently amber on a perfectly healthy
device.
hasDiagWarning was `droppedTicks > 0`. But those are LIFETIME counters — the
firmware says so in as many words (ks_tick_health.h: "Lifetime counters, not
windowed — a worst-case that scrolled past is not a measurement").
So the real kstouch-dfd0, reporting drop:47 accumulated once at boot, lit an
amber warning FOREVER. Sampled every 4s for 32s: drop never moved off 47, over
stayed 0. The clock was flawless and the app said otherwise, permanently.
That is alarm fatigue by construction. A warning that is always on is a warning
nobody reads, and it would be ignored on the one day it means something.
The app polls continuously, so it can just look at the delta:
- non-zero but STATIC -> dropped ticks at boot, fine now. Say nothing.
- INCREASING -> the clock task is dropping ticks RIGHT NOW. Alarm.
ClockFault.between(previous:current:) is pure and tested. Two traps it handles:
- The FIRST sample has no rate, so it must not alarm — otherwise a device that
booted with 47 drops alarms the instant you open its screen, which is the bug.
- A counter going DOWN means the device REBOOTED (lifetime counters zero on
restart) — and this app reboots devices deliberately, via WRITE & REBOOT and
OTA. A reset is not a fault and must not read as one, nor as a huge negative
rate.
The counters are still SHOWN ("47 since boot") — they are real data. They just
aren't an alarm. When the rate is non-zero the screen says so in words: "The
clock task is dropping ticks RIGHT NOW."
This is the same error for the FOURTH time today: a /config.json 404 is not a
dead network (T-009); one dropped poll is not a disconnection (T-010); a decode
failure is not an unreachable device (T-016). Now: a lifetime counter is not a
live fault. Every one is two situations collapsed into one signal, sending the
user to fix the wrong thing.
The rule worth generalising, and it's in T-018's notes: before showing a warning,
ask what the user would DO about it. If two causes need different actions, they
need different signals.
maxStepMicros stays deliberately un-warned — nobody has given us a threshold and
inventing one would be worse than showing the number.
Also files T-019: the device answered on 192.168.0.101 while kstouch-dfd0.local
timed out and Bonjour was STILL advertising it. The app resolves by <name>.local,
so that flake surfaces as a false UNREACHABLE.
100 tests, 0 failures.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
HARDWARE-FOUND. The diagnostics dot was permanently amber on a perfectly healthy device — and it was my bug.
hasDiagWarningwasdroppedTicks > 0. But those are LIFETIME counters, and the firmware says so in as many words (ks_tick_health.h: "Lifetime counters, not windowed — a worst-case that scrolled past is not a measurement").So the real
kstouch-dfd0, reportingdrop:47accumulated once at boot, lit an amber warning forever:The clock was flawless and the app said otherwise, permanently. That's alarm fatigue by construction — a warning that is always on is one nobody reads, and it gets ignored on the one day it means something.
The fix
The app polls continuously, so it can just look at the delta:
ClockFault.between(previous:current:)is pure and tested. Two traps it handles:The counters are still shown ("47 since boot") — they're real data. They just aren't an alarm. When the rate is non-zero, the screen says so in words: "The clock task is dropping ticks RIGHT NOW."
This is the same mistake for the fourth time today
/config.json404 is not a dead network (T-009)Every one is two situations collapsed into one signal, sending the user to fix the wrong thing. The rule worth generalising, recorded in T-018's notes: before showing a warning, ask what the user would DO about it. If two causes need different actions, they need different signals.
maxStepMicrosstays deliberately un-warned — nobody has given us a threshold, and inventing one would be worse than showing the raw number.Also files T-019
The device answered on
192.168.0.101whilekstouch-dfd0.localtimed out anddns-sdwas still advertising it. The app resolves by<name>.local, so that flake surfaces as a false UNREACHABLE. Not fixed here — filed with the evidence.100 tests, 0 failures.
https://claude.ai/code/session_01F7YsQgso3KNpeXbP5vNVj6