[aside] gateway の暗号化 read 経路(posts_view → decrypt overlay)を LocalSql 込みで一気通貫に通す test が無い ── #332 が住んでいた seam がテスト空白のまま
#332/#333 修正(PR #346)で気付いた、今回の追加 test でも埋めきれていない gap。
- 事実: 暗号化 post の本番 read 経路は `LocalSql.query("… FROM posts_view")` → `apply_run_sql_overlay` の合成。だが既存 + 今回追加の test はこの鎖を一度も通さない:
- `tests/proxy.rs` = MockUpstream + 手書き JSON 行(実 `LocalSql` projection を使わない)
- `local_sql.rs` test = 空 projection への `SELECT * FROM posts_view`(暗号化 post を fold しない)
- `projection.rs` test = rusqlite 直で posts_view を引く(overlay を通さない)
- 結果、「実際に暗号化 PostCreated を LocalSql に fold → posts_view を引いて → overlay で復号」を一気通貫で検証する test は 0 件。#332 はまさにこの seam(view が列を project しない × overlay がその列を読む)で発生したのに、合成 test が無いので同型 drift が再び素通りしうる。
触らない判断: 今回は #332/#333 の局所修正が scope。e2e harness(LocalSql に fixture event を fold して overlay まで通す)は別の作り込み。
想定インパクト / トリガー: LocalSql の posts_view 列構成と overlay が読む列の対応が将来ズレると、unit は緑のまま #332-class の body=null が再発。直すなら `local_sql.rs` の test に「暗号化 PostCreated を 1 件 fold → posts_view query → 結果を overlay に通して body 復号 + envelope strip を assert」を 1 本足す(fixture envelope は projection.rs の test と同じ age-v1 を流用)。関連 PR #346、#332。