# SDD 10 — Roadmap ## Estrategia: validar la capa AI-nativa sobre Alpine antes de la distro propia La innovación de `hammer` no es la distro — es el substrato AI-nativo (build determinista + mutable + diario + `.swm`). Construir bootstrap + init + userland de cero antes de validar esa capa sería arriesgar meses contra una hipótesis no probada. Por eso: > **Fase 0–6:** montamos `hammer` **sobre Alpine** (musl + busybox + FHS mutable, ya cocidos). > Validamos el bucle completo en semanas. > **Track posterior:** una vez probado, bajamos a distro propia (init propio, bootstrap propio, > userland propio) reusando todo el tooling sin retrabajo. Ver [ADR 0002](adr/0002-alpine-first.md). --- ## Fases (sobre Alpine) ### Fase 0 — Laboratorio de build ✅ - [x] `hammer-core`: tipos `Recipe`, `ArtifactHash`, `Store` (BLAKE3, layout `/store`). - [x] `hammer-build`: sandbox con `bubblewrap` + `zig cc` → binario musl estático. - [x] CAS: hashing de entrada, caché por hash, sellado en el store. - [x] `hammer build ` → imprime el hash del artefacto. - [x] Fuente git **y** tarball (sha256 fijado), patches opcionales. - [x] Heurística de build system: autotools / cmake / meson / make plano. - [x] Caché persistente de zig entre builds (~30s/build ahorrados). ### Fase 1 — Hidratación ✅ - [x] `hydrate(hash, target, mode)`: hardlink a FHS, `patchelf` para el caso dinámico. - [x] `hammer hydrate --into /`. ### 🎯 Primer entregable (Fase 0 + 1) ✅ **GNU grep 3.12 compilado estático desde el tarball upstream, sellado en el store (`b3:b81e893e…`), hidratado por hardlink a `/usr/bin/grep` y ejecutado dentro del rootfs Alpine vía `bwrap`** — confirma el corazón "fábrica funcional → FHS mutable" sobre el substrato Alpine. La VM/LXC dedicada queda como ejercicio de empaque, no como pre-requisito de validación. ### Fase 2 — Overlay de experimentación ✅ - [x] Crate `hammer-overlay`: `try` / `commit` / `discard` / `status` sobre `overlayfs`. - [x] Manifiesto persistente en `//state.json`; `status` enumera. - [x] `commit` promociona archivos y procesa whiteouts (char dev 0/0) como remove. - [x] Subcomandos del CLI: `hammer try [targets…]`, `commit `, `discard `, `status`. - [x] Tests E2E con bwrap+user-ns, gateados en `HAMMER_OVERLAY_TESTS=1` (kernel-dependiente). - [x] Hook al diario en `commit` (Fase 3 lo añadió vía `commit_with_journal`). - [ ] Anidación real de overlays (un solo overlay activo por target hoy). ### Fase 3 — Diario de mutaciones ▶ *en progreso* - [x] Crate `hammer-journal`: `MutationEvent`, `Source` (HammerHydrate/HammerCommit/External), append/read/tail/follow JSON-líneas. RFC 3339 sin chrono. - [x] `hammerd` con `fanotify` (FAN_CLOSE_WRITE) sobre `/bin`,`/sbin`,`/usr/bin`,`/usr/sbin`, `/lib`,`/usr/lib`,`/etc`. Filtra eventos bajo overlays activos. Fallback graceful sin CAP_SYS_ADMIN. - [x] `hammer journal [--tail N] [--follow] [--format pretty|json]`. - [x] `hammer commit` registra cada archivo promocionado vía `commit_with_journal`. - [ ] Refinar op del watcher (Create vs Replace vs Edit con FAN_REPORT_DFID_NAME). - [ ] Hash del contenido tras la mutación (`content_hash`) y de-dup idempotente. ### Fase 4 — Formato y flujo `.swm` - [ ] `Swm` (de/serialización YAML), `hammer export`, `hammer apply` (con overlay), `verify`. - **Hecho cuando:** exportas un cambio, lo aplicas en otra máquina y reproduce idéntico. ### Fase 5 — Bus de agente - [ ] `/run/init.control` (FIFO humano) + `/run/agent.sock` (JSON-líneas, `SO_PEERCRED`). - [ ] Comandos `COMPILE`/`INJECT`/`QUERY`/`INIT`; eventos `BUILD_*`/`CRASHED`/`MODIFIED`. - **Hecho cuando:** un cliente externo dispara un build y recibe el evento de fin por el socket. ### Fase 6 — Integración de la IA - [ ] Cliente de agente; traductor intención NL → `.swm`; bucle plan→build→try→verify→propose. - **Hecho cuando:** una intención en lenguaje natural produce un cambio probado en overlay, presentado para `commit` humano. --- ## Track posterior — distro propia - Reemplazar el init de Alpine por **tu init** (bus por pipes nativo). - **Bootstrap from-scratch** con `zig`/`musl-cross-make` (Stage 0/1/2 → imagen destino). - Userland propio (busybox/toybox a elección), `/etc/service/*` propios. - Decidir particionado/montaje de `/store` y `/var/lib/hammer`. - Log de transparencia para compartir en comunidad ([SDD 09](09-trust-model.md) §4). - Mini-lenguaje de consulta del sistema para la IA ([SDD 08](08-ai-integration.md) §6). --- ## Estado actual - ✅ Repo y workspace Rust inicializados. - ✅ SDDs y ADRs redactados. - ✅ Esqueletos de crates que compilan (`hammer build` stub). - ⏭️ Siguiente: implementar el sandbox de build real (Fase 0) y montar la VM/LXC Alpine. ## Notas de entorno - Desarrollo principal: laptop del autor. - Host actual: Proxmox (`gioser.net`). La VM/LXC Alpine de pruebas vivirá aquí o en la laptop. - Repo: `https://gitea.gioser.net/sergio/hammer`.