From 36b8dd70e061be9f82caedfb5cf6df317787d035 Mon Sep 17 00:00:00 2001 From: sergio Date: Mon, 10 Aug 2026 00:00:48 -0400 Subject: [PATCH] =?UTF-8?q?estado:=20sealed=5Fremoto=20sale=20del=20JSON?= =?UTF-8?q?=20=E2=80=94=20depend=C3=ADa=20de=20la=20m=C3=A1quina,=20y=20ah?= =?UTF-8?q?ora=20hay=20dos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Montando gioser como segundo hub salió el defecto: `sealed_remoto` cuenta cuántos sellados NO están en el disco de QUIEN calcula. El laptop tiene 219 artefactos y gioser 19, así que el mismo corpus da 700 y 751. Metido en un fichero commiteado, las dos máquinas se lo pisarían en cada regeneración, para siempre. El estado del corpus es compartido; cuánto de él tiene esta máquina en el disco, no. Se sigue diciendo en el resumen, donde es útil y no genera churn. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/build-state.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/scripts/build-state.py b/scripts/build-state.py index 962b7525..f1f8084b 100755 --- a/scripts/build-state.py +++ b/scripts/build-state.py @@ -323,11 +323,13 @@ def main(): schema="hammer-build-state/1", # `recipes` sigue contando SÓLO las que tienen fichero (los consumidores lo leen como el # tamaño del corpus); `nodes` incluye la frontera `wanted`. - # `sealed_remoto`: de los `sealed`, cuántos NO están en el disco local y se dan por buenos - # por el manifiesto de la granja. Va explícito para que «el store se mudó» no se lea nunca - # como «el corpus creció»; si algún día sube sin que nadie haya sembrado, es la señal. - totals=dict(recipes=n_recetas, nodes=len(recs), **by_state, - sealed_remoto=len(REMOTO_ONLY)), + # ⚠ `sealed_remoto` NO va acá, y la razón se descubrió al montar un segundo hub (2026-08-09): + # es un número que depende de QUÉ MÁQUINA lo calcula — el laptop tiene 219 artefactos en + # disco y gioser 19, así que el mismo corpus da 700 y 751. Metido en un fichero que se + # commitea, las dos máquinas se lo pisarían mutuamente en cada regeneración, para siempre. + # El estado del corpus es compartido; cuánto de él tiene ESTA máquina en el disco, no. + # Se sigue diciendo —abajo, en el resumen— donde sí es útil y no genera churn. + totals=dict(recipes=n_recetas, nodes=len(recs), **by_state), by_class={k: by_cls[k] for k in sorted(by_cls)}, debt_by_class={k: debt_by_cls[k] for k in sorted(debt_by_cls)}, by_queue={q: dict(c) for q, c in sorted(by_queue.items())}, @@ -346,6 +348,12 @@ def main(): for s in ("sealed", "debt", "never", "unhashable", "wanted"): if by_state.get(s): print(f" {s:11} {by_state[s]}") + if REMOTO_ONLY: + # Propio de ESTA máquina, por eso se imprime y no se escribe: de los `sealed`, cuántos no + # están en su disco y se dan por buenos por los manifiestos. Si sube sin que nadie haya + # sembrado, es la señal de que un manifiesto afirma algo que ya no existe en ningún lado. + print(f" de los sellados, {len(REMOTO_ONLY)} NO están en el disco de esta máquina " + f"(los avalan los manifiestos)") if debt_by_cls: print(" deuda por clase:", " ".join(f"{k}={v}" for k, v in sorted(debt_by_cls.items()))) if len(by_queue) > 1: