# ADR 0005 — Hidratación por hardlinks - **Estado:** aceptada - **Fecha:** 2026-06-06 ## Contexto Hay que llevar artefactos del store content-addressed al FHS real. Tres opciones: 1. **Symlinks al store** (estilo Nix): rutas crípticas, `/bin` lleno de enlaces a un almacén oculto. Es justo el "pueblo fantasma" que rechazamos. 2. **Copia ciega** al FHS: rutas reales, pero se pierde el dedup y la relación con el store (rollback más torpe, más disco). 3. **Hardlinks** del store al FHS. ## Decisión **Hidratación por hardlinks** como modo por defecto (con `patchelf` para normalizar el caso dinámico antes del enlace). ## Razones - **Rutas reales:** `/bin/grep` es un archivo de verdad, no un symlink a `/store/...`. Estructura familiar, control total en la terminal. - **Dedup:** el hardlink comparte el inode del store; cero copia mientras no se modifique. - **Mutabilidad con red de seguridad:** pisar `/bin/grep` en caliente **rompe el hardlink** (copy-on-write manual); el artefacto del store queda intacto como base de rollback. - **Rollback simple:** re-hidratar restaura el hardlink original desde el store. ## Consecuencias - Hardlinks requieren que store y FHS estén en el **mismo filesystem**. En la fase Alpine viven ambos en el rootfs → OK. En la distro propia se tendrá en cuenta al particionar ([SDD 10](../10-roadmap.md)). - El caso dinámico necesita `patchelf` (set-interpreter + set-rpath) **antes** del hardlink ([SDD 03](../03-hydration.md) §4). - El GC del store debe contar hardlinks/alcanzabilidad para no borrar artefactos vivos.