[design] primitive 設計 確定(2026-06-03)

機能が固まり、「server は content-blind かつ user 情報に極力触れない」を北極星に core primitive を確定。account/group/token/鍵 note(n_01KT4TG8R53K8JCZM0BQC6CSE6)と整合。

## 思想
- core/server = routing + membership ゲート + 認証のみ。鍵を持たず content を一切見ない。
- content 依存操作が要るなら、そのための鍵を持つ別サーバ(実体は鍵を渡された consumer/member)を立てる。core は無知のまま。
- projection(DuckDB 化)は consumer の責務。core は最小の event primitive を提供するだけ。

## 2 primitive
- Entity:id で upsert / delete
- Relation:(source, target, kind) で add / remove
- append-only な記録は「更新されない Entity」(第 3 の形にしない)
- 変化分は kind。新種別 = 新 kind であって新 primitive ではない。

## 封筒 2 段(server を最小知識に)
- routing header(平文・server が見る):ev_id / ts / audience(group)/ namespace
- event header + payload(group 鍵で暗号化・consumer のみ):kind / op / id 類(entity_id / source / target)/ actor / fields
- public(g_public)は暗号化なし=全見え(隠す物が無い)

## corollary
- 属性セットは Entity-upsert に畳む
- mention = projection 計算 / embedding = 外部 import の Entity-upsert(id=post_id)
- validation は write 境界(gateway)で registry スキーマ照合(core は kind/op/payload を見えないので必然)
- 封筒は宣言(event の audience group)、可視性は reader の (token scope ∩ membership)

## audience
- 各 event が routing header に audience を持つ → content-blind routing
- 変更 = 新 audience の upsert、現可視性 = 最新、過去 event は旧 bucket のまま(private→public 再配信は seam)

## server の床と α コミット
- 残る床:membership(group↔DID)+ 認証。これ以下は「鍵所持=アクセス」(membership ゲート撤去)で未採用
- kind/op/id/actor まで暗号化 = server は暗号 group の content 依存操作を一切できない(server-thinning α に完全コミット)
- casualty:claim_goose_jobs(aside n_01KT4KJ4F6819XV65S34VB60KJ)/ delete_group empty-guard 等 → 鍵持ち別サービス(consumer)へ re-home
- public content では server-side 操作は従来通り可能

## registry
- kind ごとの payload 型を language-neutral schema(JSON Schema 等)で 1 定義 → Rust / TS / Python(dataset・学習)が生成、dual 手書き解消。実体は実装時に確定。

関連:account/group/token/鍵 note n_01KT4TG8R53K8JCZM0BQC6CSE6 / claim_goose_jobs aside n_01KT4KJ4F6819XV65S34VB60KJ / server-thinning 方向。