chore(metodo): reparto — familia E fundida en los siete filos

La numeracion estaba rota (un sexto antes de un tercero). Refundidos en una
lista de siete con sus cicatrices, y las TRES PUERTAS juntas en un sitio en
vez de explicadas en tres. 10.799 -> 8.001 caracteres.

Solo .metodo/ — byte a byte desde la matriz.

Sesion: superadmin

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-09-02 21:05:02 +02:00
parent 7d84835d22
commit 2587f85961
2 changed files with 76 additions and 107 deletions

View File

@ -1,4 +1,4 @@
19c7343a4ff899dcacfddeef6dbd1113829a3f8740e69bdc3ce0d8bb28850e6b metodo.md a5e9bb482951d163f0a26789c81dc6df0bc4abe49b7f074cc2f8861e9f4eedd8 metodo.md
6850fa105390147de7c7dc6db63c20e26be483a66eb3ce0c7eb618857df092c3 bin/metodo 6850fa105390147de7c7dc6db63c20e26be483a66eb3ce0c7eb618857df092c3 bin/metodo
f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md
cc241bbecf9647c747b8525b3a6b527455cd50ca0312caa44bc3544342c8ac41 workflows/comunicacion-entre-sesiones.md cc241bbecf9647c747b8525b3a6b527455cd50ca0312caa44bc3544342c8ac41 workflows/comunicacion-entre-sesiones.md

View File

@ -2213,123 +2213,92 @@ pega tal cual.
decisión, **publicarlo no la toma**: se empuja **diciéndolo** y la decisión sigue pendiente de su decisión, **publicarlo no la toma**: se empuja **diciéndolo** y la decisión sigue pendiente de su
dueño. Y **antes de usarlo se comprueba que la orquestadora no está viva** — *el único testigo dueño. Y **antes de usarlo se comprueba que la orquestadora no está viva** — *el único testigo
válido es «escribí y no contestó»*, jamás «no la veo en el listado». válido es «escribí y no contestó»*, jamás «no la veo en el listado».
⛔⛔ **Y HAY UN SEGUNDO AGUJERO, PEOR: EL ÍNDICE TAMBIÉN ES COMPARTIDO.** `git add <ruta>` **no ⛔⛔ **LOS SIETE FILOS DEL ÁRBOL COMPARTIDO.** *(Estaban escritos como «un segundo agujero», «un
desmonta lo que otra sesión ya dejó *staged***, así que tu commit se lleva **ficheros que ni cuarto», «un sexto», «un tercer filo»… **numerados por acumulación y contradiciéndose entre sí**;
nombraste ni tocaste** — con ruta explícita, sin `-A`, y haciendo todo bien. renumerados el 2026-09-02. Ninguno se ha quitado: cada uno es un modo de fallo distinto con su
*(Cicatriz 2026-08-30, y el sitio es lo que la hace útil: la superadmin commitea **dos** ficheros cicatriz.)*
nombrados uno a uno; entran **tres**. El tercero era el trabajo *staged* de otra sesión, que **① El ÍNDICE es compartido: `git add <ruta>` NO desmonta lo que otra sesión dejó *staged*.** Tu
**sobrevivió íntegro** pero quedó publicado **bajo un mensaje que hablaba de otra cosa** — y con commit se lleva **ficheros que ni nombraste ni tocaste**, con ruta explícita, sin `-A`, y haciendo
él se perdió **la explicación que esa sesión estaba escribiendo en su propio mensaje**, que era lo todo bien. *(2026-08-30: se commitean **dos** ficheros nombrados uno a uno; entran **tres**. El
valioso. ⭐ **Y el asunto de ese commit era, literalmente, «en este árbol git no distingue tercero era el trabajo *staged* de otra sesión, que sobrevivió íntegro pero quedó publicado **bajo
sesiones», con un cuerpo que decía que un commit ajeno bajo un mensaje ajeno borra la única un mensaje que hablaba de otra cosa**, perdiendo la explicación que esa sesión estaba escribiendo.
atribución que existe.** Lo cometió **mientras lo escribía**. Su propia puerta imprimió **El asunto de ese commit era, literalmente, «en este árbol git no distingue sesiones».** Lo
`ficheros=3` habiendo nombrado 2 — y no paró: cara (c) y cara (d) a la vez.)* cometió mientras lo escribía, con su propia puerta imprimiendo `ficheros=3` habiendo nombrado 2.)*
**El gesto que falta NO es «no uses `git add -A`»** —no se usó— **sino: si te llevaste algo **El gesto que falta NO es «no uses `-A`»** —no se usó— **sino: si te llevaste algo ajeno, DILO
ajeno, DILO EN EL MENSAJE.** Es lo único que devuelve la atribución cuando `git` no distingue EN EL MENSAJE.** Es lo único que devuelve la atribución, y cuesta una línea.
sesiones, y **cuesta una línea**. **② La ruta explícita NO protege si el cambio ajeno está en el MISMO fichero.** Protege contra
⇒ Y el sub-raíl operativo, **con su límite dicho, que es la mitad que faltaba**: `git status arrastrar **otros** ficheros; contra **dos sesiones escribiendo en uno solo** no distingue nada —
--porcelain` **ANTES de tu primer `git add`**. Si hay algo *staged* que no es tuyo, **no es tuyo el la ruta es la misma. *(2026-08-29: una ejecución paró antes de commitear al ver en el `diff` 21
índice**: o esperas, o lo declaras. ⛔ **Pero sólo ve lo que YA ESTABA cuando empezaste** — una líneas que no eran suyas.)*
escritura ajena que entra **después** de tu `add` **no la caza**, y hoy se usaba como si bastara. **`git status` NO VE LOS COMMITS SIN EMPUJAR.** Son **dos gestos y ninguno implica al otro**:
**La que cubre esa ventana es `git diff --cached --name-only` INMEDIATAMENTE antes de commitear**, `--porcelain` dice **qué me llevo DENTRO**; `git log origin/main..HEAD` dice **qué PUBLICO**.
leída por ojos y **no encadenada con `&&`** a lo que viene detrás. **Las dos no son redundantes: *(2026-08-31: una sesión corre la puerta del índice —limpia—, empuja **un fichero suyo** y publica
cubren ventanas distintas.** **tres commits ajenos** que esperaban entre el remoto y `HEAD`. Lo dio por hecho **porque veinte
**Y UN CUARTO, QUE ES DE OTRA COMPROBACIÓN: `git status` NO VE LOS COMMITS SIN EMPUJAR.** Son minutos antes estaba a cero**: un árbol compartido cambia por debajo entre dos pushes tuyos porque
**dos gestos distintos y ninguno implica al otro**`git status --porcelain` dice **qué me llevo el otro **está trabajando**, que es lo normal y no la excepción.)*
DENTRO del commit**; `git log origin/main..HEAD` dice **qué PUBLICO con él**. Correr el primero y **④ El índice compartido también te hace PERDER LO TUYO, con un mensaje que suena a «ya estaba».**
dar por hecho el segundo es publicar trabajo ajeno **con el índice limpio**. Un `commit` puede fallar con **«nothing to commit, working tree clean»** teniendo tu cambio en el
*(Cicatriz 2026-08-31: una sesión corre la puerta del índice —limpia— y empuja **un solo fichero índice: otra sesión lo vació entre tu `add` y tu `commit`. *(2026-09-01: el fichero seguía en disco
suyo**… publicando de paso **tres commits de otra sesión** que esperaban entre el remoto y `HEAD`. y `git status` lo daba *staged* medio minuto después.)* ⇒ ⭐ **Lo peligroso es la redacción**:
Su diagnóstico, que es el raíl: **lo dio por hecho porque veinte minutos antes estaba a cero** — y *«nothing to commit»* **se lee como «ya estaba hecho»**. Un `add` y un `commit` en órdenes
**un árbol compartido cambia por debajo entre dos pushes tuyos**, porque el otro **está trabajando**, separadas **no son atómicos aquí**, y **el `rc=0` de un commit que no commiteó nada también es
que es lo normal y no la excepción.)* cero** ⇒ verifica **después** del push.
⛔ **Y UN SEXTO, QUE ES EL ANTERIOR CON EL SIGNO CAMBIADO: EL ÍNDICE COMPARTIDO TAMBIÉN TE HACE **`--amend` REESCRIBE EL COMMIT DE OTRA SESIÓN** — y no es una operación local. El índice te hace
PERDER LO TUYO — Y TE LO DICE CON UN MENSAJE QUE SUENA A «YA ESTABA».** Un `git commit` puede fallar **arrastrar** lo ajeno; el `--amend`, **borrarlo y rehacerlo** con tu contenido dentro y su mensaje
con **«nothing to commit, working tree clean»** teniendo **tu cambio en el índice**: otra sesión lo fuera. *(2026-08-31: un `--amend --no-edit` reescribió el commit de otra sesión ya empujado. **Su
vació entre tu `add` y tu `commit`. único testigo fue un `push` rechazado por no-fast-forward** — o sea **un fallo que puede no llegar a
*(Cicatriz 2026-09-01: el fichero seguía en disco y `git status` lo daba como *staged* medio minuto producirse**; sin él, la reescritura se habría publicado.)* ⇒ **Sólo sobre un `HEAD` que has
después. **Se cazó verificando `origin/main..HEAD` DESPUÉS del push**, no fiándose del `rc`.)* VERIFICADO que sigue siendo tuyo** (`git log -1`), nunca sobre el que recuerdas. ⛔ **Y el rechazo
⇒ ⭐ **Lo peligroso es la redacción del mensaje**: *«nothing to commit»* **se lee como «ya estaba NO se resuelve forzando**: `git reset --soft @{u}` y recommitear **lo tuyo solo**.
hecho»** y se sigue adelante. ⇒ **Un `add` y un `commit` en órdenes separadas no son atómicos en un **⑥ NO HAY DOS CLONES — y creer que los hay es el error de modelo que los explica todos.** Las
working tree compartido**: entre los dos cabe otra sesión. **Verifica DESPUÉS del push, siempre** sesiones de una máquina **comparten árbol e índice**: no son copias que sincronizar. ⇒ **`git pull`
el `rc=0` de un `commit` que no commiteó nada **también es cero**. entre ellas es un no-op**, y recomendarlo **da una falsa sensación de haberse protegido**.
⛔⛔ **Y HAY UN TERCER FILO, EL PEOR DE LOS TRES: `git commit --amend` EN UN WORKING TREE COMPARTIDO *(2026-09-02: la superadmin avisó a un satélite de «haz `pull`, que hay commits de hace minutos».
REESCRIBE EL COMMIT DE OTRA SESIÓN.** El índice compartido te hace **arrastrar** lo ajeno; el Eran ciertos y **ya los tenía**. Lo midió el satélite: los tres rangos, vacíos.)* ⚠️ **Y no lo
`--amend` te hace **borrar y rehacer** lo ajeno — y encima lo firma con tu contenido dentro y su generalices al revés**: es cierto de las sesiones **de la misma máquina**; de un agente en worktree
mensaje fuera. aislado o remoto, **no** — y eso **se mide**.
*(Cicatriz 2026-08-31: se commitea, otra sesión commitea y empuja **en el mismo working tree**, y un **⑦ Y uno que no es de `git` sino del shell: con el `cd` PERSISTENTE, una ruta relativa NO
`--amend --no-edit` posterior **no amplía el commit propio: reescribe el suyo**, añadiéndole un identifica un fichero.** El mismo `doc/bitacora.md` es otro fichero según dónde quedó el comando
fichero ajeno a su cambio. El `push` sale rechazado por no-fast-forward, que es **la única razón por anterior — y **no falla: escribe en el sitio equivocado y calla**. *(2026-09-01: una sesión anexó
la que se vio**. Sin ese rechazo, la reescritura se habría publicado.)* **168 líneas** de su bitácora **al repo de otro frente**; y el mismo desliz le hizo **leer los
⇒ **Regla: en un working tree compartido, `--amend` sólo sobre un commit que sabes que es tuyo Y que avisos del repo equivocado**, numerando su hallazgo `A12` donde iban por `A5`: **un identificador
no ha salido** — y saberlo exige **mirar `git log -1` antes**, no suponer que HEAD es lo último que inventado que habría quedado escrito**.)* ⇒ **Rutas ABSOLUTAS y `git -C <repo>`**, nunca `cd` +
escribiste tú. ⛔ **Y el rechazo del `push` NO se resuelve forzando**: se resuelve con relativa. Y el testigo es barato: **el `tail` de lo que acabas de escribir y el `--stat` de lo que
`git reset --soft @{u}` y recommiteando **lo tuyo solo**, que deja el commit ajeno intacto. vas a commitear**; si el `--stat` sale vacío, **no es que no haya cambio: está en otro sitio**.
⛔⛔ **UNA INSPECCIÓN NO GANA UNA CARRERA — y todas las puertas de aquí arriba son inspección.**
`git status --porcelain` antes del primer `add`, `git diff --cached --name-only` justo antes de ⇒ ⭐ **LAS TRES PUERTAS, EN UN SOLO SITIO — y no son redundantes: cubren VENTANAS DISTINTAS.**
commitear, predecir el diffstat: **los tres MIRAN**. Contra un competidor concurrente, mirar sólo `git status --porcelain` **antes del primer `add`** *(sólo ve lo que YA ESTABA cuando empezaste)* ·
te dice **cómo iba la carrera cuando miraste** — y el resultado depende de **cuándo** mires, que es `git diff --cached --name-only` **inmediatamente antes de commitear**, leído por ojos y **no
precisamente lo que no controlas. encadenado con `&&`** *(la única que caza lo que entró DESPUÉS de tu `add`)* · `git log
*(Cicatriz 2026-09-02: **cuatro colisiones sobre el mismo fichero en un día, LAS CUATRO CON LAS TRES origin/main..HEAD` **antes de CADA push** *(la única que dice qué publicas)*.
PUERTAS PUESTAS.** Una sesión publicó la fila de otra · un `awk` por número de línea borró una fila ⛔⛔ **PERO UNA INSPECCIÓN NO GANA UNA CARRERA, Y LAS TRES SON INSPECCIÓN.** Miran. Contra un
viva **40 minutos** · otra partió una fila en dos · y a la cuarta, **entre dos comandos competidor concurrente sólo te dicen **cómo iba la carrera cuando miraste**, y eso depende de
consecutivos**, el índice se le llenó de un fichero ajeno **y su edición del working tree **cuándo** mires, que es lo que no controlas. *(2026-09-02: **cuatro colisiones sobre el mismo
desapareció**, sobrescrita; al ir a commitear, «nothing to commit»: **ya lo había publicado un fichero en un día, LAS CUATRO CON LAS TRES PUERTAS PUESTAS.** Una sesión publicó la fila de otra ·
tercero** dentro de un commit que hablaba de otra cosa. **Cero pérdidas y la atribución cruzada un `awk` por número de línea borró una fila viva **40 minutos** · otra partió una fila en dos · y a
cuatro veces.**)* la cuarta, **entre dos comandos consecutivos**, el índice se le llenó de un fichero ajeno **y su
edición del working tree desapareció**; al commitear, «nothing to commit»: **ya lo había publicado
un tercero**. Cero pérdidas y la atribución cruzada cuatro veces.)*
**Lo único que no depende de cuándo mires es lo que EXCLUYE en vez de inspeccionar**: **Lo único que no depende de cuándo mires es lo que EXCLUYE en vez de inspeccionar**:
**`git commit -- <rutas>`** (o `-o`) commitea esas rutas **pase lo que pase en el resto del índice**. **`git commit -- <rutas>`** (o `-o`) commitea esas rutas **pase lo que pase en el resto del índice**.
⚠️ **Ojo a la sintaxis, que se falla a la primera**: el mensaje va **antes** del separador — ⚠️ **Ojo a la sintaxis, que se falla a la primera**: el mensaje va **antes** del separador —
`git commit -m "…" -- <ruta>`; poner el `-m` después lo convierte en un pathspec y el commit muere. `git commit -m "…" -- <ruta>`; ponerlo después lo convierte en pathspec y el commit muere.
⇒ ⛔ **Y lo que ningún gesto de git arregla: que otra sesión te sobrescriba el WORKING TREE.** ⇒ ⛔ **Y lo que NINGÚN gesto de git arregla: que otra sesión te sobrescriba el WORKING TREE.** No
No hay dos copias. Mover la coordinación a git **compra historial, no aislamiento** — y la única hay dos copias. Mover la coordinación a git **compra historial, no aislamiento** — y la única
salida real es **que dos sesiones no escriban el mismo fichero**, no una puerta mejor. salida real es **que dos sesiones no escriban el mismo fichero**, no una puerta mejor.
⇒ ⭐ La forma general, y vale fuera de git: **ante una carrera, una comprobación no es una ⇒ ⭐ **Forma general, y vale fuera de git: ante una carrera, una comprobación no es una solución.**
solución.** Sirve para *saber* que perdiste, no para ganar. Lo que resuelve una carrera es Sirve para *saber* que perdiste, no para ganar. Lo que resuelve una carrera es **eliminarla**
**eliminarla** —partir el recurso, dar turnos, excluir por construcción—; todo lo demás es —partir el recurso, dar turnos, excluir por construcción—; lo demás es contar accidentes con más
contar accidentes con más detalle. detalle.
⛔ **Y UN CUARTO FILO, QUE NO ES UN FILO SINO UN MODELO MENTAL EQUIVOCADO: NO HAY DOS CLONES.** ⛔⛔ **Y LA PROPIEDAD QUE UNE A LOS SIETE, Y DICE CUÁNDO DEJAR DE BUSCAR UN GATE: `git` ES LA ÚNICA
Las sesiones de una misma máquina **comparten el mismo working tree y el mismo índice** — no son
copias que haya que sincronizar. ⇒ **`git pull` entre ellas es un no-op**, y recomendarlo *«para no
diagnosticar sobre un árbol viejo»* **delata el modelo equivocado y da una falsa sensación de
haberse protegido**: el árbol viejo **no puede existir**, y contra el riesgo que sí existe —**el
índice compartido**— el `pull` **no hace absolutamente nada**.
*(Cicatriz 2026-09-02: la superadmin avisó a un satélite de «`git pull` antes de mirar nada, que hay
commits de hace minutos». Eran ciertos y **ya los tenía**. Lo corrigió el satélite midiendo:
`status --porcelain` vacío, `origin/main..HEAD` vacío, `HEAD..origin/main` vacío.)*
**La defensa no es sincronizar, son las tres puertas del índice**: `git status --porcelain`
**antes del primer `add`** · `git diff --cached --name-only` **antes de commitear** ·
`git log origin/main..HEAD` **antes de CADA push**. ⛔ **Y no son redundantes: cubren
VENTANAS distintas.** El `porcelain` sólo ve lo que ya estaba al empezar; **una escritura ajena que
entra DESPUÉS de tu `add` sólo la caza el `--cached` justo antes de commitear.** ⚠️ Y **no lo generalices al revés**: que dos
sesiones compartan árbol es cierto **de las que corren en la misma máquina**; de un agente en
worktree aislado o en remoto, **no** — y eso **se mide, no se supone**.
⛔⛔ **Y LA PROPIEDAD QUE UNE A LOS CUATRO, Y DICE CUÁNDO DEJAR DE BUSCAR UN GATE: `git` ES LA ÚNICA
HERRAMIENTA COMPARTIDA DEL ÁRBOL QUE NO TIENE EL CONCEPTO DE SESIÓN.** El semáforo sabe quién eres. HERRAMIENTA COMPARTIDA DEL ÁRBOL QUE NO TIENE EL CONCEPTO DE SESIÓN.** El semáforo sabe quién eres.
El canal sabe quién eres. El linter sabe en qué repo estás. **`git` sólo ve un working tree y un El canal sabe quién eres. El linter sabe en qué repo estás. **`git` sólo ve un working tree y un
usuario** — y en este árbol **ese usuario es el mismo para todas**. usuario** — y aquí ese usuario es el mismo para todas.
⇒ Por eso **todos los filos aparecen ahí**, y por eso **ninguno lo caza un gate: no hay dato con el ⇒ Por eso **todos los filos aparecen ahí**, y por eso **ninguno lo caza un gate: no hay dato con el
que un gate pudiera distinguirlos.** ⭐ Y eso **no es una excusa: es el criterio para parar** que un gate pudiera distinguirlos.** ⭐ Y eso **no es una excusa: es el criterio para parar**
buscarle un gate a esto es construir un instrumento sin sujeto, que es la avería que este Método más buscarle un gate a esto es construir un instrumento sin sujeto, que es la avería que este Método más
persigue. **Lo que sí se puede es avisar antes y decirlo después.** persigue. **Lo que sí se puede es avisar antes y decirlo después.**
⛔ **Corolario, y es el más traicionero: `--amend` en un árbol compartido NO es una operación local.**
Su único testigo es **un `push` rechazado**, o sea **un fallo que puede no llegar a producirse**. ⇒
**`--amend` sólo es seguro sobre un `HEAD` que has VERIFICADO que sigue siendo tuyo** —`git log -1`—,
nunca sobre el que recuerdas haber hecho.
⛔ **Y UN QUINTO, DE LA HERRAMIENTA Y NO DE `git`: CON EL `cd` PERSISTENTE DEL SHELL, UNA RUTA
RELATIVA NO IDENTIFICA UN FICHERO.** El mismo `doc/bitacora.md` es un fichero distinto según dónde
quedó el shell del comando anterior — y **no falla: escribe en el sitio equivocado y calla**.
*(Cicatriz 2026-09-01: una sesión anexa **168 líneas** de su bitácora **al repo de otro frente**
porque el `cd` seguía puesto. Lo cazó **careando el `tail` del fichero** —salió una entrada de tres
días antes— y un `git diff --stat` **vacío** donde esperaba su cambio. Y el mismo desliz le hizo
además **leer los avisos del repo equivocado**, así que numeró su hallazgo `A12` cuando allí iban
por `A5`: **un identificador inventado que habría quedado escrito**.)*
**En un árbol multi-repo se trabaja con rutas ABSOLUTAS y `git -C <repo>`**, no con `cd` + ruta
relativa. ⭐ Y el testigo que lo caza es barato y hay que hacerlo antes de commitear: **mira el
`tail` de lo que acabas de escribir y el `--stat` de lo que vas a commitear.** Si el `--stat` sale
vacío donde esperabas tu cambio, **no es que no haya cambio: es que está en otro sitio**.
⭐⭐ **Y LA MITAD QUE SÍ SE PUEDE ATAR, PORQUE EL MENSAJE SÍ LO CONTROLAMOS: CADA COMMIT DICE QUIÉN LO ⭐⭐ **Y LA MITAD QUE SÍ SE PUEDE ATAR, PORQUE EL MENSAJE SÍ LO CONTROLAMOS: CADA COMMIT DICE QUIÉN LO
HIZO.** `git` no tiene concepto de sesión — pero **el mensaje es nuestro**. Un *trailer* con el **ROL** HIZO.** `git` no tiene concepto de sesión — pero **el mensaje es nuestro**. Un *trailer* con el **ROL**