Episodio 3

Comienza la Construcción de los Cimientos

"La primera prueba es una acusación"
43 min de lectura

Ethan Carter no empieza con una reescritura. Empieza con un arnés de pruebas: escenarios en lenguaje sencillo que copian archivos en la carpeta INCOMING, inician el lote COBOL en el servidor de pruebas, esperan la salida y verifican los números. Una herramienta llamada Cucumber. Ruby por debajo. No se necesita un cliente VB6. Sin licencia de Micro Focus. Solo entrada, salida y una respuesta honesta. Nathan Cole observa a alguien probar que la ejecución nocturna puede ser cuestionada a la luz del día. No ha sentido esperanza en años. Linda Pritchard observa lo mismo y siente que el suelo se mueve. El foso se está vaciando, un escenario a la vez.

Anteriormente: «Cuando VB6 era el futuro» — Thomas Whitaker dejó de aprender cuando la plataforma cambió. La empresa se congeló en 1998, y cuando Thomas murió, su hijo heredó el futuro congelado como si fuera un regalo.

Lunes, 08:37 — El Contratista

Mañana gris de octubre en un pequeño vestíbulo de oficina en Ohio. Ethan Carter: poco más de 40 años, vaqueros oscuros, botas de cuero gastadas, camiseta negra lisa debajo de una sudadera gris carbón con cremallera, bolso de mensajero con la funda del portátil asomando, barba de varios días, ojos tranquilos que han visto sistemas peores. Nathan Cole: finales de los 30/principios de los 40, camisa de botones arrugada con las mangas remangadas, mancha de café cerca de la tapeta, ojos cansados, postura tensa como si esperara alarmas. Derek Lawson: traje azul marino, camisa blanca impecable, cinturón caro, reloj pulido, sosteniendo una tarjeta de visitante y un portapapeles. Detrás de ellos: fotos enmarcadas de ferias comerciales, un mostrador de recepción con una planta artificial descolorida, iluminación fluorescente.
«Ethan Carter llegó diez minutos antes porque las personas que han sobrevivido a caídas reales del sistema no confían en los calendarios.»

Ethan Carter llegó diez minutos antes porque las personas que han sobrevivido a caídas reales del sistema no confían en los calendarios.

Afuera, la lluvia se arrastraba por las puertas de cristal en líneas lentas y pacientes. Sus botas dejaron medias lunas mojadas en las baldosas del vestíbulo. El aire estaba demasiado cálido para ser octubre, impulsado por un termostato que nunca había sido calibrado y que nunca lo sería.

Se quedó quieto y escuchó.

No la música del vestíbulo, porque no había ninguna. Al ritmo del edificio. El sonido amortiguado de los teléfonos sonando más adentro. La tos de una impresora. Los pasos un poco demasiado rápidos de alguien que se apresuraba a resolver un problema que debería haberse resuelto años atrás.

Ethan tenía una lista de verificación privada que vivía detrás de sus ojos.

Lo que se rompe de noche.

Lo que se rompe el viernes.

Lo que se rompe cuando la única persona que conoce el conjuro está enferma.

El vestíbulo olía a limpiador de limón y alfombra vieja. Una foto enmarcada en la pared mostraba a un Graham Whitaker más joven estrechando la mano en un stand de una feria comercial, sonriendo como si la confiabilidad fuera un rasgo de personalidad.

Derek Lawson salió primero.

Miró a Ethan de arriba abajo y sonrió con la cantidad correcta de bienvenida.

—Ethan. Genial. —La sonrisa de Derek se ensanchó un poco más—. Preston habló muy bien de ti. Dijo que eres el tipo que es… bueno programando.

Lo dijo como si la mayor forma de elogio fuera ser útil sin ser complicado.

Nathan observó a Derek pronunciar el nombre de Preston como si fuera una tarjeta de seguridad. Una bendición. Un escudo.

El estómago de Nathan se tensó.

El último «tipo que es bueno programando» había durado tres semanas.

—Envié la estructura de honorarios y el documento de alcance —dijo Ethan. Sin ego. Solo un límite.

Derek asintió sin absorberlo. —Claro, claro. Te pondremos en marcha. Solo trabaja con Nathan. Mantén la nómina funcionando.

Nathan Cole apareció detrás de Derek, con café en la mano, los hombros un poco encorvados como si la gravedad hubiera negociado privilegios especiales.

Su café estaba amargo y tibio. Ya se había tomado uno en casa, de pie en la cocina mientras su hijo menor le preguntaba si de verdad llegaría a cenar esta noche. Había dicho que sí demasiado rápido. Ya se había prometido a sí mismo que no tomaría un segundo. Ya había fallado.

Nathan no le dio la mano a Ethan de inmediato. Lo estudió de la manera en que se estudia un medicamento nuevo.

La esperanza tenía efectos secundarios.

—Buenos días —dijo Nathan.

—Buenos días —respondió Ethan.

Derek le entregó a Ethan una tarjeta de visitante. —Necesitamos que… ya sabes… ayudes con algo de código. Las cosas se siguen rompiendo. Nathan lo ha estado cargando todo.

Los ojos de Nathan se desviaron hacia Derek, luego se apartaron.

Cargándolo.

Como si este lugar fuera una caja que Nathan pudiera levantar y soltar cuando terminara.

Ethan miró más allá de ellos, por el pasillo.

—Antes de tocar nada —dijo Ethan—, ¿cómo se mueven los cambios por aquí? ¿Dónde compilan, dónde prueban y qué máquina ejecuta los lotes nocturnos de verdad?

Derek parpadeó. —Tenemos el sistema en vivo. El real. El que ejecuta la nómina.

Nathan exhaló por la nariz. Un sonido a medio camino entre una risa y una rendición.

No preguntes eso en voz alta, pensó Nathan. No nombres la mentira.

—Tenemos máquinas de desarrollo —dijo Nathan—. Tenemos un servidor de «pruebas» que se supone que se parece al sistema en vivo, excepto que no es así. Y una instancia de SQL compartida que alguien actualizó en 2019 y nadie recuerda cómo.

Ethan asintió lentamente.

No parecía impresionado. Parecía aliviado.

—De acuerdo —dijo—. Entonces empezamos por hacer que la realidad sea repetible.

La garganta de Nathan se cerró.

Repetible significaba que podías entregarle el problema a otra persona. Significaba que las 02:18 ya no le pertenecían.

Esa frase le impactó más de lo que debería.

No porque fuera profunda.

Porque era cuerda.

Lunes, 11:14 — El Arnés

Oficina de planta abierta con paredes de cubículos bajas y monitores envejecidos. Ethan Carter y Caleb Turner están sentados uno al lado del otro en un escritorio. Ethan: las mangas de la sudadera arremangadas, los antebrazos sobre el escritorio, concentrado en la pantalla. Caleb Turner: casi 30 años, camiseta gráfica debajo de una camisa de franela, vaqueros, zapatillas, intentando parecer seguro, sus ojos van de Ethan a la pantalla. En el monitor: un editor de texto con un archivo .feature abierto mostrando sintaxis Gherkin (pasos Dado/Cuando/Entonces), y debajo una ventana de terminal negra con texto verde y rojo. Una ventana del Explorador de Windows muestra dos carpetas compartidas etiquetadas "INCOMING" y "OUTGOING." Nathan Cole está de pie detrás de ellos sosteniendo una taza de café, observando. Olivia Parker: poco más de 30 años, cola de caballo, cárdigan sobre una blusa, cuaderno abierto, apoyada contra un archivador. Ryan Mitchell: poco más de 30 años, barba, camisa informal de botones, brazos cruzados, inclinado hacia adelante. Linda Pritchard al fondo: cárdigan oscuro, una carpeta abrazada al pecho, los labios apretados. Luces fluorescentes.
«Ethan no hizo la actuación del primer día.»

Ethan no hizo la actuación del primer día.

Nada de bromas. Ningún discurso cuidadoso sobre «cultura». Ningún recorrido por la planta como si estuviera allí para admirar el papel pintado.

Se movía como alguien que había aprendido, a las malas, que hablar es la forma en que los sistemas rotos se mantienen rotos.

Dejó su bolsa en el suelo, acercó una silla, se arremangó y apuntó al dolor.

Tampoco empezó con las pantallas de VB6.

No porque no le importaran. Porque las herramientas de desarrollo estaban muertas.

El tiempo de ejecución de VB6 todavía venía con cada copia de Windows. Microsoft había mantenido esa promesa durante veintiséis años: las aplicaciones VB6 existentes seguirían funcionando. El cliente de nóminas todavía se abría en los escritorios de los clientes. Todavía hablaba con la base de datos. Todavía generaba archivos planos y los enviaba por FTP. El tiempo de ejecución era inmortal.

El IDE era un fantasma.

Microsoft había dejado de dar soporte al entorno de desarrollo Visual Basic 6.0 en abril de 2008. No se podía comprar. No se podía descargar. Si todavía tenías los medios de instalación originales de 1998, podías intentar instalarlo en Windows 11, y tal vez funcionaría, más o menos, como un proceso de 32 bits ejecutándose bajo emulación, marcado como «editor desconocido» por el sistema operativo, rompiéndose un poco más con cada actualización de Windows. Algunas personas en el mundo todavía lo hacían, de la misma manera que algunas personas todavía conducían coches de museo en vías públicas. Técnicamente posible. La idea de fiabilidad de nadie.

Pero el IDE era solo la mitad del problema. El ecosistema de VB6 había sido algo vivo: proveedores de componentes de terceros que vendían cuadrículas, gráficos, selectores de fecha, generadores de informes. Gruesos catálogos que llegaban por correo. Controles ActiveX con extensiones .OCX y archivos de licencia y rutinas de instalación. La propia página de soporte de Microsoft todavía decía «Se recomienda a los clientes que se pongan en contacto con el proveedor original del control». Los proveedores originales de controles estaban en bancarrota, habían sido adquiridos o habían pivotado a .NET quince años atrás. Los componentes de los que dependía el cliente de nóminas existían solo como artefactos binarios en máquinas que nunca habían sido formateadas. Si esas máquinas morían, los controles morían con ellas. No se podía recompilar el cliente sin los controles. No se podían conseguir los controles sin los proveedores. Los proveedores se habían ido.

COBOL era peor.

Micro Focus vivía en la máquina de Nathan como una maldición que no levantabas porque el paciente moriría. Una configuración frágil. Una licencia. Un juego de llaves. Los otros desarrolladores nunca la habían tocado. Caleb Turner tenía veintiocho años. Nunca había visto un compilador de COBOL en su vida. Olivia Parker y Ryan Mitchell tenían poco más de treinta. COBOL era algo que sus profesores habían mencionado en una conferencia de historia de la informática en la que se habían medio dormido.

Ethan podía leer COBOL de la forma en que lees un idioma que aprendiste una vez y nunca hablaste. Lento. Cuidadoso. Lo suficiente para entender lo que significaba un párrafo. No lo suficiente para cambiar una coma sin arriesgar toda la frase.

¿Escribirlo? ¿Compilarlo? ¿Tocar los binarios del lote?

Eso era de Nathan. Solo de Nathan.

Así que Ethan empezó con la única parte del sistema que no necesitaba una licencia, un instalador muerto o una bendición del pasado.

Archivos.

El texto plano que llegaba por FTP cada tarde desde los sitios de los clientes. El texto plano que salía del edificio como cheques de pago e informes de impuestos a la mañana siguiente. Entrada y salida. Evidencia que podías sostener en tus manos.

Entre esos dos archivos se sentaban cincuenta años de lógica COBOL que nadie vivo podía explicar del todo. Pero a los archivos no les importaban las explicaciones. Los archivos eran hechos. Si podías introducir hechos y comprobar los hechos que salían, no necesitabas entender la máquina. Solo necesitabas saber si estaba mintiendo.

Caleb Turner había sido asignado como la «sombra» de Ethan, lo que significaba que Derek había decidido que Caleb era prescindible durante unas horas.

Caleb intentaba parecer que lo habían elegido por su potencial.

Él sabía la verdad. Lo habían elegido porque no tenía la suficiente gravedad institucional para decir que no.

Su pierna rebotaba debajo del escritorio. Mantuvo las manos planas sobre el teclado como si eso fuera a evitar que temblaran.

—Muéstrame una cosa que duela —dijo Ethan.

Caleb se rio una vez, con brusquedad—. Elige un día de la semana.

—Elige uno.

Caleb hizo clic a través de un árbol de carpetas lleno de intentos muertos y proyectos a medio empezar.

—Redondeo del impuesto estatal —dijo Caleb—. A veces se calcula de forma diferente para el mismo empleado dependiendo de qué archivo de cliente provenga la entrada. Detroit tiene un impuesto sobre la renta de la ciudad además del impuesto estatal, y a veces los números salen mal. Linda dice que siempre ha sido así. Nathan lo arregla a mano a las 02:00.

Ethan se quedó mirando la pantalla.

—¿Qué hacéis cuando pasa? —preguntó Ethan.

Las orejas de Caleb enrojecieron. —Volvemos a ejecutar el lote.

Se oyó decirlo y se le hizo un nudo en la garganta.

Volver a ejecutar el lote no era una solución. Era una confesión. Significaba: no sabemos por qué falla, así que lo volvemos a ejecutar y esperamos que la respuesta cambie.

Ethan no reaccionó. No visiblemente. Pero reconoció la frase. La había escuchado en una docena de otros edificios, con diferentes palabras, de diferentes bocas. La confesión siempre era la misma: no tenemos pruebas, así que fingimos que el problema no existe hasta que lastima a alguien.

—Escríbelo —dijo Ethan—. Un caso específico. Invéntate nombres y números. Algo de lo que podamos hablar sin involucrar el cheque de pago de una persona real.

Caleb miró a Nathan.

Nathan estaba de pie detrás de ellos, con el café en la mano, observando. Había estado observando desde que Ethan se sentó. Sin entrometerse. Sin irse. De pie en esa cuidadosa tierra de nadie donde la esperanza y la sospecha se turnan.

Nathan asintió, apenas, y recitó de memoria: —Texto plano. Columnas de ancho fijo. ID de empleado, nombre, código de estado, ciudad, horas, tarifa, estado civil. Eso es lo que generan los clientes VB6. Una línea por empleado.

Las palabras salieron automáticas, como una oración que había recitado tantas veces que ya no requería fe.

Ethan abrió una terminal en su portátil. Sus dedos se movieron rápidamente pero sin prisa. Creó una carpeta de proyecto llamada harness. Dentro de ella, una subcarpeta llamada fixtures.

Tecleó un archivo de texto plano. Una línea. Columnas de ancho fijo, exactamente en el formato que Nathan había descrito:

001  TEST EMPLOYEE       MI  DETROIT     40.00  25.00  S

Un empleado falso. Cuarenta horas a veinticinco dólares la hora. Detroit, Michigan. Estado civil soltero.

El archivo se veía exactamente como algo que un cliente VB6 habría generado y enviado por FTP. Excepto que ningún cliente VB6 lo había hecho. Lo había hecho Ethan, en un portátil que nunca había tocado VB6 y nunca lo haría.

Lo guardó como midwest_manufacturing.dat y lo colocó en la carpeta fixtures.

Caleb frunció el ceño. —¿Qué hace eso?

—Nada todavía —dijo Ethan—. Esa es la entrada. Ahora escribimos la expectativa.

Creó otra carpeta dentro del proyecto: features. Dentro de ella, un archivo llamado state_tax.feature.

Tecleó lentamente. Deliberadamente. Dejando que Caleb y Nathan vieran aparecer cada palabra en la pantalla.

Feature: Retención de impuestos estatales
  Los lotes de nómina calculan las retenciones federales, estatales y locales
  en función de la jurisdicción y el estado civil.

  Scenario: Empleado en Detroit con impuesto municipal
    Dado un archivo de nómina para el cliente "Midwest Manufacturing"
    Y un empleado en "Detroit, MI" que trabajó 40 horas a $25.00
    Cuando el lote procesa el archivo entrante
    Entonces el salario bruto debería ser de $1,000.00
    Y la retención estatal de MI debería ser de $42.50
    Y el impuesto de la ciudad de Detroit debería ser de $18.40

Caleb lo leyó dos veces.

Su ceño fruncido cambió de forma. Ya no era confusión. El tipo de ceño fruncido que pones cuando te das cuenta de que la pared que pensabas que era de carga en realidad era de cartón.

—Eso son solo oraciones —dijo Caleb.

—Oraciones estructuradas —dijo Ethan—. Una herramienta llamada Cucumber lee este archivo. Cada línea se asigna a una pieza de código Ruby que hace algo concreto.

—Ruby —repitió Caleb, como si estuviera saboreando una palabra que solo había visto en ofertas de trabajo.

Ethan asintió. —Ruby ejecuta la automatización por debajo. Cucumber es la capa superior que habla inglés. El punto es que cualquier persona en este edificio puede leer este archivo y saber exactamente lo que estamos probando. No se requiere programación. Solo inglés.

Detrás de ellos, el agarre de Nathan sobre su taza de café se apretó.

Inglés.

La palabra resonó en su cabeza. No porque fuera sorprendente. Porque era peligrosa.

Si las pruebas estuvieran escritas en un lenguaje que solo hablaban los desarrolladores, nadie más se molestaría en leerlas. Los expertos en la materia las descartarían como «cosas de programadores» y volverían a sus carpetas.

Pero inglés.

Inglés significaba que Linda podía leerlas.

Nathan tragó saliva.

Caleb se inclinó más hacia la pantalla. —Entonces, ¿dónde está la parte de Ruby? ¿La parte que realmente hace algo?

Ethan señaló la carpeta features y creó una subcarpeta dentro de ella: step_definitions. Dentro de eso, un archivo llamado payroll_steps.rb.

—Aquí es donde las oraciones se conectan con la realidad —dijo Ethan—. Observa.

Señaló la primera línea del escenario.

—«Dado un archivo de nómina para el cliente Midwest Manufacturing». Cuando Cucumber lee esa línea, activa un fragmento de código Ruby. Ese código toma el archivo de datos (fixture) que acabamos de crear y lo copia en la carpeta INCOMING en el servidor de pruebas. La misma carpeta compartida donde los datos reales del cliente aterrizan cada noche por FTP.

La boca de Caleb se abrió un poco. —¿Simplemente… lo copia allí?

—Al lote COBOL no le importa quién puso el archivo ahí —dijo Ethan—. Recoge lo que caiga en INCOMING y lo procesa. Un cliente VB6, un script en Ruby, un humano arrastrando un archivo con el ratón. El lote no nota la diferencia.

Nathan sintió que su pulso se aceleraba.

Lo había sabido durante años. Nunca había escuchado a nadie decirlo en voz alta. El cliente VB6 estaba muerto, pero los archivos que generaba eran solo texto. Texto plano y estúpido. Cualquier cosa que pudiera escribir texto podía reemplazar al cliente VB6 con el propósito de alimentar al lote.

La revelación era tan obvia que resultaba embarazosa. Y nadie había actuado en consecuencia en todos los años desde que murió VB6.

Ethan movió el dedo a la siguiente línea.

—«Cuando el lote procesa el archivo entrante». Esa línea activa el propio lote. El mismo ejecutable COBOL que se ejecuta a las 02:18 todas las noches. —Miró a Nathan—. ¿Cómo lo inicias manualmente?

Nathan dudó.

Podía sentir el hábito intentando tomar el control. El hábito de no tocar nada. El hábito de sobrevivir. El hábito de proteger el sistema manteniendo a todos los demás alejados de él.

Sacó una nota adhesiva de debajo de su teclado y la deslizó sobre el escritorio. El nombre de un servidor. Una ruta de red. Una contraseña que parecía que alguien la había tecleado en 2004 y nunca la había cambiado.

—Tarea programada —dijo Nathan en voz baja—. Puedes activarla desde la línea de comandos. schtasks /Run /S y el nombre del servidor. La tarea se llama PayrollBatch.

Ethan tecleó el comando en la definición de paso de Ruby.

—El código Ruby activa esa tarea —dijo Ethan—. Luego espera. Consulta la carpeta OUTGOING cada pocos segundos. Cuando aparece un archivo de resultados con una marca de tiempo más reciente que el momento en que iniciamos el lote, sabe que la ejecución ha terminado.

Caleb estaba muy quieto. Su pierna había dejado de rebotar.

—¿Y la última parte? —preguntó Caleb.

Ethan señaló las líneas de Entonces.

—«Entonces el salario bruto debería ser de mil dólares». El código Ruby abre el archivo de salida en OUTGOING. Lee los números. Columnas de ancho fijo de nuevo. Comprueba si el salario bruto, la retención estatal y el impuesto de la ciudad coinciden con lo que escribimos en el escenario. Si coinciden, el paso pasa. Si no, falla.

—Falla —repitió Caleb.

—Falla con un mensaje. Se esperaba esto, se obtuvo aquello. Sin ambigüedad. Sin discusión. Los números coinciden o no.

Caleb se recostó en su silla.

—Así que hace lo que haría una persona —dijo lentamente—. Dejar un archivo en la carpeta, iniciar el lote, esperar la salida, comprobar los números. Excepto…

—Excepto que escribe lo que esperaba antes de mirar la respuesta —dijo Ethan—. Y lo hace de la misma manera cada vez. No se le puede olvidar. No puede redondear mentalmente. No puede decidir que el resultado parece lo suficientemente aproximado.

Nathan sintió que algo cambiaba en su pecho. Un aflojamiento. El tipo de aflojamiento que sientes cuando has estado aguantando la respiración durante tanto tiempo que te has olvidado de lo que se siente al respirar.

Esto no era una simulación. Esto no era una prueba de concepto. Este era un arnés alrededor del lote en vivo. Sin herramientas muertas requeridas. Sin licencia de Micro Focus. Sin cliente VB6. Solo archivos que entran, el lote se ejecuta, archivos que salen y una respuesta honesta.

—Ejecutémoslo —dijo Ethan.

Tecleó un solo comando en el terminal:

cucumber features/state_tax.feature

La pantalla se quedó en silencio por un momento. Luego el texto comenzó a desplazarse.

Feature: Retención de impuestos estatales

  Scenario: Empleado en Detroit con impuesto municipal
    Dado un archivo de nómina para el cliente "Midwest Manufacturing"
    Y un empleado en "Detroit, MI" que trabajó 40 horas a $25.00
    Cuando el lote procesa el archivo entrante

El cursor parpadeó. Esperando.

Pasó un minuto. Nadie habló.

El lote se estaba ejecutando en el servidor de pruebas. El ejecutable COBOL que Thomas Whitaker había compilado con Micro Focus en algún momento a fines de la década de 1990 estaba procesando un archivo de datos que no existía diez minutos antes.

Nathan podía escuchar el latido de su propio corazón en el silencio.

Dos minutos. Tres. Caleb se removió en su silla. La luz fluorescente sobre ellos chasqueó débilmente, como hacen las luces fluorescentes cuando estás esperando algo y el universo quiere que sepas que no tiene prisa.

Cuatro minutos. Ethan permaneció sentado, con los brazos cruzados, observando el cursor como un hombre que había hecho esto antes y sabía que la espera era el precio.

Cinco minutos.

Luego la salida continuó:

    Entonces el salario bruto debería ser de $1,000.00
    Y la retención estatal de MI debería ser de $42.50
    Y el impuesto de la ciudad de Detroit debería ser de $18.40
      esperado: 18.40
      obtenido: 14.40 (FAILED)

1 scenario (1 failed)
6 steps (1 failed, 5 passed)
5m17.482s

FALLÓ.

La palabra se quedó en la pantalla como una acusación.

Limpia. Honesta. No negociaba.

Esperado $18.40. Obtenido $14.40. Una diferencia de cuatro dólares que se había estado escondiendo dentro del lote nocturno sabe Dios cuánto tiempo, visible solo cuando alguien la captaba manualmente y llamaba para quejarse.

Ahora era visible a las 11:14 de un lunes por la mañana para cualquiera que pudiera leer inglés.

El silencio cayó alrededor del escritorio. El tipo de silencio que ocurre cuando una habitación se da cuenta de algo que no sabía que era posible.

Nathan dejó su taza de café porque le temblaba la mano y no confiaba en sí mismo para sostenerla.

Nunca había visto al sistema acusarse a sí mismo. Ni una vez en todos sus años. Había visto registros de errores. Había visto trazas de pila. Había visto a Linda negar con la cabeza y decir «siempre ha sido así». Pero nunca había visto una oración en un lenguaje sencillo en una pantalla que dijera: esto es lo que debería pasar, esto es lo que realmente pasó, y los dos no coinciden.

Su cerebro intentó rechazarlo de la misma manera que rechazaba el sueño.

Esto es peligroso, le susurró.

Esto es evidencia.

Dos de los desarrolladores de Nathan se habían acercado.

Olivia Parker se apoyó contra un archivador con su cuaderno abierto, el bolígrafo flotando sobre el papel sin tocarlo. Sus ojos estaban fijos en la salida del terminal. Su teléfono, boca arriba junto al cuaderno, se iluminó una vez con un recordatorio de la guardería antes de que le diera la vuelta sin leer el resto. Ryan Mitchell estaba de pie detrás de Caleb con los brazos cruzados, pero su postura se inclinaba hacia adelante de todos modos, como si la curiosidad lo hubiera agarrado por el cuello. Un trazo azul de crayón aún marcaba el borde de un puño donde alguien pequeño lo había abrazado antes del trabajo.

Olivia habló primero. —Ese fallo. ¿Es real?

Ethan tocó la pantalla suavemente. —Es tan real como lo que sea que haga el COBOL. El archivo de datos entró. El lote se ejecutó. La salida salió. Los números no coinciden con lo que esperábamos.

—Pero los números esperados —presionó Olivia—. ¿Cómo sabemos que esos son correctos? ¿Quién dice que el impuesto de la ciudad de Detroit debería ser de $18.40?

Ethan la miró. Estaba haciendo la pregunta correcta.

—Nadie lo dice todavía —dijo Ethan—. Ese es el punto. Ahora mismo escribimos lo que creemos que es correcto basándonos en lo que me dijo Caleb. Si nos equivocamos sobre la expectativa, la cambiamos. Si el lote está equivocado, hemos encontrado un error. De cualquier manera, aprendemos algo.

Ryan descruzó los brazos. —Así que podemos dejar de discutir sobre si es un error de redondeo o malos datos de entrada.

—Ahora podemos discutir sobre cuál debería ser la respuesta correcta —dijo Ethan—. Lo que al menos es un argumento que se puede ganar.

Caleb estaba mirando el terminal con una expresión que Nathan reconoció. No emoción exactamente. Más bien la mirada en el rostro de alguien cuando descubre que la puerta contra la que ha estado empujando estuvo abierta todo el tiempo.

—¿Podemos ejecutarlo de nuevo? —preguntó Caleb.

—Ahora mismo si quieres —dijo Ethan.

—¿Y hará lo mismo? ¿Mismo archivo, mismo lote, misma comprobación?

—Cada vez.

Caleb exhaló. —Nunca hemos tenido eso.

Nadie respondió porque nadie necesitaba hacerlo.

Detrás de ellos, Linda Pritchard se aclaró la garganta.

El sonido aterrizó como un mazo.

Todos se giraron.

Linda sostenía su carpeta contra su pecho como un escudo. La carpeta era gruesa y tenía las esquinas dobladas, llena de impresiones que olían débilmente a tóner y loción para manos. El peso físico de las reglas. El tipo de peso en el que podías confiar cuando la gente cambiaba de opinión.

—No estoy segura de que este sea el momento para algo tan frágil —dijo.

Su voz era tranquila. Sus nudillos estaban blancos alrededor de la carpeta.

—Esta nómina se ejecuta todas las noches —continuó—. Si la rompes, la gente no cobra el viernes.

Ethan no se inmutó. No discutió. Señaló el terminal detrás de él sin mirarlo.

—Esa prueba no cambió el lote —dijo—. No tocó el COBOL. No modificó ni una sola línea de código. Copió un archivo, dejó que el lote hiciera su trabajo y leyó lo que salió. Lo único nuevo aquí es que alguien anotó lo que esperaba antes de mirar la respuesta.

Los ojos de Linda se desviaron hacia el terminal. Leyó el Gherkin. Podía leerlo porque era lenguaje natural.

Por una fracción de segundo, algo cruzó su rostro que no era ira.

Fue reconocimiento.

Ella conocía esas reglas de impuestos. Sabía lo que debería ser el impuesto de la ciudad de Detroit sobre mil dólares de salario bruto. Sabía por qué podría salir mal. Y sabía que una herramienta que podía hacer la pregunta en un lenguaje sencillo y obtener una respuesta sencilla no era una amenaza para el lote.

Era una amenaza para ella.

Peor aún, amenazaba el acuerdo que les había permitido a todos vivir con medias verdades durante años. Si Linda decía que el número estaba mal, ella era dueña de la confesión. Si decía que estaba bien y Ethan demostraba lo contrario, también era dueña de eso. Mucho más seguro mantener la precaución como una virtud profesional y esperar a que alguien con un título más alto llamara a la cosa por su nombre.

—Hemos gestionado estas ejecuciones con mucho cuidado durante mucho tiempo —dijo Linda.

Ethan le sostuvo la mirada. —Lo sé. Por eso estoy aquí.

Linda se dio la vuelta y caminó de regreso a su escritorio. Sus tacones repicaron en el suelo como un reloj contando hacia atrás.

Nathan la vio irse.

No la siguió.

Ya no sabía cómo.

Martes, 15:03 — La Mentira de Staging

Sala de servidores con un rack medio abierto y una maraña de cables. Nathan Cole está arrodillado en el suelo con unos chinos gastados, con las mangas arremangadas, rastreando un cable de red a través de un nido de ratas de cableado detrás del rack. Ethan Carter está de pie a su lado con un bloc de notas, la sudadera abrochada, el rostro iluminado por el resplandor del monitor. Una vieja torre de Windows Server está sentada en un estante con una etiqueta escrita a mano: 'TEST???'. Una pizarra cercana muestra direcciones IP garabateadas y contraseñas tachadas. Se ven los zapatos de vestir y las perneras del pantalón del traje de Derek Lawson en la puerta, con su postura rígida y ofendido por el polvo. Luces fluorescentes, habitación cálida y zumbante.
«Todos los lugares en los que Ethan había trabajado tenían un entorno de ensayo (staging).»

Todos los lugares en los que Ethan había trabajado tenían un entorno de ensayo (staging). El concepto era simple: una copia del sistema real donde verificabas los cambios antes de que llegaran a producción. Subías el código a staging, observabas su comportamiento, confirmabas que nada se rompía, y luego lo pasabas a vivo. En 2026, la palabra se había vuelto inseparable de los pipelines de despliegue y la infraestructura en la nube. Las empresas SaaS ejecutaban entornos de staging que se activaban automáticamente con cada cambio de código, se probaban a sí mismos y desaparecían cuando terminaban. Incluso los talleres pequeños tenían algo. Un segundo servidor. Una máquina virtual. Un contenedor Docker en el portátil de alguien. Cualquier cosa que te permitiera responder a la pregunta: ¿funciona este cambio antes de que una persona real dependa de él?

No tenía que ser elegante. Tenía que existir.

Aquí, no existía.

Esa era la verdad que nadie había nombrado hasta ayer.

La habitación estaba más caliente de lo que debería. No un calor reconfortante. Un calor sellado y zumbante que se pegaba a la piel de Nathan. El aire sabía a polvo y plástico calentado y a décadas de decisiones postergadas.

Tenían una habitación llena de máquinas y un conjunto de historias que la gente se contaba a sí misma para poder dormir.

Nathan llamaba a una máquina «test» porque hacía que el calendario pareciera menos demente.

La máquina no estaba de acuerdo.

Ahora Nathan estaba en el suelo, rastreando un cable de red a través del nido de ratas detrás del rack. Tres máquinas, seis cables, cero etiquetas. Estaba intentando averiguar qué caja estaba conectada a qué puerto de red, porque alguien había movido las cosas hacía dos años y nadie había actualizado la pizarra. Le dolían las rodillas. Le dolía la espalda. El zumbido fluorescente sobre ellos le hacía doler las muelas.

—La intercalación de SQL es diferente —murmuró Nathan, leyendo una configuración de una pantalla.

Ethan levantó la vista de su bloc de notas. —¿Diferente cómo?

—El servidor en vivo ordena el texto de una manera. Esta caja lo ordena de otra. —Nathan se levantó del suelo y señaló la pantalla—. La intercalación (collation) es la regla que usa la base de datos para decidir en qué orden van las cosas. Si importan las mayúsculas y minúsculas. Afecta a cada consulta, a cada búsqueda, a cada informe. El sistema en vivo usa SQL_Latin1_General_CP1_CI_AS. Esta máquina está configurada en SQL_Latin1_General_CP1_CS_AS.

Lo dijo como si le estuviera leyendo la historia clínica de un paciente a un médico que nunca lo había visto.

—Una letra de diferencia —continuó Nathan—. «CI» significa insensible a mayúsculas y minúsculas. «CS» significa sensible a mayúsculas y minúsculas. En el sistema en vivo, «DETROIT» y «Detroit» y «detroit» son la misma ciudad. En esta caja, son tres ciudades diferentes. Los clientes VB6 enviaban todo en mayúsculas. El lote lo almacena así. Pero si una consulta usa minúsculas y mayúsculas, o si los datos de prueba entran en minúsculas, los resultados divergen. Una búsqueda que encuentra un registro en vivo no devuelve nada aquí.

—Así que cada prueba que hemos ejecutado en esta máquina… —empezó Ethan.

—Estaba respondiendo a una pregunta diferente de la que pensábamos —terminó Nathan.

Ethan lo anotó.

El bolígrafo rascó el papel, ruidoso en la pequeña habitación.

Nathan sintió que algo se retorcía en su pecho. Nadie anotaba estas cosas. No porque odiaran la documentación. Porque anotarlo lo hacía real. Y lo real lo hacía más difícil de ignorar.

—Eso también significa que nuestros resultados de Cucumber podrían estar mintiéndonos —dijo Ethan. No enojado. Con naturalidad—. Si el servidor de pruebas no se comporta como el sistema en vivo, no sabemos si un fallo es un error de COBOL o un error de entorno.

Nathan asintió. Había estado pensando lo mismo desde la ejecución de ayer. La discrepancia de cuatro dólares en el impuesto de la ciudad de Detroit. ¿Y si la lógica de COBOL era correcta y el servidor de pruebas era el mentiroso?

—Necesitamos arreglar esta caja primero —dijo Ethan—. Misma intercalación SQL, misma configuración regional de Windows, misma versión de tiempo de ejecución de COBOL. De lo contrario, cada prueba que escribamos está construida sobre arena.

Derek Lawson apareció en la puerta como si hubiera sido convocado por la palabra «servidor».

No entró del todo. Se quedó rondando, ofendido por el polvo y los cables y por el hecho de que la realidad tuviera la audacia de ser física.

—¿Qué estamos haciendo exactamente aquí? —preguntó Derek.

Nathan mantuvo los ojos en la pantalla. —Averiguando por qué test no es test.

La mandíbula de Derek se tensó.

—Esa habitación es sensible —dijo Derek—. Tenemos proveedores entrando y saliendo. Tenemos obligaciones de auditoría. Necesito entender por qué estamos abriendo cosas.

Ethan lo miró. Su expresión era educada. Sus ojos no lo eran.

—Esto es cumplimiento —dijo Ethan—. Ahora mismo cumplen porque Nathan memoriza el edificio. Si Nathan se enferma un miércoles, no tienen cumplimiento. Tienen fe.

Derek parpadeó.

No le gustaba que le dijera la verdad alguien que no tenía un título.

—No necesitamos que esto se convierta en un proyecto de ciencias —dijo Derek.

Ethan asintió una vez, despacio. —Bien. Entonces dejemos de hacer arqueología en el sistema en vivo.

Nathan esperaba que Derek explotara.

Derek no lo hizo. Derek se tragó la irritación y la sustituyó por una sonrisa.

—Bien —dijo Derek—. Pero seamos disciplinados con el alcance. Sin tiempo de inactividad. Sin sorpresas. Mantenedme informado.

Se fue. Sus zapatos repicaron por el pasillo como un metrónomo.

Nathan escuchó hasta que el sonido se desvaneció.

En ese silencio, podía escuchar respirar al rack de servidores.

Ethan volvió a mirar a Nathan.

—Construimos un entorno de staging —dijo Ethan—. Un staging real. Igual que el sistema en vivo. Luego ejecutamos la suite de Cucumber contra él cada vez que alguien pregunte si el lote está haciendo lo correcto.

Nathan negó con la cabeza automáticamente.

No era desacuerdo. Era trauma.

—Lo han intentado —dijo Nathan—. Cada vez que alguien lo intenta, Derek dice que sí hasta que se siente incómodo. Luego desconecta todo y lo llama gestión de riesgos. Y volvemos aquí. Yo. Solo. A las 02:18.

Ethan escuchó.

Luego dijo, en voz baja: —Entonces lo hacemos lo suficientemente pequeño para que no pueda justificar el matarlo.

Nathan se le quedó mirando.

En la cabeza de Nathan, una lista de intentos fallidos se levantó como fantasmas.

En la voz de Ethan, los fantasmas sonaban menos convincentes.

Miércoles, 18:26 — El Número

Sala de conferencias con una pizarra que muestra dos cajas dibujadas con rotulador: 'LIVE SYSTEM' y 'STAGING' con una flecha entre ellas etiquetada 'Mismo SQL, mismo COBOL, mismas carpetas'. Debajo de las cajas, una lista: 'MI ✗  OH ✓  PA ✗  IN ✓' con los fallos rodeados en rojo. Ethan Carter está de pie junto a la pizarra con una camiseta, con el rotulador en la mano. Nathan Cole está sentado hacia adelante en su silla, con los codos en la mesa, los ojos muy abiertos a pesar del agotamiento. Caleb Turner está sonriendo. Olivia Parker tiene su cuaderno abierto. Ryan Mitchell mira la pizarra, medio sonriendo. Linda Pritchard está sentada rígidamente con su carpeta, Sharon Mills a su lado con gafas en una cadena, Donna Reeves con un cuaderno apretado con fuerza. Donuts rancios en la mesa. Oscuro afuera.
«El aire olía a azúcar y a café quemado y a la leve acidez del pánico de ayer.»

El aire olía a azúcar y a café quemado y a la leve acidez del pánico de ayer.

Ethan había pasado el martes y el miércoles arreglando el servidor de pruebas con Nathan. Misma intercalación SQL. Misma configuración regional de Windows. Mismo tiempo de ejecución de COBOL. La máquina ahora coincidía con el sistema en vivo lo suficientemente cerca como para que Ethan confiara en que dijera la verdad.

Había ejecutado la suite de Cucumber nuevamente después de la solución.

El escenario del impuesto de la ciudad de Detroit todavía fallaba. Esperaba $18.40, obtenía $14.40. Mismos números. Misma discrepancia.

Eso significaba que el fallo no era una mentira del entorno. Era real. El lote COBOL estaba calculando mal el impuesto de la ciudad de Detroit. Lo había estado calculando mal durante años. Nadie lo había detectado porque nadie había anotado cuál debería ser la respuesta antes de mirar cuál era la respuesta.

Esa fue la revelación del martes. La de hoy era diferente.

Ethan señaló la pizarra.

Dos cajas. LIVE SYSTEM. STAGING. Una flecha entre ellas.

—Ahora tenemos un entorno de staging que se comporta como el sistema en vivo —dijo Ethan—. Mismo SQL, mismo tiempo de ejecución de COBOL, misma estructura de carpetas. Cuando ejecutamos un escenario de Cucumber contra staging y falla, el fallo es real. No ruido del entorno.

Caleb se inclinó hacia adelante. —¿Cuántos escenarios tenemos?

—Cuatro —dijo Ethan—. Impuesto estatal para Michigan, Ohio, Pensilvania e Indiana. Dos pasan. Dos fallan.

Dos fallos en cuatro escenarios. Cincuenta por ciento. Nathan sintió que su mandíbula se apretaba.

No porque el número le sorprendiera. Porque el número era visible.

Ethan rodeó con un círculo rojo los dos fallos. Michigan. Pensilvania. Dos estados donde el lote COBOL estaba produciendo números incorrectos. Dos estados donde los clientes habían estado llamando para quejarse y Linda había estado diciendo «siempre ha sido así».

Ahora la pizarra decía lo contrario.

Sharon Mills miró la lista. Su mano se desvió hacia la cadena de sus gafas de la forma en que siempre lo hacía cuando estaba nerviosa.

—Esos se han estado ejecutando durante años —dijo Sharon—. Los clientes nos lo habrían dicho.

—Los clientes sí se lo dijeron —dijo Ethan—. Nathan lo arregló a mano a las 02:00. Las quejas se detuvieron porque alguien las absorbió. No porque el problema desapareciera.

La boca de Sharon se abrió. Luego se cerró. Nathan casi podía ver el pensamiento moviéndose detrás de sus ojos: si esto fuera verdaderamente grave, Linda ya lo estaría diciendo de forma más clara. Sharon usaba la contención de Linda de la misma manera que Linda usaba las viejas carpetas, como certeza prestada.

La voz de Donna salió tensa. —Entonces, ¿qué estás diciendo? ¿Que nos hemos equivocado?

No quería sonar asustada. Lo estaba.

Ethan no señaló a nadie. Señaló la pizarra.

—Estoy diciendo que el lote produce números. Ahora podemos preguntar si esos números son correctos. Antes de esta semana, nadie podía hacer esa pregunta y obtener una respuesta honesta. La respuesta siempre era cualquier cosa que Nathan atrapara a las 02:00.

Nathan sintió que le subía el calor detrás de los ojos.

No lágrimas. La otra cosa. La sensación que tienes cuando alguien dice la oración que has estado intentando armar durante diez años.

Pensó en las caras de sus hijos por la mañana. La forma en que les besaba la frente mientras su mente aún estaba revisando la ventana del lote. La forma en que los ojos de su esposa seguían su teléfono durante la cena.

Una respuesta honesta, pensó. No Nathan. No a las 02:00. Una respuesta honesta a las 11:00 de un lunes por la mañana.

Olivia miró a Nathan y lo vio. No dijo nada. Asintió una vez, levemente.

Su mano se movió automáticamente hacia el teléfono junto a su cuaderno, no para revisarlo todavía, solo para sentir dónde estaba. Ryan se frotó el pulgar sobre su anillo de bodas y mantuvo los ojos en la pizarra, pero algo en su rostro se había tensado. Nathan no era el único en la habitación que escuchaba un coste dentro de las palabras de Ethan.

Ryan se recostó y exhaló. —Entonces seguimos escribiendo escenarios. Cada regla fiscal que conozcamos. Cada caso límite. Construir una biblioteca.

—Esa es la idea —dijo Ethan—. Cada escenario es una pregunta que el sistema tiene que responder. Cuantas más preguntas hagamos, menos dependeremos de que alguien se quede despierto toda la noche para atrapar las que hace mal.

La silla de Linda crujió cuando ella se movió.

No levantó la mano. No necesitaba permiso.

—¿Y qué pasa con el COBOL? —preguntó Linda.

La habitación se tensó.

Linda escuchó su propia voz y odió que temblara por los bordes. El COBOL era el fantasma de Thomas Whitaker. También era su cheque de pago.

Ethan dejó que la pregunta se quedara ahí porque se lo merecía.

—El COBOL se queda —dijo finalmente—. Por ahora. No lo reescribimos. Lo envolvemos. El arnés de Cucumber prueba sus salidas sin tocar su código. Lo tratamos como una máquina que funciona pero que no puede explicarse a sí misma.

Los ojos de Linda se entrecerraron. —¿No confías en él?

Ethan le devolvió la mirada. —Confío en él de la forma en que confías en una máquina de cincuenta años que tiene que funcionar todas las noches. Confío en él porque ha sobrevivido. No confío en que sea comprensible. Por eso estamos anotando la comprensión. En inglés. Donde todos puedan leerlo.

Nathan vio el momento en que Linda comprendió lo que estaba pasando.

No la pizarra. No el servidor de staging.

La dirección.

El fin de los guardianes.

La boca de Linda se tensó. Sharon se miró las manos. Donna miró la pizarra como si fuera un veredicto. Ninguna de ellas miró a las demás el tiempo suficiente para admitir que todas estaban esperando que una de las otras decidiera qué significaba el veredicto.

Ethan tapó el rotulador.

—Hoy no ha cambiado nada para sus clientes —dijo—. Los lotes se ejecutarán esta noche. Los cheques de pago saldrán el viernes. No voy a romper su sistema.

Hizo una pausa.

—Le estoy enseñando a explicarse.

Jueves, 02:12 — La Ventana

Oficina a altas horas de la noche, Nathan Cole solo en su escritorio iluminado por el resplandor del monitor. Un informe impreso de salida de COBOL está extendido sobre el escritorio con filas resaltadas. Nathan Cole: los ojos rojos por la fatiga, con una taza de café en la mano, un dedo trazando un elemento de línea en el informe. Una carpeta de manila con la etiqueta manuscrita 'MI CASES' está abierta junto a su teclado. El reloj de la pared marca las 02:12. Afuera: luces de la calle sobre el pavimento mojado, la lluvia sigue cayendo. El zumbido de los servidores al fondo. La silla junto al escritorio de Nathan está vacía.
«A las 02:12, Nathan estaba solo.»

A las 02:12, Nathan estaba solo.

Siempre estaba solo a las 02:12.

El edificio se sentía más pequeño por la noche. Las esquinas más afiladas. Todos los sonidos eran más fuertes porque había menos voces para ahogarlos. El zumbido del servidor vivía bajo su piel. Le ardían los ojos de mirar registros durante demasiado tiempo, y le dolían los hombros de estar tensos durante meses.

Ethan se había ido a las 17:30. Como una persona normal. Como alguien cuyo matrimonio no estaba unido por el mismo hilo que mantenía unido el lote.

A las 18:07 Nathan había enviado un mensaje de texto diciendo que iba en camino.

A las 20:43 había enviado un segundo mensaje.

Lo siento. Todavía aquí.

Nadie respondió al segundo.

Nathan se quedó mirando un informe en su escritorio. Un enemigo familiar. Números con códigos de jurisdicción que parecían abreviaturas de pecados. Podía sentir los códigos en su boca como palabras amargas. Algunos significaban estados. Algunos significaban ciudades. Algunos significaban reglas que nadie recordaba hasta que lo hacía el IRS.

Un caso de hace tres meses. Cliente en Michigan. Un empleado. Dos impuestos municipales. Una regla de cuotas de sindicato local. El archivo llegó tarde, se procesó en la siguiente ejecución. La retención se desplazó en cuatro dólares. Cuatro. El cliente llamó y dijo que el sistema estaba equivocado. Linda dijo que estaba bien porque siempre había sido así.

Nathan lo había arreglado a mano. A las 02:00. Como siempre lo hacía.

Cuatro dólares.

En un sistema sano, cuatro dólares es un error de redondeo. En nómina, cuatro dólares es una demanda esperando un calendario.

Abrió un cajón y sacó una carpeta de manila. Pestañas etiquetadas por mes. Pilas de impresiones de texto plano sujetadas con clips. Encontró el caso de Michigan y lo sostuvo bajo la lámpara del escritorio.

Columnas de ancho fijo. ID de empleado, nombre, jurisdicción, horas, tarifa. El cheque de pago de una persona real. Una persona real que recibió cuatro dólares menos de lo que debería porque Thomas Whitaker había codificado algo en 1997 y nadie podía probar que estuviera mal.

Hasta esta semana.

Nathan miró la silla vacía junto a su escritorio. La silla en la que se sentaba Ethan durante el día, portátil abierto, sudadera puesta, tecleando escenarios de Cucumber en un idioma que Linda podía leer.

Podría construir un escenario a partir de este caso. Ahora conocía el formato. Había visto a Ethan hacerlo cuatro veces. Dado un archivo de nómina. Cuando el lote lo procese. Entonces los números deberían ser estos. Podría escribirlo él mismo, en inglés, y dejar que el arnés hiciera la pregunta.

Pero ese no era el punto.

El punto era si le mostraría la carpeta a Ethan por la mañana.

El viejo reflejo luchó contra él. El hábito de proteger el sistema manteniendo a todos los demás alejados de él. El hábito que decía que si dejas que alguien más vea las partes feas, entrará en pánico y tomará decisiones. Decisiones tomadas por personas que no entienden lo que están tocando. Decisiones que rompen el lote un miércoles y dejan a 5.000 personas sin cheque de pago el viernes.

Nathan se sentó en la oficina a oscuras con la carpeta en su escritorio y escuchó el lote que se ejecutaba en el servidor al final del pasillo.

A las 02:18, la tarea programada se disparó. El ejecutable COBOL que Thomas Whitaker había compilado con Micro Focus en algún momento a fines de la década de 1990 procesó otra noche de nóminas. Cientos de archivos de clientes. Cinco mil empleados en tres estados. Archivos entran. Números salen. Nadie revisando. Nadie preguntando. Solo Nathan, despierto, solo, absorbiendo lo que saliera mal para que nadie más tuviera que saberlo.

El lote se ejecutó durante treinta y siete minutos. Nathan se quedó sentado en cada uno de ellos, mirando el registro desplazarse, bebiendo café que se había enfriado veinte minutos antes.

A las 02:55, el lote terminó. Estado verde. Sin errores en el registro.

Sin errores no significaba sin errores. Significaba que no había errores que el sistema supiera reportar. El fantasma de los cuatro dólares estaría ahí en alguna parte, escondido en la salida, invisible hasta que un cliente llamara y Linda dijera que siempre era así.

Nathan guardó la carpeta en su bolsa.

Condujo a casa bajo la lluvia. Su esposa estaba dormida. Sus hijos estaban dormidos. La casa estaba en silencio de la forma en que las casas están en silencio cuando la persona que vive allí nunca está en casa lo suficiente como para que el silencio se sienta cómodo.

Puso su alarma a las 06:30 y se acostó en la oscuridad.

A las 08:47, estaba de regreso en su escritorio. Ethan llegó a las 09:00, café en mano, sudadera desabrochada.

Nathan deslizó la carpeta de manila sobre el escritorio antes de que Ethan se sentara.

—Este es el que te decía —dijo Nathan.

Ethan miró la carpeta, luego a Nathan. No preguntó por qué Nathan la había traído. No preguntó qué le había costado a Nathan entregarla. Simplemente se sentó y la abrió.

Estudió las columnas de ancho fijo. ID de empleado, nombre, jurisdicción, horas, tarifa. Datos reales. El cheque de pago de una persona real.

—Podemos construir un escenario en torno a esto —dijo Ethan—. No el nombre real. Cambiamos los identificadores. Mantenemos los números.

Abrió su portátil y navegó a la carpeta harness. Cuatro archivos de feature ahora, frente a uno el lunes. Cuatro días. Cuatro documentos vivos que describían lo que debería hacer el lote COBOL en un lenguaje sencillo.

Ethan creó un nuevo archivo.

michigan_municipal.feature.

Tecleó:

Feature: Impuesto municipal de Michigan con cuotas sindicales
  Los archivos que llegan tarde y que cruzan las ventanas de procesamiento
  deben calcular el impuesto de la ciudad y las deducciones sindicales correctamente
  independientemente de cuándo los recoja el lote.

  Scenario: Archivo retrasado para un empleado con impuesto de la ciudad de Detroit y cuotas sindicales
    Dado un archivo de nómina para el cliente "Great Lakes Staffing"
    Y un empleado en "Detroit, MI" que trabajó 38 horas a $22.50
    Y el empleado tiene cuotas sindicales locales de $12.00 por período de pago
    Y el archivo llegó después de la hora límite de las 22:00
    Cuando el lote procesa el archivo entrante
    Entonces el salario bruto debería ser de $855.00
    Y la retención estatal de MI debería ser de $36.34
    Y el impuesto de la ciudad de Detroit debería ser de $20.52
    Y la deducción por cuotas sindicales debería ser de $12.00

Nathan leyó el escenario.

Lo leyó de la misma manera que Linda leía su carpeta. Palabra por palabra. Buscando la mentira.

—Las cuotas sindicales —dijo Nathan—. Esa es una deducción fija. ¿Debería descontarse antes del cálculo del impuesto de la ciudad o después?

Ethan lo miró. —Dímelo tú.

Nathan se frotó la cara. Su barba de varios días se arrastró por su palma. Había dormido cuatro horas.

—Después —dijo—. El impuesto de la ciudad se calcula sobre el salario bruto menos las deducciones antes de impuestos. Las cuotas sindicales son después de impuestos. Al menos eso es lo que hace el COBOL.

—¿Es eso lo que debería hacer?

Nathan se le quedó mirando.

Esa era la pregunta. La pregunta que nadie hacía porque hacerla significaba admitir que podrías haberlo estado haciendo mal durante veinte años.

—Eso es lo que diría Linda —dijo Nathan en voz baja—. Si coincide con el código tributario real de Michigan…

No terminó la frase.

Ethan guardó el archivo feature. Creó un nuevo fixture: great_lakes_staffing.dat. Tecleó el registro del empleado. Treinta y ocho horas a veintidós cincuenta. Jurisdicción de Detroit. Marcador de cuotas de sindicato local activado.

Los datos se basaron en el caso real de la carpeta de Nathan, con los nombres cambiados y el ID de empleado codificado. Mismas horas. Misma tarifa. Mismas jurisdicciones. Mismos códigos de deducción.

—¿Listo? —preguntó Ethan.

Nathan asintió.

Ethan tecleó:

cucumber features/michigan_municipal.feature

El terminal se quedó en silencio. Cucumber se cargó. Encontró el archivo feature. Emparejó los pasos de Dado con sus definiciones en Ruby. El Ruby copió el archivo de datos (fixture) a INCOMING en el servidor de staging. Activó el lote. El cursor parpadeó.

La oficina estaba despierta a su alrededor ahora. Teclados haciendo clic en la habitación de al lado. El teléfono de alguien sonando. La cafetera gorgoteando. Sonidos normales. Sonidos a la luz del día. El lote se estaba ejecutando a las 09:14 de un jueves por la mañana porque Nathan había llevado una carpeta de manila a casa a las 02:23 y la había traído de vuelta a las 08:47.

Pasaron cinco minutos. Seis. Caleb se acercó pero no interrumpió.

Luego apareció la salida.

  Scenario: Archivo retrasado para un empleado con impuesto de la ciudad de Detroit y cuotas sindicales
    Dado un archivo de nómina para el cliente "Great Lakes Staffing"
    Y un empleado en "Detroit, MI" que trabajó 38 horas a $22.50
    Y el empleado tiene cuotas sindicales locales de $12.00 por período de pago
    Y el archivo llegó después de la hora límite de las 22:00
    Cuando el lote procesa el archivo entrante
    Entonces el salario bruto debería ser de $855.00
    Y la retención estatal de MI debería ser de $36.34
    Y el impuesto de la ciudad de Detroit debería ser de $20.52
      esperado: 20.52
      obtenido: 16.52 (FAILED)
    Y la deducción por cuotas sindicales debería ser de $12.00

1 scenario (1 failed)
8 steps (1 failed, 1 skipped, 6 passed)
5m41.203s

FALLÓ.

Cuatro dólares menos de nuevo. Diferente empleado. Diferentes horas. Diferente tarifa. Misma discrepancia. El impuesto de la ciudad de Detroit era de $4.00 menos de lo que las matemáticas decían que debería ser.

La respiración de Nathan salió entrecortada.

No era una coincidencia. No era una casualidad. Un patrón. Un fantasma de cuatro dólares escondido dentro del COBOL durante años.

—Ahora lo sabemos —dijo Nathan. Su voz era apenas un susurro—. No es redondeo. No es el tiempo del archivo. El lote está restando algo. Cuatro dólares. Cada vez.

Ethan asintió. —Podría ser una exención fija que está codificada en alguna parte. Una deducción por empleado que era correcta hace veinte años y nadie actualizó.

Nathan se rio, una risa pequeña y rota.

—Eso suena exactamente a algo que Thomas habría hecho —dijo Nathan—. Codificar una regla en 1997 y olvidarse de decírselo a nadie.

Se quedó mirando la palabra en la pantalla. FALLÓ. Una palabra que había pasado su carrera evitando. Una palabra que significaba que el lote estaba equivocado, que la carpeta de Linda estaba equivocada, que el sistema en el que todos confiaban a las 02:18 había estado calculando silenciosamente mal el impuesto de la ciudad de Detroit durante sabe Dios cuánto tiempo.

El fallo no era una amenaza.

Era permiso.

Permiso para dejar de fingir que el sistema era sagrado. Permiso para decir en voz alta lo que Nathan había sabido en sus huesos: algo andaba mal, y la única razón por la que nadie lo había arreglado era que nadie podía demostrarlo antes de que el lote terminara y los números desaparecieran en los cheques de pago.

Ahora la prueba estaba en la pantalla. En inglés. Reproducible. A las 09:20 de un jueves por la mañana, a la luz del día, donde cualquiera podía verlo.

—Ahora podemos hablar sobre lo que realmente significa «siempre ha sido así» —dijo Ethan.

Nathan miró fijamente el terminal.

Afuera, había dejado de llover. Una luz de sol pálida atravesó las nubes por primera vez en toda la semana.

Adentro, por primera vez en años, Nathan sintió que el sistema se convertía en algo diferente a una situación con rehenes.

También sintió, con enfermiza claridad, por qué esto haría que despidieran a Ethan.

Viernes, 16:49 — Las Bibliotecarias

Sala de descanso con una máquina expendedora zumbante y una pequeña mesa redonda. Linda Pritchard: cárdigan oscuro, falda, zapatos planos sensatos, carpeta abierta, bolígrafo dando golpecitos. Sharon Mills: blazer beige, blusa estampada, gafas en una cadena, manos envueltas alrededor de un vaso de papel. Donna Reeves: vestido azul marino, cárdigan, agarrando un informe impreso de salida de Cucumber con líneas FALLADAS resaltadas, nudillos blancos. La ventana muestra un cielo nublado y un aparcamiento mojado. Dura iluminación fluorescente.
«Linda Pritchard había pasado tres décadas convirtiendo el caos en procedimiento.»

Linda Pritchard había pasado tres décadas convirtiendo el caos en procedimiento.

El procedimiento era su única autoridad real.

Los títulos iban y venían. Los dueños morían. Las plataformas caducaban.

El procedimiento se quedaba.

Podía sobrevivir a casi cualquier cosa siempre que las reglas vivieran en su carpeta y el conocimiento viviera en su cabeza.

Sharon bebía un café que sabía a papel quemado y no se quejaba porque quejarse no cambiaba nada.

La máquina expendedora zumbaba detrás de ella con la constante confianza de algo que solo tenía un trabajo.

Donna desdobló una copia impresa y la alisó. Sus yemas de los dedos estaban secas por el papel. Sus manos no sabían qué hacer cuando no sostenían algo que le dijera lo que era cierto.

Esta impresión no era de ella. Esta impresión era de Ethan.

La había encontrado en la impresora compartida. Un informe de salida de Cucumber. Escenarios. Dado. Cuando. Entonces. FALLÓ. Lenguaje sencillo que describía lo que el lote COBOL debería calcular para el impuesto de la ciudad de Detroit, y lenguaje sencillo que decía que el número era incorrecto.

—Está escribiendo pruebas —dijo Donna.

La boca de Sharon se apretó. —Lo vi.

—No pruebas como las que hacen los programadores —dijo Donna. Su voz tenía un temblor que no podía controlar—. Puedo leer estas. Están en inglés. Describen las reglas fiscales.

El bolígrafo de Linda dejó de golpear.

Levantó la vista.

Las luces fluorescentes hacían que su piel se viera gris.

—Lo sé —dijo Linda.

—Cualquiera podría leerlas —repitió Donna. Como si decirlo de nuevo lo hiciera menos aterrador—. Caleb se lo estaba mostrando a Olivia. Ryan estaba leyendo por encima de su hombro. Estaban hablando sobre el impuesto de la ciudad de Michigan como si lo entendieran.

Sharon dejó su taza en la mesa. —No lo entienden. No realmente. Hay cientos de jurisdicciones. Miles de reglas.

—No necesitan entenderlo todo —dijo Linda—. Solo necesitan suficiente lenguaje para comenzar a formar conclusiones a partir de unas pocas líneas en una pantalla.

La oración se sentó entre ellas como una piedra.

Se habían equivocado en algunas. Todas lo sabían. Las carpetas tenían inconsistencias. Las reglas cambiaban entre jurisdicciones, entre años, entre interpretaciones hechas bajo presión a las 03:00. Algunas de esas interpretaciones habían sido correctas. Algunas habían sido lo suficientemente precisas. Algunas habían sido incorrectas y nadie las había captado porque las únicas personas que podían verificar eran las mismas que habían tomado la decisión.

Esa era la trampa. Cada una de ellas llevaba un archivo privado de momentos que no habían encajado del todo bien. Una retención que parecía escasa. Un código de ciudad que se sentía extraño. Una deducción excusada porque el lote ya se había ejecutado y alguien importante quería que el día siguiera su curso. Ninguna de ellas confiaba en su propia memoria lo suficiente como para arrastrarla al exterior sin tener dónde escudarse.

Ahora una herramienta estaba verificando. En un lenguaje natural. Automáticamente. La misma comprobación cada vez.

La voz de Donna tembló. —Él apareció el lunes. Es viernes. Cinco días. Tiene cinco escenarios que prueban el lote sin abrir el COBOL, sin tocar VB6, sin preguntarnos nada.

Linda escuchó la palabra y sintió sabor a metal.

Sin preguntarnos.

Esa era la amenaza. No la herramienta. No el código Ruby. No la sintaxis Gherkin.

El hecho de que Ethan pudiera probar la salida del sistema sin preguntar a Linda, Sharon o Donna cuál debería ser la respuesta.

Él mismo podía escribir los valores esperados. Buscarlos. Calcularlos a partir de las tablas de impuestos publicadas. Compararlos con lo que realmente producía el lote. Y cuando los números no coincidían, la pantalla decía FALLÓ, y luego alguien iría al escritorio de Linda y preguntaría por qué.

Vendrían con evidencia.

No confusión. No una llamada telefónica de un cliente enfadado. No una vaga sensación de que algo no encajaba.

Evidencia. En un lenguaje sencillo. Repetible.

El foso no solo se estaba drenando. Estaba siendo documentado.

Sharon miró fijamente a su taza. Sus ojos brillaron.

—¿Crees que Nathan lo va a detener? —preguntó Sharon.

La expresión de Linda se endureció.

—Nathan está cansado —dijo Linda—. Nathan tiene hijos. Nathan quiere dormir. Puede que no esté en posición de cuestionar algo que parece ayuda.

Lo que no dijo fue el resto del cálculo: Derek nunca haría un juicio técnico por su cuenta si Linda sonaba insegura, y Graham nunca anularía a las mujeres leales de la época de Thomas Whitaker si Derek seguía sonando comedido. Todos por encima de ellas estaban esperando experiencia. Todas en esta habitación estaban esperando autoridad. Así era como los malos números sobrevivían a las personas respetables.

Donna apartó la mirada rápidamente, avergonzada de lo fuerte que le latía el corazón.

—¿Y qué nos pasa a nosotras? —preguntó Donna.

Odiaba el temblor.

Odiaba necesitar la respuesta.

Linda no respondió de inmediato.

No porque no lo supiera. Porque decirlo en voz alta lo hacía verdad.

—Dejamos de ser el primer lugar por el que tienen que pasar esas preguntas —dijo Linda.

Y si ellas no eran las únicas que lo sabían, solo eran mujeres de unos cincuenta años con un conjunto de habilidades muerto, una hipoteca y sin una forma educada de admitirlo.

Linda cerró su carpeta con un suave ruido sordo.

—No podemos detener el futuro —dijo Linda.

Luego se corrigió a sí misma.

—Pero puede que todavía tengamos algo que decir sobre el ritmo.

Linda escuchó las palabras salir de su boca y sintió sabor a metal. No se sentía como una villana. Se sentía como un animal acorralado haciendo cálculos.

Fuera de la ventana de la sala de descanso, el aparcamiento reflejaba el cielo como un espejo sucio.

Adentro, el foso se vació.

Un escenario a la vez.

Próximo Episodio: "La ejecución dice la verdad" Ethan convierte el arnés en una máquina que se niega a mentir. Cada cambio activa la suite de Cucumber. El lote se explica a sí mismo después de cada ejecución. La gerencia lo llamará progreso hasta que la verdad los señale.
×
×