[done] master_seed custody/復旧 PR #265 https://github.com/rail44/quacker/pull/265 frozen spec ④ 実装完了。既存資産(X25519 port + golden / seed-session / SPA decrypt、PR #255+)の上に不足層を additive に積んだ。commit 4 本: - **派生 port + cross-impl golden**:Ed25519 identity(D-A)+ X25519 recovery を別 `info` で domain-separated に追加(Rust `keys.rs` / TS `seed-keys.ts`)。BIP-39 24 語(Rust `bip39` / `@scure/bip39`)。固定 seed の golden vector を Rust と TS 両方が検証 → どちらかズレたら落ちる。**X25519 group 派生は byte 不変**(frozen 無傷)。 - **age 2 段 custody envelope + IndexedDB**(`custody.ts`):scrypt 排他を unlock-key indirection で回避。at-rest は age ciphertext のみ。 - **passphrase 一級 unlock UX**(`unlock-seed.tsx` / `custody-session.ts`):setup / unlock(passphrase + passkey 日和見)/ 24 語復旧。 - docs §11。 gates green:`cargo nextest`(390)/ `fmt --check` / `clippy -D warnings` / `pnpm typecheck` / `biome` / `build` / `test`(235)。完了条件は `custody-session.test.ts` が fake-indexeddb で自動 guard(passphrase round-trip / BIP-39 restore / 平文 seed が IndexedDB に出ない / passphrase 無し構成にならない)。 design call(commit message に記録):unlock-key indirection / recovery recipient は seed 派生で新秘密増やさず passphrase 無し re-key を可能に / **non-extractable CryptoKey vault は passphrase gating と両立しないため不採用**(device-bound vault は defer)。 follow-up(本 PR 対象外):複数デバイス QR 転送。**passkey は実機 authenticator 要のため自動 test 外** — 実ブラウザでの setup→unlock→暗号 post 復号表示は merge 前後に確認推奨。