645 líneas. Los ADR entran porque en este repo SON documentos vivos, no registros inmutables: el 0013 tiene 5 commits, el 0009 dos. Eso se comprobó antes de decidir, no se asumió por convención general. EXCLUIDOS por ser REGISTRO o generado: docs/evidencia/ (6), el HANDOFF de la noche de KDE (1) y docs/state/ (24, se regenera solo). Reescribir un comando dentro de una evidencia la falsifica. Y el ADR 0016 se excluye de todo barrido, con un aviso adentro para el próximo que barra: habla SOBRE el renombre, así que necesita seguir diciendo 'hammer'. El barrido se lo llevó puesto y lo dejó titulado 'Renombre del sistema: takana → takana'; revertido. Congelados, verificados uno por uno con controles: /opt/hammer, /var/lib/hammer, /usr/bin/hammer, /mnt/vvv/hammer, la URL de gitea, hammer-farm.service, hammer-live-install.sh, BRIEFING-hammer.md, hammerd, hammer-recover y HAMMER_LIVE.
71 lines
4.1 KiB
Markdown
71 lines
4.1 KiB
Markdown
# ADR 0007 — `arje` como init propio del track posterior
|
|
|
|
- **Estado:** propuesta
|
|
- **Fecha:** 2026-06-10
|
|
|
|
## Contexto
|
|
|
|
El roadmap ([SDD 10](../10-roadmap.md) §Track posterior) deja un ítem abierto: *"reemplazar el
|
|
init de Alpine por **tu init** (bus por pipes nativo) — habilita el `CRASHED` real que la Fase 5
|
|
dejó diferido"*. Construir ese init de cero sería meses de trabajo contra una pieza que **ya
|
|
existe** en el monorepo `tawasuyu`: **`arje`** (`03_ukupacha/arje`), un init/bootloader from-scratch
|
|
en Rust con PID 1 (`arje-zero`), supervisión real de servicios (`RestartTracker` +
|
|
`sandokan-lifecycle::Backoff`, restarts visibles end-to-end), bus interno por socket Unix
|
|
(`arje-bus`, postcard, `SO_PEERCRED`), CAS (`arje-cas`), snapshot (`arje-snapshot`), runtime WASM
|
|
(`arje-soma`+`arje-wasm`) y absorción de sistemas existentes (`arje-absorb`).
|
|
|
|
Al revisar arje contra takana aparece que **ambos convergieron en los mismos primitivos** por
|
|
caminos distintos: CAS direccionado por contenido, bus de agente sobre socket Unix con
|
|
`SO_PEERCRED`, firma Ed25519, y el principio "la IA propone, el humano dispone". Mantenerlos
|
|
separados duplicaría bus, CAS y modelo de confianza.
|
|
|
|
## Decisión
|
|
|
|
1. **arje es el init del track posterior de takana.** No se escribe un init nuevo. arje aporta
|
|
PID 1 + supervisión, lo que **entrega el `CRASHED` real** que la Fase 5 dejó diferido.
|
|
2. **Frontera de responsabilidades (PID 1 fino):**
|
|
- **arje** = boot, PID 1, supervisión/restart, mount del overlay, snapshot, CAS, atestación
|
|
al arranque.
|
|
- **takana** = laboratorio de build determinista, diario de mutaciones (`fanotify`), `.swm`
|
|
reproducible + firma, bucle agéntico con IA. `hammerd` corre como **servicio supervisado
|
|
por arje**.
|
|
3. **Un solo bus.** El control de ciclo de vida de `hammerd` va por `arje-bus`. El `agent.sock`
|
|
(JSON-líneas) de takana queda como **API de IA de alto nivel encima**, no como segundo plano
|
|
de control del init. `takana-core::proto` se comparte; el transporte es `arje-bus`.
|
|
4. **CAS unificado en BLAKE3.** takana ya usa BLAKE3 (prefijo `b3:`). arje migra `arje-cas` de
|
|
SHA-256 a BLAKE3 para hablar el mismo hash. El store pasa a ser un crate compartido.
|
|
5. **Modelo de confianza en capas.** takana **garantiza procedencia** (reproducir desde fuente
|
|
pública → `expected_hash` BLAKE3). arje/agora **atesta autorización** (`verificar_capacidad`
|
|
sobre `(blake3, permisos)` al boot). **El `expected_hash` de un `.swm` ES el BLAKE3 que arje
|
|
atesta.** Un `takana commit` promovido emite una concesión firmada que `arje-absorb` integra
|
|
al seed → el binario mutado por la IA queda atestado en el próximo arranque.
|
|
|
|
## Razones
|
|
|
|
- **No reinventar lo resuelto** (coherente con [ADR 0004](0004-no-custom-nix.md)): arje es un init
|
|
supervisor maduro; el `CRASHED` real sale gratis.
|
|
- **Bajar entropía, no subirla:** dos buses y dos CAS con la misma semántica son deuda. Un wire,
|
|
un hash, una política de capacidades.
|
|
- **El modelo de confianza se refuerza:** "verificar, no confiar" (procedencia) + "atestar al
|
|
boot" (autorización) cubren amenazas distintas y se encadenan por el hash sin acoplarse.
|
|
|
|
## Consecuencias
|
|
|
|
- **Track posterior** deja de necesitar "init propio from-scratch": adopta arje. El bootstrap
|
|
Stage 0/1 (toolchain semilla) sigue siendo de takana; el init lo pone arje.
|
|
- takana asume **BLAKE3** como hash único del store (ya lo es) y arje se alinea.
|
|
- Surge una dependencia de coordinación entre repos (`takana` ↔ `tawasuyu/03_ukupacha/arje`):
|
|
el wire de `arje-bus` y `takana-core::proto`, y el formato de la concesión de capacidad.
|
|
|
|
## Caveat estratégico
|
|
|
|
arje también es *"the natural bootloader for `wawa-kernel`"* (un SO nativo sin glibc/TCP-IP). La
|
|
**cage glibc** para software propietario (Steam/NVIDIA) es feature del mundo **takana/Linux**, no
|
|
de arje core — arje declara de sí mismo *"for boot, not for governing the running system"*.
|
|
Mantenerla fuera de PID 1 preserva tanto el init fino como el norte nativo de wawa.
|
|
|
|
## Coordinación
|
|
|
|
Plan completo (lado arje, con los puntos de inserción en el código y los primitivos de agora a
|
|
reusar): `tawasuyu:03_ukupacha/arje/PLAN-ATESTACION-Y-HAMMER.md`.
|