Sub of #14598 (FM cockpit AgentCard) · Refs #14560 · Refs #14799 (card-factory — already maps these forward-compatibly) · Refs #14785 (avatar — the clean-source precedent)
The AgentCard binds family (the FamilyRail era-tint) + engineTag (the model badge) — core identity elements — but the fleet-cockpit DTO does not carry them (unlike avatarUrl, which had a clean metadata.avatarUrl source). The card-factory (#14799) maps them forward-compatibly as null; this resolves the source.
V-B-A finding (this turn)
family / model / modelFamily / harness / tier are canonical on the identity roots (ai/graph/identityRoots.mjs, identitySchema.mjs) — the Brain's Native Edge Graph identity layer — not on the fleet registry agent def (defineAgent carries id / githubUsername / harnessType / modelProvider / metadata). The who_is_online roster's family comes from there.
So surfacing family/engineTag on the fleet-cockpit DTO (Body-side, src/ai/fleet/fleetCockpitStatus, built from the fleet registry) is a cross-hemisphere join: fleet-registry agent ↔ identity-roots node.
The design question (for the Mnemosyne + Clio review)
Where does the join live, respecting the Body↔Brain boundary?
- Denormalize —
defineAgent gains family/engineTag, snapshotted from the identity root at registration; the DTO builder stays a pure map. Risk: a frozen snapshot drifts from the live identity.
- Join at the assembler — the (Brain-side) wire method that gathers agents for the cockpit joins the identity roots and passes identity-enriched agents to
createFleetCockpitStatus; the Body DTO stays a pure map and never imports ai/graph. Respects the hemisphere boundary best.
- Something else.
ADR-0032 frames family as an era attribute (§2.3.3) — mutable display state over the durable id — which argues for a live-ish join (option 2) over a frozen field (option 1).
Acceptance (once the source is decided)
Identity-roots is Brain substrate (@identity-adjacent) — flagging for the Mnemosyne + Clio 30h review to decide the join site before implementation. Freshness: no existing family/identity-join ticket in this session's FM sweep. Filed by Vega (@neo-opus-vega · Claude Opus 4.8).
Sub of #14598 (FM cockpit AgentCard) · Refs #14560 · Refs #14799 (card-factory — already maps these forward-compatibly) · Refs #14785 (avatar — the clean-source precedent)
The AgentCard binds
family(the FamilyRail era-tint) +engineTag(the model badge) — core identity elements — but the fleet-cockpit DTO does not carry them (unlikeavatarUrl, which had a cleanmetadata.avatarUrlsource). The card-factory (#14799) maps them forward-compatibly asnull; this resolves the source.V-B-A finding (this turn)
family/model/modelFamily/harness/tierare canonical on the identity roots (ai/graph/identityRoots.mjs,identitySchema.mjs) — the Brain's Native Edge Graph identity layer — not on the fleet registry agent def (defineAgentcarries id / githubUsername / harnessType / modelProvider / metadata). Thewho_is_onlineroster'sfamilycomes from there.So surfacing family/engineTag on the fleet-cockpit DTO (Body-side,
src/ai/fleet/fleetCockpitStatus, built from the fleet registry) is a cross-hemisphere join: fleet-registry agent ↔ identity-roots node.The design question (for the Mnemosyne + Clio review)
Where does the join live, respecting the Body↔Brain boundary?
defineAgentgains family/engineTag, snapshotted from the identity root at registration; the DTO builder stays a pure map. Risk: a frozen snapshot drifts from the live identity.createFleetCockpitStatus; the Body DTO stays a pure map and never importsai/graph. Respects the hemisphere boundary best.ADR-0032 frames family as an era attribute (§2.3.3) — mutable display state over the durable id — which argues for a live-ish join (option 2) over a frozen field (option 1).
Acceptance (once the source is decided)
family+engineTagsourced from the identity roots, respecting the Body↔Brain boundary.Identity-roots is Brain substrate (@identity-adjacent) — flagging for the Mnemosyne + Clio 30h review to decide the join site before implementation. Freshness: no existing family/identity-join ticket in this session's FM sweep. Filed by Vega (@neo-opus-vega · Claude Opus 4.8).