docs(ups): record a battery that is proven, and what still is not - #160
Merged
Conversation
The self-test passed. upsTestResultsSummary went 4 (aborted) to 1 (donePass) at 22:45 UTC, and step 5's comparison — the part the card cannot fake — holds: upsBatteryVoltage left its fabricated 480 for a float reading that varies between 543 and 546, and the runtime estimate moves rather than sitting on exactly 63. The silence 54f1715c was deleted at 23:14 rather than left to run to 2026-09-20, so UpsSelfTestFailed is live again. Charge still reads exactly 100. On its own that is the fabrication signature the previous commit warned about, so it is worth saying why it is not one here: voltage and runtime both moved and the test passed, which is float voltage on a topped-off pack. Charge alone was never the evidence. Two things outlast the fix, and every file that claims the battery works now says both: - stored metrics older than 2026-08-28 *are* the fabricated values, not measurements. The dashboard defaults to a 24h window and its trend panels cross that boundary today; any wider range crosses it forever - scheduled self-tests are still off, so 1 is a last-known result with nothing refreshing it. UpsBatteryUnproven cannot catch a card that stops testing — it matches 6 (noTestsInitiated) and this one reads 1 Two departures from the runbook's flip list, both deliberate: - the banner panel is rewritten rather than deleted. It still has something true and non-obvious to say — the fabricated history above — and keeping it holds the dashboard at 84 panels, so the check_docs.py panel-count coupling the runbook warned about is never triggered - #93 is not moved into Done. The roadmap defines it as delete the silence, then self-test, then enable scheduled tests; the third is outstanding, so the entry stays open with its remaining scope narrowed to that Two files the runbook's own list had missed: docs/observability.md's rule-file row, and the runbook itself, whose step 3 still said in the present tense that the silence was in place. Dropped a stale claim from the ups.rules.yaml header while rewriting it — it grouped UpsBatteryTemperatureHigh with rules reading "mains-side or load-side values" and called it unaffected, but it reads upsBatteryTemperature, which was fabricated like the rest. Moot now that all of them are real. The screenshot is left as it is. It is an honest render of what the dashboard said on 2026-08-22, docs/images/README.md refuses mocked-up images, and `make screenshots` needs the decrypted Grafana password. #110 is untouched — the shelf and switch move did not happen, so `prometheus` and `oracle` still go deaf on a mains cut and the rack's own protection is the only thing this commit can claim. Refs #93, #110 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
The self-test passed, so the documents that said fitted and unproven are now
wrong in the other direction. This moves them to proven — and names the two
things that outlast the fix, so "proven" does not get read as "finished".
What was verified before anything was written
upsTestResultsSummary4aborted1donePass, at 22:45 UTCupsBatteryVoltage480, fixed543–546, varyingupsEstimatedMinutesRemaining63, fixedupsEstimatedChargeRemaining100100That is step 5's comparison, the part the management card cannot fake. The
silence
54f1715creadsendsAt2026-08-28T23:14Z instead of its original2026-09-20, so it was deleted rather than left to expire, and
UpsSelfTestFailedis live again.Charge still reading exactly
100is, on its own, the fabrication signature theprevious commit warned about. It is not one here — voltage and runtime both
moved and the test passed, which is float voltage on a topped-off pack. The
rules header says so explicitly rather than leaving it to be re-litigated.
What outlasts the fix
Every file that now claims the battery works also says both of these:
measurements. The dashboard defaults to a 24h window and its trend panels
cross that boundary today; any wider range crosses it forever.
1is a last-known result withnothing refreshing it.
UpsBatteryUnprovencannot catch a card that stopstesting — it matches
6(noTestsInitiated), and this one reads1.Two departures from the runbook's flip list
and non-obvious to say (the fabricated history above), and keeping it holds
the dashboard at 84 panels — so the
scripts/check_docs.pypanel-countcoupling the runbook warned about is never triggered.
then self-test, then enable scheduled tests. The third is outstanding, so the
entry stays open with its remaining scope narrowed to that.
Two files the runbook's own list had missed
docs/observability.md's rule-file row, and the runbook itself — its step 3still said in the present tense that the silence was in place.
Also dropped a stale claim while rewriting the
ups.rules.yamlheader: itgrouped
UpsBatteryTemperatureHighwith rules reading "mains-side or load-sidevalues" and called it unaffected, but it reads
upsBatteryTemperature, whichwas fabricated like the rest. Moot now that all of them are real.
Not done here
23:14. It cost nothing because the test passed, but for 29 minutes a faulty
pack would have reported into a suppressed alert — the one failure mode step 3
exists to prevent. Recorded in the runbook's status block as a next-time note.
AlertmanagerNotificationsFailingis still firing.UpsSelfTestFailedisun-silenced, but the urgent receiver still cannot deliver (Fill in the three new notification secrets, then deploy #118 and #119 #120).
docs/images/README.mdrefuses mocked-up images, andmake screenshotsneedsthe decrypted Grafana password.
prometheusandoraclestill go deaf on a mains cut. The rack's ownprotection is all this PR claims.
make validatepasses; gitleaks skipped locally (not installed), CI runs it.Refs #93, #110
🤖 Generated with Claude Code