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.
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.
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).