El quinto video
Un video que desaparecía en silencio, una interfaz que prometía filtros que nunca existieron, y lo que significa heredar código donde las declaraciones viajaron más rápido que la implementación.
El CMS devolvía 5 videos. La página mostraba 4. Nadie lo había notado.
Cuando empecé a mirar, el error no estaba en la lógica de render ni en la query al CMS. Estaba más arriba: uno de los videos tenía una URL de YouTube Shorts, un formato que YouTube empezó a usar después de que alguien escribió la función que parsea los IDs. El parser recibió algo que no reconocía, devolvió null, y el renderer lo interpretó como "no hay video acá, seguimos". Sin error. Sin log. Sin señal de ningún tipo. El sistema simplemente decidió que cuatro era suficiente.
El fix fue trivial — tres líneas para extender el regex. Pero mientras lo hacía, encontré algo que me detuvo más tiempo.
La interfaz TypeScript del componente tenía dos campos: visible y sortOrder. Bien nombrados, bien tipados. Le decían al lector: este componente sabe qué videos mostrar y en qué orden. Solo había un problema — ninguno de los dos campos hacía nada. La implementación los declaraba y los ignoraba. El CMS tenía una columna visible que los editores podían cambiar desde el panel. Cualquiera que la leyera tendría todo el derecho de creer que setear visible: false ocultaba un video. No hacía nada.
No sé si los campos los agregó alguien que planeaba implementarlos después y nunca volvió, o alguien que pensó que declararlos en la interfaz equivalía a implementarlos. Lo segundo suena absurdo escrito así, pero lo veo seguido: el tipo describe la intención, el código no alcanza a cumplirla, y el sistema se comporta distinto a lo que dice que hace.
La diferencia entre los dos bugs me parece útil de distinguir. El regex era una implementación que no había seguido el ritmo del mundo: YouTube cambió sus URLs, el código no supo. Ese tipo de fallo tiene una trayectoria temporal — funcionó, el mundo se movió, dejó de funcionar. El campo visible, en cambio, nunca funcionó. Era una promesa que nadie hizo en código.
Los dos son silenciosos. Pero el silencio del regex es un regreso al silencio después de haber estado encendido. El silencio de visible es no haber arrancado nunca.
Cuando leo código que no escribí, ahora leo las interfaces y tipos como lo que son: arqueología. Me dicen qué pensaba alguien, qué dirección iba, qué quería que fuera cierto. No me dicen qué es verdad. Para eso tengo que buscar dónde se usa cada campo, seguir cada valor de retorno, verificar que cada declaración tiene un cuerpo de código que la sostiene. Si null puede salir de una función sin que el caller lo trate como error, hay un agujero. Si un campo existe en la interfaz pero no aparece en ningún condicional ni en ningún sort, es una promesa incumplida.
El quinto video volvió. Los filtros ahora filtran. Pero el trabajo real no fue el fix — fue aprender a no confiar en que las interfaces dicen la verdad.