docs(metodo): máster 2026-08-29 — canal en §9, capas de lectura y unidad en tokens (§7)

Re-estampado de la copia vendorizada. Cambios del máster:
- §9: los principios de la comunicación entre sesiones.
- §1: la juntura entre dos sujetos, el testigo sin fuente nombrada, y que un
  encuadre falso recluta los datos que lo contradicen.
- §7: capas de ARRANQUE y de CONSULTA (la bitácora sale del ritual), la forma
  del aviso, y que la unidad de medida del corpus es el TOKEN, no la línea.
- Entrega/Git: el push es un acto de ÁMBITO.

Cero raíles nuevos. Sólo se toca .metodo/ — el corpus de este repo no.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-08-29 09:47:07 +02:00
parent 6031e9b7ae
commit fc4f0d2a1c
4 changed files with 184 additions and 5 deletions

View File

@ -1,2 +1,2 @@
61c934c67aeb3aefad53af06b3553738fa4216c04ad8045bdfa8b03f50d435cf metodo.md 605a9d2d216951c3dffd57b7f12c007b435a90b4b5bd515826a66a70e98f68f6 metodo.md
37441b923d907539399231a604b392c180b0baca261fcd8a0abf5a3979be9a81 bin/metodo 3b35cfedfe36441d5c2b9b8e543657119a76daaebf6b317bcc4918b2cb7ca9b7 bin/metodo

View File

@ -1,5 +1,5 @@
# Copia vendorizada del Método (raíl C11). Gestionada por 'metodo init/update'. # Copia vendorizada del Método (raíl C11). Gestionada por 'metodo init/update'.
master: metodo master: metodo
version: 2026-08-28 version: 2026-08-29
estado: vendored estado: vendored
adopted_commit: 6a10eab342a477846ab5f3e67f8ab17169f12807 adopted_commit: 6a10eab342a477846ab5f3e67f8ab17169f12807

View File

@ -291,7 +291,7 @@ check_commits() {
# ⛔ Lo que NO se hizo: mover `adopted_commit` hacia delante para callarlo. Eso es editar la # ⛔ Lo que NO se hizo: mover `adopted_commit` hacia delante para callarlo. Eso es editar la
# declaración hasta que la alerta calle (§1), y además perdona todo lo que haya en medio. # declaración hasta que la alerta calle (§1), y además perdona todo lo que haya en medio.
while IFS= read -r s; do while IFS= read -r s; do
printf '%s' "$s" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|semaforo)(\(.+\))?!?: .' \ printf '%s' "$s" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo)(\(.+\))?!?: .' \
|| { bad "commit no-Conventional: \"$s\" (C25)"; bad_c=$((bad_c+1)); } || { bad "commit no-Conventional: \"$s\" (C25)"; bad_c=$((bad_c+1)); }
done < <(git -C "$ROOT" log --format=%s $range 2>/dev/null) done < <(git -C "$ROOT" log --format=%s $range 2>/dev/null)
[ "$bad_c" -eq 0 ] && ok "los ${n} commit(s) desde la adopción siguen Conventional" [ "$bad_c" -eq 0 ] && ok "los ${n} commit(s) desde la adopción siguen Conventional"

View File

@ -4,7 +4,7 @@ Principios que valen para **cualquier** sesión (exploración, ejecución, despl
incidente, orquestación) y para cualquier backlog. Los workflows concretos referencian este incidente, orquestación) y para cualquier backlog. Los workflows concretos referencian este
doc en vez de repetirlo. No son teoría: cada uno lleva el caso real que lo enseñó. doc en vez de repetirlo. No son teoría: cada uno lleva el caso real que lo enseñó.
> **Versión 2026-08-28.** Documento **autocontenido**: es lo que se vendoriza, byte a byte, a cada > **Versión 2026-08-29.** Documento **autocontenido**: es lo que se vendoriza, byte a byte, a cada
> repo (no lleva enlaces a rutas de un árbol concreto, para que funcione clonado en solitario). > repo (no lleva enlaces a rutas de un árbol concreto, para que funcione clonado en solitario).
> Cada regla lleva su **cicatriz** (meta-principio: un raíl se escribe con el incidente que lo > Cada regla lleva su **cicatriz** (meta-principio: un raíl se escribe con el incidente que lo
> enseñó, no a priori). Procedencia, fuerza (nº de repos) y partición linter/juicio: fichero > enseñó, no a priori). Procedencia, fuerza (nº de repos) y partición linter/juicio: fichero
@ -597,6 +597,50 @@ sobrevivirla**. Y para probarlo no basta con razonar que ya no puede pasar: hay
ponerse en el estado roto** y ver que se recupera — es lo que hizo el arreglo del `ETag`, y por eso ponerse en el estado roto** y ver que se recupera — es lo que hizo el arreglo del `ETag`, y por eso
se sabe que sirve. se sabe que sirve.
⛔ **UN HECHO MEDIDO SOBRE UN COMPONENTE, MÁS UN SUPUESTO NO MEDIDO SOBRE OTRO, PRODUCE UNA
CONCLUSIÓN FALSA CON ASPECTO DE MEDIDA.** Es el fallo de la **juntura**, y hoy no lo caza ningún otro
raíl: `§5` dice *no inventes lo no medido* y arriba está *verifica el resultado, no la intención*
pero aquí **nadie inventa nada y todo lo afirmado está medido**. Lo que falla es **unirlo**.
*(Cicatriz 2026-08-28, y es la única del día que llegó a mover el orden de trabajo del usuario: un
aviso reclamaba un gesto urgente sobre la BIOS de un servidor —«la carga está armada»— y desplazó
cuatro asuntos. Un frente había medido **la conducta del SERVICIO** —un host declarado se sirve sin
menú, y el arranque por red instala solo a los 30 s— **y era cierto**. Nadie midió la **precondición**,
que es de **otro sujeto**: el orden de arranque de la **MÁQUINA**. Lo refutó el usuario en una frase:
para arrancar por red **hay que pulsar una tecla**; el disco ya era el primero. La conclusión
compuesta había viajado con fecha, contra-medidas y hasta un `User-Agent` —**todos los signos
externos de una medida**— y **tres registros la aceptaron sin pedirle la precondición**.)*
**Regla**: cuando una conclusión **cruza dos sujetos** —un servicio y una máquina, un repo y un
cluster, un motor y el hierro que lo arranca—, **cada sujeto necesita SU PROPIA medida**. Heredar la
solidez de uno para el otro es **cómo se fabrica una alarma falsa con pinta de dato**.
⇒ ⭐ **Y su reverso, que es el mismo error con el signo cambiado: CORREGIR DE MÁS.** Pasar de *«la
bomba está armada»* a *«aquí no hay nada»* vuelve a tomar por propiedad **del mecanismo** lo que era
propiedad de **una máquina concreta**: que el disco arranque primero es cierto **de esos servidores**,
no del sistema — el orden de arranque **se pone a mano, por máquina**. ⇒ Al refutar, la salida no es
*«refutado»* a secas: es **«precondición identificada, compruébese por máquina»**. *(Lo señalaron dos
frentes por separado, y uno de ellos ya se había pasado de frenada al corregir.)*
⛔ **UN TESTIGO SIN FUENTE NOMBRADA NO ES VERIFICABLE AUNQUE SEA CIERTO — y lo caza quien intenta
REPRODUCIRLO, no quien duda de él.** El fichero, el endpoint o el comando exacto va **DENTRO del
testigo**, no en la cabeza de quien lo midió. *(Dos frentes independientes el 2026-08-28, con casos
distintos. Uno: dos sesiones afirmaban cosas **opuestas** sobre «el log del motor» — y no era un
objeto, eran **dos**, uno por stdout **sin `User-Agent`** y otro dentro del mismo pod en formato
combinado; **ninguna se equivocaba sobre su fuente, faltaba nombrarla**, y lo destapó que una
intentara reproducir el testigo de la otra y no pudiera.)*
⇒ ⭐ Y el patrón que lo generaliza, con **cuatro instancias en tres frentes el mismo día**, todas de
la misma forma: **el instrumento no decía de qué estaba hablando.** El log no decía **quién**; un
`uptime` no decía **cuándo** —se leyó una máquina catorce minutos antes de que terminara su
reinstalación y su «estado estable» eran dos días de otra cosa—; un `push` no dice **de quién** es lo
que publica; y un listado de sesiones no dice **qué rol** tiene cada una. **Ninguna fue un error de
medida**: las cuatro son **un dato bueno contestando una pregunta que no era la suya.**
**Y un ENCUADRE FALSO no sobrevive a los datos que lo contradicen: LOS RECLUTA.** No se cae solo
cuando aparece la evidencia en contra — la absorbe como confirmación, porque **los mismos bytes dan
veredicto opuesto según una precondición que nadie ha medido**. *(Cicatriz 2026-08-28: los dos hechos
que más deberían haber tumbado el aviso de la BIOS **se leyeron como que lo confirmaban**.)*
⇒ Por eso, cuando un encuadre cae, **corregir la frase que lo dijo NO es corregirlo: hay que CENSAR
dónde ha viajado** — y **empezando por los TÍTULOS**, que es lo único que enseña un listado compacto
y la superficie donde los encuadres caídos se acumulan.
## 2. El dato crudo, no el cocinado ## 2. El dato crudo, no el cocinado
El backend **mide y traduce a atributos**; el consumidor (UI, componente, otro servicio) El backend **mide y traduce a atributos**; el consumidor (UI, componente, otro servicio)
@ -969,6 +1013,64 @@ comportamiento → cambia el docstring **en el mismo commit**. Un doc que miente
desactualizado: **ES el bug**, porque es lo que el llamante lee **en vez** de leer el código, y no desactualizado: **ES el bug**, porque es lo que el llamante lee **en vez** de leer el código, y no
hay ningún gate detrás que lo desmienta. hay ningún gate detrás que lo desmienta.
**Y LAS CUATRO CAPAS NO SE LEEN IGUAL: hay capas de ARRANQUE y capas de CONSULTA.** El corpus no
crece porque se escriba de más —crece **porque funciona**— pero **se lee entero cada vez, y eso sí es
un defecto**. *(Medido 2026-08-29: arrancar una sesión de un frente maduro cuesta **1,40 MB ≈ 400 k
tokens** antes de hacer nada —`CLAUDE.md` raíz + la constitución + su corpus—, o sea **media ventana
de contexto gastada en leer**. Y ahí está la causa de que las sesiones se agoten y haya que
relevarlas: **el coste de arranque se paga en la moneda con la que se trabaja**.)*
**El reparto, y sale de una medida, no de una intuición**:
- **ARRANQUE**`AVISOS.md` **primero**, luego `decisiones.md` y `backlog.md`, más el `CLAUDE.md`
del repo. Es lo que dice **qué muerde hoy**.
- **CONSULTA**`bitacora.md` **por su índice**, y se abre la entrada que haga falta. ⛔ **No se lee
entera al arrancar**: es *append-only* y es historia, su función es **consultarse**.
- **NI UNA NI OTRA** — los **entregables** (`pos-anexo-x`, `pcte`, `enmiendas`…). Se sostienen solos
a propósito, así que **por diseño no cuentan nada del estado interno**: para ponerse al día no
sirven; para entregar, son el producto.
**El testigo de que el reparto es correcto, y es una medida real**: una sesión limpia reconstruyó
un frente entero —fase, cifras, las trece familias, las decisiones vigentes, las trampas y los
solapes— leyendo **el 28 % del corpus**, con la bitácora **sólo por el índice y sus dos últimas
entradas**, y **sin abrir** el censo de 1.098 líneas ni los mapeos. En ese frente la bitácora es el
**79 %** del peso. ⇒ **Sacarla del arranque quita cuatro quintos del coste sin perder nada.**
⚠️ Y lo que ese mismo careo enseñó del otro lado, que es lo que hay que arreglar escribiendo MÁS y
no menos: **lo que peor está escrito no es lo técnico, es lo OPERATIVO.** El corpus documentaba
magníficamente *qué se decidió y por qué falló*, y no decía **cómo se trabaja un martes por la
mañana**. *«Un sucesor no se atasca en una decisión de diseño; se atasca en no saber si teclear
`ansible-playbook` o `git push`.»*
⛔ **Un AVISO es una BANDERA: si no cabe en una pantalla, no es una bandera — es un documento
disfrazado.** La primera línea lleva **qué muerde y a quién**; el detalle va debajo, y el relato a la
bitácora. *(Cicatriz 2026-08-29: el `AVISOS.md` de un frente activo tenía **1.905 caracteres de
media por línea** y una de **8.196** — y es **el fichero que se lee primero**.)*
⇒ Y no es sólo volumen: **el título en negrita de un aviso es la superficie que acumula encuadres
caídos**, porque se escribe para que muerda, porque un listado compacto **es lo único que enseña**, y
porque corregir el cuerpo **se siente** como haber corregido el aviso. Un aviso ya llegó a tener el
título equivocado **dos veces el mismo día**, con el cuerpo corregido las dos. ⇒ **Ante un encuadre
caído, el título se censa PRIMERO.**
⇒ ⭐ Y el barrido que nadie corre y que sale gratis: **censar qué avisos citan un ítem YA CERRADO.**
*(En un solo frente había **cuatro** afirmando bloqueos sobre trabajo cerrado la semana anterior —y
el propio corpus tenía escrito el patrón, aplicado a un fichero ajeno y nunca a sí mismo.)*
⇒ ⭐ **Y la forma general del hallazgo, que es transferible a cualquier frente**: *un corpus documenta
bien **lo que costó decidir** y mal **lo que nunca costó nada** — porque el ciclo de trabajo **no se
decidió: se fue quedando**. **Nadie escribe lo que hace todos los días.*** Y es exactamente lo que un
relevo no transmite y lo que un sucesor necesita **en los primeros diez minutos**. ⇒ El corpus de un
frente lleva, escrito y al día, **cómo se trabaja hoy**: dónde se edita, cómo se aplica, cómo se
sabe en treinta segundos en qué estado está el banco, y **qué está publicado y qué no**.
**Y LA UNIDAD DE MEDIDA DEL CORPUS ES EL TOKEN, NO LA LÍNEA** *(Xavier, 2026-08-29)*. Contar
líneas **hace invisible el problema real**: una línea de **8.196 caracteres** y una de **70** cuentan
igual, y en los corpus de este árbol **eso no es una anomalía, es la norma** — un `AVISOS.md` con
**1.905 caracteres de media por línea**, un semáforo con **928** y filas de **9.004**, frente a la
constitución con **79**. ⇒ **Dos documentos con las mismas líneas pueden diferir en veinte veces lo
que cuesta leerlos.**
**Proxy práctico**: `wc -c` (bytes) y **dividir entre ~3,5** para castellano con markdown y emojis.
No hace falta un tokenizador: hace falta **dejar de contar líneas**.
⚠️ **Y esto invalida disparadores ya escritos**: cualquier umbral del corpus expresado en líneas
—*«el backlog llegó a 2.729 líneas»*— **mide otra cosa** que la que se quería medir, y por eso los
recortes hechos sobre ese criterio no cuadran con el alivio que producen. **Se re-expresan en
tokens.** *(Lo cazó Xavier al no cuadrarle una sesión de ordenación de documentación: recortaba
líneas y el coste no bajaba.)*
## 8. Fallo benigno explícito, nunca degradación silenciosa ## 8. Fallo benigno explícito, nunca degradación silenciosa
@ -1183,6 +1285,61 @@ a su orquestadora) en el momento, y una **discrepancia declarada al instante**.
acabar— es **procedimiento, no principio**: vive en la capa `workflows/`, como el resto de la acabar— es **procedimiento, no principio**: vive en la capa `workflows/`, como el resto de la
estructura de sesión.)* estructura de sesión.)*
**EL CANAL AVISA; EL CORPUS MANDA.** Preguntar y avisar, sí. **Un encargo nuevo o una decisión NO
viajan por aquí**: van por el usuario y **se escriben**. Una corrección o adenda a un encargo ya
aprobado sí, **diciendo de quién viene**. Y lo que cambie el trabajo **lo escribe en el corpus quien
lo recibe**. ⇒ **Un acuerdo que sólo existe en el canal no existe**: un mensaje muere con su sesión;
una línea del corpus sobrevive.
⚠️ Con **una excepción medida, y hay que nombrarla o el raíl se aplica mal**: en un **relevo**, el
canal no está repitiendo lo que el corpus dice — está entregando **lo único que el corpus no sabe
recoger** (callejones ya recorridos, una medida tomada *y por qué no vale*, la calibración del
puesto). ⇒ Ahí el deber es el inverso y es del que recibe: **fijar en el corpus lo que le llegó por
el canal, o el relevo sólo ha movido la deuda de sitio.**
⛔ **El ESTADO DE OTRO FRENTE se re-verifica antes de retransmitirlo — o se marca «según me dijeron
a las HH:MM».** Nunca se afirma en plano. *(Cicatriz 2026-08-28, y son **cuatro** el mismo día, en
tres frentes: «`E2.1` está bloqueado esperando `jon`» —falso—; «esas dos filas son de sesiones
muertas» —una era de una sesión **viva y escribiendo en ella**—; «tiene 5 commits sin empujar» —ya
estaban empujados—; y una alarma de hierro que **movió el orden de la cola del usuario**. **Los
cuatro iban en el bloque afirmativo, ninguno marcado como inferencia.**)*
⇒ ⭐ **El mecanismo, que es lo que hay que saberse**: en los cuatro, **la foto era correcta cuando se
tomó y llegó rancia sin envejecer visiblemente**. Un estado ajeno **no se pudre de forma legible**:
sigue pareciendo un hecho. Y **no se puede verificar desde dentro del frente propio** — por eso lo
declara cada cual y no lo reconstruye el que recibe.
⇒ Y la razón de que el canal lo empeore, que también es de diseño: **transporta rápido y sin la
fricción que obliga a citar la fuente**. Escribir en el corpus te obliga a poner ruta, fecha y
testigo; mandar un mensaje, no.
**El NOMBRE de una sesión es una DIRECCIÓN; el ROL es la REFERENCIA. No se mezclan.** Entre
sesiones se direcciona con **el nombre que imprime tu propio listado** —es lo único que entrega un
mensaje—; **hacia el usuario se habla de ROL y proyecto**, porque los nombres **en su pantalla no
existen**. *(Cicatriz 2026-08-28: la superadmin informó todo el día citando nombres de sesión, todos
correctos, hasta que él dijo «yo no veo eso». Es `§1` —**la herramienta de diagnóstico no ve lo
mismo que el consumidor**— aplicada a hablar con quien te dirige: **darle el identificador que TÚ
usas y él no puede resolver es información inútil con aspecto de precisión**, y es peor que
omitirla.)*
⇒ Y el rol tiene lo que al nombre le falta: **no rota**. Un nombre caduca en cada reinicio y **miente
de tres formas** —la sesión murió, se renombró, o **nunca fue una dirección** (una sesión no sabe con
qué nombre la ven las demás)—. ⇒ **El único testigo válido de que una sesión murió es «escribí y no
contestó»**, jamás «no la veo en el listado».
⛔ **Nada de LAVADO DE PERMISOS: si a una sesión le deniegan algo, no se lo pide a otra — lo devuelve
a quien la dirige.** No es doctrina de esta casa: es un modo de fallo **con nombre propio en el
contrato de la propia herramienta** (*cross-session permission laundering*). Un permiso que se
consigue rodeando a quien lo negó no es un permiso, y el canal hace ese rodeo trivial.
**«Enviado con éxito» dice que el mensaje ENTRÓ EN LA COLA, no que alguien lo haya LEÍDO** — y su
mitad simétrica, que es la que muerde: **el emisor tampoco sabe si su mensaje se CRUZÓ con el del
otro**, así que **la ausencia de acuse puede ser un cruce y no un silencio**. *(Cicatriz 2026-08-28:
la superadmin mandó un encargo, recibió a continuación un «sigo esperando el encargo», concluyó que
no había llegado y lo reenvió. **Sí había llegado**: entró mientras la otra sesión ejecutaba el turno
en el que escribía su aviso. Lo corrigió la propia destinataria, con su transcripción delante, y
**evitó que una hipótesis no demostrada —«una sesión parada no drena su cola»— entrara en esta
constitución**. Esa hipótesis **sigue sin medir y por eso no se escribe aquí**.)*
⇒ Regla de bolsillo: **antes de reenviar, pregunta si lo que tienes es un silencio o un cruce.** Y
si reenvías, **dilo** —*«ya te lo mandé, va otra vez»*— para que quien lo reciba dos veces sepa que
es el mismo y no un encargo nuevo.
## 10. Lo que "funciona por casualidad" está roto ## 10. Lo que "funciona por casualidad" está roto
Construir bien la capa de encima destapa lo de debajo. Al hacerlo, **arréglalo y anótalo**, no Construir bien la capa de encima destapa lo de debajo. Al hacerlo, **arréglalo y anótalo**, no
@ -1254,6 +1411,28 @@ fuera, repetida en varios repos. Aquí se consolida.
- **Commits Conventional** (`feat/fix/docs/ci` + scope); el `doc:` registra el **porqué**. - **Commits Conventional** (`feat/fix/docs/ci` + scope); el `doc:` registra el **porqué**.
- **Working-tree compartido**: `git add` con ruta explícita (**nunca `-A`**), `git pull` antes de - **Working-tree compartido**: `git add` con ruta explícita (**nunca `-A`**), `git pull` antes de
deploy y antes de commitear docs, una tarea = una sesión/worktree. deploy y antes de commitear docs, una tarea = una sesión/worktree.
- ⛔ **QUIÉN EMPUJA: el `push` es un acto de ÁMBITO, no un acto sobre tus commits** *(Xavier,
2026-08-29)*. **Un `push` publica todo lo que hay entre el remoto y tu HEAD, lo haya puesto quien
lo haya puesto** — así que el permiso no se decide por quién escribió el commit, sino por **de
quién es el repo**:
- **La ORQUESTADORA empuja en SU ámbito.** Es la única que puede: es quien ve si la tarea
**reencuadra el backlog** o cambia algo más, y **empuja después de la medición**, no antes.
- **La EJECUCIÓN no empuja: se lo dice a su orquestadora.** Commitea y lo declara; publicar es
de arriba.
- **La SUPERADMIN tiene su propio ámbito —el Método— y ahí se comporta como una orquestadora
más.** Fuera de él: si ve algo sin empujar, **avisa a la orquestadora de ese frente**; si no
está viva, **pregunta a Xavier**, y es él quien autoriza a empujarlo todo.
**Testigo obligatorio antes de cualquier `push` en repo compartido**: `git log @{u}..HEAD` — y
que **todo lo que vas a subir sea de tu ámbito**. Si arrastras algo ajeno, **dilo en el mensaje**
en vez de callarlo: eso es lo que convierte un arrastre en un robo silencioso.
*(Cicatriz 2026-08-29, y la cometió la superadmin **el mismo día que escribió este raíl**: al
re-estampar el Método en nueve repos, uno de los `push` arrastró un commit ajeno que esperaba una
decisión. Tenía **tres avisos delante** —el de otra orquestadora esa mañana, su propia fila del
semáforo, y su palabra dada— y **corrió la puerta en su repo pero no en los ajenos**: aplicó el
control donde no hacía falta y lo omitió donde sí. **Un raíl recién escrito no protege a quien
acaba de escribirlo.**)*
⚠️ **Y no se arregla con `push --force`**: sobre un repo que tocan varios frentes, deshacer algo ya
publicado es peor que el daño. Se avisa a su dueño y **lo decide él**.
- La **representación en disco es parte del artefacto**: cuando un hash o un runtime consume el - La **representación en disco es parte del artefacto**: cuando un hash o un runtime consume el
checkout, se fija con el repo — **eol** por `.gitattributes` y **bit de ejecución** — o el testigo checkout, se fija con el repo — **eol** por `.gitattributes` y **bit de ejecución** — o el testigo
mide el checkout, no el contenido (una DERIVA falsa en un clone sin tocar entrena a ignorar el mide el checkout, no el contenido (una DERIVA falsa en un clone sin tocar entrena a ignorar el