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 enjs/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 helperwithTestApp(468bf8b), alcanzando 864 pruebas ejecutables en pocos segundos. - Colocation de documentación y normas: Adelgazamiento de
AGENTS.md(93766e5) trasladando contratos técnicos a losREADME.mdde 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
| Norma | En AGENTS.md | Prueba | Desfase | Qué encontró la prueba al llegar |
|---|---|---|---|---|
Diálogos con ChatDialogs | 09/09 (11a0389) | 09/09 (c87f69b) | 0 días | Cero defectos; la prueba existía desde el primer día |
Slices de ChatState | 07/09 (3481a07) | 03/10 (2059455) | 26 días | Escrituras directas en el slice ui |
| Errores explícitos (frontend) | 07/09 (3481a07) | 04/10 (cf7aca4) | 27 días | 116 bloques catch vacíos |
Texto visible con ChatI18n | 06/09 (66a1967) | 04/10 (46b6228) | 28 días | 10 literales sin traducir |
| Errores explícitos (backend) | 07/09 (3481a07) | 12/10 (72deff7) | 35 días | Capturas genéricas silenciosas en 7 archivos |
Estilos con tokens de tokens.css | 06/09 (66a1967) | 12/10 (26abb4c) | 36 días | Colores literales y respaldos en var() en 58 archivos |
| Sin respaldos, compatibilidad ni exportaciones para tests | 11/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 delegados | 12/10 (98f07af) | 13/10 (9ff0df4) | 1 día | Duplicación de listeners en el panel MCP |
| Mensajes inyectados en inglés | 08/09 (cfdab94) | 13/10 (631f2d3) | 35 días | Una descripción de perfil en español |
Datos externos fuera de innerHTML | 13/10 (29a1af3) | 13/10 (29a1af3) | 0 días | Inyección de marcado en atributos SVG de render_chart |
| Ayuda bilingüe sincronizada | 13/10 (975a723) | 13/10 (975a723) | 0 días | Páginas de claves API sin selector de idioma |
Automatización de memoria y centinela (task.py) | 14/10 (37ba6a0) | 14/10 (cca1c87) | 0 días | Previene desfases en el plan de hitos |
Única fuente por decisión y límites exactos N y N+1 | 15/10 (b4aad8a) | 15/10 (976ab59) | 0 días | Pérdida de filas en el borde de 500 en tablas ODS |
| Sin código de producción que solo usan las pruebas | 17/10 (2b663f0) | 17/10 (2b663f0) | 0 días | Parámetros e inyecciones que solo existían para las pruebas |
| Sitemap y títulos y descripciones únicos | 22/10 (ba04ab0) | 22/10 (ba04ab0) | 0 días | Nace con la portada bilingüe y el sitemap generado |
| Única fuente también entre JavaScript y Python | 15/10 (b4aad8a) | 24/10 (f2e7224) | 9 días | Motores, 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
| Fecha | Versión | Commit | Hito destacado |
|---|---|---|---|
| 26/08 | v0.9 | 39fed30 | Nacimiento de ChatCLI |
| 02/09 | v5.3 | d37ff35 | Primer AGENTS.md |
| 09/09 | v6.5.4 | 11a0389 | Diálogos propios protegidos por prueba |
| 11/09 | v6.6.0 | e20a70c | Integración WebLLM en navegador |
| 17/09 | v7.0.0 | f58544f | Fin del bundle; unificación en zerochat.py |
| 04/10 | v8.12.4 | aff1019 | Publicación auditada |
| 11/10 | v9.0.0 | d2ab109 | Gran limpieza; agente sin límite y subagentes |
| 12/10 | 9.1.0 | a0393c3 | Línea base de la auditoría 9.1.0 |
| 13/10 | 9.1.0 | 14a7fab | Cierre total de los 10 hallazgos de infraestructura |
| 14/10 | v9.1.2 | 37ba6a0 | Automatización de memoria de proyecto con task.py |
| 15/10 | v9.1.5 | 8e449f8 | Soporte ofimático (Word, Excel, PowerPoint, ODS) |
| 15/10 | v9.1.6 | 1177dee | Lector nativo de XLSX y eliminación de ExcelJS |
| 15/10 | v9.2.0 | 02710d7 | Salto a 9.2.0 con backend y ofimática unificados |
| 16/10 | v9.2.1 | 2df3888 | Generación de documentos en chat y CSV de tablas (M13) |
| 16/10 | v9.2.2 | 233ae57 | Herramienta download_image y visión multimodal web (M19) |
| 16/10 | v9.2.3 | 924aef6 | Consolidación de la suite de pruebas (M5) y revisión anterior |
| 17/10 | v9.3.0 | b15e953 | Sin proxies públicos; transporte web unificado |
| 17/10 | v9.4.0 | 8ce5e82 | Visor externo de diferencias |
| 17/10 | v9.5.0 | 09e2fcf | Transporte web endurecido tras la revisión de la 9.2.3 |
| 19/10 | v9.6.0 | 07fc781 | Ejecución desatendida, perfiles de configuración y motores de Playwright |
| 20/10 | v9.7.0 | 957220a | Correcciones de las auditorías acotadas |
| 21/10 | v9.8.0 | d93491a | Estado vivo del servidor local en el latido |
| 22/10 | v9.9.0 | 4de3d1f | Portada bilingüe, límites de stream en PDF y ventana visible del navegador de Playwright |
| 22/10 | v9.10.0 | b8dea66 | zerochat --print-url para la tablet (retirado en la 9.11) y firma de herramientas con ±30 s de desfase |
| 24/10 | v9.11.0 | 170ee03 | Identificació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).