Runtime resilience: survive OpenBao being unavailable #40
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Execution tracking for the plan at
obsidian/Personal/Projects/edge-router/plans/2026-10-20-runtime-resilience.md(design:
specs/2026-10-20-runtime-resilience-and-error-attribution-design.md, Part 1).ER currently aborts startup when OpenBao is sealed or unreachable, so on a host
where it owns :443 every unrelated route dies with it and stays dead until a
human notices and restarts it. The rule being implemented: a failed dependency
fetch degrades; a failed local precondition exits.
Phase A — tombstone + #38
CertEntryenum inSniResolver;resolvereturnsNonefor a tombstone instead of substituting the fallback certPhase B — degraded startup and retry
managed_cert::load_allreports per-cert failures instead of abortingBAO_BROKER_SOCKETmessage, #34)Phase C — config reload
Phase D — signalling (do not ship A-C without this)
GET /healthliveness, admin host, no authGET /readyper-apex availability detail, admin host, authenticatedsd_notify—READY=1once sockets are bound even when degraded,STATUS=carries the degraded textCLAUDE.md,README.md, example config)Acceptance
openssl s_client -servername <apex>fails the handshake and does not return anedge-router.localcertificate — verified against a running binarycargo fmt --check, CI greenPart 2 of the spec (error attribution, #37) is a separate plan and issue.
Superseded in large part. The TPM, OpenBao and at-rest encryption removal (spec
2026-10-22-remove-tpm-openbao-encryption-design.md, branchfeat/per-name-acme-httpreq) deletes the dependency this issue was about, so most of its phases no longer have a reason to exist.Done, on that branch:
/health(admin-host gated, unauthenticated, because a probe carries no key) and/ready(authenticated, per-name JSON with expiry and last error). Pulled forward deliberately: the tombstone without readiness reporting is a regression, since ER would report healthy while refusing handshakes.No longer applicable:
What the resilience thinking turned into instead: a missing httpreq endpoint is not a boot failure but a certificate that quietly fails to renew on a 60-day timescale. So renewal happens at 30 days remaining with jittered capped backoff, a valid certificate keeps serving while its renewal fails, and
/readyreports degraded only inside 14 days — failing readiness a month early would be the worse outcome.Leaving this open until the branch merges, then it closes.
Overtaken by v2.0.0 — closing, with the one surviving item already tracked elsewhere.
The premise is gone: ER has no OpenBao dependency at startup at all.
[[managed_cert]]and the encrypted certificate store were removed, so Phase B (B1–B3, "an unreachable OpenBao no longer aborts startup") has nothing left to degrade. A sealed Bao can no longer affect ER's boot.Shipped from the rest of the plan:
CertEntrywith tombstones,resolvereturningNonerather than substituting the fallback. Closed #38. Extended since: a tombstone no longer shadows a covering wildcard (#52).GET /health(liveness, unauthenticated) andGET /ready(per-name certificate state, admin, authenticated).CLAUDE.md,README.mdand the example config.Not done, and carried:
?).sd_notify— never implemented, and no longer part of a resilience story since there is no degraded-startup state to signal. Worth its own issue if ER is to run natively under systemd on Kyoshi; not filing one speculatively.Closing rather than rewriting: the issue tracks a plan whose central phase no longer exists.