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 1184Shell 70Rust 62Markdown 501503 Sutichaykuna

llimphi-counter: pinear a v0.2.0 y arreglar el install — el corpus queda 787/787

Deja de ser una plantilla con `commit = 000…0`. Tres cosas, y las dos últimas
son el valor del commit:

1. PIN. `v0.1.0` era el tag que la versión declaraba y NO SIRVE: su `Cargo.lock`
   está desincronizado con sus manifiestos en el propio repo, y `cargo vendor
   --locked` se niega ("cannot update the lock file … because --locked"). No es
   de hammer: el vendoreo del fetch arranca bien y muere DENTRO de cargo.
   Comprobado con `cargo metadata --locked` en los tres refs — v0.1.0
   incoherente, v0.2.0 y main coherentes. Se pinea v0.2.0, PELADO con ^{commit}
   porque es objeto tag (93253cc2, no 0beb83b7).
   => Un tag no sirve como pin sólo por existir: hay que verificar que su
   lockfile cierre.

2. El requisito de `vendor/` en la fuente que pedía el comentario quedó VIEJO:
   hammer vendorea en el FETCH a partir del Cargo.lock, host-side, y por eso el
   `--offline --locked` del sandbox se cumple. El repo no trae vendor/ en ningún
   tag y aun así construye.

3. ⚠ FASE `install` PROPIA, obligatoria con `--example`. El default de Cargo hace
   `find target/release -maxdepth 1 -type f -perm -100`, y cargo deja los
   ejemplos en `target/release/examples/`. El find no encontraba nada, salía 0 y
   **hammer selló un artefacto SIN BINARIO**: 22 min de compilación y un `sealed`
   con sólo `.hammer/recipe.toml` dentro, 20K. `hash --check` decía SELLADO y el
   grafo lo habría contado como al día.
   No lo atrapa `Store::has` ni el guardián de vacíos de build-state, porque el
   directorio NO está vacío — tiene el manifiesto. Es la regla 3 del CLAUDE.md en
   su peor forma: un ausente falla a gritos, esto llegó al final diciendo que
   todo fue bien. Por eso la fase lleva un `test -x` que hace ruidosa la
   ausencia.

Verificado por contenido, no por el `sealed`: 17 M, usr/bin/llimphi-counter, ELF
pie, NEEDED = libc.so (dinámico, como la receta promete para un binario que
dlopea Vulkan/Wayland). El artefacto falso se podó y quedó en el ledger.

`version` pasa de 0.1.0 a 0.2.0 y NO mueve el hash: no está en hash_inputs (como
`license`). La identidad la da el commit.

Corpus: 787/787 SELLADAS, 0 deuda, 0 never. Gate --check OK, grafo CIERRA.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4

390c6a5e5e63851c659b7c4348f5e85c696f77e0 · ruwaq Sergio · (1 killa ñawpaq) · tayta 94faf1289 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

6 qillqakuna · +53 −51

diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json
index 377ea030..c556bc24 100644
--- a/docs/state/build-state-cosmic.json
+++ b/docs/state/build-state-cosmic.json
@@ -3,8 +3,7 @@
  "totals": {
   "recipes": 833,
   "nodes": 833,
-  "sealed": 832,
-  "debt": 1
+  "sealed": 833
  },
  "by_class": {
   "c": 181,
@@ -13,13 +12,10 @@
   "kernel": 6,
   "rust": 250
  },
- "debt_by_class": {
-  "rust": 1
- },
+ "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 785,
-   "debt": 1
+   "sealed": 786
   },
   "incoming-cosmic": {
    "sealed": 47
@@ -9244,7 +9240,7 @@
    "cls": "rust",
    "queue": "corpus",
    "hash": "b3:331a4df82182765e2b9a10271b58866006d6803591448df24699b2ee76be0bc5",
-   "state": "debt",
+   "state": "sealed",
    "blocked_by": [],
    "unblocks": 0,
    "perfiles": [],
diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json
index a0e23c6d..0f6f1dd1 100644
--- a/docs/state/build-state-gnome.json
+++ b/docs/state/build-state-gnome.json
@@ -3,8 +3,7 @@
  "totals": {
   "recipes": 858,
   "nodes": 858,
-  "sealed": 857,
-  "debt": 1
+  "sealed": 858
  },
  "by_class": {
   "c": 220,
@@ -13,13 +12,10 @@
   "kernel": 6,
   "rust": 230
  },
- "debt_by_class": {
-  "rust": 1
- },
+ "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 778,
-   "debt": 1
+   "sealed": 779
   },
   "incoming-gnome": {
    "sealed": 79
@@ -9904,7 +9900,7 @@
    "cls": "rust",
    "queue": "corpus",
    "hash": "b3:331a4df82182765e2b9a10271b58866006d6803591448df24699b2ee76be0bc5",
-   "state": "debt",
+   "state": "sealed",
    "blocked_by": [],
    "unblocks": 0,
    "perfiles": [],
diff --git a/docs/state/build-state-kde.json b/docs/state/build-state-kde.json
index dc49c46f..4948b088 100644
--- a/docs/state/build-state-kde.json
+++ b/docs/state/build-state-kde.json
@@ -3,8 +3,7 @@
  "totals": {
   "recipes": 974,
   "nodes": 978,
-  "sealed": 973,
-  "debt": 1,
+  "sealed": 974,
   "wanted": 4
  },
  "by_class": {
@@ -15,13 +14,10 @@
   "rust": 229,
   "wanted": 4
  },
- "debt_by_class": {
-  "rust": 1
- },
+ "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 768,
-   "debt": 1
+   "sealed": 769
   },
   "incoming-kde": {
    "sealed": 205,
@@ -13370,7 +13366,7 @@
    "cls": "rust",
    "queue": "corpus",
    "hash": "b3:331a4df82182765e2b9a10271b58866006d6803591448df24699b2ee76be0bc5",
-   "state": "debt",
+   "state": "sealed",
    "blocked_by": [],
    "unblocks": 0,
    "perfiles": [],
diff --git a/docs/state/build-state-wlr.json b/docs/state/build-state-wlr.json
index 99bc5714..9c7eae79 100644
--- a/docs/state/build-state-wlr.json
+++ b/docs/state/build-state-wlr.json
@@ -3,8 +3,7 @@
  "totals": {
   "recipes": 801,
   "nodes": 801,
-  "sealed": 800,
-  "debt": 1
+  "sealed": 801
  },
  "by_class": {
   "c": 172,
@@ -13,13 +12,10 @@
   "kernel": 6,
   "rust": 229
  },
- "debt_by_class": {
-  "rust": 1
- },
+ "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 785,
-   "debt": 1
+   "sealed": 786
   },
   "incoming-wlr": {
    "sealed": 15
@@ -8630,7 +8626,7 @@
    "cls": "rust",
    "queue": "corpus",
    "hash": "b3:331a4df82182765e2b9a10271b58866006d6803591448df24699b2ee76be0bc5",
-   "state": "debt",
+   "state": "sealed",
    "blocked_by": [],
    "unblocks": 0,
    "perfiles": [],
diff --git a/docs/state/build-state.json b/docs/state/build-state.json
index 3de9836d..6c0ad98d 100644
--- a/docs/state/build-state.json
+++ b/docs/state/build-state.json
@@ -3,8 +3,7 @@
  "totals": {
   "recipes": 787,
   "nodes": 787,
-  "sealed": 786,
-  "debt": 1
+  "sealed": 787
  },
  "by_class": {
   "c": 158,
@@ -13,13 +12,10 @@
   "kernel": 6,
   "rust": 229
  },
- "debt_by_class": {
-  "rust": 1
- },
+ "debt_by_class": {},
  "by_queue": {
   "corpus": {
-   "sealed": 786,
-   "debt": 1
+   "sealed": 787
   }
  },
  "by_profile": {
@@ -8492,7 +8488,7 @@
    "cls": "rust",
    "queue": "corpus",
    "hash": "b3:331a4df82182765e2b9a10271b58866006d6803591448df24699b2ee76be0bc5",
-   "state": "debt",
+   "state": "sealed",
    "blocked_by": [],
    "unblocks": 0,
    "perfiles": [],
diff --git a/recipes/llimphi-counter.toml b/recipes/llimphi-counter.toml
index a8a2d809..c6edbc50 100644
--- a/recipes/llimphi-counter.toml
+++ b/recipes/llimphi-counter.toml
@@ -1,15 +1,22 @@
-# ⛔ ESTO ES UNA PLANTILLA, NO UN PAQUETE. NO INTENTES CONSTRUIRLA.
+# Ejemplo de receta Rust (BuildSys::Cargo) — un front-door de tawasuyu.
 #
-# Su `commit` es `000…0`, un placeholder que nunca se llenó (ver el comentario en `[source]`), así que
-# el fetch falla con `commit 000…0 no existe en …/llimphi.git tras fetch`. Eso es CORRECTO: la receta
-# existe para MOSTRAR cómo se escribe una receta Rust gráfica, no para producir un artefacto.
+# PINEADA EL 2026-09-02. Hasta hoy su `commit` era `000…0`, un placeholder, y la receta llevaba un
+# ⛔ «NO INTENTES CONSTRUIRLA»: existía para MOSTRAR cómo se escribe una receta Rust gráfica y salía
+# como `never` en el grafo — técnicamente cierto y semánticamente engañoso, porque no era trabajo
+# pendiente sino un ejemplo. Ahora apunta a `v0.1.0` (tag LIGERO ⇒ el sha ya es el commit; ojo que
+# `v0.2.0` sí es objeto tag y hay que pelarlo con `^{commit}`).
 #
-# Aparece como `never` en `docs/state/build-state.json`, y ahí el estado es técnicamente cierto y
-# semánticamente engañoso: no es trabajo pendiente, es un ejemplo. Este aviso está acá porque el
-# 2026-07-30 gasté un build en descubrirlo mientras cerraba la deuda real del corpus. Si algún día se
-# quiere de verdad, hay que fijar un commit real del repo con las deps vendoreadas.
+# ⚠ El repo NO trae `vendor/` ni `.cargo/config.toml` en ningún tag, y el comentario de más abajo
+# los pedía como requisito. Ese requisito quedó viejo: hammer vendorea en el FETCH a partir del
+# `Cargo.lock` (que el repo sí trae), igual que hace `arje-logind-compat` con el monorepo. El
+# `--offline --locked` del sandbox se cumple porque el vendoreo pasa ANTES, host-side.
 #
-# Ejemplo de receta Rust (BuildSys::Cargo) — un front-door de tawasuyu.
+# ⚠ POR QUÉ v0.2.0 Y NO v0.1.0, que es el tag que la versión declaraba. El `Cargo.lock` de v0.1.0
+# está DESINCRONIZADO con sus manifiestos en el propio repo: `cargo vendor --locked` se niega
+# («cannot update the lock file … because --locked was passed»). No es un problema de hammer —el
+# vendoreo del fetch arranca bien y muere DENTRO de cargo—. Comprobado con `cargo metadata --locked`
+# en los tres refs: v0.1.0 incoherente, v0.2.0 y main coherentes.
+# ⇒ Un tag no sirve como pin sólo por existir: hay que verificar que su lockfile cierre.
 #
 # Muestra el caso GRÁFICO (el más exigente): wgpu+winit+vello cargan Vulkan/Wayland por
 # `dlopen` en runtime, así que el binario va `link = "dynamic"` (no estático) y el link lo
@@ -22,12 +29,12 @@
 #      trae. `cargo build --offline --locked` falla si falta cualquiera.
 
 name    = "llimphi-counter"
-version = "0.1.0"
+version = "0.2.0"
 license = "MIT"
 
 [source]
 repo   = "https://git.tawasuyu.net/tawasuyu/llimphi.git"
-commit = "0000000000000000000000000000000000000000"  # ← fijar al commit real con deps vendoreadas
+commit = "93253cc227130680427a9a83bdc504bd82ca71ca"  # v0.2.0 PELADO (^{commit}); el tag es objeto
 
 [build]
 compiler = "zig-cc"            # linker del binario (wrapper zig cc, cierra -lgcc_s)
@@ -36,6 +43,21 @@ link     = "dynamic"           # gráfico: necesita dlopen de Vulkan/Wayland en
 # Selección del binario a construir dentro del workspace/crate:
 flags    = ["-p", "llimphi-ui", "--example", "counter"]
 
+# ⚠ FASE `install` PROPIA, Y ES OBLIGATORIA CON `--example` (2026-09-02). El default de Cargo hace
+# `find target/release -maxdepth 1 -type f -perm -100` y **cargo deja los ejemplos en
+# `target/release/examples/`, no en `target/release/`** ⇒ el find no encuentra nada, sale 0, y hammer
+# SELLA UN ARTEFACTO SIN BINARIO. Pasó: 22 min de compilación y un `sealed` con sólo
+# `.hammer/recipe.toml` dentro. No lo atrapa `Store::has` ni el guardián de vacíos, porque el
+# directorio NO está vacío — tiene el manifiesto. Es la regla 3 del CLAUDE.md en su peor forma.
+# Por eso el `test -x` de abajo: que la ausencia falle A GRITOS en vez de sellar en silencio.
+[build.phases]
+install = '''
+set -e
+test -x target/release/examples/counter || { echo "no hay target/release/examples/counter — ¿cambió el layout de cargo?" >&2; exit 1; }
+mkdir -p /out/usr/bin
+cp target/release/examples/counter /out/usr/bin/llimphi-counter
+'''
+
 # runtime: en un userland musl coherente (Alpine) el binario dlopea mesa/vulkan/wayland
 # musl-built sin fricción; mezclar con gráficos glibc es lo que rompe (ver M2 del plan
 # arje↔hammer en tawasuyu).