plan: el paso 6, hecho — busybox fuera de las imágenes
`busybox → perfiles: NINGUNO`. Queda escrito por qué la dep era redundante (el sandbox monta el rootfs Alpine entero y ése ya trae busybox), la medición que lo probó (zlib-ng sin la dep sella igual), y el tropiezo del cambio mecánico: el regex pegó en una línea de comentario en jq y linux, y la comprobación que hay que hacer siempre en un cambio masivo sobre ficheros con prosa es `git diff` mirando que ningún comentario se haya movido. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +43 −0
- docs/plan-botar-busybox.md +43 −0
diff --git a/docs/plan-botar-busybox.md b/docs/plan-botar-busybox.md
index 399bd885..f7d3769b 100644
--- a/docs/plan-botar-busybox.md
+++ b/docs/plan-botar-busybox.md
@@ -1574,3 +1574,46 @@ credencial, no un compilador.
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.
+
+---
+
+# Paso 6 — busybox sale de las build-deps, y con eso de las IMÁGENES (2026-09-22)
+
+> **`busybox → perfiles: NINGUNO`.** Era el paso que de verdad lo saca del producto.
+
+`busybox` **nunca estuvo declarado en `targets.toml`** (cero menciones): llegaba a los 7 perfiles
+por la **clausura**, porque 24 recetas lo pedían en `[deps] build`. Quitarlo de ahí lo saca de todas
+las imágenes sin escribir una línea de userland.
+
+## La dep era redundante, y se midió antes de tocar las 24
+
+El sandbox monta el **rootfs Alpine completo** (`.dev-fs/alpine`) como base read-only
+(`takana-build/src/sandbox.rs:4`), y ese rootfs **ya trae su propio busybox**: el shell y los
+coreutils del build salen de ahí. La dep sólo añadía el busybox de takana encima.
+
+| comprobación | resultado |
+|---|---|
+| `zlib-ng` sin la dep | ✅ sella igual (`b3:f2439671`) |
+| recetas que MENCIONAN busybox en sus fases | **ninguna** de las 23 |
+| las 4 que lo nombran (`e2fsprogs kbd vim networkmanager`) | lo hacen en **comentarios** |
+
+## El tropiezo del cambio mecánico
+
+Dos recetas se resistieron: `jq` y `linux`. El regex con `count=1` pegó en una línea de
+**comentario** que también dice `build = [` —las dos documentan sus deps en prosa— y, como ahí no
+había busybox, la sustitución no cambiaba nada y el fichero no se escribía. El efecto fue dejar
+intacta la dep real de más abajo. Arregladas a mano, y verificado con `git diff` que **ningún
+comentario quedó alterado** en las otras 22: un cambio masivo sobre ficheros con prosa necesita esa
+comprobación, no basta con que el resultado parezca correcto.
+
+## Lo que queda de busybox
+
+Ya no está en ninguna imagen. Lo que sigue es el **frente C**, que es ADR y toca la evidencia de
+reproducibilidad:
+
+- `STAGE1_COMPONENTS` (`takana-bootstrap/src/lib.rs:172`) — es 1 de los 4 del self-host
+- `ATTEST_PATHS` (`:465`) — `bin/busybox` está atestado
+- dos cards con `exec "/bin/busybox"`: la consola (`:240`) y sshd (`:429`)
+
+Y los **47 applets** del censo, que ya no viajan en ninguna imagen pero siguen siendo el inventario
+de lo que el producto tendría que proveer por otra vía el día que el frente C se cierre.