From fc4f0d2a1cb6b48920dad2b947801de6f2715b8c Mon Sep 17 00:00:00 2001 From: sirxavor Date: Sat, 29 Aug 2026 09:47:07 +0200 Subject: [PATCH] =?UTF-8?q?docs(metodo):=20m=C3=A1ster=202026-08-29=20?= =?UTF-8?q?=E2=80=94=20canal=20en=20=C2=A79,=20capas=20de=20lectura=20y=20?= =?UTF-8?q?unidad=20en=20tokens=20(=C2=A77)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .metodo/CHECKSUMS | 4 +- .metodo/VERSION | 2 +- .metodo/bin/metodo | 2 +- .metodo/metodo.md | 181 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 184 insertions(+), 5 deletions(-) diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index 37d6a4a..919b3ee 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -1,2 +1,2 @@ -61c934c67aeb3aefad53af06b3553738fa4216c04ad8045bdfa8b03f50d435cf metodo.md -37441b923d907539399231a604b392c180b0baca261fcd8a0abf5a3979be9a81 bin/metodo +605a9d2d216951c3dffd57b7f12c007b435a90b4b5bd515826a66a70e98f68f6 metodo.md +3b35cfedfe36441d5c2b9b8e543657119a76daaebf6b317bcc4918b2cb7ca9b7 bin/metodo diff --git a/.metodo/VERSION b/.metodo/VERSION index 52b879a..3da77a2 100644 --- a/.metodo/VERSION +++ b/.metodo/VERSION @@ -1,5 +1,5 @@ # Copia vendorizada del Método (raíl C11). Gestionada por 'metodo init/update'. master: metodo -version: 2026-08-28 +version: 2026-08-29 estado: vendored adopted_commit: 6a10eab342a477846ab5f3e67f8ab17169f12807 diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index 2457c1f..038043a 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -291,7 +291,7 @@ check_commits() { # ⛔ 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. 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)); } 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" diff --git a/.metodo/metodo.md b/.metodo/metodo.md index c714767..4f5ed79 100644 --- a/.metodo/metodo.md +++ b/.metodo/metodo.md @@ -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 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). > 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 @@ -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 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 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 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 @@ -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 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 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é**. - **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. +- ⛔ **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 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