Skip to content

docs(ups): record a battery that is proven, and what still is not - #160

Merged
Gerrrt merged 1 commit into
mainfrom
claude/ups-battery-proven-4299dc
Aug 29, 2026
Merged

docs(ups): record a battery that is proven, and what still is not#160
Gerrrt merged 1 commit into
mainfrom
claude/ups-battery-proven-4299dc

Conversation

@Gerrrt

@Gerrrt Gerrrt commented Aug 28, 2026

Copy link
Copy Markdown
Owner

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

Metric Pre-fit baseline Now
upsTestResultsSummary 4 aborted 1 donePass, at 22:45 UTC
upsBatteryVoltage 480, fixed 543546, varying
upsEstimatedMinutesRemaining 63, fixed moves
upsEstimatedChargeRemaining 100 100

That is step 5's comparison, the part the management card cannot fake. The
silence 54f1715c reads endsAt 2026-08-28T23:14Z instead of its original
2026-09-20, so it was deleted rather than left to expire, and
UpsSelfTestFailed is live again.

Charge still reading exactly 100 is, on its own, the fabrication signature the
previous 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:

  • 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

  • The banner panel is rewritten, not 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 scripts/check_docs.py panel-count
    coupling the runbook warned about is never triggered.
  • Replace the UPS battery, then delete the silence and enable scheduled self-tests #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 — its step 3
still said in the present tense that the silence was in place.

Also dropped a stale claim while rewriting the ups.rules.yaml header: 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.

Not done here

  • The order was inverted on the night. Self-test 22:45, silence deleted
    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.
  • AlertmanagerNotificationsFailing is still firing. UpsSelfTestFailed is
    un-silenced, but the urgent receiver still cannot deliver (Fill in the three new notification secrets, then deploy #118 and #119 #120).
  • The screenshot stays as it is. It is an honest render of 2026-08-22,
    docs/images/README.md refuses mocked-up images, and make screenshots needs
    the decrypted Grafana password.
  • Rack the shelf switch in U4 — buy it with the UPS pack #110 is untouched. The shelf and switch move did not happen, so
    prometheus and oracle still go deaf on a mains cut. The rack's own
    protection is all this PR claims.

make validate passes; gitleaks skipped locally (not installed), CI runs it.

Refs #93, #110

🤖 Generated with Claude Code

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>
@Gerrrt
Gerrrt merged commit 1aa0858 into main Aug 29, 2026
3 checks passed
@Gerrrt
Gerrrt deleted the claude/ups-battery-proven-4299dc branch August 29, 2026 00:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant