E2E 暗号化が現状ほぼ client 任せで、直結 client や SPA に穴がある。triage で散在していた aside を畳んだ umbrella タスク。

- **SPA**: 暗号化 post を復号して描画できない(復号関数はあるが描画経路未接続、master_seed もブラウザに無い)
- **server**: encryption-enabled group への平文投稿を拒否しない(CLI/API が平文を silently 流せる)
- **write 経路**: `update_post` の暗号化 write が未配線(PR #250 は create_post だけ直した片割れ)
- **seed custody**: pair.tsx(CLI handoff)と browser が master_seed を別フローで独立管理(食い違う seed を作れる)

畳んだ source aside(closed): n_01KSZBYKX4 / n_01KSZBYC3F / n_01KSZ9K228 / n_01KSZSY88K

---
**解決 (2026-06-01, PR #294)** ── 「穴」は全て閉じた:
- **SPA 復号描画**: ✅ 既出(`post-card.tsx` → `seed-session.ts` の `decryptEnvelope` で復号描画済)
- **server 平文拒否**: ✅ PR #294。`create_post` が encryption-enabled group 宛の平文 body を拒否(content-blind、復号しない)。`import_embedding` も暗号化 post への vector を拒否。E2E が「client 任せ」から「**server が保証する不変条件**」に。
- **SPA write**: ✅ PR #294。composer / reply / anchor-comment が client-side 暗号化(`web/src/post-encrypt.ts`)。`list_groups`→`encryption_enabled` / `list_group_members`→`member_pubkey` 露出。
- **update_post 暗号化 write**: ⏸ defer。今は server が暗号化 group の post 編集を拒否する seam のみ(平文 leak はしない=穴ではない)。本格対応(`PostUpdated` に `encrypted_payload`)は aside **n_01KT13ZZRJK3JJ6P10BWVGR3E9** で追跡。
- **seed custody**: ✅ PR #265(custody)で seed 単一管理済。

残課題は「暗号化 post の編集」feature(穴ではなく機能欠落)のみで aside に切り出したため、本 umbrella は done。