diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index f65a315..66802d0 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -1,4 +1,7 @@ b3aa1294777afebe63d4e914e555849c3435c3c08e45533b99c96b096fcda9ad metodo.md -896a92488d149cd16be26cf126e32db58591f640c463ef25a7badd56d71ee25d bin/metodo +a65fcd72ed8b6ed87ee35fb06d16796c55a2f138f31d35ba27f116b25dc1bde2 bin/metodo f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md 6871c5f29642ccec3e60109324de1e5bab8fa5ee73792360d85277bde3323aea workflows/comunicacion-entre-sesiones.md +2b9037f6dd57b5598c70a676cb728556654f05d1c5b024e7b716864659f7b884 workflows/sesion-ejecucion.md +f35dda490674d37da4a8f9412a2463ea37c42c02af4f63d642e06c8a3f9cfc90 workflows/sesion-exploracion.md +4db06b6b4d0dcfd2493a7a5d9a36d98f05aeac63729671bdc30ae20d2fd51db3 workflows/sesion-orquestadora.md diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index 7b58ff8..73713fa 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -271,7 +271,7 @@ check_headings() { # ⛔ `workflows/` entró el 2026-08-30: sus enlaces NO los miraba nadie, y por eso # `comunicacion-entre-sesiones.md` llevaba 2 enlaces ROTOS en la matriz Y en los 27 repos. # Un fichero cuyo único trabajo es LLEVAR al Método apuntaba a un sitio que no existe. - for f in "$ROOT"/*.md "$ROOT"/doc/*.md "$ROOT"/workflows/*.md; do + for f in "$ROOT"/*.md "$ROOT"/doc/*.md "$ROOT"/workflows/*.md "$ROOT"/workflows/apendices/*.md; do [ -f "$f" ] || continue # Un encabezado ## no lleva emoji de ESTADO (el estado vive en las casillas). # ⚠️ se excluye a propósito: en un título es "bandera/aviso", no estado de sección. @@ -290,7 +290,7 @@ check_links() { # ⛔ `workflows/` entró el 2026-08-30: sus enlaces NO los miraba nadie, y por eso # `comunicacion-entre-sesiones.md` llevaba 2 enlaces ROTOS en la matriz Y en los 27 repos. # Un fichero cuyo único trabajo es LLEVAR al Método apuntaba a un sitio que no existe. - for f in "$ROOT"/*.md "$ROOT"/doc/*.md "$ROOT"/workflows/*.md; do + for f in "$ROOT"/*.md "$ROOT"/doc/*.md "$ROOT"/workflows/*.md "$ROOT"/workflows/apendices/*.md; do [ -f "$f" ] || continue dir=$(dirname "$f") # process substitution (< <(...)) para que el while corra en ESTE shell y bad() cuente @@ -795,11 +795,16 @@ cmd_init() { _wf_no_viaja "$(basename "$_wf")" && continue cp "$_wf" "$md/workflows/$(basename "$_wf")" done - # Y RETIRA lo que ya no debe estar: una exclusión que sólo deja de copiar no limpia lo + # Y RETIRA lo que ya no debe estar. ⛔ El criterio es **ausencia en el MÁSTER**, no + # pertenencia a la lista de exclusión: un workflow RETIRADO o RENOMBRADO en la matriz + # tampoco debe sobrevivir aquí. Con el criterio antiguo se quedaba vivo Y fuera de + # CHECKSUMS ⇒ `check` decía «copia íntegra, rc=0» con un fichero fantasma dentro. + # (Medido 2026-08-30 por la sesión que construyó los núcleos, con control positivo.) # que un bucle anterior ya depositó. Sin esto, el fichero mal vendorizado sobrevive. for _old in "$md"/workflows/*.md; do [ -e "$_old" ] || continue - _wf_no_viaja "$(basename "$_old")" && rm -f "$_old" + _b=$(basename "$_old") + if _wf_no_viaja "$_b" || [ ! -e "$SELF_ROOT/workflows/$_b" ]; then rm -f "$_old"; fi done local mver adopt mver=$(grep -E '^version:' "$SELF_ROOT/.metodo/VERSION" 2>/dev/null | sed 's/version:[[:space:]]*//') @@ -841,11 +846,16 @@ cmd_update() { _wf_no_viaja "$(basename "$_wf")" && continue cp "$_wf" "$md/workflows/$(basename "$_wf")" done - # Y RETIRA lo que ya no debe estar: una exclusión que sólo deja de copiar no limpia lo + # Y RETIRA lo que ya no debe estar. ⛔ El criterio es **ausencia en el MÁSTER**, no + # pertenencia a la lista de exclusión: un workflow RETIRADO o RENOMBRADO en la matriz + # tampoco debe sobrevivir aquí. Con el criterio antiguo se quedaba vivo Y fuera de + # CHECKSUMS ⇒ `check` decía «copia íntegra, rc=0» con un fichero fantasma dentro. + # (Medido 2026-08-30 por la sesión que construyó los núcleos, con control positivo.) # que un bucle anterior ya depositó. Sin esto, el fichero mal vendorizado sobrevive. for _old in "$md"/workflows/*.md; do [ -e "$_old" ] || continue - _wf_no_viaja "$(basename "$_old")" && rm -f "$_old" + _b=$(basename "$_old") + if _wf_no_viaja "$_b" || [ ! -e "$SELF_ROOT/workflows/$_b" ]; then rm -f "$_old"; fi done local mver adopt mver=$(grep -E '^version:' "$SELF_ROOT/.metodo/VERSION" 2>/dev/null | sed 's/version:[[:space:]]*//') diff --git a/.metodo/workflows/sesion-ejecucion.md b/.metodo/workflows/sesion-ejecucion.md new file mode 100644 index 0000000..efddb8c --- /dev/null +++ b/.metodo/workflows/sesion-ejecucion.md @@ -0,0 +1,128 @@ +# Workflow: sesión de EJECUCIÓN — núcleo + + +⛔ **Antes de tocar nada, lee el Método: [`repos/metodo/metodo.md`](../metodo.md)** — los +raíles transversales, completos y con sus cicatrices. Si trabajas **dentro de un repo**, la copia que +te toca es la suya (`.metodo/metodo.md`), que va sellada y la mide `metodo check`. +⇒ Y **`§7`**: al arrancar se leen `AVISOS.md`, `decisiones.md` y `backlog.md`; **la bitácora NO**, se +consulta por su índice. Arrancar cuesta ~400 k tokens en un frente maduro y **la bitácora es el 79 %**. +⇒ *Este bloque existe porque el 2026-08-29 se midió que **7 de los 9 workflows del árbol no llevaban +al Método**, incluidos los dos más usados. Una constitución sólo gobierna si algo lleva a ella: es su +propio raíl `§8` —* ***un aviso que nadie lee no es un mecanismo de contención.*** + + +> **Esto es el NÚCLEO: el método de aplicar un cambio ya decidido, sin el frente.** Viaja a cada +> repo con `.metodo/`. Qué máquinas hay, qué comandos, qué es intocable y dónde se documenta vive +> en su **apéndice**, que **no viaja**: se lee sobre este núcleo, no en su lugar. + +Para tareas que **aplican cambios reales**. Si la tarea es solo leer, comparar o diagnosticar sin +tocar nada, la que toca es la de **exploración** (`sesion-exploracion.md`) — tiene menos +salvaguardas porque no las necesita. + +⛔ **Esta sesión no decide diseño: ejecuta lo ya decidido, con cuidado.** El "qué" se acordó antes; +lo suyo es el "cómo". Si al llegar la realidad no coincide con lo que el encargo daba por cierto, +**para y reporta** — no improvisa (`§6` del Método: la premisa del prompt también se mide). + +## Cuándo se usa + +Cuando ya se ha decidido **qué** cambiar y **cómo** —normalmente fruto de una exploración previa +más la conversación con el usuario— y toca aplicarlo. El disparador concreto de cada frente, y qué +cuenta allí como "cambio real", están en su apéndice. + +## Qué debe llevar el prompt + +1. **Punto de partida obligatorio**: qué leer antes de nada — el `CLAUDE.md` del sitio, el corpus + del frente (`doc/AVISOS.md` **primero**, `doc/decisiones.md`, `doc/backlog.md`) y el análisis o + discusión previa **donde se tomó la decisión**. +2. **Las tareas exactas, copiadas literalmente** de donde vivan, **marcadas como ya decididas** — + el prompt debe dejar claro que no hace falta volver a preguntar el "qué". *«Literalmente» + cierra la puerta a que el prompt parafrasee la tarea, que es de donde salen las premisas + rancias.* +3. **Para cada tarea**: qué cambiar exactamente, **en qué orden** si hay dependencias, y qué hacer + si la realidad encontrada no coincide con lo documentado (parar y preguntar, nunca improvisar + sobre algo en producción). +4. ⛔ **El reparto de riesgo, explícito y en dos montones**: qué es de **bajo riesgo** —se aplica + tras verificar el estado actual, sin confirmación paso a paso— y qué toca **algo que no se + puede permitir perder** (el acceso de administración, la conectividad activa, los datos). + **Eso segundo exige plan de reversión ANTES de aplicar**, y si algo no es como se esperaba, + parar en vez de avanzar. +5. ⛔ **Quién ejecuta cada paso, y con qué credencial.** Un paso no está especificado hasta que + dice **quién** lo hace y quien lo escribe ha comprobado que **puede**. Si la respuesta es «el + humano», **se dice en el encargo** y se le deja el bloque listo para su terminal. + +⚠️ **Y un plan de reversión que nadie ha visto disparar es una promesa, no una red.** Si se puede +ensayar barato, se ensaya; si no, se dice que no está ensayado. Su ventana hace indistinguible +*«aún no ha disparado»* de *«ha fallado»*. + +## Qué hace la sesión + +1. Lee lo que el encargo manda leer, **en ese orden**. +2. **Captura el estado ANTES** (`show running-config`, `get -o yaml`, `wg show`, lo que + corresponda), **aplica el cambio**, **captura el estado DESPUÉS**, y **compara**. Los dos + extremos, no solo el de después: sin el antes, el verde no prueba nada. +3. ⛔ **Verifica el RESULTADO, no el estado declarado.** Un campo que dice que algo está arriba no + es la prueba de que funcione: *un `gre_up: true` con `ospf_state: Down` **NO** es un éxito*. Se + comprueba el comportamiento real —tráfico que pasa, la consulta que responde, el fichero que + está donde tiene que estar—, y se exige el testigo que **discrimina**, no el que siempre sale + verde (`§1` del Método). +4. Si algo **no coincide** con lo esperado, **para y pregunta** — no decide sobre la marcha cómo + resolverlo si afecta a producción. +5. **Documenta lo aplicado** (antes/después, comandos usados) donde su frente documente, con el + mismo formato que lo que ya hay ahí — no invente uno nuevo. +6. **Actualiza el backlog**: `[x]` solo si se aplicó **y se verificó** de verdad, `[~]` si quedó + parcial, `[ ]` con el motivo si no se pudo o si quedó como propuesta pendiente de confirmación + humana. +7. **Escribe en memoria el hecho persistente** (ver debajo). +8. ⛔ **Si algo descubierto contradice una decisión escrita, lo dice explícitamente** en el resumen + final — y si la contradice de frente, **PARA y reporta**: no se escribe otra decisión debajo + (`§6` y `§7` del Método). Una arquitectura no se actualiza sola. + +## Escribir en memoria tras ejecutar + +**Por qué**: una tarea de ejecución cambia hechos que valen para **todas las sesiones futuras**, no +solo para esta conversación. Por eso, además de documentarlo donde toque, se guarda en el sistema +de memoria. + +⭐ **Qué guardar, y es un PUNTERO**: guárdalo (`type: project` o `reference`) **apuntando** al +backlog, al `readme.md` o al documento donde vive el detalle — **no dupliques el contenido en la +memoria**. La memoria es el atajo para que una sesión futura sepa que algo existe y dónde mirarlo, +no una segunda copia que derive de la primera (`§7`: escribirlo en dos sitios **no es prudencia, es +crear la deriva**). + +**Qué NO guardar**: si el dato ya es trivial de obtener leyendo la documentación —rutas, comandos +exactos, credenciales—, no hace falta memoria aparte. + +## Plantilla de prompt + +*El esqueleto. El relleno —qué leer, qué máquinas, qué es intocable, dónde se documenta— lo pone +el apéndice del frente.* + +``` +Trabaja en . + +Antes de nada, lee: +- +- , , "> +- + +Estas tareas YA ESTÁN DECIDIDAS (no preguntes el "qué", ejecuta el "cómo" con cuidado), en +este orden: + + +Reglas: +1. Antes de cualquier cambio, captura el estado actual. Aplica. Vuelve a capturar y compara. +2. Verifica el RESULTADO, no el estado declarado: exige el testigo que discrimina, no el que + siempre sale verde. +3. Si algo no coincide con lo documentado, PARA y pregúntame — no improvises sobre algo en + producción. +4. No toques nada que pueda cortar sin dejar antes un plan + de reversión o un camino alternativo. +5. Documenta lo aplicado (antes/después) en . +6. Actualiza : [x] solo si se verificó, [~] si quedó parcial, [ ] con el motivo. +7. Escribe en memoria el hecho resultante COMO PUNTERO — no dupliques contenido. +8. Si algo contradice una decisión escrita, dilo explícitamente; si la contradice de frente, + PARA y repórtamelo. + +Al terminar, dame un resumen: qué se aplicó y verificó de verdad, qué quedó como propuesta +pendiente de mi confirmación, y qué no se pudo hacer (y por qué). +``` diff --git a/.metodo/workflows/sesion-exploracion.md b/.metodo/workflows/sesion-exploracion.md new file mode 100644 index 0000000..91be638 --- /dev/null +++ b/.metodo/workflows/sesion-exploracion.md @@ -0,0 +1,110 @@ +# Workflow: sesión de EXPLORACIÓN — núcleo + + +⛔ **Antes de tocar nada, lee el Método: [`repos/metodo/metodo.md`](../metodo.md)** — los +raíles transversales, completos y con sus cicatrices. Si trabajas **dentro de un repo**, la copia que +te toca es la suya (`.metodo/metodo.md`), que va sellada y la mide `metodo check`. +⇒ Y **`§7`**: al arrancar se leen `AVISOS.md`, `decisiones.md` y `backlog.md`; **la bitácora NO**, se +consulta por su índice. Arrancar cuesta ~400 k tokens en un frente maduro y **la bitácora es el 79 %**. +⇒ *Este bloque existe porque el 2026-08-29 se midió que **7 de los 9 workflows del árbol no llevaban +al Método**, incluidos los dos más usados. Una constitución sólo gobierna si algo lleva a ella: es su +propio raíl `§8` —* ***un aviso que nadie lee no es un mecanismo de contención.*** + + +> **Esto es el NÚCLEO: el método de mirar sin tocar, sin el frente.** Viaja a cada repo con +> `.metodo/`. Qué se mira, con qué herramienta y por dónde se entra vive en su **apéndice**, que +> **no viaja**: se lee sobre este núcleo, no en su lugar. + +Para tareas de **lectura, medida y diagnóstico**: inventariar, leer, comparar, aislar una causa — +**sin aplicar ningún cambio real**. Si la tarea sí implica cambiar algo, la que toca es la de +**ejecución** (`sesion-ejecucion.md`), que tiene las salvaguardas que ésta no necesita. + +⛔ **Solo-lectura no es "portarse bien": es una propiedad que hay que poder demostrar.** Todo lo de +esta fase es reversible **por definición**, y por eso se puede iterar sin pedir permiso en cada +paso — pero en el momento en que algo module estado, aunque sea "para confirmar la hipótesis", ya +**no** es esta sesión (`§12` del Método). + +## Cuándo se usa + +Cuando la tarea consiste en inventariar, leer, comparar o diagnosticar, y **nunca** en modificar +configuración real. El disparador concreto de cada frente está en su apéndice. + +## Qué debe llevar el prompt + +1. **Punto de partida obligatorio**: qué leer antes de nada — el `CLAUDE.md` del sitio y el corpus + del frente (`doc/AVISOS.md` **primero**, `doc/decisiones.md`, `doc/backlog.md`), más el + documento de arquitectura o análisis que aplique. +2. **La tarea exacta, copiada literalmente** de donde viva (sección y checkboxes). *«Literalmente» + cierra la puerta a que el prompt parafrasee la tarea, que es de donde salen las premisas + rancias.* +3. ⭐ **Criterios de validación**: si la fuente no los enumera, **cada sub-checkbox de la sección es + por defecto un criterio**. Es lo que convierte un encargo en algo **evaluable** — sin esto, "he + mirado" y "está comprobado" son indistinguibles. +4. ⛔ **El encargo negativo, ENUMERANDO LOS VERBOS PROHIBIDOS** — no un genérico «no cambies nada». + Se listan los gestos concretos que en ese frente sí modificarían estado *(instalar, aprobar, + inicializar, aplicar, reiniciar, tocar el firewall…)*, porque un «no cambies nada» abstracto + deja a la sesión decidiendo qué cuenta como cambio. La **forma** es del núcleo; **la lista la + pone el apéndice**. + ⇒ Y con su cierre: si detecta algo mejorable, **lo documenta como hallazgo o recomendación, no + lo aplica**. + +## Qué hace la sesión + +1. Lee lo que el encargo manda leer, **en ese orden**. +2. Explora y mide lo necesario — puede conectarse a lo que haga falta **solo para leer**, nunca + para configurar. +3. **Documenta los hallazgos** donde su frente documente, con el mismo formato que lo que ya hay + ahí (úsalo de plantilla). ⚠️ **No crea documento aparte** salvo que el hallazgo sea **sustancial + y merezca su propio archivo** — un documento nuevo por cada exploración es ruido, no corpus. +4. ⭐ **Evalúa honestamente, contra los criterios, si la tarea está completa, parcial o + bloqueada.** No "ha ido bien": contra los criterios, uno a uno. +5. **Actualiza el backlog**: marca cada checkbox (`[x]` **solo si se verificó de verdad**, `[~]` si + quedó parcial, `[ ]` con el motivo si no se pudo) y enlaza lo que haya escrito. +6. ⛔ **Si algo descubierto contradice una decisión escrita** —una arquitectura, una `D` cerrada—, + **lo dice explícitamente** en el resumen final, y si la contradice de frente **PARA y reporta** + (`§6` del Método). Nada se actualiza solo. +7. ⛔ **Si lo explorado revela una tarea de configuración que convendría aplicar, la deja + PROPUESTA — no la ejecuta.** Esa propuesta es la semilla de una futura sesión de **ejecución**, + con su propio encargo. + +⚠️ **Lo que este núcleo NO trae, y se dice en vez de disimularlo**: predicción, testigo y control +negativo. Ninguno de los workflows de los que sale lo tenía — toda su disciplina es de efectos +secundarios («qué no tocar», «para y pregunta»). Es un hueco **conocido y medido**, no un olvido, y +se cierra por núcleo cuando toque. + +## Plantilla de prompt + +*El esqueleto. El relleno —qué leer, qué se mira, con qué herramienta, qué verbos están +prohibidos— lo pone el apéndice del frente.* + +``` +Trabaja en . + +Antes de nada, lee: +- +- , , "> +- + +Tarea a ejecutar (es de EXPLORACIÓN/LECTURA, no de configuración): + + +Criterios de validación: + + +Haz lo siguiente: +1. Explora/mide lo necesario para cubrir cada punto. NO — aunque + detectes algo mejorable, documéntalo como recomendación, no lo apliques. +2. Documenta lo encontrado en , siguiendo el formato de lo que ya hay ahí. No crees un + documento aparte salvo que el hallazgo lo merezca. +3. Vuelve a y marca cada checkbox: [x] solo si lo verificaste de verdad, [~] si + quedó parcial, [ ] anotando el motivo. Enlaza lo que hayas escrito. +4. Evalúa contra los criterios si la tarea queda completa, parcial o bloqueada — y dilo. +5. Si algo contradice una decisión escrita, dilo explícitamente; si la contradice de frente, + PARA y repórtamelo. +6. Si descubres una tarea de configuración que convendría aplicar, DÉJALA PROPUESTA. No la + ejecutes. + +Al terminar, dame un resumen breve de qué se confirmó, qué se descartó, qué quedó propuesto y +qué quedó pendiente. +``` diff --git a/.metodo/workflows/sesion-orquestadora.md b/.metodo/workflows/sesion-orquestadora.md new file mode 100644 index 0000000..ef81ed9 --- /dev/null +++ b/.metodo/workflows/sesion-orquestadora.md @@ -0,0 +1,202 @@ +# Workflow: sesión ORQUESTADORA — núcleo + + +⛔ **Antes de tocar nada, lee el Método: [`repos/metodo/metodo.md`](../metodo.md)** — los +raíles transversales, completos y con sus cicatrices. Si trabajas **dentro de un repo**, la copia que +te toca es la suya (`.metodo/metodo.md`), que va sellada y la mide `metodo check`. +⇒ Y **`§7`**: al arrancar se leen `AVISOS.md`, `decisiones.md` y `backlog.md`; **la bitácora NO**, se +consulta por su índice. Arrancar cuesta ~400 k tokens en un frente maduro y **la bitácora es el 79 %**. +⇒ *Este bloque existe porque el 2026-08-29 se midió que **7 de los 9 workflows del árbol no llevaban +al Método**, incluidos los dos más usados. Una constitución sólo gobierna si algo lleva a ella: es su +propio raíl `§8` —* ***un aviso que nadie lee no es un mecanismo de contención.*** + + +> **Esto es el NÚCLEO: el método de coordinar, sin el frente.** Viaja a cada repo con `.metodo/`. +> Lo que sea de un frente concreto —qué backlogs hay, qué rutas, qué máquinas, qué es intocable— +> vive en su **apéndice**, y un apéndice **no viaja**: se lee sobre este núcleo, no en su lugar. +> ⇒ En el árbol multi-repo el apéndice es `apendices/arbol-proyectos.md`; en un repo que se clona +> solo, el frente es **ese repo** y su corpus (`doc/AVISOS.md` · `doc/decisiones.md` · +> `doc/backlog.md`). + +Esta sesión es el **punto central de coordinación**. No ejecuta infraestructura directamente +(salvo cambios menores y seguros), sino que: + +1. Mantiene el contexto global entre sesiones de ejecución y exploración. +2. Hace refinement del backlog a medida que llegan resultados. +3. **Genera los prompts** de las sesiones satélite — su entregable *es* el prompt. +4. Recibe sus resúmenes y decide el siguiente paso. +5. Actualiza documentación, memoria y backlog cuando hace falta. + +⛔ **Y su frontera no la decide «¿sé hacerlo?» ni «¿es peligroso?», sino «¿esto tiene un TIPO DE +SESIÓN PROPIO?»** — si lo tiene, **se delega aunque sea texto, aunque sea barato y aunque sepas +hacerlo** (`§7` del Método). Un documento que describe un tipo de sesión **se lee como un método que +aplicar uno mismo**, y ése es el mecanismo del fallo. + +## Cuándo se usa + +Siempre que haya que coordinar en vez de ejecutar. Es el rol por defecto salvo que se diga otra +cosa: las sesiones de exploración y ejecución son **satélites** que ésta lanza y recibe. +⇒ El disparador concreto de cada frente está en su apéndice. +## Cómo arranca una sesión orquestadora nueva + +Cuando la sesión actual se agota de contexto, hay que abrir una nueva que retome +exactamente el mismo rol. El prompt de continuación debe incluir: + +1. **Leer CLAUDE.md** — acceso a infraestructura, siempre lo primero. +2. **Leer MEMORY.md** — índice de hechos persistentes del proyecto. +3. **Leer los backlogs vivos del frente** — estado de lo hecho, lo que está en curso y lo + pendiente. **Cuáles son los tuyos lo dice el apéndice de tu árbol o el `CLAUDE.md` de tu repo**, + no este fichero: el núcleo pone la **forma** (léelos antes de decidir nada), y **la lista es de + quien la tiene**. *(Aquí iba una lista de tres rutas de un árbol concreto. Se retiró el + 2026-08-30 antes de repartirse: viajaba a 27 repos que no tienen ninguna de las tres, contra + «viaja lo que sirve a un repo que sólo se tiene a sí mismo».)* +4. **Estado de la sesión anterior**: qué prompts se lanzaron y cuáles están + esperando respuesta. Si hay un prompt pendiente de resultado, indicarlo + explícitamente para que la nueva sesión sepa que su primer input del usuario + puede ser ese resultado. +5. **Instrucción de rol**: "tu rol es el de sesión orquestadora — no ejecutes + infraestructura directamente salvo cambios menores y seguros; genera prompts + para las sesiones de exploración/ejecución siguiendo los workflows de esta + carpeta". + +## Qué hace la sesión orquestadora cuando recibe un resultado + +Cuando el usuario pega el resumen de una sesión de exploración/ejecución: + +1. Actualiza el backlog (`[x]`, `[~]`, `[ ]` con notas). +2. Si la sesión produjo archivos nuevos, hace `git add + commit + push` al repo + de Kubernetes (`git.c2et.com/SECOPS/kubernetes.git`). +3. Actualiza o crea memorias si hay hechos nuevos persistentes. +4. Decide el siguiente paso: ¿hay otra tarea lista para ejecutar? ¿hay que + refinar algo antes? ¿hay un bloqueante que resolver con el usuario? +5. Propone el siguiente prompt o pregunta al usuario qué quiere atacar. + +## ⛔ Las cifras y los estados de un prompt SE MIDEN AL ESCRIBIRLO, no se recuerdan + +Un prompt es una **afirmación**, y una afirmación rancia le cuesta tiempo a la sesión que la +recibe. *(Cicatriz 2026-07-27, dos en el mismo encargo: dije «suite en 438 verdes» cuando iban por +**572** —cifra de dos días antes— y monté un plan de verificación sobre dos hechos **incompatibles +entre sí**: «la Raspberry es tu punto de vista» y «brume-5-1 no está emparejado». Sin hub, el plan +sale vacío y allí solo se puede medir la ausencia. La sesión cazó las dos y preguntó, que es lo +correcto — pero el coste fue suyo.)* + +Antes de mandar un prompt: **mide** el número de tests, la versión instalada, qué device está +emparejado, qué hay desplegado. Son dos comandos. Y si un dato no lo puedes medir, escríbelo como +lo que es —*«creo que…, verifícalo»*— en vez de como un hecho. + +⛔ **Y un paso de un encargo no está especificado hasta que dice QUIÉN lo ejecuta — y tú has +comprobado que PUEDE.** Un prompt describe *qué* hacer; la capacidad del actor es una premisa más, y +de las que no se ven hasta que la sesión llega allí y choca. *(Cicatriz 2026-08-12, y son **dos en el +mismo hilo, con la misma forma**: (a) la orquestadora escribió en una decisión cerrada +—`R16`— que el token de Vault lo **acuñaría `mcp-secrets`**, y esa herramienta solo sabe +`harbor` y `git` (`TokenKind = Literal["harbor","git"]`) — y no podría saber más, porque **publica +en Vault** y ése es justo el token que abre Vault; (b) el encargo siguiente decía «la sesión crea la +política y el token con `kubectl exec vault-0`», y la sesión lo midió al llegar: +`auth/token/create → deny`, `vault policy read → 403`. El único token que tiene contra Vault es el +de ESO, **solo-lectura de KV**; el root vive en un GPG tras la passphrase DR que **por diseño** no +entra en una sesión.)* +⇒ Antes de escribir un paso, pregunta **con qué credencial se ejecuta** y si el que la tiene es +quien va a estar delante. Si la respuesta es «el humano», **dilo en el encargo** y deja el bloque +listo para su terminal — no lo redactes como si lo fuera a hacer la sesión. +⇒ ⭐ Y el patrón que las une, que es el que hay que buscarse a uno mismo: **especificar el QUÉ sin +medir el QUIÉN.** Las dos veces la mecánica era correcta y el actor no podía. + +⛔ **Y un DIAGNÓSTICO heredado de otra sesión también es una afirmación, no un dato.** *(Tercera +premisa falsa de la misma racha: el encargo de F11.13 decía «a `brume-5-1` le falta la zona `wgt`» +—diagnóstico de la sesión anterior, copiado como hecho—. La zona **ya estaba**; lo que faltaba era +la **ruta de vuelta** (`ospf: false`), y en el otro nodo igual.)* Cuando repitas la causa que otro +encontró, **repítela como hipótesis**: *«la sesión anterior lo atribuyó a X — verifícalo antes de +arreglar»*. Un diagnóstico correcto sobre un síntoma no es un diagnóstico verificado. + +## ⭐ Cómo se prioriza la deuda: INERTE contra MORDIENDO *(Xavier, 2026-08-02)* + +**`manabo` es una plataforma de aprendizaje, y que queden cosas a medias es el modo de +funcionamiento, no un defecto.** Xavier rota prioridades entre proyectos **a propósito**. + +⇒ Por eso *«hecho / a medias»* es un mal criterio para ordenar trabajo, y la orquestadora lo ha usado +mal más de una vez —*«sin deuda antes de empezar la fase»*—. La distinción útil es otra: + +> **¿está a medias e INERTE, o a medias y MORDIENDO?** + +*(La medida que lo enseña, 2026-08-02: el **etcd** de `niflheim` llevaba **8 meses** a medias **sin +molestar a nadie**. Su **apiserver** llevaba lo mismo, y se comía **un tercio de la admisión del +cluster entero** —cert-manager, metallb, external-secrets, ingress-nginx— **en silencio**. Misma +antigüedad, mismo «a medias», y uno de los dos era una avería en producción.)* + +⇒ Lo que hay que preguntarse de cada cosa abierta no es cuánto lleva ahí, sino **qué está costando +ahora mismo**. Y si la respuesta es «no se sabe», eso ya es la respuesta: **lo que no se mide, muerde +en silencio**. + + + +### ⛔ En una pieza con CARA HUMANA el gate tiene DOS MITADES, y ninguna sustituye a la otra *(Xavier, 2026-08-18)* + +La orquestadora escribió en el encargo de `I11.10`: *«el criterio de aceptación no es una tabla de +mutaciones: son gestos»*. **Sustitución, y Xavier la corrigió: es un COMPLEMENTO.** + +**Porque cada mitad tapa el agujero de la otra:** +- **Solo gestos** ⇒ un botón que hace **lo que no debe** también es un gesto. Pasa el listón con el + sistema roto, y encima con la sensación de haber cumplido el criterio nuevo. +- **Solo mutaciones** ⇒ una pantalla puede tener **todo en rojo cuando toca** y seguir costando + cuatro gestos. Verde entero sobre algo que **nadie puede usar** — que es exactamente la deriva que + `D23` vino a cortar. + +⇒ **Las dos van en el entregable, y por separado**: la tabla de mutaciones dice que **es correcto**, +el recuento de gestos dice que **es usable**. Ninguna de las dos es el gate por sí sola, y una verde +con la otra roja **no es media pieza: es una pieza que no está**. +## ⛔ Si una decisión DESBLOQUEA una pieza, el prompt sale EN EL MISMO TURNO + +*(Xavier, 2026-08-18.)* No se espera a que lo pidan. Una decisión tomada y una pieza desbloqueada +**es un encargo listo**, y dejarlo para el turno siguiente le cuesta al usuario un mensaje entero +para decir *«adelante»* — que es tiempo suyo gastado en darle permiso a algo que ya había aprobado. + +⭐ **La señal de que lo estás haciendo mal es literal y se busca en tu propio texto:** si el turno +termina con **«dime y te lo escribo»**, **«cuando quieras te lo preparo»** o cualquier variante, es +que **ya deberías haberlo escrito**. *(Cicatriz del mismo día: la orquestadora cerró así el turno +inmediatamente anterior a que Xavier pidiera este raíl — la decisión estaba tomada, la pieza +desbloqueada y el encargo sin escribir.)* + +**Las dos excepciones, y solo esas dos:** +- **Desbloquea VARIAS piezas** ⇒ se dice cuáles, se recomienda una **y se escribe la recomendada**. + No se pregunta cuál antes de escribir ninguna. +- **La pieza necesita un gesto que solo puede hacer el usuario** (firmar, generar una clave, + conectarse por otra red) ⇒ el prompt se escribe **igual**, con ese gesto marcado como suyo y el + hueco señalado. Un encargo al que le falta un dato del usuario sigue siendo un encargo. + +⇒ Es `feedback-ejecutar-no-anunciar` un piso más arriba: **la tool call en el +mismo turno** vale también para el entregable, y el entregable de la orquestadora **es el prompt**. + +## Qué puede hacer directamente (sin sub-sesión) + +Cambios menores, seguros y reversibles; consultas de solo lectura; documentación, memoria y +backlog. **La lista concreta de lo que eso significa en tu frente está en su apéndice** — depende +de qué máquinas hay y de qué se puede permitir perder. + +> ⛔ **PERO NO mientras una sesión esté corriendo sobre esos mismos ficheros.** Mientras una +> sub-sesión está viva, **los docs de su alcance son SUYOS**: su `backlog.md`, su `AVISOS.md`, su +> `bitacora.md`. La orquestadora escribe **antes de lanzarla o después de que entregue** — nunca +> durante. +> +> *(Cicatriz 2026-08-01: la orquestadora avisó por escrito de que «dos sesiones editando el mismo +> backlog es como se pierde texto»… y acto seguido metió una ficha y una corrección en los ficheros +> que una sesión viva estaba editando. Sobrevivieron **por suerte** —la herramienta llegó a avisar de +> que el fichero había cambiado bajo sus pies—, y quedaron **sin commitear y mezcladas** con el +> trabajo ajeno.)* +> +> **Los dos daños, y el segundo es peor que perder el texto:** +> · La sesión puede tener en memoria una copia **anterior** y escribir encima ⇒ el cambio desaparece +> sin que nadie lo note. +> · Y aunque sobreviva, **aparece en el diff de la sesión como si fuera suyo** — o alguien lo +> revierte por no reconocerlo. +> +> **Si el cambio no puede esperar**: no lo escribas — **mándaselo a la sesión** para que lo integre +> ella, que es quien tiene el fichero. Y si ya lo escribiste, **dilo enseguida y enumera exactamente +> qué tocaste**, para que su entrega se pueda reconciliar. + +## Qué delega siempre a una sub-sesión + +- Cualquier tarea que implique múltiples pasos en la infraestructura. +- Análisis de compatibilidad o exploración de estado desconocido. +- Instalaciones o configuraciones en servidores/nodos. +- Cambios en Kubernetes que afecten a workloads en producción. +