Commit Graph
830 Commits
Author SHA1 Message Date
Sergio 04d174bf6c estado: cosecha granja 2026-09-02T05:31:53Z — avance del árbol KDE 2026-09-02 05:31:53 +00:00
Sergio d6bfa475e3 estado: cosecha granja 2026-09-02T04:31:55Z — avance del árbol KDE 2026-09-02 04:31:55 +00:00
Sergio ee1a658328 estado: cosecha granja 2026-09-02T04:01:56Z — avance del árbol KDE 2026-09-02 04:01:56 +00:00
Sergio a72190b169 estado: cosecha granja 2026-09-02T01:01:49Z — avance del árbol KDE 2026-09-02 01:01:49 +00:00
Sergio 56bf168cce estado: cosecha granja 2026-09-02T00:31:48Z — avance del árbol KDE 2026-09-02 00:31:49 +00:00
Sergio 9afe0bb9d4 estado: cosecha granja 2026-09-02T00:02:07Z — avance del árbol KDE 2026-09-02 00:02:07 +00:00
Sergio aee9e55c54 estado: cosecha granja 2026-09-01T23:33:01Z — avance del árbol KDE 2026-09-01 23:33:01 +00:00
Sergio 1d06fce140 estado: cosecha granja 2026-09-01T23:02:08Z — avance del árbol KDE 2026-09-01 23:02:08 +00:00
Sergio 987aad25af estado: cosecha granja 2026-09-01T22:31:51Z — avance del árbol KDE 2026-09-01 22:31:51 +00:00
Sergio aa55981ad2 estado: cosecha granja 2026-09-01T22:02:10Z — avance del árbol KDE 2026-09-01 22:02:10 +00:00
Sergio 683eaeb79b estado: cosecha granja 2026-09-01T21:31:51Z — avance del árbol KDE 2026-09-01 21:31:51 +00:00
Sergio e29a1f2ebc estado: cosecha granja 2026-09-01T21:01:49Z — avance del árbol KDE 2026-09-01 21:01:49 +00:00
Sergio a6ac3368ab estado: cosecha granja 2026-09-01T20:31:51Z — avance del árbol KDE 2026-09-01 20:31:51 +00:00
Sergio 17b6a284f7 estado: cosecha granja 2026-09-01T20:02:56Z — avance del árbol KDE 2026-09-01 20:02:56 +00:00
Sergio 0ae7e18a6a estado: cosecha granja 2026-09-01T19:32:25Z — avance del árbol KDE 2026-09-01 19:32:25 +00:00
SergioandClaude Opus 5 8b2ff3cfd4 digest: blake3 pelado, no length-prefijado — el mismo archivo tenía dos hex
Lo destapó escribir la contraparte del ADR 0014 para churay: churay direcciona sus blobs
con blake3(bytes) pelado y hammer iba a sellar el digest con of_inputs(&[bytes]), los dos
bajo el prefijo `b3:`. El mismo archivo con dos hex distintos, y un CAS compartido que no
falla ruidosamente: cada lado busca un nombre distinto para los mismos bytes.

Con una sola entrada el length-prefijado no desambigua ninguna concatenación — sólo hace
que el nombre deje de ser verificable por un tercero con b3sum en la mano.

`ArtifactHash::of_bytes` YA EXISTÍA y ya era blake3 pelado: es la convención de of_file y
la del expected_hash de un .swm, así que of_inputs era además la pieza fuera de sitio
dentro del propio repo. of_inputs se queda para lo que fue escrito: hashear una LISTA.

Coste: una línea, porque ningún índice publicado lleva todavía el campo. Es el argumento
del ADR aplicado a sí mismo — decidir antes de que haya usuarios. La corrección queda en
el ADR, no reescrita en silencio.

Guardián: digest_es_blake3_pelado_y_no_length_prefijado, con vector fijo de b3sum y un
assert_ne contra of_inputs que nombra la consecuencia.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CK6HpSoHcN9M4GBpqRSusR
2026-09-01 19:10:07 +00:00
Sergio fbf402d51e estado: cosecha granja 2026-09-01T19:01:57Z — avance del árbol KDE 2026-09-01 19:01:57 +00:00
SergioandClaude Opus 5 48b3c5be3f ADR 0014: distribución multi-origen — el origen no necesita confianza
Se decide ahora, antes de tener usuarios, porque toca el formato del índice y el
comportamiento de clientes instalados en máquinas ajenas: después de la primera descarga
pública el cambio rompe a alguien o se arrastran dos formatos para siempre.

La decisión entera cuelga de una asimetría medida: ~51 G de cuerpo inmutable y verificable
por contenido, contra KB de raíz mutable que es lo único que necesita ser fresco y
auténtico. El cuerpo puede servirse desde cualquier host, incluso hostil ⇒ conseguir
espejos deja de ser un problema de infraestructura.

Cloudflare R2 como primer origen público por el egress a 0, pero es INSTANCIA, no
arquitectura: lo que se decide es que R2 sea una entrada más de una lista. No depender de un
servidorcito no se logra contratando un proveedor grande, sino pudiendo perder cualquiera
sin enterarse. Regla derivada: nunca menos de dos orígenes en dos proveedores.

Verificado de punta a punta con dos orígenes HTTP y un .swm con UN byte cambiado bajo el
mismo nombre: origen muerto ⇒ failover; origen manipulado ⇒ aborta y NO cae al bueno de
detrás. Sin ese segundo caso la lista sería un mecanismo para tapar espejos mentirosos.

Queda pendiente y anotado: el vigía sólo mira upstream, no nuestros orígenes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CK6HpSoHcN9M4GBpqRSusR
2026-09-01 18:45:10 +00:00
SergioandClaude Opus 5 a2c2c4d968 gnome onda-2: jubilar la cola — 22 recetas y 22 hashes identicos a incoming-gnome
El caso LIMPIO del mismo fenomeno que onda-1, sin ninguna de sus asperezas: las
22 recetas son byte a byte identicas a las de incoming-gnome Y las 22 dan el
MISMO ArtifactHash, o sea la misma direccion del store. Sin divergencias, sin
colision de nombre y sin un solo artefacto que podar al retirarla.

La comprobacion que decide NO es `diff` sino `hammer hash`: la resolucion de
deps es hermano->padre, asi que dos ficheros identicos en colas distintas pueden
sellar distinto. Aca coinciden los 22.

Se va tambien `cairo-ctime-r.patch`, verificado identico al de incoming-gnome, y
comprobado que ninguna receta de ninguna cola queda apuntando a un parche
inexistente.

El andamio ya no sostenia nada: el trabajo de la isla dinamica vive en
incoming-gnome, que es la cola que el perfil usa. Sale de QUEUES en el mismo
commit, por la simetrica de la regla que ese fichero documenta.

Gate --check OK, grafo CIERRA, escritorio-gnome sigue 119/119, corpus 786/787.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-01 18:35:53 +00:00
Sergio b2e92de2f3 estado: cosecha granja 2026-09-01T18:31:57Z — avance del árbol KDE 2026-09-01 18:31:57 +00:00
Sergio 5053723239 estado: cosecha granja 2026-09-01T18:02:02Z — avance del árbol KDE 2026-09-01 18:02:03 +00:00
SergioandClaude Opus 5 cf42cd9049 gnome onda-1: jubilar la cola entera — molia para nadie
Cierra la jubilacion empezada con gnome-desktop. Las 5 recetas que quedaban:

- glib, glib-introspected, gobject-introspection, py3-setuptools: byte a byte
  identicas a las de incoming-gnome Y con el MISMO ArtifactHash, o sea que
  sellaban en la misma direccion y entraban por cache-hit. Coste de build cero;
  coste real: un segundo sitio donde editar, que se separa en silencio.
- gsettings-desktop-schemas: la unica distinta, y es la version ANTERIOR al
  2026-07-28 (introspection=false + link=static). La vigente lo activo porque el
  gir de Meta de mutter incluye GDesktopEnums-3.0.gir, que sale de ahi, y sin el
  el g-ir-scanner corta en el ultimo target de mutter (721/722).

Lo caro no era el tiempo sino el NOMBRE: el gsettings viejo competia con el
bueno, dos artefactos homonimos con hash distinto en el store. Podado el
huerfano (0fb1703d, 155 KiB exclusivos) y anotado en el ledger anti-churn; los
otros cuatro artefactos siguen vigentes porque los produce incoming-gnome.

Y al jubilar gnome-desktop las dos hojas de la cola se habian quedado sin
consumidor: la cola se alimentaba a si misma y terminaba en el aire.

Sale tambien de QUEUES en farm-worker-loop.sh, por la simetrica de la regla que
ese fichero ya documenta dos veces: una cola ausente de la lista no da error,
da silencio — y una cola retirada que sigue en la lista, tambien.

Gate --check OK, grafo CIERRA, escritorio-gnome sigue 119/119, corpus 786/787.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-01 17:52:42 +00:00
Sergio 78fc56b266 estado: cosecha granja 2026-09-01T17:32:03Z — avance del árbol KDE 2026-09-01 17:32:04 +00:00
Sergio a82b4ec0cc estado: cosecha granja 2026-09-01T17:02:43Z — avance del árbol KDE 2026-09-01 17:02:43 +00:00
SergioandClaude Opus 5 12c24a984a tasas: la 7ª sorpresa quedaba suelta del punto 6 de la lista
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 17:00:19 +00:00
SergioandClaude Opus 5 9591e69b70 harkaq: el salto del check de arquitectura ya no se apoya en UB (SDD 25 T17)
`f[k++] = BPF_JUMP(..., I_KILL - k - 1 + 1)` leía y modificaba `k` en la misma
expresión, sin punto de secuencia: UB en C11. Andaba porque gcc y clang leen `k`
después del incremento y ese `+1` era la compensación exacta, pero si algún
compilador leyera antes el salto caería una instrucción más allá del final.

El índice se fija ahora en `I_ARCH` antes de usarlo. El código generado es
IDÉNTICO —mismo objdump del objeto a -O1 y a -O2, la única línea que difiere es
el nombre del fichero—, que es lo que prueba que es la misma cuenta escrita sin
UB y no un arreglo que además mueve el salto. Comprobado además que la jaula
sigue puesta: ptrace desde dentro da EPERM y un ejecutable fuera de la clausura
no arranca.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 16:59:22 +00:00
SergioandClaude Opus 5 1df77985fa tasas: T19 — el sandbox apila una capa overlay por dep, y lo caro no es lo que parece
Nadie había medido qué cuesta el apilado de capas de `bwrap_args`. El 95% de las
recetas (1 108 de 1 171) construye con las deps APILADAS, hasta ~27.

Un lookup que FALLA cuesta +1 925 ns por capa (a 64 capas, 124 µs = 1 580 syscalls
nulas), pero se paga UNA VEZ POR RUTA: la dentry fusionada queda cacheada y el
montaje dura toda la fase. Un `cc -O2 -c` toca 381 rutas distintas que fallan ⇒
2,9 ms por fase a 24 capas, la misma décima de por ciento que la jaula de T17/T18.

⇒ `merge_deps_layer` no es una optimización de velocidad: sólo se pagaría sola a
partir de ~35 200 primeros fallos en una misma fase. Es el rodeo de un muro, y el
muro quedó bisecado al byte: `mount(2)` monta 41 capas (4 059 B de opciones) y
falla en 42 con un `ENOENT` que miente. El `mount(8)` de util-linux se rinde entre
8 y 12, así que bisecarlo desde la shell da un muro FALSO.

Consecuencias anotadas en sandbox.rs: no bajar el umbral «para que vaya más
rápido», y podar `.dmerge` es gratis en rendimiento. Y hay puerta medida: la API
de montaje nueva (`fsconfig lowerdir+`) monta las 64 capas que `mount(2)` rechaza.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 16:56:12 +00:00
SergioandClaude Opus 5 b4a7235c59 estado: regenerar los 5 grafos tras jubilar gnome-desktop de onda-1
Ningun nodo cambia de estado y el gate `--check` sigue OK: lo unico que se
mueve es `dependientes_total` de sus deps, un dependiente menos cada una. Es
la yupana cruzando TODAS las colas, onda-1 incluida, aunque ningun grafo la
cargue como cola propia.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-01 16:36:30 +00:00
Sergio 67c49a77e0 estado: cosecha granja 2026-09-01T16:31:54Z — avance del árbol KDE 2026-09-01 16:31:54 +00:00
Sergio eaa04a12a5 estado: cosecha granja 2026-09-01T16:01:55Z — avance del árbol KDE 2026-09-01 16:01:55 +00:00
Sergio 95679adb6f estado: cosecha granja 2026-09-01T15:32:55Z — avance del árbol KDE 2026-09-01 15:32:55 +00:00
Sergio 914e841433 estado: cosecha granja 2026-09-01T15:21:46Z — avance del árbol KDE 2026-09-01 15:21:46 +00:00
SergioandClaude Opus 5 46dba58616 tasas: T17/T18 — la jaula cobra por syscall, y el filtro largo no es lo que cobra
SDD 25 tenía medido el sandbox por namespaces (T14, ~1 ms por proceso) pero no el grano fino que
harkaq pone dentro, que cobra por SYSCALL. `bench_jaula.c` lo mide con control negativo en las dos
mitades (si la jaula no quedó puesta, sale con 2).

seccomp: el filtro de harkaq es una denylist lineal, así que toda syscall legítima recorre la
cadena entera — y aun así es PLANO en su longitud (86,9 ns con 4 entradas, 88,3 con 250, sobre un
piso de 75,0). Lo que lo hace plano es el bitmap de acción constante del kernel, y eso no se supone:
un gemelo de la misma longitud con una carga de args[0] —que hace que el analizador se rinda— sí
crece, 111,6 → 139,9 ns. La regla que sale de ahí es que un filtro es gratis mientras no mire un
argumento. El bitmap se paga al instalar (1,5 µs por entrada) y se amortiza en 2 830 syscalls, o
sea una invocación y media de gcc, una sola vez por fase de build.

landlock: el precio es ESTAR enjaulado (+473 ns por open), no cuántas reglas hay — pasar de 1 regla
a las 16 384 de una clausura fichero a fichero agrega +225 ns más. La política por-fichero de D1,
que era la decisión discutible, resulta casi gratis. Y dos negativas medidas: `stat` no paga
(Landlock no engancha getattr) y un open DENEGADO sale más barato que uno concedido, al revés de lo
que se esperaba al medirlo.

En total, la jaula le cuesta a un compilado 0,23–0,31%: una décima parte del presupuesto de <5% de
SDD 16.

De paso, dos cosas del filtro que salieron de mirarlo para medirlo: la denylist tiene un techo de
~252 entradas por el __u8 de los saltos de la BPF clásica, y el jf se calcula leyendo y modificando
`k` en la misma expresión (UB en C11, benigno con gcc y clang, comprobado).

Y §9.6 queda con el experimento de PTI bien planteado: no es «el laptop daría peor» (compara dos
máquinas y mezcla cuatro variables) sino la misma máquina con pti=on y pti=off. momento no sirve ni
forzándolo: este invitado no expone PCID, así que mediría el peor caso y no el de un TigerLake.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 15:08:33 +00:00
Sergio 3e935a09c2 estado: cosecha granja 2026-09-01T15:01:57Z — avance del árbol KDE 2026-09-01 15:01:57 +00:00
Sergio b088eab4ef estado: cosecha granja 2026-09-01T14:31:55Z — avance del árbol KDE 2026-09-01 14:31:55 +00:00
Sergio bbe2285161 estado: cosecha granja 2026-09-01T14:02:03Z — avance del árbol KDE 2026-09-01 14:02:03 +00:00
Sergio 530e2a3d95 estado: cosecha granja 2026-09-01T13:31:52Z — avance del árbol KDE 2026-09-01 13:31:52 +00:00
Sergio 1d64ffca4c estado: cosecha granja 2026-09-01T13:01:58Z — avance del árbol KDE 2026-09-01 13:01:58 +00:00
Sergio ae88c0ae9c estado: cosecha granja 2026-09-01T12:31:54Z — avance del árbol KDE 2026-09-01 12:31:54 +00:00
Sergio 3479021c30 estado: cosecha granja 2026-09-01T12:02:01Z — avance del árbol KDE 2026-09-01 12:02:01 +00:00
Sergio 22d1710e5d estado: cosecha granja 2026-09-01T11:32:01Z — avance del árbol KDE 2026-09-01 11:32:01 +00:00
Sergio e4124fd0fc estado: cosecha granja 2026-09-01T11:01:55Z — avance del árbol KDE 2026-09-01 11:01:55 +00:00
Sergio 0e6fe9061f estado: cosecha granja 2026-09-01T10:31:51Z — avance del árbol KDE 2026-09-01 10:31:51 +00:00
Sergio 8ff0c23ff8 estado: cosecha granja 2026-09-01T10:01:58Z — avance del árbol KDE 2026-09-01 10:01:58 +00:00
Sergio 13bca0e980 estado: cosecha granja 2026-09-01T09:31:55Z — avance del árbol KDE 2026-09-01 09:31:55 +00:00
Sergio e19592d1fb estado: cosecha granja 2026-09-01T09:01:53Z — avance del árbol KDE 2026-09-01 09:01:53 +00:00
Sergio e05e725841 estado: cosecha granja 2026-09-01T08:31:55Z — avance del árbol KDE 2026-09-01 08:31:55 +00:00
Sergio 18b4fbf1b6 estado: cosecha granja 2026-09-01T08:01:58Z — avance del árbol KDE 2026-09-01 08:01:58 +00:00
Sergio e2d4a17bfc estado: cosecha granja 2026-09-01T07:31:52Z — avance del árbol KDE 2026-09-01 07:31:52 +00:00
Sergio e546790d35 estado: cosecha granja 2026-09-01T07:01:57Z — avance del árbol KDE 2026-09-01 07:01:57 +00:00