Gobernar un Agente IA con AsciiDoc: Mi Estrategia Eager/Lazy para Sesiones Opencode sin fuga de contexto
Publié le 24 April 2026
resumen
Cuando se trabaja con un agente de IA como Opencode en proyectos complejos en varias sesiones, nos enfrentamos a un problema fundamental :la fuga de contexto. El agente no recuerda la sesión anterior. Todo lo que le han explicado — la arquitectura, las convenciones, el estado del backlog — se ha perdido. Reconstruir este contexto en cada sesión es costoso, lento y fuente de error.
Este artículo expone la estrategia artesanal que he construido para resolver este problema: un sistema de gobernanza persistente basado en archivos AsciiDoc, con una dicotomíaAnsioso/Perezosopara optimizar el consumo del token de contexto, y unaprocedimiento de fin de sesión imprescindiblepara asegurar la continuidad.
La Escena : Lunes 21 de abril, 9:00
Vuelvo a abrir Opencode para retomar mi plugin Gradle`plantuml-plugin`. Anoche pasé tres horas discutiendo con el agente de la arquitectura del pool de claves API — rotación round-robin, gestión de cuotas, fallback automático. Esta mañana, el agente me mira con ojos de pez rojo.
</think> _ — ¡Hola, soy su asistente Opencode. ¿Cómo puedo ayudarle hoy? _
No — Ah sí, el pool de claves API, estábamos en la estructura YAML. No — Atención,PlantumlManager`es un objeto singleton de Kotlin, no una clase. No — No, hemos decidido ayer que`SyntaxValidationResult`quedaba una clase sealed anidada en`PlantumlService.
Todo está por rehacer. O mejor dicho: todo está por volver a explicar. Voy a pasar los veinte primeros minutos de mi sesión reconstituyendo un contexto que el agente ya tuvo entre sus manos ayer. Veinte minutos de tokens quemados. Veinte minutos en los que podría codificar, pero en los que hago una tarea pedagógica obligatoria.
No es un error de Opencode. Es la propia naturaleza de los LLM conversacionales: entre dos sesiones, la memoria de trabajo estátotalmente borrada. El agente no recuerda la misión anterior, las decisiones tomadas, las trampas identificadas, el código que escribimos juntos.
He vivido eso decenas de veces. En cuatro proyectos simultáneos. Con sesiones que se encadenan durante semanas. He calculado: en promedio,Del 30 al 40 % del tiempo de la sesiónestaba dedicado a recontextualizar al agente. En la sesión 87 del proyecto`plantuml-plugin`, me rompí. Ya no podía permitirme volver a explicar por décima vez que`AttemptEntry`es una clase de datos de nivel superior en`DiagramProcessor.kt`.
Necesitaba un sistema. No un hack. Una verdadera gobernanza.
La Génesis: Del Caos al Método
Las Primeras Sesiones : La Edad de las Tinieblas
Mi primer proyecto con Opencode,plantuml-plugin, empezó sin ninguna gobernanza. Hago una pregunta, el agente responde, iteramos, la sesión termina, y al día siguiente empezamos de cero. Era la sesión 1, luego la 2, luego la 3… hasta la sesión 62 donde me doy cuenta de que he perdido horas acumuladas volviendo a explicar la misma arquitectura.
En la sesión 62, los datos están aquí :198 pruebas unitarias pasan, 42 pruebas funcionales validadas, el plugin funciona. Pero el costo cognitivo es insoportable. Cada nueva sesión comienza con un monólogo de veinte minutos sobre la estructura del proyecto.
El episodio del sitio.yml Destruido (Sesión 2, bakery-plugin)
El método también nace de una catástrofe. Sobre el proyecto`bakery-gradle`, en la sesión 2, pido al agente que modifique el archivo`site.yml`. El agente, sin comprobar si el archivo está versionado, hace un`Write`completo que sobrescribe el contenido. Resultado: los tokens reales (claves de API Firebase, secretos de despliegue) son reemplazados por placeholders ficticios. El archivo no estaba en git — estaba en`.gitignore`para proteger los secretos.
Sin copia de seguridad. Sin`git restore`posible. Estoy bloqueado. Necesito reconstruir manualmente el archivo de configuración, encontrar los tokens en mis gestores de contraseñas, volver a pegar todo.
Es de esta frustración que nace laRegla Absoluta 1b :
_ NUNCA aplastarun archivo config con un`Write`completo cuando uno`Edit`un parcial basta.NUNCA reemplazarvalores sensibles por valores ficticios.Verificar git check-ignore y `git ls-filesantes de cualquier modificación. _
Esta regla, hoy grabada en el mármol de todos mis archivos`AGENT.adoc` et `INDEX.adoc`de cuatro proyectos, nació de un error real que me costó una hora de trabajo manual.
La Migración Markdown → AsciiDoc (Sesión 1, cheroliv.com)
El 25 de abril de 2026, sobre`cheroliv.com`, tomo una decisión radical: convertir la totalidad de la gobernanza de Markdown a AsciiDoc. No es estético. Es funcional. AsciiDoc ofrece una estructura semántica que los LLM leen mejor: secciones jerárquicas, tablas tipadas, admoniciones (NOTE, WARNING, CAUTION), atributos de documento legibles por la máquina.
La sesión 1 de`cheroliv.com`Formaliza la estructura :
-
Conversión de`AGENTS.md` en
AGENT.adoc -
Creación de los agentes especializados :`CODER.adoc`,
SCRUM_MASTER.adoc,PLANTUML_DESIGNER.adoc -
Creación de la estructura Eager/Lazy :`INDEX.adoc`,
SESSIONS_HISTORY.adoc,AGENT_SESSION_MANAGER.adoc,SESSION_CHECKLIST.adoc,PROCEDURES.adoc
Un solo commit:`90975e9 refactor: migrate agent governance from Markdown to AsciiDoc`. Y el sitio sigue funcionando.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 18) ]
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
title Evolución de las Sesiones — Desde la Sesión 1 hasta 150+
legend top
|= Couleur |= Projet |
| <#4CAF50> | cheroliv.com |
| <#2196F3> | plantuml-plugin |
| <#FF9800> | bakery-plugin |
| <#9C27B0> | magic-stick |
endlegend
concise "Sesiones Activas" as S
@S
0 is ".md bruto"
1 is "Migración
^^^^^
Syntax Error? (Assumed diagram type: timing)
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
title Evolución de las Sesiones — Desde la Sesión 1 hasta 150+
legend top
|= Couleur |= Projet |
| <#4CAF50> | cheroliv.com |
| <#2196F3> | plantuml-plugin |
| <#FF9800> | bakery-plugin |
| <#9C27B0> | magic-stick |
endlegend
concise "Sesiones Activas" as S
@S
0 is ".md bruto"
1 is "Migración
AsciiDoc"
10 is "Eager/Lazy\nformalizado"
62 is "Regla seguridad\n(site.yml)"
87 is "Cracking\ncontexto"
109 is "Optimización
-60% tokens"
133 is "133 sesiones\n240 pruebas PASS"
S@0 -> S@1 : Session 1\n(cheroliv.com)
S@1 -> S@10
S@10 -> S@62 : Session 62\n(plantuml-plugin)
S@62 -> S@87 : Session 87\n(Cry 4 help)
S@87 -> S@109 : Session 109\n(API Key Pool)
S@109 -> S@133 : Session 133\n(Aujourd'hui)
@enduml
La línea de tiempo anterior ilustra la progresión real. El punto de inflexión es la sesión 87: ahí es donde la frustración de la recontextualización repetida supera el umbral de tolerancia, y el método Eager/Lazy deja de ser una idea para convertirse en una obligación.
La estrategia : Eager/Lazy en profundidad
Filosofía : Caché informático aplicado a la cognición
Mi enfoque se inspira directamente de la gestión de caché informática. Todo lo que escrítico y frecuentemente utilizadodebe ser inmediatamente accesibleansioso). Todo lo que escontextual o voluminosodebe cargarse bajo demanda (Perezoso)
Eager (Panel de control) |
Lazy (manual del propietario) |
Talla |
< 100 líneas, < 10k tokens |
Ilimitado, detallado |
Cargando |
Auto, al inicio de la sesión |
A solicitud del agente |
Contenido |
Reglas absolutas, misión corriente, estado crítico |
Archivos de sesiones, historial completo, procedimientos detallados, referencias técnicas |
Rol |
Orientar inmediatamente al agente |
Responder a las preguntas de contexto profundo |
Los Archivos Eager: El Panel de Control
Estos archivos viven en la raíz de cada proyecto y son cargados automáticamente por el agente al inicio de cada sesión. Forman eltablero-- información crítica, inmediatamente accesible.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 15) ]
@startuml
skinparam defaultTextAlignment center
skinparam wrapWidth 200
package "Raíz del Proyecto (Eager - Auto-cargado)" {
component "<b>AGENT.adoc</b>\nReglas absolutas\nEstructura & Convenciones" as AGENT
component "<b>PROMPT_REPRISE.adoc</b>\nMisión de la sesión N\nResumen N-1" as PROMPT
component "<b>INDEX.adoc</b>\nPunto de entrada\nReglas + Sesiones" as INDEX
component "<b>*_ESSENTIALS.adoc</b>\nContexto de negocio\ncrítico" as ESS
}
package ".agents/ (Lazy - cargado bajo demanda)" {
component "<b>sessions/N-*.adoc</b>\nArchivos detallados\nDecisiones & Output" as SESS
component "<b>SESSIONS_HISTORY.adoc</b>\nResumen\nDate/Type/Score" as HIST
component "<b>PROCEDURES.adoc</b>
^^^^^
Syntax Error? (Assumed diagram type: component)
@startuml
skinparam defaultTextAlignment center
skinparam wrapWidth 200
package "Raíz del Proyecto (Eager - Auto-cargado)" {
component "<b>AGENT.adoc</b>\nReglas absolutas\nEstructura & Convenciones" as AGENT
component "<b>PROMPT_REPRISE.adoc</b>\nMisión de la sesión N\nResumen N-1" as PROMPT
component "<b>INDEX.adoc</b>\nPunto de entrada\nReglas + Sesiones" as INDEX
component "<b>*_ESSENTIALS.adoc</b>\nContexto de negocio\ncrítico" as ESS
}
package ".agents/ (Lazy - cargado bajo demanda)" {
component "<b>sessions/N-*.adoc</b>\nArchivos detallados\nDecisiones & Output" as SESS
component "<b>SESSIONS_HISTORY.adoc</b>\nResumen\nDate/Type/Score" as HIST
component "<b>PROCEDURES.adoc</b>
Plantillas fin de sesión
6 pasos" as PROC
component "<b>*_REFERENCE.adoc</b>\nArquitectura completa\nReferencias técnicas" as REF
component "<b>COMPLETED_TASKS_ARCHIVE</b>\nTareas completadas\nPor mes" as ARCH
component "<b>AGENT_MODUS_OPERANDI.adoc</b>\nDocumentación de estrategia\nMetodología" as MOD
component "<b>*_REFERENCE.adoc</b>
Boot tests, A/B partition
Contextos específicos" as SPEC
}
AGENT --> PROMPT : "Referencias"
AGENT --> INDEX : "Referencias"
INDEX --> SESS : "Indexa"
INDEX --> HIST : "Indexa"
INDEX --> PROC : "Referencia"
INDEX --> ARCH : "Referencia"
INDEX --> REF : "Referencia"
PROMPT --> SESS : "archivo N-1"
PROMPT --> ESS : "Contexto de negocio"
@enduml
AGENT.adoc-- El archivo maestro. Sobre`cheroliv.com`, tiene 200 líneas y contiene :
-
Las reglas absolutas del proyecto (no commit sin permiso, no`rm`sin confirmación)
-
La estructura del proyecto y las convenciones de código
-
Los comandos esenciales (
./gradlew serve,./gradlew test) -
Las épicas y el backlog del producto (historias de usuario priorisées)
-
Los criterios de calidad transversales (accesibilidad, responsive, compatibilidad)
sobre`bakery-plugin`, la Regla 0 es diferente:./gradlew -q publishToMavenLocal` obligatorio después de cada modificación del código fuente. Porque probar el plugin sin volver a publicar el JAR local me hizo perder una hora depurando un código que aún no estaba empaquetado.
PROMPT_REPRISE.adoc-- La misión de la sesión en curso. Actualizado al final de cada sesión, contiene :
-
El número de sesión y la misión prioritaria
-
El resumen de la sesión anterior (lo que se ha hecho, lo que queda por hacer)
-
Los criterios de aceptación de la sesión actual
-
Los recordatorios técnicos específicos
.agents/INDEX.adocEl punto de entrada. Resumen las reglas absolutas, las sesiones recientes, y sobre todo elcartera de proyectosgestionados con la misma metodología. A día de hoy, cinco proyectos aparecen allí:
----
----
| magic-stick | Session 23 | SCRIPT_VERIFICATION.adoc | 2026-04-27 |
| bakery-gradle | Session 11 | TEST_COVERAGE_ANALYSIS | 2026-04-27 |
| cheroliv.com | Session 9 | TEST_COVERAGE_ANALYSIS | 2026-04-27 |
| plantuml-gradle| Session 133| TEST_COVERAGE_ANALYSIS | 2026-04-23 |
| jhipster-gradle-plugins | Session 1 | TEST_COVERAGE_ANALYSIS | 2026-04-28 |
----
Por favor, proporcione el texto que desea traducir del francés al español.`*_ESSENTIALS.adoc`** -- Un añadido reciente (Sesión 109, plantuml-plugin) para optimizar aún más el contexto Eager. En lugar de cargar 200 líneas de contexto empresarial en el grupo de claves API, cargo 50 líneas de lo esencial, y las otras 150 líneas permanecen en LAZY en`*_REFERENCE.adoc`.
Resultado medido: paso de**~25k tokens EAGER a ~10k tokens**(ganancia del 60%). El agente ya no necesita recordatorios que consumen energía.
==== El Eslabón Perdido : `opencode.json
Debo confesarles una cosa que casi olvidé documentar. Por encima de todos estos archivos .adoc, hay un pequeño archivo JSON sin el cual nada funciona. Se llama`opencode.json`y hace seis líneas. Literalmente seis líneas.
[source,json]
----
{
"$schema": "https://opencode.ai/config.json",
"instructions": [
"AGENT.adoc"
]
}
----
Este es el archivo que le dice a Opencode: «Al iniciar, carga`AGENT.adoc`automáticamente. » Sin él, el agente es una página en blanco exactamente como lo describía al inicio del artículo. Con él, el agente ya tiene entre las manos las reglas absolutas, la arquitectura del proyecto y los comandos esenciales — antes incluso de que yo diga hola.
Descubrí por casualidad la importancia de este archivo. Sobre`bakery-plugin`, no existía. Me preguntaba por qué el agente estaba sistemáticamente más « perdido » en este proyecto que en los otros. Las reglas absolutas estaban bien dentro de`AGENT.adoc`— pero`AGENT.adoc`nunca estaba cargado. El agente solo leía lo que yo le decía que lea, manualmente, en cada sesión. Era la sesión 11 de`bakery-plugin`cuando me di cuenta de la ausencia del`opencode.json`. Lo creé — y la sesión 12 comenzó como las demás.
Este archivo es tan obvio para mí ahora que ni siquiera lo tenía en cuenta. Un error clásico del desarrollador que conoce demasiado su herramienta. Hoy, lo creo sistemáticamente *antes*`AGENT.adoc`. Es la primera piedra.
==== La dualidad de `INDEX.adoc
Otra sutileza que merece ser explicitada :`INDEX.adoc`vive en`.agents/`— una carpeta que he presentado como `LAZY`. Sin embargo, la enumero como `EAGER` en todas mis tablas. Hay una tensión aparente aquí.
La realidad de campo: los archivos`.agents/INDEX.adoc`están bien cargados automáticamente al inicio de la sesión, al mismo nivel que`AGENT.adoc` et `PROMPT_REPRISE.adoc`Ellos están en`.agents/`Por razones de organización — no invadir la raíz — pero su comportamiento es EAGER.
sobre`plantuml-plugin`, `INDEX.adoc`tiene 200 líneas y contiene las reglas absolutas *completas* con su historial (las lecciones de las sesiones pasadas), los EPICs con puntuaciones, y el portafolio de proyectos. Es el documento que el agente consulta para saber « dónde estamos». Sobre`bakery-plugin`, hace 150 líneas con la hoja de ruta y las sesiones recientes.
La redundancia voluntaria entre`AGENT.adoc` et `INDEX.adoc`Puede sorprender. Las reglas absolutas están presentes en ambos. ¿Por qué? Porque cumplen dos funciones diferentes: en`AGENT.adoc`, son *explicativas* (el storytelling de la regla, la lección aprendida); en`INDEX.adoc`, ellas son *ejecutivas*(la regla desnuda, sin justificación, para una consulta rápida). El agente lee`AGENT.adoc`una vez para *comprender* ; él vuelve a leer`INDEX.adoc`à cada sesión para *aplicar*. Dos usos, dos formatos.
[plantuml, format=svg, id=diag-dualite-agent-index, alt="Comparaison entre AGENT.adoc (narratif) et INDEX.adoc (exécutif)"]
----
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
title Dualidad AGENT.adoc ←→ INDEX.adoc
left to right direction
rectangle "AGENT.adoc\n(Raíz — EAGER)" as AGENT #E3F2FD {
rectangle "📖 **Formato Narrativo**
El storytelling de la regla
la lección aprendida, el contexto" as NARR
rectangle "�🏗️ **Arquitectura Completa**\nEstructura del proyecto, componentes\nBacklog detallado US" as ARCHI
rectangle "📋 **Reglas Explicatives**
¿Por qué existe la regla?
Historial del incidente" as EXPL
}
rectangle "INDEX.adoc\n(.agents/ — EAGER)" as INDEX #E8F5E9 {
rectangle "�⚡ **Formato Ejecutivo**
La regla desnuda, sin justificación
Consulta rápida" as EXEC
rectangle "📊 **Roadmap & EPICs**\nTabla resumen\nProgreso, Puntuación, Prioridad" as ROAD
rectangle "�🌐 **Portafolio de proyectos**
Visión transversal
5 proyectos sincronizados" as PORT
}
AGENT --> INDEX : "Agent lee AGENT.adoc
1 vez para **comprender**"
INDEX --> AGENT : "Agent vuelve a leer INDEX.adoc\nCada sesión para **aplicar**"
note bottom of AGENT
Taille max : 200 lignes
end note
note bottom of INDEX
Taille max : 200 lignes
Source de vérité en cas de divergence
end note
@enduml
----
Esta redundancia asumida es una elección de diseño. Consume ~50 líneas adicionales de tokens EAGER — pero garantiza que el agente siempre tenga las reglas a la vista, incluso en el formato conciso que facilita la obediencia inmediata.
=== Los Archivos LAZY: El Manual del Propietario
Estos archivos viven en`.agents/`y solo se leen cuando el agente los necesita. Constituyen la verdadera riqueza del método, porque acumulan el conocimiento del proyecto sin contaminar el contexto actual.
[plantuml, format=svg, id=diag-agents-tree, alt="Arborescence complète du dossier .agents/"]
----
@startuml
skinparam folderBackgroundColor #E3F2FD
skinparam folderBorderColor #1565C0
skinparam fileBackgroundColor #FFF3E0
skinparam fileBorderColor #EF6C00
folder ".agents/" as ROOT {
file "INDEX.adoc
(EAGER -- 200 líneas)" as IDX #E8F5E9
file "AGENT_SESSION_MANAGER.adoc
(Sesión de plantilla)" as ASM
file "SESSION_CHECKLIST.adoc
(¿Cuándo cambiar?)" as CHK
file "PROCEDURES.adoc\n(6 pasos + LAZY/EAGER)" as PRO
file "SESSIONS_HISTORY.adoc\n(Toutes sessions)" as HIS
folder "sesiones/" as SESS {
file "1-chore-migration.adoc" as S1
file "109-formalización-lazy.adoc" as S109 #FFECB3
file "133-epic11-article.adoc" as S133
file "... +130 otros" as SMORE
}
folder "archivos/" as ARCH {
file "COMPLETED_TASKS_2026-04.adoc" as CTA
file "SESSIONS_HISTORY_83-95.adoc" as SHIST
folder "sessions_resúmenes/" as SUM {
file "SESSION_64_SUMMARY.adoc" as SU64
file "SESSION_73_SUMMARY.adoc" as SU73
file "..." as SUMORE
}
folder "prompts_archive/" as PARCH {
file "PROMPT_REPRISE_S65.adoc" as PR65
file "PROMPT_REPRISE_S75.adoc" as PR75
file "..." as PMORE
}
}
}
IDX --> SESS : "Índice"
IDX --> HIS : "Índice"
IDX --> ARCH : "Referencia"
note right of S109
Session 109 =
Formalisation stratégie
LAZY/EAGER
Token : ~25k → ~10k
end note
@enduml
----
El árbol anterior muestra la estructura real de la carpeta`.agents/`sobre`plantuml-plugin`, el proyecto más maduro. Observe la profundidad en tres capas: archivos raíz (metadatos), carpeta`sessions/`(archivos cronológicos), y expediente`archives/`(agregaciones y resúmenes). Es esta profundidad la que transforma la gobernanza de un simple archivo TODO en una**memoria organizacional completa**.
**.agents/sessions/{N}-{título}.adoc**Los archivos detallados de cada sesión. Actualmente :
* `plantuml-plugin`:**133 sesiones archivadas**(de la sesión 1 al 133)
* `bakery-plugin`:**11 sesiones**
* `magic-stick` : **23 sesiones**
* `cheroliv.com`:**9 sesiones formales**+ 7 sesiones pre-sistema reconstituidas retroactivamente
Cada archivo contiene el contexto completo de la sesión, las decisiones tomadas, los problemas encontrados y su resolución, los comandos ejecutados y su salida.
**.agents/SESSIONS_HISTORY.adoc**-- Un cuadro resumen de todas las sesiones con una puntuación. Ejemplo sobre`cheroliv.com`:
----
| -6 | 2025-05 | chore | Initialisation projet Gradle/JBake | 7/10 | 1 | 2026-04-25 | chore | Migration gouvernance agent | 8/10 | 7 | 2026-04-27 | debug/fix | Correction publishSite | 9/10 | 8 | 2026-04-27 | analyse | Analyse article 0108 | 7/10
**.agents/COMPLETED_TASKS_ARCHIVE_{mois}.adoc**-- Las tareas completadas archivadas por mes, para no sobrecargar el backlog activo. Cuando una historia de usuario está completa, se mueve aquí. El backlog sigue siendo legible: máximo 10 ítems activos.
**.agents/PROCEDURES.adoc**-- Plantillas detalladas del procedimiento de fin de sesión. Larga, pero leída una sola vez por el agente cuando aprende el método. Luego, el procedimiento se vuelve mecánico.
**.agents/AGENT_MODUS_OPERANDI.adoc**-- La documentación estratégica completa. Sobre`plantuml-plugin`, este archivo hace**900+ líneas**y se llama en realidad`AGENT_METHODOLOGIES.adoc`— cambié el nombre entre la redacción de este artículo y su implementación efectiva. Este tipo de divergencia de naming es inevitable en un sistema artesanal que evoluciona. Lo importante es la convención de nomenclatura: si el archivo documenta la *méthode*, comienza por`AGENT_`o un prefijo explícito. Documenta la metodología Eager/Lazy, los patrones a seguir, los anti-patrones a evitar. Es LAZY porque un agente no necesita volver a leer toda la estrategia en cada sesión, solo cuando hay ambigüedad.
**`*_REFERENCE.adoc`** -- Las referencias técnicas específicas del proyecto. Sobre`magic-stick`, dos archivos LAZY densos :
* `AB_PARTITION_REFERENCE.adoc`(147 líneas) -- Arquitectura de partición A/B GPT, scripts`update-system.sh`, tamaños estimados, mecanismo de rollback
* `BOOT_TEST_REFERENCE.adoc`(144 líneas) -- Procedimiento QEMU + VNC para probar el arranque de la ISO sin hardware físico, lista de verificación BIOS/UEFI, limitaciones CI/CD
Sobre`plantuml-plugin`</think> </think>
* `ARCHITECTURE.adoc`(134 líneas) -- Estructura de las 11 clases de datos, puntos de atención (trampas a evitar), comandos de prueba optimizados
* `API_KEY_POOL_REFERENCE.adoc`-- Detalles completos del pool de claves (LAZY mientras que`ESSENTIALS`está EAGER)
== Los Agentes Especializados : Un Equipo Virtual
La gobernanza no se limita a archivos pasivos. He formalizado de**roles de agentes especializados**en archivos LAZY dedicados, que definen el flujo de trabajo esperado según el tipo de tarea.
|===
|agente |Archivo |rol |Proyecto |**CODIFICAR** |`CODER.adoc` |Implementación FTL/CSS/JS, etiquetas semánticas, criterios de accesibilidad |cheroliv.com |**Maestro SCRUM** |`SCRUM_MASTER.adoc` |Planificación EE. UU., desglose en sub-tareas, detección de dependencias |cheroliv.com |**PlantUML Diseñador** |`PLANTUML_DESIGNER.adoc` |Creación de diagramas, sintaxis PUML, integración JBake |cheroliv.com
|===
El archivo`CODER.adoc`sobre`cheroliv.com`contiene reglas concretas : _Un solo`<h1>`por página_, _Prefijar los caminos con`${content.rootpath}`_, _Declarar el idioma`<html lang="${content.lang!"fr"}">`_. Estas convenciones, escritas una vez, se respetan automáticamente por el agente desde la sesión 1.
El archivo`SCRUM_MASTER.adoc`impone una estructura de entregable:**Objetivo**, **Tareas**(coordenadas con asignación)**Criterios de aceptación**, **Riesgos**. Cuando pido un plan de acción, el agente produce esta estructura sin que yo se la haya pedido. La gobernanza**programa**el agente.
==== Cuando los agentes especializados se vuelven indispensables
La creación de los agentes especializados sigue una curva natural. Al comienzo de un proyecto, no los necesitas —`AGENT.adoc`basta ampliamente. Pero cuando el proyecto crezca (digamos, más de 20 sesiones), dos señales deben alertarle:
1. El agente mezcla las convenciones de dos dominios distintos (ej: sintaxis PlantUML y reglas CSS)
2. Pasas más tiempo corrigiendo al agente sobre convenciones que ya le has explicado 5 veces
Sobre`cheroliv.com`, llegó a la sesión... 1. Sí, desde el principio. Porque este proyecto es un sitio web con tres lenguajes (FTL, CSS, JS), contenido AsciiDoc, y diagramas PlantUML — tres áreas que no tienen nada que ver. El agente CODER necesita conocer los tamaños de fuente y las media queries; el agente PLANTUML_DESIGNER necesita conocer la sintaxis`@startuml`. Sin separación, el agente CODER me proponía diagramas, y viceversa. El caos.
Sobre`jhipster-gradle-plugins`, he creado dos agentes especializados adaptados al desarrollo de plugins Gradle :`PLUGIN_DEVELOPER.adoc` et `BACKLOG_MANAGER.adoc`. El primero codifica todas las convenciones Kotlin/Gradle (no`!!`, clases de datos para los modelos,`@TaskAction`para las tareas). El segundo sabe que`persistence`debe ser estable antes de que`assistant`no comienza su desarrollo — una dependencia crítica en un mono-repo.
El error que no se debe cometer : crear demasiados agentes demasiado temprano`plantuml-plugin`Esperó la sesión 108 antes de formalizar un agente especializado para el conjunto de claves API. Antes de eso, el contexto del negocio se encontraba en`AGENT.adoc`. La regla empírica: un agente especializado se justifica cuando su dominio de negocio supera las 100 líneas de documentación.
==== Convención de Nomenclatura de Sesiones
Un detalle que parece fútil pero que se vuelve crítico cuando se alcanzan 100 sesiones. ¿Cómo nombrar los archivos de archivo?
He aprendido a mis expensas que una convención es necesaria — cuatro proyectos, cuatro formatos diferentes al principio, y ya no sabía orientarme. Hoy, la convención que he estabilizado es :
{N}-{type}-{sujet-kebab-case}.adoc
Ejemplos concretos: * `1-chore-migration-gouvernance-agent.adoc`— sesión 1, tipo tarea * `10-solidification-tests.adoc`— sesión 10, sin tipo explícito (el sujeto basta) * `036-debug-graphify-symlink-epic9.adoc`— sesión 36 con número de 3 dígitos para la ordenación El número de sesión es el criterio de ordenación principal. Los proyectos que utilizan números de tres cifras (001, 036, 133) evitan los problemas de ordenación lexicográfica cuando se supera 99. Esto es lo que ahora utilizo en`magic-stick`:`001-init-projet.adoc`, `036-debug-graphify-symlink-epic9.adoc`. El tipo es opcional y se deriva de las palabras clave de la sesión (debug, feature, refactor, docs, chore, test). El asunto en kebab-case es la parte más importante: debe permitir recuperar una sesión sin abrir el archivo. Si te preguntas « ¿cuál fue la sesión en la que se corrigió el timeout de las pruebas de integración? », la respuesta es`124-fix-timeout-integration-test.adoc`. Para las sesiones históricas reconstituidas (proyectos nacidos antes de la gobernanza), utilizo números negativos. Sobre`cheroliv.com`, las sesiones -6 a 0 cubren todo el historial pre-gobernanza del proyecto. Y para las sesiones « no documentadas » o perdidas, creo una entrada en`SESSIONS_HISTORY.adoc`sin archivo correspondiente, con una puntuación`?`. Es más honesto que fingir. [plantuml, format=svg, id=diag-naming-convention, alt="Arbre de décision pour le nommage des fichiers de session"]
@startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam wrapWidth 200
title Convención de Nomenclatura de Sesiones start
:Une session se termine; note right: Trigger "final de la sesión"
if (Session antérieure\nà la gouvernance ?) then (oui) :Numéro NÉGATIF\n-6, -5 … 0; note right: Historique\nreconstitué :Suffixe : reconstitution; else (non) :Numéro POSITIF\nsur 3 chiffres si > 99; note right: 001, 036, 133\npour le tri lexicographique
:Détecter le **TYPE**; if (Mots-clés trouvés ?) then (oui) :debug / feature / refactor\ndocs / chore / test; else (non) :Omettre le type\n(le sujet suffit); endif
:Formuler le **SUJET** en kebab-case;
note right
Ex: fix-timeout-integration-test
Doit permettre de retrouver
sans ouvrir le fichier
end note
endif
note right • 1-chore-migration-gouvernance.adoc • 036-debug-graphify-symlink.adoc • 124-fix-timeout-integration-test.adoc • 133-epic11-article-blog-kg.adoc end note
if (Session documentée ?) then (oui) :Créer archive dans sessions/; :Ajouter ligne SESSIONS_HISTORY\navec score X/10; else (non) :Ajouter ligne SESSIONS_HISTORY\navec score ?\nsans archive; note right: L’honnêteté\nplutôt que le vide endif
stop @enduml
==== TEST_COVERAGE_ANALYSIS.adoc` — El Paso 5 Detallado El paso 5 del procedimiento de fin de sesión es el más misterioso. Dice « Actualizar`TEST_COVERAGE_ANALYSIS.adoc`si se han añadido o modificado las pruebas. » Pero, ¿qué aspecto tiene este archivo? sobre`plantuml-plugin`, ha evolucionado de unas pocas líneas a una estructura completa. Aquí está su forma estabilizada: [source]
Analyse de Couverture de Tests
Suivi des Tests
Classe de test |
Type |
Tests |
Statut |
Dernière MAJ |
PlantumlServiceTest |
unit |
45/45 |
✅ PASS |
2026-04-23 |
ApiKeyPoolTest |
integration |
15/15 |
✅ PASS |
2026-04-20 |
Historique par Session
| Session | Tests ajoutés | Tests modifiés | Couverture | 133 | 0 | 2 | 100% | 132 | 5 | 0 | 100%
---- El interés no es el archivo en sí — es la obligación de notar lo que ha cambiado. Sin este paso, después de 50 sesiones, ya no sabes qué pruebas cubren qué. El agente tampoco. El archivo se convierte en el único repositorio de verdad sobre la cobertura de pruebas del proyecto. Para los proyectos sin pruebas tradicionales (como`magic-stick`que prueba scripts bash), el paso 5 se sustituye por`SCRIPT_VERIFICATION.adoc`. El mecanismo es el mismo: un archivo que sigue el estado de validación de los scripts. Adapta el paso 5 a tu proyecto, pero nunca lo omitas. Es la red de seguridad que evita la regresión silenciosa. Si su proyecto no tiene ninguna prueba — ni unitaria, ni funcional, ni de script — cree incluso el archivo vacío con una sección « Por hacer: definir una estrategia de prueba. » Es un marcador que le recordará a su futuro yo que este tema no está tratado. [plantuml, format=svg, id=diag-session-flow, alt="Flux d’une session type avec Eager/Lazy et agents"] ---- @startuml skinparam backgroundColor #FEFEFE start :Début session; note right: L’agent est une page blanche :Chargement EAGER auto; note right * AGENT.adoc (règles absolues) * PROMPT_REPRISE.adoc (mission N) * INDEX.adoc (état projet) end note if (Mission claire ?) then (oui) :Exécution directe; else (non) :Charge LAZY sur demande; note right * SESSIONS_HISTORY.adoc (contexte passé) * sessions/{N-1}-.adoc (décisions) * *REFERENCE.adoc (architechture) end note endif :Délégation agent spécialisé ?; if (CODER ?) then (oui) :Lit CODER.adoc; :Suit conventions FTL/CSS; elseif (SCRUM Master ?) then (oui) :Lit SCRUM_MASTER.adoc; :Structure livrable imposée; elseif (PlantUML ?) then (oui) :Lit PLANTUML_DESIGNER.adoc; :Syntaxe PUML + intégration; else (non) endif :Travail de la session; :Fin de session (trigger utilisateur); :Procédure 6 étapes; note right 1. Archive sessions/N-.adoc 2. Maj PROMPT_REPRISE.adoc (N+1) 3. Maj SESSIONS_HISTORY.adoc 4. Maj INDEX.adoc 5. Maj TEST_COVERAGE (si applicable) 6. Maj COMPLETED_TASKS_ARCHIVE.adoc end note :Checklist [✅] x 6; stop @enduml ---- El diagrama de arriba muestra el ciclo de vida completo de una sesión. El punto clave es la bifurcación después de la carga EAGER: ya sea la misión es suficientemente clara para ejecutar directamente (80% de los casos), o el agente carga el LAZY para resolver una ambigüedad (20% de los casos). Es esta discriminación la que ahorra los tokens. == El Procedimiento de Fin de Sesión: La Regla de Oro === ¿Por qué es imprescindible? Sin este procedimiento, la estrategia Eager/Lazy no sirve de nada. Es ella quien transforma el trabajo de la sesión en información persistente. Se ejecutaa petición explícita del usuario(palabras clave : "fin de sesión", "me voy", etc.), y ella estáobligatorio-- ninguna excepción, ninguna omisión. El archivo`SESSION_CHECKLIST.adoc`define las métricas de sesión ideal: * Duración: 15-30 minutos * Archivos modificados: 1-3 máximo * Intercambios LLM : 5-10 mensajes * Contexte tokens : < 50k Y hay signos de que hay que cambiar de sesión : _El LLM repite errores ya corregidos, Más de 3 archivos modificados en paralelo, Conversación > 50 mensajes. La regla de oro :Vale más 5 sesiones de 20 minutos que una sesión de 2 horas con debugging caótico. === El flujo de los 6 pasos (Silenciosamente) [plantuml, format=svg, id=diag-end-session-flow, alt="Flux de la procédure de fin de session"] ---- @startuml skinparam defaultTextAlignment center skinparam wrapWidth 200 skinparam activityBackgroundColor #E3F2FD start :L’utilisateur dit "fin de sesión"; note right: Mots-clés déclencheurs :Agent détecte le trigger; :Étape 1\nCréer archive\n`.agents/sessions/N-.adoc`; note right: Tout le contexte de la session :Étape 2\nMettre à jour\n`PROMPT_REPRISE.adoc`; note right: Mission N + critères d’acceptation N+1 :Étape 3\nMettre à jour\n`SESSIONS_HISTORY.adoc`; note right: Ligne récap : # / Date / Type / Sujet / Score :Étape 4\nMettre à jour\n`INDEX.adoc`; note right: État courant, roadmap, fichiers modifiés :Étape 5\nMettre à jour\n`TEST_COVERAGE_ANALYSIS.adoc`; note right: Si tests ajoutés ou modifiés :Étape 6\nMettre à jour\n`COMPLETED_TASKS_ARCHIVE.adoc`; note right: Archiver tâches terminées :Afficher la checklist de confirmation; note right: Vérifier que chaque [✅] est mérité stop @enduml ---- === Los Resultados de 150+ Sesiones Esto es lo que produce este procedimiento aplicado sistemáticamente en mis cuatro proyectos: plantuml-plugin: * 133 sesionesdesde el inicio del proyecto * 240/240 pruebas aprobadas(100% cobertura) — EPICs 1-7 completados * 57 escenarios Cucumber BDDvalidados * Regla de seguridad sobre los archivos de configuración surgida de un error real (Sesión 2 bakery-plugin) panadería-plugin : * 11 sesionesen dos semanas * Migración de Supabase a Firebase completada (9 pruebas corregidas) * EPIC 6 (publishProfile) funcional en producción * Regla 0 creada :`publishToMavenLocal`obligatorio después de cada modificación palo mágico : * 23 sesionespara construir un sistema live Xubuntu con partición A/B * Primera ISO generada en la sesión 10 * Pruebas de arranque QEMU + VNC formalizadas (documentación LAZY de 144 líneas) * CI/CD SourceForge funcional cheroliv.com: * 9 sesiones formales+ reconstitución de 7 sesiones pre-sistema * Artículo 0101 (OpenCode PATH) publicado * Article 0108 (éste) reescrito después del análisis de sus deficiencias * Gobernanza completa migrada de Markdown a AsciiDoc === La lista de verificación final Tras la ejecución silenciosa de los 6 pasos, el agente debe mostrar una lista de verificación de confirmación: ---- ✅ Procédure de fin de session exécutée 📋 Checklist : Regla absoluta: ningún paso puede marcarse`[✅] == La Guía de Bootstrap: Día 1, Sesión 0 Estás convencido del método. Quieres aplicarlo a un nuevo proyecto. ¿Por dónde empezar? Viví este momento el 28 de abril de 2026. Abro Opencode en`jhipster-gradle-plugins, mi mono-repo de dos plugins Gradle JHipster. Es un proyecto que ya existe — el código está allí, las tareas Gradle funcionan. Pero el agente de gobernanza ? Cero. Página blanca. Como`plantuml-plugin`A su sesión 1, hace varios meses. Este es el procedimiento exacto que seguí, y que seguiré para todo nuevo proyecto. Tenga en cuenta el orden — es importante. [plantuml, format=svg, id=diag-bootstrap, alt="Flux de bootstrap en 6 étapes pour initialiser la gouvernance agent sur un nouveau projet"] ---- @startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam wrapWidth 250 skinparam activityBackgroundColor #E8F5E9 title Bootstrap Gobernanza — Día 1, Sesión 0 start :Étape 0\nCréer opencode.json\n(6 lignes, instructions: AGENT.adoc); note right: Le pont qui charge\nAGENT.adoc automatiquement :Étape 1\nCréer les dossiers\nmkdir -p .agents/sessions/ .agents/archives/; note right: Les conteneurs vides\navant que l’agent écrive dedans :Étape 2\nCréer AGENT.adoc\n(200 lignes, règles absolues); note right: Le fichier maître\nStructure minimale v1 :Étape 3\nCréer PROMPT_REPRISE.adoc\nMission session 1 (max 70 lignes); note right: Ce que l’agent doit\nfaire à la prochaine session :Étape 4\nCréer .agents/INDEX.adoc\nRègles exécutives + roadmap; note right: Point d’entrée EAGER\ndans le dossier LAZY :Étape 5\nCréer les fichiers LAZY structurants\n6 fichiers : SESSIONS_HISTORY, CHECKLIST, etc.; note right • SESSIONS_HISTORY.adoc • SESSION_CHECKLIST.adoc • PROCEDURES.adoc • AGENT_SESSION_MANAGER.adoc • TEST_COVERAGE_ANALYSIS.adoc • Agents spécialisés (si besoin) end note :Étape 6\nAjouter le projet au Portefeuille\nMettre à jour TOUS les INDEX.adoc existants; note right: Maintenance transverse\nObligatoire mais fastidieuse :✅ Bootstrap terminé\nSession 1 prête; note right: 20 minutes investies\nDes centaines économisées stop @enduml ---- === Paso 0 : Crear Este es el primer archivo. No`AGENT.adoc, no`INDEX.adoc`. === Paso 1: Crear las Carpetas [source,bash] ---- mkdir -p .agents/sessions .agents/archives ---- Dos carpetas vacías. === Paso 2: Crear `AGENT.adoc — El Archivo Maestro Estructura mínima para la primera versión (crecerá) : [source] ---- = {NOM_PROJET} — Directives Agent [CAUTION] ---- PARADA OBLIGATORIAantes de rm, Escribir, supresión : 1. LEER el archivo completo 2. VERIFICAR git ls-files 3. SOLICITAR confirmación 4. ESPERAR "sí == Proyecto Nombre: … pila: … Documentación: AsciiDoc == Reglas Absolutas === 0. ENTORNO DE DESARROLLO Comandos esenciales… === 1. COMMITS/GIT prohibición formal… === 1b. ARCHIVOS DE CONFIGURACIÓN — REGLA ABSOLUTA DE SEGURIDAD Nunca aplastar… === 2. EXÁMENES AL FINAL DE LA SESIÓN Prohibición formal… === 3. PROCEDIMIENTO DE FIN DE SESIÓN Las 6 etapas obligatorias… == Gestión del Contexto — LAZY/EAGER Archivos EAGER / Archivos LAZY… Esta plantilla mínima permite al agente comenzar. La versión rica — con la estructura del proyecto, los componentes clave, los EPICs, el backlog — llegará en la sesión 1, cuando el agente ya tenga las reglas básicas en mano y pueda ayudarte a enriquecer el documento. === Paso 3 : Crear Un archivo que dice explícitamente: « Esta es la sesión 1, misión por definir. » Máximo 70 líneas, con una sección Sesión 0 (resumen del bootstrap) y una sección Sesión 1 (prioridades por definir con el usuario). === Paso 4: Crear El archivo que contendrá las reglas absolutas (versión ejecutiva) y la tabla de sesiones. Para el bootstrap, enumera las reglas 0 a 3 en su formato conciso, el portafolio de proyectos (incluyendo el nuevo proyecto con un emoji 🆕), y la hoja de ruta vacía lista para ser completada. === Paso 5: Crear los archivos LAZY estructurantes En orden : 1. Si su proyecto tiene un dominio de negocio complejo (como`jhipster-gradle-plugins`con su mono-repo persistence/assistant), cree los agentes especializados ahora: 1. No cree agentes que no vaya a utilizar. Un agente sin convenciones concretas para codificar es un archivo muerto que contamina. === Paso 6 : Agregar el Proyecto al Portafolio de TODOS los Proyectos Es el paso que olvidamos sistemáticamente. Cada`INDEX.adoc`de cada proyecto contiene una tabla « Portafolio de Proyectos » que enumera TODOS los proyectos con la misma metodología. Cuando creas un nuevo proyecto, debes: 1. Añadir una línea en el portafolio del nuevo proyecto (lógico) 2. Añadir una línea en el portafolio de TODOS los proyectos existentes — sí, todos En mis cuatro (ahora cinco) proyectos, eso significa abrir los`INDEX.adoc` de |
Session 1 |
… |
2026-04-28 🆕 </think> . Es tedioso. Es manual. También es la única forma de garantizar que, cualquiera que sea el proyecto en el que estás trabajando, el agente sepa cuáles otros proyectos existen y cuál es su estado. En la sesión 012 de`magic-stick, el agente detectó dos inconsistencias en la cartera —`bakery-gradle`tenía su COMPLETED_TASKS_ARCHIVE atrasado, y`plantuml-gradle`Tenía un desfase entre su documentación de procedimiento (5 pasos) y su ÍNDICE (6 pasos). Sin esta tabla transversal, estas incoherencias habrían permanecido invisibles. [plantuml, format=svg, id=diag-portfolio-graph, alt="Graphe du portefeuille de projets — références croisées entre INDEX.adoc"] ---- @startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam nodeBackgroundColor #E3F2FD title Portafolio de Proyectos — Referencias Cruzadas INDEX.adoc node "magic-stick\nSesión 037\nSCRIPT_VERIFICATION" as MS #E1BEE7 node "bakery-gradle Sesión 11 PRUEBA_COBERTURA" as BG #FFE0B2 node "cheroliv.com Sesión 10 TEST_COVERAGE" as CH #C8E6C9 node "plantuml-gradle\nSesión 133\nTEST_COVERAGE" as PG #BBDEFB node "jhipster-gradle Sesión 1 🆕 TEST_COVERAGE" as JG #FFCDD2 MS -→ BG : INDEX.adoc référence MS -→ CH : INDEX.adoc référence MS -→ PG : INDEX.adoc référence MS -→ JG : INDEX.adoc référence 🆕 BG -→ MS : INDEX.adoc référence BG -→ CH : INDEX.adoc référence BG -→ PG : INDEX.adoc référence BG -→ JG : INDEX.adoc référence 🆕 CH -→ MS : INDEX.adoc référence CH -→ BG : INDEX.adoc référence CH -→ PG : INDEX.adoc référence CH -→ JG : INDEX.adoc référence 🆕 PG -→ MS : INDEX.adoc référence PG -→ BG : INDEX.adoc référence PG -→ CH : INDEX.adoc référence PG -→ JG : INDEX.adoc référence 🆕 JG -→ MS : INDEX.adoc référence JG -→ BG : INDEX.adoc référence JG -→ CH : INDEX.adoc référence JG -→ PG : INDEX.adoc référence note bottom of JG Quand on ajoute un projet : • 4 INDEX.adoc à mettre à jour • 1 ligne par portefeuille • Coût : 5 minutes end note legend bottom |
= Couleur |
= Projet |
<#E1BEE7> |
|
magic-stick — ISO Linux live |
<#FFE0B2> |
bakery-gradle — Plugin JBake |
|
<#C8E6C9> |
cheroliv.com — Site personnel |
||
<#BBDEFB> |
plantuml-gradle — Plugin IA |
<#FFCDD2> |