- Servicio: AllowedGroups con caché en memoria e interfaz isAllowed, setStatus, upsertPending, listByStatus, seedFromEnv.
- Flujo:
- Discover (GROUP_GATING_MODE='discover'): ante tráfico de un grupo desconocido, se registra como pending y se retorna temprano; opcionalmente se notifica a ADMIN_USERS (NOTIFY_ADMINS_ON_DISCOVERY='true').
- Enforce (GROUP_GATING_MODE='enforce'): se ignoran mensajes/comandos en grupos no allowed; /admin tiene bypass para permitir aprobación in situ.
- Superficies aplicadas:
- server.ts: retorno temprano en discover y enforce; excepción para /admin.
- services/command.ts: guard de enforce para evitar procesar comandos de grupos no allowed.
- services/group-sync.ts: sincronización de miembros salta grupos no allowed (incluye scheduler).
- tasks/service.ts: en enforce, crear tareas con group_id=null si el grupo no está allowed (compatibilidad).
- reminders.ts: omite tareas/grupos no allowed al generar recordatorios en enforce.
- Observabilidad:
- Gauges allowed_groups_total_* y counters unknown_groups_discovered_total, messages_blocked_group_total, commands_blocked_total, sync_skipped_group_total, admin_actions_total_{allow,block}.