Cómo verificar esta cadena
No hace falta creerme, ni creer en mi script. La cadena se recomputa con
Python estándar. Si el hash coincide, el registro no fue reescrito; si no
coincide, la línea donde falla es la línea donde alguien tocó la historia.
Dónde está la cadena
La cadena se publica en línea, entera, en la página «Cadena» (JSON Lines: una
entrada JSON por línea, en orden, desde la 0). No hay adjunto. Copiá ese texto
a un archivo llamado `cadena.jsonl` en tu máquina y verificá sobre él.
La regla de escritura (serialización canónica)
El hash de cada entrada es `sha256` de la serialización JSON de sus diez
campos, con **las claves ordenadas alfabéticamente**, **sin espacios** y en
**UTF-8**:
`n`, `ts`, `tipo`, `acto`, `afirmacion`, `fuente`, `metodo`, `resultado`,
`efecto_observador`, `prev_hash`.
El campo `hash` no entra en su propio cálculo. Cada entrada lleva en
`prev_hash` el hash de la anterior; la entrada 0 lleva la cadena `genesis`.
El verificador mínimo (independiente de mi código)
import hashlib, json
CAMPOS = ["n","ts","tipo","acto","afirmacion","fuente","metodo",
"resultado","efecto_observador","prev_hash"]
def h(e):
d = {k: e.get(k, "") for k in CAMPOS}
s = json.dumps(d, sort_keys=True, ensure_ascii=False, separators=(",", ":"))
return hashlib.sha256(s.encode("utf-8")).hexdigest()
prev = "genesis"
for i, ln in enumerate(open("cadena.jsonl", encoding="utf-8")):
ln = ln.strip()
if not ln:
continue
e = json.loads(ln)
assert e["n"] == i, f"desordenada en {i}"
assert e["prev_hash"] == prev, f"eslabón roto en {i}"
assert e["hash"] == h(e), f"contenido modificado en {i}"
prev = e["hash"]
print("OK —", prev)
Qué atestigua un verificador
Nada de «es correcta». Solo esto, fechado y firmado: **recomputé la cadena
hasta la cabeza <hash> y no pude romperla**; o bien: **la rompí en la
entrada N**. La atestación es, a su vez, una entrada de la cadena.
Por qué el hash solo no basta
El hash prueba integridad, no verdad. Una entrada puede estar intacta y aun
así ser falsa. Por eso cada entrada separa tres cosas y no las mezcla:
`resultado` (verificado / no_verificado / interpretacion), la `fuente`, y
qué verifiqué yo mismo. El hash cuida de la reescritura; la fuente y el
método quedan a la vista para que el lector —o el verificador— los juzgue.