Bootstrap: manifiesto versionado (bootstrap.json) + Stage 0 anota su línea

Lote 1 del track posterior. Implementa el embrión del log de transparencia
(SDD 11 §4): crate hammer-bootstrap::manifest con BootstrapManifest/StageEntry.

- append-only e idempotente (de-dup por (stage, artifact_hash))
- escritura atómica (tmp + rename); ts informativo, fuera de todo hash
- stage0() anota su línea en ambos caminos (sello nuevo e idempotente);
  un sha erróneo no genera línea
- 9 tests nuevos (4 de manifest + 5 de stage0/manifest), workspace verde

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-06-10 23:54:28 +00:00
co-authored by Claude Opus 4.8
parent 1731e7ef23
commit ba4d520c44
5 changed files with 274 additions and 15 deletions
+10 -4
View File
@@ -98,12 +98,18 @@ hash(stage1) vs hash(stage1')
- **Distintos** ⇒ hay no-determinismo (timestamps, paths embebidos, orden de enlace). Se
caza y se elimina; es exactamente el trabajo que [SDD 09](09-trust-model.md) §2 exige.
## 4. Manifiesto de bootstrap (embrión del log de transparencia)
## 4. Manifiesto de bootstrap (embrión del log de transparencia)
Cada etapa anota una línea `(stage, recipe_hash, artifact_hash, seed_hash, ts)` en un
`bootstrap.json` versionado. Ese manifiesto **es** la semilla del log de transparencia
([SDD 09 §4](09-trust-model.md)): un tercero reproduce el bootstrap y verifica que sus hashes
coinciden con los publicados, sin confiar en el binario del autor.
`bootstrap.json` versionado (en la raíz del store). Ese manifiesto **es** la semilla del log de
transparencia ([SDD 09 §4](09-trust-model.md)): un tercero reproduce el bootstrap y verifica que
sus hashes coinciden con los publicados, sin confiar en el binario del autor.
Implementado en `hammer-bootstrap::manifest` (`BootstrapManifest` / `StageEntry`): append-only e
**idempotente** (de-dup por `(stage, artifact_hash)`), escritura atómica, y `ts` que **no** entra
en ningún hash (dos reproducciones del mismo bootstrap difieren a lo sumo en ese campo). Stage 0
ya anota su línea: `recipe_hash = None` (la semilla se ingiere, no se compila) y
`artifact_hash == seed_hash` (la semilla es a la vez insumo y producto).
## 5. Interfaz