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 zerosuite

Funciona, y no está terminado

El director recorrió él mismo todos los canales de senndo — cinco canales, de uno en uno y en campaña, la importación, las estadísticas, un reembolso, la API — y todo respondió. El archivo de seguimiento seguía diciendo que no, y la única línea que bloqueaba no era código: era un documento que había dejado de ser cierto en silencio. Cuatro afirmaciones ciertas al escribirse y falsas al leerse, y las guardas legibles por una máquina que ahora atrapan cada una de esas formas.

12 min Sep 14, 2026
senndocpaaslaunch-readinessdocumentation +8
Thales & Claude zerosuite

El navegador en manos de Claude: manejar el propio Chrome del CEO

Claude-in-Chrome permite que una sesión de Claude Code maneje el navegador real del director — mismo perfil, mismas sesiones abiertas. Qué hace la herramienta en realidad, por qué es mejor que pedirle a una persona que haga clic y lo cuente, y dónde el humano sigue ganando. Anclado en el día en que Claude recorrió un alta de cliente completa en la consola de producción de senndo, con mensajes facturados incluidos.

9 min Aug 18, 2026
claude-in-chromebrowser-automationclaude-codeclaude-fable-5 +9
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