tawasuyu

tawasuyu/brahman

Rust 582TOML 222Markdown 83JSON 198635 Definitions

⎇ d1b700eb2bda9fa5f6f913d36f6ce1fb1e6d290b docs/changelog/init.md Markdown · 78 lines · 3.6 KB History raw

refactor(monorepo): reorganización lógica + renames + SDDs + split CHANGELOG 550c98f27 · sergio ·

1# Changelog — init/
2
3Init (PID 1) + encarnación Linux. Antes: `core/ente-{zero,kernel,soma,snapshot}` + `shared/ente-incarnate`.
4
5### feat(ente-zero): wire de Arje con brahman-net (red P2P opcional + identidad persistente)
6Cierra el último pendiente del plan de red: Arje ahora puede arrancar
7opcionalmente con `BrahmanNet` configurado, persistir su identidad
8libp2p entre reboots, y participar en la malla brahman como nodo
9público. Sin breaking changes: usuarios actuales (sin env vars) siguen
10viendo el comportamiento Unix-only de antes.
11
12Activación por env vars:
13- **`BRAHMAN_LISTEN_MULTIADDR`** — si set, activa la red P2P. Ej:
14  `/ip4/0.0.0.0/tcp/4101` (público), `/ip4/127.0.0.1/tcp/0` (loopback,
15  port aleatorio). Sin la var, `brahman_net = None` y todo sigue
16  como antes.
17- **`BRAHMAN_KEYPAIR_PATH`** — override del path donde se persiste
18  la keypair Ed25519 de identidad libp2p del nodo. Defaults sensatos:
19  - PID 1 (root): `/var/lib/brahman/init-keypair.bin`.
20  - Dev mode: `$XDG_DATA_HOME/brahman/init-keypair.bin` →
21    `$HOME/.local/share/brahman/init-keypair.bin` →
22    `/tmp/brahman-init-keypair.bin` (último recurso).
23- **`BRAHMAN_BOOTSTRAP_PEERS`** — lista coma-separada de multiaddrs
24  para dial-ear al arranque y entrar al DHT. Sin esto, el nodo
25  arranca aislado hasta que alguien se conecte a él.
26
27Comportamiento al activarse:
281. `keypair_store::load_or_generate(path)` carga la keypair de disco
29   o genera+persiste una nueva (32 bytes raw, permisos 0o600,
30   atomic rename). Reboots conservan el `peer_id`.
312. `BrahmanNet::with_keypair(kp)` arma el swarm con esa identidad.
323. `net.listen(multiaddr)` espera dirección resuelta y la loggea.
334. `BRAHMAN_BOOTSTRAP_PEERS` (si set) → dial a cada multiaddr.
345. El handshake server se levanta con `ServerConfig.net = Some(net)`,
35   que activa `announce_outputs` automático en el DHT por cada Card
36   con outputs.
376. Además del Unix accept loop (existing), se monta un libp2p accept
38   loop sobre el mismo `Server` compartido. Sesiones locales y
39   remotas conviven en las mismas tablas (sessions, push_table,
40   broker, last_matches).
41
42Refactor del Unix accept loop: antes consumía el server vía
43`server.run().await`; ahora usa `Arc<Server>::accept_one().await` en
44loop para coexistir con el libp2p accept loop sin moverse el server.
45
46Degradación grácil en cada paso: si la keypair no carga, si el
47multiaddr es inválido, si el listen falla, si el bootstrap dial
48revienta — loggeamos y seguimos en modo Unix-only. La doctrina de
49PID 1 ("ningún subsistema opcional rompe el bucle primordial") se
50mantiene.
51
52Tests: 4 unit en `keypair_store`:
53- `generate_persist_and_reload_yields_same_peer_id` — peer_id estable
54  across reloads (la propiedad fundamental).
55- `rejects_corrupted_file` — archivo de tamaño incorrecto rechazado.
56- `persisted_file_is_owner_only` — permisos 0o600 verificados.
57- `default_path_honors_env` — `BRAHMAN_KEYPAIR_PATH` override
58  respeta tanto dev como root mode.
59
60Ente-zero compila clean. Ningún test del workspace regresa.
61
62Lo que esto desbloquea hoy:
63- Para activar Arje como nodo público, basta:
64  ```sh
65  BRAHMAN_LISTEN_MULTIADDR=/ip4/0.0.0.0/tcp/4101 ente-zero
66  ```
67- Cualquier consumer (en otra máquina) puede luego dial-ar a ese
68  multiaddr + descubrir Cards anunciadas via DHT + abrir handshake
69  remoto firmado.
70- La identidad del nodo (su `peer_id`) sobrevive reboots, así que
71  los nodos remotos pueden cachear "este peer_id es Arje en
72  máquina X" sin invalidarse cada vez.
73
74Pendientes futuros:
75- `stop_providing` al cleanup de sesión (records DHT con TTL ~24h).
76- Allowlist/Denylist de peers (PKI explícito).
77- Rotación de keypair sin perder peer_id (multi-key identity).
78

init.md

Changelog — init/

Init (PID 1) + encarnación Linux. Antes: core/ente-{zero,kernel,soma,snapshot} + shared/ente-incarnate.

feat(ente-zero): wire de Arje con brahman-net (red P2P opcional + identidad persistente)

Cierra el último pendiente del plan de red: Arje ahora puede arrancar opcionalmente con BrahmanNet configurado, persistir su identidad libp2p entre reboots, y participar en la malla brahman como nodo público. Sin breaking changes: usuarios actuales (sin env vars) siguen viendo el comportamiento Unix-only de antes.

Activación por env vars:

Comportamiento al activarse:

  1. keypair_store::load_or_generate(path) carga la keypair de disco o genera+persiste una nueva (32 bytes raw, permisos 0o600, atomic rename). Reboots conservan el peer_id.
  2. BrahmanNet::with_keypair(kp) arma el swarm con esa identidad.
  3. net.listen(multiaddr) espera dirección resuelta y la loggea.
  4. BRAHMAN_BOOTSTRAP_PEERS (si set) → dial a cada multiaddr.
  5. El handshake server se levanta con ServerConfig.net = Some(net), que activa announce_outputs automático en el DHT por cada Card con outputs.
  6. Además del Unix accept loop (existing), se monta un libp2p accept loop sobre el mismo Server compartido. Sesiones locales y remotas conviven en las mismas tablas (sessions, push_table, broker, last_matches).

Refactor del Unix accept loop: antes consumía el server vía server.run().await; ahora usa Arc<Server>::accept_one().await en loop para coexistir con el libp2p accept loop sin moverse el server.

Degradación grácil en cada paso: si la keypair no carga, si el multiaddr es inválido, si el listen falla, si el bootstrap dial revienta — loggeamos y seguimos en modo Unix-only. La doctrina de PID 1 ("ningún subsistema opcional rompe el bucle primordial") se mantiene.

Tests: 4 unit en keypair_store:

Ente-zero compila clean. Ningún test del workspace regresa.

Lo que esto desbloquea hoy:

Pendientes futuros: