tawasuyu

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 1569Shell 203Rust 109Markdown 993728 Definitions

fix(estado): el digest de la imagen y el de la vigía no coincidían — por el prefijo `b3:`

Los dos números salieron distintos la primera vez que se hidrató un perfil DE VERDAD para
compararlos: la vigía predecía `sha256:5fed4348…` y la imagen declaraba `sha256:17de5d7e…`. Y los
cinco hashes de `metal-tigerlake` eran **idénticos uno a uno** entre el grafo y `takana hash` en
vivo, así que no era deriva de contenido.

Era el FORMATO: la vigía lee el hash del grafo, que lo guarda como `b3:7373…`, y
`hydrate-profile.py` lo saca de `takana hash` y le quita el prefijo. Mismo hash, cadena distinta,
digest distinto.

Se normaliza DENTRO de `digest_de`, que es el único sitio que lo impide de verdad: **una función
compartida que exige un formato convenido de palabra ya son dos implementaciones otra vez**, que es
exactamente el problema que esa función existía para evitar.

Lo que lo encontró no fue leer el código, fue hidratar un perfil real y comparar los dos números.
`metal-tigerlake` (5 nodos) es el control barato que lo hace posible.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

a39110b50bd71d18b33b1a42fca46f82824f79ce · by Sergio · (12 d ago) · parent 7166f306f · browse the tree at this commit

Semantic delta · 1

scripts/cierre-perfiles.py

1 files · +9 −2

diff --git a/scripts/cierre-perfiles.py b/scripts/cierre-perfiles.py
index aa6840bd..fbf808a2 100755
--- a/scripts/cierre-perfiles.py
+++ b/scripts/cierre-perfiles.py
@@ -93,9 +93,16 @@ def digest_de(items):
     y en `incoming-kde`. Y `sha256:` y no `b3:` porque esto resume un conjunto y no direcciona nada
     en el store: reusar el prefijo del ArtifactHash invitaría a buscarlo ahí.
     """
+    # ⚠ EL PREFIJO `b3:` SE NORMALIZA ACÁ, Y ES UN BUG MEDIDO, NO UNA PRECAUCIÓN. La vigía lee el
+    # hash del grafo, que lo guarda como `b3:7373…`; `hydrate-profile.py` lo saca de `takana hash`
+    # y le quita el prefijo. **Mismo hash, cadena distinta, digest distinto** — los dos números
+    # salieron diferentes la primera vez que se hidrató de verdad para compararlos, con los cinco
+    # hashes IDÉNTICOS uno a uno. Que la función normalice es lo único que impide que un llamador
+    # futuro vuelva a pisarlo: una función compartida que exige un formato convenido de palabra ya
+    # son dos implementaciones otra vez.
     h = hashlib.sha256()
-    for cola, nombre, hh in sorted(items):
-        h.update(('%s/%s %s\n' % (cola, nombre, hh)).encode())
+    for cola, nombre, hh in sorted((c, n, (x or '').replace('b3:', '')) for c, n, x in items):
+        h.update(('%s/%s b3:%s\n' % (cola, nombre, hh)).encode())
     return 'sha256:' + h.hexdigest()