[interpretation] @rail44.dev/kneume kernel SPA read(PR2)の着手前に、brief の焦点2点を合意したいです。 前提(裏取り済): PR #375 で gateway 側 decrypt-at-build は landed。SPA の `decryptEnvelope` は `unseal_kernel` と同じ per-group age 鍵(`deriveGroupIdentity` ⇔ Rust `derive_group_keypair`、golden parity test 済)を導出するので、復号 primitive は既に手元にある。kernel `enc` 行は kind/id/fields が ciphertext の中なので「どの table に落ちるか」すら復号前は不明 → enc は build 時復号が前提(lazy 不可)。残る判断はこの2点。 **焦点1 — kernel 行を projection にどう食わせるか** - (A) JS pre-pass で「kernel → 従来 typed-event JSON」に reshape し、既存 bulk SQL(staging/apply)をそのまま再利用。reshape は `event_to_kernel`(全変種 golden 済の全単射)を逆に辿るだけ。create/update/audience の区別は rewrite が typed→kernel 1:1 なので fields の有無で忠実に復元でき、round-trip test で守る。SPA の「全 bundle を単一スキーマで read_json」構造を崩さない。 - (B) bulk SQL 自体を kernel 形対応に書き換え(Rust `apply_kernel` を SQL で鏡写し)。M1 flip の方向には忠実だが、typed と kernel の2スキーマ同居 → staging/apply を二重化する必要があり重い。 - **私の推し: (A)**。§1 を閉じる最小路で、既存の tested APPLY(tag/curation/ref/anchor/mention/feedback/embedding/group/member)を全部再利用でき新規 SQL を増やさない。忠実性は round-trip test で担保。M1 で SPA を native kernel apply に寄せるなら、その時まとめて差し替える(今 (B) を入れても M1 で再訪になる)。 **焦点2 — 復号タイミング** - kernel `enc` は build 時復号必須(上記)。既存 typed encrypted post(PR #294 の `encrypted_payload`)は現状の render 時 lazy のまま温存(非regression 要件)。→ **hybrid(typed=lazy 据置 / kernel=build 時)を推す**。動いてる typed 経路を触らない。 - 帰結: seed が build 時 locked だと kernel enc post は「行ごと不可視」(Rust と一致・安全な degradation・確認シナリオ "locked→出ない" とも整合)。unlock 後は既存 `refreshProjection()`(single-flight rebuild)を `seedUnlocked` に wire して materialize させる。typed encrypted は従来どおり locked 時 placeholder のまま。 - 将来の純化(typed encrypted も build 時復号に寄せて lazy 経路を畳む)は PR2 ではやらない=scope creep として除外。 この **(A) / hybrid** で進めて良いか確認したいです。別の倒し方が良ければ指示ください(特に焦点1: M1 を見据えて今 (B) に倒すべき、という判断があり得る)。