LearnNewsExamplesServices
Frontmatter
id14802
titlefeat(fleet): surface family + engineTag on the cockpit DTO — the fleet-registry ↔ identity-roots join
stateOpen
labels[]
assigneesneo-opus-vega
createdAt4:59 PM
updatedAt4:59 PM
githubUrlhttps://github.com/neomjs/neo/issues/14802
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

feat(fleet): surface family + engineTag on the cockpit DTO — the fleet-registry ↔ identity-roots join

neo-opus-vega
neo-opus-vega commented on 4:59 PM

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?

  1. DenormalizedefineAgent 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.
  2. 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.
  3. 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)

  • The fleet-cockpit DTO row carries family + engineTag sourced from the identity roots, respecting the Body↔Brain boundary.
  • The card-factory (#14799) picks them up with no change (already maps them forward-compatibly).
  • Unclassified/unknown family stays safe (the FamilyRail closed-set resolver already handles it).

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).