diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index d915639..d80278d 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -1,2 +1,2 @@ 140cf44bc4d8e9eff08cd4f6466df22c897efa2c6c6f83662a747e3348a4f2bd metodo.md -252f0e98ca4f8e015fceff57493a132f665514e4fd590ef2172dc6e4dfa021ab bin/metodo +09189db5840b85e18a71aad9073b0642c9845dbcab08eccda2c83494d521d994 bin/metodo diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index 4fc8170..a0d93f2 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -135,10 +135,13 @@ _id_scan() { # $1 = fichero · $2 = def|forma if (cola ~ /^[[:alnum:]]/ ) { if (modo == "subid") print "1"; next } # P9b / E2E if (cola ~ /^[.-][[:alnum:]]/ ) { if (modo == "subid") print "1"; next } # E8.a / R5-bis } - if (modo == "def") print id; else if (modo == "forma") print "1" }' "$1" + if (modo == "def") print id + else if (modo == "defnr") print NR "\t" id # el consumidor necesita SABER en qué línea + else if (modo == "forma") print "1" }' "$1" } _ids_def() { _id_scan "$1" def; } _lineas_forma_id() { _id_scan "$1" forma | grep -c "^1$"; } +_ids_def_nr() { _id_scan "$1" defnr; } # — para quien necesite CASAR con el fichero _subids() { _id_scan "$1" subid | grep -c "^1$"; } # lo que el LÍMITE tira: se dice, no se calla check_ids() { @@ -343,11 +346,22 @@ check_decisiones_en_backlog() { hdr "textos de decisión dentro del backlog (D6)" local f="$ROOT/doc/backlog.md" [ -f "$f" ] || { skip "sin doc/backlog.md (repo sin corpus de estado)"; return; } + # ⚠️ `A8`: qué línea ES una definición de id lo decide **`_id_scan` y sólo él**. Este check + # llevaba su propia copia del patrón, y por eso NO obedecía a `D101` (un `D9b` contaba como + # `D9`). Es la lección de `A6` en su forma más literal —*el detector no hereda ni DUPLICA el + # criterio que audita*— y estaba escrita desde el día uno en la cabecera del script: «UN solo + # script, nada de dos implementaciones que diverjan». Aquí sólo se añade lo propio: quedarse + # con los ids `D` y medir el TAMAÑO del bloque. + # ⚠️ Las definiciones entran por `-v`, NO como segundo fichero: con el truco `NR==FNR` y la + # lista VACÍA (un backlog sin ids reconocidos) la regla se traga el fichero entero y el check + # mide sobre la nada **en silencio**. Lo destapó el arnés: el mutante que le devuelve su copia + # al check 8 no llegaba a ejecutarse nunca. + local defs; defs=$(_ids_def_nr "$f") local out legacy=0 nuevos=0 id len num - out=$(awk ' + out=$(awk -v defs="$defs" ' + BEGIN { n=split(defs, L, "\n"); for (i=1;i<=n;i++) if (split(L[i], P, "\t")==2) DEF[P[1]+0]=P[2] } function flush(){ if (id!="" && len>3) print id "\t" len; id=""; len=0 } - /^[[:space:]]*[-*|_]+[[:space:]]*[*~`]*D[0-9]+/ { - flush(); match($0, /D[0-9]+/); id=substr($0, RSTART, RLENGTH); len=1; next } + (FNR in DEF) { flush(); if (DEF[FNR] ~ /^D[0-9]+$/) { id=DEF[FNR]; len=1 } ; next } /^[[:space:]]+[^[:space:]]/ { if (id!="") { len++; next } } { flush() } END { flush() }' "$f")