diff --git a/docs/ELECTRON-OFFLINE-ENGINE-DESIGN.md b/docs/ELECTRON-OFFLINE-ENGINE-DESIGN.md index 215300fd..70c5590d 100644 --- a/docs/ELECTRON-OFFLINE-ENGINE-DESIGN.md +++ b/docs/ELECTRON-OFFLINE-ENGINE-DESIGN.md @@ -1269,28 +1269,31 @@ stage. primary keys, the purge ordering (key before file), lazy materialisation, and the F1–F49 failure table. -### Open questions for the human +### Open questions for the human — resolved 2026-08-04 -1. **If Stage A item 6 shows an unsigned build loses its Keychain item across updates**, does the - encrypted store ship anyway (re-bootstrapping after each update — bandwidth, not data loss), or - wait on VNCprodbuild step 9 (Apple Developer ID, already a human-owned purchase)? This is the one - Stage A outcome that could change the plan rather than just an implementation detail. -2. **Linux with no keyring (`basic_text`, §6.3.1 / E3):** refuse outright, or offer an explicit - opt-in that records the downgrade? Refusing is the safe default and what this design specifies; - an opt-in is defensible for a single-user machine with full-disk encryption. Affects a real - segment — AppImage users on minimal window managers. -3. **Concrete retention defaults** — `offlineEnvelopeDays` ≫ `offlineBodyDays` and the MB cap on - bodies only are settled (M§2.1); the *numbers* are not recorded anywhere. Two constants; the - design is value-independent. Same open question M ends on. -4. **Does the follow-up in §2.5 (collapse to one socket per account by having the renderer listen to - the local server instead of Stalwart) get scheduled?** It would retire the renderer's WS - circuit-breaker path as dead code and halve the connection count, but it makes a working - notification path depend on the new one, so it is deliberately not in v1. -5. **Should this land as its own PR ahead of the offline engine?** Stage A is pure verification and - §10.3's `app.requestSingleInstanceLock()` (E7) plus §8.4's cooperative quit are improvements to - the shell on their own merits, independent of any offline store. +1. **If Stage A item 6 shows an unsigned build loses its Keychain item across updates** — left open + deliberately; this is an empirical Stage A outcome, not something to decide blind. Resolve once + Stage A actually runs and reports what happens. +2. **Linux with no keyring (`basic_text`, §6.3.1 / E3): refuse outright.** Decided — matches this + design's own "cheapest wrong answer" philosophy (§ discussion of `safeStorage`'s silent-downgrade + landmine): an honest failure beats a store that looks encrypted but isn't. No opt-in path in v1. +3. **Concrete retention defaults: same as the mobile design's defaults.** Decided — + `offlineEnvelopeDays: 365`, `offlineBodyDays: 30`, MB cap on bodies matching mobile's default + (§ mobile M§2.1's shipped numbers). Consistent behavior across platforms for v1; revisit only if + desktop usage patterns actually show it's too narrow — don't widen speculatively. +4. **§2.5 single-socket follow-up: not scheduled for v1.** Stays a gated follow-up as designed — + don't collapse to one connection until the engine's own connection is proven in production. +5. **Stage A as its own PR ahead of the offline engine: not decided separately** — proceed with the + implementation sequence as designed (Stage A is the first step regardless of PR boundaries); the + human can split the PR at merge time if desired, this doesn't block starting work. -None of these blocks starting Stage A. +Also decided: **this design goes through an independent adversarial review next**, matching the +mobile engine's process (design → review → implementation), before any implementation code is +written — same reasoning as before: this is the same class of highest-stakes, hardest-to-undo +component (a persistent, encrypted, multi-account local store), and the review process caught real +critical bugs in the mobile design that this document's own author-side verification did not. + +None of these blocks starting the review. ---