/** * Preflight: would every specialist on this team land on the same adapter? * * Harnery does not auto-spread. A specialist without an `adapter` pin inherits * the run's default, so a team whose profiles all omit the pin puts every child * on one adapter. That is legal and sometimes intended. It is a problem when the * host is also `subscriptionOnly`, because then the concentration lands on one * seat's session meter rather than on metered per-token billing: the seat hits * its limit, and every specialist stops at once rather than the team degrading. * * The check is deliberately narrow, because a false refusal here is worse than * the miss it prevents. It fires only when all four hold: * * 1. more than one specialist (a solo team cannot spread), * 2. every specialist resolves to the same adapter, * 3. `subscriptionOnly` is on (otherwise concentration is a cost curve, not a * cliff), and * 4. more than one adapter is ATTESTED REACHABLE. * * Condition 4 is the one worth insisting on. Counting *declared* adapters would * suggest spreading onto a seat that cannot run — a dead adapter passes a * declaration check and then fails every child it is handed. Only an * attestation records that the adapter actually completed a turn on this * machine, so only an attestation is grounds for telling someone to use it. */ export interface AdapterSpreadInput { /** Specialist id → its optional adapter pin. */ specialists: Readonly>; /** The adapter an unpinned specialist inherits. */ defaultAdapter: string; /** Adapters with a live attestation on this machine — proven to run, not * merely registered. */ reachable: readonly string[]; /** Whether children are confined to subscription (logged-in) auth. */ subscriptionOnly: boolean; } export interface AdapterSpreadVerdict { /** True when the team would put every child on one adapter AND that is worth * refusing over. False both when the team spreads and when concentrating is * unremarkable (single specialist, one reachable adapter, metered billing). */ concentrated: boolean; /** The adapter everything would land on, when concentrated. */ adapter?: string; /** Operator-facing explanation, present exactly when concentrated. */ reason?: string; /** Attested-reachable adapters this team is not using. */ unused: string[]; } export declare function inspectAdapterSpread(input: AdapterSpreadInput): AdapterSpreadVerdict; //# sourceMappingURL=adapter-spread.d.ts.map