Commit Graph
199 Commits
Author SHA1 Message Date
sergio 441c0dfba9 estado: cosecha granja 2026-07-18T19:01:00Z — avance del árbol KDE 2026-07-18 15:01:00 -04:00
sergio 01bfee7a6a estado: cosecha granja 2026-07-18T16:59:38Z — avance del árbol KDE 2026-07-18 12:59:39 -04:00
sergio 25ce9c0cce estado: cosecha granja 2026-07-18T16:22:58Z — avance del árbol KDE 2026-07-18 12:22:58 -04:00
sergio 70e31b9ff2 estado: cosecha granja 2026-07-18T10:30:40Z — avance del árbol KDE 2026-07-18 06:30:40 -04:00
sergio 1c73e38cb3 estado: cosecha granja 2026-07-18T10:00:50Z — avance del árbol KDE 2026-07-18 06:00:51 -04:00
sergio ee5f128594 estado: cosecha granja 2026-07-18T09:30:43Z — avance del árbol KDE 2026-07-18 05:30:43 -04:00
sergio 6c6cc9ec84 estado: cosecha granja 2026-07-18T06:00:28Z — avance del árbol KDE 2026-07-18 02:00:28 -04:00
sergio 509ec89608 estado: cosecha granja 2026-07-18T05:30:28Z — avance del árbol KDE 2026-07-18 01:30:28 -04:00
sergio 87fede06de estado: cosecha granja 2026-07-18T05:00:28Z — avance del árbol KDE 2026-07-18 01:00:28 -04:00
sergio 1b0af4ebf8 estado: cosecha granja 2026-07-18T04:30:27Z — avance del árbol KDE 2026-07-18 00:30:27 -04:00
sergio 9316604e2e estado: cosecha granja 2026-07-18T04:00:28Z — avance del árbol KDE 2026-07-18 00:00:28 -04:00
sergio a2d510edbb estado: cosecha granja 2026-07-18T03:30:28Z — avance del árbol KDE 2026-07-17 23:30:28 -04:00
sergio 6134dc7cb0 estado: cosecha granja 2026-07-18T03:00:34Z — avance del árbol KDE 2026-07-17 23:00:34 -04:00
sergio e59470b166 estado: cosecha granja 2026-07-18T02:31:17Z — avance del árbol KDE 2026-07-17 22:31:18 -04:00
sergio 58f0fe3000 estado: cosecha granja 2026-07-18T02:00:45Z — avance del árbol KDE 2026-07-17 22:00:45 -04:00
sergio 8c29fd0bd9 estado: cosecha granja 2026-07-18T01:31:33Z — avance del árbol KDE 2026-07-17 21:31:33 -04:00
sergio 037cb24d56 estado: cosecha granja 2026-07-18T01:01:03Z — avance del árbol KDE 2026-07-17 21:01:03 -04:00
sergio 8115d91072 estado: cosecha granja 2026-07-18T00:30:35Z — avance del árbol KDE 2026-07-17 20:30:35 -04:00
sergioandClaude Opus 4.8 2a52d7804f granja: cron infinito de cosecha+siembra (recoger/sembrar cada 30min) — latido sin tokens
El worker efímero muele KDE 24/7; este cron en el laptop recoge su store sellado
(worker->laptop, CAS merge seguro), siembra recetas nuevas (laptop->worker) y regenera
el grafo de estado, commiteando SÓLO docs/state/*.json (el avance que el humano sigue).
NO promueve incoming-kde->canónico (decisión de clasificación humana). Robusto a
worker-ausente (dead-man ya lo mató por idle). KDE: 66/206 sellado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 20:12:09 -04:00
sergio 7bf9af40b1 kde: qtbase + módulos Qt sellados (qtsvg/qtshadertools/qtlanguageserver); snapshot 2026-07-17 16:01:09 -04:00
sergioandClaude Fable 5 fd750c0b55 wawafs: §9 layouts de instalación — el corte ro/rw es de mounts, no de particiones (casos / único y /home+/var)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 16:00:30 -04:00
sergioandClaude Fable 5 50ca9ca300 wawafs (SDD 18): el store como FS del sistema vivo — CAS+erofs+fs-verity sobre ext4; gates medidos (kernel sin EROFS/FS_VERITY)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:42:25 -04:00
sergioandClaude Opus 4.8 b1322c8f47 kde: +base libs selladas (libtool/mpfr/libX*/xcb-util*/mtdev/libnl/libva/leptonica…)
Tanda de base libs KDE construidas en el laptop mientras qtbase compila en background. qtbase (la
raíz, ↑117) va por 400/2163 objetos. libsndfile falló por fetch de red (no código).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:45:38 -04:00
sergioandClaude Opus 4.8 ff79dc5e28 estado+kde: el grafo ahora cubre la cola incoming-kde; base KDE desbloqueada en el laptop
MOTIVO: 'estábamos haciendo kde'. La cola recipes/incoming-kde/ (206 recetas) era punto ciego del
grafo (sólo miraba recipes/ top-level). Modo --kde: build-state.py/build-state-view.py cubren la cola
KDE (sombreando canónicas homónimas sibling-first, como el sandbox) → build-state-kde.{json,html}.

CAUSA de la deriva (193/206 en deuda): fui YO — esta sesión re-sellé pkgconf y samurai (arreglos
static), y 194 recetas KDE declaran pkgconf, 142 samurai ⇒ re-hash en cascada de todo el árbol. El
sistema determinista funcionando: cambia un input base, cascan los dependientes. Deuda legítima.

DESBLOQUEO (el 'GUI rompe en el laptop' era sólo cairo/pango, NO la base): construida en el laptop
toda la base KDE guiado por el orden de ataque del grafo — extra-cmake-modules, util-macros,
xorgproto, xcb-proto, wayland, libdrm, dbus, icu4c, util-linux, fontconfig, pixman, glib, freetype,
harfbuzz, fribidi, libXau/libXdmcp, la cadena X11 (xtrans/libxcb/libX11/libXext/libXrender/libXfixes/
libXi), la familia xcb-util, libxkbcommon, wayland-protocols, mesa (24.0.9 iris-only, sin LLVM), y
los -shared. KDE 9→39 selladas. qtbase (↑117, la raíz) quedó DESBLOQUEADO y compilando.

DISCO: el build llenó el disco (100%). Liberados 82G borrando work/sources (57G, se re-extrae solo)
y .farm-harvest (26G, verificado 100% redundante en el store, CAS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:27:55 -04:00
sergioandClaude Opus 4.8 a267cf4f48 estado: clasificación Rust corregida (había ~180 Rust escondidas como C) + musl
Señal fuerte para Rust: la receta copia su binario de target/release/ en las fases. Medido 225
recetas, 0 con dep go ⇒ sin falsos positivos con Go (findutils entra bien: es uutils/findutils, find
en Rust). LÍMITE: un crate BuildSys::Cargo PURO sin fase install propia (zellij) no deja rastro en el
TOML y cae a 'c' — sólo se ve bajando la fuente, que el generador no hace.

Efecto: clases c 322→141, rust 45→226 (la mayoría eran Rust auto sin fase cargo explícita). Y la
LECTURA de la deuda cambia: la deuda C REAL es sólo 8 (casi toda saldada esta sesión), no 74. Lo que
queda es Rust (15, CLI pesados → granja), GUI (29 → granja), Go (5 → worker), kernel (4).

musl sellado (base). Avance: sealed 703→704, debt 53→52.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 12:36:23 -04:00
sergioandClaude Opus 4.8 d111b5f040 estado: sistema-base C saldado en el laptop (deuda 85→53, sealed 671→703)
Tres tandas más de C-base de sistema, todas verifican (MIENTEN 0): perl (background, desbloquea 8),
la cadena curl/ca-certificates/gnupg, y bwrap dosfstools e2fsprogs gzip htop iproute2 iputils jq kbd
lz4 libsodium libuv mandoc parted pciutils procps-ng rsync shadow strace usbutils dhcpcd git vim
wget openssh tmux xorriso wpa_supplicant libssh2.

Avance acumulado de la sesión: sealed 647→703 (+56), debt 109→53. La deuda C-base cayó 74→18, y de
esos 18 la mayoría son Rust CLI mal-clasificados como 'c' (amp/broot/delta/gitui/zellij…) + musl.
La deuda que queda es GUI (29, granja), Rust (5), kernel (4), go (5).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 12:33:05 -04:00
sergioandClaude Opus 4.8 748a0c7d29 estado: +14 C-base más selladas (deuda 101→85; C-base 74→50)
Segunda tanda de sistema-base en el laptop, todas C puras listas: libudev-zero mtdev libevdev npth
libusb libevent libassuan libksba socat less nano sed gawk doas. MIENTEN 0 en las link=static.

Avance acumulado de la sesión: sealed 647→671 (+24), debt 109→85. La deuda C-base bajó 74→50; la
GUI (29) sigue intacta para la granja, como manda el orden de ataque (glib/wayland/pixman ↑).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 12:08:04 -04:00
sergioandClaude Opus 4.8 0df9a9969b estado: +8 recetas C-base selladas (deuda 109→101)
Construidas y selladas en el laptop (C-base, listas, no-GUI, sistema): zstd (desbloquea 10), xz,
tar, tree, tzdata, tig, scdoc, when. Todas verifican: MIENTEN 0 en las link=static. Es progreso
real visible en el grafo — el resto de la deuda de alto impacto es GUI-céntrica (glib/wayland/pixman)
y va a la granja, como muestra el orden de ataque.

Snapshot del grafo actualizado: sealed 647→655, debt 109→101, never 8.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:54:39 -04:00
sergioandClaude Opus 4.8 a30e0d3146 estado: orden de ataque por impacto de desbloqueo (lectura accionable del DAG)
El grafo ahora computa, sobre las dependencias, dos campos por receta:
  blocked_by — deps que están en deuda (lo que impide construirla ya)
  unblocks   — cuántas recetas EN DEUDA la declaran como dep (su impacto de desbloqueo)

Una receta en deuda sin blocked_by es construible YA; ordenadas por unblocks desc, dan el orden que
libera el grafo más rápido. La vista muestra la pastilla ↑N en las filas listas y ordena por ahí.

Top de impacto (todo el stack GUI concentrado, más zstd/perl de C-base):
  glib ↑14  wayland ↑13  pixman ↑12  libdrm ↑11  fontconfig ↑11  zstd ↑10  libxkbcommon ↑9  perl ↑8

Es la guía para cuando se levante la granja: construir esas primero desbloquea el grueso.

De paso, diagnóstico de las 8 'never' (ninguna es cruft ni bug): dwarves BLOQUEADA-documentada
(necesita libdw, elfutils da sólo libelf a propósito — sub-proyecto elfutils-libdw); llimphi-counter
es un EJEMPLO/plantilla intencional; las otras 6 son imports Go/Rust que van al worker. Y confirmado
parseando: 0 recetas con FIXME real en el campo sha256 (el grep decía 43, todas comentarios) — otra
vez grep miente, el grafo (parsea) dice la verdad.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:48:28 -04:00
sergioandClaude Opus 4.8 e19fb6347f estado: vista humana del grafo (build-state-view.py → build-state.html)
Dashboard self-contained (sin recursos externos, tema claro/oscuro) que rinde build-state.json para
VER y SEGUIR: barra de avance del corpus, tiles por estado, reparto de deuda por clase, y los huecos
en ORDEN DE ATAQUE. Ese último es el uso accionable del grafo: cada receta en deuda muestra sus deps
coloreadas por estado; una fila 'lista' tiene todas sus deps al día (construible ya), una 'espera N'
depende de N recetas también en deuda. Foto actual: 117 en deuda, 71 listas ahora.

Publicado como Artifact para verlo en el navegador; el HTML también queda en el repo (abrir con
file://). Regenerar ambos: scripts/build-state.py && scripts/build-state-view.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:34:02 -04:00
sergioandClaude Opus 4.8 7f89a635a4 estado: grafo de build persistido y versionado (scripts/build-state.py → docs/state/build-state.json)
El estado real del build vivía disperso —en mi cabeza, en docs que envejecen (matar-gcc decía 47,
eran 16), en el store (que guarda TODOS los sellados históricos, no el vigente)— y cada medición a
mano mentía distinto. Este generador lo deriva de la ÚNICA fuente de verdad (recetas + hammer hash
+ store) a un JSON firme. El git diff de ese fichero ES el avance entre dos corridas: qué se saldó,
qué se rompió, qué cambió de estado.

NODO = receta {name, class, link, compiler, deps[], hash, state}:
  sealed  — el artefacto del hash VIGENTE está en el store (al día)
  debt    — hay sellados históricos pero ninguno vigente (cambió, falta rebuild)
  never   — sin ningún sellado
  unhashable — hammer hash falló (hueco real)
ARISTA = dep de build. El grafo CIERRA (0 deps huérfanas) y topo-ordena sin ciclos.

Foto inicial (764 recetas): sealed 647 | debt 109 | never 8. Deuda por clase: c=74 go=5 gui=29
kernel=4 rust=5. Clases: go 362, c 322, rust 45, gui 30, kernel 5.

Validado contra lo que sé de esta sesión: samurai/which sealed, curl/openssl debt, helix sealed
(rust/gcc), naabu sealed (dynamic/go), mesa debt (gui), linux debt (kernel). Todos correctos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:30:41 -04:00
sergioandClaude Fable 5 b7c0e434c0 cierre §3: alambre convergido — la clase es 'tz' (como emite runtime-policy.sh; en musl el locale va embebido), tawasuyu 799e5327e; los 3 artefactos de los planes promovidos+firmados al repo (linux-metal, libarchive, zlib-ng)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 04:28:37 -04:00
sergioandClaude Fable 5 9395fbfc5c piloto trace END-TO-END: build real de zlib trazado en store desechable — el hash REPRODUCE bit a bit el sellado (b3:2623a403), poda filosa (make 1/8 ficheros, busybox 1/2), taxonomía de ruido medida (+/cache al normalizador); harkaq-trace-build.sh orquesta (tracer por fase vía /proc/pid/root)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 04:08:08 -04:00
sergioandClaude Fable 5 7fa12ed7ce piloto harkaq-trace MEDIDO en builds reales: ceguera-overlay confirmada (0 eventos de store, 206 de binds) y salida validada — marcar /proc/<pid-bwrap>/root cae en el SB del overlay y los paths salen en el idioma de la política; zlib-ng SELLADA b3:93d1da8a al 1er intento; dwarves BLOQUEADA (elfutils sellado sin libdw ⇒ pide variante elfutils-libdw)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 00:05:54 -04:00
sergioandClaude Fable 5 a1b3b8642a cierre §3: carril Fable 5 HECHO — clases de servicio en tawasuyu 6eba521c6 (bits 8..12 + detalle musl + nombres de alambre); el cable attest-from las lleva gratis
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:38:39 -04:00
sergioandClaude Opus 4.8 d99ed58850 harkaq: revertir busybox (era runtime base, rompía builds) + coordinar el §3 con Fable 5
DOS ERRORES MÍOS, uno de dirección y otro técnico, los dos en la cosecha automática:

1. DIRECCIÓN: declaró `busybox` como dep en 29 recetas — cuando la Etapa C lo está
   ELIMINANDO (USERLAND_COMPONENTS=[uutils,findutils,…], ya cerrada; joyas-reusables
   §5 lo confirma: "uutils… Ubuntu 25.10 los envía como default"). Estaba cimentando
   la deuda que el roadmap borra.
2. TÉCNICO: busybox YA está en el runtime base de harkaq (`ro /bin/busybox`, `ro
   /bin/sh` — el sandbox corre `sh -c` y /bin/sh→/bin/busybox). Es CONTRATO, no dep.
   Declararlo apila el busybox de hammer sobre el de Alpine y ROMPE el build:
   binutils daba "cannot run C compiled programs" en las DOS máquinas. Verificado:
   sin busybox declarado, binutils construye (b3:f4507dcd…). Y la cadena se explica:
   binutils roto ⇒ zlib (que lo declara) tampoco construía.

Auditoría de la cosecha (diff real, no la línea completa del +): añadió sólo 5 deps
distintas — make ×73, busybox ×29, perl ×8, pkgconf ×5, binutils ×1. Sólo busybox
estaba mal; las otras 4 son deps reales medidas. busybox revertido de 30 recetas
(queda sólo en busybox.toml, pre-existente).

Es el mismo error que ya me habían señalado con otro disfraz: MEDIR BIEN Y ACCIONAR
MAL. harkaq midió correcto (el build toca /bin/busybox: es el shell); la acción
correcta no era declararlo sino reconocerlo como contrato.

+ COORDINACIÓN del §3 con Fable 5 (mismo diseño, tareas repartidas):
  - Su lección casper queda CONFIRMADA y REFORZADA: la clausura de build no sólo le
    FALTAN las clases del mundo (offline) — también le SOBRA casi todo (headers, gcc).
    Medido: htop (estático, 0 NEEDED) no toca NADA al correr ⇒ política = su binario.
  - Su "la clase viaja como campo de la ConcesionCapacidad, sin formato nuevo" se
    cumple LITERALMENTE: lo firmado es format::Permisos = u32 bitmask en 36 bytes
    canónicos (Ring 0) ⇒ las clases SON los bits. La cripto no se toca.
  - Diseño unificado: frontera (clases, u32, declaradas) + detalle (paths, Landlock,
    medidos). D3 rige en ambos.
  - Reparto: clases→Fable 5; medición/harness→Opus. CONTACTO: runtime-policy.sh ahora
    emite la CLASE detectada (/etc/resolv.conf→dns, /etc/ssl/certs→tls-certs, …), no
    sólo el path: la medición alimenta la tabla, la tabla decide el bit.
  - Consumidor esperando: plan-jaula-juegos F1 (Steam que no puede leer ~/.ssh).

+ juez.sh (§10): nombre único por corrida (con uno fijo pega en caché ⇒ falso
  "sin evidencia"). Fue el juez quien destapó todo esto en su primera corrida real.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 23:14:19 -04:00
sergioandClaude Fable 5 2e85dfc8a3 joyas #1 composefs: prototipo medido — hydrate 28ms vs mkcomposefs 507ms (métrica equivocada: lo que compra es verity por lectura + RO real + manifiesto 136KB firmable); hallazgo: objects/ por sha256-verity ⇒ mapa b3→verity al sellar
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:12:55 -04:00
sergioandClaude Fable 5 7f310005ea variantes-cpu T5 MEDIDO: zstd cortado (dispatch runtime, v3/v4=ruido con i7); zlib inconcluso pero la respuesta es zlib-ng; la lista caliente se concentra en mesa/códecs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:09:50 -04:00
sergioandClaude Fable 5 9c4ef8561c linux-metal: perfil escritorio/juego — NTSYNC, PREEMPT full+HZ_1000 explícitos, MGLRU, ZRAM, EROFS+FS_VERITY (sustrato composefs), split_lock_detect=off; sched-ext DIFERIDO (exige BTF que la receta apaga a propósito)
Deps de Kconfig verificadas contra el tag v6.16.12 (kernel.org):
NTSYNC sin deps; SCHED_CLASS_EXT depende de DEBUG_INFO_BTF ⇒ tarea propia
(receta dwarves + repro de BTF). Re-sellado disparado en el worker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:26:46 -04:00
sergioandClaude Opus 4.8 ec7ceb0915 harkaq: Q1-copy.fail RESPONDIDA — fs-verity mata el vector page-cache
El SDD 16 dejó abierto: '¿el vector page-cache de copy.fail sobrevive a un
ruleset que deniegue escritura a nivel de inode? Investigar antes de afirmar
nada'. Investigado en un fs AISLADO (loop en un worker efímero, nunca el fs del
usuario):

  escribir al artefacto sellado              → EPERM
  dd como ROOT                               → Operation not permitted (ni root)
  machacar los bytes POR DEBAJO (device)+leer→ Input/output error

El tercero ES el vector de copy.fail: modificar el fichero por debajo del fs. El
kernel detecta la corrupción AL LEER (el Merkle no cuadra) y rechaza la lectura.
⇒ fs-verity mata el vector. Landlock read-only no alcanzaba; fs-verity sí.

Costo medido, y corrige al SDD 17 §5: 'hash = identidad' es FALSO — fs-verity usa
Merkle SHA-256, hammer direcciona con BLAKE3 ⇒ son DOS hashes, no uno. Y ext4
exige -O verity Y blocksize = PAGE_SIZE (con 1024 el mount falla:
'Unsupported blocksize for fs-verity'). No es gratis, pero es barato para lo que da.

NO se tocó el fs del laptop (habilitar verity pediría tune2fs sobre la partición
del usuario): el experimento corrió en un loop device de un worker descartable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 22:17:01 -04:00
sergioandClaude Fable 5 272125b93a joyas reusables: composefs, PGO/BOLT con perfil sellado, mimalloc, MGLRU, uutils, corpus Clear Linux, reglas ananicy — cada una con su pieza receptora
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:16:02 -04:00
sergioandClaude Fable 5 6ef9f2b4a8 cierre §3: lección casper aterrizada — clases de servicio declaradas + mapa clase→permiso musl (plan-freebsd T2.1-T2.2 HECHAS)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:16:02 -04:00
sergioandClaude Fable 5 6e1ebfd001 plan jaula-juegos: kernel (NTSYNC/sched-ext/cmdline), nativos (gamescope/scx/mesa-RADV), jaula glibc por fases (flatpak → SLR sellado) con política harkaq
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:10:35 -04:00
sergioandClaude Fable 5 ed99fcf1ee plan variantes-cpu: x86-64-v3 sobre el CAS — selección en hydrate (musl sin hwcaps), lista caliente estilo Solus, piloto zlib/zstd
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:10:35 -04:00
sergioandClaude Fable 5 8ff8c1b820 plan freebsd: traza positiva (filemon/META MODE) + taxonomía casper para cierre §3 + libarchive al catálogo
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:03:24 -04:00
sergio 0f6c841782 mirada-usb: force_gpt en la cmdline + post-mortem del viaje NVIDIA
El firmware del tester reparo el GPT dd-eado en el POST y dejo el header
primario invalido (entradas apuntadas a LBA 2016, presentes en LBA 2):
Linux sin gpt en cmdline no cae al respaldo, no vio particiones y la
telemetria MIRADALOG murio en RAM. Con gpt el kernel usa el respaldo.
Documentado: greeter por nouveau GL validado en metal; input muerto queda
abierto con el plan de evidencia para el proximo viaje.
2026-07-16 12:16:04 -04:00
sergioandClaude Opus 4.8 35f58aa75b harkaq: granja con volumen + auto-shutdown VALIDADA end-to-end
Test real (worker + volumen + helper), no en el papel. Las 3 piezas:
  1. worker midió lz4+bzip2 → volumen
  2. tras 1 ciclo idle SE AUTO-ELIMINÓ (verificado: el server desapareció solo)
  3. volumen SOBREVIVIÓ con los 2 verdicts; helper efímero ccx13 los recogió al
     hub y se auto-destruyó

3 bugs cazados EN EL TEST (no adivinados):
  - falta --exclude /work: work/=69GB colgó el rsync del up horas
  - cpx11 'unsupported' en hel1 (AMD sin stock) → ccx13
  - collect llamaba harvest con 'local' (rsync a un worker inexistente): ahora
    sólo recoge; clasificar es paso aparte (worker mide, hub clasifica)

+ auto-delete por API REST (curl+metadata), NO hcloud CLI (la golden no lo trae).
El ID propio sale del metadata service, no del nombre.

Cierra los 2 huecos de la 1ª campaña: idle cobrando (ahora auto-delete) y
dependencia de que yo esté viva (ahora el volumen persiste). Runbook:
docs/runbooks/harkaq-granja-volumen.md. Volumen clausurado tras el test (€0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 07:47:36 -04:00
sergioandClaude Opus 4.8 7206626e25 harkaq: el disparo de cosecha es loop nohup, NO cron (arje-zero es PID1)
El laptop corre arje-zero como init (no systemd, systemctl no existe) y no tiene
crond activo. El crontab que instalé anoche corrió 0 veces: validé que la LÍNEA
corría a mano, nunca que un daemon fuera a dispararla. Mismo patrón que me mordió
toda la sesión — validar la pieza, no el sistema.

Disparo real: scripts/farm/harvest-loop.sh con setsid nohup. Sobrevive el fin de
sesión, no un reboot (eso pediría un servicio /etc/init.d, con root).

+ 2 bugs del harvest arreglados: flock anti-solape (dos ciclos editando+commiteando
a la vez = árbol corrupto) y el rescate rechazaba recetas legítimas por la línea
en blanco que add-deps añade (el + vacío no matcheaba [deps].build).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 06:31:34 -04:00
sergioandClaude Opus 4.8 32e8ac557d harkaq: runbook de la campaña desatendida (worker + cron, para retomar sin mí)
Estado escrito en el repo y no en mi cabeza: la campaña tiene que sobrevivir a
que yo desaparezca al final del turno. Qué corre, dónde, cómo revisarlo por la
mañana, cómo pararlo, y los rastrillos que ya se pagaron (el cd del cron, el
pull sucio, cargo fuera del PATH).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 23:09:32 -04:00
sergioandClaude Opus 4.8 1e0bc98ad4 matar gcc: rollout de cmake HECHO en la granja — y los consumidores no hacían falta
cmake reconstruido en un worker efímero (regla: la cadena GUI no se rebuildea en
el laptop, el zig-skew rompe cairo) y cosechado al hub:
    b3:834132e7…-cmake   NEEDED = sólo libc.musl-x86_64.so.1
El viejo (99864dcc…, con libstdc++.so.6 + libgcc_s.so.1) queda en el store por si
algo lo referencia.

LOS 10 CONSUMIDORES NO SE RECONSTRUYERON, Y NO HACE FALTA. El fix quita la
dependencia de RUNTIME del artefacto DE CMAKE. Los consumidores sólo lo usaron
como HERRAMIENTA DE BUILD — sus artefactos no linkean libstdc++. Rebuildearlos
sólo daría frescura de hash, y eso pasa solo en su próximo build. Confundir "usó
la herramienta" con "linkea la librería" habría costado un rebuild de gtk4 para
nada. (Yo mismo había propuesto los 11; el radio real es 1.)

REGALO DEL ROLLOUT: el worker (Ubuntu 24.04, ccx23) y el laptop (CachyOS)
produjeron cmake con el MISMO HASH, bit a bit — el invariante central de hammer
confirmándose entre dos máquinas distintas sin que nadie lo buscara. Y como los
bytes son idénticos, el NEEDED del worker queda verificado por transitividad: no
hizo falta readelf allá (que además no está instalado en la golden).

Limpieza: removido store/834132e7…-cmake-nogcc (mi artefacto experimental).
harkaq-suggest INDEXA el store, así que un artefacto huérfano aparecería como
"proveedor" de paths y ensuciaría los diagnósticos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 20:53:11 -04:00