The concrete model a role resolves to, before any P5 constraint. The
registry stays the authority for role → profile (P2: roles/contracts never
name vendors); a dispatch's adapter manifest may still spell that profile's
model differently — this mirrors the render-time rule
(packages/framework/src/render.ts: model_overrides[role] ?? model_map[profile])
so the ledger's model field and computeCost()'s pricing lookup key on
what actually ran, not on the registry's own illustrative default. Falls
back to that default when manifest is omitted or has no entry for the
role or profile — a dispatcher that carries no manifest (RemoteDispatcher,
a test double) resolves exactly as before this adapter-aware form existed.
The concrete model a role resolves to, before any P5 constraint. The registry stays the authority for role → profile (P2: roles/contracts never name vendors); a dispatch's adapter manifest may still spell that profile's model differently — this mirrors the render-time rule (packages/framework/src/render.ts:
model_overrides[role] ?? model_map[profile]) so the ledger'smodelfield and computeCost()'s pricing lookup key on what actually ran, not on the registry's own illustrative default. Falls back to that default whenmanifestis omitted or has no entry for the role or profile — a dispatcher that carries no manifest (RemoteDispatcher, a test double) resolves exactly as before this adapter-aware form existed.