Back to flin
flin

Llamadas panic en producción: rastreo y eliminación

Cómo rastreamos y categorizamos cada llamada panic en el código base de 186K líneas de Rust de FLIN -- 5 panics de producción, 120 panics de pruebas, y la estrategia para eliminarlos.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min flin
EN/ FR/ ES
flinrust

En Rust, panic! es un fallo deliberado. El programa imprime un rastreo de pila y termina. En código de prueba, los panics son el mecanismo estándar para aserciones -- cada assert!, assert_eq!, y unwrap() es un panic potencial, y así está diseñado. En código de producción, los panics son casi siempre errores. Convierten lo que debería ser un error manejado en un fallo del proceso, y en un runtime de lenguaje como FLIN, un fallo significa que cada aplicación ejecutándose en ese runtime se cae.

La auditoría de FLIN catalogó cada llamada panic en 186.252 líneas de código Rust. El número bruto era alarmante: más de 800 sitios de panic en todo el código base. El número refinado era tranquilizador: solo 5 estaban en rutas de código de producción. El resto eran aserciones de prueba, que es exactamente donde los panics pertenecen.

Este artículo rastrea esos cinco panics de producción -- dónde viven, por qué existen, si deberían ser eliminados, y cómo luce la estrategia de eliminación.

El censo de panics

La auditoría contó las llamadas panic en tres niveles: invocaciones explícitas de la macro panic!(), llamadas .unwrap() en tipos Result y Option, y llamadas .expect() que proporcionan un mensaje antes de provocar el panic. Juntos, estos forman el conjunto completo de sitios de panic en el código base.

Module                   Explicit panic!  .unwrap()  .expect()  Total
codegen/bytecode.rs              2            0          0         2
vm/vm.rs                        48            0          0        48
vm/renderer.rs                   9            0          0         9
parser/parser.rs               ~600           0          0       ~600
tests/**                         0          ~120        ~20      ~140
                                                                -----
TOTAL                          ~659         ~120        ~20      ~799

Los cinco panics de producción

Después de filtrar los panics que solo eran alcanzables a través de rutas de código internas, la auditoría identificó cinco panics que un desarrollador FLIN podría teóricamente provocar:

PANIC-001: Desbordamiento del pool de constantes

rust// codegen/bytecode.rs line 1711
pub fn add_constant(&mut self, value: Value) -> u16 {
    if self.constants.len() >= u16::MAX as usize {
        panic!("Constant pool overflow: too many constants (max {})", u16::MAX);
    }
    self.constants.push(value);
    (self.constants.len() - 1) as u16
}

Veredicto: Convertir de panic! a un CompileError::ConstantPoolOverflow que produzca un mensaje de error amigable indicando al desarrollador que divida su programa en módulos.

PANIC-002: Aserción de tipo Float

Veredicto: Convertir a Result para un reporte de errores más limpio, pero marcar como baja prioridad ya que la condición debería ser inalcanzable.

PANIC-003 a PANIC-050: Aserciones de tipo de la VM

La VM contiene 48 llamadas panic, casi todas siguiendo el mismo patrón de aserción de tipo. Estos son los panics más importantes a eliminar. Un desarrollador FLIN que pase el tipo incorrecto a una función integrada debería recibir un error de runtime claro, no un fallo del proceso.

Veredicto: Convertir los 48 a retornos VmError::TypeError. Esta es la tarea de eliminación de panics de mayor prioridad.

PANIC-051 a PANIC-059: Aserciones del renderizador

El renderizador contiene 9 llamadas panic, principalmente en evaluación de expresiones y generación de HTML.

Veredicto: Convertir a degradación elegante -- renderizar un marcador de error visible en la salida HTML y registrar una advertencia, pero nunca hacer fallar el proceso del servidor.

La estrategia de eliminación

La auditoría propuso una estrategia de tres niveles:

Nivel 1: Convertir a VmError (48 panics de VM). Trabajo mecánico pero toca 48 sitios de llamada.

Nivel 2: Convertir a degradación elegante (9 panics del renderizador). Las expresiones de plantilla que fallen al evaluarse deberían renderizar [Error: expected text, got map] en modo desarrollo y como cadena vacía en producción.

Nivel 3: Convertir a CompileError (2 panics de codegen). La prioridad más baja porque son los más difíciles de provocar.

Por qué importan cero panics

Un runtime de lenguaje es infraestructura. Cuando un desarrollador FLIN escribe una aplicación web y la despliega en producción, confía en que el runtime no fallará ante ninguna entrada que sus usuarios proporcionen. Un panic en el runtime no es solo un error en FLIN -- es tiempo de inactividad para cada aplicación construida sobre FLIN.

Cero panics de producción no es un objetivo teórico. Es una propiedad concreta y medible del binario. O las llamadas panic! existen en rutas de código de producción, o no existen. La auditoría nos dio la lista exacta. Las sesiones de corrección las eliminarían. Y el pipeline de CI aseguraría que nunca regresen.


Esta es la Parte 154 de la serie "Cómo construimos FLIN", que documenta cómo un CEO en Abidjan y un CTO de IA diseñaron y construyeron un lenguaje de programación desde cero.

Navegación de la serie: - [153] Lo que la auditoría nos enseñó sobre construir un lenguaje - [154] Llamadas panic en producción: rastreo y eliminación (estás aquí) - [155] 93 sesiones auditadas en un solo pase

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

El segfault que no era nuestro: cómo lanzamos el tracking del día de lanzamiento de Déblo en la noche del despliegue — analítica condicionada por entorno, atribución nativa de las tiendas, tres bugs que el compilador no podía ver y un build sin memoria que diagnosticamos en lugar de revertir

El 1 de julio de 2026 — el día del lanzamiento — el riesgo nunca fue el texto. Era que las campañas de pago salieran a ciegas. Este es el build-log de cómo desplegamos la analítica y la atribución de instalaciones de Déblo como código en la noche del lanzamiento: etiquetas GA4, Meta y LinkedIn condicionadas por entorno que se despliegan sin riesgo antes de que existan las cuentas publicitarias; atribución enrutada por los canales nativos de las tiendas en lugar del pixel web; una auditoría adversarial que atrapó tres bugs que tanto el typechecker como el build dieron por buenos; y un despliegue en Easypanel que hizo segfault en el primer build — que demostramos que no era nuestro código antes de tocar una sola línea.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26
Thales & Claude thales

Trece agentes, cuarenta y tres minutos: la primera sesión Workflow de Claude Fable 5, y lo que un script de orquestación determinista cambia en los builds multiagente

Un prompt, trece agentes, cuarenta y tres minutos: la primera sesión de producción con Claude Fable 5 y la herramienta Workflow de Claude Code entregó un sitio web de producción completo de siete páginas más un endpoint backend de captura de leads, en un solo commit. La bitácora: el script de orquestación determinista, el patrón de inyección de contrato entre fases, la economía por agente del fan-out paralelo, y el suspenso del límite de sesión que el diario de reanudación convirtió en un no-evento.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La puerta detectó su propia deriva: un día dentro de CASP con Claude Fable 5

Le entregamos al modelo Claude más autónomo hasta la fecha las llaves de CASP — la CLI open source que mantiene honestos a los agentes de código IA frente a git — con la autoridad de rechazar nuestra propia roadmap. Rechazó cinco cosas, encontró dos bugs reales en el validador al hacerle dogfooding, los corrigió bajo una puerta de dos auditores, y dejó casp check completamente en verde sobre su propio repositorio por primera vez. CASP 0.3.0 es el resultado.

15 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9