Revisión 4: Evolución según Git

1.244 commits en 60 días, de ChatCLI v0.9 a la 9.11.0, y cuánto tardó cada norma en tener su prueba. Actualizada el 24 de octubre de 2026.

Método y límites

Los hechos se comprueban con git log, git show y git log -S sobre AGENTS.md; las fechas y versiones proceden de cada commit registrado. Las interpretaciones se identifican expresamente como tales. La mayoría de los commits contienen mensajes descriptivos y tareas referenciadas, lo que permite reconstruir la trayectoria de las decisiones clave.

Esta revisión examina el desfase histórico entre la redacción de cada norma en AGENTS.md y la creación de la prueba automatizada que la defiende, confirmando la validez práctica de la lección de la 9.0.0.

1. Cifras

  • 1.244 commits entre el 26 de agosto y el 24 de octubre de 2026, con actividad en 57 de esos 60 días; los picos siguen siendo los del inicio: 74 (02/09) y 65 (29/08).
  • 238 commits desde la revisión de la 9.2.3 (924aef6, 16/10), en 9 días seguidos, con un pico de 51 el 23/10; en ese tiempo se cerraron 39 hitos (M5 a M43) y salieron nueve versiones menores, de la 9.3.0 a la 9.11.0.
  • De esos 238 commits, 212 registran como coautor a Claude Opus 5.5; antes participaron también Claude Opus 5, Fable 5.1 y Antigravity (Gemini 3.8 Flash).
  • La suite pasó de 864 casos en la 9.2.3 a 702 en la 9.11.0, con más funciones cubiertas: los hitos M24, M32 y M41 podaron pruebas triviales, duplicadas o de ausencia.

2. Fases de evolución

Origen y crecimiento (26 de agosto – 16 de septiembre)

Nace ChatCLI v0.9 (39fed30), multichat y reconocimiento de voz (retirado posteriormente en cbc4cb1). Se introducen AgentCore y la primera integración MCP (969526e). Se renombra el proyecto a ZeroChat (ad107f4). Llega el motor RAG léxico con Orama y se redacta el primer AGENTS.md el 02/09 (481c9c6, d37ff35). Iconos vectoriales SVG, diálogos modales propios y WebLLM (e20a70c, 11/09).

Backend y endurecimiento (17 de septiembre – 4 de octubre)

Se elimina el proceso de empaquetado bundle en el cliente web y se unifica zerochat.py en la versión 7.0.0 (f58544f). Publicación en PyPI y modularización del backend en py/ (b3db5f0). Firma de llamadas a herramientas con HMAC (c51d0a8). Slices de ChatState con sus pruebas (2059455) y token con permisos 0600. Primera auditoría formal con la versión 8.12.4 (aff1019).

Serie 8.12 (4 – 9 de octubre)

De la 8.12.5 a la 8.12.16: cierre de los hallazgos de auditoría con pruebas contra catch vacíos y literales sin traducir, resumen de ramas, modo proyecto persistente y su protocolo de memoria.

Hacia la 9.0.0 y la gran limpieza (9 – 12 de octubre)

Agente sin límite artificial de pasos con detección heurística de bucles (38ef6f9). Las herramientas run_command y check_command sustituyen a los antiguos comandos de shell (514591d). Subagentes de solo lectura (ba21510). Reenvío del razonamiento entre pasos (a3e41b6). Retirada masiva de código muerto y compatibilidad (c1c66af, 8d769f7) y normas de higiene estricta (f785a3f). Publicación de la 9.0.0 (d2ab109) y 17 refactorizaciones que eliminaron 16.500 líneas en js/, css/ y py/.

Cierre de la auditoría 9.1.0 (13 de octubre)

La revisión 9.1.0 cerró sus diez hallazgos con pruebas automatizadas en 14a7fab: protección de la frontera de persistencia (test_persistence_boundary.js), lista cerrada de sumideros HTML (test_html_sinks.js), herencia de proveedores (test_providers.js) e integridad de páginas de ayuda (test_help_pages.js).

Serie 9.1 a 9.2: Madurez documental, multimodal y optimización (13 – 16 de octubre)

Fase de expansión de capacidades sin acumular deuda:

  • Ingesta ofimática y parser nativo: Hito M4 para soportar documentos DOCX, PPTX, XLSX y ODS en chat y RAG. Posteriormente, el hito M17 (ee7e732) sustituyó la voluminosa librería ExcelJS por un lector nativo ultraligero de XLSX en js/office-parser.js, ahorrando ~1 MB de dependencias de vendor y simplificando licencias.
  • Visión multimodal web (M19): Implementación de la herramienta download_image (88ede9e) para permitir la ingesta y análisis directo de imágenes web por modelos multimodales, con validación anti-SSRF y límites seguros.
  • Generación de documentos en chat (M13): Generación interactiva de archivos HTML, SVG y CSV en el chat (c9b0b0c), con visor seguro en Blob y exportación de tablas a CSV.
  • Automatización de memoria de proyecto (M9): Creación de task.py (37ba6a0, cca1c87) para registrar atómicamente tareas, decisiones y estados en .zerochat/, previniendo incoherencias de memoria.
  • Optimización de la suite de pruebas (M5): Reestructuración de pruebas por dominios funcionales (ccf7bec), aceleración de esperas y helper withTestApp (468bf8b), alcanzando 864 pruebas ejecutables en pocos segundos.
  • Colocation de documentación y normas: Adelgazamiento de AGENTS.md (93766e5) trasladando contratos técnicos a los README.md de cada subsistema y fijando el tope de ~300 líneas por tarea.

Serie 9.3 a 9.5: transporte web propio y poda de pruebas (16 – 17 de octubre)

Se retiran los proxies públicos y el transporte web pasa a ser el servidor local o, sin él, Jina Reader, con búsqueda en DuckDuckGo (M21, M23, M27; b15e953, 029b4c8). Llega el visor externo de diferencias en las tarjetas de escritura (9.4.0, M20, 7541dca). Se retira happy-dom y se podan las pruebas triviales o duplicadas, con criterios escritos para conservarlas o borrarlas (M24, 62682d7). La auditoría posterior a la 9.2.3 se corrige en M26 (ca8ce1d).

Serie 9.6: ejecución desatendida, perfiles y Playwright (17 – 19 de octubre)

zerochat --prompt ejecuta un prompt en la interfaz y devuelve la respuesta en la terminal, con perfil, exportación y ventana oculta (M18, desde a4b9bbd). Los perfiles de conexión pasan a ser de configuración, con los servicios MCP que arrancan y el navegador del modelo (M29). Playwright MCP gana motores propios que se instalan desde Ajustes y el modo con el navegador del usuario (M3, 94ed197, 5b6a5b6).

Serie 9.7 y 9.8: auditorías acotadas y estado vivo (20 – 21 de octubre)

Dos auditorías acotadas entre versiones menores se cierran con sus tareas (M30, M31) y se revisan las pruebas añadidas desde la 9.2.0 (M32). El servidor local pasa a ser la única fuente del estado que cambia durante la sesión: servicios externos, comandos y Playwright llegan en el latido (M33, b92e9d7). Se simplifican los puntos con más complejidad del frontend (M34, M35).

Serie 9.9 y 9.10: estructura y reconexión (22 – 23 de octubre)

Lector de PDF con los límites de cada stream (M36), configuración guiada del visor de diferencias (M37), portada bilingüe con sitemap generado (M28, ba04ab0), separación modelo-vista-controlador en los diálogos (M38), lógica de interfaz probada sin navegador (M39), reconexión automática al servidor local (M40, 7120ce7) y una suite que tarda la mitad (M41). Para usar el servidor de casa desde Android por un túnel SSH llega zerochat --print-url, que la 9.11 sustituye por la identificación.

Serie 9.11: una sola forma de conectar (24 de octubre)

El transporte con el servidor local pasa a ser solo por POST, sin canal SSE (4e39189). El token diario caduca también con el servidor en marcha (2476077) y, cuando falta o caduca, la página pide el usuario y la contraseña de la cuenta del sistema (fb8dd4b). Ajustes › Conexión unifica el servidor local, el túnel SSH y el proxy inverso (6407dc1, 3f12d81). Las decisiones de diseño quedaron registradas antes de empezar (M42-D10 a D17).

3. Normas y pruebas en el tiempo

NormaEn AGENTS.mdPruebaDesfaseQué encontró la prueba al llegar
Diálogos con ChatDialogs09/09 (11a0389)09/09 (c87f69b)0 díasCero defectos; la prueba existía desde el primer día
Slices de ChatState07/09 (3481a07)03/10 (2059455)26 díasEscrituras directas en el slice ui
Errores explícitos (frontend)07/09 (3481a07)04/10 (cf7aca4)27 días116 bloques catch vacíos
Texto visible con ChatI18n06/09 (66a1967)04/10 (46b6228)28 días10 literales sin traducir
Errores explícitos (backend)07/09 (3481a07)12/10 (72deff7)35 díasCapturas genéricas silenciosas en 7 archivos
Estilos con tokens de tokens.css06/09 (66a1967)12/10 (26abb4c)36 díasColores literales y respaldos en var() en 58 archivos
Sin respaldos, compatibilidad ni exportaciones para tests11/10 (f785a3f)11/10 (f785a3f)0 días (tras 46 d)La gran limpieza de la 9.0.0 (16.500 líneas eliminadas)
mount() con listeners delegados12/10 (98f07af)13/10 (9ff0df4)1 díaDuplicación de listeners en el panel MCP
Mensajes inyectados en inglés08/09 (cfdab94)13/10 (631f2d3)35 díasUna descripción de perfil en español
Datos externos fuera de innerHTML13/10 (29a1af3)13/10 (29a1af3)0 díasInyección de marcado en atributos SVG de render_chart
Ayuda bilingüe sincronizada13/10 (975a723)13/10 (975a723)0 díasPáginas de claves API sin selector de idioma
Automatización de memoria y centinela (task.py)14/10 (37ba6a0)14/10 (cca1c87)0 díasPreviene desfases en el plan de hitos
Única fuente por decisión y límites exactos N y N+115/10 (b4aad8a)15/10 (976ab59)0 díasPérdida de filas en el borde de 500 en tablas ODS
Sin código de producción que solo usan las pruebas17/10 (2b663f0)17/10 (2b663f0)0 díasParámetros e inyecciones que solo existían para las pruebas
Sitemap y títulos y descripciones únicos22/10 (ba04ab0)22/10 (ba04ab0)0 díasNace con la portada bilingüe y el sitemap generado
Única fuente también entre JavaScript y Python15/10 (b4aad8a)24/10 (f2e7224)9 díasMotores, navegadores y token de la extensión, ahora en un fixture que comprueban las dos suites

Interpretación: el desfase entre escribir una norma y tener su prueba fue la principal fuente histórica de deuda técnica. Desde la serie 9.x casi todas las normas llegan con su prueba en el mismo commit; la excepción reciente, la única fuente entre JavaScript y Python, tardó 9 días porque hasta M42 no existía un fixture común a las dos suites.

4. Qué aporta la historia

  • El código se fortalece reduciendo dependencias: sustituir ExcelJS por un analizador nativo ligero de XLSX demostró que simplificar la arquitectura es más beneficioso que acumular librerías vendorizadas.
  • Las pruebas deben consolidarse por dominio: la reorganización del hito M5 demostró que unificar suites y eliminar tiempos muertos permite aumentar la cobertura (de 756 a 864 pruebas) reduciendo el tiempo total de ejecución.
  • El límite de tamaño en tareas preserva el control: restringir las tareas a ~300 líneas máximas y separar la base compartida antes de implementar múltiples formatos evita la duplicación entre variantes hermanas.
  • Menos pruebas pueden cubrir más: de la 9.2.3 a la 9.11.0 la suite bajó de 864 a 702 casos mientras crecían las funciones, porque cada comportamiento pasó a probarse una sola vez y en el nivel más bajo que lo observa.
  • Decidir antes de programar: en M42 el diseño de la conexión remota se discutió y se registró como decisiones antes de la primera línea de código; las siete tareas se completaron después sin rehacer ninguna.

Interpretación: la 9.11.0 cambia la superficie de red del servidor local más que ninguna versión anterior, y lo hace con la misma disciplina: cada decisión registrada y cada comportamiento nuevo con su prueba.

5. Cronología resumida

FechaVersiónCommitHito destacado
26/08v0.939fed30Nacimiento de ChatCLI
02/09v5.3d37ff35Primer AGENTS.md
09/09v6.5.411a0389Diálogos propios protegidos por prueba
11/09v6.6.0e20a70cIntegración WebLLM en navegador
17/09v7.0.0f58544fFin del bundle; unificación en zerochat.py
04/10v8.12.4aff1019Publicación auditada
11/10v9.0.0d2ab109Gran limpieza; agente sin límite y subagentes
12/109.1.0a0393c3Línea base de la auditoría 9.1.0
13/109.1.014a7fabCierre total de los 10 hallazgos de infraestructura
14/10v9.1.237ba6a0Automatización de memoria de proyecto con task.py
15/10v9.1.58e449f8Soporte ofimático (Word, Excel, PowerPoint, ODS)
15/10v9.1.61177deeLector nativo de XLSX y eliminación de ExcelJS
15/10v9.2.002710d7Salto a 9.2.0 con backend y ofimática unificados
16/10v9.2.12df3888Generación de documentos en chat y CSV de tablas (M13)
16/10v9.2.2233ae57Herramienta download_image y visión multimodal web (M19)
16/10v9.2.3924aef6Consolidación de la suite de pruebas (M5) y revisión anterior
17/10v9.3.0b15e953Sin proxies públicos; transporte web unificado
17/10v9.4.08ce5e82Visor externo de diferencias
17/10v9.5.009e2fcfTransporte web endurecido tras la revisión de la 9.2.3
19/10v9.6.007fc781Ejecución desatendida, perfiles de configuración y motores de Playwright
20/10v9.7.0957220aCorrecciones de las auditorías acotadas
21/10v9.8.0d93491aEstado vivo del servidor local en el latido
22/10v9.9.04de3d1fPortada bilingüe, límites de stream en PDF y ventana visible del navegador de Playwright
22/10v9.10.0b8dea66zerochat --print-url para la tablet (retirado en la 9.11) y firma de herramientas con ±30 s de desfase
24/10v9.11.0170ee03Identificación con la cuenta del sistema y Ajustes › Conexión; versión revisada

Autoría

  • Revisión y redacción: Claude Opus 5.5 en Claude Code, a partir del registro del repositorio Git hasta el commit 170ee03; las fases hasta la 9.2.3 proceden de la revisión anterior, de Antigravity (Gemini 3.8 Flash).