Commit Graph
1739 Commits
Author SHA1 Message Date
SergioandClaude Opus 5 486bf7bb22 SDD 28 §6.25: api.sergio.gioser.net sirve desde la caja, dentro de una jaula qorpa
El primer servicio AJENO que corre sobre takana. 200 con TLS publico desde 2.29.29.217 y
`/api/chat/` contestando con Gemini de verdad, con el backend en una instancia `qorpa` sobre el
rootfs de Arch pineado por sha256, supervisado por arje-zero como el ente `sergioh-api`.

Es el que §6.21 llamo «lo que decide la fecha de borrado de gioser»: su venv trae extensiones
`cpython-314-...-linux-gnu.so`, o sea glibc, y no tiene camino a musl. La coincidencia que lo hizo
barato: el Arch pineado trae python 3.14.7 y el venv de gioser es 3.14.6 — misma serie, asi que el
venv se REHACE adentro con pip en vez de copiarse.

La seccion trae ademas el muro (la jaula no viajaba en ninguna imagen — commit anterior), los tres
tropiezos del camino (el uid 1001 del rsync que cae fuera del userns; una instancia admite UN solo
`run`; `ps` que no ve procesos y `dig` que no existe, dos ausencias que se leen como diagnostico) y
lo que quedo declarado: `instance.toml` con un unico dir concedido, las 84 deps pineadas en
`requirements.lock`, y la tarjeta en cards.d Y en el genesis.

Y una correccion de rumbo en §9: la lista «lo que falta para el cutover» era del 11-09 y sus pasos
1-5 ya estan hechos. Lo que sigue vivo en gioser son TRES vhosts, no quince.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 17:31:00 +00:00
SergioandClaude Opus 5 dbfb7d492b la jaula no viajaba en NINGUNA imagen: bwrap y harkaq-exec entran a perfil.base
Mudando `api.sergio.gioser.net` a la caja de produccion, `takana qorpa provision` aborto:

    Error: no encuentro harkaq-exec en /root/.cache/harkaq/harkaq-exec
      construilo:  gcc -O1 -Wall -static -o ... scripts/harkaq/harkaq-exec.c

El mensaje es bueno y la receta que propone es IMPOSIBLE de seguir: en una caja instalada no hay
gcc, ni `scripts/`, ni arbol de desarrollo. El binario solo existia como un `gcc` a mano en la
cache de `$HOME` del hub, o sea que la jaula del ADR 0015 funcionaba unicamente en la maquina
donde alguien la habia compilado.

Y su companero estaba igual, medido en `build-state.json`: `bwrap` sellado desde hace meses con
`"perfiles": []` — CERO perfiles. Lo invocan por PATH tanto `qorpa` como el sandbox de
`takana build` (`takana-build/src/sandbox.rs`), asi que **ninguna imagen de takana podia enjaular
nada, ni construir**. Es [[subcomando-sin-driver]] un piso mas abajo: el CLI que los llama viaja
en todas las imagenes y sus herramientas en ninguna.

Tres piezas:

· `recipes/harkaq-exec.toml` — nueva. Estatico musl, `b3:cd34954f...`, 269 K. El pin va al commit
  que toco la FUENTE (`1d9ddcee`, 2026-09-03) y no a HEAD: el `.c` no se mueve desde entonces y el
  repo commitea cada media hora por el cron de la cosecha — pinear HEAD re-hashearia la receta cada
  media hora sin que su fuente cambiara. La fuente sigue en `scripts/harkaq/` y no en un arbol
  propio porque tres scripts la compilan desde ahi y dos copias divergen en silencio.
· `qorpa.rs` — busca el binario tambien en `/usr/bin`, que es de donde sale en cualquier maquina
  que no sea el hub. El orden es HARKAQ_BIN (lo que el operador declara) → arbol de desarrollo →
  paquete, para que un cambio en la jaula se pruebe sin instalar nada. Y el error ya nombra las
  dos salidas, no solo la del hub.
· `targets.toml` — los dos en `perfil.base`.

Medido en la caja de produccion tras aplicarlos: `bwrap 0.11.0` + harkaq-exec responden, y
`takana qorpa provision sergioh-api` instala python 3.14.7 con pacman DENTRO de la jaula
(`[harkaq] jaula puesta: ABI 9`). El 3.14 no es casualidad: el venv de gioser trae extensiones
`cpython-314-...-gnu.so`, asi que la imagen de Arch pineada da la misma serie.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 17:17:42 +00:00
Sergio 9bb1308a5b estado: cosecha granja 2026-09-15T17:01:48Z — avance del árbol KDE 2026-09-15 17:01:48 +00:00
Sergio b8c4c50268 estado: cosecha granja 2026-09-15T16:31:46Z — avance del árbol KDE 2026-09-15 16:31:46 +00:00
Sergio 16493462b6 estado: cosecha granja 2026-09-15T16:01:41Z — avance del árbol KDE 2026-09-15 16:01:41 +00:00
Sergio 69f70db0c7 estado: cosecha granja 2026-09-15T15:31:21Z — avance del árbol KDE 2026-09-15 15:31:21 +00:00
Sergio fbb612d004 estado: cosecha granja 2026-09-15T15:02:29Z — avance del árbol KDE 2026-09-15 15:02:29 +00:00
Sergio 86f851455f estado: cosecha granja 2026-09-15T14:32:01Z — avance del árbol KDE 2026-09-15 14:32:01 +00:00
Sergio 046553670b estado: cosecha granja 2026-09-15T14:02:02Z — avance del árbol KDE 2026-09-15 14:02:02 +00:00
Sergio d13d11c3ed estado: cosecha granja 2026-09-15T13:31:21Z — avance del árbol KDE 2026-09-15 13:31:21 +00:00
Sergio db77af65e5 estado: cosecha granja 2026-09-15T13:01:40Z — avance del árbol KDE 2026-09-15 13:01:40 +00:00
Sergio 10e1e9ffb0 estado: cosecha granja 2026-09-15T12:31:33Z — avance del árbol KDE 2026-09-15 12:31:33 +00:00
Sergio d0a2da67db estado: cosecha granja 2026-09-15T12:01:21Z — avance del árbol KDE 2026-09-15 12:01:21 +00:00
Sergio 575679a4bd estado: cosecha granja 2026-09-15T11:31:16Z — avance del árbol KDE 2026-09-15 11:31:16 +00:00
Sergio 8541febca5 estado: cosecha granja 2026-09-15T11:01:39Z — avance del árbol KDE 2026-09-15 11:01:39 +00:00
Sergio fe1278c81d estado: cosecha granja 2026-09-15T10:32:01Z — avance del árbol KDE 2026-09-15 10:32:01 +00:00
Sergio 94e60c0340 estado: cosecha granja 2026-09-15T10:01:16Z — avance del árbol KDE 2026-09-15 10:01:16 +00:00
Sergio e479ccd269 estado: cosecha granja 2026-09-15T09:31:17Z — avance del árbol KDE 2026-09-15 09:31:17 +00:00
Sergio e2b03b9b90 estado: cosecha granja 2026-09-15T09:01:19Z — avance del árbol KDE 2026-09-15 09:01:19 +00:00
Sergio 92215bf937 estado: cosecha granja 2026-09-15T08:31:39Z — avance del árbol KDE 2026-09-15 08:31:39 +00:00
Sergio d13d14ef10 estado: cosecha granja 2026-09-15T08:01:40Z — avance del árbol KDE 2026-09-15 08:01:40 +00:00
Sergio 13494bee5d estado: cosecha granja 2026-09-15T07:31:19Z — avance del árbol KDE 2026-09-15 07:31:19 +00:00
Sergio 6faa9927a5 estado: cosecha granja 2026-09-15T07:01:17Z — avance del árbol KDE 2026-09-15 07:01:17 +00:00
Sergio cdd1eb6d2c estado: cosecha granja 2026-09-15T06:31:23Z — avance del árbol KDE 2026-09-15 06:31:23 +00:00
Sergio d8d5dff113 estado: cosecha granja 2026-09-15T06:01:19Z — avance del árbol KDE 2026-09-15 06:01:19 +00:00
Sergio 798e45c539 estado: cosecha granja 2026-09-15T05:31:14Z — avance del árbol KDE 2026-09-15 05:31:14 +00:00
Sergio 362250c877 estado: cosecha granja 2026-09-15T05:01:18Z — avance del árbol KDE 2026-09-15 05:01:18 +00:00
Sergio c34a3f2508 estado: cosecha granja 2026-09-15T04:31:17Z — avance del árbol KDE 2026-09-15 04:31:17 +00:00
Sergio 6f1520f60d estado: cosecha granja 2026-09-15T04:01:16Z — avance del árbol KDE 2026-09-15 04:01:16 +00:00
Sergio 12943b3d1f estado: cosecha granja 2026-09-15T03:31:14Z — avance del árbol KDE 2026-09-15 03:31:14 +00:00
Sergio aa3dacea4a estado: cosecha granja 2026-09-15T03:01:14Z — avance del árbol KDE 2026-09-15 03:01:14 +00:00
Sergio 15cfcd769d estado: cosecha granja 2026-09-15T02:31:14Z — avance del árbol KDE 2026-09-15 02:31:14 +00:00
Sergio 7cedd90c09 estado: cosecha granja 2026-09-15T02:01:16Z — avance del árbol KDE 2026-09-15 02:01:16 +00:00
Sergio 17317a2d5a estado: cosecha granja 2026-09-15T01:31:14Z — avance del árbol KDE 2026-09-15 01:31:14 +00:00
Sergio 889623afe3 estado: cosecha granja 2026-09-15T01:01:21Z — avance del árbol KDE 2026-09-15 01:01:21 +00:00
Sergio e428f6b092 estado: cosecha granja 2026-09-15T00:31:34Z — avance del árbol KDE 2026-09-15 00:31:34 +00:00
SergioandClaude Opus 5 3df94f3936 SDD 31: el compilador de Rust — el escalón 2 construyendo, y los cinco muros del camino
rustc desde fuente está compilando el stage1 en el worker. El documento recoge el frente entero: el
hueco medido (12 crates y 42 555 líneas de Rust, 44 recetas `cargo-*`, CERO de rustc, y el `rustc`
que construye todo eso saliendo del LAB — que ENTRA en el ArtifactHash), los tres escalones, y lo
que costó cada uno.

Los cinco muros del escalón 2, todos con un mensaje que no nombra la causa:

1. `llvm18` no sirve: `bad LLVM version, need >=21`. Mínimos medidos en el propio bootstrap
   (1.87→18 · 1.90→19 · 1.93/1.95→20 · 1.97→21). Bajar de rustc no es salida porque el stage0 de N
   es N-1 o N. De ahí `llvm21` — y `llvm18` se queda, que lo usa mesa.
2. **El toolchain musl oficial no puede producir proc-macros** (crt-static=true ⇒ sin dylibs):
   muere compilando el propio bootstrap de rustc, que usa `clap` con derive. Sirve para compilar
   programas, no para arrancar el build de rustc. El stage0 es el del lab.
3. x.py DESCARGA el stage0 si no le nombras el local: en un sandbox sin red, `RuntimeError: failed
   verification` en `download_toolchain()`, que no menciona ni la red ni el stage0.
4. El triple de Alpine no es el canónico: sin fijarlo, la sección `[target.…-unknown-…]` no aplica a
   nada y x.py se pone a construir LLVM solo; forzando el canónico, el stage0 no tiene su std.
5. cmake + zig = «compiler broken» en la prueba de ABI. CC=gcc, igual que llvm21 y cmake.

Y del escalón 1, lo que no estaba en el grafo: el prebuilt no ejecuta sin `musl-shared` (cargador) y
sin `gcc-libs` (`libgcc_s.so.1`) — dos paquetes sellados y en el perfil equivocado. Más una
propiedad que vale: no hace falta un `cc`, el toolchain trae su propio lld.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
2026-09-15 00:29:33 +00:00
Sergio 798cfab7e8 atuq: el 117x70 lo pide el CLIENTE, no el compositor
Ordenando el protocolo numerado en los dos sentidos: cosmic-comp manda
configure_bounds(0,0)+configure(0,0) («elegi vos»), el cliente contesta
set_min_size(117,37), set_max_size(348,16332) y set_window_geometry(117,70),
y RECIEN ahi el compositor devuelve configure(117,70) teniendo 1280x692
para dar. No hay nada que arreglar en COSMIC.

El MOZ_LOG dice como: «Initial resize to 1 x 1» — Gecko crea la ventana de
1x1 y nunca la agranda; 117x70 es lo que queda cuando el chrome se mide a
si mismo. El frente se mueve a Gecko.
2026-09-15 00:28:49 +00:00
Sergio f4a78e8b03 estado: cosecha granja 2026-09-15T00:01:40Z — avance del árbol KDE 2026-09-15 00:01:40 +00:00
Sergio 1a4da25989 estado: cosecha granja 2026-09-14T23:31:38Z — avance del árbol KDE 2026-09-14 23:31:38 +00:00
Sergio 30765ca376 estado: gocryptfs cerrado — CERO no-determinismos vigentes en el corpus
Las otras tres recetas cgo (sq, usql, gitea) dan DERIVA, no no-determinismo: sus dos
reconstrucciones coinciden entre sí y el artefacto guardado era el de antes del arreglo.
Ya están al día.

Y de paso se les fue una deuda que NO era de reproducibilidad sino de PORTABILIDAD: el
`x_cgo_sigaction` de sq y usql —código C de cgo, sin guarda de CPU en runtime— venía con
AVX2 horneado, de cuando el driver pisaba el `-mcpu=baseline`. Un binario así no falla al
construir ni al sellar: falla al EJECUTAR en una CPU sin AVX2, con SIGILL. Ahora los tres
salen baseline (cero ymm, cero zmm en esa función).

── El límite del libro, anotado en su encabezado ──────────────────────────────────────
`gocryptfs` acabó con CUATRO filas al MISMO hash: dos NO-DETERMINISMO y dos reproduce, y
las cuatro son ciertas. La clave (receta, hash) no puede distinguir antes y después de un
arreglo del FRAMEWORK, porque la fase generada no entra en `hash_inputs` — a propósito,
para no re-sellar 362 recetas cada vez que se toca un driver.

Corolario, que es lo caro: tras tocar un driver, lo sellado NO se rehace solo. Hay que
forzarlo receta por receta, y si nadie lo hace el store se queda con artefactos que ya
nadie construiría así.
2026-09-14 23:10:29 +00:00
Sergio 33056de44b estado: cosecha granja 2026-09-14T23:03:01Z — avance del árbol KDE 2026-09-14 23:03:01 +00:00
Sergio 1728a77a3a go/cgo: GOTMPDIR fuera del módulo — era la única causa del no-determinismo de gocryptfs
`gocryptfs` era el último no-determinismo vigente del corpus. Ya REPRODUCE.

── La medición, que primero hice mal ──────────────────────────────────────────────────
Comparé los dos ficheros de `store/.divergen/` y salían 1.874.136 bytes distintos, con
`.text` entre ellos y funciones de OpenSSL cambiando de AVX2 a AVX-512. Era el par
EQUIVOCADO: `.divergen/<D>` es el artefacto VIEJO archivado, no una reconstrucción. El
par que define el veredicto es `<D>.r1` (1ª reconstrucción) contra el que queda en el
store (2ª).

Comparado bien, el no-determinismo son **7 bytes, todos en `.debug_str`**: los dígitos
de `go-build598798091` contra `go-build270591055`.

(Lo de AVX no era ruido: era DERIVA real contra el artefacto viejo, sellado antes de que
467a87cd pusiera `-mcpu=baseline` en el CC de cgo. Se trata aparte, abajo.)

── La causa ───────────────────────────────────────────────────────────────────────────
`-trimpath` reescribe rutas, pero cuál gana depende de dónde esté el work dir de Go:
dentro del módulo gana la reescritura del módulo y el componente ALEATORIO sobrevive;
fuera, Go reescribe el work dir entero a `/tmp/go-build` y el número desaparece. El
driver ponía `GOTMPDIR=/src/.gotmp`, que es justo dentro del módulo.

Con CGO off da igual —no hay fuentes C generadas, ninguna ruta del work dir entra en el
DWARF— y por eso las 15 recetas Go puras verificadas reproducen. Con cgo sí entra. Por
eso el cambio va acotado a `cgo = true`: las otras 358 no lo necesitan.

── Medido en los dos sentidos, con un módulo cgo de juguete y cachés limpias ─────────
  · GOTMPDIR dentro  ⇒ `go-build3806217352` en el binario; dos builds DIFIEREN
  · GOTMPDIR fuera   ⇒ ninguna cadena `go-build`; dos builds IDÉNTICOS
Y sobre gocryptfs de verdad: DERIVA primero (las dos reconstrucciones ya coincidían
entre sí y el guardado era el viejo), REPRODUCE en la pasada siguiente. En el binario
sólo queda `/tmp/go-build`, el marcador constante de trimpath.

── Va a `/cache` y no a `/tmp`, y se COMPRUEBA que exista ─────────────────────────────
El sandbox monta `--tmpfs /tmp` (~½ RAM) y un proyecto Go grande lo desborda: ésa era la
razón de poner esto en `/src`. `/cache` es un bind RW a disco (el de la caché de zig),
así que conserva el disco y queda fuera del módulo.

Y no se da por hecho que esté: con `--tmp-overlay /` la raíz es escribible, así que un
`mkdir -p /cache/gotmp` a ciegas TRIUNFARÍA creando el directorio en la capa tmpfs —en
RAM, el desbordamiento que se quería evitar, y en silencio. Si el bind falta, el build
muere diciéndolo.
2026-09-14 22:57:47 +00:00
Sergio 9de1ac57b8 estado: anotar que dos NO-DETERMINISMO del libro son de hashes ya superados
`grep NO-DETERMINISMO` daba 3 y sugería tres problemas abiertos. Dos ya no existen:
kirigami y syntax-highlighting se arreglaron el mismo día y sus filas están clavadas
al hash VIEJO, que es justo lo que la clave (receta, hash) hace bien — pero quien
cuenta líneas no lo ve.

Se deja el veredicto medido intacto y se añade a qué hash fue superado. El único
no-determinismo VIGENTE al hash de hoy es `gocryptfs`, que no está en ningún perfil.
2026-09-14 22:36:23 +00:00
Sergio 477ba96d98 estado: powerdevil y ktexteditor verificados tras el re-sellado — reproducen
Los dos ya reconstruidos contra el syntax-highlighting arreglado.
REPRODUCEN 2 · DERIVA 0 · NO-DETERMINISMO 0.

Sellar de nuevo no demuestra nada por sí solo: lo que cierra el arreglo es que el
árbol reconstruido REPRODUZCA.
2026-09-14 22:35:50 +00:00
Sergio f4e1e99f19 atuq: la ventana SI esta — mide 117x70 px (lo dice el protocolo)
Como cosmic-comp no emite DEBUG (macros compiladas fuera), se le pregunto
por el protocolo con WAYLAND_DEBUG=1. Manda configure_bounds(0,0) al
mapear, despues bounds(1280,692) y configure(117,70): la ventana queda de
117x70. El pixel lo confirma — restando el cuadro de antes aparece un
cluster de 286x86 con la decoracion de COSMIC en (496,115).

Cae la hipotesis del §6.10.nonies: hay 43 wl_callback.done, o sea que SI
hay frame callbacks. Y la tasa 2 de 10 no medía «pinto/no pinto» sino
«ventana grande / ventana de 117x70».

Arnes: --wayland-debug y --set-rust-log (perilla por /etc/cosmic-mode, que
cosmic-start lee antes de RUST_LOG); margen de espera 420->780s porque con
carga ~13 la VM no llegaba al shell.
2026-09-14 22:33:44 +00:00
Sergio 4e718e243d estado: cosecha granja 2026-09-14T22:33:03Z — avance del árbol KDE 2026-09-14 22:33:04 +00:00
Sergio 6df63d4774 estado: cascada de syntax-highlighting reconstruida — 6/6 al hash nuevo
El arreglo movió el hash (4c1638a0… → 3db73c19…) y con él sus 4 dependientes
directos y 5 transitivos: kate, ktexteditor, plasma-desktop, plasma-workspace y
powerdevil. Comprobado aparte del log: para las seis existe
`store/<hash-de-hoy>-<nombre>`.

⚠ `kate` falló en el primer intento con «No space left on device» y esta vez NO era
el disco: `/mnt/vvv` tenía 15 G libres. El que se agotaba era un **tmpfs**, y un
tmpfs sin sitio significa RAM sin sitio — la caja tenía 855 MB disponibles, zram ya
con 6,3 G, otro agente compilando Rust y un QEMU encima. Al reintentar con 1,7 G
disponibles construyó en 242 s a la primera.

Que el mismo mensaje signifique dos cosas distintas —disco lleno o RAM llena— es
justo lo que hace caro el diagnóstico: hay que mirar QUÉ sistema de ficheros, no
sólo `df` del que uno tiene en la cabeza.
2026-09-14 22:25:30 +00:00
Sergio 1db707b8c5 estado: cosecha granja 2026-09-14T22:08:47Z — avance del árbol KDE 2026-09-14 22:08:47 +00:00
SergioandClaude Opus 5 41ab76c8a0 RUST COMPILA EN LA CAJA — paso 1 cerrado, y tres paquetes que estaban en el perfil equivocado
`rustc 1.97.0` y `cargo 1.97.0` responden en `2.29.29.217`, y un `fn main(){println!("ok");}`
compila y **corre**. El toolchain oficial de rust-lang, verificado por su sha256 y sellado tal cual
con `foreign = true` (son bytes ajenos, no un build nuestro: clase `ajeno`, fuera del recuento del
corpus).

Lo que costó hacerlo correr, y ninguna de las dos cosas se ve en el grafo porque las dos estaban
`sealed` y en el perfil equivocado:

1. **El cargador musl.** `rustc` es PIE dinámico (`NEEDED librustc_driver-*.so`, `NEEDED libc.so`).
   En el worker ni arranca —`cannot execute: required file not found`, que es como se ve la falta
   del intérprete—; en la caja sí, porque ahí está `musl-shared`.
2. **`libgcc_s.so.1`**: `Error loading shared library … _Unwind_Resume: symbol not found`. Lo
   publica `gcc-libs`, sellado y declarado **sólo en los cuatro perfiles de escritorio**. Una línea
   en `base`. Es la tercera vez HOY que aparece la misma figura —`tar`, `os-release`, `gcc-libs`—:
   el paquete existe, está sellado, y no viaja en la imagen que lo necesita.

Y una propiedad que vale anotar: **no hace falta un `cc`**. El primer `rustc` falla con
`linker \`cc\` not found` y no hay que traer un compilador de C — el toolchain **trae su propio
lld** (`rustlib/<target>/bin/rust-lld`), y con `-C linker-flavor=ld.lld -C link-self-contained=yes`
enlaza y el binario corre. Una distro sin compilador de C puede compilar Rust igual.

Va en `perfil.servidor` y no en `base`: son 799 M y una imagen de escritorio no compila nada.

Pendiente, que es config del SITIO y no de la receta: que esas flags sean el default
(`/etc/cargo/config.toml`), para que `cargo build` funcione sin recordarlas.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
2026-09-14 22:07:50 +00:00