gioser

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 1389Shell 137Markdown 80Rust 802602 Definitions

seed-graph: decir que falta nix, en vez de reventar con un traceback

'yupana frontera <perfil>' —el verbo que responde qué pide upstream y no tenemos— moría con
veinte líneas de traceback terminadas en FileNotFoundError: 'nix'. Eso tiene la cara de un bug
de código y manda a depurar el script, cuando lo único que falta es una herramienta que en esta
máquina nunca se instaló: el hub gioser no trae nix, y los docs/state/seed-*.json del repo se
generaron en otra máquina el 2026-08-10. El coste no es el susto, es el desvío.

Ahora es una precondición explícita que dice qué falta y qué hacer, y sale 2.

⚠ Dos errores míos que los controles cazaron en el acto, y por eso van escritos:
  · Eximí a --calibrar de la comprobación 'porque no usa nix'. Lo usa: el control lo mostró
    imprimiendo 'nix eval lote 1 (3 nombres)…' y muriendo igual. La exención era una suposición
    con forma de hecho.
  · Con la precondición delante del uso, 'seed-graph.py' a secas pasó a quejarse de nix en vez
    de explicarse. Un fallo de entorno va DESPUÉS del uso.

Verificado en los tres caminos: sin args → uso; --frontera → mensaje de entorno; --calibrar →
mensaje de entorno.

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

a19fc8bcf065e627a9af8f2cb676450718d37978 · by Sergio · (1 month ago) · parent ca2c16451 · browse the tree at this commit

Semantic delta · 1

scripts/seed-graph.py

  • body changed fn main

1 files · +21 −1

diff --git a/scripts/seed-graph.py b/scripts/seed-graph.py
index 5cf9c0ce..5e24acab 100755
--- a/scripts/seed-graph.py
+++ b/scripts/seed-graph.py
@@ -31,7 +31,7 @@
 #       scripts/seed-graph.py --perfil <perfil>    # siembra los nodos `wanted` → seed-edges.json
 #       scripts/seed-graph.py <nombre...>          # siembra nombres sueltos
 # Env:  NIXPKGS (def nixpkgs), NIX_ROOT (def ~/.nixstore; vacío = store del sistema)
-import json, os, re, subprocess, sys, glob, tomllib
+import shutil, json, os, re, subprocess, sys, glob, tomllib
 from pathlib import Path
 
 ROOT = Path(__file__).resolve().parent.parent
@@ -413,6 +413,26 @@ def sembrar_a_fichero(nombres, recs):
 
 def main():
     args = sys.argv[1:]
+    if not args:
+        print(__doc__ or "uso: seed-graph.py --calibrar [N] | --frontera <p> | --perfil <p> | <nombre...>",
+              file=sys.stderr)
+        return 1
+    # ⚠ PRECONDICIÓN EXPLÍCITA, y no es cosmética (2026-09-08). TODOS los verbos de este script
+    # preguntan a `nix eval` qué declara nixpkgs — incluido `--calibrar`, que yo había eximido por
+    # suposición hasta que el control lo desmintió en el acto. Sin `nix` en el PATH, la llamada moría
+    # con veinte líneas de traceback terminadas en `FileNotFoundError: 'nix'`, que es la cara de un
+    # BUG DE CÓDIGO: manda a depurar el script cuando lo único que falta es una herramienta que en
+    # esta máquina nunca se instaló. El coste no es el susto, es el desvío. Un fallo de ENTORNO tiene
+    # que decir qué falta y qué hacer; va DESPUÉS del uso, para que `seed-graph.py` a secas siga
+    # explicándose.
+    if not shutil.which("nix"):
+        print("seed-graph: falta `nix` en el PATH.\n"
+              "  Este script pregunta a nixpkgs (`nix eval`) qué declara upstream como dependencias;\n"
+              "  sin él no hay frontera que calcular. No es un fallo de las recetas ni del grafo.\n"
+              "  El hub `gioser` no lo trae: los `docs/state/seed-*.json` del repo se generaron en\n"
+              "  otra máquina (2026-08-10). Instalar nix, o correr este verbo donde ya esté.",
+              file=sys.stderr)
+        return 2
     recs = recetas()
     if not args:
         print(__doc__ or "uso: seed-graph.py --calibrar [N] | --perfil <p> | <nombre...>", file=sys.stderr)