Pre-mortem-risk → mitigating-seam map
Six failure modes were pre-mortem’d during architecture (mid-2027 hindsight); each one’s prevention is a binding architectural constraint, not a hope. This table maps each risk to the seam or mechanism that parachutes it and where that mechanism lives.
This is the seed map (Story 0.7). Story 6.4 keeps it complete and current as the architecture evolves (AR-21). Source: architecture.md §"Pre-mortem-Hardened Mitigations" and §"Architectural Commitments Added".
| Risk | Failure mode | Mitigating seam / mechanism | Lives in |
|---|---|---|---|
M1 |
The MMDVMHost engine port is the critical path — if it slips or misbehaves, nothing else matters |
|
|
M2 |
Update rollback is the least-tested path — a bad update bricks a headless box |
systemd |
|
M3 |
Onboarding network bring-up is the riskiest surface — regdom/AP/STA ceremony on real radios |
|
|
M4 |
BM API-key blast radius — the key grants full SelfCare control |
Key handling is opt-in / transient-by-default (prefer re-entry over storage); secrets are |
|
M5 |
Bus-factor-1 — a solo maintainer is a single point of failure |
The zero-hardware seam-fake harness doubles as the contributor on-ramp (AR-17): one seam fixable against fakes with no whole-system knowledge, runnable with zero hardware; the ADR set + this map + |
|
M6 |
Leptos freeze — the frontend framework stalls on a future toolchain |
Written trip-wire: if Leptos won’t build on stable Rust within a bounded window after a breaking toolchain change → evaluate Dioxus migration; pinned |
|
Reading this map
-
"Lives in" names the crate/path and the owning epic/story, so a maintainer can jump from a risk to the code that addresses it and to the work that completes it.
-
Two of the six (M1, M3) — plus the BM-client live-auth-header leg, which is a Bench Spike 0 concern but not one of the six pre-mortem risks — are gated on Bench Spike 0 (Story 0.8, leg (e)) — the hardware spike that retires the unverified joints before broad build-out.
-
Where a risk’s mitigation is itself a closest-call decision, it carries an ADR (M4 → ADR-006, M6 → ADR-005); the rest are tracked in their epics.