apps/ai/src/teo/rate-limit.ts: ventana deslizante en memoria, 20 peticiones por minuto por id de cuenta; responde 429 «Demasiadas peticiones a TEO. Espere un minuto e intente de nuevo.».
Se aplica en teo-ask.service.ts:81 y teo-chat.service.ts:46, justo después de requireRoles y antes de validar la pregunta. Son los dos únicos lugares que llaman a llmComplete (búsqueda en apps/). El contador es compartido entre ask y chat.
Límites del diseño: en memoria del proceso ai (se reinicia con cada deploy o reinicio; con más de una instancia el límite se multiplica); solo por cuenta, no por IP; el mapa buckets no se purga (crece con el número de cuentas, acotado).
Ejecución: no hecha. El contexto exige confirmación. Método propuesto sin costo de IA: 21 POST /api/teo/ask con question: "" como prueba.clinico en menos de 60 s → esperado 20 × 400 «Escriba una pregunta.» y el 21 → 429. Cero llamadas a OpenAI/Gemini, porque la validación de la pregunta va después del límite. Efecto secundario: TEO queda bloqueado 60 s para prueba.clinico.