gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

el awk se llama akllay: `qillqa` estaba TOMADO en tawasuyu, y no lo comprobé

Lo levantó el usuario preguntando si había chequeado. No lo había hecho, y una de
las dos sospechas era cierta:

  · `qillqa` — TOMADO. En tawasuyu/02_ruway/qillqa vive un producto entero
    (registro público a prueba de manipulación, 16 crates, SDD propio, MPL-2.0) y
    su qillqa-cli declara `[[bin]] name = "qillqa"`. Un binario homónimo.
  · `simi` — LIBRE, y conviene dejarlo medido para no volver a dudar: no hay
    binario, ni paquete, ni directorio con ese nombre en tawasuyu. Sus
    apariciones son «runa simi», el nombre del idioma dentro de frases. El shell
    se queda como está.

Por qué importaba y no era cosmético: takana EMPAQUETA recetas de tawasuyu
(boveda, tejido, pacha, shuma-pregunta, pacha-secretos…). Dos binarios homónimos
en el mismo /usr/bin de la misma imagen es una colisión de la que no avisa nada —
gana el último que hidrate, y cuál es depende del orden. Es la misma forma que
[[granja-promote-colisiones]]: variantes homónimas que se pisan sin ruido.

Y lo que más molesta: **la práctica de comprobarlo ya estaba escrita en el otro
repo**. `tawasuyu/01_yachay/qhali/SDD.md:15` dice literalmente «Nombre: `qhali`.
Qhali kay = estar sano, en runa simi. Verificado sin colisión:». Existía el
precedente, el método y el lugar donde dejarlo anotado. Elegí el nombre por
significado y no verifiqué nada.

El nombre nuevo es `akllay` = escoger, seleccionar (separando, como los granos),
que es exactamente lo que hace awk: elige los registros que casan un patrón y
escoge campos de cada uno. Verificado en los DOS repos y contra los 2193 nombres
de binario del store: libre como binario, como paquete, como directorio y como
receta. Igual que `pallay`, `taqa` y `chiqta`, que eran los otros candidatos.

El comando instalado sigue siendo `awk` — eso no cambia, es contrato. Las 29
pruebas siguen verdes y el banco diferencial sigue en 104/104 con 0 divergencias.

⚠ Queda un artefacto huérfano en el store: c272582455ff…-qillqa, el sello de hace
media hora con el nombre viejo. No lo referencia ninguna receta; se queda como
histórico, que es lo que el store hace con todo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

83720b303431ffec520a4171b21b2da651a80d31 · por Sergio · (hace 1 mes) · padre a5ad95545 · ver el árbol en este commit

Delta semántico · 439

crates/akllay/src/ast.rs

crates/akllay/src/formato.rs

crates/akllay/src/interp.rs

crates/akllay/src/lexer.rs

crates/akllay/src/main.rs

crates/akllay/src/parser.rs

crates/akllay/src/regex.rs

crates/qillqa/src/ast.rs

crates/qillqa/src/formato.rs

crates/qillqa/src/interp.rs

crates/qillqa/src/lexer.rs

crates/qillqa/src/main.rs

crates/qillqa/src/parser.rs

crates/qillqa/src/regex.rs

crates/qillqa/src/valor.rs

scripts/awk-banco-diferencial.py

  • cambió por dentro fn main

27 archivos · +3646 −3624

diff --git a/Cargo.lock b/Cargo.lock
index 4f3670a2..62118347 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -11,6 +11,13 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "akllay"
+version = "0.0.1"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "anstream"
 version = "1.0.0"
@@ -881,13 +888,6 @@ dependencies = [
  "unicode-ident",
 ]
 
-[[package]]
-name = "qillqa"
-version = "0.0.1"
-dependencies = [
- "libc",
-]
-
 [[package]]
 name = "quote"
 version = "1.0.45"
diff --git a/Cargo.toml b/Cargo.toml
index 4e4e8366..846269d1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,7 @@ members = [
     "crates/hammerd",
     "crates/netup",
     "crates/simi",
-    "crates/qillqa",
+    "crates/akllay",
 ]
 
 [workspace.package]
diff --git a/crates/qillqa/Cargo.toml b/crates/akllay/Cargo.toml
similarity index 87%
rename from crates/qillqa/Cargo.toml
rename to crates/akllay/Cargo.toml
index 05224202..2d8414c3 100644
--- a/crates/qillqa/Cargo.toml
+++ b/crates/akllay/Cargo.toml
@@ -1,14 +1,14 @@
 [package]
-name = "qillqa"
+name = "akllay"
 version.workspace = true
 edition.workspace = true
 license.workspace = true
 authors.workspace = true
 repository.workspace = true
-description = "qillqa — el awk del producto: POSIX, sin deps, con su propio motor de expresiones regulares."
+description = "akllay — el awk del producto: POSIX, sin deps, con su propio motor de expresiones regulares."
 
 [[bin]]
-name = "qillqa"
+name = "akllay"
 path = "src/main.rs"
 
 # Cero crates de terceros, igual que simi. Un awk necesita leer ficheros, escribir a tuberías y
diff --git a/crates/qillqa/src/ast.rs b/crates/akllay/src/ast.rs
similarity index 100%
rename from crates/qillqa/src/ast.rs
rename to crates/akllay/src/ast.rs
diff --git a/crates/qillqa/src/formato.rs b/crates/akllay/src/formato.rs
similarity index 100%
rename from crates/qillqa/src/formato.rs
rename to crates/akllay/src/formato.rs
diff --git a/crates/qillqa/src/interp.rs b/crates/akllay/src/interp.rs
similarity index 99%
rename from crates/qillqa/src/interp.rs
rename to crates/akllay/src/interp.rs
index fd8060b6..fc0a0873 100644
--- a/crates/qillqa/src/interp.rs
+++ b/crates/akllay/src/interp.rs
@@ -274,7 +274,7 @@ impl Interprete {
         // no se puede tomar prestado — es raro y el coste es de una compilación.
         if let Some(r) = self.ere_cache.get(patron) { return r.clone(); }
         Rc::new(Regex::nueva(patron).unwrap_or_else(|e| {
-            eprintln!("qillqa: expresión regular inválida /{patron}/: {e}");
+            eprintln!("akllay: expresión regular inválida /{patron}/: {e}");
             std::process::exit(2);
         }))
     }
@@ -669,7 +669,7 @@ impl Interprete {
             match std::fs::File::open(&s) {
                 Ok(f) => { self.lector_actual = Some(Box::new(BufReader::new(f))); return true; }
                 Err(e) => {
-                    eprintln!("qillqa: no puedo leer `{s}`: {e}");
+                    eprintln!("akllay: no puedo leer `{s}`: {e}");
                     self.codigo_salida = 2;
                     continue;
                 }
@@ -1048,7 +1048,7 @@ impl Interprete {
                     let t = Self::partir_con(&s, &fs, |p| {
                         if let Some((_, r)) = cache.iter().find(|(k, _)| k == p) { return r.clone(); }
                         let r = Rc::new(Regex::nueva(p).unwrap_or_else(|e| {
-                            eprintln!("qillqa: expresión regular inválida /{p}/: {e}");
+                            eprintln!("akllay: expresión regular inválida /{p}/: {e}");
                             std::process::exit(2);
                         }));
                         cache.push((p.to_string(), r.clone()));
diff --git a/crates/qillqa/src/lexer.rs b/crates/akllay/src/lexer.rs
similarity index 100%
rename from crates/qillqa/src/lexer.rs
rename to crates/akllay/src/lexer.rs
diff --git a/crates/qillqa/src/main.rs b/crates/akllay/src/main.rs
similarity index 72%
rename from crates/qillqa/src/main.rs
rename to crates/akllay/src/main.rs
index f797f556..366c1ad4 100644
--- a/crates/qillqa/src/main.rs
+++ b/crates/akllay/src/main.rs
@@ -1,13 +1,24 @@
-//! qillqa — el awk del producto.
+//! akllay — el awk del producto.
 //!
-//! *qillqa* es «escritura» en quechua, y awk es la herramienta de escribir sobre texto. El nombre
-//! sigue el criterio del proyecto (los nombres propios van en quechua) y el precedente de `simi`:
-//! **el nombre lo registra este comentario y lo DECIDE un ADR**, igual que el del shell. Lo que no
-//! está sujeto a decisión es el nombre del comando instalado: la receta enlaza `awk`, porque eso es
-//! contrato y lo llaman los `configure` de medio corpus.
+//! *akllay* es «escoger, seleccionar» en quechua —lo que se hace al separar los granos buenos de
+//! los malos—, y es exactamente lo que hace awk: elige los registros que casan un patrón y escoge
+//! campos de cada uno. El nombre sigue el criterio del proyecto (los nombres propios van en
+//! quechua) y el precedente de `simi`: **lo registra este comentario y lo DECIDE un ADR**.
 //!
-//! Uso:  qillqa [-F sepc] [-v var=valor]… 'programa' [fichero | var=valor]…
-//!       qillqa [-F sepc] [-v var=valor]… -f fuente.awk [-f más.awk]… [fichero | var=valor]…
+//! ⚠ **Se llamó `qillqa` («escritura») durante un commit, y ese nombre ESTABA TOMADO**: en
+//! `tawasuyu/02_ruway/qillqa` vive un producto entero —registro público a prueba de manipulación,
+//! 16 crates, SDD propio— y su `qillqa-cli` instala un binario llamado exactamente `qillqa`. Dos
+//! binarios homónimos en el mismo `/usr/bin` es una colisión de la que no avisa nada: gana el
+//! último que hidrate. Lo peor es que la práctica de comprobarlo ya estaba escrita en el otro repo
+//! (`01_yachay/qhali/SDD.md`: «Nombre: `qhali`. Verificado sin colisión»), y no la seguí.
+//! Verificado ahora, en los dos repos y contra los 2193 binarios del store: `akllay` está libre, y
+//! `simi` también lo estaba —sus apariciones en tawasuyu son «runa simi», el nombre del idioma.
+//!
+//! Lo que no está sujeto a decisión es el nombre del comando instalado: la receta enlaza `awk`,
+//! porque eso es contrato y lo llaman los `configure` de medio corpus.
+//!
+//! Uso:  akllay [-F sepc] [-v var=valor]… 'programa' [fichero | var=valor]…
+//!       akllay [-F sepc] [-v var=valor]… -f fuente.awk [-f más.awk]… [fichero | var=valor]…
 
 mod ast;
 mod formato;
@@ -22,8 +33,8 @@ use std::io::Write;
 use valor::Valor;
 
 fn uso() -> ! {
-    eprintln!("uso: qillqa [-F sepc] [-v var=valor]... 'programa' [fichero...]");
-    eprintln!("     qillqa [-F sepc] [-v var=valor]... -f fuente.awk [fichero...]");
+    eprintln!("uso: akllay [-F sepc] [-v var=valor]... 'programa' [fichero...]");
+    eprintln!("     akllay [-F sepc] [-v var=valor]... -f fuente.awk [fichero...]");
     std::process::exit(2);
 }
 
@@ -61,7 +72,7 @@ fn main() {
                 let v = toma(&pegado, &mut i);
                 match std::fs::read_to_string(&v) {
                     Ok(s) => fuentes.push(s),
-                    Err(e) => { eprintln!("qillqa: no puedo leer `{v}`: {e}"); std::process::exit(2); }
+                    Err(e) => { eprintln!("akllay: no puedo leer `{v}`: {e}"); std::process::exit(2); }
                 }
             }
             _ => uso(),
@@ -79,7 +90,7 @@ fn main() {
 
     let prog = match parser::Parser::nuevo(&fuente).and_then(|mut p| p.programa()) {
         Ok(p) => p,
-        Err(e) => { eprintln!("qillqa: {e}"); std::process::exit(2); }
+        Err(e) => { eprintln!("akllay: {e}"); std::process::exit(2); }
     };
 
     let mut it = Interprete::nuevo(prog);
@@ -95,7 +106,7 @@ fn main() {
     for a in &asignaciones {
         match interp::posicion_asignacion(a) {
             Some(p) => it.poner_var(&a[..p], Valor::de_entrada(&interp::desescapar(&a[p + 1..]))),
-            None => { eprintln!("qillqa: `-v {a}` no tiene forma var=valor"); std::process::exit(2); }
+            None => { eprintln!("akllay: `-v {a}` no tiene forma var=valor"); std::process::exit(2); }
         }
     }
 
@@ -103,7 +114,7 @@ fn main() {
     {
         let operandos: Vec<String> = argv[i..].to_vec();
         let arr = it.array_publico("ARGV");
-        arr.borrow_mut().insert("0".into(), Valor::Cad("qillqa".into()));
+        arr.borrow_mut().insert("0".into(), Valor::Cad("akllay".into()));
         for (n, o) in operandos.iter().enumerate() {
             arr.borrow_mut().insert((n + 1).to_string(), Valor::de_entrada(o));
         }
@@ -159,6 +170,6 @@ fn fin_con_error(it: &mut Interprete, e: &str) -> ! {
     }
     it.cerrar_todo();
     let _ = std::io::stderr().flush();
-    eprintln!("qillqa: {e}");
+    eprintln!("akllay: {e}");
     std::process::exit(2);
 }
diff --git a/crates/qillqa/src/parser.rs b/crates/akllay/src/parser.rs
similarity index 100%
rename from crates/qillqa/src/parser.rs
rename to crates/akllay/src/parser.rs
diff --git a/crates/qillqa/src/regex.rs b/crates/akllay/src/regex.rs
similarity index 100%
rename from crates/qillqa/src/regex.rs
rename to crates/akllay/src/regex.rs
diff --git a/crates/qillqa/src/valor.rs b/crates/akllay/src/valor.rs
similarity index 100%
rename from crates/qillqa/src/valor.rs
rename to crates/akllay/src/valor.rs
diff --git a/crates/qillqa/tests/divergencias_medidas.rs b/crates/akllay/tests/divergencias_medidas.rs
similarity index 97%
rename from crates/qillqa/tests/divergencias_medidas.rs
rename to crates/akllay/tests/divergencias_medidas.rs
index f2de4c13..fce1d9cd 100644
--- a/crates/qillqa/tests/divergencias_medidas.rs
+++ b/crates/akllay/tests/divergencias_medidas.rs
@@ -8,10 +8,10 @@ use std::process::{Command, Stdio};
 use std::io::Write;
 
 fn awk(prog: &str, entrada: &str) -> String {
-    let exe = env!("CARGO_BIN_EXE_qillqa");
+    let exe = env!("CARGO_BIN_EXE_akllay");
     let mut h = Command::new(exe).arg(prog)
         .stdin(Stdio::piped()).stdout(Stdio::piped()).stderr(Stdio::piped())
-        .spawn().expect("no pude lanzar qillqa");
+        .spawn().expect("no pude lanzar akllay");
     h.stdin.as_mut().unwrap().write_all(entrada.as_bytes()).unwrap();
     let s = h.wait_with_output().unwrap();
     String::from_utf8_lossy(&s.stdout).trim_end_matches('\n').to_string()
diff --git a/docs/plan-botar-busybox.md b/docs/plan-botar-busybox.md
index d00be16e..d2a10348 100644
--- a/docs/plan-botar-busybox.md
+++ b/docs/plan-botar-busybox.md
@@ -1381,19 +1381,19 @@ contestando. **Conviven**, que es lo que la receta afirmaba y ahora está medido
 
 ---
 
-# `qillqa` — el `awk` propio, ESCRITO y MEDIDO (2026-09-22)
+# `akllay` — el `awk` propio, ESCRITO y MEDIDO (2026-09-22)
 
-**Crate:** `crates/qillqa/` (3531 líneas, `libc` y nada más) · **receta:** `recipes/qillqa.toml`
-(sellada) · **nombre:** *qillqa* es «escritura» en quechua. El comando instalado es `awk` — eso es
+**Crate:** `crates/akllay/` (3531 líneas, `libc` y nada más) · **receta:** `recipes/akllay.toml`
+(sellada) · **nombre:** *akllay* es «escoger, seleccionar» en quechua — lo que hace awk con los registros. El comando instalado es `awk` — eso es
 contrato. El nombre propio lo registra este documento y lo decide un ADR, igual que `simi`.
 
 ## El veredicto, primero
 
-> **Construye el corpus y reproduce bit a bit.** Tres recetas autotools reales con qillqa como
+> **Construye el corpus y reproduce bit a bit.** Tres recetas autotools reales con akllay como
 > `/usr/bin/awk` del lab: **3 de 3 sellaron, y las tres con el hash IDÉNTICO** al vigente construido
 > con el `awk` de busybox. Es exactamente la prueba que brush falló 0 de 3.
 
-| | qillqa | busybox awk | gawk 5.3.2 |
+| | akllay | busybox awk | gawk 5.3.2 |
 |---|---|---|---|
 | banco diferencial (109 casos, dos oráculos) | **104 iguales, 0 divergencias** | oráculo | oráculo |
 | `pkgconf` · `flex` · `oniguruma` con él de `awk` | **3/3, hash idéntico** | 3/3 (control) | — |
@@ -1409,11 +1409,11 @@ que no haya un cuarto caso.
 
 ## El banco es DIFERENCIAL y contra DOS oráculos, y eso decidió cosas
 
-`scripts/awk-banco-diferencial.py` corre los mismos 109 casos en qillqa, en el `awk` de busybox y en
+`scripts/awk-banco-diferencial.py` corre los mismos 109 casos en akllay, en el `awk` de busybox y en
 `gawk --posix`. El veredicto no es «igual a X» sino «igual a LOS DOS», y **los oráculos discrepan
 entre sí en 5 casos** — que es justo para lo que sirve tener dos:
 
-| caso | busybox | gawk | POSIX manda | qillqa |
+| caso | busybox | gawk | POSIX manda | akllay |
 |---|---|---|---|---|
 | `2^3^2` | 64 | **512** | derecha ⇒ 512 | 512 ✓ |
 | `index(s,"")` | 0 | **1** | 1 | 1 ✓ |
@@ -1428,7 +1428,7 @@ banco contra un único awk lo habría dado por bueno.
 ## Las cinco cosas que el banco destapó — ninguna reventaba
 
 Todas daban un resultado plausible, ninguna imprimía un error. Quedan como pruebas de regresión en
-`crates/qillqa/tests/divergencias_medidas.rs`:
+`crates/akllay/tests/divergencias_medidas.rs`:
 
 1. **Leer `NF` no forzaba el partido en campos** ⇒ `{print NF}` daba **0** hasta que alguien tocara
    un campo. El partido es perezoso a propósito —es lo que hace barato asignar a `$0`— y el precio
diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 630348b4..909d4c13 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -151,16 +151,16 @@ paquetes = [
   # cualquier ssh moderno. Con un TERM exótico contestan «unknown terminal type» en vez de pintar
   # basura. Corolario: `tic` e `infocmp` viajan pero no tienen base que consultar.
   "ncurses-tools",
-  # `qillqa` (2026-09-22): el `awk` del producto, takana-PROPIO. «awk soberano» (usuario), que era
+  # `akllay` (2026-09-22): el `awk` del producto, takana-PROPIO. *akllay* = escoger. «awk soberano» (usuario), que era
   # la cuarta opción del ADR — las otras tres adoptaban la semántica de otro: gawk es C con
   # extensiones GNU, goawk es Go y rompe la premisa de cadena de la Etapa C, frawk es otro dialecto.
   # La receta instala `awk` como enlace, y ESO es lo que lo pone en juego: `awk` es contrato, lo
   # llaman los `configure` de medio corpus y los guiones del producto.
   # Medido antes de declararlo: 104 de 109 casos idénticos a busybox awk Y a gawk --posix con 0
   # divergencias, y las tres recetas autotools de la prueba de brush (pkgconf, flex, oniguruma)
-  # sellaron con qillqa como /usr/bin/awk del lab **con el hash idéntico** al vigente. Brush hacía
-  # 0 de 3. Ver `docs/plan-botar-busybox.md` §qillqa.
-  "qillqa",
+  # sellaron con akllay como /usr/bin/awk del lab **con el hash idéntico** al vigente. Brush hacía
+  # 0 de 3. Ver `docs/plan-botar-busybox.md` §akllay.
+  "akllay",
 ]
 
 [perfil.cli]
diff --git a/recipes/qillqa.toml b/recipes/akllay.toml
similarity index 66%
rename from recipes/qillqa.toml
rename to recipes/akllay.toml
index 67d68a45..eb39bfea 100644
--- a/recipes/qillqa.toml
+++ b/recipes/akllay.toml
@@ -1,8 +1,19 @@
-# qillqa — el `awk` del producto. Código takana-PROPIO, no una adopción.
+# akllay — el `awk` del producto. Código takana-PROPIO, no una adopción.
 #
 # Mismo patrón de receta que simi/netup/hammerd: un crate del workspace a un commit fijado, deps
 # vendoreadas para build hermético `--offline`, link estático con zig cc. Sólo depende de libc.
 #
+# ── EL NOMBRE, Y LA COLISIÓN QUE CASI SE COLÓ ───────────────────────────────────────────────────
+# *akllay* = escoger, seleccionar (separando, como los granos). Es lo que hace awk: elige los
+# registros que casan un patrón y escoge campos de cada uno.
+#
+# ⚠ Se llamó `qillqa` («escritura») durante un commit, y ese nombre **estaba tomado**: en
+# `tawasuyu/02_ruway/qillqa` hay un producto entero —registro público a prueba de manipulación, 16
+# crates, SDD propio— cuyo `qillqa-cli` instala un binario llamado exactamente `qillqa`. Dos
+# binarios homónimos en el mismo `/usr/bin` es una colisión de la que **no avisa nada**: gana el
+# último que hidrate, y takana empaqueta recetas de tawasuyu. Verificado ahora en los dos repos y
+# contra los 2193 nombres de binario del store: `akllay` libre, y `simi` también lo estaba.
+#
 # ── POR QUÉ PROPIO (decisión del usuario, 2026-09-22: «awk soberano») ───────────────────────────
 # El ADR pendiente de `docs/plan-botar-busybox.md` tenía tres candidatos y ninguno era gratis:
 #   · gawk  — C, con extensiones GNU que los `configure` del corpus sí usan. Adoptarlo es adoptar
@@ -19,15 +30,15 @@
 # POSIX). Más los 59 programas awk reales de este repo, que acepta todos, y 29 pruebas propias.
 #
 # ⚠ Falta la prueba que de verdad decide, y esta cabecera no la finge: un `configure` de autotools
-# con qillqa como `/usr/bin/awk`. Es la lección de brush, que pasó 56/57 casos POSIX y no construía
+# con akllay como `/usr/bin/awk`. Es la lección de brush, que pasó 56/57 casos POSIX y no construía
 # una sola receta.
 
-name    = "qillqa"
+name    = "akllay"
 version = "0.0.1"
 license = "MIT"
 
 [source]
-# El propio takana. El commit es el identificador inmutable; subirlo cuando qillqa avance.
+# El propio takana. El commit es el identificador inmutable; subirlo cuando akllay avance.
 repo   = "https://git.gioser.net/sergio/takana.git"
 commit = "2c882bdd6589af67f8bd86f7ad77448f4217cfd1"
 
@@ -38,8 +49,8 @@ link     = "static"
 
 # Split de la info de depuración, igual que hammerd y simi. Entra en `hash_inputs`.
 strip_debug = true
-# Sólo el binario `qillqa` del workspace.
-flags    = ["-p", "qillqa"]
+# Sólo el binario `akllay` del workspace.
+flags    = ["-p", "akllay"]
 
 # El BuildSys::Cargo instala el binario; el enlace `awk` lo pone esta receta porque **ese sí es
 # contrato**: lo llaman los `configure` del corpus y los guiones del producto. A diferencia de
@@ -47,4 +58,4 @@ flags    = ["-p", "qillqa"]
 # decisión de la raíz de confianza—, acá no hay nada que disputar: en el corpus no existe otro awk
 # declarado en ningún perfil.
 [build.phases]
-install = "mkdir -p /out/usr/bin && cp target/release/qillqa /out/usr/bin/qillqa && ln -sf qillqa /out/usr/bin/awk"
+install = "mkdir -p /out/usr/bin && cp target/release/akllay /out/usr/bin/akllay && ln -sf akllay /out/usr/bin/awk"
diff --git a/scripts/awk-banco-diferencial.py b/scripts/awk-banco-diferencial.py
index 51a0f449..f6e7f302 100755
--- a/scripts/awk-banco-diferencial.py
+++ b/scripts/awk-banco-diferencial.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 """Banco DIFERENCIAL de awk: corre los mismos casos en varios motores y compara.
 
-    scripts/awk-banco-diferencial.py                      # qillqa contra busybox awk y gawk --posix
+    scripts/awk-banco-diferencial.py                      # akllay contra busybox awk y gawk --posix
     scripts/awk-banco-diferencial.py --motor ruta/al/awk  # añade otro candidato
 
 Por qué diferencial y no de salidas esperadas escritas a mano: un banco escrito a mano mide lo que
@@ -173,7 +173,7 @@ def corre(motor, caso, entrada):
 
 def main():
     ap = argparse.ArgumentParser()
-    ap.add_argument("--motor", default=os.path.join(RAIZ, "target/release/qillqa"))
+    ap.add_argument("--motor", default=os.path.join(RAIZ, "target/release/akllay"))
     ap.add_argument("--verbose", action="store_true")
     a = ap.parse_args()
 
@@ -198,7 +198,7 @@ def main():
             discrepan += 1
             if a.verbose:
                 print(f"  ~ {nombre}: los oráculos discrepan " +
-                      " · ".join(f"{n}=[{r}]" for n, r in refs) + f" · qillqa=[{mio}]")
+                      " · ".join(f"{n}=[{r}]" for n, r in refs) + f" · akllay=[{mio}]")
             continue
         esperado = refs[0][1]
         if mio == esperado:
@@ -213,7 +213,7 @@ def main():
     if fallos:
         print("\n── divergencias ──")
         for n, p, e, esp, mio in fallos:
-            print(f"\n  ✗ {n}\n      programa: {p}\n      entrada : {e!r}\n      oráculos: [{esp}]\n      qillqa  : [{mio}]")
+            print(f"\n  ✗ {n}\n      programa: {p}\n      entrada : {e!r}\n      oráculos: [{esp}]\n      akllay  : [{mio}]")
     return 1 if fallos else 0