From 2098e86ba4d67fad19420de0483f6873ded6609b Mon Sep 17 00:00:00 2001 From: Sergio Date: Wed, 16 Sep 2026 15:55:30 +0000 Subject: [PATCH] =?UTF-8?q?atuq:=20la=20boveda=20ANDA=20=E2=80=94=2019=20g?= =?UTF-8?q?uardianes=20en=20verde,=20y=20el=20bloqueo=20de=20tres=20semana?= =?UTF-8?q?s=20era=20un=20fichero=20sin=20empujar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El pin de `puriy-costura` subio a `23a292863` y con eso se apagaron los dos rojos del cable. La suite entera sobre `b3:e556024b`: **19 verdes, 0 rojos, 32,1 min**. No se toco ningun guardian — que la suite existiera ANTES del arreglo es lo que permite afirmarlo: el cuadro de ayer y el de hoy son el mismo instrumento. La medicion que cierra es la que abrio el §7.quinquies, leida al reves: `strings` sobre el binario sellado da `vault` **10** veces donde daba 0, con `cas`/`sct` de control; y `vigia-atuq-verbos` pasa de 3 verbos sin dueno a cero, con su control positivo intacto. Lo destrabo publicar el `Cargo.lock` de tawasuyu (`23a292863` alla), regenerado en un arbol limpio: 215 lineas, todas de contabilidad de deps por ruta, cero `checksum` y cero `source` movidos. Y el remate, que es la leccion: **ese lock era byte a byte el que la otra sesion ya tenia en su arbol sin commitear**. Tres semanas de bloqueo y el fichero correcto estaba escrito, sin empujar, a un directorio de distancia. Antes de decir «bloqueado por otro repo», mirar si lo que falta no esta ya hecho y sin publicar. Commiteado alla con indice temporal (`GIT_INDEX_FILE` + `commit-tree`), que es la unica forma de publicar una ruta en `MM` sin llevarse por delante lo del otro agente: su arbol quedo byte a byte igual, comprobado con `cmp` antes y despues. ⚠ Y la cabecera del runner se desmintio SOLA dos veces: anuncio «un rojo» cuando eran dos, y «dos» cuando ya no quedaba ninguno. Un numero escrito como prediccion envejece callado. Con todo en verde el numero ya no distingue un producto sano de un runner que no corre nada, asi que lo que sostiene la corrida queda escrito: la puerta del sello (verificada contra un store vacio) y el control interno de cada guardian. --- docs/26-atuq-envoltorio-gecko.md | 67 +++++++++++++++++++++++++++++++- scripts/test-atuq-suite.sh | 26 ++++++++----- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md index cc62f26e..9fe71004 100644 --- a/docs/26-atuq-envoltorio-gecko.md +++ b/docs/26-atuq-envoltorio-gecko.md @@ -2660,6 +2660,17 @@ Los caros son `sct` (242 s), el archivo semántico (238 s), la instalación (180 IA (182 s, levanta `llama-server`) y las notificaciones (180 s, sway headless). Los cuatro primeros salen en **5 s** y no tocan el navegador: para «¿rompí el cruce política↔XPI?» alcanza `--only`. +**Y al día siguiente, el mismo comando: 19 en verde y 0 en rojo** (2026-09-16, 32,1 min). Los dos +rojos se apagaron subiendo el pin de `puriy-costura` (§7.quinquies.bis) — no se tocó ningún guardián. +Que la suite existiera antes del arreglo es lo que permite decir eso: el cuadro de ayer y el de hoy +son el mismo instrumento. + +⚠ **Lo que hay que cuidar ahora es el control del propio runner.** Mientras hubo un rojo conocido, el +número esperado distinguía solo «producto sano» de «runner que no corre nada». Con todo en verde ya +no, así que lo que sostiene la corrida son la **puerta del sello** (contra un store sin el artefacto +no corre nada y devuelve 1, verificado a propósito) y el **control interno de cada guardián**. El +runner no los reemplaza: los junta. + O sea: **el commit de la bóveda no rompió nada más**. Los quince guardianes que no tienen nada que ver con ella siguen verdes sobre el artefacto que la trae adentro, y eso es lo que hacía falta saber antes de seguir — porque la unidad 12 tocó `atuq.cfg`, la política y el empaquetado de extensiones, @@ -2925,6 +2936,60 @@ commitea ni con pathspec: se avisa. el guardián de METAL de la bóveda —servidor, navegador real, login real, el diálogo de consentimiento a la vista—, que es lo que el commit de la unidad 12 dejó anunciado. +#### 7.quinquies.bis DESTRABADO (2026-09-16): el lock, el pin, y el mismo `strings` leyendo al revés + +Las tres cosas que el párrafo de arriba dejaba pendientes están hechas, y en ese orden porque cada +una destrababa a la siguiente. + +**1. El lock de tawasuyu, publicado** (`23a292863`). Regenerado en un árbol LIMPIO del `HEAD` de allá +—`git archive | tar -x`, que no toca el `.git` compartido— y verificado en los dos sentidos, que es +lo que lo convierte en evidencia: `cargo metadata --locked --offline` **moría antes** de regenerarlo +y **pasa después**. El diff son 215 líneas y **todas de contabilidad de deps por ruta: cero +`checksum` movidos, cero `source` movidos**, ninguna versión de registry tocada. Lo que aparece es +`llimphi-registro`, los cuatro crates de la bóveda y `umbral` dentro de `pacha-boveda`. + +⚠ **Commiteado con un índice TEMPORAL, no con `git commit`.** El `Cargo.lock` seguía en vuelo en el +clon compartido, y la regla 2 ya está medida: `git commit -- Cargo.lock` se lleva **el árbol** y deja +el índice ahí, o sea que borra lo que el otro agente tuviera stageado en ESA ruta. El camino que no +toca nada es plumbing: + +```sh +export GIT_INDEX_FILE=/tmp/…/tw.index # un índice PROPIO: el compartido no se abre +git read-tree HEAD +blob=$(git hash-object -w ) +git update-index --cacheinfo 100644,$blob,Cargo.lock +git commit-tree $(git write-tree) -p HEAD -F msg # ⇒ commit sin tocar índice ni árbol +git push origin :main +``` + +Con su control puesto: `git diff-tree -r --name-only HEAD ` tiene que decir **un solo fichero**. + +⚠ **Y la sorpresa que ordena el resto: el lock publicado resultó ser BYTE A BYTE el que la otra +sesión ya tenía en su árbol** —mismo blob `b2f0b9eb`—. No era una versión rival de la reparación: era +la suya, que llevaba horas sin commitear. O sea que lo que bloqueó a `atuq` tres semanas no fue un +problema técnico sino **un fichero correcto que nadie había publicado**, y del que ningún guardián de +ninguno de los dos repos podía hablar. + +**2. El pin, subido** a ese commit ⇒ `b3:7d63655a`. El artefacto se construyó **en el worker**: el +vendoreo son 2,4 G y el disco del hub estaba al 99% (lo llena `tawasuyu/target`, 148 G), así que +construir acá habría sido el cuadro de «disco lleno = ✗ falso». Bajar el artefacto son 2,3 M. + +**3. La misma medición que diagnosticó el problema, leída al revés.** El §7.quinquies lo cerró con +`strings` sobre el binario sellado: `vault` 0 veces, `cas` 5 —el control que tenía que dar positivo—. +Sobre el binario nuevo, con el mismo comando: + +| | antes (`e19bb0e5`) | ahora (`23a29286`) | +|---|---|---| +| `vault.` | **0** | **10** | +| `cas.` / `sct.` (control) | presentes | presentes | + +Y del lado del navegador, `scripts/vigia-atuq-verbos.py` pasa de **3 verbos sin dueño** a **cero**, con +su control positivo intacto (`sct.observe` sigue apareciendo ⇒ el grep mide). + +**Lo que queda de la unidad 12** es el guardián de METAL de la bóveda —servidor, navegador real, +login real, el diálogo de consentimiento a la vista—, que ahora sí se puede escribir porque hay con +qué correrlo. + ## 8. Plan, por unidades de trabajo Cada una cierra sola, se commitea y se pushea. El orden no es preferencia: cada una destraba a la @@ -2952,7 +3017,7 @@ siguiente. | 9 | **Medios (6.6) ✅ y torrent (6.9) ✅ — 2026-09-10.** El medio lo abre `mpv`; el torrent lo toma `puriy-costura-torrent`, un daemon **propio, configurable y perezoso** que sobrevive al navegador y cosecha al CAS. Medido antes de decidir: la pila de librqbit compila para musl (226 crates), así que la decisión fue «no ahí» y no «no se puede». **Faltan** el foco (6.5) y la IA local (6.7), ésta bloqueada porque el corpus no tiene modelo ni embeddings | 6.5–6.7, 6.9 | 5 ✅ | | 10 | **Foco (6.5) — 2026-09-10.** Entra al corpus la cadena `nftables` (libmnl + libnftnl + nft 1.1.6), que el grafo pedía y nadie había puesto, con dos arreglos de fábrica: el sello de tiempo que rompía la reproducción y un bashismo. Medido con root: el cgroup en foco no sale y el de al lado sí. Y del lado del navegador, la extensión `foco` MUESTRA el estado y **no tiene verbo para apagarlo**. **Falta** quién pone a `atuq` en un cgroup (delegación, decisión de arje) y quién aplica la política (root) | 6.5 | 6 ✅ | | 11 | **Motor de inferencia local (6.7) — 2026-09-11.** Entra `recipes/llama-cpp.toml` (b10901, estática, 199 M, **REPRODUCE**), que resulta ser **un solo muro para dos pendientes**: el §6.7 y la mitad semántica del §6.3 no eran dos problemas, era que el corpus no tenía con qué correr un modelo (`pluma-llm` sólo tiene backends de nube; `rimay-verbo-fastembed` DESCARGA onnxruntime glibc + el modelo). ⚠ Y dejó medido lo que no se podía deducir: **`SOURCE_DATE_EPOCH` —la variable que nos da reproducibilidad— apagaba las SEIS perillas de ISA de ggml**, y el artefacto sellaba y corría con 0 `%ymm`. Ahora van declaradas y el `install` las comprueba. Guardián `scripts/test-llama-cpp.py` con control negativo vivo. **Faltan** el modelo (fuente pineada, no receta), los verbos del host y quién levanta el servidor | 6.7, y la mitad semántica de 6.3 | 5 ✅ | -| 12 | **La bóveda (SDD-BOVEDA §8) — a medias, 2026-09-15.** La décima extensión: ofrece la credencial del sitio abierto y no puede sacar una contraseña por su cuenta —`vault.match` contesta títulos y usuarios; la contraseña sale por `vault.fill`, que **pregunta en el escritorio**—. La dirección la pone el chrome, nunca la página. El gestor de Gecko se aparta como VALOR DE ARRANQUE y no como política. ⚠ **No funciona todavía**: los tres verbos existen en tawasuyu y la receta pinea un commit ANTERIOR (§7.quinquies), y el pin está bloqueado por un `Cargo.lock` que no cierra. **Falta**: el lock de allá, el pin, el rebuild, y el guardián de METAL | el gestor de contraseñas de la suite dentro del navegador | 5 ✅ | +| 12 | **La bóveda (SDD-BOVEDA §8) — a medias, 2026-09-15.** La décima extensión: ofrece la credencial del sitio abierto y no puede sacar una contraseña por su cuenta —`vault.match` contesta títulos y usuarios; la contraseña sale por `vault.fill`, que **pregunta en el escritorio**—. La dirección la pone el chrome, nunca la página. El gestor de Gecko se aparta como VALOR DE ARRANQUE y no como política. **Destrabada el 2026-09-16** (§7.quinquies.bis): el `Cargo.lock` de tawasuyu publicado —y resultó ser byte a byte el que la otra sesión ya tenía sin commitear—, el pin subido a `23a292863` ⇒ `b3:7d63655a`, construido en el worker (el vendoreo son 2,4 G y el hub estaba al 99%) y medido con el mismo `strings` que había diagnosticado el hueco: `vault` de **0 a 10**, con `cas`/`sct` de control. **Falta**: el guardián de METAL | el gestor de contraseñas de la suite dentro del navegador | 5 ✅ | | 9.a | **Proxy por contenedor ✅ v0.5** — contenedores por política + extensión con `proxy.onRequest` | 6.8, y NO dependía de 5: es API de Firefox | — | Las unidades 2 y 4 son **paralelizables**: la toolchain no toca el chrome y el chrome no toca la diff --git a/scripts/test-atuq-suite.sh b/scripts/test-atuq-suite.sh index 045e29f7..7987d65a 100755 --- a/scripts/test-atuq-suite.sh +++ b/scripts/test-atuq-suite.sh @@ -15,19 +15,25 @@ # Si falta el sello, esto NO corre nada: dice cómo construirlo y sale. # # ══ EL CONTROL DE ESTA CORRIDA ════════════════════════════════════════════════════════════════ -# Hoy (2026-09-15) el resultado CORRECTO es **17 en verde y DOS en rojo**: `vigia-atuq-verbos` y -# `test-atuq-boveda-coherente`, los dos por la MISMA causa —la receta de `puriy-costura` pinea un -# host anterior a los verbos de la bóveda, abierto y medido en el SDD 26 §7.quinquies—. **Si esto -# sale todo verde, lo roto es esto**: un cuadro entero en verde puede ser un producto sano o un -# runner que no corre nada, y se ven igual. +# Hoy (2026-09-16) el resultado CORRECTO es **19 en verde**. Lo fue «17 y dos rojos» hasta esta +# tarde: los dos eran los verbos de la bóveda, y se apagaron al subir el pin de `puriy-costura` +# (SDD 26 §7.quinquies.bis). Si mañana hay un rojo, cambió algo que hay que ir a ver. # -# ⚠ Esta cabecera decía «un rojo» hasta que la primera corrida la desmintió: el segundo guardián -# lleva el mismo chequeo del cable ADENTRO. Queda escrito porque es la trampa de siempre —predecir -# el resultado y no volver a mirarlo—, y porque el número es el control: si mañana hay UN rojo, o -# tres, cambió algo que hay que ir a ver. +# ⚠ **Un cuadro entero en verde puede ser un producto sano o un runner que no corre nada, y se ven +# igual.** Mientras hubo un rojo conocido, el número lo distinguía solo. Ahora no, así que lo que +# sostiene la corrida son otras dos cosas, las dos comprobadas: +# +# · **la puerta del sello** — contra un store sin el artefacto, esto NO corre nada y devuelve 1 +# (verificado a propósito con un store vacío); +# · **el control de cada guardián** — todos traen el suyo (una rotura que TIENE que matarlos, o un +# positivo que TIENE que aparecer). El runner no los reemplaza: los junta. +# +# ⚠ Y la advertencia que este fichero se aplicó a sí mismo dos veces: la cabecera anunció «un rojo» +# y eran dos, y después «dos» cuando ya no quedaba ninguno. **Un número escrito como predicción +# envejece callado.** Si el cuadro no coincide con esto, el sospechoso es esta cabecera. # # ══ LO QUE CUESTA ═════════════════════════════════════════════════════════════════════════════ -# **~32 min** en gioser, en serie (medido 2026-09-15). Los cuatro primeros salen en 10 s y no tocan +# **~32 min** en gioser, en serie (32,1 min medidos el 2026-09-16, sobre 19 guardianes). Los cuatro primeros salen en 10 s y no tocan # el navegador: para «¿rompí algo del cruce política↔XPI?» alcanza con `--only` y no hace falta la # media hora. Los caros son `sct` (241 s, seis cargas), `archivo-semantico` (227 s, embeddings), # `instalacion` (180 s, tres sesiones) y `ia` (180 s, levanta `llama-server`).