Track posterior: Stage 0 del bootstrap (crate hammer-bootstrap) + ADR 0008
Primer eslabón ejecutable del bootstrap from-scratch (SDD 11). Stage 0 ingiere un
toolchain semilla pinned al store sin compilarlo:
- SeedSpec{kind,version,url,sha256}. seed_hash() deriva el ArtifactHash de la
identidad pinned (clase+versión+sha256), no de rutas del host ni del url → el
mismo tarball desde otro espejo produce el mismo artefacto.
- stage0(seed, store): descarga (curl, file:// offline-ok), verifica sha256
ANTES de extraer, untar y seal en el store. Idempotente si ya está sellado;
un sha erróneo no sella nada.
- Reusa el lab: hammer_build::download (+ nuevo verify_sha256 público), Store::seal.
Staging bajo el root del store para que el rename de seal sea atómico.
ADR 0008 fija la decisión (3 stages, zig semilla primaria, musl-cross-make
escotilla, ingerir-no-compilar el Stage 0). Renumerado a 0008 porque el 0007 lo
tomó la decisión de adoptar arje como init; SDD 11 y refs alineados con arje
(init supervisado que entrega el CRASHED real, ADR 0007).
4 unit tests (hash por identidad, ingest+seal+readonly, idempotencia, rechazo de
sha) sin red (file://). Workspace 218 verde.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
ea10c9f716
commit
3d6d25661c
@@ -40,7 +40,7 @@ confianza de Alpine y la deriva de su propio [log de transparencia](09-trust-mod
|
||||
└─────────────┬─────────────┘
|
||||
│ artifact_hash(seed) ← dependencia de build de todo lo demás
|
||||
┌─────────────▼─────────────┐
|
||||
│ Stage 1 — userland mínimo │ musl, busybox/toybox, init propio, hammerd,
|
||||
│ Stage 1 — userland mínimo │ musl, busybox/toybox, init arje, hammerd,
|
||||
│ cross-compilado │ cross-compilados CON Stage 0. Sale un rootfs sellado.
|
||||
└─────────────┬─────────────┘
|
||||
│ rootfs_hash(stage1)
|
||||
@@ -70,13 +70,14 @@ y se administra solo:
|
||||
|---|---|---|
|
||||
| `musl` | libc del target | zig cc (estático) |
|
||||
| `busybox` o `toybox` | coreutils + shell | zig cc (estático) |
|
||||
| `init` propio | PID 1 + bus por pipes nativo ([SDD 07](07-agent-bus.md)) | zig cc |
|
||||
| `hammerd` | diario + bus de agente + watcher | el toolchain Rust del lab |
|
||||
| `arje` | init: PID 1 + supervisión ([ADR 0007](adr/0007-arje-como-init-propio.md)) | toolchain Rust |
|
||||
| `hammerd` | diario + bus de agente + watcher, **servicio supervisado por arje** | toolchain Rust |
|
||||
|
||||
Todo se enlaza estático o con rpath controlado (sin depender del loader del host). El resultado
|
||||
se ensambla en un **rootfs** (árbol FHS) que a su vez se sella como un artefacto del store
|
||||
(`stage1_hash`). El init propio es la pieza que habilita `CRASHED` real (el único ítem diferido
|
||||
de la Fase 5): PID 1 supervisa servicios y publica `Crashed` al bus.
|
||||
(`stage1_hash`). El init **no se escribe de cero**: se adopta `arje`
|
||||
([ADR 0007](adr/0007-arje-como-init-propio.md)), cuyo PID 1 con supervisión real entrega el
|
||||
`CRASHED` real que la Fase 5 dejó diferido — `hammerd` corre como servicio bajo arje.
|
||||
|
||||
> El **kernel** no es el foco de este hito: se importa pinned (como la semilla) para poder
|
||||
> correr el rootfs. Construirlo desde fuente es un sub-ítem posterior, ortogonal al
|
||||
@@ -126,7 +127,7 @@ hammer bootstrap stage2 --verify
|
||||
hammer bootstrap --all # las tres + reporte de reproducibilidad
|
||||
```
|
||||
|
||||
## 6. Decisiones abiertas (a fijar en ADR 0007)
|
||||
## 6. Decisiones abiertas (fijadas en [ADR 0008](adr/0008-bootstrap-stages.md))
|
||||
|
||||
- **Semilla primaria:** `zig` vs `musl-cross-make`. Inclinación: `zig` por hermeticidad
|
||||
(ADR 0003), con `musl-cross-make` como escotilla por receta.
|
||||
|
||||
Reference in New Issue
Block a user