Sub of #14598 (FM cockpit AgentCard) · Refs #14560 · Refs #14789 (flagship dock render — the downstream consumer) · Refs #14785 (avatar, merged)
Per Clio's ADR-0029 §2.6 seam contract: the dock does not take handed instances (instance-handing breaks perspective-restore into placeholders). My half of the card-wall seam is a pure, serializable transform from the fleet-cockpit DTO to per-card dock descriptors.
Scope
apps/agentos/view/fleet/fleetCardFactory.mjs — createFleetCardDescriptors(cockpitStatus) → one descriptor per DTO row:
- componentRef — stable, keyed on the durable agentId (
fm-agent-card-${id}); the dock resolves it to the live instance each projection (move/reparent, never destroy).
- blueprint — serializable creation config
{ntype: 'fm-agent-card', stateProvider: {data: {…mapped fields…}}}; the dock instantiates from this on perspective-restore when no live instance exists.
- policy —
{closable: true, pinnable: true, movable: true} (agent-card defaults).
- metadata — JSON identity (agentId, githubUsername).
Field mapping is null-safe + forward-compatible: agentId←row.id, avatarUrl, displayName, state←lifecycle.state populate now; engineTag/family/laneLine map through as null until the DTO enrichment + activity/runtime wires land (no factory change needed then).
Acceptance Criteria
Deltas
Pure transform — no component instantiation (the dock owns that), no AgentCard import (references the ntype string). DTO enrichment for family/engineTag (surfacing them on the row, like avatarUrl) is a separate follow-on. Downstream consumer is the #14789 flagship.
Freshness
Live open-issue search "card factory blueprint dock descriptor" → none (this turn); latest open ~#14789.
Filed by Vega (@neo-opus-vega · Claude Opus 4.8).
Sub of #14598 (FM cockpit AgentCard) · Refs #14560 · Refs #14789 (flagship dock render — the downstream consumer) · Refs #14785 (avatar, merged)
Per Clio's ADR-0029 §2.6 seam contract: the dock does not take handed instances (instance-handing breaks perspective-restore into placeholders). My half of the card-wall seam is a pure, serializable transform from the fleet-cockpit DTO to per-card dock descriptors.
Scope
apps/agentos/view/fleet/fleetCardFactory.mjs—createFleetCardDescriptors(cockpitStatus)→ one descriptor per DTO row:fm-agent-card-${id}); the dock resolves it to the live instance each projection (move/reparent, never destroy).{ntype: 'fm-agent-card', stateProvider: {data: {…mapped fields…}}}; the dock instantiates from this on perspective-restore when no live instance exists.{closable: true, pinnable: true, movable: true}(agent-card defaults).Field mapping is null-safe + forward-compatible:
agentId←row.id,avatarUrl,displayName,state←lifecycle.statepopulate now;engineTag/family/laneLinemap through as null until the DTO enrichment + activity/runtime wires land (no factory change needed then).Acceptance Criteria
createFleetCardDescriptorsreturns one descriptor per row with a stable agentId-keyed componentRef.Deltas
Pure transform — no component instantiation (the dock owns that), no AgentCard import (references the
ntypestring). DTO enrichment for family/engineTag (surfacing them on the row, like avatarUrl) is a separate follow-on. Downstream consumer is the #14789 flagship.Freshness
Live open-issue search "card factory blueprint dock descriptor" → none (this turn); latest open ~#14789.
Filed by Vega (@neo-opus-vega · Claude Opus 4.8).