diff --git a/site/site/content/adr/en/accepted/adr-072.md b/site/site/content/adr/en/accepted/adr-072.md
index 54d3ad1..ad2d63a 100644
--- a/site/site/content/adr/en/accepted/adr-072.md
+++ b/site/site/content/adr/en/accepted/adr-072.md
@@ -161,7 +161,7 @@ it is what nearly happened, and the word used at the time was "trivial"
Anti-patterns
-- The Witness That Certified a World Which No Longer Existed — A check is written against the mechanism as it is, and it is CORRECT. Then the mechanism is EXTENDED — a new format, a new level, a new owner, a new language — and the check stays where it was. It does not fail. It does not warn. It looks where it always looked, finds nothing wrong there, and signs in green. The blinding is caused by the IMPROVEMENT, which is why it is invisible: the moment a witness is most likely to go blind is the moment you extend what it watches, and that is also the moment you are least likely to be looking at the witness. It happened three times in four hours to one witness, on three consecutive improvements, with zero warnings emitted.
- Zero Findings Because the Check Could Not Look — A check's source fails to load — an export dies, a path does not resolve, a format is unknown — and the check returns an EMPTY result rather than a finding. Zero findings is then reported as clean. This is the worst available green, because it is indistinguishable from health by every downstream reader, and because the failure that produced it is often the most interesting thing on the run. The sibling defect: a RESOLVER that returns a wrong answer instead of NO answer — `.canonicalize().unwrap_or_else(|_| <the path that just failed>)` — so a missing directory travels three layers and surfaces as a bare 'IO error' and a blank page.
- A Gate That Can Be Turned Green Without Fixing Anything — A check measures a PROXY for the capability instead of the capability. It asks 'does this route declare a title key?' when the thing that matters is 'does this route render its content?'. The proxy is cheap to satisfy — fourteen strings — and satisfying it turns the gate green while the real defect (304 declared Fluent keys never rendered, ten pages returning 200 over an empty body) is untouched. The tell is the word used to describe the fix: 'trivial'. A gate that can be satisfied trivially will be, and then it certifies the defect it was built to catch.
- The File Exists, in the Tree No One Reads — A generator writes to a canonical tree, a server reads a served tree, and a recipe mirrors one into the other. Run the generator alone and the artifact is generated, validated, activated and INDEXED — and it is not on the page. Every existence check passes, because every one of them asks 'does the file exist?' and that question HAS A TRUE ANSWER in the tree nobody serves. Nothing is missing and nothing errors; the two trees simply hold different worlds, dated a day apart. The tell is the contradiction that looks impossible: the article answers 200, its entry is in the index, and the grid does not show it. Existence is not a property of a file — it is a property of the tree that is READ, and a check that never names which tree that is has not checked publication at all.
- Writing It in the Guide and Calling It Fixed — A structural defect — one that recurs because of how the system is built, not because of how anyone behaved — is met with a documented rule: 'remember to update the check'. It reads as diligence and it changes nothing, because a rule that depends on remembering fails exactly when memory is loaded, which is exactly when the defect is created. The disproof available here is total: the agent that broke this rule three times had AUTHORED it that same afternoon, in an ADR, under its own name (`gate-green-over-nothing`), with the text open. If a rule cannot hold its own author, hours later, it holds nobody.
+- The Witness That Certified a World Which No Longer Existed — A check is written against the mechanism as it is, and it is CORRECT. Then the mechanism is EXTENDED — a new format, a new level, a new owner, a new language — and the check stays where it was. It does not fail. It does not warn. It looks where it always looked, finds nothing wrong there, and signs in green. The blinding is caused by the IMPROVEMENT, which is why it is invisible: the moment a witness is most likely to go blind is the moment you extend what it watches, and that is also the moment you are least likely to be looking at the witness. It happened three times in four hours to one witness, on three consecutive improvements, with zero warnings emitted.
- Zero Findings Because the Check Could Not Look — A check's source fails to load — an export dies, a path does not resolve, a format is unknown — and the check returns an EMPTY result rather than a finding. Zero findings is then reported as clean. This is the worst available green, because it is indistinguishable from health by every downstream reader, and because the failure that produced it is often the most interesting thing on the run. The sibling defect: a RESOLVER that returns a wrong answer instead of NO answer — `.canonicalize().unwrap_or_else(|_| <the path that just failed>)` — so a missing directory travels three layers and surfaces as a bare 'IO error' and a blank page.
- «No existe», dicho por quien solo sabe que no lo encontró — El gemelo de `green-because-i-could-not-look` con otro sujeto: no una comprobación que devuelve vacío, sino un ACTOR que convierte su búsqueda fallida en una afirmación de inexistencia. La forma es siempre la misma — se interroga un oráculo ESTRECHO (un grep, un fichero, un comentario, un validador) y se reporta su respuesta como si fuera la ANCHA. La asimetría es lo letal: un oráculo estrecho puede confirmar que algo EXISTE; nunca puede establecer que no existe. «No lo encontré» y «no está» son afirmaciones distintas, y la segunda casi nunca cae dentro del alcance de quien la hace. Medido el 2026-07-16 en 4h07 (transcripción cab0fe5c, cada una trazable a su hora): «las glosas inglesas no están escritas» (14:06 — leído de un comentario del generador; había 20 escritas); «el esquema no tiene dónde colgar una glosa inglesa» (14:06 — leído `by_lang`; `term.ncl` la tenía en `definition | i18n_str`); «no hay tal comando, y no lo hubo» (14:16 — grep a `crates/*.rs` en un CLI con una capa Nushell entera: `describe term` llevaba funcionando desde siempre); «las 26 del léxico se quedan sin superficie» (15:23 — `gen-nota-lenguaje.nu` ya las publicaba); «el tooltip está bloqueado por contrato» (15:32 — leído un validador; `reason_type` traía 'SourceLanguage con una nota que decía dónde iba). Y su reverso en positivo: «Es esta sesión» (17:25) sobre un .jsonl elegido por fecha, con el id de sesión escrito en la ruta del propio scratchpad. Seis, y las falsaron todas un humano o una medición posterior. Ninguna la falsó el actor que la dijo: no hay nada que falsar, porque una frase no es un artefacto y no pasa por ninguna puerta.
- A Gate That Can Be Turned Green Without Fixing Anything — A check measures a PROXY for the capability instead of the capability. It asks 'does this route declare a title key?' when the thing that matters is 'does this route render its content?'. The proxy is cheap to satisfy — fourteen strings — and satisfying it turns the gate green while the real defect (304 declared Fluent keys never rendered, ten pages returning 200 over an empty body) is untouched. The tell is the word used to describe the fix: 'trivial'. A gate that can be satisfied trivially will be, and then it certifies the defect it was built to catch.
- The File Exists, in the Tree No One Reads — A generator writes to a canonical tree, a server reads a served tree, and a recipe mirrors one into the other. Run the generator alone and the artifact is generated, validated, activated and INDEXED — and it is not on the page. Every existence check passes, because every one of them asks 'does the file exist?' and that question HAS A TRUE ANSWER in the tree nobody serves. Nothing is missing and nothing errors; the two trees simply hold different worlds, dated a day apart. The tell is the contradiction that looks impossible: the article answers 200, its entry is in the index, and the grid does not show it. Existence is not a property of a file — it is a property of the tree that is READ, and a check that never names which tree that is has not checked publication at all.
- Writing It in the Guide and Calling It Fixed — A structural defect — one that recurs because of how the system is built, not because of how anyone behaved — is met with a documented rule: 'remember to update the check'. It reads as diligence and it changes nothing, because a rule that depends on remembering fails exactly when memory is loaded, which is exactly when the defect is created. The disproof available here is total: the agent that broke this rule three times had AUTHORED it that same afternoon, in an ADR, under its own name (`gate-green-over-nothing`), with the text open. If a rule cannot hold its own author, hours later, it holds nobody.
Related ADRs
diff --git a/site/update-content.sh b/site/update-content.sh
index 154142b..259c2ae 100755
--- a/site/update-content.sh
+++ b/site/update-content.sh
@@ -1 +1,26 @@
- nu ../../../website-htmx-rustelo/code/provisioning/content.nu sync --root "$(pwd)" # → snapshot al PV (/var/www/htmx-assets). Ya sin --all.
+#!/usr/bin/env bash
+# Publish this site's tree to the running pod, letting content.nu choose the
+# MINIMAL correct action from the changeset's reload class (distro.ncl ::
+# reload_classes): hot → no restart · restart → snapshot + rolling restart ·
+# rebuild → refused (that one needs a new image, not content).
+#
+# ./update-content.sh # classify + publish
+# ./update-content.sh --dry-run # say what it would do, touch nothing
+# ./update-content.sh --namespace x # any content.nu flag passes through
+#
+# Deploy identity (namespace / app_label / pvc / mount / cp_node) is resolved
+# from rustelo.manifest.toml — no literals here.
+#
+# NOT `sync`: sync packs only the `hot` subset and never restarts, so a change
+# under site/config or site/i18n/locales shipped green while the pod kept
+# serving the old one.
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+CONTENT_NU="${CONTENT_NU:-$SCRIPT_DIR/../../../website-htmx-rustelo/code/provisioning/content.nu}"
+
+[ -f "$CONTENT_NU" ] || { echo "content.nu not found: $CONTENT_NU" >&2; exit 1; }
+
+# --since is inert while this tree is not its own git root (it lives under the
+# outreach repo), so content.nu falls back to a full snapshot on every run.
+exec nu "$CONTENT_NU" publish --root "$SCRIPT_DIR" "$@"