MainsKeeper Product & System Guide Edition 0.2.3

Reference · review this round

Decision register

Items that must not become “decided” merely because a diagram needed a box. Prioritize the Open rows in design review.

Backend runtime & service topology

Single process vs split ingest/query/notify. Logical components can merge for MVP.

Consequence: Affects ops complexity and failure isolation.

Open

Durable storage engine and retention tiers

Observation-time history and Battery Assurance evidence have to survive restarts. The engine and the retention windows are still unchosen.

Consequence: The prototype’s 7-day history screen is a fixture limit. Host buffer examples (disk cap, about 30 days) are design illustrations, not a support promise. Compare alternatives.

Open

Storage alternatives

Question to resolve

Where do observation-time history and Battery Assurance evidence live, and which retention window applies to the local buffer, current state, operational history, and the Assurance record?

Dependencies. Replay, incident recovery, and the Broadwater outage need a durable accept before the collector retires rows. The prototype’s 7-day screen and any “about 30 days” host sketch are not that decision.

Next evidence. A one-page retention proposal with those four windows and a sample volume at the Broadwater cadence. No vendor price is required to choose a shape.

Any engine has to keep observation time distinct from receipt time, leave gaps empty, dedupe a collector sequence, and retain Battery Assurance evidence after chart history is shortened. Browser localStorage in the prototype is fixture state for the UI. It is not one of the options below.

Relational record plus an observation log Recommendation

Fits when. A Broadwater-scale pilot grows into a fleet, and sites, collectors, UPS assets, battery installations, incidents, and findings need stable identities.

Consequence. Current state stays a small latest-reading table. Raw observations can use a longer or shorter clock than incidents. You operate one database family, with a migration path if the pilot starts on a single node. Downsampling must keep unknown time as unknown.

Single-file embedded store Open

Fits when. The first build serves one site, one operator, and a backup story that is “copy the file.”

Consequence. Enough for a Broadwater-shaped pilot if retention stays modest. Moving later to a server engine is a migration project. Concurrent dashboard writes and collector ingest share one process, so backup and upgrade need a quiet window.

Time-series engine for readings, relational store for the rest Open

Fits when. Range queries and rollups dominate, and incidents plus Assurance stay in a system of record.

Consequence. Two systems to run. A metrics database filled by scraping current gauges is a different path: scrape does not replay an outage gap. See the replay sequence and monitoring choices.

Object archive of raw batches, plus a query index Open

Fits when. You want the original upload batches kept for audit longer than the dashboard’s hot window.

Consequence. Replay and “what did the collector send?” are straightforward. Day-to-day screens need the index. Partial batch failure and local overflow still have to appear as gaps. This option does not choose a vendor, and it does not settle Cloudflare or any other edge (d4).

Retention tiers

Tiers are separate from the engine. The handoff does not set production policy. The notes below are recommendations for review.

Local buffer
Unacknowledged observations on the collector. Overflow drops the oldest and must show a gap. ESP32 flash-ring figures stay illustrative. Host examples in the fixture used a disk cap and about 30 days — treat that as a design sketch.
Current state
Latest reading, freshness, and contact. Small, and replaced in place. A missing value stays missing.
Operational history
Power events, incidents, and replayed series, written at observation time. Choose a window long enough to reconstruct an incident. The prototype’s 7-day history UI is not that window.
Assurance record
Installations, evidence, and findings. Keep them for the life of the UPS record and its replacement chain, even when chart history is shorter. Old-battery evidence stays stored and does not qualify the new installation.

Production authentication provider

The handoff’s UI explores Cloudflare Access with GitHub, and the static sign-in is simulated. There are no application-local passwords in that concept. The provider is not locked.

Consequence: Operator login, collector credentials, and UPS secrets are three different boundaries. Compare alternatives.

Proposed

Authentication alternatives

Question to resolve

How does an operator prove identity, without moving collector credentials or UPS secrets off their current boundaries?

Dependencies. Incident acknowledgement and Assurance resolution need an actor. Scrape-only sites might not. Collector enroll and revoke stay as they are either way.

Next evidence. Name the identity provider for the pilot, or explicitly accept Cloudflare Access with GitHub for that pilot only. Session length and how the CLI logs in are part of the same decision.

Changing the operator provider does not move NUT or SNMP secrets off the collector, and it does not change enroll behaviour: a short code (design lifetime 10 minutes; synthetic example WDJB-MJHT), a device credential stored locally, revoke rejects later uploads, and re-enroll keeps history.

Cloudflare Access with GitHub Proposed

Fits when. Operators should have no password inside MainsKeeper, and Cloudflare in front of the dashboard is acceptable.

Consequence. Dashboard sign-in depends on GitHub and Cloudflare Access. Collector ingest can still use the device credential on another path. Choosing this UI concept does not by itself place telemetry, storage, or DNS on Cloudflare (d4 stays open).

OIDC against an identity provider you already run Recommendation

Fits when. The Broadwater pilot should not depend on Cloudflare, and people already sign in somewhere else.

Consequence. Same “no local passwords” outcome. You still decide session length, how the CLI proves an operator, and what the dashboard does while the identity provider is unreachable. No vendor is implied until one is named in review.

Application-local passwords

Fits when. No identity provider is available at all.

Consequence. Conflicts with the explored UI, which has no local passwords. Adds storage, reset, and shared-account problems the design avoided. Recorded here so review can reject it on purpose.

Network restriction only Open

Fits when. A standalone Prometheus scrape on a trusted network needs a boundary, and that path has no dashboard accounts. Scrape authentication itself is still open on the metrics interface.

Consequence. An access list cannot record who acknowledged an incident or who resolved an Assurance finding. It is a poor fit for the centralized product path, and it does not replace the collector credential.

Cloudflare / edge placement

Do not treat any diagram box as a Cloudflare commitment.

Open

Tailscale or other network bridge

Optional aid for reachability; not required by product semantics.

Open

Standalone scrape versus centralized rollout

Both share collectors. Scrape does not recover history. Centralized fleet UX is the product direction, and the rollout choice is still open. Compare alternatives.

Consequence: A hybrid can be per site. It does not settle storage or auth.

Open

Rollout alternatives

Question to resolve

Which sites, if any, stop at current-state scrape, and which sites get enrollment, replayed history, alerts, and Assurance?

Next evidence. Say whether the Broadwater pilot must reconstruct the outage walkthrough after a WAN loss. If it must, scrape-only is not sufficient for that site.

Standalone Prometheus and Grafana Proposed

Fits when. An existing metrics stack already has an audience, and the job is current gauges.

Consequence. Outage gaps stay gaps. There is no enrollment UX, no Assurance finding, and no replay. Local buffering is still worth doing if you later want history. Depends on a scrape authentication choice (metrics interface).

Centralized MainsKeeper platform Accepted as product direction

Fits when. Fleet view, history, alerts, and Assurance are the product being evaluated.

Consequence. You still owe storage (d2), operator login (d3), and a runtime (d1). Accepting the product direction does not accept Cloudflare, a database, or a deploy topology.

Hybrid, per site Recommendation

Fits when. Broadwater should prove replay and alerts, while another site keeps today’s Grafana boards.

Consequence. Collectors stay the same kind of agent. Operators must be able to tell a scraped gauge from a replayed history. Figure 14 draws both paths and leaves the open boxes unconnected.

ESP32 validated hardware matrix

Board, UPS, and flash budget are unvalidated. Compare alternatives.

Consequence: Do not market sample retention numbers. Broadwater’s Pi does not close this.

Open

ESP32 validation alternatives

Question to resolve

Which boards and which UPS models may be described as supported, and at what cadence their flash actually holds the unacknowledged span?

Next evidence. A measured flash budget, a retention run at the chosen interval, and a USB-HID read against each candidate UPS. No full NUT stack is in scope for this probe.

Defer claims until that list exists Recommendation

Fits when. The Broadwater pilot is a Pi, which it is, and Shop’s probe must not be marketed from fixture numbers.

Consequence. Platform targets still include a validated ESP32. The pilot checklist does not gate on it. Fixture figures stay labelled illustrative.

Ship an image with the illustrative label Open

Fits when. Someone needs a hardware spike before the list exists.

Consequence. Every screen and diagram that shows a sample retention number has to keep the pending label. A spike is not a compatibility promise.

Drop ESP32 from the first release Open

Fits when. No board is available to measure.

Consequence. Equipment-only sites then need a Pi or another host. The product target does not disappear just because the first release skips it. Do not redraw Chapter 2 as if the pattern was rejected.

Notification channel set

Email/push appear in fixtures; production channels undecided.

Proposed

UniFi / modem vendor integrations

Extensions only; generic connectivity targets remain.

Proposed

API transport & schema registry

CLI JSON shapes guide intent; HTTP schemas illustrative.

Proposed

Distribution & update mechanism

Signed pkg/msi/rpm/Pi image/ESP32 flash pipeline.

Consequence: Platform targets Accepted; ship vehicle Proposed.

Proposed

Broadwater pilot success criteria

The recommended pass is the Pi and two UPS sources, checked against the checklist and the outage walkthrough. Compare alternatives.

Consequence: There is no commercial pilot program in the handoff. A finished checklist does not lock storage, auth, or other platforms.

Recommendation

Pilot-scope alternatives

Question to resolve

What must pass before Broadwater is considered to have exercised the design, and what is explicitly not settled by that pass?

Next evidence. Walk the outage story and the 21 checks against a build. Checkbox marks in this guide are review notes in one browser. They are not that evidence.

Pi witness and two UPS sources first Recommendation

Fits when. You want enroll, mixed USB and network reads, revoke, replay, and one battery replacement before more platforms.

Consequence. macOS, Windows, Fedora, and ESP32 remain targets. Their order is not decided here. Storage, auth, and edge stay open even if every box is checked.

All five platforms before any site is called done Open

Fits when. A release is not allowed to omit a target that the design already names.

Consequence. Broadwater cannot finish while ESP32 validation is open. That couples a site pilot to d7 and will wait on hardware that this site shape does not use.

Lab fixtures only Open

Fits when. No site is available and the goal is contract tests.

Consequence. You can prove replay rules with synthetic clocks. You will not learn whether the Pi, the UPS cables, or the operator’s reading of contact-lost match the guide. Do not report fixture output as Broadwater measurements.

Most need review now: the question and next evidence on storage (d2), which operator identity provider (d3), Prom-only versus platform rollout (d6), ESP32 validation scope (d7), and whether the Broadwater checklist is the acceptance pass you want (d12).