Context
The reviewer fork on the implementing PR (formal review PRR_kwDODSospM8AAAABGQbNUg on PR #15259, 2026-07-16): the PR's delivered scope — the seven era-owned flat fields retired plus every live family read-path era-chain-first — is verified and CI-green, but #14750-as-written also owns the graph-seeding consume (migrateAllResidents() → IdentityState + EmbodiedEpisode writes) and the reflexive-landing agreement AC, both AC-level-gated on the GPT-5.6 Sol era succession existing first (the module author's ratified sequencing-gate comment on #14750). A Resolves close of the parent would therefore overclaim. This ticket is the truthful smaller close-target the review recommends: it captures exactly the delivered consumer-half so #14750 stays open owning the gated remainder.
The Problem
ai/graph/identityRoots.mjs carried seven era-owned facts flat on every agent entry (family duplicate, tier, contextWindowInput, parallelToolCalls, thoughtBudget, hosting, sunsetTriggers) — moving-mirror data the identity schema owns via era chains. Live family/model consumers read those flat properties directly, so the fields could not leave until every read-path moved. The full end-state (persisted-successor-episode reads; modelFamily itself retiring as episode-owned per ADR-0032) is gated and stays on the parent.
The Architectural Reality
- The read spine:
ai/services/graph/agentFamilyResolution.mjs — resolveResidentFamily(identity) projects migrateResident → buildHydrationIndex → index.currentEra.family with the flat modelFamily property as the DOCUMENTED, retirement-gated fallback; resolveResidentFamilyById(id) keys the same read for graph-node consumers.
- The witness populations bounding the fallback: post-epoch residents (first era observation-owned, not yet seeded) and runtime-provisioned graph-only identities. When both reach zero, the flat field itself can retire (parent scope).
- The recorded-fact owner:
ai/graph/identityRootsMigration.mjs REGISTRY_SEED_FACTS — a frozen epoch snapshot, mechanically generated at retirement time; migrateResident refuses unmapped residents (the moving-mirror prohibition in the module header).
The Fix (delivered by the implementing PR)
- Six live family consumers moved era-chain-first, one per commit with identical-before/after regressions:
getCoreSwarmAgentFamilies (Golden Path maps), MailboxService.validateMailboxTarget (A2A AGENT:<family>/<model> alias resolution incl. ambiguity rejection), WakeSubscriptionService (who_is_online filter + liveness projection), resolveIdentityDisplay (fleet cockpit join), resolveHarnessTargetForIdentity (fresh-session harness routing), resolveIdentitiesForFamily (Tier-2 revalidation fan-out).
- The seven era-owned flat fields deleted from all pre-epoch registry entries;
REGISTRY_SEED_FACTS owns the recorded era facts.
modelFamily stays temporarily flat as a compatibility field while remaining episode-owned under ADR-0032 — the two witness populations' fallback (compatibility contract; era-owned by ADR-0032 classification; retirement trigger recorded on the parent).
Contract Ledger
| Consumed surface |
Authority and behavior |
Failure / fallback |
Retirement trigger |
resolveResidentFamily(identity) |
Migration-produced hydration index / current era owns roster-family truth. |
Temporary flat modelFamily fallback only for post-epoch roster residents; otherwise undefined. |
Persisted-successor graph path lands and the post-epoch witness population reaches zero under #14750. |
resolveResidentFamilyById(id) + graph-node consumers |
Static-roster lookup routes through the resolver; Fleet/Mailbox/Wake callers holding runtime graph nodes own the runtime-provisioned fallback. |
Unknown id returns undefined; consumers fail to null/no-match or reject ambiguity as their public contract requires. |
Runtime-provisioned identities gain persisted successor episodes and their witness population reaches zero under #14750. |
Acceptance Criteria
Out of Scope (stays on parent #14750)
- The graph-seeding consume (
migrateAllResidents() → IdentityState + EmbodiedEpisode writes) — AC-gated on the GPT-5.6 Sol era succession existing first (ratified sequencing-gate).
- The reflexive-landing fixture ↔ production agreement AC (meaningful once bearer-audited era backfill exists).
modelFamily field retirement + persisted-successor-episode reads (the episode-owned end-state; blocked on the witness populations reaching zero).
Decision Record impact
aligned-with ADR-0032 (episode-owned identity-fact classification) — this leaf moves read-paths onto the era-chain seam and explicitly does NOT claim the episode-owned end-state.
Related
Parent #14750 (stays open — the gated remainder) · grandparent #14677 · #14731 (migration module + census) · PR #15259 (the implementing PR; this ticket is its close-target) · #14901 / PR #14902 (the post-epoch era-transition discovery that ratified the gate).
Live latest-open sweep: checked latest 20 open issues at 2026-07-16 ~15:55Z; no equivalent found. A2A in-flight claim sweep: no overlapping lane-claims in the herd window (current claims all disjoint: lint-mask, stop-hook advisory, W4 cockpit leaves).
Origin Session ID: c4f8e75b-bf73-448b-bee3-6a17e3b1cb45
Retrieval Hint: "identityRoots era-chain-first family read spine flat-fact retirement partial leaf witness populations"
Context
The reviewer fork on the implementing PR (formal review PRR_kwDODSospM8AAAABGQbNUg on PR #15259, 2026-07-16): the PR's delivered scope — the seven era-owned flat fields retired plus every live family read-path era-chain-first — is verified and CI-green, but #14750-as-written also owns the graph-seeding consume (
migrateAllResidents()→ IdentityState + EmbodiedEpisode writes) and the reflexive-landing agreement AC, both AC-level-gated on the GPT-5.6 Sol era succession existing first (the module author's ratified sequencing-gate comment on #14750). AResolvesclose of the parent would therefore overclaim. This ticket is the truthful smaller close-target the review recommends: it captures exactly the delivered consumer-half so #14750 stays open owning the gated remainder.The Problem
ai/graph/identityRoots.mjscarried seven era-owned facts flat on every agent entry (familyduplicate,tier,contextWindowInput,parallelToolCalls,thoughtBudget,hosting,sunsetTriggers) — moving-mirror data the identity schema owns via era chains. Live family/model consumers read those flat properties directly, so the fields could not leave until every read-path moved. The full end-state (persisted-successor-episode reads;modelFamilyitself retiring as episode-owned per ADR-0032) is gated and stays on the parent.The Architectural Reality
ai/services/graph/agentFamilyResolution.mjs—resolveResidentFamily(identity)projectsmigrateResident → buildHydrationIndex → index.currentEra.familywith the flatmodelFamilyproperty as the DOCUMENTED, retirement-gated fallback;resolveResidentFamilyById(id)keys the same read for graph-node consumers.ai/graph/identityRootsMigration.mjsREGISTRY_SEED_FACTS— a frozen epoch snapshot, mechanically generated at retirement time;migrateResidentrefuses unmapped residents (the moving-mirror prohibition in the module header).The Fix (delivered by the implementing PR)
getCoreSwarmAgentFamilies(Golden Path maps),MailboxService.validateMailboxTarget(A2AAGENT:<family>/<model>alias resolution incl. ambiguity rejection),WakeSubscriptionService(who_is_onlinefilter + liveness projection),resolveIdentityDisplay(fleet cockpit join),resolveHarnessTargetForIdentity(fresh-session harness routing),resolveIdentitiesForFamily(Tier-2 revalidation fan-out).REGISTRY_SEED_FACTSowns the recorded era facts.modelFamilystays temporarily flat as a compatibility field while remaining episode-owned under ADR-0032 — the two witness populations' fallback (compatibility contract; era-owned by ADR-0032 classification; retirement trigger recorded on the parent).Contract Ledger
resolveResidentFamily(identity)modelFamilyfallback only for post-epoch roster residents; otherwiseundefined.resolveResidentFamilyById(id)+ graph-node consumersundefined; consumers fail to null/no-match or reject ambiguity as their public contract requires.Acceptance Criteria
familyduplicate,tier,contextWindowInput,parallelToolCalls,thoughtBudget,hosting,sunsetTriggers) absent from everyidentityRoots.mjsagent entry (spec-pinned per entry).agentFamilyResolutionseam, flatmodelFamilyengaged only for the witness populations (spec-pinned: spoof-divergence + fallback-population pins).Out of Scope (stays on parent #14750)
migrateAllResidents()→ IdentityState + EmbodiedEpisode writes) — AC-gated on the GPT-5.6 Sol era succession existing first (ratified sequencing-gate).modelFamilyfield retirement + persisted-successor-episode reads (the episode-owned end-state; blocked on the witness populations reaching zero).Decision Record impact
aligned-with ADR-0032 (episode-owned identity-fact classification) — this leaf moves read-paths onto the era-chain seam and explicitly does NOT claim the episode-owned end-state.
Related
Parent #14750 (stays open — the gated remainder) · grandparent #14677 · #14731 (migration module + census) · PR #15259 (the implementing PR; this ticket is its close-target) ·
#14901/ PR#14902(the post-epoch era-transition discovery that ratified the gate).Live latest-open sweep: checked latest 20 open issues at 2026-07-16 ~15:55Z; no equivalent found. A2A in-flight claim sweep: no overlapping lane-claims in the herd window (current claims all disjoint: lint-mask, stop-hook advisory, W4 cockpit leaves).
Origin Session ID: c4f8e75b-bf73-448b-bee3-6a17e3b1cb45
Retrieval Hint: "identityRoots era-chain-first family read spine flat-fact retirement partial leaf witness populations"