# Códigos de error: Registro de errores HTTP (error_events)

> Códigos que pone el propio registro de errores (registro.md) cuando la excepción no trae `code`: `unhandled` (500 no atrapado), `cors_origin_rejected` (el CORS rechazó el origen) y `error_events_overflow` (lo que no cupo en memoria en un minuto). Una excepción sin `code` se registra como `http_<status>`: no es un código del catálogo, ver «Excepciones sin código».

**Cómo se detecta (toda la familia):** `yarn -s boost errores resumen` y `yarn -s boost errores ver <código>`; en Render, `[errors] 5xx code=… status=… count=… method=… route=…` y `[errors] SPIKE code=… count=…`.

**Qué hacer (toda la familia):** Cada ficha dice qué mirar. Para `http_<status>`, la ruta que guarda el registro dice qué excepción fue.

Lo que un código no dice lo hereda de la familia.

## `cors_origin_rejected`

- **Tipo:** HTTP · **HTTP:** 500 · **Estado:** vigente
- **Qué significa:** El CORS de `main.ts` rechazó la petición porque el `Origin` no está permitido (`CORS_ALLOWED_ORIGINS` y los fijos de `main.ts`). Hoy responde 500 con el texto genérico («Ocurrió un error inesperado…») sin ruta, porque el rechazo es un `Error` común; el registro lo cuenta aparte para no mezclarlo con `unhandled`.
- **Causa típica:** Un navegador en un dominio que no es el del front (una vista previa de Vercel nueva, un dominio de un cliente, un bot), o un front local que apunta a prod.
- **Cómo detectarlo:** `yarn -s boost errores ver cors_origin_rejected` (método y entidad 0) y `[errors] 5xx code=cors_origin_rejected … route=(sin ruta)` en Render.
- **Qué hacer:** Si el origen es legítimo, agregarlo a `CORS_ALLOWED_ORIGINS` en Render. Si no, es ruido: no hay nada que arreglar. (Corrección propuesta, no hecha: que el rechazo responda 403 en vez de 500.)

## `error_events_overflow`

- **Tipo:** interno · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Fila del registro de errores (status 0, ruta y entidad `*`/0) que suma los errores que no cupieron en memoria en un minuto: el registrador guarda a lo sumo `ERROR_EVENTS_MAX_KEYS` combinaciones distintas por minuto (2000 por defecto) y el resto solo se cuenta aquí.
- **Cómo detectarlo:** `yarn -s boost errores resumen` (status 0) o `[errors] SPIKE code=error_events_overflow` en Render.
- **Qué hacer:** Hubo una ráfaga de errores muy variados (muchas rutas o entidades a la vez): `yarn -s boost errores resumen --dias 1` dice qué la causó. Subir `ERROR_EVENTS_MAX_KEYS` solo si esa ráfaga es normal.

## `unhandled`

- **Tipo:** HTTP · **HTTP:** 500 · **Estado:** vigente
- **Qué significa:** Error no atrapado en una petición HTTP: no era una excepción de Nest, así que Nest respondió 500 con el texto genérico (en español desde el 2026-10-21: «Ocurrió un error inesperado…»; antes `Internal server error`) y escribió el stack (`ExceptionsHandler`). Es el código que el registro de errores le pone a esos 500.
- **Causa típica:** Un bug: un `TypeError`, una consulta que falló sin atraparse, una librería que lanzó un `Error` común. Responde 500 aunque la culpa sea del dato que llegó.
- **Cómo detectarlo:** `yarn -s boost errores ver unhandled` (ruta y entidad, con el último `requestID`) y `[errors] 5xx code=unhandled …` en Render. El stack está en Render en la misma petición: `yarn -s boost ops logs "<requestID>"`.
- **Qué hacer:** Leer el stack de esa petición y corregir el código: atrapar el caso y responder una excepción HTTP con `code` (que entre al catálogo) en vez de un 500.
