smtp-relay/.metodo/metodo.md
sirxavor 2b62b8d6e9 docs(metodo): commitear la copia vendorizada + doc/ de tres capas
Estampada por 'metodo init' el 2026-08-12 (master 2026-08-08); sin commit no viaja al clonar (D1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 03:01:14 +02:00

5.8 KiB
Raw Blame History

El Método — constitución

Versión 2026-08-08. 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 constitucion-de-facto.md de la matriz.

Los 10 raíles base van hoy en una línea (su texto completo con cicatrices está pendiente de inlinar); lo promovido de la cosecha 2026-08-08 va completo. El árbol redes conserva su copia redes/workflows/metodo.md hasta que se desmantele.

Raíles base (110)

  1. Verifica el RESULTADO, no la intención (testigo independiente que sabe ponerse rojo).
  2. El dato CRUDO, no el cocinado (backend mide, consumidor pinta).
  3. Mutation testing: ataca el CABLEADO, no las funciones puras.
  4. Ejercita el FLUJO REAL (abre el navegador, toca el device).
  5. No inventes estados ni fallos no medidos ("sin dato", degrada a gris no a rojo).
  6. Verifica la PREMISA del prompt (enmendar es SUSTITUIR; premisa falsa = PARAR). ← +C34
  7. Fuente única + copias vendidas + red anti-deriva (--check).
  8. Fallo benigno EXPLÍCITO, nunca degradación silenciosa.
  9. Sesiones frescas por stack; la continuidad la lleva el orquestador.
  10. Lo que "funciona por casualidad" está roto.

Raíles nuevos (promovidos 2026-08-08)

11. El orden de lo irreversible: añadir antes de quitar · C14 (4 fuentes)

Todo lo verificable ocurre antes del paso que no se deshace. Se añade antes de quitar, se crea antes de borrar; cada paso de una release se revierte por separado y ninguno depende de dos cosas nuevas a la vez.

  • Un tercer nodo de etcd entra antes de que salga el que se retira — al revés, el quórum se queda en uno.
  • "Nunca borres el IPAddressPool viejo hasta tener el nuevo sirviendo" (MetalLB).
  • El cutover de un servicio con nombre: primero responde el nuevo, luego se retira el viejo.

12. Exploración solo-lectura, sin autoengaño · C35 (Solidaria)

Explorar es medir sin tocar, y sin creerte tu propia medida.

  • curl con control: mira /api/health/http_code, no "parece que responde".
  • "Aquí no hay nada" es un RESULTADO, no un fracaso — se anota igual que un hallazgo.
  • Los falsos positivos de grep son el riesgo nº1: una lista larga de "roto" delata TU método (un patrón demasiado amplio), no el sistema. Verifica cada hit contra la fuente antes de declararlo.
  • Medir, no opinar. Sondear una escritura ES escribir (no es exploración).

Entrega — la parte de "sacar el trabajo" (promovido 2026-08-08)

El método nació de verificación/UI; la cicatriz de entrega (git, secretos, naming, deploy) vivía fuera, repetida en varios repos. Aquí se consolida.

Naming · C17, C32

  • Ids con prefijo por ámbito, no se renumeran (romperían citas cruzadas), y antes de añadir uno se corre el grep de colisión — no basta con mirar.
  • El nombre nombra DESTINOS, no rutas: ni el host, ni la IP, ni activo/reserva entran en un FQDN. Se escribe como regla, no como observación.
  • Renombrar sin CNAME de cortesía: que lo viejo rompa a la vista, no en silencio.

Secretos · C20, C21, C22

  • Una frontera de credenciales por dominio; aislamiento por ServiceAccount (ninguno con acceso a secretos ajenos).
  • Capacidad > credencial: se actúa con el secreto, no se revela (revelar lo deja en el transcript); el estado raro se dice con la URL, nunca con el secreto.
  • Nunca en git: imperativos / GPG / PushSecret, forzado por .gitignore; se documenta cómo recrearlos, no el valor.

Git · C24, C25, C38

  • Git canónico único y MEDIDO: se empuja a un remoto y solo ahí; un fallo se mide (dry-run/reintento) antes de concluir "no hay credenciales"; el remoto muerto se elimina localmente.
  • 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.

Deploy · C12, C13

  • Un solo flujo de build, disparado deliberadamente, no por git push; el legacy es lápida (código muerto conservado hasta MEDIR qué lo ejecuta, no borrado a ciegas).
  • Todo cambio por git → deploy declarativo; imagen pineada por DIGEST inmutable commiteado; el historial de commits ES el registro de auditoría.
  • El orden de lo irreversible aplica aquí → raíl 11.

Adiciones a raíles base (pendientes de inlinar en su raíl)

  • R6 (verifica la premisa) += C34: las premisas del encargo se numeran (P1,P2…) con veredicto explícito (verdadera / falsa / matizada + fichero:línea); el ratio de premisas falsas es el termómetro de "escribo de memoria"; "el doc lo dice" = premisa a verificar.
  • Diseño de herramientas (R1/R8) += C39: la ausencia de una capacidad es un guardarraíl. El poder peligroso se retiene estructuralmente (no se expone porque no se construye): vocabulario cerrado, sin exec/SQL/comando libre.
  • Docs / R7 += C30: el docstring/manual ES la interfaz. Cambia el comportamiento → cambia el docstring en el mismo commit; un doc que miente ES el bug.

La estructura de sesión no vive aquí

Los dos ejes fase × persona y el handoff automático entre fases son procedimiento, no principio → viven en la capa workflows/, con la capa persona opcional (se activa solo con interlocutor no-técnico; en infra en solitario, inactiva pero documentada).