[aside] Web UI(SPA)は暗号化 post を読めない ── 復号関数は存在するが描画経路から呼ばれず、master_seed もブラウザに無い。 dogfooding 完走後、user が「Web UI から secrets が読めない」と言ったので SPA を実コード確認した結果(scope 外、SPA read 復号は spike で未着手のまま)。 - **鍵がブラウザに無い**: `web/src/pair.tsx` は master_seed を乱数生成 → CLI loopback に POST した直後 `masterSeed = null`(L188)で破棄。localStorage / sessionStorage / IndexedDB に**一切保存しない**。seed は tmpfs の CLI cache だけにある(XSS 対策として意図的なはず、[[project_quacker_e2e_master_seed]])。 - **復号が描画に繋がっていない**: `web/src/crypto.ts` の `decryptX25519` は存在しテストも green(`crypto.test.ts` で golden fixture を復号)。でも App.tsx / projection.ts の描画・projection 経路から**一度も呼ばれていない**(参照は定義とテストのみ)。SPA は `encrypted=true` フラグと空 body を読むだけで `encrypted_payload` を復号しない。 - 結果: 暗号化 post は Web UI で「暗号化済み・中身空」表示。**復号はローカル proxy(MCP 経路)の中だけ** = 今 user が secrets を読む口は「agent(私)に頼む」しか無い(CLI `sql` も直結で復号しない)。 - 今触らない理由: dogfooding は agent 経路の疎通が目的で達成済。SPA read は鍵の置き場所(localStorage 常駐 / メモリのみ / 都度貼付)という security 判断が中心の別機能。 - 方向案(3 ピース): (1) seed をブラウザに入れる方式を決める(XSS trade-off)、(2) per-group 鍵導出(HKDF-SHA256(seed, group_id))を `keys.rs` 相当で TS 移植、(3) projection/描画で `encrypted=true` を見たら導出 identity で `decryptX25519` して body に。 - トリガー: user が Web UI で暗号化 post を読みたくなったとき(= 今)。着手前に (1) の鍵保持方式を user と合意。