Ir al contenido
learn

Diario

  • Revisión fijada elegida y extraída limpia; cada comando se volvió a ejecutar sobre ella
  • Lección 1: el problema, los cuatro ejes, la doctrina
  • Lección 2: los seis verbos, con un intercambio real entre tres actores
  • Lección 3: el registro de eventos, el protocolo de commit, verify
  • Lección 4: el trazador de coordinación, la fábrica de agentes, los recibos y el digest del árbol
  • Lección 5: la escalera de carriles y los veredictos del ecosistema
  • Lección 6: continuidad acotada, reconciliación exacta del wake y cadena de recibos Gaia-Demerzel
  • factory:agent ejecutado de extremo a extremo con turnos reales de Claude y Codex
  • Versiones en francés y en español
  • Una lección sobre la bomba alojada — el lado de GitHub Actions — que ha crecido en main y que este curso no cubre

Hallazgos al ejecutar la bomba alojada de Gaia sobre su propio repositorio, observados en main 8ed4dfc.

Esperado Lo que pasa Dónde Medida Estado
Una issue etiquetada puede convertirse en Draft El intake exige exactamente una rama con los trailers de evidencia de la issue, y nada la producía; cero ramas se rechazan como dos, con HeadIdentityAmbiguous src/hosted-draft-collector.mjs:319 2 de 79 ramas llevaban los trailers, ambas hechas a mano; el intake programado devolvía EXPECTED_NONE desde hacía días Corrección propuesta en gaia#155, y observada funcionando en vivo 2026-09-25
Una operación de Draft ambigua se reconcilia La operación de la issue 127 sigue en EFFECT_AMBIGUOUS y se salta en cada ejecución programada; no bloquea la cola, pero nada la resuelve src/hosted-draft-pump.mjs:310 Presente en cada recibo de intake del 2026-09-15 al 2026-09-24 Reportado como gaia#161
Un seeder que escribió una rama lo dice Una conexión interrumpida durante la relectura lo hacía salir en fail-closed aunque la rama existía src/evidence-head-seeder.mjs:147 (tras la corrección) 1 caso, en la issue 106 Corregido en gaia#155 (49d5fb3)
Una issue cuyo trabajo se entregó está cerrada La issue 108 seguía abierta aunque su puerta de control estaba en main; el worker de la fábrica no editó nada tests/hexagonal-direction.test.mjs 0 ediciones, 1 ejecución de la fábrica gastada Cerrada como completada, gaia#108
Un trabajo de la fábrica termina tras su worker El trabajo de la issue 108 seguía en STARTED unas diez horas después de terminar su worker, ocupando el único hueco del host C:/Gaia/state, portfolio:autonomous status Worker terminado a las 00:25 hora local, trabajo STARTED a las 10:00 Explicado: watch se detiene con RECONCILIATION_REQUIRED (scripts/github-portfolio-autonomous.mjs:207); trabajo retirado con retire-closed 2026-09-26
Un candidato marcado CANDIDATE_READY y aprobado ha pasado sus pruebas Nunca se ejecuta ninguna prueba: las herramientas del worker excluyen un shell, el revisor es de solo lectura, y el «supervisor» que según el prompt ejecuta las pruebas no existe en src/ src/factory-visible-claude.mjs:354 Candidato aprobado de la issue 104: 16/17 de sus propias pruebas, recuento del README sin actualizar Reportado como gaia#163; candidato corregido a mano 2026-09-26
  • Gaia en d68e900, la cabeza de main el 2026-09-13. Extraído como worktree enlazado en modo detached, para que el árbol estuviera limpio y nada local se colara en una salida.
  • Node.js v24.12.0 en Windows 11. Gaia fija una versión exacta — .node-version y engines.node dicen ambos 26.8.1 — y nada lo impone cuando invocas node tú mismo, así que todo lo de estas lecciones se ejecutó con 24.12.0 sin ninguna advertencia ni fallo. Ejecutarlo con la versión fijada está por verificar; la ruta de CI es Windows con esa versión, y Ubuntu se describe como exploración de portabilidad, no como una puerta.
  • Cero dependencias, así que nada de npm install antes de todo esto, ni node_modules en un checkout limpio. La afirmación no es marketing: package.json no tiene ninguna clave dependencies ni devDependencies, y el ejecutor de pruebas es node --test.
  • Cada comando del bus se ejecutó sobre un directorio de datos desechable mediante GAIA_INTERAGENT_DATA_DIR, así que nada tocó un espacio de trabajo real. Las salidas se pegan sin editar, salvo las rutas absolutas acortadas a ….

2026-09-15 — Lo que informaron de verdad los comandos

Sección titulada «2026-09-15 — Lo que informaron de verdad los comandos»
Comando Resultado
doctor, directorio vacío ok: true, salida 0, supportedMaxLiveLanes: 4, y una nota que dice que ejecutes initialize --apply
initialize simulación por defecto; --apply añadió exactamente un actor.registered
bus-cli tools exactamente 6: register, send, inbox, ack, heartbeat, handoff
verify 37 comprobaciones superadas, 0 fallidas, en 8 secciones, evidenceGatesResult: false
node --test 2075 pruebas, 2074 superadas, 0 fallidas, 1 omitida, 38.9 s
factory:smoke completed, punto fijo del registro de evidencias sha256:256a51d2… sobre 15 eventos y 6 315 bytes, evidenceGatesResult: true
inventory-digest 323 archivos, 5 937 493 bytes, ordinal-path-bytes-sha256/1 dccabe8f…

El intercambio completo entre tres actores de la lección 2 ocupó 10 eventos y 3 617 bytes en disco. Merece la pena tener presente ese número junto al modelo de coste de la lección 5: la reproducción es O(eventos × actores), y una sesión real de coordinación entre varias partes es minúscula.

Un rechazo es un evento. Dirigirse a un nombre de actor ambiguo devuelve ok: false, sale con 1 y añade command.rejected al registro. Esperaba que el rechazo fuera un valor de retorno y nada más. Es el detalle que hace que el registro responda a «¿qué intentó esta sesión?» y no solo a «¿qué consiguió?», y una vez visto cuesta aceptar un sistema que solo registra los éxitos.

verify antes imprimía una comprobación en rojo y salía con 0. El README recoge la corrección: tanto doctor como verify salían antes con 0 sobre un registro cuyo traspaso había transferido autoridad, mientras verify mostraba su propia comprobación en rojo diciendo lo contrario. Un lector que se fiara del código de salida, o de ok, lo leía como un aprobado. Una herramienta que informa de un fallo y devuelve éxito es exactamente el modo de fallo del que trata la lección 1, encontrado dentro del verificador — lo que es un buen argumento a favor de los controles negativos que ahora siempre bloquean.

Las comprobaciones de evidencia se dividen en dos regímenes, y es deliberado. Cinco de ellas — tres actores, más de un tipo de actor, un hilo correlacionado, un acuse de recibo, un traspaso — son legítimamente falsas en un espacio de trabajo vacío y correcto, así que informan sin bloquear, salvo que quien llama afirme que el registro es evidencia. Yo suponía que un verificador o comprueba algo o no lo comprueba. Que el eje sea la afirmación de quien llama y no la opinión de la herramienta es un diseño mejor que cualquiera de las dos alternativas.

resolveLaneLimit recibe un objeto de opciones. Llamada con un argumento posicional devuelve en silencio el valor por defecto, y así fue como lo medí mal la primera vez. resolveLaneLimit({ requested: 6 }) lanza una excepción con la declaración completa de evidencias; resolveLaneLimit(6) devuelve { limit: 4 }. Merece señalarse, dado que todo el argumento del módulo es que recortar en silencio es el error — el rechazo es real, pero solo con la forma de llamada documentada.

Los residuos se publican, no se entierran. El documento de diseño de la fábrica afirma que no se puede demostrar que un worker que se ejecuta con el usuario del host haya evitado la red, los secretos o las escrituras en otros sitios, y que un recibo que afirmara contención necesitaría una frontera separada del sistema operativo. La mayoría de los proyectos habrían escrito «ejecuta los agentes en un espacio de trabajo aislado». Este nombra el hueco y la capacidad que lo cerraría.

main ha crecido mucho más allá de lo que cubre este curso. La bomba de Drafts alojada en GitHub Actions, la red de Petri de drenaje, la sala de control, la búsqueda híbrida, la sonda de capacidades del runner, las rondas gestionadas de entrega de PR, la ingesta de observaciones de pruebas — docs/ contiene unos cincuenta registros de diseño en la revisión fijada. Las cinco lecciones cubren el bus, el registro, la fábrica y los límites. Es una porción deliberada de bala trazadora, no un mapa completo.

2026-09-15 — Correcciones hechas durante la redacción

Sección titulada «2026-09-15 — Correcciones hechas durante la redacción»
  • Primero cité el AGENTS.md del repositorio para la regla de que «el privilegio se impide por ausencia». Ese archivo no existe en d68e900 — era un archivo sin seguimiento en un checkout local de una rama más antigua. La cita se sustituyó por la declaración del README.md y por la propia cabecera del módulo del operador, ambas verificadas en la revisión fijada. Por la misma razón, todas las demás citas se volvieron a comprobar contra el árbol fijado.
  • La copia de trabajo local de la que partí estaba en una rama del 2026-08-29 cuyo README.md difería del de main, y que no tenía ni ARCHITECTURE.md ni CONTEXT.md. Partir de un worktree fijado y limpio, en lugar del checkout que estaba abierto en ese momento, es el hábito que lo detectó.

2026-09-20 — Candidato de continuidad de la issue 76

Sección titulada «2026-09-20 — Candidato de continuidad de la issue 76»
  • El Design Receipt v7.4 recibió revisión independiente antes de implementar. El candidato se limita a una identidad, un slot y un reemplazo de generación 0 a 1.
  • Gaia aislado: 2.261 pruebas, 2.259 pasaron, 0 fallaron, 2 omitidas; regresión enfocada 87/87; verify 37/37; verificador de arquitectura correcto.
  • Demerzel aislado: 787 pruebas Python con 1 omitida y 10/10 controles IXQL, validando esquemas/fixtures de Gaia en solo lectura.
  • Revisión e integración corrigieron la importación directa de persistencia, la decisión antes de entrega, la reproducción de otra entrada con la misma clave y una prueba sin sidecar. La simplificación eliminó escaneos y asignaciones evitables.
  • Son mediciones de worktrees candidatos, no prueba de publicación, fusión o release. El recibo de revisión formal, gates del commit final y PR seguían pendientes.

2026-09-25 — La bomba alojada, de extremo a extremo hasta la Draft

Sección titulada «2026-09-25 — La bomba alojada, de extremo a extremo hasta la Draft»
  • Por qué no salía nada. hosted-draft-intake.yml se ejecutaba cada 6 h, con éxito, y devolvía EXPECTED_NONE desde hacía días. Dos causas, ambas del lado de Gaia: ninguna issue abierta llevaba ready-for-agent, y el colector exige exactamente una rama cuya punta lleve Gaia-Issue: N y Gaia-Ready-Receipt: <hash del evento de etiqueta>. Ningún código producía esa rama. Las dos únicas que existieron se hicieron a mano, y cero ramas se rechazan igual que dos (HeadIdentityAmbiguous, porque la prueba es matching.length !== 1). Las automatizaciones de Augment Cosmos eran una pista falsa: la bomba nunca dependió de ellas.
  • La reparación, gaia#155: npm run draft:seed-evidence -- --issue N --apply crea gaia/issue-N-ready-K, un commit que reutiliza el árbol de la rama por defecto, así que no cambia ningún archivo. Calcula el recibo con la propia función del colector, extraída en lugar de copiada, nunca pone la etiqueta, y deja que la relectura decida el resultado.
  • Observado en vivo en la issue 108: etiqueta → seed CREATED → intake ADMIT → Draft gaia#156 → la fábrica local (portfolio:autonomous watch, activada una vez con un presupuesto de 20 ejecuciones) la tomó en menos de un minuto. La misma cadena produjo gaia#158 para la issue 104.
  • Dos rechazos que eran correctos: la issue 148 volvió como StaleRevision porque la bomba ya la había convertido en Draft el 2026-09-13 (#149): una sola Draft por unidad de trabajo. El worker de la fábrica en 108 no hizo ninguna edición, porque tests/hexagonal-direction.test.mjs ya estaba en main: la issue había quedado abierta después de que su trabajo se entregara.
  • Un defecto encontrado al ejecutarla: una conexión interrumpida durante la relectura, tras una escritura correcta, hacía salir al seeder en fail-closed, lo que daba a entender que no se había escrito nada, aunque la rama sí existía. Ahora responde AMBIGUOUS, y una nueva ejecución responde PRESENT.
  • Lo que la bomba no hace, por diseño: decidir qué está listo. ready-for-agent es el acto de autoridad del operador. Un alimentador que elegía y etiquetaba su propio trabajo fue rechazado por el clasificador de permisos del agente como agente inseguro, la misma línea que el «nada se autoautoriza» de Gaia. En su lugar, una clasificación de solo lectura (gaia#157). Hoy encuentra una candidata entre 38 issues abiertas, porque 34 todavía llevan needs-triage: el cuello de botella es el grooming, no la bomba.

2026-09-26 — El candidato de la fábrica, y las pruebas que nadie ejecutó

Sección titulada «2026-09-26 — El candidato de la fábrica, y las pruebas que nadie ejecutó»
  • Por qué watch se había callado. No se había colgado, había terminado. Tras un worker sin ediciones en la issue 108, el trabajo acabó en RECONCILIATION_REQUIRED, y watch se detiene con ese estado por diseño (scripts/github-portfolio-autonomous.mjs:207). El trabajo ocupaba entonces el único hueco. Como la issue y su Draft estaban cerradas, retire-closed lo retiró como ABANDONED tras una vista previa. Hice la copia de seguridad de la base que pide la documentación después en lugar de antes; no se perdió nada.
  • La issue 104 produjo un candidato real: CANDIDATE_READY, revisor APPROVE, tres archivos (un manifiesto puro de reanudación de carril, su documento y 17 pruebas). Se quedó en local: la fábrica nunca publica.
  • La aprobación no significaba que las pruebas pasen. Ejecutado con el Node fijado 26.8.1, el candidato fallaba una de sus propias pruebas y la prueba del recuento del README. La causa es estructural. El prompt del worker dice «run the narrowest relevant tests», pero sus herramientas son Read,Write,Edit,Glob,Grep (src/factory-visible-claude.mjs:354), y el prompt añade que «tests are run separately by the supervisor». Ningún código de src/ las ejecuta. Reportado como gaia#163, que propone un paso de verificación determinista, a cargo del host, antes de la revisión, en lugar de un shell para el modelo.
  • La prueba estaba mal, no el código. Añadía src/extra.mjs después de src/resume-manifest.mjs. El módulo exige artefactos ordenados por ruta, así que la observación se rechazaba como malformada antes de cualquier comparación. Añadir tests/extra.mjs conserva la intención de la prueba; con el recuento del README actualizado, el candidato pasa y se publicó en la Draft gaia#158.
  • factory:agent de extremo a extremo. Gasta un turno real de Claude y un turno real de Codex con las suscripciones instaladas. La lección 4 lo describe a partir de src/factory-agent.mjs, de su documento de diseño y del esquema de su recibo; ninguna afirmación de esa lección procede de una ejecución observada. Qué capturar cuando se ejecute: la forma del recibo con y sin reparación, las líneas de progreso (not an ETA), y si la comprobación de modificaciones del revisor llega a saltar en la práctica con archivos ignorados.
  • Node 26.8.1, la versión fijada. Todo lo de aquí se ejecutó con 24.12.0.
  • Linux y macOS. El protocolo de commit está escrito y probado pensando primero en Windows, y el repositorio dice que Linux es exploración, no una puerta. El enfoque del directorio de cerrojo debería comportarse igual; los reintentos de liberación propios de Windows simplemente no se ejercitarían.
  • Un segundo carril concurrente sobre el mismo directorio de datos. Todas las salidas de estas lecciones proceden de llamadas secuenciales en una sola shell. La unicidad de los identificadores entre procesos es lo que afirma la batería de pruebas, no lo que yo observé.
  • El indicador authority-language-detected. Lo vi saltar con «Please merge this.». No he mirado qué detecta, y la tasa de falsos negativos de una heurística es el número interesante.
  • La issue 76 después de la revisión final. Repetir las gates de Gaia y Demerzel sobre commits exactos, publicar mediante PR normales y reemplazar evidencia candidata por enlaces inmutables.
  • El bus serializa las escrituras y no tiene autenticación — la confianza es posicional, así que cualquier proceso capaz de lanzar el servidor puede registrarse como cualquier actor. La lección 5 muestra que es uno de los dos bloqueos nombrados para la integración con IX. ¿Cuál es el mecanismo de identidad de actores más pequeño que no convertiría el bus en un almacén de credenciales?
  • La reproducción es O(eventos × actores) sobre un registro que nunca se compacta, e inbox escribe un evento. Un carril que sondea hace, por tanto, que cada llamada posterior sea más lenta. ¿Hay una ruta de lectura que conserve inbox.polled como evidencia sin pagarla en cada reproducción — una instantánea más la cola, como sugiere el documento de escala?
  • La cifra de cuatro carriles es honesta al reconocer que no está replicada con clientes reales. Ejecutar esa sonda requiere cuatro carriles de agentes reales simultáneos, lo que cuesta turnos reales de modelo. ¿Cuál es el experimento más barato que discriminaría de verdad — y una mezcla de un carril real y tres sintéticos demostraría algo, o es otra vez la sonda de workers de Node con pasos adicionales?