la deuda del recorte, pagada: 21 recetas en 44 min — y el mirror sftp, inalcanzable
La granja molió las 21 recetas que el recorte invalidó (dev.gioser.net, 12:05 →
12:49). Verificado por CRUCE DE HASHES: para cada una se calculó en el hub el
hash que espera y se comprobó que ese artefacto exacto está en el store del
worker. 20 de 21.
⚠ Y el código de salida no servía, que es la parte que enseña: el guión hacía
`takana build … | tail -3` y leía `rc=$?` — que es el código de `tail`, no el del
build. Las 21 salieron «rc=0» y una había fallado. Un rc detrás de una tubería
mide el último eslabón. Reporté «21/21 rc=0» antes de mirar los hashes; lo que
vale es el cruce.
La que no se pudo —ia-modelo-embeddings— no es deuda del recorte: su fuente sólo
vive en el mirror (ADR 0013, junto a ia-modelo-chat y firefox-pgo-profile), y el
mirror es un Storage Box por sftp que desde esta jaula falla por DOS causas
independientes, cada una con un error que no menciona a la otra:
1. el `curl` del CORPUS no habla sftp. takana lo invoca por nombre y el PATH
del lab pone primero /work/sergio/bin/curl (8.20.0 musl, sin libssh2) ⇒
`curl: (1) Protocol "sftp" disabled`. El de la imagen (8.21.0, libssh2) sí.
Es el mismo patrón que el git sin remote-https que ya documenta CLAUDE.md.
2. la clave no está: ~/.ssh/github5 no existe y id_ed25519 no está autorizada
en el Storage Box ⇒ (67) Authentication failure.
Anotado en scripts/fuentes/mirror-env.sh, que es donde alguien va a mirar cuando
el mirror no responda.
Estado: sealed 946 · debt 1 · todas las imágenes completas (base 85/85, cli
153/153, servidor 186/186, mirada 41/41, metal-tigerlake 7/7), grafo cierra.
⚠ El manifiesto de sellados del worker no existía en este hub
(work/farm-sellados.txt), así que el grafo reportaba `never` sobre artefactos que
existen. Traído a mano — es lo mismo que hace la cosecha, sin tocar el lock.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
2 qillqakuna · +64 −0
- docs/plan-botar-busybox.md +45 −0
- scripts/fuentes/mirror-env.sh +19 −0
diff --git a/docs/plan-botar-busybox.md b/docs/plan-botar-busybox.md
index c7225fbb..399bd885 100644
--- a/docs/plan-botar-busybox.md
+++ b/docs/plan-botar-busybox.md
@@ -1529,3 +1529,48 @@ reconstrucción en vez de dos.
vio que no escala. Ahora son `recorte` (sigue/RETIRADO) y `retirado_el` (la fecha), que es lo que
debió ser desde el principio: una columna por tanda convierte el fichero en un registro de
tandas en vez de un estado.
+
+## La deuda del recorte, PAGADA — 21 recetas, y la que no se pudo (2026-09-22)
+
+Las 24 recetas que declaran `busybox` build-dep quedaron invalidadas por el recorte. Tres se
+reconstruyeron en el hub como prueba; **las 21 restantes las molió la granja en 44 minutos**
+(`dev.gioser.net`, 12:05 → 12:49), bajo el mismo `flock -o` que usa su loop.
+
+**Verificado por cruce de hashes, no por código de salida:** para cada receta se calculó en el HUB
+el hash que espera y se comprobó que ese artefacto exacto está en el store del WORKER. **20 de 21.**
+
+> ⚠ **Y el código de salida no servía**, que es la parte que enseña: el guión de la tanda hacía
+> `takana build … | tail -3` y leía `rc=$?`, **que es el código de `tail`, no el del build**. Las 21
+> salieron «rc=0» y una había fallado. Un `rc` detrás de una tubería mide el último eslabón.
+
+### La que no se pudo, y por qué no es deuda del recorte
+
+`ia-modelo-embeddings` no construye **en ninguna de las dos máquinas**, y no por el recorte: su
+`[source]` apunta a `https://no-hay-upstream.invalid/…` a propósito. Es una de las **tres recetas
+cuya fuente sólo vive en el mirror** (ADR 0013; las otras son `ia-modelo-chat` y
+`firefox-pgo-profile`), y el mirror es un Storage Box por **sftp**. Fallan **dos cosas a la vez**:
+
+1. **El `curl` del corpus no habla sftp.** `takana` lo invoca por nombre y el PATH del lab pone
+ primero `/work/sergio/bin/curl` (8.20.0 musl, sin libssh2) ⇒ `curl: (1) Protocol "sftp" disabled`.
+ El de la imagen sí lo trae. **Mismo patrón que el `git` sin `remote-https`.**
+2. **La clave no está**: `~/.ssh/github5` no existe en el hub y `id_ed25519` no está autorizada en
+ el Storage Box (`(67) Authentication failure`).
+
+Arreglar una sola no destraba nada, y cada una falla con un error que no menciona a la otra. Anotado
+en `scripts/fuentes/mirror-env.sh`, que es donde alguien lo va a buscar.
+
+### El estado que queda
+
+```
+sealed 946 · debt 1 · ajeno 3
+base 85/85 · cli 153/153 · servidor 186/186 · mirada 41/41 · metal-tigerlake 7/7
+grafo: CIERRA | topo-sort: OK
+```
+
+Todas las imágenes completas. La única deuda del corpus es esa receta, y está esperando una
+credencial, no un compilador.
+
+⚠ **El manifiesto de sellados del worker no existía en este hub** (`work/farm-sellados.txt`), así
+que el grafo reportaba `never` sobre artefactos que sí existen. Se trajo a mano —es lo mismo que
+hace la cosecha, sin tocar el lock— y con él aparecen los 26 sellados que no están en el disco de
+esta máquina pero sí en el del worker.
diff --git a/scripts/fuentes/mirror-env.sh b/scripts/fuentes/mirror-env.sh
index 26c54b10..4ea8d533 100644
--- a/scripts/fuentes/mirror-env.sh
+++ b/scripts/fuentes/mirror-env.sh
@@ -29,5 +29,24 @@ export HAMMER_MIRROR="$TAKANA_MIRROR"
# de nombres distintos —`{sha256}.tar` vs `{commit}.bundle`— y se pueblan y se pierden por separado.
export TAKANA_MIRROR_GIT="${TAKANA_MIRROR_GIT:-${HAMMER_MIRROR_GIT:-sftp://u647150@u647150.your-storagebox.de:23/~/hammer/fuentes-git}}"
export HAMMER_MIRROR_GIT="$TAKANA_MIRROR_GIT"
+# ⚠⚠ DESDE LA JAULA `qorpa` EL MIRROR SFTP NO SE ALCANZA, Y FALLAN DOS COSAS A LA VEZ
+# (medido 2026-09-22 intentando construir `ia-modelo-embeddings`, que es de las tres recetas cuya
+# fuente SÓLO vive acá — las otras son `ia-modelo-chat` y `firefox-pgo-profile`):
+#
+# 1. **El `curl` del CORPUS no habla sftp.** `takana` lo invoca por nombre
+# (`takana-build/src/fetch.rs:649`, `Command::new("curl")`) y el PATH del lab pone primero
+# `/work/sergio/bin/curl` — 8.20.0 musl, SIN libssh2:
+# curl: (1) Protocol "sftp" disabled
+# El de la imagen (`/usr/bin/curl` 8.21.0, con libssh2/1.11.1) sí lo trae. Es el MISMO patrón
+# que el `git` sin `remote-https` que documenta CLAUDE.md: un binario del corpus compilado sin
+# una capacidad, y el PATH poniéndolo delante.
+# 2. **La clave no está.** `~/.ssh/github5` no existe en el hub, y la que hay (`id_ed25519`) NO
+# está autorizada en el Storage Box: con `/usr/bin/curl` se pasa de `(1) Protocol disabled` a
+# `(67) Authentication failure`. (El `(60) SSH remote key was not OK` previo es otra cosa: el
+# host no estaba en `known_hosts`; se resuelve con `ssh-keyscan -p 23`, y el TOFU acá es
+# inocuo porque el objeto se verifica por sha256 — ADR 0014, «el origen no necesita confianza».)
+#
+# ⇒ Arreglar sólo una de las dos no destraba nada, y cada una falla con un error que no menciona a
+# la otra. Lo que hace falta: un `curl` con sftp en el PATH **y** una clave autorizada.
export TAKANA_MIRROR_KEY="${TAKANA_MIRROR_KEY:-${HAMMER_MIRROR_KEY:-$HOME/.ssh/github5}}"
export HAMMER_MIRROR_KEY="$TAKANA_MIRROR_KEY"