chore(metodo): EN VUELO entero, gate que ata, deploy/doc, y git no distingue sesiones

Los cinco campos del bloque EN VUELO viajan ahora con el nucleo (antes solo
viajaba el porque). Vocabulario C25 con deploy y doc: 24 de 25 falsos positivos
de un repo los escribia un robot, uno por despliegue. Y el limite del terreno:
en este arbol git no distingue sesiones, asi que lo unico que atribuye es el
mensaje.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-08-30 17:26:03 +02:00
parent 81a215dc74
commit 5922c7f5db
4 changed files with 97 additions and 6 deletions

View File

@ -1,7 +1,7 @@
4ee74ad69f1adceab2a56d3814bf96d9bbc3a42b285795c339585d3bf51a616e metodo.md 343e8a8b741931d28a9aa09a1f4cc3b7e92f20e825fe49d511bde3e3641ca22c metodo.md
17d070adba8cf56a50df6cd50e681d1b8f391c9b9b1a6eff16812322f36a1a22 bin/metodo 7a8d29ab793674397b50489a01825e469b52593a12bc24c4368bcfc469d20559 bin/metodo
f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md
cc241bbecf9647c747b8525b3a6b527455cd50ca0312caa44bc3544342c8ac41 workflows/comunicacion-entre-sesiones.md cc241bbecf9647c747b8525b3a6b527455cd50ca0312caa44bc3544342c8ac41 workflows/comunicacion-entre-sesiones.md
2b9037f6dd57b5598c70a676cb728556654f05d1c5b024e7b716864659f7b884 workflows/sesion-ejecucion.md 2b9037f6dd57b5598c70a676cb728556654f05d1c5b024e7b716864659f7b884 workflows/sesion-ejecucion.md
f35dda490674d37da4a8f9412a2463ea37c42c02af4f63d642e06c8a3f9cfc90 workflows/sesion-exploracion.md f35dda490674d37da4a8f9412a2463ea37c42c02af4f63d642e06c8a3f9cfc90 workflows/sesion-exploracion.md
36e46215a205d78c4ce99896d1c163634e9a72993db58c6e41f92f4792b791e1 workflows/sesion-orquestadora.md b96e9bba7363e58361c797839a6cad443575b6c74efe66b8bc046b60f76b8a17 workflows/sesion-orquestadora.md

View File

@ -84,6 +84,24 @@ info() { printf ' \033[36minfo\033[0m %s\n' "$*"; } # censo, NO veredicto: no
# porque el glob `workflows/*.md` no recursa — una protección implícita, o sea algo que # porque el glob `workflows/*.md` no recursa — una protección implícita, o sea algo que
# funciona por casualidad. Si alguien cambia ese glob, los apéndices empiezan a viajar a # funciona por casualidad. Si alguien cambia ese glob, los apéndices empiezan a viajar a
# 27 repos en silencio. Este check lo dice. # 27 repos en silencio. Este check lo dice.
# ⛔ Gate del semáforo (2026-08-30). Es DECIDIBLE SIN ADIVINAR —está el marcador o no está—
# y por eso se ata. Su hermana, «ninguna sesión se cierra con fila viva», NO se ata a
# propósito: el fichero no puede saber si el dueño respira, y un gate que lo adivinara daría
# rojos crónicos, que es la ceguera que este mismo Método prohíbe. Queda como criterio
# humano, y se dice — o alguien lo mecanizará «por completitud» y creará el rojo permanente.
check_semaforo_en_vuelo() {
local f="$ROOT/workflows/sesiones-activas.md"
[ -f "$f" ] || return 0 # sólo aplica donde vive el semáforo (el árbol)
hdr "filas vivas con bloque EN VUELO"
local vivas sin
vivas=$(grep -c "^| 2026.*🟢" "$f" 2>/dev/null || echo 0)
sin=$(grep "^| 2026.*🟢" "$f" 2>/dev/null | grep -vc "EN VUELO" || echo 0)
if [ "$sin" -gt 0 ]; then
bad "$sin de $vivas fila(s) 🟢 sin bloque EN VUELO — una fila viva sin estado en vuelo no releva a nadie"
else
ok "$vivas fila(s) 🟢, todas con EN VUELO"
fi
}
check_apendices_no_viajan() { check_apendices_no_viajan() {
hdr "los apéndices NO viajan (son de proyecto, no de método)" hdr "los apéndices NO viajan (son de proyecto, no de método)"
local d="$ROOT/.metodo/workflows/apendices" n local d="$ROOT/.metodo/workflows/apendices" n
@ -369,7 +387,7 @@ check_commits() {
local excf="$ROOT/.metodo/EXCEPCIONES" exc_c=0 sha subj local excf="$ROOT/.metodo/EXCEPCIONES" exc_c=0 sha subj
while IFS=$'\t' read -r sha subj; do while IFS=$'\t' read -r sha subj; do
[ -n "$sha" ] || continue [ -n "$sha" ] || continue
printf '%s' "$subj" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo|avisos|bitacora|bitácora|decisiones|backlog|corpus|evidencia|banco|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo)(\(.+\))?!?: .' && continue printf '%s' "$subj" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|deploy|doc|semaforo|semáforo|avisos|semaforo|semáforo|avisos|bitacora|bitácora|decisiones|backlog|corpus|evidencia|banco|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo)(\(.+\))?!?: .' && continue
if [ -f "$excf" ] && grep -qE "^C25[[:space:]]+${sha}([[:space:]]|$)" "$excf"; then if [ -f "$excf" ] && grep -qE "^C25[[:space:]]+${sha}([[:space:]]|$)" "$excf"; then
exc_c=$((exc_c+1)); continue exc_c=$((exc_c+1)); continue
fi fi
@ -908,6 +926,7 @@ cmd_check() {
printf 'metodo check — %s\n' "$ROOT" printf 'metodo check — %s\n' "$ROOT"
check_drift check_drift
check_apendices_no_viajan check_apendices_no_viajan
check_semaforo_en_vuelo
check_ids check_ids
check_headings check_headings
check_links check_links

View File

@ -877,6 +877,18 @@ enseñaba una capa contra una decisión del usuario, y cede el sujeto. Se arregl
avisa. El que lo reportó se queda con su aviso abierto, persiguiendo lo que ya estaba resuelto.)* avisa. El que lo reportó se queda con su aviso abierto, persiguiendo lo que ya estaba resuelto.)*
⇒ La entrega termina en **el que reportó**, no en el `push`. ⇒ La entrega termina en **el que reportó**, no en el `push`.
**(c) UN AVISO QUE SE REPITE EN UN RELEVO SE RE-MIDE, NO SE REENVÍA.** El relevo es **justo el momento
en que el estado cambió y quien informa no estaba delante**: entre que avisaste y llega el sucesor,
alguien pudo arreglarlo. Reenviar el aviso viejo **manda a la nueva a perseguir algo ya hecho** —y
peor, **con la autoridad de venir de quien lo descubrió**.
*(Cicatriz 2026-08-30, **dos veces el mismo día y en direcciones opuestas**: un frente avisa al relevo
de que cierta decisión seguía apoyada en una premisa falsa… **y ya estaba corregida y sustituida**,
por él mismo, la víspera. Y la superadmin repite ese mismo aviso al día siguiente **sin volver a
mirar**. Las dos veces lo cazó la sesión nueva, que era la única que **no daba el estado por sabido**.)*
⇒ ⭐ **Y las tres de este bloque son la misma familia con el fallo movido de sitio**: **(a)** falla
**a quién** · **(b)** falla **que no se dijo** · **(c)** falla **cuándo**. En las tres **el dato es
correcto** — lo que está mal es **a quién, o desde cuándo, se refiere**.
**La familia, que es lo que hace que se retengan las dos**: son primas de las cicatrices del **La familia, que es lo que hace que se retengan las dos**: son primas de las cicatrices del
instrumento sin sujeto —el log sin *quién*, el `uptime` sin *cuándo*, el `push` sin *de quién*—, pero instrumento sin sujeto —el log sin *quién*, el `uptime` sin *cuándo*, el `push` sin *de quién*—, pero
**con el sujeto movido de sitio**. Allí el dato no decía de qué hablaba; aquí **el dato es correcto y **con el sujeto movido de sitio**. Allí el dato no decía de qué hablaba; aquí **el dato es correcto y
@ -1628,9 +1640,32 @@ pega tal cual.
ilegible por costumbre, y (c) ésta: **enrojece bien y no ata nada**. ⇒ **Un gate sólo ata si rompe ilegible por costumbre, y (c) ésta: **enrojece bien y no ata nada**. ⇒ **Un gate sólo ata si rompe
el flujo por sí mismo** —código de salida, comando que no continúa—, nunca delegando el veredicto el flujo por sí mismo** —código de salida, comando que no continúa—, nunca delegando el veredicto
en quien lo lee. en quien lo lee.
⛔⛔ **CUARTA CARA, y es la que más engaña: UNA PUERTA CUYO RESULTADO SE LEE DESPUÉS DE ACTUAR NO ES
UNA PUERTA — ES UN REGISTRO DE LO QUE YA PASÓ.** Aquí el gate **calcula bien, enrojece bien y el
operador lo lee**… y no sirve, porque **no hubo ningún instante en el que pudiera parar**.
*(Cicatriz 2026-08-30, y con la puerta puesta: una sesión encadena la comprobación y el
`git commit` **en la misma orden**. Sale `4 filas tocadas · 2 de 4 mías` —debía parar— pero para
cuando lee la salida **el commit ya está hecho**, y publica el bloque a medio escribir de otra
sesión bajo un mensaje que hablaba de otra cosa.)*
⇒ **La forma no es «correr la puerta»: es que la ACCIÓN sea un paso DISTINTO Y POSTERIOR a leerla.**
Un `&&` entre la comprobación y el acto **convierte el gate en telemetría**. Si van en la misma
orden, la comprobación **tiene que abortar ella misma** (cara *(c)*) — leerla no basta.
⇒ Y el criterio para saber cuál estás escribiendo, que es de la sesión que lo pagó: **si el ⇒ Y el criterio para saber cuál estás escribiendo, que es de la sesión que lo pagó: **si el
cumplimiento depende de la atención de quien tiene prisa, no has escrito un raíl: has escrito un cumplimiento depende de la atención de quien tiene prisa, no has escrito un raíl: has escrito un
consejo.** Un raíl se cumple **aunque no te acuerdes de él**. consejo.** Un raíl se cumple **aunque no te acuerdes de él**.
⇒ ⭐ **Y la regla NO es «átalo todo»: es ÁTALO SI ES DECIDIBLE SIN ADIVINAR — y si no lo es, DI POR
QUÉ NO LO HAS ATADO.** Un raíl que explica **por qué no se mecaniza** es lo único que impide que el
siguiente lo mecanice mal *«por completitud»*.
*(Caso 2026-08-30, dos prescripciones hermanas y sólo una atable: **«una fila viva lleva bloque
`EN VUELO`»** es puramente sintáctico —está el marcador o no está—, así que **se ata** y pasa de
«acuérdate» a «no puedes empujar sin ponerlo». Su hermana, **«ninguna sesión se cierra con fila
viva»**, **NO se ata a propósito**: el fichero **no puede saber si el dueño respira** —medido:
`ListAgents` pasó de 13 sesiones a 6 en dos minutos, y una de 12 h apareció como recién
arrancada—, así que un gate que lo adivinara daría **rojos crónicos**, o sea la cara (b) de la
familia de arriba. Queda como **criterio humano, deliberadamente**.)*
**Y por eso se escribe el NO**: una prescripción sin gate y sin explicación se lee como un
descuido, y el siguiente que pase «lo arreglará» — creando justo el rojo permanente que este
párrafo prohíbe.
vez de `22/22`. **Un gate que se pone rojo por causa ajena entrena a desmentirlo**, así que cuando vez de `22/22`. **Un gate que se pone rojo por causa ajena entrena a desmentirlo**, así que cuando
salga descuadrado la pregunta no es *«¿qué he hecho mal?»* sino **«¿de quién es lo demás?»** — y la salga descuadrado la pregunta no es *«¿qué he hecho mal?»* sino **«¿de quién es lo demás?»** — y la
respuesta es un mensaje, no un `commit`. respuesta es un mensaje, no un `commit`.

View File

@ -47,8 +47,34 @@ se tiene.** Todo momento tiene que ser un punto de relevo válido.
**Qué lo hace posible, y es lo único que hay que cumplir:** **Qué lo hace posible, y es lo único que hay que cumplir:**
1. **Una decisión del usuario se escribe ANTES de actuar sobre ella.** No después, no «al cerrar». 1. **Una decisión del usuario se escribe ANTES de actuar sobre ella.** No después, no «al cerrar».
Es el único campo que un sucesor **no puede reconstruir de ningún sitio**, y el que más caro sale. Es el único campo que un sucesor **no puede reconstruir de ningún sitio**, y el que más caro sale.
2. **Lo que está en vuelo vive fuera de la sesión** —qué debes, qué esperas, cuál es el hilo—, en el 2. **Lo que está EN VUELO vive fuera de la sesión.** Son **cuatro campos**, y son los cuatro que las
sitio que tu árbol use para arbitrar sesiones concurrentes. Se **reescribe**, no crece. capas del corpus **no** guardan:
EN VUELO (<fecha y hora>) · debo: <a quién, qué> · espero: <de quién, qué>
· hilo: <qué haces AHORA y por qué> · sin escribir: <nada | >
· gesto siguiente: <el comando o la acción física que toca, o «ninguno»>
- **debo** — lo que otro espera de ti y aún no has entregado.
- **espero** — de quién y qué. Si muere quien te lo debe, **esto es lo único que lo dice**.
- **hilo** — por qué haces justo esto. Es lo que un sucesor **no puede reconstruir del corpus**.
- ⭐ **sin escribir** — decisiones del usuario que aún **no están en `doc/`**. **Lo sano es
«nada»**; si tiene contenido, **es deuda y se paga antes que nada**.
- ⭐ **gesto siguiente****el comando o la acción física que toca**, o «ninguno». Medido:
*un sucesor no se atasca en una decisión difícil; se atasca en no saber si teclear un
comando o hacer `git push`.* Sin este campo, **«cerrada» y «cerrada pero falta empujar»
se leen igual**. *(Lo estrenó una orquestadora el día de estrenar el bloque.)*
**Se REESCRIBE, no crece**: es una foto, no un diario — el diario es la bitácora. Una línea
por campo.
**Dónde vive lo pone tu árbol, no este fichero**: si trabajas en un árbol multi-repo, va en
**tu fila del semáforo** (`repos/metodo/workflows/sesiones-activas.md`, ruta del árbol) —
*(si has clonado este repo suelto, esa ruta no existe: entonces vive donde tu repo arbitre
sesiones concurrentes, y si nunca hay dos a la vez, en el sitio que leas al arrancar)*.
⚠️ *(Esto se escribió el 2026-08-30 y **nació roto**: la mitad que **motiva** viajaba a los 27
repos y la que **instrumenta** —los cuatro campos— se quedó en el semáforo, que **no viaja**. Lo
cazó una orquestadora **el día de estrenarlo**, haciendo `grep` en su `.metodo/` y saliendo
vacío. ⇒ **Una mitad que comprueba que algo esté y otra que sabe qué es, sin que nadie las
junte**, es la forma de defecto más repetida de este árbol.)*
3. **Lo demás ya tiene capa**: decisión → `decisiones.md` · trabajo → `backlog.md` · trampa → 3. **Lo demás ya tiene capa**: decisión → `decisiones.md` · trabajo → `backlog.md` · trampa →
`AVISOS.md` · relato → `bitacora.md`. Si dudas de dónde va, **el sitio equivocado es tu cabeza**. `AVISOS.md` · relato → `bitacora.md`. Si dudas de dónde va, **el sitio equivocado es tu cabeza**.
@ -74,6 +100,17 @@ antecesora, aunque no solapen**: para ellas eres su nuevo interlocutor y **no ti
documentado siempre va por detrás de lo hecho ⇒ tenderá a leer **el último trabajo de su antecesora documentado siempre va por detrás de lo hecho ⇒ tenderá a leer **el último trabajo de su antecesora
como ajeno**. Si algo del repo te parece una intrusión, **pide el crudo antes de decirlo** (`R9`). como ajeno**. Si algo del repo te parece una intrusión, **pide el crudo antes de decirlo** (`R9`).
⇒ El disparador concreto de cada frente está en su apéndice. ⇒ El disparador concreto de cada frente está en su apéndice.
⛔ **Y un límite del terreno que cambia lo que puedes reconstruir: en un árbol donde todas las
sesiones commitean con la MISMA identidad de máquina, «quién hizo este commit» es INCONTESTABLE
desde `git`.** Un `--author` devuelve **a todo el mundo**. ⇒ **Lo único que atribuye es el MENSAJE**
—y el semáforo—, así que un commit ajeno bajo un mensaje que habla de otra cosa **no es un detalle
estético: borra la única atribución que existe**.
⇒ Y para ti, que llegas de relevo: **no puedes saber qué dejó tu antecesora salvo por lo que digan
los mensajes.** Si un protocolo te dice *«mira qué hizo la anterior»*, eso **sólo funciona si los
mensajes lo cuentan**. *(Medido 2026-08-30 por una sesión que fue a auditarse y se encontró con los
commits de las demás. Se salvó **porque escribe mensajes largos con el porqué** — no porque `git` la
distinguiera.)*
## Cómo arranca una sesión orquestadora nueva ## Cómo arranca una sesión orquestadora nueva
Cuando la sesión actual se agota de contexto, hay que abrir una nueva que retome Cuando la sesión actual se agota de contexto, hay que abrir una nueva que retome