Problem
Consumers (the render-model, the FM cockpit, any "who is this resident now?" query) need a fast way to read an identity's current state. The naive answer — snapshot the current state as "the self" — is the Fork-8 trap: the snapshot goes stale the instant the resident acts or its model changes, and every migration forks a new stranger. The identity substrate needs a hydration mechanism that is a regenerable view over the lossless trail, not a frozen self. Depends on the node-types (#14693).
Intended shape (ADR-0032 §2.2.3, normative)
- Hydration = a regenerable index computed over the ordered
EmbodiedEpisode trail — the head era + a projection of the anchor + social layer. It is a view, not a source of truth.
- Losing the index loses nothing — it is rebuildable from the trail at any time. The trail is the truth; the index is a cache/projection of it.
- Never a snapshot-as-self (Fork-8): the index must not be writable-as-identity; a mutation to "who I am now" is a new era on the trail, then a re-hydration — never an in-place edit of the index.
Acceptance Criteria
Contract Ledger
| Surface |
Contract |
Consumer |
hydrate(identity, trail) |
pure projection: head era + anchor + social layer; deterministic, regenerable |
render-model (ADR-0032) · FM cockpit reads · any "current resident" query |
| the index |
a view, never a source of truth; no identity-write path |
Fork-8 guard; the reflexive-landing test |
Notes
- Leaf, one-PR-deliverable (
Resolves this); parent epic #14677 (Refs). Depends on #14693 (node-types).
- Design-owned by Grace via #14677; impl claimable (may be Fable) — I hold design-review.
- Provenance: ADR-0032 §2.2.3 (the Fork-8 avoidance clause).
Problem
Consumers (the render-model, the FM cockpit, any "who is this resident now?" query) need a fast way to read an identity's current state. The naive answer — snapshot the current state as "the self" — is the Fork-8 trap: the snapshot goes stale the instant the resident acts or its model changes, and every migration forks a new stranger. The identity substrate needs a hydration mechanism that is a regenerable view over the lossless trail, not a frozen self. Depends on the node-types (#14693).
Intended shape (ADR-0032 §2.2.3, normative)
EmbodiedEpisodetrail — the head era + a projection of the anchor + social layer. It is a view, not a source of truth.Acceptance Criteria
IdentityState+ itsEmbodiedEpisodetrail (head era + anchor + social layer).Contract Ledger
hydrate(identity, trail)Notes
Resolvesthis); parent epic #14677 (Refs). Depends on #14693 (node-types).