Por una trampa perfecta. Una variable sin prefijo no llega al navegador, así que la app da un error diciendo que falta. Se busca el error, y todo el mundo, documentación incluida, responde lo mismo: ponle el prefijo. Se pone, el error desaparece, la app funciona. Y si esa variable era un secreto, acaba de quedar publicada. La solución correcta para una clave pública es exactamente la equivocada para una privada, y el síntoma es idéntico.
El motivo de fondo es que el navegador no puede guardar secretos. Todo lo que necesita el código que se ejecuta en el navegador tiene que viajar hasta él, y por tanto es legible. Cuando una operación necesita una credencial de verdad, la respuesta no es hacérsela llegar al navegador: es que esa operación no debe ocurrir en el navegador.
Estas son las que nunca deben llevar prefijo, pase lo que pase: la service_role de Supabase, cualquier clave secreta de Stripe, las claves de OpenAI o de cualquier proveedor de IA, las credenciales de AWS, las contraseñas de correo saliente y los secretos de firma de webhooks. Si alguna de estas tiene prefijo hoy, está publicada.