1# SDD 04 — Overlay de experimentación
2
3El overlay es la red de seguridad que convierte la mutabilidad total en algo que también es
4seguro: la capacidad de **cometer errores sin perder el control imperativo**. Es donde la IA
5prueba sus cambios antes de tocar el sistema real, y donde tú experimentas a mano sin miedo.
6
7## 1. El mecanismo
8
9Usa `overlayfs` nativo del kernel, gestionado dinámicamente desde la terminal:
10
11```
12 montaje overlay sobre /bin (y /etc, /lib…)
13 upperdir → /var/lib/hammer/overlays/<id>/upper (tmpfs o dir oculto, MUTABLE)
14 lowerdir → el /bin real (read-only de facto bajo el overlay)
15 merged → /bin (lo que ve el sistema)
16```
17
18Mientras el overlay está montado, el sistema y tú veis `/bin` como **el sistema real
19modificado en caliente**. Pero toda escritura cae en el `upperdir`; el `/bin` real (lowerdir)
20nunca se toca.
21
22## 2. El ciclo de vida
23
24```
25hammer try # monta un overlay sobre los directorios del sistema
26 ... experimentas / la IA inyecta binarios y edita configs ...
27 ... pruebas en caliente: ejecutas, rompes, observas ...
28hammer commit # fusiona upperdir → FHS real (rsync inteligente) y registra en el diario
29 — o —
30hammer discard # desmonta y borra el upperdir: el sistema vuelve al estado base, instantáneo
31```
32
33- **`try`** → estado base limpio + capa mutable encima. Riesgo cero.
34- **`discard`** → desmonta el overlay; el sistema vuelve a su base **instantáneamente**. No hay
35 que deshacer cambios uno por uno.
36- **`commit`** → fusiona la capa al FHS real y anota cada archivo tocado en el diario
37 ([SDD 05](05-journal.md)). A partir de aquí el cambio es permanente y rastreable.
38
39## 3. Por qué overlay y no contenedor
40
41Un contenedor (docker/chroot) te aísla de tus dispositivos y procesos reales — pierdes el
42acceso al sistema vivo. El overlay hace lo contrario: **modificas la "realidad" del sistema
43operativo** (mismos PIDs, mismos `/dev`, misma red) pero con una red de seguridad. Es la
44diferencia entre "probar en una maqueta" y "probar en la casa real con un seguro de vida".
45
46## 4. Composición con el resto del sistema
47
48- **La IA** (ver [SDD 08](08-ai-integration.md)) opera **siempre** dentro de un overlay: clona
49 el repo, compila en el lab, hidrata en el `upperdir`, edita configs en el `upper`. Tú validas
50 en caliente. La IA nunca escribe en el FHS real hasta que tú haces `commit`.
51- **Múltiples overlays** pueden coexistir (distintos `<id>`), p. ej. un experimento por
52 hipótesis. Cada uno es independiente.
53- **El diario** sólo registra en `commit` — el ruido del experimento no contamina la historia.
54
55## 5. Estados y reglas
56
57| Estado | Significado | Transiciones |
58|---|---|---|
59| `none` | sin overlay activo | `try` → `active` |
60| `active` | overlay montado, capa mutable encima | `commit` → `none` (+diario), `discard` → `none` |
61
62Reglas:
63- `commit`/`discard` sin overlay activo: no-op con aviso.
64- Un `try` anidado crea un overlay nuevo apilado; se desmontan en orden LIFO.
65- Si el sistema se apaga con overlays activos, al arranque `hammerd` los reporta y deja que el
66 humano decida (no auto-commit, no auto-discard — eso sería declarativo).
67
68## 6. Interfaz
69
70```rust
71// hammer-cli (con helpers de hammer-core)
72pub fn overlay_try(targets: &[PathBuf]) -> Result<OverlayId>;
73pub fn overlay_commit(id: OverlayId, journal: &Journal) -> Result<CommitReport>;
74pub fn overlay_discard(id: OverlayId) -> Result<()>;
75pub fn overlay_status() -> Result<Vec<OverlayState>>;
76```
77
78CLI: `hammer try` · `hammer commit` · `hammer discard` · `hammer status`.
04-overlay.md
SDD 04 — Overlay de experimentación
El overlay es la red de seguridad que convierte la mutabilidad total en algo que también es
seguro: la capacidad de cometer errores sin perder el control imperativo. Es donde la IA
prueba sus cambios antes de tocar el sistema real, y donde tú experimentas a mano sin miedo.
1. El mecanismo
Usa overlayfs nativo del kernel, gestionado dinámicamente desde la terminal:
montaje overlay sobre /bin (y /etc, /lib…)
upperdir → /var/lib/hammer/overlays/<id>/upper (tmpfs o dir oculto, MUTABLE)
lowerdir → el /bin real (read-only de facto bajo el overlay)
merged → /bin (lo que ve el sistema)
Mientras el overlay está montado, el sistema y tú veis /bin como el sistema real
modificado en caliente. Pero toda escritura cae en el upperdir; el /bin real (lowerdir)
nunca se toca.
2. El ciclo de vida
hammer try # monta un overlay sobre los directorios del sistema
... experimentas / la IA inyecta binarios y edita configs ...
... pruebas en caliente: ejecutas, rompes, observas ...
hammer commit # fusiona upperdir → FHS real (rsync inteligente) y registra en el diario
— o —
hammer discard # desmonta y borra el upperdir: el sistema vuelve al estado base, instantáneo
try → estado base limpio + capa mutable encima. Riesgo cero.
discard → desmonta el overlay; el sistema vuelve a su base instantáneamente. No hay
que deshacer cambios uno por uno.
commit → fusiona la capa al FHS real y anota cada archivo tocado en el diario
(SDD 05). A partir de aquí el cambio es permanente y rastreable.
3. Por qué overlay y no contenedor
Un contenedor (docker/chroot) te aísla de tus dispositivos y procesos reales — pierdes el
acceso al sistema vivo. El overlay hace lo contrario: modificas la "realidad" del sistema
operativo (mismos PIDs, mismos /dev, misma red) pero con una red de seguridad. Es la
diferencia entre "probar en una maqueta" y "probar en la casa real con un seguro de vida".
4. Composición con el resto del sistema
- La IA (ver SDD 08) opera siempre dentro de un overlay: clona
el repo, compila en el lab, hidrata en el
upperdir, edita configs en el upper. Tú validas
en caliente. La IA nunca escribe en el FHS real hasta que tú haces commit.
- Múltiples overlays pueden coexistir (distintos
<id>), p. ej. un experimento por
hipótesis. Cada uno es independiente.
- El diario sólo registra en
commit — el ruido del experimento no contamina la historia.
5. Estados y reglas
| Estado | Significado | Transiciones |
none | sin overlay activo | try → active |
active | overlay montado, capa mutable encima | commit → none (+diario), discard → none |
Reglas:
commit/discard sin overlay activo: no-op con aviso.
- Un
try anidado crea un overlay nuevo apilado; se desmontan en orden LIFO.
- Si el sistema se apaga con overlays activos, al arranque
hammerd los reporta y deja que el
humano decida (no auto-commit, no auto-discard — eso sería declarativo).
6. Interfaz
// hammer-cli (con helpers de hammer-core)
pub fn overlay_try(targets: &[PathBuf]) -> Result<OverlayId>;
pub fn overlay_commit(id: OverlayId, journal: &Journal) -> Result<CommitReport>;
pub fn overlay_discard(id: OverlayId) -> Result<()>;
pub fn overlay_status() -> Result<Vec<OverlayState>>;
CLI: hammer try · hammer commit · hammer discard · hammer status.