Reorganización física de crates/: - core/ (mezclaba 6 propósitos) se divide en protocol/, init/, runtime/, compat/ - shared/ (3 crates) se redistribuye en protocol/ e init/ - lapaloma (sub-módulo de ui_engine) se promueve a modules/pineal/ Renames de proyectos: - shipote → shuma (runtime de sandboxes) - nouser → akasha (explorador de Mónadas) - yahweh → nahual (motor GPUI, antes ui_engine/) - lapaloma → pineal (data-viz agnóstica) Fraccionamiento UI → core agnóstico: - vista-core (DeckState + snap, 175 LOC, 5 tests verdes) - barra-core (Task + render_html + sanitize, 90 LOC, 5 tests verdes) - vista-web y barra-web ahora son thin DOM bindings Documentación nueva: - 16 SDDs por subdirectorio (≤80 LOC c/u): protocol/init/runtime/compat + 10 módulos + apps/ - docs/STATUS.md con cifras reales por proyecto - docs/ROADMAP.md con plan a finalización (6 hitos, ~6-8 semanas) - CHANGELOG.md particionado en docs/changelog/<proyecto>.md (7 buckets) Automatización: - scripts/reorg.py — script idempotente que: git mv directorios, renombra package names, recomputa path = refs, reescribe imports rust, actualiza workspace Cargo.toml. Soporta --dry-run. - scripts/split-changelog.py — particiona CHANGELOG por componente. Validación: - cargo check --workspace pasa (124 crates + 2 nuevos cores). - 10 tests adicionales (5 en vista-core + 5 en barra-core) verdes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3.6 KiB
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:
BRAHMAN_LISTEN_MULTIADDR— si set, activa la red P2P. Ej:/ip4/0.0.0.0/tcp/4101(público),/ip4/127.0.0.1/tcp/0(loopback, port aleatorio). Sin la var,brahman_net = Noney todo sigue como antes.BRAHMAN_KEYPAIR_PATH— override del path donde se persiste la keypair Ed25519 de identidad libp2p del nodo. Defaults sensatos:- PID 1 (root):
/var/lib/brahman/init-keypair.bin. - Dev mode:
$XDG_DATA_HOME/brahman/init-keypair.bin→$HOME/.local/share/brahman/init-keypair.bin→/tmp/brahman-init-keypair.bin(último recurso).
- PID 1 (root):
BRAHMAN_BOOTSTRAP_PEERS— lista coma-separada de multiaddrs para dial-ear al arranque y entrar al DHT. Sin esto, el nodo arranca aislado hasta que alguien se conecte a él.
Comportamiento al activarse:
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 elpeer_id.BrahmanNet::with_keypair(kp)arma el swarm con esa identidad.net.listen(multiaddr)espera dirección resuelta y la loggea.BRAHMAN_BOOTSTRAP_PEERS(si set) → dial a cada multiaddr.- El handshake server se levanta con
ServerConfig.net = Some(net), que activaannounce_outputsautomático en el DHT por cada Card con outputs. - Además del Unix accept loop (existing), se monta un libp2p accept
loop sobre el mismo
Servercompartido. 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:
generate_persist_and_reload_yields_same_peer_id— peer_id estable across reloads (la propiedad fundamental).rejects_corrupted_file— archivo de tamaño incorrecto rechazado.persisted_file_is_owner_only— permisos 0o600 verificados.default_path_honors_env—BRAHMAN_KEYPAIR_PATHoverride respeta tanto dev como root mode.
Ente-zero compila clean. Ningún test del workspace regresa.
Lo que esto desbloquea hoy:
- Para activar Arje como nodo público, basta:
BRAHMAN_LISTEN_MULTIADDR=/ip4/0.0.0.0/tcp/4101 ente-zero - Cualquier consumer (en otra máquina) puede luego dial-ar a ese multiaddr + descubrir Cards anunciadas via DHT + abrir handshake remoto firmado.
- La identidad del nodo (su
peer_id) sobrevive reboots, así que los nodos remotos pueden cachear "este peer_id es Arje en máquina X" sin invalidarse cada vez.
Pendientes futuros:
stop_providingal cleanup de sesión (records DHT con TTL ~24h).- Allowlist/Denylist de peers (PKI explícito).
- Rotación de keypair sin perder peer_id (multi-key identity).