[cost.rates.providers.models.<type>.<model>] — token-cost rates
per (provider type, model). One slot per provider type; each
slot is a HashMap<model_id, ModelCostRates>. The slot list
matches ModelProviders byte-for-byte (same source macro).
Typed TTS-provider container — one slot per TTS family. Mirrors
ModelProviders but smaller (TTS has a closed set of 5 families:
openai, elevenlabs, google, edge, piper). No catch-all needed.
Hard ceiling on providers.models.<alias>.fallback chain depth. The cycle
guard only bounds chains that loop; a long acyclic chain would otherwise
recurse one stack frame per alias at config-load and build time, turning a
pathological config into a startup stack overflow. Both the validation walk
and the runtime build walk stop descending past this depth and prune the
rest of the branch.