[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 方向。