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…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

harkaq: declarar deps medidas por el kernel (cosecha automática)

Cosecha desatendida de la campaña harkaq. Cada dep de acá la denunció el audit de
Landlock en un build real: el kernel vio al build usarla sin declararla, y el
store del hub confirma qué artefacto la provee (deuda DECLARABLE, §4.5).

Recetas:coreutils elfutils expat file flex gawk

No se tocó ninguna receta con deuda IRREDUCIBLE: declarar algo que el store no
provee rompería el build en vez de arreglarlo. Esas van a tandas/needs-review-harkaq.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

7ec2e86b7b4a149f23ccd3f31ce80f07f22889f1 · por sergio · (hace 3 meses) · padre 8f94b8a25 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

8 archivos · +54 −2

diff --git a/recipes/coreutils.toml b/recipes/coreutils.toml
index 972507ee..e6b90a55 100644
--- a/recipes/coreutils.toml
+++ b/recipes/coreutils.toml
@@ -31,6 +31,9 @@ link     = "static"
 # gettext (ausente). Las flags van al ./configure (AutoconfReady).
 flags    = ["--enable-single-binary", "--disable-nls"]
 
+[deps]
+build = ["busybox", "make"]
+
 [build.phases]
 # install por defecto (make install DESTDIR=/out) deja el multicall en /out/usr/bin/coreutils; lo
 # relocamos a /out/bin/coreutils, que es donde apuntan los symlinks del toolchain Alpine (/bin/cp →
diff --git a/recipes/elfutils.toml b/recipes/elfutils.toml
index 5d3169d9..539f2254 100644
--- a/recipes/elfutils.toml
+++ b/recipes/elfutils.toml
@@ -31,6 +31,9 @@ target      = "x86_64-linux-musl"
 link        = "dynamic"
 zig_version = "0.13.0"
 
+[deps]
+build = ["binutils"]
+
 [build.phases]
 configure = """
 mkdir -p compat && \
diff --git a/recipes/expat.toml b/recipes/expat.toml
index 5c533320..2069b956 100644
--- a/recipes/expat.toml
+++ b/recipes/expat.toml
@@ -13,6 +13,9 @@ target   = "x86_64-linux-musl"
 link     = "static"
 flags    = []
 
+[deps]
+build = ["make"]
+
 [build.phases]
 # --with-pic: el .a estático lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libexpat en
 # libgallium/xmlconfig; sin PIC: «R_X86_64_PC32 ... recompile with -fPIC»). PIC es superset.
diff --git a/recipes/file.toml b/recipes/file.toml
index 34d280d9..a661fa31 100644
--- a/recipes/file.toml
+++ b/recipes/file.toml
@@ -17,6 +17,9 @@ target   = "x86_64-linux-musl"
 link     = "static"
 flags    = []
 
+[deps]
+build = ["make"]
+
 [build.phases]
 # de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
 compile = '''
diff --git a/recipes/flex.toml b/recipes/flex.toml
index 9bf025df..21a6ef25 100644
--- a/recipes/flex.toml
+++ b/recipes/flex.toml
@@ -24,6 +24,9 @@ link       = "dynamic"
 # bueno por-receta ⇒ gcc deja de hacer falta (toolchain 100% zig). No es input del 4/4. SDD 11 §7.2b.
 zig_version = "0.13.0"
 
+[deps]
+build = ["busybox"]
+
 [build.phases]
 configure = "./configure --prefix=/usr --disable-nls --disable-shared"
 compile   = "make -j\"$(nproc)\""
diff --git a/recipes/gawk.toml b/recipes/gawk.toml
index d436ea4a..d3e11c2c 100644
--- a/recipes/gawk.toml
+++ b/recipes/gawk.toml
@@ -17,6 +17,9 @@ target   = "x86_64-linux-musl"
 link     = "static"
 flags    = []
 
+[deps]
+build = ["busybox", "make"]
+
 [build.phases]
 # de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
 compile = '''
diff --git a/scripts/farm/harvest-harkaq.sh b/scripts/farm/harvest-harkaq.sh
index fa6f6a64..cf37fd63 100755
--- a/scripts/farm/harvest-harkaq.sh
+++ b/scripts/farm/harvest-harkaq.sh
@@ -26,6 +26,16 @@ set -u
 HUB="$(cd "$(dirname "$0")/../.." && pwd)"
 cd "$HUB"
 WORKER="${1:?uso: harvest-harkaq.sh root@<ip>}"
+
+# LOCK: dos cosechas a la vez editarían recetas y harían `git commit` en paralelo = árbol
+# corrupto. El harvest es lento (re-indexa el store por veredicto), así que un ciclo puede pisar
+# al siguiente. flock con -n: si ya hay una corriendo, esta sale limpia en vez de solaparse.
+LOCK="$HUB/work/.harvest-harkaq.lock"
+exec 9>"$LOCK"
+if ! flock -n 9; then
+    echo "$(date -u +%FT%TZ) otra cosecha en curso, salto este ciclo"
+    exit 0
+fi
 SSH_KEY="${SSH_KEY:-$HOME/.ssh/github5}"
 REMOTE="${REMOTE:-/opt/hammer}"
 SSH="ssh -i $SSH_KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes"
@@ -81,8 +91,13 @@ done
 # que el diff SÓLO toque la línea `build = [...]`, para no arrastrar trabajo de otro agente.
 for f in $(git diff --name-only -- 'recipes/*.toml' 2>/dev/null); do
     case " $tocadas " in *" $f "*) continue ;; esac
-    if git diff -U0 -- "$f" | grep -E '^[-+]' | grep -vE '^(---|\+\+\+)' | grep -qvE '^[-+]\s*(build\s*=|\[deps\])'; then
-        echo "   ·· $f — modificado con algo que no es `[deps].build`: NO lo toco (¿otro agente?)"
+    # ¿el diff toca SÓLO `[deps]`/`build =`? Se ignoran las líneas en blanco añadidas/quitadas
+    # (`^[+-]\s*$`): add-deps mete un `\n` tras el bloque y ese `+` vacío hacía que el filtro
+    # rechazara recetas legítimas (flex, gawk…) como "de otro agente". Y el mensaje usa comillas
+    # SIMPLES: con dobles, el `[deps].build` entre backticks se ejecutaba como comando.
+    if git diff -U0 -- "$f" | grep -E '^[-+]' | grep -vE '^(---|\+\+\+)' \
+         | grep -vE '^[-+]\s*$' | grep -qvE '^[-+]\s*(build\s*=|\[deps\])'; then
+        echo '   ·· '"$f"' — el diff toca algo que no es [deps].build: NO lo toco (¿otro agente?)'
     else
         tocadas="$tocadas $f"
         echo "   ↻ $f — pendiente de un ciclo anterior, se commitea ahora"
diff --git a/scripts/farm/harvest-loop.sh b/scripts/farm/harvest-loop.sh
new file mode 100755
index 00000000..861bce09
--- /dev/null
+++ b/scripts/farm/harvest-loop.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+# harvest-loop.sh — disparador de la cosecha harkaq SIN cron. Este laptop corre `arje-zero` como
+# PID 1 (no systemd), no tiene crond activo y `crond` como usuario falla (necesita root para el
+# pidfile). Instalé un crontab que NADIE leía: corrió 0 veces en toda la noche. Un loop nohup es
+# el mecanismo que de verdad funciona acá — sin root, y sobrevive al fin de la sesión.
+#
+#   nohup scripts/farm/harvest-loop.sh root@<ip> >>work/harvest-harkaq.log 2>&1 &
+#
+# NO sobrevive un reboot del laptop (a diferencia de un servicio en /etc/init.d, que necesitaría
+# root). Tras reiniciar, relanzarlo. Parar: `pkill -f harvest-loop`.
+set -u
+cd "$(dirname "$0")/../.."
+WORKER="${1:?uso: harvest-loop.sh root@<ip>}"
+INTERVALO="${INTERVALO:-1800}"
+echo "$(date -u +%FT%TZ) harvest-loop arrancado (worker $WORKER, cada ${INTERVALO}s)"
+while :; do
+    scripts/farm/harvest-harkaq.sh "$WORKER" || echo "$(date -u +%FT%TZ) ciclo falló, sigo"
+    sleep "$INTERVALO"
+done