tawasuyu

tawasuyu/brahman

Rust 582TOML 222Markdown 83JSON 198635 Definitions

refactor(naming): A1 — ente→arje, vista→revista, pluma→fana

Rename batch de la Fase A del PLAN_MACRO:
- 25 crates ente-* → arje-* (protocol/init/runtime/compat). El linaje
  arje (init Linux) queda con prefijo coherente.
- vista → revista (revista-core + revista-web).
- pluma → fana (fana-md + fana-md-reader-web). fana absorbe el linaje
  markdown de pluma; será el writer DAG editor (prioridad alta).

Cambios:
- git mv de 29 crate dirs + 2 SDDs
- package/lib/bin names + path refs + imports .rs reescritos
- workspace Cargo.toml + comentarios de sección
- SDDs de init/runtime/compat/protocol actualizados a arje-
- SDD de revista + SDD de fana (reescrito: writer DAG editor)
- docs/STATUS.md, ROADMAP.md, PLAN_MACRO.md, arje-boot.md,
  arje-replace-systemd.md actualizados
- docs/changelog/akasha.md → chasqui.md

scripts/rename-fase-a.py idempotente (--dry-run soportado).
cargo check --workspace verde.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

b83d40a833f70e0f2345993e1d41add5588d4544 · by sergio · (5 months ago) · parent 3fc6dcfa7 · browse the tree at this commit

Semantic delta · 2155

crates/apps/akasha-explorer/src/main.rs

crates/apps/chasqui-explorer/src/main.rs

crates/compat/arje-binfmt-compat/src/main.rs

crates/compat/arje-journald-compat/src/journalctl.rs

crates/compat/arje-journald-compat/src/main.rs

crates/compat/arje-localed-compat/src/main.rs

crates/compat/arje-logind-compat/src/main.rs

crates/compat/arje-machined-compat/src/main.rs

crates/compat/arje-notify-compat/src/main.rs

crates/compat/arje-policy-provider/src/main.rs

crates/compat/arje-resolved-compat/src/main.rs

crates/compat/arje-systemd1-compat/src/main.rs

crates/compat/arje-timedated-compat/src/main.rs

crates/compat/arje-timer-compat/src/main.rs

crates/compat/arje-tmpfiles-compat/src/main.rs

crates/compat/ente-binfmt-compat/src/main.rs

crates/compat/ente-hostnamed-compat/src/main.rs

crates/compat/ente-journald-compat/src/journalctl.rs

crates/compat/ente-journald-compat/src/main.rs

crates/compat/ente-localed-compat/src/main.rs

crates/compat/ente-logind-compat/src/main.rs

crates/compat/ente-machined-compat/src/main.rs

crates/compat/ente-notify-compat/src/main.rs

crates/compat/ente-policy-provider/src/main.rs

crates/compat/ente-polkit-compat/src/main.rs

crates/compat/ente-resolved-compat/src/main.rs

crates/compat/ente-systemd1-compat/src/main.rs

crates/compat/ente-timedated-compat/src/main.rs

crates/compat/ente-timer-compat/src/main.rs

crates/compat/ente-tmpfiles-compat/src/main.rs

crates/init/arje-incarnate/src/caps.rs

crates/init/arje-incarnate/src/cgroup.rs

crates/init/arje-incarnate/src/child.rs

crates/init/arje-incarnate/src/env.rs

crates/init/arje-incarnate/src/error.rs

crates/init/arje-incarnate/src/lib.rs

crates/init/arje-incarnate/src/namespaced.rs

crates/init/arje-incarnate/src/plain.rs

crates/init/arje-incarnate/src/pre_exec.rs

crates/init/arje-kernel/src/lib.rs

crates/init/arje-kernel/src/sigchld.rs

crates/init/arje-kernel/src/surface.rs

crates/init/arje-kernel/src/uevent.rs

crates/init/arje-snapshot/src/lib.rs

crates/init/arje-soma/src/lib.rs

crates/init/arje-zero/src/brain_glue.rs

crates/init/arje-zero/src/bus.rs

crates/init/arje-zero/src/events.rs

crates/init/arje-zero/src/graph/bus_mediator.rs

crates/init/arje-zero/src/graph/capabilities.rs

crates/init/arje-zero/src/graph/devices.rs

crates/init/arje-zero/src/graph/lifecycle.rs

crates/init/arje-zero/src/graph/mod.rs

crates/init/arje-zero/src/graph/shutdown.rs

crates/init/arje-zero/src/graph/topology.rs

crates/init/arje-zero/src/main.rs

crates/init/arje-zero/src/seed.rs

crates/init/ente-incarnate/src/caps.rs

crates/init/ente-incarnate/src/cgroup.rs

crates/init/ente-incarnate/src/child.rs

crates/init/ente-incarnate/src/env.rs

crates/init/ente-incarnate/src/error.rs

crates/init/ente-incarnate/src/lib.rs

crates/init/ente-incarnate/src/namespaced.rs

crates/init/ente-incarnate/src/plain.rs

crates/init/ente-incarnate/src/pre_exec.rs

crates/init/ente-kernel/src/lib.rs

crates/init/ente-kernel/src/sigchld.rs

crates/init/ente-kernel/src/surface.rs

crates/init/ente-kernel/src/uevent.rs

crates/init/ente-snapshot/src/lib.rs

crates/init/ente-soma/src/lib.rs

crates/init/ente-zero/src/brain_glue.rs

crates/init/ente-zero/src/bus.rs

crates/init/ente-zero/src/events.rs

crates/init/ente-zero/src/graph/bus_mediator.rs

crates/init/ente-zero/src/graph/capabilities.rs

crates/init/ente-zero/src/graph/devices.rs

crates/init/ente-zero/src/graph/lifecycle.rs

crates/init/ente-zero/src/graph/mod.rs

crates/init/ente-zero/src/graph/shutdown.rs

crates/init/ente-zero/src/graph/topology.rs

crates/init/ente-zero/src/keypair_store.rs

crates/init/ente-zero/src/main.rs

crates/init/ente-zero/src/seed.rs

crates/modules/akasha/card/src/lib.rs

crates/modules/akasha/card/src/query.rs

crates/modules/akasha/core/src/bin/nouser.rs

crates/modules/akasha/core/src/db.rs

crates/modules/akasha/core/src/embed.rs

crates/modules/akasha/core/src/engine_socket.rs

crates/modules/akasha/core/src/lib.rs

crates/modules/akasha/core/src/scanner.rs

crates/modules/akasha/nous-mock/src/main.rs

crates/modules/akasha/nous-real/src/cache.rs

crates/modules/akasha/nous-real/src/embeddings.rs

crates/modules/akasha/nous-real/src/main.rs

crates/modules/akasha/nous-real/src/stub.rs

crates/modules/akasha/nous/src/lib.rs

crates/modules/chasqui/card/src/lib.rs

crates/modules/chasqui/card/src/query.rs

crates/modules/chasqui/core/src/bin/nouser.rs

crates/modules/chasqui/core/src/db.rs

crates/modules/chasqui/core/src/engine_socket.rs

crates/modules/chasqui/core/src/lib.rs

crates/modules/chasqui/core/src/scanner.rs

crates/modules/chasqui/nous-mock/src/main.rs

crates/modules/chasqui/nous-real/src/cache.rs

crates/modules/chasqui/nous-real/src/embeddings.rs

crates/modules/chasqui/nous-real/src/main.rs

crates/modules/chasqui/nous-real/src/stub.rs

crates/modules/chasqui/nous/src/lib.rs

crates/modules/fana/fana-md-reader-web/src/lib.rs

crates/modules/fana/fana-md/src/lib.rs

crates/modules/pluma/pluma-md/src/lib.rs

crates/modules/pluma/pluma-reader-web/src/lib.rs

crates/modules/revista/revista-core/src/lib.rs

crates/modules/revista/revista-web/src/lib.rs

crates/modules/shuma/shuma-core/src/lib.rs

crates/modules/shuma/shuma-core/src/pipeline.rs

crates/modules/vista/vista-core/src/lib.rs

crates/modules/vista/vista-web/src/lib.rs

crates/protocol/brahman-card/src/lib.rs

crates/protocol/brahman-sidecar/src/discovery.rs

crates/runtime/arje-brain/examples/brainctl.rs

crates/runtime/arje-brain/src/audit.rs

crates/runtime/arje-brain/src/autopromote.rs

crates/runtime/arje-brain/src/crystallize.rs

crates/runtime/arje-brain/src/dispatch.rs

crates/runtime/arje-brain/src/introspect.rs

crates/runtime/arje-brain/src/lib.rs

crates/runtime/arje-brain/src/metrics.rs

crates/runtime/arje-brain/src/observer.rs

crates/runtime/arje-brain/src/rules.rs

crates/runtime/arje-bus/examples/busctl.rs

crates/runtime/arje-bus/src/lib.rs

crates/runtime/arje-cas/src/lib.rs

crates/runtime/arje-echo/src/lib.rs

crates/runtime/arje-echo/src/main.rs

crates/runtime/arje-wasm/src/lib.rs

crates/runtime/ente-brain/examples/brainctl.rs

crates/runtime/ente-brain/src/audit.rs

crates/runtime/ente-brain/src/autopromote.rs

crates/runtime/ente-brain/src/crystallize.rs

crates/runtime/ente-brain/src/dispatch.rs

crates/runtime/ente-brain/src/engine.rs

crates/runtime/ente-brain/src/introspect.rs

crates/runtime/ente-brain/src/lib.rs

crates/runtime/ente-brain/src/loader.rs

crates/runtime/ente-brain/src/metrics.rs

crates/runtime/ente-brain/src/observer.rs

crates/runtime/ente-brain/src/rules.rs

crates/runtime/ente-bus/examples/busctl.rs

crates/runtime/ente-bus/src/lib.rs

crates/runtime/ente-cas/src/lib.rs

crates/runtime/ente-echo/src/lib.rs

crates/runtime/ente-echo/src/main.rs

crates/runtime/ente-wasm/src/lib.rs

scripts/rename-chasqui.py

scripts/rename-fase-a.py

276 files · +19967 −18694

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 156af8c..c986739 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ Histórico particionado el 2026-05-19 por proyecto/intención. Cada
 archivo bajo `docs/changelog/` consolida las entradas de un
 subdirectorio del workspace.
 
-- [`akasha`](docs/changelog/akasha.md) — 15 entradas
+- [`chasqui`](docs/changelog/chasqui.md) — 15 entradas
 - [`init`](docs/changelog/init.md) — 1 entradas
 - [`minga`](docs/changelog/minga.md) — 5 entradas
 - [`misc`](docs/changelog/misc.md) — 2 entradas
diff --git a/Cargo.lock b/Cargo.lock
index 88352fe..225933b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -115,97 +115,6 @@ dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "akasha-card"
-version = "0.1.0"
-dependencies = [
- "brahman-card",
- "serde",
- "serde_json",
- "thiserror 2.0.18",
- "ulid",
-]
-
-[[package]]
-name = "akasha-core"
-version = "0.1.0"
-dependencies = [
- "akasha-card",
- "akasha-nous",
- "blake3",
- "brahman-card",
- "brahman-handshake",
- "brahman-sidecar",
- "notify",
- "serde",
- "serde_json",
- "shuma-discern",
- "sled",
- "tempfile",
- "thiserror 2.0.18",
- "tokio",
- "ulid",
- "walkdir",
-]
-
-[[package]]
-name = "akasha-explorer"
-version = "0.1.0"
-dependencies = [
- "akasha-card",
- "brahman-card",
- "brahman-sidecar",
- "gpui",
- "nahual-launcher",
- "nahual-theme",
- "nahual-widget-app-header",
- "nahual-widget-banner",
- "nahual-widget-card",
-]
-
-[[package]]
-name = "akasha-nous"
-version = "0.1.0"
-dependencies = [
- "serde",
- "serde_json",
- "thiserror 2.0.18",
-]
-
-[[package]]
-name = "akasha-nous-mock"
-version = "0.1.0"
-dependencies = [
- "akasha-card",
- "akasha-core",
- "akasha-nous",
- "brahman-card",
- "brahman-sidecar",
- "serde_json",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "ulid",
-]
-
-[[package]]
-name = "akasha-nous-real"
-version = "0.1.0"
-dependencies = [
- "akasha-nous",
- "brahman-card",
- "brahman-sidecar",
- "ente-cas",
- "fastembed",
- "serde_json",
- "sled",
- "tempfile",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "ulid",
-]
-
 [[package]]
 name = "aliasable"
 version = "0.1.3"
@@ -376,6 +285,339 @@ dependencies = [
  "password-hash",
 ]
 
+[[package]]
+name = "arje-binfmt-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-brain"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-card",
+ "arje-cas",
+ "base64 0.22.1",
+ "bincode",
+ "postcard",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "ulid",
+]
+
+[[package]]
+name = "arje-bus"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-card",
+ "arje-echo",
+ "postcard",
+ "serde",
+ "tokio",
+ "tracing",
+ "ulid",
+]
+
+[[package]]
+name = "arje-card"
+version = "0.0.1"
+dependencies = [
+ "brahman-card",
+]
+
+[[package]]
+name = "arje-cas"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "sha2",
+ "tracing",
+]
+
+[[package]]
+name = "arje-echo"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-hostnamed-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "libc",
+ "nix 0.29.0",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-incarnate"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "brahman-card",
+ "libc",
+ "nix 0.29.0",
+ "tempfile",
+ "thiserror 2.0.18",
+ "tracing",
+]
+
+[[package]]
+name = "arje-journald-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "arje-cas",
+ "libc",
+ "nix 0.29.0",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-kernel"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-card",
+ "libc",
+ "nix 0.29.0",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "arje-localed-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-logind-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-machined-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-notify-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "libc",
+ "nix 0.29.0",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-policy-provider"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-polkit-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-resolved-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "libc",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-snapshot"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-card",
+ "serde",
+ "serde_json",
+ "ulid",
+]
+
+[[package]]
+name = "arje-soma"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "arje-incarnate",
+ "nix 0.29.0",
+ "tracing",
+]
+
+[[package]]
+name = "arje-systemd1-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-timedated-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "zbus 4.4.0",
+]
+
+[[package]]
+name = "arje-timer-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-bus",
+ "arje-card",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "ulid",
+]
+
+[[package]]
+name = "arje-tmpfiles-compat"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "libc",
+ "nix 0.29.0",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "arje-wasm"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-card",
+ "tracing",
+ "ulid",
+ "wasmi",
+ "wat",
+]
+
+[[package]]
+name = "arje-zero"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "arje-brain",
+ "arje-bus",
+ "arje-card",
+ "arje-cas",
+ "arje-echo",
+ "arje-kernel",
+ "arje-snapshot",
+ "arje-soma",
+ "arje-wasm",
+ "brahman-admin",
+ "brahman-broker",
+ "brahman-handshake",
+ "brahman-net",
+ "libc",
+ "nix 0.29.0",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "ulid",
+]
+
 [[package]]
 name = "arraydeque"
 version = "0.5.1"
@@ -1438,8 +1680,8 @@ dependencies = [
 name = "brahman-cards"
 version = "0.1.0"
 dependencies = [
- "akasha-card",
  "brahman-card",
+ "chasqui-card",
  "nahual-meta-schema",
  "nickel-lang",
  "serde",
@@ -1798,6 +2040,97 @@ dependencies = [
  "zeroize",
 ]
 
+[[package]]
+name = "chasqui-card"
+version = "0.1.0"
+dependencies = [
+ "brahman-card",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.18",
+ "ulid",
+]
+
+[[package]]
+name = "chasqui-core"
+version = "0.1.0"
+dependencies = [
+ "blake3",
+ "brahman-card",
+ "brahman-handshake",
+ "brahman-sidecar",
+ "chasqui-card",
+ "chasqui-nous",
+ "notify",
+ "serde",
+ "serde_json",
+ "shuma-discern",
+ "sled",
+ "tempfile",
+ "thiserror 2.0.18",
+ "tokio",
+ "ulid",
+ "walkdir",
+]
+
+[[package]]
+name = "chasqui-explorer"
+version = "0.1.0"
+dependencies = [
+ "brahman-card",
+ "brahman-sidecar",
+ "chasqui-card",
+ "gpui",
+ "nahual-launcher",
+ "nahual-theme",
+ "nahual-widget-app-header",
+ "nahual-widget-banner",
+ "nahual-widget-card",
+]
+
+[[package]]
+name = "chasqui-nous"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "thiserror 2.0.18",
+]
+
+[[package]]
+name = "chasqui-nous-mock"
+version = "0.1.0"
+dependencies = [
+ "brahman-card",
+ "brahman-sidecar",
+ "chasqui-card",
+ "chasqui-core",
+ "chasqui-nous",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "ulid",
+]
+
+[[package]]
+name = "chasqui-nous-real"
+version = "0.1.0"
+dependencies = [
+ "arje-cas",
+ "brahman-card",
+ "brahman-sidecar",
+ "chasqui-nous",
+ "fastembed",
+ "serde_json",
+ "sled",
+ "tempfile",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "ulid",
+]
+
 [[package]]
 name = "chrono"
 version = "0.4.44"
@@ -3013,486 +3346,153 @@ checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
 [[package]]
 name = "dtoa-short"
 version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
-dependencies = [
- "dtoa",
-]
-
-[[package]]
-name = "dtor"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8"
-dependencies = [
- "dtor-proc-macro",
-]
-
-[[package]]
-name = "dtor-proc-macro"
-version = "0.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055"
-
-[[package]]
-name = "dunce"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
-
-[[package]]
-name = "dwrote"
-version = "0.11.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02"
-dependencies = [
- "lazy_static",
- "libc",
- "winapi",
- "wio",
-]
-
-[[package]]
-name = "dyn-clone"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
-
-[[package]]
-name = "earcutr"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01"
-dependencies = [
- "itertools 0.11.0",
- "num-traits",
-]
-
-[[package]]
-name = "ed25519"
-version = "2.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
-dependencies = [
- "pkcs8",
- "signature",
-]
-
-[[package]]
-name = "ed25519-dalek"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
-dependencies = [
- "curve25519-dalek",
- "ed25519",
- "serde",
- "sha2",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "either"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
-
-[[package]]
-name = "embed-resource"
-version = "3.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb"
-dependencies = [
- "cc",
- "memchr",
- "rustc_version",
- "toml 1.1.2+spec-1.1.0",
- "vswhom",
- "winreg",
-]
-
-[[package]]
-name = "embedded-io"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
-
-[[package]]
-name = "embedded-io"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
-
-[[package]]
-name = "ena"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "encode_unicode"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "endi"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
-
-[[package]]
-name = "endian-type"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
-
-[[package]]
-name = "ente-binfmt-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "ente-brain"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "base64 0.22.1",
- "bincode",
- "ente-card",
- "ente-cas",
- "postcard",
- "serde",
- "serde_json",
- "tokio",
- "tracing",
- "ulid",
-]
-
-[[package]]
-name = "ente-bus"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-card",
- "ente-echo",
- "postcard",
- "serde",
- "tokio",
- "tracing",
- "ulid",
-]
-
-[[package]]
-name = "ente-card"
-version = "0.0.1"
-dependencies = [
- "brahman-card",
-]
-
-[[package]]
-name = "ente-cas"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "sha2",
- "tracing",
-]
-
-[[package]]
-name = "ente-echo"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "ente-hostnamed-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "libc",
- "nix 0.29.0",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
-]
-
-[[package]]
-name = "ente-incarnate"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "brahman-card",
- "libc",
- "nix 0.29.0",
- "tempfile",
- "thiserror 2.0.18",
- "tracing",
-]
-
-[[package]]
-name = "ente-journald-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "ente-cas",
- "libc",
- "nix 0.29.0",
- "tokio",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "ente-kernel"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-card",
- "libc",
- "nix 0.29.0",
- "tokio",
- "tracing",
-]
-
-[[package]]
-name = "ente-localed-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
+dependencies = [
+ "dtoa",
 ]
 
 [[package]]
-name = "ente-logind-compat"
-version = "0.0.1"
+name = "dtor"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8"
 dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
+ "dtor-proc-macro",
 ]
 
 [[package]]
-name = "ente-machined-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
-]
+name = "dtor-proc-macro"
+version = "0.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055"
 
 [[package]]
-name = "ente-notify-compat"
-version = "0.0.1"
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "dwrote"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02"
 dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
+ "lazy_static",
  "libc",
- "nix 0.29.0",
- "tokio",
- "tracing",
- "tracing-subscriber",
+ "winapi",
+ "wio",
 ]
 
 [[package]]
-name = "ente-policy-provider"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "serde",
- "serde_json",
- "tokio",
- "tracing",
- "tracing-subscriber",
-]
+name = "dyn-clone"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
 
 [[package]]
-name = "ente-polkit-compat"
-version = "0.0.1"
+name = "earcutr"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01"
 dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
+ "itertools 0.11.0",
+ "num-traits",
 ]
 
 [[package]]
-name = "ente-resolved-compat"
-version = "0.0.1"
+name = "ed25519"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
 dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "libc",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
+ "pkcs8",
+ "signature",
 ]
 
 [[package]]
-name = "ente-snapshot"
-version = "0.0.1"
+name = "ed25519-dalek"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
 dependencies = [
- "anyhow",
- "ente-card",
+ "curve25519-dalek",
+ "ed25519",
  "serde",
- "serde_json",
- "ulid",
+ "sha2",
+ "subtle",
+ "zeroize",
 ]
 
 [[package]]
-name = "ente-soma"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "ente-incarnate",
- "nix 0.29.0",
- "tracing",
-]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
 
 [[package]]
-name = "ente-systemd1-compat"
-version = "0.0.1"
+name = "embed-resource"
+version = "3.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb"
 dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 1.1.2+spec-1.1.0",
+ "vswhom",
+ "winreg",
 ]
 
 [[package]]
-name = "ente-timedated-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "zbus 4.4.0",
-]
+name = "embedded-io"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
 
 [[package]]
-name = "ente-timer-compat"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-bus",
- "ente-card",
- "serde",
- "serde_json",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "ulid",
-]
+name = "embedded-io"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
 
 [[package]]
-name = "ente-tmpfiles-compat"
-version = "0.0.1"
+name = "ena"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1"
 dependencies = [
- "anyhow",
- "libc",
- "nix 0.29.0",
- "tracing",
- "tracing-subscriber",
+ "log",
 ]
 
 [[package]]
-name = "ente-wasm"
-version = "0.0.1"
-dependencies = [
- "anyhow",
- "ente-card",
- "tracing",
- "ulid",
- "wasmi",
- "wat",
-]
+name = "encode_unicode"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
 
 [[package]]
-name = "ente-zero"
-version = "0.0.1"
+name = "encoding_rs"
+version = "0.8.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
 dependencies = [
- "anyhow",
- "brahman-admin",
- "brahman-broker",
- "brahman-handshake",
- "brahman-net",
- "ente-brain",
- "ente-bus",
- "ente-card",
- "ente-cas",
- "ente-echo",
- "ente-kernel",
- "ente-snapshot",
- "ente-soma",
- "ente-wasm",
- "libc",
- "nix 0.29.0",
- "serde",
- "serde_json",
- "tempfile",
- "tokio",
- "tracing",
- "tracing-subscriber",
- "ulid",
+ "cfg-if",
 ]
 
+[[package]]
+name = "endi"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
+
+[[package]]
+name = "endian-type"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
+
 [[package]]
 name = "enum-as-inner"
 version = "0.6.1"
@@ -3747,6 +3747,24 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
 
+[[package]]
+name = "fana-md"
+version = "0.1.0"
+dependencies = [
+ "pulldown-cmark",
+]
+
+[[package]]
+name = "fana-md-reader-web"
+version = "0.1.0"
+dependencies = [
+ "fana-md",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
 [[package]]
 name = "fastembed"
 version = "4.9.1"
@@ -4390,10 +4408,10 @@ name = "gioser-web"
 version = "0.1.0"
 dependencies = [
  "barra-web",
+ "fana-md-reader-web",
  "gioser-canvas-web",
  "js-sys",
- "pluma-reader-web",
- "vista-web",
+ "revista-web",
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
@@ -8624,24 +8642,6 @@ version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
 
-[[package]]
-name = "pluma-md"
-version = "0.1.0"
-dependencies = [
- "pulldown-cmark",
-]
-
-[[package]]
-name = "pluma-reader-web"
-version = "0.1.0"
-dependencies = [
- "js-sys",
- "pluma-md",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
-]
-
 [[package]]
 name = "png"
 version = "0.17.16"
@@ -9550,6 +9550,20 @@ dependencies = [
  "syn 2.0.117",
 ]
 
+[[package]]
+name = "revista-core"
+version = "0.1.0"
+
+[[package]]
+name = "revista-web"
+version = "0.1.0"
+dependencies = [
+ "js-sys",
+ "revista-core",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "rgb"
 version = "0.8.53"
@@ -10512,8 +10526,8 @@ name = "shuma-core"
 version = "0.1.0"
 dependencies = [
  "anyhow",
+ "arje-incarnate",
  "brahman-card",
- "ente-incarnate",
  "libc",
  "nix 0.29.0",
  "serde",
@@ -10532,9 +10546,9 @@ name = "shuma-daemon"
 version = "0.1.0"
 dependencies = [
  "anyhow",
+ "arje-incarnate",
  "brahman-card",
  "brahman-sidecar",
- "ente-incarnate",
  "libc",
  "nix 0.29.0",
  "shuma-card",
@@ -12530,20 +12544,6 @@ version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
-[[package]]
-name = "vista-core"
-version = "0.1.0"
-
-[[package]]
-name = "vista-web"
-version = "0.1.0"
-dependencies = [
- "js-sys",
- "vista-core",
- "wasm-bindgen",
- "web-sys",
-]
-
 [[package]]
 name = "vswhom"
 version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index 73ffac3..5fa01bf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,43 +12,43 @@ members = [
     "crates/protocol/brahman-admin",
     "crates/protocol/brahman-sidecar",
     "crates/protocol/brahman-net",
-    "crates/protocol/ente-card",
+    "crates/protocol/arje-card",
 
     # ============================================================
     # init/ — PID 1 + encarnación Linux (arje)
     # ============================================================
-    "crates/init/ente-zero",
-    "crates/init/ente-kernel",
-    "crates/init/ente-soma",
-    "crates/init/ente-snapshot",
-    "crates/init/ente-incarnate",
+    "crates/init/arje-zero",
+    "crates/init/arje-kernel",
+    "crates/init/arje-soma",
+    "crates/init/arje-snapshot",
+    "crates/init/arje-incarnate",
 
     # ============================================================
     # runtime/ — Infraestructura de ejecución (bus + cas + wasm + brain)
     # ============================================================
-    "crates/runtime/ente-bus",
-    "crates/runtime/ente-cas",
-    "crates/runtime/ente-wasm",
-    "crates/runtime/ente-brain",
-    "crates/runtime/ente-echo",
+    "crates/runtime/arje-bus",
+    "crates/runtime/arje-cas",
+    "crates/runtime/arje-wasm",
+    "crates/runtime/arje-brain",
+    "crates/runtime/arje-echo",
 
     # ============================================================
     # compat/ — Shims D-Bus para correr software systemd-aware
     # ============================================================
-    "crates/compat/ente-policy-provider",
-    "crates/compat/ente-logind-compat",
-    "crates/compat/ente-hostnamed-compat",
-    "crates/compat/ente-timedated-compat",
-    "crates/compat/ente-localed-compat",
-    "crates/compat/ente-journald-compat",
-    "crates/compat/ente-resolved-compat",
-    "crates/compat/ente-polkit-compat",
-    "crates/compat/ente-machined-compat",
-    "crates/compat/ente-tmpfiles-compat",
-    "crates/compat/ente-systemd1-compat",
-    "crates/compat/ente-notify-compat",
-    "crates/compat/ente-binfmt-compat",
-    "crates/compat/ente-timer-compat",
+    "crates/compat/arje-policy-provider",
+    "crates/compat/arje-logind-compat",
+    "crates/compat/arje-hostnamed-compat",
+    "crates/compat/arje-timedated-compat",
+    "crates/compat/arje-localed-compat",
+    "crates/compat/arje-journald-compat",
+    "crates/compat/arje-resolved-compat",
+    "crates/compat/arje-polkit-compat",
+    "crates/compat/arje-machined-compat",
+    "crates/compat/arje-tmpfiles-compat",
+    "crates/compat/arje-systemd1-compat",
+    "crates/compat/arje-notify-compat",
+    "crates/compat/arje-binfmt-compat",
+    "crates/compat/arje-timer-compat",
 
     # ============================================================
     # modules/semantic_dht/ (minga) — DHT semántico de código
@@ -106,13 +106,13 @@ members = [
     "crates/modules/nakui/core",
 
     # ============================================================
-    # modules/akasha/ — Explorador semántico de Mónadas (era nouser)
+    # modules/chasqui/ — Explorador semántico de nómadas (ex-nouser, ex-akasha)
     # ============================================================
-    "crates/modules/akasha/card",
-    "crates/modules/akasha/core",
-    "crates/modules/akasha/nous",
-    "crates/modules/akasha/nous-mock",
-    "crates/modules/akasha/nous-real",
+    "crates/modules/chasqui/card",
+    "crates/modules/chasqui/core",
+    "crates/modules/chasqui/nous",
+    "crates/modules/chasqui/nous-mock",
+    "crates/modules/chasqui/nous-real",
 
     # ============================================================
     # modules/shuma/ — Runtime de espacios aislados (era shipote)
@@ -132,16 +132,16 @@ members = [
     "crates/modules/gioser/gioser-canvas-web",
 
     # ============================================================
-    # modules/pluma/ — Markdown agnóstico + visor web
+    # modules/fana/ — Writer DAG editor (absorbe pluma)
     # ============================================================
-    "crates/modules/pluma/pluma-md",
-    "crates/modules/pluma/pluma-reader-web",
+    "crates/modules/fana/fana-md",
+    "crates/modules/fana/fana-md-reader-web",
 
     # ============================================================
-    # modules/vista/ — Deck horizontal swipe (Flutter PageView)
+    # modules/revista/ — Deck horizontal swipe (Flutter PageView)
     # ============================================================
-    "crates/modules/vista/vista-core",
-    "crates/modules/vista/vista-web",
+    "crates/modules/revista/revista-core",
+    "crates/modules/revista/revista-web",
 
     # ============================================================
     # modules/barra/ — Taskbar agnóstica estilo Windows
@@ -174,7 +174,7 @@ members = [
     "crates/apps/nahual-database-explorer",
     "crates/apps/nahual-text-viewer",
     "crates/apps/nahual-image-viewer",
-    "crates/apps/akasha-explorer",
+    "crates/apps/chasqui-explorer",
     "crates/apps/nakui-explorer",
     "crates/apps/nakui-ui",
     "crates/apps/minga-explorer",
diff --git a/crates/apps/akasha-explorer/Cargo.toml b/crates/apps/chasqui-explorer/Cargo.toml
similarity index 87%
rename from crates/apps/akasha-explorer/Cargo.toml
rename to crates/apps/chasqui-explorer/Cargo.toml
index 3fe5ce1..8595008 100644
--- a/crates/apps/akasha-explorer/Cargo.toml
+++ b/crates/apps/chasqui-explorer/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-explorer"
+name = "chasqui-explorer"
 version.workspace = true
 edition.workspace = true
 license.workspace = true
@@ -8,7 +8,7 @@ description = "Explorador GPUI de Mónadas: panel que descubre al daemon nouser
 [dependencies]
 brahman-card = { path = "../../protocol/brahman-card" }
 brahman-sidecar = { path = "../../protocol/brahman-sidecar" }
-akasha-card = { path = "../../modules/akasha/card" }
+chasqui-card = { path = "../../modules/chasqui/card" }
 nahual-theme = { path = "../../modules/nahual/libs/theme" }
 nahual-launcher = { path = "../../modules/nahual/libs/launcher" }
 nahual-widget-banner = { path = "../../modules/nahual/widgets/banner" }
@@ -17,5 +17,5 @@ nahual-widget-app-header = { path = "../../modules/nahual/widgets/app-header" }
 gpui = { workspace = true }
 
 [[bin]]
-name = "akasha-explorer"
+name = "chasqui-explorer"
 path = "src/main.rs"
diff --git a/crates/apps/akasha-explorer/src/main.rs b/crates/apps/chasqui-explorer/src/main.rs
similarity index 95%
rename from crates/apps/akasha-explorer/src/main.rs
rename to crates/apps/chasqui-explorer/src/main.rs
index e9db07c..327f2aa 100644
--- a/crates/apps/akasha-explorer/src/main.rs
+++ b/crates/apps/chasqui-explorer/src/main.rs
@@ -1,8 +1,8 @@
-//! `akasha-explorer` — panel GPUI que descubre al daemon `akasha`
+//! `chasqui-explorer` — panel GPUI que descubre al daemon `chasqui`
 //! vía broker brahman y muestra sus Mónadas en vivo.
 //!
 //! Diseño: ventana standalone que cada N segundos consulta el query
-//! socket del daemon (`akasha_core::engine_socket::client::list_monads`).
+//! socket del daemon (`chasqui_core::engine_socket::client::list_monads`).
 //! El path del socket NO está hardcoded — se descubre vía
 //! `brahman_sidecar::await_provider_blocking` para el flow
 //! `monad-list:json`. Si el daemon cae, el socket cacheado se invalida
@@ -13,9 +13,9 @@
 //!
 //! Uso:
 //! ```sh
-//! cargo run -p akasha-explorer
+//! cargo run -p chasqui-explorer
 //! # con override del init socket (heredado de brahman-handshake):
-//! BRAHMAN_INIT_SOCKET=/tmp/init.sock cargo run -p akasha-explorer
+//! BRAHMAN_INIT_SOCKET=/tmp/init.sock cargo run -p chasqui-explorer
 //! ```
 
 use std::path::PathBuf;
@@ -25,9 +25,9 @@ use brahman_sidecar::{await_provider_blocking, build_consumer_card, ConsumerErro
 use gpui::{
     div, prelude::*, px, rgb, Context, IntoElement, Render, SharedString, Window,
 };
-use akasha_card::query::client as query_client;
-use akasha_card::query::{transport, ListMonadsResponse, FLOW_MONAD_LIST, FLOW_TYPE_NAME};
-use akasha_card::Lens;
+use chasqui_card::query::client as query_client;
+use chasqui_card::query::{transport, ListMonadsResponse, FLOW_MONAD_LIST, FLOW_TYPE_NAME};
+use chasqui_card::Lens;
 use nahual_launcher::launch_app;
 use nahual_theme::Theme;
 use nahual_widget_app_header::app_header;
@@ -176,7 +176,7 @@ fn resolve_socket() -> Result<(PathBuf, &'static str), String> {
 /// Card con `flow.input = monad-list:json`, espera al primer
 /// `MatchEvent::Available`, devuelve el `producer_service_socket`.
 fn discover_via_broker() -> Result<PathBuf, ConsumerError> {
-    let card = build_consumer_card("akasha-explorer", FLOW_MONAD_LIST, FLOW_TYPE_NAME);
+    let card = build_consumer_card("chasqui-explorer", FLOW_MONAD_LIST, FLOW_TYPE_NAME);
     await_provider_blocking(card, DISCOVERY_TIMEOUT)
 }
 
@@ -184,7 +184,7 @@ impl Render for Explorer {
     fn render(&mut self, _w: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
         // Chrome viene del Theme global; los acentos por kind
         // (engine cyan, data purple) son señales semánticas del
-        // dominio akasha y se mantienen locales.
+        // dominio chasqui y se mantienen locales.
         let theme = Theme::global(cx).clone();
         let bg = theme.bg_app.clone();
         let text = theme.fg_text;
@@ -205,7 +205,7 @@ impl Render for Explorer {
                     .map(|w| format!("  ·  watching: {}", w))
                     .unwrap_or_default()
             ),
-            _ => "Buscando daemon akasha vía brahman-broker…".to_string(),
+            _ => "Buscando daemon chasqui vía brahman-broker…".to_string(),
         };
 
         // Header standard via widget compartido.
diff --git a/crates/apps/gioser-web/Cargo.toml b/crates/apps/gioser-web/Cargo.toml
index 3fcd66f..c9d0cf6 100644
--- a/crates/apps/gioser-web/Cargo.toml
+++ b/crates/apps/gioser-web/Cargo.toml
@@ -11,8 +11,8 @@ crate-type = ["cdylib", "rlib"]
 
 [dependencies]
 gioser-canvas-web = { path = "../../modules/gioser/gioser-canvas-web" }
-pluma-reader-web = { path = "../../modules/pluma/pluma-reader-web" }
-vista-web = { path = "../../modules/vista/vista-web" }
+fana-md-reader-web = { path = "../../modules/fana/fana-md-reader-web" }
+revista-web = { path = "../../modules/revista/revista-web" }
 barra-web = { path = "../../modules/barra/barra-web" }
 wasm-bindgen.workspace = true
 wasm-bindgen-futures.workspace = true
diff --git a/crates/apps/gioser-web/src/lib.rs b/crates/apps/gioser-web/src/lib.rs
index 03af2fb..9a22053 100644
--- a/crates/apps/gioser-web/src/lib.rs
+++ b/crates/apps/gioser-web/src/lib.rs
@@ -21,8 +21,8 @@ use std::rc::Rc;
 
 use barra_web::{Task, TaskList};
 use gioser_canvas_web::{tips, Renderer};
-use pluma_reader_web::Reader;
-use vista_web::Deck;
+use fana_md_reader_web::Reader;
+use revista_web::Deck;
 use wasm_bindgen::prelude::*;
 use wasm_bindgen::JsCast;
 use web_sys::{
diff --git a/crates/apps/minga-explorer/src/main.rs b/crates/apps/minga-explorer/src/main.rs
index 2af1a92..97c4eb1 100644
--- a/crates/apps/minga-explorer/src/main.rs
+++ b/crates/apps/minga-explorer/src/main.rs
@@ -14,7 +14,7 @@
 //!
 //! Stack visual: nahual-theme + banner_themed + card_themed +
 //! theme_switcher. Mismo patrón que `nakui-explorer` /
-//! `akasha-explorer`.
+//! `chasqui-explorer`.
 //!
 //! Uso:
 //! ```sh
diff --git a/crates/apps/nakui-explorer/src/main.rs b/crates/apps/nakui-explorer/src/main.rs
index 479a20a..6cd1e5f 100644
--- a/crates/apps/nakui-explorer/src/main.rs
+++ b/crates/apps/nakui-explorer/src/main.rs
@@ -10,7 +10,7 @@
 //! producción que va escribiendo). Sin discovery dinámico vía broker
 //! brahman porque nakui hoy es CLI/library/demos, no daemon — cuando
 //! se daemonice, sustituir el lector de archivo por un sidecar
-//! consumer (mismo patrón que `akasha-explorer`).
+//! consumer (mismo patrón que `chasqui-explorer`).
 //!
 //! ## Uso
 //!
diff --git a/crates/apps/shuma-daemon/Cargo.toml b/crates/apps/shuma-daemon/Cargo.toml
index e1f0143..f7bfdc2 100644
--- a/crates/apps/shuma-daemon/Cargo.toml
+++ b/crates/apps/shuma-daemon/Cargo.toml
@@ -17,7 +17,7 @@ shuma-card = { path = "../../modules/shuma/shuma-card" }
 shuma-protocol = { path = "../../modules/shuma/shuma-protocol" }
 shuma-discern = { path = "../../modules/shuma/shuma-discern" }
 shuma-core = { path = "../../modules/shuma/shuma-core" }
-ente-incarnate = { path = "../../init/ente-incarnate" }
+arje-incarnate = { path = "../../init/arje-incarnate" }
 brahman-card = { path = "../../protocol/brahman-card" }
 brahman-sidecar = { path = "../../protocol/brahman-sidecar" }
 anyhow = { workspace = true }
diff --git a/crates/apps/shuma-daemon/src/main.rs b/crates/apps/shuma-daemon/src/main.rs
index 76d4a62..81c7042 100644
--- a/crates/apps/shuma-daemon/src/main.rs
+++ b/crates/apps/shuma-daemon/src/main.rs
@@ -12,7 +12,7 @@
 
 use anyhow::Context;
 use brahman_card::{Card, CardKind, Flow, Flows, Lifecycle, Payload, Supervision, TypeRef};
-use ente_incarnate::IncarnatorConfig;
+use arje_incarnate::IncarnatorConfig;
 use shuma_core::WorkspaceManager;
 use shuma_discern::{DiscernPipeline, Hint};
 use shuma_protocol::{
diff --git a/crates/compat/SDD.md b/crates/compat/SDD.md
index 1363b23..95ddd1f 100644
--- a/crates/compat/SDD.md
+++ b/crates/compat/SDD.md
@@ -1,7 +1,7 @@
 # compat/ — Shims D-Bus systemd
 
 **Propósito.** Permitir que software systemd-aware (GNOME, KDE,
-PolicyKit, NetworkManager, etc.) corra sobre `ente-zero` sin systemd.
+PolicyKit, NetworkManager, etc.) corra sobre `arje-zero` sin systemd.
 Cada shim es un binario standalone que se anuncia con un nombre
 well-known D-Bus y traduce las llamadas al bus interno.
 
@@ -9,24 +9,24 @@ well-known D-Bus y traduce las llamadas al bus interno.
 
 | binario                     | reemplaza             | D-Bus name                          |
 | --------------------------- | --------------------- | ----------------------------------- |
-| `ente-logind-compat`        | systemd-logind        | `org.freedesktop.login1`            |
-| `ente-hostnamed-compat`     | systemd-hostnamed     | `org.freedesktop.hostname1`         |
-| `ente-timedated-compat`     | systemd-timedated     | `org.freedesktop.timedate1`         |
-| `ente-localed-compat`       | systemd-localed       | `org.freedesktop.locale1`           |
-| `ente-journald-compat`      | systemd-journald      | `org.freedesktop.LogControl1`       |
-| `ente-resolved-compat`      | systemd-resolved      | `org.freedesktop.resolve1`          |
-| `ente-polkit-compat`        | polkitd               | `org.freedesktop.PolicyKit1`        |
-| `ente-machined-compat`      | systemd-machined      | `org.freedesktop.machine1`          |
-| `ente-systemd1-compat`      | systemd Manager       | `org.freedesktop.systemd1`          |
-| `ente-notify-compat`        | sd_notify socket      | `/run/systemd/notify` (datagram)    |
-| `ente-timer-compat`         | systemd timers        | (cron-like, sin D-Bus)              |
-| `ente-tmpfiles-compat`      | systemd-tmpfiles      | (aplica tmpfiles.d al boot)         |
-| `ente-binfmt-compat`        | systemd-binfmt        | (registra handlers binfmt_misc)     |
-| `ente-policy-provider`      | (interno)             | provider de decisiones polkit       |
+| `arje-logind-compat`        | systemd-logind        | `org.freedesktop.login1`            |
+| `arje-hostnamed-compat`     | systemd-hostnamed     | `org.freedesktop.hostname1`         |
+| `arje-timedated-compat`     | systemd-timedated     | `org.freedesktop.timedate1`         |
+| `arje-localed-compat`       | systemd-localed       | `org.freedesktop.locale1`           |
+| `arje-journald-compat`      | systemd-journald      | `org.freedesktop.LogControl1`       |
+| `arje-resolved-compat`      | systemd-resolved      | `org.freedesktop.resolve1`          |
+| `arje-polkit-compat`        | polkitd               | `org.freedesktop.PolicyKit1`        |
+| `arje-machined-compat`      | systemd-machined      | `org.freedesktop.machine1`          |
+| `arje-systemd1-compat`      | systemd Manager       | `org.freedesktop.systemd1`          |
+| `arje-notify-compat`        | sd_notify socket      | `/run/systemd/notify` (datagram)    |
+| `arje-timer-compat`         | systemd timers        | (cron-like, sin D-Bus)              |
+| `arje-tmpfiles-compat`      | systemd-tmpfiles      | (aplica tmpfiles.d al boot)         |
+| `arje-binfmt-compat`        | systemd-binfmt        | (registra handlers binfmt_misc)     |
+| `arje-policy-provider`      | (interno)             | provider de decisiones polkit       |
 
 ## Dependencias
 
-- Todos ← `zbus`, `ente-bus`, `protocol/brahman-card`. Sin tests
+- Todos ← `zbus`, `arje-bus`, `protocol/brahman-card`. Sin tests
   (esperado: stubs D-Bus que delegan al bus interno).
 
 ## Patrón común
@@ -35,7 +35,7 @@ Cada shim:
 1. Se conecta a `/run/brahman/bus`.
 2. Reclama un well-known name vía zbus.
 3. Implementa los métodos de la interfaz mínima usada por el ecosistema.
-4. Loggea eventos al audit log de `ente-brain`.
+4. Loggea eventos al audit log de `arje-brain`.
 
 ## Estado
 
diff --git a/crates/compat/ente-binfmt-compat/Cargo.toml b/crates/compat/arje-binfmt-compat/Cargo.toml
similarity index 81%
rename from crates/compat/ente-binfmt-compat/Cargo.toml
rename to crates/compat/arje-binfmt-compat/Cargo.toml
index f972677..df8e102 100644
--- a/crates/compat/ente-binfmt-compat/Cargo.toml
+++ b/crates/compat/arje-binfmt-compat/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-binfmt-compat"
+name = "arje-binfmt-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-binfmt-compat"
+name = "arje-binfmt-compat"
 path = "src/main.rs"
 
 [dependencies]
diff --git a/crates/compat/ente-binfmt-compat/src/main.rs b/crates/compat/arje-binfmt-compat/src/main.rs
similarity index 98%
rename from crates/compat/ente-binfmt-compat/src/main.rs
rename to crates/compat/arje-binfmt-compat/src/main.rs
index 9789d5c..18f64ec 100644
--- a/crates/compat/ente-binfmt-compat/src/main.rs
+++ b/crates/compat/arje-binfmt-compat/src/main.rs
@@ -104,6 +104,6 @@ fn register(line: &str) -> Result<String, RegError> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_binfmt_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_binfmt_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-hostnamed-compat/Cargo.toml b/crates/compat/arje-hostnamed-compat/Cargo.toml
similarity index 72%
rename from crates/compat/ente-hostnamed-compat/Cargo.toml
rename to crates/compat/arje-hostnamed-compat/Cargo.toml
index c8545e2..5f6ac90 100644
--- a/crates/compat/ente-hostnamed-compat/Cargo.toml
+++ b/crates/compat/arje-hostnamed-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-hostnamed-compat"
+name = "arje-hostnamed-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-hostnamed-compat"
+name = "arje-hostnamed-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 nix = { workspace = true }
 libc = { workspace = true }
 anyhow = { workspace = true }
diff --git a/crates/compat/ente-hostnamed-compat/src/main.rs b/crates/compat/arje-hostnamed-compat/src/main.rs
similarity index 98%
rename from crates/compat/ente-hostnamed-compat/src/main.rs
rename to crates/compat/arje-hostnamed-compat/src/main.rs
index 54d861a..738aa1a 100644
--- a/crates/compat/ente-hostnamed-compat/src/main.rs
+++ b/crates/compat/arje-hostnamed-compat/src/main.rs
@@ -8,8 +8,8 @@
 //! Set* methods: log + forward al bus interno (no aplicamos cambios reales
 //! en el stub — un siguiente paso es persistir a /etc/* y rehash).
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::sync::Mutex;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -311,7 +311,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa0; 16]),
+                interface: arje_card::InterfaceId([0xa0; 16]),
                 version: 1,
             }],
         };
@@ -335,6 +335,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_hostnamed_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_hostnamed_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-journald-compat/Cargo.toml b/crates/compat/arje-journald-compat/Cargo.toml
similarity index 61%
rename from crates/compat/ente-journald-compat/Cargo.toml
rename to crates/compat/arje-journald-compat/Cargo.toml
index b766b6c..bae99e5 100644
--- a/crates/compat/ente-journald-compat/Cargo.toml
+++ b/crates/compat/arje-journald-compat/Cargo.toml
@@ -1,22 +1,22 @@
 [package]
-name = "ente-journald-compat"
+name = "arje-journald-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-journald-compat"
+name = "arje-journald-compat"
 path = "src/main.rs"
 
 [[bin]]
-name = "ente-journalctl"
+name = "arje-journalctl"
 path = "src/journalctl.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
-ente-cas = { path = "../../runtime/ente-cas" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
+arje-cas = { path = "../../runtime/arje-cas" }
 nix = { workspace = true }
 libc = { workspace = true }
 anyhow = { workspace = true }
diff --git a/crates/compat/ente-journald-compat/src/journalctl.rs b/crates/compat/arje-journald-compat/src/journalctl.rs
similarity index 99%
rename from crates/compat/ente-journald-compat/src/journalctl.rs
rename to crates/compat/arje-journald-compat/src/journalctl.rs
index 8164bea..5f10786 100644
--- a/crates/compat/ente-journald-compat/src/journalctl.rs
+++ b/crates/compat/arje-journald-compat/src/journalctl.rs
@@ -155,7 +155,7 @@ fn main() -> anyhow::Result<()> {
     let mut out: Vec<(IndexEntry, String)> = entries.into_iter()
         .filter_map(|e| {
             let sha = parse_sha(&e.sha_hex)?;
-            let bytes = ente_cas::resolve(&sha).ok()?;
+            let bytes = arje_cas::resolve(&sha).ok()?;
             let body = String::from_utf8_lossy(&bytes).into_owned();
             Some((e, body))
         })
diff --git a/crates/compat/ente-journald-compat/src/main.rs b/crates/compat/arje-journald-compat/src/main.rs
similarity index 96%
rename from crates/compat/ente-journald-compat/src/main.rs
rename to crates/compat/arje-journald-compat/src/main.rs
index 620cfd2..75ef2f7 100644
--- a/crates/compat/ente-journald-compat/src/main.rs
+++ b/crates/compat/arje-journald-compat/src/main.rs
@@ -7,8 +7,8 @@
 //! Para una implementación real: persistir a CAS por timestamp+sha,
 //! exponer query API, indexar por unidad/usuario.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::os::fd::{AsRawFd, OwnedFd};
 use std::path::{Path, PathBuf};
 use std::sync::Mutex;
@@ -127,13 +127,13 @@ fn now_ms() -> u128 {
 /// `<timestamp_ms>:<source>:<unit>:<sha_hex>`. Errores se logean pero
 /// no abortan — perder un mensaje no debe romper journald.
 fn persist_to_cas(buf: &[u8], source: &'static str, unit: Option<&str>) {
-    let sha = match ente_cas::store(buf) {
+    let sha = match arje_cas::store(buf) {
         Ok(s) => s,
         Err(e) => { warn!(?e, "CAS store falló"); return; }
     };
     let line = format!(
         "{}:{}:{}:{}\n",
-        now_ms(), source, unit.unwrap_or("-"), ente_cas::hex(&sha)
+        now_ms(), source, unit.unwrap_or("-"), arje_cas::hex(&sha)
     );
     let path = index_path();
     let _guard = INDEX_FILE.lock().unwrap();
@@ -213,6 +213,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_journald_compat=info,journal=info,syslog=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_journald_compat=info,journal=info,syslog=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-localed-compat/Cargo.toml b/crates/compat/arje-localed-compat/Cargo.toml
similarity index 69%
rename from crates/compat/ente-localed-compat/Cargo.toml
rename to crates/compat/arje-localed-compat/Cargo.toml
index 9e4c0d8..12aca62 100644
--- a/crates/compat/ente-localed-compat/Cargo.toml
+++ b/crates/compat/arje-localed-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-localed-compat"
+name = "arje-localed-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-localed-compat"
+name = "arje-localed-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 anyhow = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/compat/ente-localed-compat/src/main.rs b/crates/compat/arje-localed-compat/src/main.rs
similarity index 97%
rename from crates/compat/ente-localed-compat/src/main.rs
rename to crates/compat/arje-localed-compat/src/main.rs
index f553c54..67b4703 100644
--- a/crates/compat/ente-localed-compat/src/main.rs
+++ b/crates/compat/arje-localed-compat/src/main.rs
@@ -3,8 +3,8 @@
 //! GNOME settings panel "Region & Language" llama aquí. Properties leen
 //! /etc/locale.conf y /etc/vconsole.conf; setters log + forward.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::sync::Mutex;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -190,7 +190,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa2; 16]),
+                interface: arje_card::InterfaceId([0xa2; 16]),
                 version: 1,
             }],
         };
@@ -214,6 +214,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_localed_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_localed_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-polkit-compat/Cargo.toml b/crates/compat/arje-logind-compat/Cargo.toml
similarity index 69%
rename from crates/compat/ente-polkit-compat/Cargo.toml
rename to crates/compat/arje-logind-compat/Cargo.toml
index 66fc0b6..bdef1fb 100644
--- a/crates/compat/ente-polkit-compat/Cargo.toml
+++ b/crates/compat/arje-logind-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-polkit-compat"
+name = "arje-logind-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-polkit-compat"
+name = "arje-logind-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 anyhow = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/compat/ente-logind-compat/src/main.rs b/crates/compat/arje-logind-compat/src/main.rs
similarity index 98%
rename from crates/compat/ente-logind-compat/src/main.rs
rename to crates/compat/arje-logind-compat/src/main.rs
index ce1736f..1cd1b9e 100644
--- a/crates/compat/ente-logind-compat/src/main.rs
+++ b/crates/compat/arje-logind-compat/src/main.rs
@@ -18,8 +18,8 @@
 //! El stub responde "no hay sesiones" y "sí puedo apagar" — suficiente para
 //! que GNOME complete arranque sin marcar fallo.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::sync::atomic::{AtomicU32, Ordering};
 use std::time::Duration;
 use tokio::signal::unix::{signal, SignalKind};
@@ -120,7 +120,7 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_logind_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_logind_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
 
diff --git a/crates/compat/ente-machined-compat/Cargo.toml b/crates/compat/arje-machined-compat/Cargo.toml
similarity index 69%
rename from crates/compat/ente-machined-compat/Cargo.toml
rename to crates/compat/arje-machined-compat/Cargo.toml
index 04cc159..043ba24 100644
--- a/crates/compat/ente-machined-compat/Cargo.toml
+++ b/crates/compat/arje-machined-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-machined-compat"
+name = "arje-machined-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-machined-compat"
+name = "arje-machined-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 anyhow = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/compat/ente-machined-compat/src/main.rs b/crates/compat/arje-machined-compat/src/main.rs
similarity index 96%
rename from crates/compat/ente-machined-compat/src/main.rs
rename to crates/compat/arje-machined-compat/src/main.rs
index 4ad7e00..9a2551c 100644
--- a/crates/compat/ente-machined-compat/src/main.rs
+++ b/crates/compat/arje-machined-compat/src/main.rs
@@ -13,8 +13,8 @@
 //! Producción real: integrar con el graph del fractal — ListMachines query
 //! BusRequest::ListEntes filtrado por `card.soma.namespaces.pid`.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::collections::HashMap;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -157,7 +157,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa5; 16]),
+                interface: arje_card::InterfaceId([0xa5; 16]),
                 version: 1,
             }],
         };
@@ -181,6 +181,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_machined_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_machined_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-notify-compat/Cargo.toml b/crates/compat/arje-notify-compat/Cargo.toml
similarity index 68%
rename from crates/compat/ente-notify-compat/Cargo.toml
rename to crates/compat/arje-notify-compat/Cargo.toml
index c3662d9..baf0e1e 100644
--- a/crates/compat/ente-notify-compat/Cargo.toml
+++ b/crates/compat/arje-notify-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-notify-compat"
+name = "arje-notify-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-notify-compat"
+name = "arje-notify-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 nix = { workspace = true }
 libc = { workspace = true }
 anyhow = { workspace = true }
diff --git a/crates/compat/ente-notify-compat/src/main.rs b/crates/compat/arje-notify-compat/src/main.rs
similarity index 96%
rename from crates/compat/ente-notify-compat/src/main.rs
rename to crates/compat/arje-notify-compat/src/main.rs
index afcf275..f75c8e9 100644
--- a/crates/compat/ente-notify-compat/src/main.rs
+++ b/crates/compat/arje-notify-compat/src/main.rs
@@ -15,8 +15,8 @@
 //! en el envp de cada Ente encarnado. Eso ya lo hace via build_env() —
 //! aquí sólo necesitamos que el path sea coherente.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::os::fd::{AsRawFd, OwnedFd};
 use std::path::Path;
 use tokio::io::unix::AsyncFd;
@@ -131,7 +131,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa7; 16]),
+                interface: arje_card::InterfaceId([0xa7; 16]),
                 version: 1,
             }],
         };
@@ -155,6 +155,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_notify_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_notify_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-policy-provider/Cargo.toml b/crates/compat/arje-policy-provider/Cargo.toml
similarity index 68%
rename from crates/compat/ente-policy-provider/Cargo.toml
rename to crates/compat/arje-policy-provider/Cargo.toml
index f035fcb..751cdd7 100644
--- a/crates/compat/ente-policy-provider/Cargo.toml
+++ b/crates/compat/arje-policy-provider/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-policy-provider"
+name = "arje-policy-provider"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-policy-provider"
+name = "arje-policy-provider"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 serde = { workspace = true }
 serde_json = { workspace = true }
 anyhow = { workspace = true }
diff --git a/crates/compat/ente-policy-provider/src/main.rs b/crates/compat/arje-policy-provider/src/main.rs
similarity index 98%
rename from crates/compat/ente-policy-provider/src/main.rs
rename to crates/compat/arje-policy-provider/src/main.rs
index 3777ddc..26afa88 100644
--- a/crates/compat/ente-policy-provider/src/main.rs
+++ b/crates/compat/arje-policy-provider/src/main.rs
@@ -20,8 +20,8 @@
 //! }
 //! ```
 
-use ente_bus::{BusResponse, BusServer, InvokeHandler, POLKIT_DECISION_IFACE};
-use ente_card::Capability;
+use arje_bus::{BusResponse, BusServer, InvokeHandler, POLKIT_DECISION_IFACE};
+use arje_card::Capability;
 use serde::Deserialize;
 use std::sync::Arc;
 use tokio::signal::unix::{signal, SignalKind};
@@ -216,6 +216,6 @@ fn load_policy() -> PolicyConfig {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_policy_provider=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_policy_provider=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-logind-compat/Cargo.toml b/crates/compat/arje-polkit-compat/Cargo.toml
similarity index 69%
rename from crates/compat/ente-logind-compat/Cargo.toml
rename to crates/compat/arje-polkit-compat/Cargo.toml
index c84dbf1..eeff401 100644
--- a/crates/compat/ente-logind-compat/Cargo.toml
+++ b/crates/compat/arje-polkit-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-logind-compat"
+name = "arje-polkit-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-logind-compat"
+name = "arje-polkit-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 anyhow = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/compat/ente-polkit-compat/src/main.rs b/crates/compat/arje-polkit-compat/src/main.rs
similarity index 98%
rename from crates/compat/ente-polkit-compat/src/main.rs
rename to crates/compat/arje-polkit-compat/src/main.rs
index 8ff4b6b..a340515 100644
--- a/crates/compat/ente-polkit-compat/src/main.rs
+++ b/crates/compat/arje-polkit-compat/src/main.rs
@@ -14,8 +14,8 @@
 //! CheckAuthorization solicita un token al graph y devuelve true/false
 //! según el resultado.
 
-use ente_bus::{BusClient, BusRequest, BusResponse, POLKIT_DECISION_IFACE, POLKIT_SERVICE_IFACE};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse, POLKIT_DECISION_IFACE, POLKIT_SERVICE_IFACE};
+use arje_card::Capability;
 use std::collections::HashMap;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{debug, info, warn};
@@ -259,6 +259,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_polkit_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_polkit_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-resolved-compat/Cargo.toml b/crates/compat/arje-resolved-compat/Cargo.toml
similarity index 70%
rename from crates/compat/ente-resolved-compat/Cargo.toml
rename to crates/compat/arje-resolved-compat/Cargo.toml
index ca71285..ce78e9c 100644
--- a/crates/compat/ente-resolved-compat/Cargo.toml
+++ b/crates/compat/arje-resolved-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-resolved-compat"
+name = "arje-resolved-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-resolved-compat"
+name = "arje-resolved-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 libc = { workspace = true }
 anyhow = { workspace = true }
 tokio = { workspace = true }
diff --git a/crates/compat/ente-resolved-compat/src/main.rs b/crates/compat/arje-resolved-compat/src/main.rs
similarity index 97%
rename from crates/compat/ente-resolved-compat/src/main.rs
rename to crates/compat/arje-resolved-compat/src/main.rs
index a103bbe..d989297 100644
--- a/crates/compat/ente-resolved-compat/src/main.rs
+++ b/crates/compat/arje-resolved-compat/src/main.rs
@@ -9,8 +9,8 @@
 //!   - ResolveAddress (address → name reverse)
 //!   - ResolveRecord (TXT/SRV/etc) — NotSupported (requiere DNS query directa)
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::net::IpAddr;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -181,7 +181,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa3; 16]),
+                interface: arje_card::InterfaceId([0xa3; 16]),
                 version: 1,
             }],
         };
@@ -205,6 +205,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_resolved_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_resolved_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/arje-systemd1-compat/Cargo.toml b/crates/compat/arje-systemd1-compat/Cargo.toml
new file mode 100644
index 0000000..40aea04
--- /dev/null
+++ b/crates/compat/arje-systemd1-compat/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "arje-systemd1-compat"
+version = "0.0.1"
+edition.workspace = true
+license.workspace = true
+publish.workspace = true
+
+[[bin]]
+name = "arje-systemd1-compat"
+path = "src/main.rs"
+
+[dependencies]
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
+anyhow = { workspace = true }
+tokio = { workspace = true }
+tracing = { workspace = true }
+tracing-subscriber = { workspace = true }
+zbus = { version = "4", default-features = false, features = ["tokio"] }
diff --git a/crates/compat/ente-systemd1-compat/src/main.rs b/crates/compat/arje-systemd1-compat/src/main.rs
similarity index 97%
rename from crates/compat/ente-systemd1-compat/src/main.rs
rename to crates/compat/arje-systemd1-compat/src/main.rs
index 81ae1ba..aa09b22 100644
--- a/crates/compat/ente-systemd1-compat/src/main.rs
+++ b/crates/compat/arje-systemd1-compat/src/main.rs
@@ -18,8 +18,8 @@
 //!   - ListUnitFiles (vacío)
 //!   - GetVersion / Environment / Architecture (properties)
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::collections::HashMap;
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -223,7 +223,7 @@ impl SystemdManager {
 }
 
 /// Pregunta al bus interno por la lista de Entes vivos.
-async fn query_list_entes() -> Option<Vec<ente_bus::EnteInfo>> {
+async fn query_list_entes() -> Option<Vec<arje_bus::EnteInfo>> {
     let mut client = match BusClient::from_env().await {
         Ok(c) => c,
         Err(e) => { warn!(?e, "no bus client — devuelvo vacío"); return None; }
@@ -248,7 +248,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa6; 16]),
+                interface: arje_card::InterfaceId([0xa6; 16]),
                 version: 1,
             }],
         };
@@ -272,7 +272,7 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_systemd1_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_systemd1_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
 
diff --git a/crates/compat/arje-timedated-compat/Cargo.toml b/crates/compat/arje-timedated-compat/Cargo.toml
new file mode 100644
index 0000000..387c37a
--- /dev/null
+++ b/crates/compat/arje-timedated-compat/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "arje-timedated-compat"
+version = "0.0.1"
+edition.workspace = true
+license.workspace = true
+publish.workspace = true
+
+[[bin]]
+name = "arje-timedated-compat"
+path = "src/main.rs"
+
+[dependencies]
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
+anyhow = { workspace = true }
+tokio = { workspace = true }
+tracing = { workspace = true }
+tracing-subscriber = { workspace = true }
+zbus = { version = "4", default-features = false, features = ["tokio"] }
diff --git a/crates/compat/ente-timedated-compat/src/main.rs b/crates/compat/arje-timedated-compat/src/main.rs
similarity index 96%
rename from crates/compat/ente-timedated-compat/src/main.rs
rename to crates/compat/arje-timedated-compat/src/main.rs
index a224c41..77d6711 100644
--- a/crates/compat/ente-timedated-compat/src/main.rs
+++ b/crates/compat/arje-timedated-compat/src/main.rs
@@ -3,8 +3,8 @@
 //! GNOME settings panel "Date & Time" llama aquí. Properties read-only se
 //! mapean a syscalls/lecturas del sistema; setters log + forward.
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use std::time::{SystemTime, UNIX_EPOCH};
 use tokio::signal::unix::{signal, SignalKind};
 use tracing::{info, warn};
@@ -153,7 +153,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa1; 16]),
+                interface: arje_card::InterfaceId([0xa1; 16]),
                 version: 1,
             }],
         };
@@ -177,6 +177,6 @@ async fn wait_for_term() -> anyhow::Result<()> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_timedated_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_timedated_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-timer-compat/Cargo.toml b/crates/compat/arje-timer-compat/Cargo.toml
similarity index 71%
rename from crates/compat/ente-timer-compat/Cargo.toml
rename to crates/compat/arje-timer-compat/Cargo.toml
index f4bcf4b..a98f7e9 100644
--- a/crates/compat/ente-timer-compat/Cargo.toml
+++ b/crates/compat/arje-timer-compat/Cargo.toml
@@ -1,17 +1,17 @@
 [package]
-name = "ente-timer-compat"
+name = "arje-timer-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-timer-compat"
+name = "arje-timer-compat"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
 serde = { workspace = true }
 serde_json = { workspace = true }
 ulid = { workspace = true }
diff --git a/crates/compat/ente-timer-compat/src/main.rs b/crates/compat/arje-timer-compat/src/main.rs
similarity index 97%
rename from crates/compat/ente-timer-compat/src/main.rs
rename to crates/compat/arje-timer-compat/src/main.rs
index f018e22..84fe3e2 100644
--- a/crates/compat/ente-timer-compat/src/main.rs
+++ b/crates/compat/arje-timer-compat/src/main.rs
@@ -31,8 +31,8 @@
 //! Para el demo: log "FIRE" cada vez que el schedule matchea, sin spawn real
 //! (requiere mover SpawnRequest al protocolo del bus, fuera de scope).
 
-use ente_bus::{BusClient, BusRequest, BusResponse};
-use ente_card::Capability;
+use arje_bus::{BusClient, BusRequest, BusResponse};
+use arje_card::Capability;
 use serde::Deserialize;
 use std::time::{SystemTime, UNIX_EPOCH};
 use tokio::signal::unix::{signal, SignalKind};
@@ -209,7 +209,7 @@ async fn announce_to_fractal() {
     if let Ok(mut client) = BusClient::from_env().await {
         let req = BusRequest::Announce {
             capabilities: vec![Capability::Endpoint {
-                interface: ente_card::InterfaceId([0xa8; 16]),
+                interface: arje_card::InterfaceId([0xa8; 16]),
                 version: 1,
             }],
         };
@@ -223,6 +223,6 @@ async fn announce_to_fractal() {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_timer_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_timer_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-tmpfiles-compat/Cargo.toml b/crates/compat/arje-tmpfiles-compat/Cargo.toml
similarity index 83%
rename from crates/compat/ente-tmpfiles-compat/Cargo.toml
rename to crates/compat/arje-tmpfiles-compat/Cargo.toml
index b3b6123..e2d050e 100644
--- a/crates/compat/ente-tmpfiles-compat/Cargo.toml
+++ b/crates/compat/arje-tmpfiles-compat/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-tmpfiles-compat"
+name = "arje-tmpfiles-compat"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-tmpfiles-compat"
+name = "arje-tmpfiles-compat"
 path = "src/main.rs"
 
 [dependencies]
diff --git a/crates/compat/ente-tmpfiles-compat/src/main.rs b/crates/compat/arje-tmpfiles-compat/src/main.rs
similarity index 99%
rename from crates/compat/ente-tmpfiles-compat/src/main.rs
rename to crates/compat/arje-tmpfiles-compat/src/main.rs
index 58de1c4..0c414a5 100644
--- a/crates/compat/ente-tmpfiles-compat/src/main.rs
+++ b/crates/compat/arje-tmpfiles-compat/src/main.rs
@@ -276,6 +276,6 @@ fn lookup_gid(name: &str) -> anyhow::Result<u32> {
 
 fn init_tracing() {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_tmpfiles_compat=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_tmpfiles_compat=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 }
diff --git a/crates/compat/ente-systemd1-compat/Cargo.toml b/crates/compat/ente-systemd1-compat/Cargo.toml
deleted file mode 100644
index be7fb94..0000000
--- a/crates/compat/ente-systemd1-compat/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[package]
-name = "ente-systemd1-compat"
-version = "0.0.1"
-edition.workspace = true
-license.workspace = true
-publish.workspace = true
-
-[[bin]]
-name = "ente-systemd1-compat"
-path = "src/main.rs"
-
-[dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
-anyhow = { workspace = true }
-tokio = { workspace = true }
-tracing = { workspace = true }
-tracing-subscriber = { workspace = true }
-zbus = { version = "4", default-features = false, features = ["tokio"] }
diff --git a/crates/compat/ente-timedated-compat/Cargo.toml b/crates/compat/ente-timedated-compat/Cargo.toml
deleted file mode 100644
index f1b61fb..0000000
--- a/crates/compat/ente-timedated-compat/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[package]
-name = "ente-timedated-compat"
-version = "0.0.1"
-edition.workspace = true
-license.workspace = true
-publish.workspace = true
-
-[[bin]]
-name = "ente-timedated-compat"
-path = "src/main.rs"
-
-[dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
-anyhow = { workspace = true }
-tokio = { workspace = true }
-tracing = { workspace = true }
-tracing-subscriber = { workspace = true }
-zbus = { version = "4", default-features = false, features = ["tokio"] }
diff --git a/crates/init/SDD.md b/crates/init/SDD.md
index 3e89d01..43d9a44 100644
--- a/crates/init/SDD.md
+++ b/crates/init/SDD.md
@@ -1,6 +1,6 @@
 # init/ — Init (PID 1) y encarnación Linux
 
-**Propósito.** `ente-zero` arranca como PID 1 del fractal. Provee el
+**Propósito.** `arje-zero` arranca como PID 1 del fractal. Provee el
 bucle primordial (reap + bus + handshake), bootstrap del kernel
 surface, encarnación de Cards en procesos aislados con namespaces +
 cgroups, y snapshot/restore del grafo.
@@ -9,21 +9,21 @@ cgroups, y snapshot/restore del grafo.
 
 | crate            | tipo    | rol                                                   |
 | ---------------- | ------- | ----------------------------------------------------- |
-| `ente-zero`      | binario | PID 1: reap + handshake server + bus dispatcher       |
-| `ente-kernel`    | lib     | `bootstrap_kernel_surface`, subreaper, SIGCHLD/uevent |
-| `ente-soma`      | lib     | Wrapper 44 LOC sobre `ente-incarnate` (compat API)    |
-| `ente-incarnate` | lib     | `clone(2) + namespaces + cgroup + rlimits + cpu`      |
-| `ente-snapshot`  | lib     | `FractalSnapshot` JSON: checkpoint del grafo Cards    |
+| `arje-zero`      | binario | PID 1: reap + handshake server + bus dispatcher       |
+| `arje-kernel`    | lib     | `bootstrap_kernel_surface`, subreaper, SIGCHLD/uevent |
+| `arje-soma`      | lib     | Wrapper 44 LOC sobre `arje-incarnate` (compat API)    |
+| `arje-incarnate` | lib     | `clone(2) + namespaces + cgroup + rlimits + cpu`      |
+| `arje-snapshot`  | lib     | `FractalSnapshot` JSON: checkpoint del grafo Cards    |
 
 ## Dependencias
 
-- `ente-kernel` ← `nix`, `libc`, syscalls Linux puras.
-- `ente-incarnate` reusable: shuma (sandboxes) y supervisores no-PID-1.
+- `arje-kernel` ← `nix`, `libc`, syscalls Linux puras.
+- `arje-incarnate` reusable: shuma (sandboxes) y supervisores no-PID-1.
 - Consume `protocol/` (handshake server, brahman-net opcional).
 
 ## Boot path
 
-1. Kernel pasa control → `ente-zero` arranca como `/sbin/init`.
+1. Kernel pasa control → `arje-zero` arranca como `/sbin/init`.
 2. Levanta sockets: `/run/brahman/bus`, `/run/brahman/handshake`.
 3. Lee `Card` semilla (`seeds/arje-{minimal,host,prod}.card.json`).
 4. Para cada `genesis` child Card: `incarnate(card)` → spawn aislado.
diff --git a/crates/init/ente-incarnate/Cargo.toml b/crates/init/arje-incarnate/Cargo.toml
similarity index 96%
rename from crates/init/ente-incarnate/Cargo.toml
rename to crates/init/arje-incarnate/Cargo.toml
index 1395616..bb53a51 100644
--- a/crates/init/ente-incarnate/Cargo.toml
+++ b/crates/init/arje-incarnate/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "ente-incarnate"
+name = "arje-incarnate"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
diff --git a/crates/init/ente-incarnate/src/caps.rs b/crates/init/arje-incarnate/src/caps.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/caps.rs
rename to crates/init/arje-incarnate/src/caps.rs
diff --git a/crates/init/ente-incarnate/src/cgroup.rs b/crates/init/arje-incarnate/src/cgroup.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/cgroup.rs
rename to crates/init/arje-incarnate/src/cgroup.rs
diff --git a/crates/init/ente-incarnate/src/child.rs b/crates/init/arje-incarnate/src/child.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/child.rs
rename to crates/init/arje-incarnate/src/child.rs
diff --git a/crates/init/ente-incarnate/src/env.rs b/crates/init/arje-incarnate/src/env.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/env.rs
rename to crates/init/arje-incarnate/src/env.rs
diff --git a/crates/init/ente-incarnate/src/error.rs b/crates/init/arje-incarnate/src/error.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/error.rs
rename to crates/init/arje-incarnate/src/error.rs
diff --git a/crates/init/ente-incarnate/src/lib.rs b/crates/init/arje-incarnate/src/lib.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/lib.rs
rename to crates/init/arje-incarnate/src/lib.rs
diff --git a/crates/init/ente-incarnate/src/namespaced.rs b/crates/init/arje-incarnate/src/namespaced.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/namespaced.rs
rename to crates/init/arje-incarnate/src/namespaced.rs
diff --git a/crates/init/ente-incarnate/src/plain.rs b/crates/init/arje-incarnate/src/plain.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/plain.rs
rename to crates/init/arje-incarnate/src/plain.rs
diff --git a/crates/init/ente-incarnate/src/pre_exec.rs b/crates/init/arje-incarnate/src/pre_exec.rs
similarity index 100%
rename from crates/init/ente-incarnate/src/pre_exec.rs
rename to crates/init/arje-incarnate/src/pre_exec.rs
diff --git a/crates/init/ente-kernel/Cargo.toml b/crates/init/arje-kernel/Cargo.toml
similarity index 78%
rename from crates/init/ente-kernel/Cargo.toml
rename to crates/init/arje-kernel/Cargo.toml
index 2ef77f8..44414d2 100644
--- a/crates/init/ente-kernel/Cargo.toml
+++ b/crates/init/arje-kernel/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-kernel"
+name = "arje-kernel"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
+arje-card = { path = "../../protocol/arje-card" }
 nix = { workspace = true }
 libc = { workspace = true }
 tokio = { workspace = true }
diff --git a/crates/init/ente-kernel/src/lib.rs b/crates/init/arje-kernel/src/lib.rs
similarity index 100%
rename from crates/init/ente-kernel/src/lib.rs
rename to crates/init/arje-kernel/src/lib.rs
diff --git a/crates/init/ente-kernel/src/sigchld.rs b/crates/init/arje-kernel/src/sigchld.rs
similarity index 100%
rename from crates/init/ente-kernel/src/sigchld.rs
rename to crates/init/arje-kernel/src/sigchld.rs
diff --git a/crates/init/ente-kernel/src/surface.rs b/crates/init/arje-kernel/src/surface.rs
similarity index 100%
rename from crates/init/ente-kernel/src/surface.rs
rename to crates/init/arje-kernel/src/surface.rs
diff --git a/crates/init/ente-kernel/src/uevent.rs b/crates/init/arje-kernel/src/uevent.rs
similarity index 99%
rename from crates/init/ente-kernel/src/uevent.rs
rename to crates/init/arje-kernel/src/uevent.rs
index 6e8f0fd..d7ce4bd 100644
--- a/crates/init/ente-kernel/src/uevent.rs
+++ b/crates/init/arje-kernel/src/uevent.rs
@@ -5,7 +5,7 @@
 //! continuar sin grafo de dispositivos.
 
 use anyhow::Context;
-use ente_card::DeviceClass;
+use arje_card::DeviceClass;
 use nix::sys::socket::{bind, socket, AddressFamily, NetlinkAddr, SockFlag, SockProtocol, SockType};
 use std::collections::HashMap;
 use std::os::fd::{AsRawFd, OwnedFd};
diff --git a/crates/init/ente-snapshot/Cargo.toml b/crates/init/arje-snapshot/Cargo.toml
similarity index 76%
rename from crates/init/ente-snapshot/Cargo.toml
rename to crates/init/arje-snapshot/Cargo.toml
index 38ec4dd..0af070f 100644
--- a/crates/init/ente-snapshot/Cargo.toml
+++ b/crates/init/arje-snapshot/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-snapshot"
+name = "arje-snapshot"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
+arje-card = { path = "../../protocol/arje-card" }
 serde = { workspace = true }
 serde_json = { workspace = true }
 ulid = { workspace = true }
diff --git a/crates/init/ente-snapshot/src/lib.rs b/crates/init/arje-snapshot/src/lib.rs
similarity index 98%
rename from crates/init/ente-snapshot/src/lib.rs
rename to crates/init/arje-snapshot/src/lib.rs
index 6eb0d1c..1e11614 100644
--- a/crates/init/ente-snapshot/src/lib.rs
+++ b/crates/init/arje-snapshot/src/lib.rs
@@ -9,7 +9,7 @@
 //!   - pending_invokes (en vuelo, se descartan)
 //!   - device presence (uevents reconstruyen el índice)
 
-use ente_card::EntityCard;
+use arje_card::EntityCard;
 use serde::{Deserialize, Serialize};
 use std::path::Path;
 use ulid::Ulid;
diff --git a/crates/init/arje-soma/Cargo.toml b/crates/init/arje-soma/Cargo.toml
new file mode 100644
index 0000000..f83d82b
--- /dev/null
+++ b/crates/init/arje-soma/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "arje-soma"
+version = "0.0.1"
+edition.workspace = true
+license.workspace = true
+publish.workspace = true
+description = "Wrapper histórico sobre arje-incarnate para mantener la API set_bus_sock+incarnate que usa arje-zero. Toda la lógica vive en arje-incarnate."
+
+[dependencies]
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
+arje-incarnate = { path = "../arje-incarnate" }
+nix = { workspace = true }
+anyhow = { workspace = true }
+tracing = { workspace = true }
diff --git a/crates/init/ente-soma/src/lib.rs b/crates/init/arje-soma/src/lib.rs
similarity index 89%
rename from crates/init/ente-soma/src/lib.rs
rename to crates/init/arje-soma/src/lib.rs
index e66b32a..7d136c8 100644
--- a/crates/init/ente-soma/src/lib.rs
+++ b/crates/init/arje-soma/src/lib.rs
@@ -1,17 +1,17 @@
-//! `ente-soma` — wrapper histórico sobre [`ente_incarnate`].
+//! `ente-soma` — wrapper histórico sobre [`arje_incarnate`].
 //!
 //! La rutina de namespacing fue extraída a `ente-incarnate` para que
 //! shuma, exploradores y cualquier supervisor no-PID-1 puedan reusarla.
 //! Este crate sobrevive como compat para `ente-zero` y otros que importan
-//! `ente_soma::{set_bus_sock, incarnate}`.
+//! `arje_soma::{set_bus_sock, incarnate}`.
 //!
 //! Semántica preservada:
 //! - `BUS_SOCK_PATH` global vía `OnceLock` (init lo setea una vez).
 //! - `NOTIFY_SOCKET=/run/systemd/notify` se inyecta automáticamente.
 //! - `strict_caps = false` (errores no-fatales se loguean, encarnación sigue).
 
-use ente_card::EntityCard;
-use ente_incarnate::{Incarnator, IncarnatorConfig};
+use arje_card::EntityCard;
+use arje_incarnate::{Incarnator, IncarnatorConfig};
 use nix::unistd::Pid;
 use std::path::PathBuf;
 use std::sync::OnceLock;
diff --git a/crates/init/ente-zero/Cargo.toml b/crates/init/arje-zero/Cargo.toml
similarity index 66%
rename from crates/init/ente-zero/Cargo.toml
rename to crates/init/arje-zero/Cargo.toml
index 0e8e2f3..60df7ab 100644
--- a/crates/init/ente-zero/Cargo.toml
+++ b/crates/init/arje-zero/Cargo.toml
@@ -1,25 +1,25 @@
 [package]
-name = "ente-zero"
+name = "arje-zero"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [[bin]]
-name = "ente-zero"
+name = "arje-zero"
 path = "src/main.rs"
 
 [dependencies]
 # Lib crates del fractal — orden: contratos → infra → encarnación → orquestación
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
-ente-cas = { path = "../../runtime/ente-cas" }
-ente-kernel = { path = "../ente-kernel" }
-ente-soma = { path = "../ente-soma" }
-ente-wasm = { path = "../../runtime/ente-wasm" }
-ente-snapshot = { path = "../ente-snapshot" }
-ente-brain = { path = "../../runtime/ente-brain" }
-ente-echo = { path = "../../runtime/ente-echo" }   # solo para constantes del demo
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../../runtime/arje-bus" }
+arje-cas = { path = "../../runtime/arje-cas" }
+arje-kernel = { path = "../arje-kernel" }
+arje-soma = { path = "../arje-soma" }
+arje-wasm = { path = "../../runtime/arje-wasm" }
+arje-snapshot = { path = "../arje-snapshot" }
+arje-brain = { path = "../../runtime/arje-brain" }
+arje-echo = { path = "../../runtime/arje-echo" }   # solo para constantes del demo
 
 # Brahman protocol — handshake para módulos brahman conscientes
 brahman-handshake = { path = "../../protocol/brahman-handshake" }
diff --git a/crates/init/ente-zero/src/brain_glue.rs b/crates/init/arje-zero/src/brain_glue.rs
similarity index 90%
rename from crates/init/ente-zero/src/brain_glue.rs
rename to crates/init/arje-zero/src/brain_glue.rs
index 261afe5..8762ddb 100644
--- a/crates/init/ente-zero/src/brain_glue.rs
+++ b/crates/init/arje-zero/src/brain_glue.rs
@@ -1,7 +1,7 @@
 //! Glue entre el bucle primordial y `ente-brain`.
 //!
 //! Tres responsabilidades:
-//!   1. Traducir eventos del grafo (`GraphEvent`) a `ente_brain::EventKind`
+//!   1. Traducir eventos del grafo (`GraphEvent`) a `arje_brain::EventKind`
 //!      + `SubjectInfo` para el observador y el motor.
 //!   2. Implementar `ActionSink` para que las Acciones del cerebro tengan
 //!      un canal de salida hacia el grafo (Spawn → SpawnRequest, etc.).
@@ -10,8 +10,8 @@
 
 use crate::events::GraphEvent;
 use crate::graph::EnteGraph;
-use ente_brain::{ActionSink, EventKind as BrainEventKind, SubjectInfo};
-use ente_card::Capability;
+use arje_brain::{ActionSink, EventKind as BrainEventKind, SubjectInfo};
+use arje_card::Capability;
 use serde::Deserialize;
 use tokio::sync::mpsc;
 use tracing::warn;
@@ -40,8 +40,8 @@ pub fn graph_event_to_brain<'a>(
         }
         GraphEvent::BusRequest { from, request, .. } => {
             let kind = match request {
-                ente_bus::BusRequest::Announce { .. } => BrainEventKind::BusAnnounce,
-                ente_bus::BusRequest::Invoke { cap, .. } => {
+                arje_bus::BusRequest::Announce { .. } => BrainEventKind::BusAnnounce,
+                arje_bus::BusRequest::Invoke { cap, .. } => {
                     BrainEventKind::BusInvokeOf(cap.clone())
                 }
                 _ => BrainEventKind::BusInvoke,
@@ -83,7 +83,7 @@ pub struct GraphSink {
 impl ActionSink for GraphSink {
     fn spawn(&self, card_blob: &str) {
         // El blob es JSON de EntityCard.
-        match serde_json::from_str::<ente_card::EntityCard>(card_blob) {
+        match serde_json::from_str::<arje_card::EntityCard>(card_blob) {
             Ok(card) => {
                 let evt = GraphEvent::SpawnRequest { card, requester: self.requester };
                 if self.graph_tx.try_send(evt).is_err() {
@@ -112,11 +112,11 @@ impl ActionSink for GraphSink {
 /// Helper para que el grafo exponga la Card de un Ente vivo. Lo añadimos como
 /// trait extension porque graph::EnteGraph mantiene `incarnated` privado.
 pub trait GraphCardLookup {
-    fn card_for(&self, id: &Ulid) -> Option<&ente_card::EntityCard>;
+    fn card_for(&self, id: &Ulid) -> Option<&arje_card::EntityCard>;
 }
 
 impl GraphCardLookup for EnteGraph {
-    fn card_for(&self, id: &Ulid) -> Option<&ente_card::EntityCard> {
+    fn card_for(&self, id: &Ulid) -> Option<&arje_card::EntityCard> {
         // Acceso vía método público que añadiremos en graph/mod.rs.
         self.peek_card(id)
     }
diff --git a/crates/init/ente-zero/src/bus.rs b/crates/init/arje-zero/src/bus.rs
similarity index 96%
rename from crates/init/ente-zero/src/bus.rs
rename to crates/init/arje-zero/src/bus.rs
index 6086b79..7ee3a06 100644
--- a/crates/init/ente-zero/src/bus.rs
+++ b/crates/init/arje-zero/src/bus.rs
@@ -10,7 +10,7 @@
 //! escritura de su conexión y lo usa para forwardear.
 
 use crate::events::GraphEvent;
-use ente_bus::{read_frame, write_frame, BusMessage, BusPayload, BusResponse, PeerCreds};
+use arje_bus::{read_frame, write_frame, BusMessage, BusPayload, BusResponse, PeerCreds};
 use nix::sys::socket::{getsockopt, sockopt::PeerCredentials};
 use std::path::PathBuf;
 use tokio::net::{UnixListener, UnixStream};
@@ -19,7 +19,7 @@ use tracing::{error, info, trace, warn};
 use ulid::Ulid;
 
 pub fn default_socket_path() -> PathBuf {
-    if let Ok(p) = std::env::var(ente_bus::ENV_BUS_SOCK) {
+    if let Ok(p) = std::env::var(arje_bus::ENV_BUS_SOCK) {
         return p.into();
     }
     let runtime = std::env::var("XDG_RUNTIME_DIR")
@@ -97,7 +97,7 @@ async fn handle_conn(stream: UnixStream, graph_tx: mpsc::Sender<GraphEvent>) ->
             };
             match msg.payload {
                 BusPayload::Request(req) => {
-                    let is_announce = matches!(req, ente_bus::BusRequest::Announce { .. });
+                    let is_announce = matches!(req, arje_bus::BusRequest::Announce { .. });
                     let (reply_tx, reply_rx) = oneshot::channel();
                     if graph_tx.send(GraphEvent::BusRequest {
                         peer,
diff --git a/crates/init/ente-zero/src/events.rs b/crates/init/arje-zero/src/events.rs
similarity index 95%
rename from crates/init/ente-zero/src/events.rs
rename to crates/init/arje-zero/src/events.rs
index 2102dd3..ca25915 100644
--- a/crates/init/ente-zero/src/events.rs
+++ b/crates/init/arje-zero/src/events.rs
@@ -8,8 +8,8 @@
 
 #![allow(dead_code)]
 
-use ente_bus::{BusMessage, BusRequest, BusResponse, PeerCreds};
-use ente_card::{Capability, EntityCard};
+use arje_bus::{BusMessage, BusRequest, BusResponse, PeerCreds};
+use arje_card::{Capability, EntityCard};
 use nix::sys::signal::Signal;
 use tokio::sync::{mpsc, oneshot};
 use ulid::Ulid;
diff --git a/crates/init/ente-zero/src/graph/bus_mediator.rs b/crates/init/arje-zero/src/graph/bus_mediator.rs
similarity index 99%
rename from crates/init/ente-zero/src/graph/bus_mediator.rs
rename to crates/init/arje-zero/src/graph/bus_mediator.rs
index 51d3f1a..0c90752 100644
--- a/crates/init/ente-zero/src/graph/bus_mediator.rs
+++ b/crates/init/arje-zero/src/graph/bus_mediator.rs
@@ -8,8 +8,8 @@
 //!   - Cleanup en cierre de conexión
 
 use super::{EnteGraph, SERVER_SEQ_FLAG};
-use ente_bus::{BusMessage, BusPayload, BusRequest, BusResponse, EnteInfo, PeerCreds};
-use ente_card::Capability;
+use arje_bus::{BusMessage, BusPayload, BusRequest, BusResponse, EnteInfo, PeerCreds};
+use arje_card::Capability;
 use tokio::sync::{mpsc, oneshot};
 use tracing::{debug, info, warn};
 use ulid::Ulid;
diff --git a/crates/init/ente-zero/src/graph/capabilities.rs b/crates/init/arje-zero/src/graph/capabilities.rs
similarity index 99%
rename from crates/init/ente-zero/src/graph/capabilities.rs
rename to crates/init/arje-zero/src/graph/capabilities.rs
index 9d75ae4..0d8b9d9 100644
--- a/crates/init/ente-zero/src/graph/capabilities.rs
+++ b/crates/init/arje-zero/src/graph/capabilities.rs
@@ -6,7 +6,7 @@
 
 use super::{quota_for_capability, ttl_for_capability, EnteGraph, GrantedCapability};
 use crate::events::CapabilityGrant;
-use ente_card::Capability;
+use arje_card::Capability;
 use std::time::Instant;
 use tokio::sync::oneshot;
 use tracing::debug;
diff --git a/crates/init/ente-zero/src/graph/devices.rs b/crates/init/arje-zero/src/graph/devices.rs
similarity index 96%
rename from crates/init/ente-zero/src/graph/devices.rs
rename to crates/init/arje-zero/src/graph/devices.rs
index 9a2a189..26d81f7 100644
--- a/crates/init/ente-zero/src/graph/devices.rs
+++ b/crates/init/arje-zero/src/graph/devices.rs
@@ -3,8 +3,8 @@
 
 use super::EnteGraph;
 use crate::events::GraphEvent;
-use ente_card::{Capability, DeviceClass};
-use ente_kernel::{UAction, UEvent};
+use arje_card::{Capability, DeviceClass};
+use arje_kernel::{UAction, UEvent};
 use tokio::sync::mpsc;
 use tracing::{debug, info, warn};
 
diff --git a/crates/init/ente-zero/src/graph/lifecycle.rs b/crates/init/arje-zero/src/graph/lifecycle.rs
similarity index 93%
rename from crates/init/ente-zero/src/graph/lifecycle.rs
rename to crates/init/arje-zero/src/graph/lifecycle.rs
index 2613878..2b62825 100644
--- a/crates/init/ente-zero/src/graph/lifecycle.rs
+++ b/crates/init/arje-zero/src/graph/lifecycle.rs
@@ -5,8 +5,8 @@
 
 use super::{EnteGraph, Incarnated};
 use crate::events::{ExitStatus, GraphEvent};
-use ente_bus::{BusMessage, BusPayload, BusRequest};
-use ente_card::{Capability, EntityCard, Payload, Supervision};
+use arje_bus::{BusMessage, BusPayload, BusRequest};
+use arje_card::{Capability, EntityCard, Payload, Supervision};
 use tokio::sync::mpsc;
 use tracing::{info, warn};
 use ulid::Ulid;
@@ -35,7 +35,7 @@ impl EnteGraph {
 
     /// Spawn solicitado por un Ente con `Capability::Spawn`. Verifica auth,
     /// requires del grafo, y delega la encarnación al backend correspondiente
-    /// (`ente_soma` para procesos, `ente_wasm` para Wasm).
+    /// (`arje_soma` para procesos, `arje_wasm` para Wasm).
     pub async fn authorize_and_spawn(
         &mut self,
         mut card: EntityCard,
@@ -64,14 +64,14 @@ impl EnteGraph {
         let pid = match &card.payload {
             Payload::Virtual => None,
             Payload::Native { .. } | Payload::Legacy { .. } => {
-                Some(ente_soma::incarnate(&card)?)
+                Some(arje_soma::incarnate(&card)?)
             }
             Payload::Wasm { module_sha256, entry } => {
                 // Wasm: hilo dedicado, sin PID. Su muerte se observa por
                 // estado del runtime, no por SIGCHLD.
-                let bytes = ente_cas::resolve(module_sha256)
+                let bytes = arje_cas::resolve(module_sha256)
                     .map_err(|e| anyhow::anyhow!("CAS resolve para {}: {e}", card.label))?;
-                ente_wasm::incarnate_wasm(&card, bytes, entry.clone())?;
+                arje_wasm::incarnate_wasm(&card, bytes, entry.clone())?;
                 None
             }
         };
@@ -142,7 +142,7 @@ impl EnteGraph {
                 seq,
                 payload: BusPayload::Request(BusRequest::Invoke {
                     cap: Capability::Endpoint {
-                        interface: ente_card::InterfaceId([0xde; 16]),
+                        interface: arje_card::InterfaceId([0xde; 16]),
                         version: 1,
                     },
                     blob: blob.into_bytes(),
diff --git a/crates/init/ente-zero/src/graph/mod.rs b/crates/init/arje-zero/src/graph/mod.rs
similarity index 96%
rename from crates/init/ente-zero/src/graph/mod.rs
rename to crates/init/arje-zero/src/graph/mod.rs
index bf3409c..12b75de 100644
--- a/crates/init/ente-zero/src/graph/mod.rs
+++ b/crates/init/arje-zero/src/graph/mod.rs
@@ -16,8 +16,8 @@ mod lifecycle;
 mod shutdown;
 mod topology;
 
-use ente_bus::{BusMessage, BusResponse};
-use ente_card::{Capability, EntityCard};
+use arje_bus::{BusMessage, BusResponse};
+use arje_card::{Capability, EntityCard};
 use nix::unistd::Pid;
 use std::collections::{BTreeMap, BTreeSet, HashMap};
 use tokio::sync::{mpsc, oneshot};
@@ -41,7 +41,7 @@ pub struct EnteGraph {
     pub(in crate::graph) next_token: u64,
     pub(in crate::graph) grants: HashMap<u64, GrantedCapability>,
     /// Dispositivos del kernel presentes (devpath → última UEvent).
-    pub(in crate::graph) devices: HashMap<String, ente_kernel::UEvent>,
+    pub(in crate::graph) devices: HashMap<String, arje_kernel::UEvent>,
     /// Cards genesis pendientes de instanciar (extraídas de la Semilla).
     pub(in crate::graph) pending_genesis: Vec<EntityCard>,
     /// Hijos directos por lineage. parent → [child, ...].
@@ -166,14 +166,14 @@ impl EnteGraph {
 
     /// Captura el estado live como snapshot serializable. Excluye la Semilla
     /// (será re-sintetizada al restore con su seed_id preservado).
-    pub fn snapshot(&self) -> ente_snapshot::FractalSnapshot {
+    pub fn snapshot(&self) -> arje_snapshot::FractalSnapshot {
         let entes: Vec<EntityCard> = self.incarnated.iter()
             .filter(|(id, _)| **id != self.seed.id)
             .map(|(_, inc)| inc.card.clone())
             .collect();
-        ente_snapshot::FractalSnapshot {
-            version: ente_snapshot::SNAPSHOT_VERSION,
-            timestamp_ms: ente_snapshot::now_ms(),
+        arje_snapshot::FractalSnapshot {
+            version: arje_snapshot::SNAPSHOT_VERSION,
+            timestamp_ms: arje_snapshot::now_ms(),
             seed_id: self.seed.id,
             seed_label: self.seed.label.clone(),
             entes,
diff --git a/crates/init/ente-zero/src/graph/shutdown.rs b/crates/init/arje-zero/src/graph/shutdown.rs
similarity index 100%
rename from crates/init/ente-zero/src/graph/shutdown.rs
rename to crates/init/arje-zero/src/graph/shutdown.rs
diff --git a/crates/init/ente-zero/src/graph/topology.rs b/crates/init/arje-zero/src/graph/topology.rs
similarity index 100%
rename from crates/init/ente-zero/src/graph/topology.rs
rename to crates/init/arje-zero/src/graph/topology.rs
diff --git a/crates/init/ente-zero/src/keypair_store.rs b/crates/init/arje-zero/src/keypair_store.rs
similarity index 100%
rename from crates/init/ente-zero/src/keypair_store.rs
rename to crates/init/arje-zero/src/keypair_store.rs
diff --git a/crates/init/ente-zero/src/main.rs b/crates/init/arje-zero/src/main.rs
similarity index 95%
rename from crates/init/ente-zero/src/main.rs
rename to crates/init/arje-zero/src/main.rs
index b2cab6a..d4f7932 100644
--- a/crates/init/ente-zero/src/main.rs
+++ b/crates/init/arje-zero/src/main.rs
@@ -23,8 +23,8 @@ mod keypair_store;
 mod seed;
 
 use anyhow::Context;
-use ente_brain::{BrainState, IntrospectServer};
-use ente_kernel::{become_child_subreaper, bootstrap_kernel_surface, spawn_sigchld_stream, spawn_uevent_stream};
+use arje_brain::{BrainState, IntrospectServer};
+use arje_kernel::{become_child_subreaper, bootstrap_kernel_surface, spawn_sigchld_stream, spawn_uevent_stream};
 use events::{ExitStatus, GraphEvent, ShutdownReason};
 use graph::EnteGraph;
 use nix::errno::Errno;
@@ -106,7 +106,7 @@ fn main() -> anyhow::Result<()> {
 }
 
 async fn primordial_loop(
-    seed_card: ente_card::EntityCard,
+    seed_card: arje_card::EntityCard,
     dev_mode: bool,
     checkpoint_path: Option<PathBuf>,
     restore_path: Option<PathBuf>,
@@ -127,7 +127,7 @@ async fn primordial_loop(
         Ok(rx) => rx,
         Err(e) => {
             warn!(?e, "uevents deshabilitados (probablemente falta CAP_NET_ADMIN)");
-            let (_keep_tx, rx) = mpsc::channel::<ente_kernel::UEvent>(1);
+            let (_keep_tx, rx) = mpsc::channel::<arje_kernel::UEvent>(1);
             std::mem::forget(_keep_tx);
             rx
         }
@@ -137,7 +137,7 @@ async fn primordial_loop(
     // tenga adónde llegar. Su path se inyecta en ENTE_BUS_SOCK por soma.
     let bus_sock = bus::default_socket_path();
     let bus_path = bus::spawn_bus(bus_sock, graph_tx.clone())?;
-    ente_soma::set_bus_sock(bus_path.to_string_lossy().into_owned());
+    arje_soma::set_bus_sock(bus_path.to_string_lossy().into_owned());
 
     // Brahman protocol: handshake socket + broker compartido.
     //
@@ -285,7 +285,7 @@ async fn primordial_loop(
         // Umbrales relajados para que el demo (pocos eventos) produzca
         // cristales observables. Con P(b|a) normalizada a [0,1], los
         // valores típicos en muestras pequeñas son 0.2-0.5.
-        BrainState::with_params(1024, ente_brain::CrystallizationParams {
+        BrainState::with_params(1024, arje_brain::CrystallizationParams {
             min_support: 2,
             min_conditional_prob: 0.3,
             min_pmi: 1.0,
@@ -300,13 +300,13 @@ async fn primordial_loop(
         let mut obs = brain.observer.write().await;
         // Reemplazar con un observer nuevo que tenga half-life. Estado
         // anterior (vacío en este punto) descartado.
-        *obs = ente_brain::Observer::new(1024).with_half_life(hl);
+        *obs = arje_brain::Observer::new(1024).with_half_life(hl);
         info!(hl_secs = hl, "observer con time-decay activo");
     }
     if let Some(secs) = autopromote_secs {
-        ente_brain::spawn_autopromote_loop(
+        arje_brain::spawn_autopromote_loop(
             brain.clone(),
-            ente_brain::AutopromoteParams {
+            arje_brain::AutopromoteParams {
                 interval_secs: secs,
                 threshold: brain.params, // mismo threshold que crystals manuales
             },
@@ -322,7 +322,7 @@ async fn primordial_loop(
                 Ok(snap) => {
                     let total = snap.total;
                     let kinds = snap.marginal.len();
-                    let restored = ente_brain::Observer::from_snapshot(snap);
+                    let restored = arje_brain::Observer::from_snapshot(snap);
                     *brain.observer.write().await = restored;
                     info!(
                         path = %brain_path.display(),
@@ -337,7 +337,7 @@ async fn primordial_loop(
     // Si --audit-head, configuramos el head pointer y arrancamos auto-flush.
     if let Some(head_path) = audit_head {
         // Re-creamos el AuditLog con head pointer.
-        let new_audit = ente_brain::audit::AuditLog::new()
+        let new_audit = arje_brain::audit::AuditLog::new()
             .with_head_pointer(head_path);
         *brain.audit.write().await = new_audit;
         spawn_audit_auto_flush(brain.clone());
@@ -345,7 +345,7 @@ async fn primordial_loop(
 
     // Carga inicial de reglas desde JSON/JSONL si --rules path proporcionado.
     if let Some(path) = &rules_path {
-        match ente_brain::load_rules_file(path) {
+        match arje_brain::load_rules_file(path) {
             Ok(rules) => {
                 let mut engine = brain.engine.write().await;
                 for r in rules {
@@ -367,7 +367,7 @@ async fn primordial_loop(
             Ok(addr) => {
                 let s = brain.clone();
                 tokio::spawn(async move {
-                    if let Err(e) = ente_brain::serve_metrics(s, addr).await {
+                    if let Err(e) = arje_brain::serve_metrics(s, addr).await {
                         warn!(?e, "metrics server cayó");
                     }
                 });
@@ -536,14 +536,14 @@ async fn emit_death(
 fn spawn_echo_smoke_test(bus_path: PathBuf) {
     tokio::spawn(async move {
         tokio::time::sleep(Duration::from_millis(300)).await;
-        match ente_bus::BusClient::connect(&bus_path).await {
+        match arje_bus::BusClient::connect(&bus_path).await {
             Ok(mut client) => {
-                let req = ente_bus::BusRequest::Invoke {
-                    cap: ente_echo::echo_capability(),
+                let req = arje_bus::BusRequest::Invoke {
+                    cap: arje_echo::echo_capability(),
                     blob: b"hola fractal forwardeado".to_vec(),
                 };
                 match client.call(req).await {
-                    Ok(ente_bus::BusResponse::Invoked { result }) => {
+                    Ok(arje_bus::BusResponse::Invoked { result }) => {
                         info!(echo = %String::from_utf8_lossy(&result), "Invoke ECHO round-trip OK");
                     }
                     Ok(other) => warn!(?other, "Invoke ECHO respuesta inesperada"),
@@ -555,7 +555,7 @@ fn spawn_echo_smoke_test(bus_path: PathBuf) {
     });
 }
 
-fn write_brain_snapshot(path: &std::path::Path, snap: &ente_brain::observer::ObserverSnapshot) -> anyhow::Result<()> {
+fn write_brain_snapshot(path: &std::path::Path, snap: &arje_brain::observer::ObserverSnapshot) -> anyhow::Result<()> {
     let bytes = serde_json::to_vec_pretty(snap)?;
     if let Some(parent) = path.parent() { let _ = std::fs::create_dir_all(parent); }
     let tmp = path.with_extension("tmp");
@@ -564,16 +564,16 @@ fn write_brain_snapshot(path: &std::path::Path, snap: &ente_brain::observer::Obs
     Ok(())
 }
 
-fn read_brain_snapshot(path: &std::path::Path) -> anyhow::Result<ente_brain::observer::ObserverSnapshot> {
+fn read_brain_snapshot(path: &std::path::Path) -> anyhow::Result<arje_brain::observer::ObserverSnapshot> {
     let bytes = std::fs::read(path)?;
-    let snap: ente_brain::observer::ObserverSnapshot = serde_json::from_slice(&bytes)?;
+    let snap: arje_brain::observer::ObserverSnapshot = serde_json::from_slice(&bytes)?;
     Ok(snap)
 }
 
 fn init_tracing() {
     use tracing_subscriber::{fmt, EnvFilter};
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_zero=debug,info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_zero=debug,info"));
     fmt().with_env_filter(filter).with_target(true).init();
 }
 
@@ -625,7 +625,7 @@ async fn feed_brain(
     evt: &GraphEvent,
 ) {
     let Some((kind, subj)) = brain_glue::graph_event_to_brain(evt, graph) else { return };
-    let history: Vec<ente_brain::TimedEvent> = {
+    let history: Vec<arje_brain::TimedEvent> = {
         let mut obs = brain.observer.write().await;
         obs.record(kind.clone());
         // Snapshot de los últimos 16 eventos — suficiente para cualquier
@@ -637,7 +637,7 @@ async fn feed_brain(
         engine.dispatch(&kind, &subj, &history)
     };
     if !rules.is_empty() {
-        ente_brain::dispatch_actions(&rules, sink).await;
+        arje_brain::dispatch_actions(&rules, sink).await;
     }
 }
 
diff --git a/crates/init/ente-zero/src/seed.rs b/crates/init/arje-zero/src/seed.rs
similarity index 95%
rename from crates/init/ente-zero/src/seed.rs
rename to crates/init/arje-zero/src/seed.rs
index fe01689..6d404f5 100644
--- a/crates/init/ente-zero/src/seed.rs
+++ b/crates/init/arje-zero/src/seed.rs
@@ -8,7 +8,7 @@
 //!      todas las capacidades del fractal.
 
 use anyhow::Context;
-use ente_card::{
+use arje_card::{
     Capability, CardError, CgroupSpec, EntityCard, NamespaceSet, Payload,
     ResourceLimits, SomaSpec, Supervision, CARD_SCHEMA_VERSION,
 };
@@ -33,7 +33,7 @@ pub fn load(dev_mode: bool, restore: Option<&Path>) -> anyhow::Result<EntityCard
 }
 
 fn load_from_snapshot(path: &Path) -> anyhow::Result<EntityCard> {
-    let snap = ente_snapshot::FractalSnapshot::read(path)
+    let snap = arje_snapshot::FractalSnapshot::read(path)
         .with_context(|| format!("read snapshot {}", path.display()))?;
     info!(
         path = %path.display(),
@@ -66,7 +66,7 @@ fn load_from_snapshot(path: &Path) -> anyhow::Result<EntityCard> {
 fn load_or_synthesize(dev_mode: bool) -> anyhow::Result<EntityCard> {
     // Buscamos primero `.json` (canónico), luego sin extensión por
     // compatibilidad con instalaciones que dejan el archivo crudo. La puerta
-    // genética se cruza vía `ente_brain::load_card_file` que pasa por
+    // genética se cruza vía `arje_brain::load_card_file` que pasa por
     // `validate()` extendido.
     let candidates: &[&str] = if dev_mode {
         &["seed.card.json", SEED_PATH_DEV]
@@ -76,7 +76,7 @@ fn load_or_synthesize(dev_mode: bool) -> anyhow::Result<EntityCard> {
     for cand in candidates {
         let path = PathBuf::from(cand);
         if !path.exists() { continue; }
-        let card = ente_brain::load_card_file(&path)
+        let card = arje_brain::load_card_file(&path)
             .with_context(|| format!("load {}", path.display()))?;
         info!(path = %path.display(), "Tarjeta Semilla cargada y validada");
         return Ok(card);
@@ -96,8 +96,8 @@ fn synthesize_dev_seed() -> EntityCard {
     // Pre-registramos el módulo Wasm demo en el CAS y obtenemos su SHA real.
     // Si el CAS no es escribible (raro en dev) caemos a un SHA cero — la
     // resolución fallará y el Wasm no encarnará, pero el resto queda intacto.
-    let demo_wasm_sha = match ente_wasm::demo_module_bytes()
-        .and_then(|b| ente_cas::store(&b))
+    let demo_wasm_sha = match arje_wasm::demo_module_bytes()
+        .and_then(|b| arje_cas::store(&b))
     {
         Ok(sha) => sha,
         Err(e) => {
@@ -134,7 +134,7 @@ fn synthesize_dev_seed() -> EntityCard {
 
     if let Some(card) = optional_native_card(
         "demo-echo", "target/debug/ente-echo",
-        [ente_echo::echo_capability()].into_iter().collect(),
+        [arje_echo::echo_capability()].into_iter().collect(),
         restart_supervision(),
     ) {
         genesis.push(card);
diff --git a/crates/init/ente-soma/Cargo.toml b/crates/init/ente-soma/Cargo.toml
deleted file mode 100644
index dba4f57..0000000
--- a/crates/init/ente-soma/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "ente-soma"
-version = "0.0.1"
-edition.workspace = true
-license.workspace = true
-publish.workspace = true
-description = "Wrapper histórico sobre ente-incarnate para mantener la API set_bus_sock+incarnate que usa ente-zero. Toda la lógica vive en ente-incarnate."
-
-[dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../../runtime/ente-bus" }
-ente-incarnate = { path = "../ente-incarnate" }
-nix = { workspace = true }
-anyhow = { workspace = true }
-tracing = { workspace = true }
diff --git a/crates/modules/akasha/SDD.md b/crates/modules/chasqui/SDD.md
similarity index 100%
rename from crates/modules/akasha/SDD.md
rename to crates/modules/chasqui/SDD.md
diff --git a/crates/modules/akasha/card/Cargo.toml b/crates/modules/chasqui/card/Cargo.toml
similarity index 95%
rename from crates/modules/akasha/card/Cargo.toml
rename to crates/modules/chasqui/card/Cargo.toml
index 2af214c..8d966c6 100644
--- a/crates/modules/akasha/card/Cargo.toml
+++ b/crates/modules/chasqui/card/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-card"
+name = "chasqui-card"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
diff --git a/crates/modules/akasha/card/src/lib.rs b/crates/modules/chasqui/card/src/lib.rs
similarity index 98%
rename from crates/modules/akasha/card/src/lib.rs
rename to crates/modules/chasqui/card/src/lib.rs
index c1c435d..c46181f 100644
--- a/crates/modules/akasha/card/src/lib.rs
+++ b/crates/modules/chasqui/card/src/lib.rs
@@ -1,4 +1,4 @@
-//! `akasha-card` — manifiesto de Mónada.
+//! `chasqui-card` — manifiesto de Mónada.
 //!
 //! Una **Mónada** es una agrupación semántica de archivos: el archivo
 //! físico no se mueve, pero su pertenencia se modela por un objeto
@@ -10,7 +10,7 @@
 //!
 //! Diferencia con `brahman-card::Card`:
 //!
-//! | brahman::Card                       | akasha::MonadManifest         |
+//! | brahman::Card                       | chasqui::MonadManifest         |
 //! |-------------------------------------|-------------------------------|
 //! | Describe una **entidad runtime**    | Describe una **agrupación**   |
 //! | Tiene `payload`/`soma`/`supervision`| No tiene proceso detrás       |
@@ -18,7 +18,7 @@
 //! | Fluye por handshake/postcard        | Fluye por queries del backend |
 //!
 //! Este crate sólo define los tipos. La lógica de scan, cluster,
-//! attraction vive en `akasha-core`.
+//! attraction vive en `chasqui-core`.
 
 #![forbid(unsafe_code)]
 #![warn(rust_2018_idioms)]
diff --git a/crates/modules/akasha/card/src/query.rs b/crates/modules/chasqui/card/src/query.rs
similarity index 96%
rename from crates/modules/akasha/card/src/query.rs
rename to crates/modules/chasqui/card/src/query.rs
index 125ba27..c4debb9 100644
--- a/crates/modules/akasha/card/src/query.rs
+++ b/crates/modules/chasqui/card/src/query.rs
@@ -1,12 +1,12 @@
-//! Wire types para consultar al daemon `akasha` por sus Mónadas.
+//! Wire types para consultar al daemon `chasqui` por sus Mónadas.
 //!
 //! El daemon expone un Unix socket (cuyo path se publica en
 //! `Card.service_socket` y se descubre vía broker MatchEvent). Cada
 //! conexión es single-shot: una request JSON terminada en `\n`,
 //! una response JSON terminada en `\n`, cierre.
 //!
-//! Mismo patrón que `akasha-nous` (mock/real ↔ akasha-core), reusado
-//! ahora para que la UI (`akasha-explorer`) descubra y consulte al
+//! Mismo patrón que `chasqui-nous` (mock/real ↔ chasqui-core), reusado
+//! ahora para que la UI (`chasqui-explorer`) descubra y consulte al
 //! daemon sin hardcodear sockets ni pasar por brahman-admin.
 //!
 //! ## Contrato
@@ -118,7 +118,7 @@ impl MonadView {
 
 /// Error de protocolo retornado en lugar de la response normal.
 #[derive(Debug, Clone, Serialize, Deserialize, Error)]
-#[error("akasha-engine: {error}")]
+#[error("chasqui-engine: {error}")]
 pub struct ErrorResponse {
     pub error: String,
 }
@@ -135,7 +135,7 @@ pub mod transport {
     pub const SOCKET_ENV: &str = "NOUSER_ENGINE_SOCKET";
 
     /// Nombre por defecto del socket.
-    pub const SOCKET_NAME: &str = "akasha-engine.sock";
+    pub const SOCKET_NAME: &str = "chasqui-engine.sock";
 
     /// Ruta canónica al socket del daemon. Honra `NOUSER_ENGINE_SOCKET`
     /// si está set, sino arma sobre `$XDG_RUNTIME_DIR` (con fallback
@@ -154,7 +154,7 @@ pub mod transport {
 // =====================================================================
 // Cliente blocking — vive con los wire types para que un consumer
 // (UI, CLI, otro módulo) pueda hablar con el daemon importando sólo
-// `akasha-card`, sin arrastrar `akasha-core` (notify/walkdir/sled/blake3).
+// `chasqui-card`, sin arrastrar `chasqui-core` (notify/walkdir/sled/blake3).
 // =====================================================================
 
 /// Cliente síncrono para el query socket del daemon. Sólo Unix (el
diff --git a/crates/modules/akasha/core/Cargo.toml b/crates/modules/chasqui/core/Cargo.toml
similarity index 88%
rename from crates/modules/akasha/core/Cargo.toml
rename to crates/modules/chasqui/core/Cargo.toml
index 4b7f88f..7b9e084 100644
--- a/crates/modules/akasha/core/Cargo.toml
+++ b/crates/modules/chasqui/core/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-core"
+name = "chasqui-core"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
@@ -9,8 +9,8 @@ publish.workspace = true
 description = "Nouser — explorador de Mónadas: scanner, clustering determinista, DB en memoria."
 
 [dependencies]
-akasha-card = { path = "../card" }
-akasha-nous = { path = "../nous" }
+chasqui-card = { path = "../card" }
+chasqui-nous = { path = "../nous" }
 shuma-discern = { path = "../../shuma/shuma-discern" }
 brahman-card = { path = "../../../protocol/brahman-card" }
 brahman-handshake = { path = "../../../protocol/brahman-handshake" }
@@ -29,5 +29,5 @@ notify = { workspace = true }
 tempfile = { workspace = true }
 
 [[bin]]
-name = "akasha"
+name = "chasqui"
 path = "src/bin/nouser.rs"
diff --git a/crates/modules/akasha/core/src/bin/nouser.rs b/crates/modules/chasqui/core/src/bin/nouser.rs
similarity index 91%
rename from crates/modules/akasha/core/src/bin/nouser.rs
rename to crates/modules/chasqui/core/src/bin/nouser.rs
index 1209993..d652059 100644
--- a/crates/modules/akasha/core/src/bin/nouser.rs
+++ b/crates/modules/chasqui/core/src/bin/nouser.rs
@@ -1,4 +1,4 @@
-//! `akasha` CLI — explorador de Mónadas.
+//! `chasqui` CLI — explorador de Mónadas.
 //!
 //! Subcomandos:
 //!
@@ -13,14 +13,14 @@
 use std::path::PathBuf;
 use std::process::ExitCode;
 
-use akasha_core::{
+use chasqui_core::{
     cluster, db, embed,
     scanner::{self, ScanConfig},
 };
 
 fn main() -> ExitCode {
     let args: Vec<String> = std::env::args().collect();
-    let prog = args.first().cloned().unwrap_or_else(|| "akasha".into());
+    let prog = args.first().cloned().unwrap_or_else(|| "chasqui".into());
     let sub = match args.get(1).map(String::as_str) {
         Some(s) => s,
         None => {
@@ -41,7 +41,7 @@ fn main() -> ExitCode {
             return ExitCode::SUCCESS;
         }
         other => {
-            eprintln!("akasha: comando desconocido '{other}'");
+            eprintln!("chasqui: comando desconocido '{other}'");
             print_usage(&prog);
             return ExitCode::from(2);
         }
@@ -50,7 +50,7 @@ fn main() -> ExitCode {
     match result {
         Ok(()) => ExitCode::SUCCESS,
         Err(e) => {
-            eprintln!("akasha: {e}");
+            eprintln!("chasqui: {e}");
             ExitCode::from(1)
         }
     }
@@ -181,7 +181,7 @@ fn cmd_daemon(args: &[String]) -> Cmd {
 
     // 1. Decidir el path del query socket ANTES de armar el engine
     //    Card (porque viaja como service_socket en la Card).
-    let query_socket = akasha_card::query::transport::default_socket_path();
+    let query_socket = chasqui_card::query::transport::default_socket_path();
 
     // 2. Engine como Ente. Declara service_socket + flow.output para
     //    que el broker pueda emitir MatchEvent::Available a consumers
@@ -190,7 +190,7 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     let engine_id = engine_card.id;
     let engine_label = engine_card.label.clone();
     eprintln!(
-        "akasha daemon: publicando engine '{}' (kind=Ente, id={}, socket={})",
+        "chasqui daemon: publicando engine '{}' (kind=Ente, id={}, socket={})",
         engine_label,
         engine_id,
         query_socket.display()
@@ -227,7 +227,7 @@ fn cmd_daemon(args: &[String]) -> Cmd {
             hydrated += 1;
         }
         eprintln!(
-            "akasha daemon: hidratadas {} mónadas previas{} en O(1)",
+            "chasqui daemon: hidratadas {} mónadas previas{} en O(1)",
             hydrated,
             if skipped_model > 0 {
                 format!(" ({} dropeadas por centroid_model distinto)", skipped_model)
@@ -245,7 +245,7 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     let monads = cluster::by_directory_hydrated(&files, min_files(), Some(&db));
     let scanned_count = monads.len();
     eprintln!(
-        "akasha daemon: re-scan {} archivos en {} → {} mónadas",
+        "chasqui daemon: re-scan {} archivos en {} → {} mónadas",
         n_files,
         dir.display(),
         scanned_count
@@ -276,7 +276,7 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     db.replace_monads(monads);
 
     eprintln!(
-        "akasha daemon: 1 ente + {} mónadas vivas ({} nuevas vs hidratación)",
+        "chasqui daemon: 1 ente + {} mónadas vivas ({} nuevas vs hidratación)",
         scanned_count, newly_spawned
     );
 
@@ -285,8 +285,8 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     // Si el bind falla, seguimos sin él — la UI degrada a "no
     // alcanzable" pero el daemon sigue procesando cambios.
     let db_shared = std::sync::Arc::new(std::sync::Mutex::new(db));
-    let _query_listener = match akasha_core::engine_socket::spawn_listener(
-        akasha_core::engine_socket::ListenerConfig {
+    let _query_listener = match chasqui_core::engine_socket::spawn_listener(
+        chasqui_core::engine_socket::ListenerConfig {
             socket_path: query_socket.clone(),
             engine_id,
             engine_label: engine_label.clone(),
@@ -296,14 +296,14 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     ) {
         Ok(h) => {
             eprintln!(
-                "akasha daemon: query socket activo en {} (proto: akasha_card::query)",
+                "chasqui daemon: query socket activo en {} (proto: chasqui_card::query)",
                 query_socket.display()
             );
             Some(h)
         }
         Err(e) => {
             eprintln!(
-                "akasha daemon: query socket NO disponible ({e}) — explorer no podrá consultar"
+                "chasqui daemon: query socket NO disponible ({e}) — explorer no podrá consultar"
             );
             None
         }
@@ -322,14 +322,14 @@ fn cmd_daemon(args: &[String]) -> Cmd {
     ) {
         Ok(w) => {
             eprintln!(
-                "akasha daemon: watcher activo en {} (debounce 150ms, re-publish on) — Ctrl-C para terminar.",
+                "chasqui daemon: watcher activo en {} (debounce 150ms, re-publish on) — Ctrl-C para terminar.",
                 dir.display()
             );
             Some(w)
         }
         Err(e) => {
             eprintln!(
-                "akasha daemon: watcher deshabilitado ({e}) — Ctrl-C para terminar."
+                "chasqui daemon: watcher deshabilitado ({e}) — Ctrl-C para terminar."
             );
             None
         }
@@ -385,7 +385,7 @@ fn spawn_fs_watcher(
     // Dispatcher: notify → filtro → canal de paths.
     let dispatch_dir = dir.clone();
     std::thread::Builder::new()
-        .name("akasha-watcher-dispatch".into())
+        .name("chasqui-watcher-dispatch".into())
         .spawn(move || {
             for res in notify_rx {
                 let event = match res {
@@ -416,7 +416,7 @@ fn spawn_fs_watcher(
     // Coordinator: debounce + batch dispatch.
     let coord_dir = dir;
     std::thread::Builder::new()
-        .name("akasha-watcher-coord".into())
+        .name("chasqui-watcher-coord".into())
         .spawn(move || {
             let debounce = std::time::Duration::from_millis(WATCHER_DEBOUNCE_MS);
             let mut pending: std::collections::HashMap<
@@ -494,7 +494,7 @@ fn process_change_batch(
         }
     };
 
-    let prior_monads: Vec<akasha_card::MonadManifest> = db_lock.monads().cloned().collect();
+    let prior_monads: Vec<chasqui_card::MonadManifest> = db_lock.monads().cloned().collect();
     let prior_ref: &db::MonadDb = &db_lock;
     let monads = cluster::by_directory_hydrated(&files, min_files(), Some(prior_ref));
 
@@ -601,8 +601,8 @@ fn cmd_attract(args: &[String]) -> Cmd {
         .and_then(|t| t.duration_since(std::time::UNIX_EPOCH).ok())
         .map(|d| d.as_millis() as u64)
         .unwrap_or(0);
-    let target = akasha_card::FileEntry {
-        id: akasha_card::FileId::from(akasha_card::ulid::Ulid::new()),
+    let target = chasqui_card::FileEntry {
+        id: chasqui_card::FileId::from(chasqui_card::ulid::Ulid::new()),
         path: file_path.clone(),
         content_hash: None,
         size: metadata.len(),
@@ -630,7 +630,7 @@ fn cmd_attract(args: &[String]) -> Cmd {
     // Filtramos Mónadas cuyo centroid_model NO matchee. Mezclar
     // 32-d con 384-d daría scores sin sentido (diferente semántica
     // y cosine no compara cross-modelo).
-    let mut ranked: Vec<(&akasha_card::MonadManifest, f32)> = db
+    let mut ranked: Vec<(&chasqui_card::MonadManifest, f32)> = db
         .monads()
         .filter(|m| !m.centroid.is_empty())
         .filter(|m| match &m.centroid_model {
@@ -700,7 +700,7 @@ fn cmd_attract(args: &[String]) -> Cmd {
 /// Devuelve `(embedding, model_id)` — el caller necesita ambos para
 /// comparar contra centroides taggeados con su mismo `centroid_model`.
 fn remote_embed(
-    file: &akasha_card::FileEntry,
+    file: &chasqui_card::FileEntry,
 ) -> Result<(Vec<f32>, String), Box<dyn std::error::Error>> {
     if let Ok(explicit) = std::env::var("NOUSER_NOUS_SOCKET") {
         let sock = std::path::PathBuf::from(explicit);
@@ -708,9 +708,9 @@ fn remote_embed(
     }
 
     let consumer = brahman_sidecar::build_consumer_card(
-        "akasha.attract-cli",
-        akasha_nous::FLOW_EMBED_RESULT,
-        akasha_nous::FLOW_TYPE_NAME,
+        "chasqui.attract-cli",
+        chasqui_nous::FLOW_EMBED_RESULT,
+        chasqui_nous::FLOW_TYPE_NAME,
     );
     let producer_sock = brahman_sidecar::await_provider_blocking(
         consumer,
@@ -719,12 +719,12 @@ fn remote_embed(
     embed_via(&producer_sock, file)
 }
 
-/// RPC blocking contra un socket akasha-nous concreto. Devuelve
+/// RPC blocking contra un socket chasqui-nous concreto. Devuelve
 /// `(embedding, model_id)` — el `model_id` viaja en la response y
 /// permite al caller saber qué centroides son comparables.
 fn embed_via(
     sock_path: &std::path::Path,
-    file: &akasha_card::FileEntry,
+    file: &chasqui_card::FileEntry,
 ) -> Result<(Vec<f32>, String), Box<dyn std::error::Error>> {
     use std::io::{BufRead, BufReader, Write};
     use std::os::unix::net::UnixStream;
@@ -734,9 +734,9 @@ fn embed_via(
     }
 
     let mut stream = UnixStream::connect(sock_path)?;
-    let req = akasha_nous::EmbedRequest {
-        kind: akasha_nous::RequestKind::EmbedFile,
-        payload: serde_json::to_value(akasha_nous::EmbedFilePayload {
+    let req = chasqui_nous::EmbedRequest {
+        kind: chasqui_nous::RequestKind::EmbedFile,
+        payload: serde_json::to_value(chasqui_nous::EmbedFilePayload {
             path: file.path.display().to_string(),
             extension: file.extension.clone(),
             size: file.size,
@@ -752,14 +752,14 @@ fn embed_via(
     let mut response = String::new();
     reader.read_line(&mut response)?;
     if response.is_empty() {
-        return Err("akasha-nous cerró sin respuesta".into());
+        return Err("chasqui-nous cerró sin respuesta".into());
     }
 
-    if let Ok(resp) = serde_json::from_str::<akasha_nous::EmbedResponse>(&response) {
+    if let Ok(resp) = serde_json::from_str::<chasqui_nous::EmbedResponse>(&response) {
         return Ok((resp.embedding, resp.model));
     }
-    let err: akasha_nous::ErrorResponse = serde_json::from_str(&response)?;
-    Err(format!("akasha-nous: {}", err.error).into())
+    let err: chasqui_nous::ErrorResponse = serde_json::from_str(&response)?;
+    Err(format!("chasqui-nous: {}", err.error).into())
 }
 
 /// Card del propio engine (kind=Ente). Es el "ser" que produce y
@@ -771,7 +771,7 @@ fn embed_via(
 /// brahman-admin.
 fn build_engine_card(service_socket: std::path::PathBuf) -> brahman_card::Card {
     use brahman_card::{Card, CardKind, Flow, Flows, Lifecycle, Payload, Priority, Supervision, TypeRef};
-    use akasha_card::query::{FLOW_MONAD_LIST, FLOW_TYPE_NAME};
+    use chasqui_card::query::{FLOW_MONAD_LIST, FLOW_TYPE_NAME};
 
     Card {
         payload: Payload::Virtual,
diff --git a/crates/modules/akasha/core/src/cluster.rs b/crates/modules/chasqui/core/src/cluster.rs
similarity index 99%
rename from crates/modules/akasha/core/src/cluster.rs
rename to crates/modules/chasqui/core/src/cluster.rs
index 2aad513..85af5b5 100644
--- a/crates/modules/akasha/core/src/cluster.rs
+++ b/crates/modules/chasqui/core/src/cluster.rs
@@ -15,7 +15,7 @@
 use std::collections::BTreeMap;
 use std::path::PathBuf;
 
-use akasha_card::{FileEntry, Lens, MonadManifest};
+use chasqui_card::{FileEntry, Lens, MonadManifest};
 
 use crate::embed;
 
@@ -236,7 +236,7 @@ fn shannon_entropy_normalized(files: &[&FileEntry]) -> f32 {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use akasha_card::FileId;
+    use chasqui_card::FileId;
     use std::path::PathBuf;
     use ulid::Ulid;
 
diff --git a/crates/modules/akasha/core/src/db.rs b/crates/modules/chasqui/core/src/db.rs
similarity index 99%
rename from crates/modules/akasha/core/src/db.rs
rename to crates/modules/chasqui/core/src/db.rs
index 0045a86..6674015 100644
--- a/crates/modules/akasha/core/src/db.rs
+++ b/crates/modules/chasqui/core/src/db.rs
@@ -12,7 +12,7 @@
 use std::collections::BTreeMap;
 use std::path::Path;
 
-use akasha_card::{FileEntry, FileId, MonadId, MonadManifest};
+use chasqui_card::{FileEntry, FileId, MonadId, MonadManifest};
 use thiserror::Error;
 
 #[derive(Debug, Error)]
@@ -188,7 +188,7 @@ fn decode_key(k: &[u8]) -> Result<ulid::Ulid, MonadDbError> {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use akasha_card::Lens;
+    use chasqui_card::Lens;
     use ulid::Ulid;
 
     fn mk_file(path: &str) -> FileEntry {
diff --git a/crates/modules/akasha/core/src/embed.rs b/crates/modules/chasqui/core/src/embed.rs
similarity index 98%
rename from crates/modules/akasha/core/src/embed.rs
rename to crates/modules/chasqui/core/src/embed.rs
index 245ebbf..4113d5e 100644
--- a/crates/modules/akasha/core/src/embed.rs
+++ b/crates/modules/chasqui/core/src/embed.rs
@@ -27,7 +27,7 @@
 //! - Dirs distintos + misma ext  → similitud ~ 0.5.
 //! - Sin parecido                → similitud < 0.3.
 
-use akasha_card::{FileEntry, MonadId, MonadManifest};
+use chasqui_card::{FileEntry, MonadId, MonadManifest};
 
 /// Dimensión del vector embedding.
 pub const EMBED_DIM: usize = 32;
@@ -37,7 +37,7 @@ pub const EMBED_DIM: usize = 32;
 /// este string contra el suyo antes de hacer cosine similarity.
 /// Mezclar centroides de distinto MODEL_ID corrompe scores
 /// silenciosamente (dimensiones distintas, semántica distinta).
-pub const MODEL_ID: &str = "akasha-pseudo-32d";
+pub const MODEL_ID: &str = "chasqui-pseudo-32d";
 
 /// Computa el embedding de un archivo. Determinístico: misma input
 /// → mismo vector. El vector queda L2-normalizado.
@@ -185,7 +185,7 @@ pub const DEFAULT_ATTRACTION_THRESHOLD: f32 = 0.7;
 #[cfg(test)]
 mod tests {
     use super::*;
-    use akasha_card::FileId;
+    use chasqui_card::FileId;
     use std::path::PathBuf;
     use ulid::Ulid;
 
diff --git a/crates/modules/akasha/core/src/engine_socket.rs b/crates/modules/chasqui/core/src/engine_socket.rs
similarity index 90%
rename from crates/modules/akasha/core/src/engine_socket.rs
rename to crates/modules/chasqui/core/src/engine_socket.rs
index 2b81de1..988aeaa 100644
--- a/crates/modules/akasha/core/src/engine_socket.rs
+++ b/crates/modules/chasqui/core/src/engine_socket.rs
@@ -1,13 +1,13 @@
-//! Listener Unix-socket que sirve [`akasha_card::query::QueryRequest`].
+//! Listener Unix-socket que sirve [`chasqui_card::query::QueryRequest`].
 //!
-//! El daemon `akasha` lo monta para que cualquier consumer (UI, CLI,
+//! El daemon `chasqui` lo monta para que cualquier consumer (UI, CLI,
 //! otro módulo) pueda preguntarle por sus Mónadas sin pasar por
 //! brahman-admin. El path del socket viaja en el `Card.service_socket`
 //! del engine; el broker brahman lo enseña vía MatchEvent::Available
 //! cuando un consumer declara `flow.input = monad-list:json`.
 //!
 //! Wire: line-delimited JSON, single-shot por conexión. Mismo patrón
-//! que `akasha-nous` (mock/real ↔ akasha-core), reutilizado.
+//! que `chasqui-nous` (mock/real ↔ chasqui-core), reutilizado.
 //!
 //! Threading: un thread dedicado, blocking I/O. No vale la pena traer
 //! tokio acá — la frecuencia esperada es muy baja (UI poll cada 2s)
@@ -18,10 +18,10 @@ use std::os::unix::net::{UnixListener, UnixStream};
 use std::path::PathBuf;
 use std::sync::{Arc, Mutex};
 
-use akasha_card::query::{
+use chasqui_card::query::{
     EngineInfo, ErrorResponse, ListMonadsResponse, MonadView, QueryRequest,
 };
-use akasha_card::ulid::Ulid;
+use chasqui_card::ulid::Ulid;
 
 use crate::db::MonadDb;
 
@@ -54,7 +54,7 @@ pub fn spawn_listener(
     let listener = UnixListener::bind(&config.socket_path)?;
 
     let handle = std::thread::Builder::new()
-        .name("akasha-engine-listener".into())
+        .name("chasqui-engine-listener".into())
         .spawn(move || {
             for conn in listener.incoming() {
                 match conn {
@@ -126,17 +126,17 @@ fn encode_error(msg: String) -> String {
     serde_json::to_string(&err).unwrap_or_else(|_| "{\"error\":\"encode\"}".into())
 }
 
-// El cliente blocking vive en `akasha_card::query::client` — junto a
+// El cliente blocking vive en `chasqui_card::query::client` — junto a
 // los wire types — para que un consumer pueda hablar con el daemon
-// importando sólo `akasha-card`, sin arrastrar el peso de
-// `akasha-core` (scanner / db / sled / notify / walkdir / blake3).
+// importando sólo `chasqui-card`, sin arrastrar el peso de
+// `chasqui-core` (scanner / db / sled / notify / walkdir / blake3).
 
 #[cfg(test)]
 mod tests {
     use super::*;
     use crate::db::MonadDb;
-    use akasha_card::query::client as query_client;
-    use akasha_card::MonadManifest;
+    use chasqui_card::query::client as query_client;
+    use chasqui_card::MonadManifest;
     use std::time::Duration;
 
     fn fresh_socket_path(name: &str) -> PathBuf {
@@ -147,7 +147,7 @@ mod tests {
 
     #[test]
     fn list_monads_roundtrip_empty() {
-        let socket = fresh_socket_path("akasha-engine-test");
+        let socket = fresh_socket_path("chasqui-engine-test");
         let db = Arc::new(Mutex::new(MonadDb::new()));
         let engine_id = Ulid::new();
         let _h = spawn_listener(
@@ -178,7 +178,7 @@ mod tests {
 
     #[test]
     fn list_monads_returns_views() {
-        let socket = fresh_socket_path("akasha-engine-test-views");
+        let socket = fresh_socket_path("chasqui-engine-test-views");
         let db = Arc::new(Mutex::new(MonadDb::new()));
         let m1 = MonadManifest::new("alpha");
         let m2 = MonadManifest::new("beta");
@@ -209,7 +209,7 @@ mod tests {
 
     #[test]
     fn invalid_request_returns_error_response() {
-        let socket = fresh_socket_path("akasha-engine-test-bad");
+        let socket = fresh_socket_path("chasqui-engine-test-bad");
         let db = Arc::new(Mutex::new(MonadDb::new()));
         let _h = spawn_listener(
             ListenerConfig {
diff --git a/crates/modules/akasha/core/src/lib.rs b/crates/modules/chasqui/core/src/lib.rs
similarity index 93%
rename from crates/modules/akasha/core/src/lib.rs
rename to crates/modules/chasqui/core/src/lib.rs
index 8572c84..e0ce4f1 100644
--- a/crates/modules/akasha/core/src/lib.rs
+++ b/crates/modules/chasqui/core/src/lib.rs
@@ -1,4 +1,4 @@
-//! `akasha-core` — el explorador de Mónadas.
+//! `chasqui-core` — el explorador de Mónadas.
 //!
 //! Implementa la pipeline determinista descrita en el diseño de Kairos:
 //!
@@ -31,4 +31,4 @@ pub mod embed;
 pub mod engine_socket;
 pub mod scanner;
 
-pub use akasha_card::*;
+pub use chasqui_card::*;
diff --git a/crates/modules/akasha/core/src/scanner.rs b/crates/modules/chasqui/core/src/scanner.rs
similarity index 99%
rename from crates/modules/akasha/core/src/scanner.rs
rename to crates/modules/chasqui/core/src/scanner.rs
index 3c12cf5..520263c 100644
--- a/crates/modules/akasha/core/src/scanner.rs
+++ b/crates/modules/chasqui/core/src/scanner.rs
@@ -6,7 +6,7 @@
 use std::path::{Path, PathBuf};
 use std::time::UNIX_EPOCH;
 
-use akasha_card::{FileEntry, FileId};
+use chasqui_card::{FileEntry, FileId};
 use thiserror::Error;
 use ulid::Ulid;
 use walkdir::WalkDir;
diff --git a/crates/modules/akasha/nous-mock/Cargo.toml b/crates/modules/chasqui/nous-mock/Cargo.toml
similarity index 80%
rename from crates/modules/akasha/nous-mock/Cargo.toml
rename to crates/modules/chasqui/nous-mock/Cargo.toml
index ed40eb8..f05d903 100644
--- a/crates/modules/akasha/nous-mock/Cargo.toml
+++ b/crates/modules/chasqui/nous-mock/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-nous-mock"
+name = "chasqui-nous-mock"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
@@ -11,9 +11,9 @@ description = "Nouser — Nous mock determinístico: implementa el contrato nous
 [dependencies]
 brahman-card = { path = "../../../protocol/brahman-card" }
 brahman-sidecar = { path = "../../../protocol/brahman-sidecar" }
-akasha-card = { path = "../card" }
-akasha-core = { path = "../core" }
-akasha-nous = { path = "../nous" }
+chasqui-card = { path = "../card" }
+chasqui-core = { path = "../core" }
+chasqui-nous = { path = "../nous" }
 serde_json = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
@@ -21,5 +21,5 @@ tracing-subscriber = { workspace = true }
 ulid = { workspace = true }
 
 [[bin]]
-name = "akasha-nous-mock"
+name = "chasqui-nous-mock"
 path = "src/main.rs"
diff --git a/crates/modules/akasha/nous-mock/src/main.rs b/crates/modules/chasqui/nous-mock/src/main.rs
similarity index 92%
rename from crates/modules/akasha/nous-mock/src/main.rs
rename to crates/modules/chasqui/nous-mock/src/main.rs
index 6d2d2ed..8793857 100644
--- a/crates/modules/akasha/nous-mock/src/main.rs
+++ b/crates/modules/chasqui/nous-mock/src/main.rs
@@ -1,7 +1,7 @@
-//! `akasha-nous-mock` — proveedor de embeddings determinista (sin LLM).
+//! `chasqui-nous-mock` — proveedor de embeddings determinista (sin LLM).
 //!
-//! Implementa el contrato `akasha-nous` usando los pseudo-embeddings
-//! de Phase C (`akasha_core::embed`). Sirve como:
+//! Implementa el contrato `chasqui-nous` usando los pseudo-embeddings
+//! de Phase C (`chasqui_core::embed`). Sirve como:
 //!
 //! - **Mock para tests**: en `BRAHMAN_BROKER_CONTEXT=test`, el
 //!   `priority_offset` per-contexto declarado en su Card lo prioriza
@@ -16,7 +16,7 @@
 //!    `priority_contexts.test = { priority_offset: +1 }` lo prioriza
 //!    cuando el broker corre bajo contexto test.
 //! 2. Bind del Unix socket en `$NOUSER_NOUS_SOCKET` (default
-//!    `$XDG_RUNTIME_DIR/akasha-nous.sock`).
+//!    `$XDG_RUNTIME_DIR/chasqui-nous.sock`).
 //! 3. Loop: accept → read line JSON → process → write line JSON → close.
 //! 4. Cada request se loggea (info) — útil para verificar que el
 //!    consumidor está usando este proveedor.
@@ -29,9 +29,9 @@ use brahman_card::{
     ulid::Ulid, Card, CardKind, ContextBias, Flow, Flows, Lifecycle, Payload, Priority,
     Supervision, TypeRef,
 };
-use akasha_card::FileEntry;
-use akasha_core::embed;
-use akasha_nous::{
+use chasqui_card::FileEntry;
+use chasqui_core::embed;
+use chasqui_nous::{
     transport, EmbedFilePayload, EmbedRequest, EmbedResponse, EmbedTextPayload, ErrorResponse,
     PingResponse, RequestKind, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME,
 };
@@ -39,11 +39,11 @@ use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
 use tokio::net::{UnixListener, UnixStream};
 use tracing::{info, warn};
 
-/// El mock implementa el MISMO algoritmo que `akasha_core::embed`,
+/// El mock implementa el MISMO algoritmo que `chasqui_core::embed`,
 /// así que reportamos el mismo `MODEL_ID` que él. De otro modo el
 /// consumer filtraría las Mónadas como "modelo distinto" y los
 /// scores quedarían vacíos.
-const MODEL_ID: &str = akasha_core::embed::MODEL_ID;
+const MODEL_ID: &str = chasqui_core::embed::MODEL_ID;
 
 #[tokio::main(flavor = "current_thread")]
 async fn main() -> std::io::Result<()> {
@@ -60,7 +60,7 @@ async fn main() -> std::io::Result<()> {
         std::fs::create_dir_all(parent)?;
     }
     let listener = UnixListener::bind(&sock_path)?;
-    info!(socket = %sock_path.display(), "akasha-nous-mock escuchando");
+    info!(socket = %sock_path.display(), "chasqui-nous-mock escuchando");
 
     // 2. Sidecar al brahman-init con la Card que declara el socket.
     let card = build_card(sock_path.clone());
@@ -107,7 +107,7 @@ fn build_card(service_socket: std::path::PathBuf) -> Card {
     Card {
         schema_version: brahman_card::CARD_SCHEMA_VERSION,
         id: Ulid::new(),
-        label: "akasha.nous_mock".into(),
+        label: "chasqui.nous_mock".into(),
         payload: Payload::Virtual,
         supervision: Supervision::Delegate,
         lifecycle: Lifecycle::Daemon,
@@ -178,7 +178,7 @@ fn handle_embed_file(payload: serde_json::Value, started: Instant) -> Result<Str
     info!(path = %p.path, "embed_file");
 
     let file = FileEntry {
-        id: akasha_card::FileId::from(Ulid::new()),
+        id: chasqui_card::FileId::from(Ulid::new()),
         path: PathBuf::from(p.path),
         content_hash: None,
         size: p.size,
@@ -204,7 +204,7 @@ fn handle_embed_text(payload: serde_json::Value, started: Instant) -> Result<Str
     // resto del vector con ceros. No es semánticamente útil, pero respeta
     // la forma para que el cliente no se rompa.
     let synthetic = FileEntry {
-        id: akasha_card::FileId::from(Ulid::new()),
+        id: chasqui_card::FileId::from(Ulid::new()),
         path: PathBuf::from(format!("synthetic://{}", p.text)),
         content_hash: None,
         size: p.text.len() as u64,
diff --git a/crates/modules/akasha/nous-real/Cargo.toml b/crates/modules/chasqui/nous-real/Cargo.toml
similarity index 89%
rename from crates/modules/akasha/nous-real/Cargo.toml
rename to crates/modules/chasqui/nous-real/Cargo.toml
index 1606ff5..6a6a43d 100644
--- a/crates/modules/akasha/nous-real/Cargo.toml
+++ b/crates/modules/chasqui/nous-real/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-nous-real"
+name = "chasqui-nous-real"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
@@ -20,8 +20,8 @@ embeddings = ["dep:fastembed"]
 [dependencies]
 brahman-card = { path = "../../../protocol/brahman-card" }
 brahman-sidecar = { path = "../../../protocol/brahman-sidecar" }
-ente-cas = { path = "../../../runtime/ente-cas" }
-akasha-nous = { path = "../nous" }
+arje-cas = { path = "../../../runtime/arje-cas" }
+chasqui-nous = { path = "../nous" }
 serde_json = { workspace = true }
 sled = { workspace = true }
 tokio = { workspace = true }
@@ -36,5 +36,5 @@ fastembed = { version = "4", optional = true }
 tempfile = { workspace = true }
 
 [[bin]]
-name = "akasha-nous-real"
+name = "chasqui-nous-real"
 path = "src/main.rs"
diff --git a/crates/modules/akasha/nous-real/src/cache.rs b/crates/modules/chasqui/nous-real/src/cache.rs
similarity index 96%
rename from crates/modules/akasha/nous-real/src/cache.rs
rename to crates/modules/chasqui/nous-real/src/cache.rs
index a5ab3cb..373d2ba 100644
--- a/crates/modules/akasha/nous-real/src/cache.rs
+++ b/crates/modules/chasqui/nous-real/src/cache.rs
@@ -2,7 +2,7 @@
 //!
 //! Razón de existir: el modelo real (`fastembed-allMiniLML6V2`) es
 //! caro (1-50 ms por archivo según tamaño y CPU). Cada vez que el
-//! daemon de akasha re-publica una Mónada o el watcher dispara un
+//! daemon de chasqui re-publica una Mónada o el watcher dispara un
 //! re-cluster por cambio de FS, todos los archivos pasan otra vez
 //! por embed. Para árboles de 1000 archivos, eso son segundos
 //! desperdiciados re-embedidando contenido que no cambió.
@@ -17,7 +17,7 @@
 //!   little-endian (4 bytes por f32). Compacto, sin overhead de
 //!   bincode/postcard para datos numéricos puros.
 //! - **Backend**: sled, tree único `embed_cache_v1`. Path:
-//!   `$XDG_CACHE_HOME/brahman/akasha-nous-real-embed-cache.sled`.
+//!   `$XDG_CACHE_HOME/brahman/chasqui-nous-real-embed-cache.sled`.
 //!
 //! ## Versionado
 //!
@@ -102,7 +102,7 @@ fn default_path() -> PathBuf {
                 .map(|h| PathBuf::from(h).join(".cache"))
         })
         .unwrap_or_else(std::env::temp_dir);
-    base.join("brahman").join("akasha-nous-real-embed-cache.sled")
+    base.join("brahman").join("chasqui-nous-real-embed-cache.sled")
 }
 
 fn build_key(file_sha: &[u8; 32], model_id: &str) -> Vec<u8> {
@@ -139,7 +139,7 @@ mod tests {
     use super::*;
 
     fn sha(s: &[u8]) -> [u8; 32] {
-        ente_cas::sha256_of(s)
+        arje_cas::sha256_of(s)
     }
 
     #[test]
diff --git a/crates/modules/akasha/nous-real/src/embeddings.rs b/crates/modules/chasqui/nous-real/src/embeddings.rs
similarity index 96%
rename from crates/modules/akasha/nous-real/src/embeddings.rs
rename to crates/modules/chasqui/nous-real/src/embeddings.rs
index abd9e85..28b0078 100644
--- a/crates/modules/akasha/nous-real/src/embeddings.rs
+++ b/crates/modules/chasqui/nous-real/src/embeddings.rs
@@ -20,7 +20,7 @@ use std::sync::Arc;
 use std::time::Instant;
 
 use fastembed::{EmbeddingModel, InitOptions, TextEmbedding};
-use akasha_nous::{
+use chasqui_nous::{
     EmbedFilePayload, EmbedRequest, EmbedResponse, EmbedTextPayload, ErrorResponse, PingResponse,
     RequestKind,
 };
@@ -135,13 +135,13 @@ fn handle_file(
     // bajo la semántica del proveedor (el modelo nunca vio los bytes
     // adicionales). Si la cabeza cambia, el hash cambia y caemos a
     // re-embed naturalmente.
-    let file_sha = ente_cas::sha256_of(&buf);
+    let file_sha = arje_cas::sha256_of(&buf);
 
     if let Some(cache) = cache {
         if let Some(cached) = cache.get(&file_sha, model_id) {
             info!(
                 path = %p.path,
-                sha = %ente_cas::hex(&file_sha),
+                sha = %arje_cas::hex(&file_sha),
                 bytes = n,
                 "embed_file: cache HIT"
             );
@@ -156,7 +156,7 @@ fn handle_file(
 
     info!(
         path = %p.path,
-        sha = %ente_cas::hex(&file_sha),
+        sha = %arje_cas::hex(&file_sha),
         bytes = n,
         "embed_file: cache MISS — invocando modelo"
     );
@@ -166,9 +166,9 @@ fn handle_file(
     // el cache (sled lo es) pero deja un registro consultable por
     // herramientas como `ente-cas gc` y permite que otros consumers
     // resuelvan los bytes por hash.
-    if let Err(e) = ente_cas::store(&buf) {
+    if let Err(e) = arje_cas::store(&buf) {
         // No-fatal: si CAS no escribe, cacheamos el embedding igual.
-        warn!(error = %e, "ente_cas::store falló (no-fatal)");
+        warn!(error = %e, "arje_cas::store falló (no-fatal)");
     }
 
     let text = String::from_utf8_lossy(&buf).to_string();
diff --git a/crates/modules/akasha/nous-real/src/main.rs b/crates/modules/chasqui/nous-real/src/main.rs
similarity index 89%
rename from crates/modules/akasha/nous-real/src/main.rs
rename to crates/modules/chasqui/nous-real/src/main.rs
index 0a4ea99..8a84f19 100644
--- a/crates/modules/akasha/nous-real/src/main.rs
+++ b/crates/modules/chasqui/nous-real/src/main.rs
@@ -1,21 +1,21 @@
-//! `akasha-nous-real` — proveedor Nous con LLM real (gated por feature).
+//! `chasqui-nous-real` — proveedor Nous con LLM real (gated por feature).
 //!
 //! ## Build modes
 //!
-//! - `cargo build -p akasha-nous-real`
+//! - `cargo build -p chasqui-nous-real`
 //!   Compila como **stub**: bin que arranca, sidecarea al brahman-init
 //!   pero rechaza toda request con un error explicando que falta la
 //!   feature. Útil para que `cargo build --workspace` no requiera ML
 //!   deps.
 //!
-//! - `cargo build -p akasha-nous-real --features embeddings`
+//! - `cargo build -p chasqui-nous-real --features embeddings`
 //!   Compila con `fastembed` + ONNX Runtime descargado por Cargo.
 //!   Modelo default: `all-MiniLM-L6-v2` (384-d, ~80 MB descargado al
 //!   primer run y cacheado en `~/.cache/fastembed`).
 //!
 //! ## Diseño
 //!
-//! Mismo contrato wire que `akasha-nous-mock` (`akasha-nous` crate). La
+//! Mismo contrato wire que `chasqui-nous-mock` (`chasqui-nous` crate). La
 //! diferencia operativa: real produce 384-d con semantic content
 //! (text-embedding del modelo); mock produce 32-d con metadata-hashing.
 //! No son intercambiables a media-deployment — los centroides de
@@ -36,7 +36,7 @@ use brahman_card::{
     ulid::Ulid, Card, CardKind, ContextBias, Flow, Flows, Lifecycle, Payload, Priority,
     Supervision, TypeRef,
 };
-use akasha_nous::{transport, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME};
+use chasqui_nous::{transport, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME};
 use tokio::net::UnixListener;
 use tracing::info;
 
@@ -63,11 +63,11 @@ async fn main() -> std::io::Result<()> {
 
     #[cfg(not(feature = "embeddings"))]
     info!(
-        "akasha-nous-real corriendo en modo STUB (compilá con \
+        "chasqui-nous-real corriendo en modo STUB (compilá con \
         --features embeddings para activar el modelo)"
     );
 
-    // 1. Resolver socket del data-plane (default `akasha-nous-real.sock`,
+    // 1. Resolver socket del data-plane (default `chasqui-nous-real.sock`,
     //    distinto del mock para coexistir).
     let sock_path = transport::provider_socket_path("real");
     if sock_path.exists() {
@@ -77,7 +77,7 @@ async fn main() -> std::io::Result<()> {
         std::fs::create_dir_all(parent)?;
     }
     let listener = UnixListener::bind(&sock_path)?;
-    info!(socket = %sock_path.display(), "akasha-nous-real escuchando");
+    info!(socket = %sock_path.display(), "chasqui-nous-real escuchando");
 
     // 2. Sidecar al brahman-init con Card declarando el socket.
     let card = build_card(sock_path.clone());
@@ -144,7 +144,7 @@ fn init_tracing() {
 }
 
 /// Card que real-nous anuncia. Idéntica al mock excepto por:
-/// - label distinto (`akasha.nous_real`) para que coexistan en el broker.
+/// - label distinto (`chasqui.nous_real`) para que coexistan en el broker.
 /// - `priority_contexts.prod = +1` (gana en contexto prod).
 /// - `service_socket` propio para que clientes lo descubran directo.
 fn build_card(service_socket: std::path::PathBuf) -> Card {
@@ -160,7 +160,7 @@ fn build_card(service_socket: std::path::PathBuf) -> Card {
     Card {
         schema_version: brahman_card::CARD_SCHEMA_VERSION,
         id: Ulid::new(),
-        label: "akasha.nous_real".into(),
+        label: "chasqui.nous_real".into(),
         payload: Payload::Virtual,
         supervision: Supervision::Delegate,
         lifecycle: Lifecycle::Daemon,
diff --git a/crates/modules/akasha/nous-real/src/stub.rs b/crates/modules/chasqui/nous-real/src/stub.rs
similarity index 84%
rename from crates/modules/akasha/nous-real/src/stub.rs
rename to crates/modules/chasqui/nous-real/src/stub.rs
index 8665960..78004aa 100644
--- a/crates/modules/akasha/nous-real/src/stub.rs
+++ b/crates/modules/chasqui/nous-real/src/stub.rs
@@ -1,7 +1,7 @@
 //! Modo stub: arranca el bin pero rechaza las requests con un error
 //! que explica que falta la feature `embeddings`.
 
-use akasha_nous::{EmbedRequest, ErrorResponse};
+use chasqui_nous::{EmbedRequest, ErrorResponse};
 use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
 use tokio::net::UnixStream;
 use tracing::warn;
@@ -21,8 +21,8 @@ pub async fn handle_conn(stream: UnixStream) -> std::io::Result<()> {
 
     let resp = ErrorResponse {
         error: format!(
-            "akasha-nous-real compilado sin la feature `embeddings`. \
-             Rebuild con: cargo build -p akasha-nous-real --features embeddings"
+            "chasqui-nous-real compilado sin la feature `embeddings`. \
+             Rebuild con: cargo build -p chasqui-nous-real --features embeddings"
         ),
     };
     let mut stream = reader.into_inner();
diff --git a/crates/modules/akasha/nous/Cargo.toml b/crates/modules/chasqui/nous/Cargo.toml
similarity index 95%
rename from crates/modules/akasha/nous/Cargo.toml
rename to crates/modules/chasqui/nous/Cargo.toml
index 29d0bf4..db8df3f 100644
--- a/crates/modules/akasha/nous/Cargo.toml
+++ b/crates/modules/chasqui/nous/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "akasha-nous"
+name = "chasqui-nous"
 version.workspace = true
 edition.workspace = true
 rust-version.workspace = true
diff --git a/crates/modules/akasha/nous/src/lib.rs b/crates/modules/chasqui/nous/src/lib.rs
similarity index 92%
rename from crates/modules/akasha/nous/src/lib.rs
rename to crates/modules/chasqui/nous/src/lib.rs
index 4a6b957..d85e37d 100644
--- a/crates/modules/akasha/nous/src/lib.rs
+++ b/crates/modules/chasqui/nous/src/lib.rs
@@ -1,6 +1,6 @@
-//! `akasha-nous` — el contrato del proveedor de embeddings.
+//! `chasqui-nous` — el contrato del proveedor de embeddings.
 //!
-//! Define el wire-format compartido entre `akasha-core` (consumidor) y
+//! Define el wire-format compartido entre `chasqui-core` (consumidor) y
 //! cualquier implementación de Nous (mock determinista o LLM real). El
 //! protocolo es **line-delimited JSON** sobre Unix socket: cada conexión
 //! envía una request, recibe una response, y cierra. Single-shot por
@@ -21,8 +21,8 @@
 //!
 //! ## Por qué un crate aparte
 //!
-//! El consumidor (akasha-core) y el proveedor (akasha-nous-mock,
-//! akasha-nous-real) deben acordar en types EXACTOS. Tener el contrato
+//! El consumidor (chasqui-core) y el proveedor (chasqui-nous-mock,
+//! chasqui-nous-real) deben acordar en types EXACTOS. Tener el contrato
 //! en su crate evita que cada lado declare structs paralelos que se
 //! desincronizan. Si bumpeás el wire, bumpeás aquí.
 //!
@@ -32,7 +32,7 @@
 //! el mismo `flow.output: { name: "embed-result", type: ... }` y
 //! `flow.input: "embed-request"`. El broker brahman los matchea contra
 //! los consumidores; el `priority_offset` per-contexto del Card hace que
-//! mock-nous gane en `test` y real-nous en `prod`. akasha-core sólo
+//! mock-nous gane en `test` y real-nous en `prod`. chasqui-core sólo
 //! consume el flow, sin saber cuál implementación corre.
 
 #![forbid(unsafe_code)]
@@ -118,7 +118,7 @@ pub mod transport {
     pub const SOCKET_ENV: &str = "NOUSER_NOUS_SOCKET";
 
     /// Nombre genérico del socket cuando hay un solo proveedor.
-    pub const SOCKET_NAME: &str = "akasha-nous.sock";
+    pub const SOCKET_NAME: &str = "chasqui-nous.sock";
 
     /// Ruta canónica al socket cuando un único proveedor está activo
     /// (consumidores que no quieren elegir).
@@ -136,7 +136,7 @@ pub mod transport {
         if let Ok(p) = std::env::var(SOCKET_ENV) {
             return PathBuf::from(p);
         }
-        runtime_base().join(format!("akasha-nous-{}.sock", provider))
+        runtime_base().join(format!("chasqui-nous-{}.sock", provider))
     }
 
     fn runtime_base() -> PathBuf {
diff --git a/crates/modules/fana/SDD.md b/crates/modules/fana/SDD.md
new file mode 100644
index 0000000..32f5d5d
--- /dev/null
+++ b/crates/modules/fana/SDD.md
@@ -0,0 +1,71 @@
+# modules/fana/ — Writer DAG editor (absorbe pluma)
+
+**Propósito.** Editor de escritura multidimensional: el documento es un
+DAG de átomos narrativos con ramas (timelines), tracking de coherencia,
+e indexación semántica. Absorbe el linaje markdown de `pluma`. Prioridad
+alta entre las apps.
+
+## Estado
+
+- **Existente (de pluma)**: `fana-md` (parser markdown, ex `pluma-md`),
+  `fana-md-reader-web` (lector DOM, ex `pluma-reader-web`, aún dep de
+  `gioser-web`).
+- **Planeado**: el resto de sub-crates (writer DAG editor completo).
+
+## Crates (objetivo)
+
+| crate                  | tipo | rol                                                  |
+| ---------------------- | ---- | ---------------------------------------------------- |
+| `fana-core`            | lib  | `NarrativeAtom` + `NarrativeGraph` + `CoherenceState`|
+| `fana-md`              | lib  | Parser markdown (ex pluma-md)                        |
+| `fana-graph`           | lib  | DAG ops + `propagate_mutation` topológico            |
+| `fana-semantic`        | lib  | Cliente `verbo` + scoring de intensidad adjetiva     |
+| `fana-store`           | lib  | Persistencia sled/RocksDB + bincode/rkyv zero-copy   |
+| `fana-llm`             | lib  | Cliente HTTP a LLMs remotos (evaluación + merge)     |
+| `fana-render-plan`     | lib  | DrawCommands agnósticos (editor + sidepane + ghost)  |
+| `fana-editor-gpui`     | lib  | WorkspaceEditor View + OscilloscopeSidepane + Ghost  |
+| `fana-md-reader-web`   | lib  | Lector markdown DOM (ex pluma-reader-web)            |
+| `fana-editor-web`      | lib  | (futuro) editor WASM                                 |
+
+## Modelo de datos
+
+```rust
+enum CoherenceState { Valid, InConflict { origin, reason }, PendingEvaluation }
+
+struct NarrativeAtom {
+    id: Uuid,
+    content_hash: [u8; 32],            // SHA-256 estricto
+    content: Arc<String>,              // texto compartido (zero-alloc al ramificar)
+    semantic_vectors: HashMap<String, f32>,  // concepto → intensidad
+    dependencies: Vec<Uuid>,           // nodos prerrequisito
+    branch_id: String,
+    coherence: CoherenceState,
+}
+
+struct NarrativeGraph {
+    nodes: HashMap<Uuid, NarrativeAtom>,
+    adjacency_list: HashMap<Uuid, Vec<Uuid>>,  // padre → hijos dependientes
+}
+```
+
+## Dependencias
+
+- `fana-semantic` ← `verbo` (embeddings, instancia modelo ligero ~384d).
+- `fana-md` puro (sin deps de host).
+- `fana-md-reader-web` + `fana-editor-web` ← `wasm-bindgen`, `web-sys`.
+- `fana-editor-gpui` ← `gpui`, `nahual`.
+- `gioser-web` sigue consumiendo `fana-md-reader-web`.
+
+## Invariantes
+
+- Toda mutación de texto valida contra el hash binario del contenido.
+- Branches comparten texto vía `Arc<String>` — clonar una rama es O(1).
+- `propagate_mutation` marca `PendingEvaluation` en cascada topológica
+  cuando un átomo origen cambia (shock-wave lógica).
+- Separabilidad UI estricta: `fana-core/md/graph/semantic/store/llm/
+  render-plan` agnósticos; `fana-editor-{gpui,web}` intercambiables.
+
+## Apps
+
+- `apps/fana` — binario GPUI (prioridad alta).
+- `apps/fana-web` — (futuro) cdylib WASM.
diff --git a/crates/modules/pluma/pluma-reader-web/Cargo.toml b/crates/modules/fana/fana-md-reader-web/Cargo.toml
similarity index 87%
rename from crates/modules/pluma/pluma-reader-web/Cargo.toml
rename to crates/modules/fana/fana-md-reader-web/Cargo.toml
index 47faec3..6d8de30 100644
--- a/crates/modules/pluma/pluma-reader-web/Cargo.toml
+++ b/crates/modules/fana/fana-md-reader-web/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "pluma-reader-web"
+name = "fana-md-reader-web"
 version.workspace = true
 edition.workspace = true
 license.workspace = true
@@ -7,7 +7,7 @@ authors.workspace = true
 publish.workspace = true
 
 [dependencies]
-pluma-md = { path = "../pluma-md" }
+fana-md = { path = "../fana-md" }
 wasm-bindgen.workspace = true
 wasm-bindgen-futures.workspace = true
 js-sys.workspace = true
diff --git a/crates/modules/pluma/pluma-reader-web/src/lib.rs b/crates/modules/fana/fana-md-reader-web/src/lib.rs
similarity index 98%
rename from crates/modules/pluma/pluma-reader-web/src/lib.rs
rename to crates/modules/fana/fana-md-reader-web/src/lib.rs
index 4b242ef..4aca214 100644
--- a/crates/modules/pluma/pluma-reader-web/src/lib.rs
+++ b/crates/modules/fana/fana-md-reader-web/src/lib.rs
@@ -53,7 +53,7 @@ impl Reader {
 
     /// Renderea un string markdown directamente, sin fetch.
     pub fn render_md(&self, md: &str, theme: &str) {
-        let html = pluma_md::to_themed_html(md, theme);
+        let html = fana_md::to_themed_html(md, theme);
         self.container.set_inner_html(&html);
     }
 
diff --git a/crates/modules/pluma/pluma-md/Cargo.toml b/crates/modules/fana/fana-md/Cargo.toml
similarity index 91%
rename from crates/modules/pluma/pluma-md/Cargo.toml
rename to crates/modules/fana/fana-md/Cargo.toml
index bde0357..515704f 100644
--- a/crates/modules/pluma/pluma-md/Cargo.toml
+++ b/crates/modules/fana/fana-md/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "pluma-md"
+name = "fana-md"
 version.workspace = true
 edition.workspace = true
 license.workspace = true
diff --git a/crates/modules/pluma/pluma-md/src/lib.rs b/crates/modules/fana/fana-md/src/lib.rs
similarity index 100%
rename from crates/modules/pluma/pluma-md/src/lib.rs
rename to crates/modules/fana/fana-md/src/lib.rs
diff --git a/crates/modules/nahual/widgets/app-header/src/lib.rs b/crates/modules/nahual/widgets/app-header/src/lib.rs
index eb94300..ee7b352 100644
--- a/crates/modules/nahual/widgets/app-header/src/lib.rs
+++ b/crates/modules/nahual/widgets/app-header/src/lib.rs
@@ -8,7 +8,7 @@
 //!   border-bottom = `theme.border`.
 //! - Padding 16/12, text_size 14.
 //!
-//! Patrón emergente: `nakui-explorer`, `akasha-explorer`,
+//! Patrón emergente: `nakui-explorer`, `chasqui-explorer`,
 //! `minga-explorer`, `brahman-broker-explorer` declaran headers
 //! idénticos sólo cambiando el label. Ahora es 1 línea.
 //!
diff --git a/crates/modules/pluma/SDD.md b/crates/modules/pluma/SDD.md
deleted file mode 100644
index 2702e74..0000000
--- a/crates/modules/pluma/SDD.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# modules/pluma/ — Markdown agnóstico + visor web
-
-**Propósito.** Parser de markdown que no asume host: produce un árbol
-de `Block`. El visor web fetch-ea un `.md` y lo inyecta como HTML,
-respetando `data-pluma-theme` del contenedor.
-
-## Crates
-
-| crate                | tipo | rol                                              |
-| -------------------- | ---- | ------------------------------------------------ |
-| `pluma-md`           | lib  | Wrapper sobre `pulldown-cmark` con AST simple    |
-| `pluma-reader-web`   | lib  | Reader DOM: fetch + inject HTML + theming        |
-
-## Dependencias
-
-- `pluma-md` ← `pulldown-cmark` (sin features de host).
-- `pluma-reader-web` ← `wasm-bindgen` + `web-sys` (HtmlElement, Response).
-- Consumido por: `apps/gioser-web` (renderea los 4 tips elementales
-  desde `md/agua.md`, `md/aire.md`, `md/fuego.md`, `md/tierra.md`).
-
-## Estado
-
-LOC 178. Funcional y pequeño. Sin tests (todavía). Pendiente: AST
-con todos los inline elements (links, emphasis) accesibles desde Rust.
diff --git a/crates/modules/vista/SDD.md b/crates/modules/revista/SDD.md
similarity index 63%
rename from crates/modules/vista/SDD.md
rename to crates/modules/revista/SDD.md
index d9cffe7..2f570fb 100644
--- a/crates/modules/vista/SDD.md
+++ b/crates/modules/revista/SDD.md
@@ -1,4 +1,4 @@
-# modules/vista/ — Deck horizontal swipe (PageView)
+# modules/revista/ — Deck horizontal swipe (PageView)
 
 **Propósito.** Carousel/PageView estilo Flutter: gesto horizontal con
 snap a página, distinción horizontal vs vertical, soporte mouse +
@@ -8,15 +8,15 @@ touch + pointer events. Lógica separada del binding DOM.
 
 | crate         | tipo | rol                                                       |
 | ------------- | ---- | --------------------------------------------------------- |
-| `vista-core`  | lib  | `DeckState` agnóstico: pointer_down/move/end → outcomes   |
-| `vista-web`   | lib  | Binding DOM sobre `<strip>`: traduce eventos + aplica CSS |
+| `revista-core`  | lib  | `DeckState` agnóstico: pointer_down/move/end → outcomes   |
+| `revista-web`   | lib  | Binding DOM sobre `<strip>`: traduce eventos + aplica CSS |
 
 ## Dependencias
 
-- `vista-core`: sin deps externas. Pura state machine.
-- `vista-web` ← `vista-core`, `wasm-bindgen`, `web-sys` (PointerEvent).
+- `revista-core`: sin deps externas. Pura state machine.
+- `revista-web` ← `revista-core`, `wasm-bindgen`, `web-sys` (PointerEvent).
 
-## API agnóstica (vista-core)
+## API agnóstica (revista-core)
 
 ```rust
 let mut deck = DeckState::new();
@@ -35,6 +35,6 @@ if let Some(r) = deck.pointer_end(offset, width, n_pages) {
 
 ## Estado
 
-vista-core: 5 tests verdes (drag decision + snap + clamp + goto).
-vista-web: binding DOM intacto, ahora delega toda la lógica a core.
+revista-core: 5 tests verdes (drag decision + snap + clamp + goto).
+revista-web: binding DOM intacto, ahora delega toda la lógica a core.
 LOC core 177 + web ~355. Reutilizable en backends no-web.
diff --git a/crates/modules/vista/vista-core/Cargo.toml b/crates/modules/revista/revista-core/Cargo.toml
similarity index 91%
rename from crates/modules/vista/vista-core/Cargo.toml
rename to crates/modules/revista/revista-core/Cargo.toml
index 7024e70..b041cd7 100644
--- a/crates/modules/vista/vista-core/Cargo.toml
+++ b/crates/modules/revista/revista-core/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "vista-core"
+name = "revista-core"
 description = "Vista — máquina de estados agnóstica para deck horizontal con snap. Sin dependencias web/DOM."
 version.workspace = true
 edition.workspace = true
diff --git a/crates/modules/vista/vista-core/src/lib.rs b/crates/modules/revista/revista-core/src/lib.rs
similarity index 100%
rename from crates/modules/vista/vista-core/src/lib.rs
rename to crates/modules/revista/revista-core/src/lib.rs
diff --git a/crates/modules/vista/vista-web/Cargo.toml b/crates/modules/revista/revista-web/Cargo.toml
similarity index 87%
rename from crates/modules/vista/vista-web/Cargo.toml
rename to crates/modules/revista/revista-web/Cargo.toml
index 046e05a..d93603a 100644
--- a/crates/modules/vista/vista-web/Cargo.toml
+++ b/crates/modules/revista/revista-web/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "vista-web"
+name = "revista-web"
 version.workspace = true
 edition.workspace = true
 license.workspace = true
@@ -7,7 +7,7 @@ authors.workspace = true
 publish.workspace = true
 
 [dependencies]
-vista-core = { path = "../vista-core" }
+revista-core = { path = "../revista-core" }
 wasm-bindgen.workspace = true
 js-sys.workspace = true
 
diff --git a/crates/modules/vista/vista-web/src/lib.rs b/crates/modules/revista/revista-web/src/lib.rs
similarity index 99%
rename from crates/modules/vista/vista-web/src/lib.rs
rename to crates/modules/revista/revista-web/src/lib.rs
index 6e85707..738616d 100644
--- a/crates/modules/vista/vista-web/src/lib.rs
+++ b/crates/modules/revista/revista-web/src/lib.rs
@@ -20,7 +20,7 @@
 use std::cell::RefCell;
 use std::rc::Rc;
 
-use vista_core::{DeckState, DragOutcome};
+use revista_core::{DeckState, DragOutcome};
 use wasm_bindgen::prelude::*;
 use wasm_bindgen::JsCast;
 use web_sys::{Event, HtmlElement, PointerEvent};
diff --git a/crates/modules/shuma/shuma-core/Cargo.toml b/crates/modules/shuma/shuma-core/Cargo.toml
index a9b628a..346d645 100644
--- a/crates/modules/shuma/shuma-core/Cargo.toml
+++ b/crates/modules/shuma/shuma-core/Cargo.toml
@@ -6,13 +6,13 @@ rust-version.workspace = true
 license.workspace = true
 authors.workspace = true
 publish.workspace = true
-description = "Runtime de shipote: WorkspaceManager sobre ente-incarnate. Estado in-memory, lifecycle, reaping."
+description = "Runtime de shuma: WorkspaceManager sobre arje-incarnate. Estado in-memory, lifecycle, reaping."
 
 [dependencies]
 shuma-card = { path = "../shuma-card" }
 shuma-discern = { path = "../shuma-discern" }
 brahman-card = { path = "../../../protocol/brahman-card" }
-ente-incarnate = { path = "../../../init/ente-incarnate" }
+arje-incarnate = { path = "../../../init/arje-incarnate" }
 nix = { workspace = true }
 libc = { workspace = true }
 anyhow = { workspace = true }
diff --git a/crates/modules/shuma/shuma-core/src/lib.rs b/crates/modules/shuma/shuma-core/src/lib.rs
index 4bc2423..5ae41c2 100644
--- a/crates/modules/shuma/shuma-core/src/lib.rs
+++ b/crates/modules/shuma/shuma-core/src/lib.rs
@@ -18,7 +18,7 @@ pub mod pipeline;
 pub mod stats;
 
 use brahman_card::{Card, Payload, Supervision};
-use ente_incarnate::{Incarnator, IncarnatorConfig};
+use arje_incarnate::{Incarnator, IncarnatorConfig};
 use nix::sys::signal::{kill, Signal};
 use nix::sys::wait::{waitpid, WaitPidFlag, WaitStatus};
 use nix::unistd::Pid;
@@ -38,7 +38,7 @@ pub enum CoreError {
     #[error("compile: {0}")]
     Compile(#[from] shuma_card::CompileError),
     #[error("incarnate: {0}")]
-    Incarnate(#[from] ente_incarnate::IncarnateError),
+    Incarnate(#[from] arje_incarnate::IncarnateError),
 }
 
 #[derive(Debug)]
@@ -682,9 +682,9 @@ impl WorkspaceManager {
         // hace OOM kill al exceder memory.max — enforcement automático
         // sin policy adicional. Falla silenciosa si no hay delegation.
         if !spec.soma.cgroup.path.is_empty() {
-            if let Ok(abs) = ente_incarnate::cgroup::ensure_cgroup(&spec.soma.cgroup) {
+            if let Ok(abs) = arje_incarnate::cgroup::ensure_cgroup(&spec.soma.cgroup) {
                 let applied =
-                    ente_incarnate::cgroup::apply_rlimits_to_cgroup(&abs, &spec.soma.rlimits);
+                    arje_incarnate::cgroup::apply_rlimits_to_cgroup(&abs, &spec.soma.rlimits);
                 if !applied.is_empty() {
                     warnings.push(format!("cgroup limits applied: {}", applied.join(", ")));
                 }
@@ -842,11 +842,11 @@ impl WorkspaceManager {
         use std::os::fd::IntoRawFd;
         let (sout_r, sout_w) =
             nix::unistd::pipe2(nix::fcntl::OFlag::O_CLOEXEC).map_err(|e| {
-                CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e))
+                CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e))
             })?;
         let (serr_r, serr_w) =
             nix::unistd::pipe2(nix::fcntl::OFlag::O_CLOEXEC).map_err(|e| {
-                CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e))
+                CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e))
             })?;
         let sout_r_fd = sout_r.into_raw_fd();
         let sout_w_fd = sout_w.into_raw_fd();
@@ -856,7 +856,7 @@ impl WorkspaceManager {
         let stdout_buf = logbuf::LogBuf::new();
         let stderr_buf = logbuf::LogBuf::new();
 
-        let stdio = ente_incarnate::ChildStdio {
+        let stdio = arje_incarnate::ChildStdio {
             stdin_fd: None,
             stdout_fd: Some(sout_w_fd),
             stderr_fd: Some(serr_w_fd),
diff --git a/crates/modules/shuma/shuma-core/src/persist.rs b/crates/modules/shuma/shuma-core/src/persist.rs
index c958028..e9ab8a7 100644
--- a/crates/modules/shuma/shuma-core/src/persist.rs
+++ b/crates/modules/shuma/shuma-core/src/persist.rs
@@ -282,7 +282,7 @@ pub struct RestoreOutcome {
 mod tests {
     use super::*;
     use crate::WorkspaceManager;
-    use ente_incarnate::IncarnatorConfig;
+    use arje_incarnate::IncarnatorConfig;
     use shuma_card::{ExitPolicy, WorkspaceSpec};
     use std::sync::Arc;
 
diff --git a/crates/modules/shuma/shuma-core/src/pipeline.rs b/crates/modules/shuma/shuma-core/src/pipeline.rs
index 68a7b55..804adee 100644
--- a/crates/modules/shuma/shuma-core/src/pipeline.rs
+++ b/crates/modules/shuma/shuma-core/src/pipeline.rs
@@ -1,7 +1,7 @@
 //! Pipeline runtime: encadena nodos con pipes y opcionalmente intercepta
 //! cada flow para discernir su contenido.
 //!
-//! Cada nodo se encarna via [`ente_incarnate::Incarnator`] — eso significa
+//! Cada nodo se encarna via [`arje_incarnate::Incarnator`] — eso significa
 //! que **cada comando puede tener su propio SomaSpec** (namespaces, cgroup,
 //! rlimits) heredado del workspace. La conexión stdin↔stdout se hace con
 //! `pipe2(2)` + `ChildStdio` declarativo: el callback de clone(2) hace los
@@ -9,7 +9,7 @@
 
 use crate::CoreError;
 use brahman_card::Payload;
-use ente_incarnate::{ChildStdio, Incarnator};
+use arje_incarnate::{ChildStdio, Incarnator};
 use nix::fcntl::OFlag;
 use nix::unistd::pipe2;
 use shuma_card::PipelineSpec;
@@ -87,7 +87,7 @@ pub async fn run_pipeline(
     let mut edge_w: Vec<RawFd> = vec![-1; spec.edges.len()];
     for i in 0..spec.edges.len() {
         let (r, w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| {
-            CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e))
+            CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e))
         })?;
         edge_r[i] = r.into_raw_fd();
         edge_w[i] = w.into_raw_fd();
@@ -110,7 +110,7 @@ pub async fn run_pipeline(
         }
         // Splitter: pipe propio para el productor → splitter lee y replica a edge_w[*].
         let (prod_r, prod_w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| {
-            CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e))
+            CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e))
         })?;
         producer_stdout_fd[i] = Some(prod_w.into_raw_fd());
         let prod_r_fd = prod_r.into_raw_fd();
@@ -147,7 +147,7 @@ pub async fn run_pipeline(
                 // Merger: lee de N edge_r y escribe a un nuevo pipe cuyo
                 // read end es el stdin del consumer.
                 let (cons_r, cons_w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| {
-                    CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e))
+                    CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e))
                 })?;
                 consumer_stdin_fd[j] = Some(cons_r.into_raw_fd());
                 let inputs: Vec<RawFd> = predecessors[j]
@@ -169,7 +169,7 @@ pub async fn run_pipeline(
             Payload::Native { .. } | Payload::Legacy { .. } => {}
             _ => {
                 return Err(CoreError::Incarnate(
-                    ente_incarnate::IncarnateError::NonExecutablePayload,
+                    arje_incarnate::IncarnateError::NonExecutablePayload,
                 ))
             }
         }
@@ -638,7 +638,7 @@ fn _keep_raw(_: &dyn AsRawFd) {}
 mod tests {
     use super::*;
     use brahman_card::Payload;
-    use ente_incarnate::IncarnatorConfig;
+    use arje_incarnate::IncarnatorConfig;
     use shuma_card::{CommandRef, DiscernPolicy, FlowEdge, PipelineSpec, WorkspaceId};
 
     fn cmd(label: &str, exec: &str, argv: &[&str]) -> CommandRef {
diff --git a/crates/modules/shuma/shuma-discern/src/lib.rs b/crates/modules/shuma/shuma-discern/src/lib.rs
index 6b2d3a7..e156fa9 100644
--- a/crates/modules/shuma/shuma-discern/src/lib.rs
+++ b/crates/modules/shuma/shuma-discern/src/lib.rs
@@ -2,7 +2,7 @@
 //!
 //! Trait + pipeline + discerners default. Devuelve un [`Discernment`] con
 //! `TypeRef` consistente con el broker, confidence, MIME y un `lens` hint
-//! para UIs (reusa el espíritu del `dominant_lens` de akasha).
+//! para UIs (reusa el espíritu del `dominant_lens` de chasqui).
 
 #![forbid(unsafe_code)]
 
diff --git a/crates/protocol/SDD.md b/crates/protocol/SDD.md
index c532e72..d1282f4 100644
--- a/crates/protocol/SDD.md
+++ b/crates/protocol/SDD.md
@@ -16,7 +16,7 @@ flows por tipo, y wire types de red. No corre lógica de dominio.
 | `brahman-admin`        | lib  | Socket admin separado: snapshots de sesiones+matches     |
 | `brahman-sidecar`      | lib  | `spawn(card)` para que apps se presenten al Init         |
 | `brahman-net`          | lib  | Malla libp2p opcional (TCP+noise+yamux+kad)              |
-| `ente-card`            | lib  | Alias legacy — re-export de `brahman-card`               |
+| `arje-card`            | lib  | Alias legacy — re-export de `brahman-card`               |
 
 ## Struct `Card` (anatomía completa)
 
diff --git a/crates/protocol/ente-card/Cargo.toml b/crates/protocol/arje-card/Cargo.toml
similarity index 93%
rename from crates/protocol/ente-card/Cargo.toml
rename to crates/protocol/arje-card/Cargo.toml
index b4dcdfc..ff00485 100644
--- a/crates/protocol/ente-card/Cargo.toml
+++ b/crates/protocol/arje-card/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "ente-card"
+name = "arje-card"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
diff --git a/crates/protocol/ente-card/src/lib.rs b/crates/protocol/arje-card/src/lib.rs
similarity index 100%
rename from crates/protocol/ente-card/src/lib.rs
rename to crates/protocol/arje-card/src/lib.rs
diff --git a/crates/protocol/brahman-card/src/lib.rs b/crates/protocol/brahman-card/src/lib.rs
index 0cda3b0..d9f5167 100644
--- a/crates/protocol/brahman-card/src/lib.rs
+++ b/crates/protocol/brahman-card/src/lib.rs
@@ -1187,7 +1187,7 @@ mod tests {
 
     #[test]
     fn wirecard_postcard_with_priority_contexts() {
-        // Repro del bug que rompía akasha-nous-mock: ContextBias con
+        // Repro del bug que rompía chasqui-nous-mock: ContextBias con
         // skip_serializing_if causaba que postcard leyera bytes
         // equivocados. Sin esos atributos, el roundtrip es estable.
         let src = r#"{
@@ -1266,8 +1266,8 @@ mod tests {
 
     #[test]
     fn new_assigns_real_ulid_and_label() {
-        let c = Card::new("akasha.engine");
-        assert_eq!(c.label, "akasha.engine");
+        let c = Card::new("chasqui.engine");
+        assert_eq!(c.label, "chasqui.engine");
         assert_ne!(c.id, Ulid::nil(), "Card::new no debe dejar id en nil");
     }
 
diff --git a/crates/protocol/brahman-cards/Cargo.toml b/crates/protocol/brahman-cards/Cargo.toml
index 6e15a05..9e955d5 100644
--- a/crates/protocol/brahman-cards/Cargo.toml
+++ b/crates/protocol/brahman-cards/Cargo.toml
@@ -14,7 +14,7 @@ serde_json = { workspace = true }
 thiserror = { workspace = true }
 ulid = { workspace = true }
 brahman-card = { path = "../brahman-card" }
-akasha-card = { path = "../../modules/akasha/card" }
+chasqui-card = { path = "../../modules/chasqui/card" }
 nahual-meta-schema = { path = "../../modules/nahual/libs/meta-schema" }
 nickel-lang = "2.0.0"
 
diff --git a/crates/protocol/brahman-cards/src/lib.rs b/crates/protocol/brahman-cards/src/lib.rs
index d6b5a6e..3649bb8 100644
--- a/crates/protocol/brahman-cards/src/lib.rs
+++ b/crates/protocol/brahman-cards/src/lib.rs
@@ -12,7 +12,7 @@
 //! ```text
 //! ┌─────────────┐  ┌──────────────┐  ┌─────────────┐
 //! │ Ente JSON   │  │ Monad JSON   │  │ UiModule    │ … futuro
-//! │ (brahman-   │  │ (akasha-     │  │ (nakui-ui-  │
+//! │ (brahman-   │  │ (chasqui-     │  │ (nakui-ui-  │
 //! │  card)      │  │  card)       │  │  schema)    │
 //! └─────┬───────┘  └──────┬───────┘  └──────┬──────┘
 //!       │                 │                 │
@@ -48,7 +48,7 @@ use serde_json::Value;
 use thiserror::Error;
 
 pub use brahman_card::Card as EnteCard;
-pub use akasha_card::MonadManifest;
+pub use chasqui_card::MonadManifest;
 pub use nahual_meta_schema::Module as UiModuleSpec;
 
 /// Estructura canónica única que consumen los downstream del sistema
diff --git a/crates/protocol/brahman-cards/src/readers.rs b/crates/protocol/brahman-cards/src/readers.rs
index 700fec8..78f23de 100644
--- a/crates/protocol/brahman-cards/src/readers.rs
+++ b/crates/protocol/brahman-cards/src/readers.rs
@@ -69,10 +69,10 @@ impl CardReader for EnteJsonReader {
 }
 
 // ============================================================================
-// Monad (akasha-card)
+// Monad (chasqui-card)
 // ============================================================================
 
-/// Reader para el shape JSON de [`akasha_card::MonadManifest`].
+/// Reader para el shape JSON de [`chasqui_card::MonadManifest`].
 ///
 /// Heurística: tiene `members` (BTreeSet<FileId>) Y `cardinality`
 /// (u32). La combinación es exclusiva del MonadManifest.
diff --git a/crates/protocol/brahman-handshake/tests/network_discovery.rs b/crates/protocol/brahman-handshake/tests/network_discovery.rs
index 259d1db..a84bac7 100644
--- a/crates/protocol/brahman-handshake/tests/network_discovery.rs
+++ b/crates/protocol/brahman-handshake/tests/network_discovery.rs
@@ -21,7 +21,7 @@
 //!   vía la conexión directa establecida en step 2 y obtiene el record
 //!   del store local de A.
 //! - El test usa flow `monad-list:json` por familiaridad (es el flow
-//!   real que `akasha daemon` declara). Sirve también como prueba de
+//!   real que `chasqui daemon` declara). Sirve también como prueba de
 //!   que el sistema completo (daemon + DHT) funcionaría con cero
 //!   cambios en la Card.
 
diff --git a/crates/protocol/brahman-sidecar/src/discovery.rs b/crates/protocol/brahman-sidecar/src/discovery.rs
index b106fac..02f2949 100644
--- a/crates/protocol/brahman-sidecar/src/discovery.rs
+++ b/crates/protocol/brahman-sidecar/src/discovery.rs
@@ -3,7 +3,7 @@
 //! sockets ni reimplementar el patrón a mano.
 //!
 //! Es la generalización de `discover_producer_socket` del CLI
-//! `akasha attract --remote`: declarás el `TypeRef` que querés
+//! `chasqui attract --remote`: declarás el `TypeRef` que querés
 //! consumir y el broker te empuja un `MatchEvent::Available` con el
 //! `producer_service_socket` del primer proveedor matched.
 //!
@@ -263,8 +263,8 @@ mod tests {
 
     #[test]
     fn builder_sets_input_flow_with_primitive_type() {
-        let c = build_consumer_card("akasha.cli", "embed-result", "json");
-        assert_eq!(c.label, "akasha.cli");
+        let c = build_consumer_card("chasqui.cli", "embed-result", "json");
+        assert_eq!(c.label, "chasqui.cli");
         assert_eq!(c.kind, CardKind::Ente);
         assert!(matches!(c.lifecycle, Lifecycle::Oneshot));
         assert!(matches!(c.supervision, Supervision::OneShot));
diff --git a/crates/protocol/brahman-sidecar/src/lib.rs b/crates/protocol/brahman-sidecar/src/lib.rs
index c10dc45..d9a49cb 100644
--- a/crates/protocol/brahman-sidecar/src/lib.rs
+++ b/crates/protocol/brahman-sidecar/src/lib.rs
@@ -95,7 +95,7 @@ pub fn spawn_with_handle(config: SidecarConfig) -> std::io::Result<JoinHandle<()
 /// Pool consolidado: un único thread con un runtime tokio
 /// `current_thread` que hostea N tasks de sidecar simultáneas.
 ///
-/// Para módulos con muchas sesiones (p. ej. `akasha daemon` publicando
+/// Para módulos con muchas sesiones (p. ej. `chasqui daemon` publicando
 /// 50+ Mónadas), evita el costo de tener un thread+runtime por cada
 /// sesión.
 ///
@@ -111,7 +111,7 @@ pub struct SidecarPool {
     handle: tokio::runtime::Handle,
     /// Sesiones vivas indexadas por `Card.id`. Permite que un nuevo
     /// `spawn` con el mismo id aborte la sesión previa — útil cuando
-    /// un módulo (p. ej. `akasha daemon`) re-publica una Mónada cuya
+    /// un módulo (p. ej. `chasqui daemon`) re-publica una Mónada cuya
     /// composición cambió.
     sessions: Arc<Mutex<HashMap<Ulid, AbortHandle>>>,
     _thread: JoinHandle<()>,
diff --git a/crates/runtime/SDD.md b/crates/runtime/SDD.md
index d16d78e..1ac0f0a 100644
--- a/crates/runtime/SDD.md
+++ b/crates/runtime/SDD.md
@@ -8,18 +8,18 @@ rule engine + audit log, y un ente de smoke test.
 
 | crate         | tipo | rol                                                         |
 | ------------- | ---- | ----------------------------------------------------------- |
-| `ente-bus`    | lib  | Unix SOCK_STREAM + postcard framing. Announce/Invoke/List   |
-| `ente-cas`    | lib  | Content-addressed storage SHA-256: blobs Wasm + audit log   |
-| `ente-wasm`   | lib  | Encarna `Payload::Wasm` vía `wasmi` en thread dedicado      |
-| `ente-brain`  | lib  | Rule engine + observer estadístico + audit chain con CAS    |
-| `ente-echo`   | bin  | Ente prueba — provee `Capability::Endpoint(echo)`           |
+| `arje-bus`    | lib  | Unix SOCK_STREAM + postcard framing. Announce/Invoke/List   |
+| `arje-cas`    | lib  | Content-addressed storage SHA-256: blobs Wasm + audit log   |
+| `arje-wasm`   | lib  | Encarna `Payload::Wasm` vía `wasmi` en thread dedicado      |
+| `arje-brain`  | lib  | Rule engine + observer estadístico + audit chain con CAS    |
+| `arje-echo`   | bin  | Ente prueba — provee `Capability::Endpoint(echo)`           |
 
 ## Dependencias
 
-- `ente-bus` ← `tokio` + `postcard`. Consumido por `init/ente-zero`.
-- `ente-cas` ← `sha2` + `sled`. Consumido por `ente-brain` (audit log)
-  y `ente-wasm` (blobs).
-- `ente-brain` ← `ente-bus`, `ente-cas`. Consumido por Init para
+- `arje-bus` ← `tokio` + `postcard`. Consumido por `init/arje-zero`.
+- `arje-cas` ← `sha2` + `sled`. Consumido por `arje-brain` (audit log)
+  y `arje-wasm` (blobs).
+- `arje-brain` ← `arje-bus`, `arje-cas`. Consumido por Init para
   observabilidad estadística + reglas declarativas.
 
 ## Invariantes
diff --git a/crates/runtime/ente-brain/Cargo.toml b/crates/runtime/arje-brain/Cargo.toml
similarity index 81%
rename from crates/runtime/ente-brain/Cargo.toml
rename to crates/runtime/arje-brain/Cargo.toml
index 5a0196f..a7a6a6e 100644
--- a/crates/runtime/ente-brain/Cargo.toml
+++ b/crates/runtime/arje-brain/Cargo.toml
@@ -1,13 +1,13 @@
 [package]
-name = "ente-brain"
+name = "arje-brain"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-cas = { path = "../ente-cas" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-cas = { path = "../arje-cas" }
 serde = { workspace = true }
 serde_json = { workspace = true }
 ulid = { workspace = true }
diff --git a/crates/runtime/ente-brain/examples/brainctl.rs b/crates/runtime/arje-brain/examples/brainctl.rs
similarity index 98%
rename from crates/runtime/ente-brain/examples/brainctl.rs
rename to crates/runtime/arje-brain/examples/brainctl.rs
index 5b051b1..8b9ab9a 100644
--- a/crates/runtime/ente-brain/examples/brainctl.rs
+++ b/crates/runtime/arje-brain/examples/brainctl.rs
@@ -9,7 +9,7 @@
 //!
 //! Path del socket: $ENTE_BRAIN_SOCK o $XDG_RUNTIME_DIR/ente-brain.sock
 
-use ente_brain::introspect::{call, IntrospectRequest, IntrospectResponse};
+use arje_brain::introspect::{call, IntrospectRequest, IntrospectResponse};
 use std::path::{Path, PathBuf};
 use tokio::io::{AsyncReadExt, AsyncWriteExt};
 use tokio::net::UnixStream;
@@ -164,10 +164,10 @@ fn print_response(r: &IntrospectResponse) {
             println!("{} cristales pattern detectados:", ps.len());
             for p in ps {
                 match p {
-                    ente_brain::crystallize::PatternCrystal::Burst { kind, count, frequency_per_sec } => {
+                    arje_brain::crystallize::PatternCrystal::Burst { kind, count, frequency_per_sec } => {
                         println!("  burst: {kind:?}  count={count}  freq={frequency_per_sec:.2} Hz");
                     }
-                    ente_brain::crystallize::PatternCrystal::Silence { kind, last_count, since_secs } => {
+                    arje_brain::crystallize::PatternCrystal::Silence { kind, last_count, since_secs } => {
                         println!("  silence: {kind:?}  last_count={last_count}  ausente={since_secs:.1}s");
                     }
                 }
diff --git a/crates/runtime/ente-brain/src/audit.rs b/crates/runtime/arje-brain/src/audit.rs
similarity index 97%
rename from crates/runtime/ente-brain/src/audit.rs
rename to crates/runtime/arje-brain/src/audit.rs
index a95e80f..24a8ec0 100644
--- a/crates/runtime/ente-brain/src/audit.rs
+++ b/crates/runtime/arje-brain/src/audit.rs
@@ -125,7 +125,7 @@ impl AuditLog {
     /// snapshots externos — el log en memoria sigue intacto.
     pub fn persist_to_cas(entry: &AuditEntry) -> anyhow::Result<[u8; 32]> {
         let bytes = serde_json::to_vec(entry)?;
-        let sha = ente_cas::store(&bytes)?;
+        let sha = arje_cas::store(&bytes)?;
         Ok(sha)
     }
 
@@ -142,7 +142,7 @@ impl AuditLog {
         for entry in &self.entries {
             if entry.seq < self.flushed_count { continue; }
             let bytes = canonical_bytes(entry);
-            let sha = ente_cas::store(&bytes)?;
+            let sha = arje_cas::store(&bytes)?;
             debug_assert_eq!(sha, entry.sha,
                 "CAS sha != entry.sha — fórmula canónica rota");
             last_sha = Some(sha);
@@ -230,7 +230,7 @@ pub fn verify_chain_from_cas(start_sha: [u8; 32]) -> VerificationReport {
     let mut last_seen: Option<AuditEntry> = None;
 
     while let Some(sha) = current {
-        let path = ente_cas::cas_root().join(ente_cas::hex(&sha));
+        let path = arje_cas::cas_root().join(arje_cas::hex(&sha));
         let bytes = match std::fs::read(&path) {
             Ok(b) => b,
             Err(e) => return VerificationReport {
@@ -241,14 +241,14 @@ pub fn verify_chain_from_cas(start_sha: [u8; 32]) -> VerificationReport {
             },
         };
         // Verificación 1: el blob hashea a la SHA esperada (CAS contract).
-        let actual = ente_cas::sha256_of(&bytes);
+        let actual = arje_cas::sha256_of(&bytes);
         if actual != sha {
             return VerificationReport {
                 verified,
                 broken_at_seq: last_seen.as_ref().map(|e| e.seq),
                 error: Some(format!(
                     "CAS tamper en {}: expected {} got {}",
-                    path.display(), ente_cas::hex(&sha), ente_cas::hex(&actual)
+                    path.display(), arje_cas::hex(&sha), arje_cas::hex(&actual)
                 )),
                 genesis_sha: None,
             };
@@ -288,7 +288,7 @@ pub fn reachable_from_head(start_sha: [u8; 32]) -> std::collections::HashSet<[u8
     let mut current = Some(start_sha);
     while let Some(sha) = current {
         if !set.insert(sha) { break; } // ciclo (no debería pasar) — corta
-        let path = ente_cas::cas_root().join(ente_cas::hex(&sha));
+        let path = arje_cas::cas_root().join(arje_cas::hex(&sha));
         let bytes = match std::fs::read(&path) { Ok(b) => b, Err(_) => break };
         let entry: AuditEntry = match serde_json::from_slice(&bytes) {
             Ok(e) => e, Err(_) => break,
@@ -305,7 +305,7 @@ pub fn collect_chain_from_cas(start_sha: [u8; 32]) -> anyhow::Result<Vec<AuditEn
     let mut entries = Vec::new();
     let mut current = Some(start_sha);
     while let Some(sha) = current {
-        let path = ente_cas::cas_root().join(ente_cas::hex(&sha));
+        let path = arje_cas::cas_root().join(arje_cas::hex(&sha));
         let bytes = std::fs::read(&path)?;
         let mut entry: AuditEntry = serde_json::from_slice(&bytes)?;
         entry.sha = sha;
@@ -370,11 +370,11 @@ fn now_ms() -> u64 {
 }
 
 /// SHA256 sobre el entry en forma canónica (sha=[0;32]). Hash y CAS storage
-/// ven los mismos bytes, así que `ente_cas::store(canonical)` devuelve el
+/// ven los mismos bytes, así que `arje_cas::store(canonical)` devuelve el
 /// mismo SHA que `compute_sha(entry)`.
 fn compute_sha(entry: &AuditEntry) -> [u8; 32] {
     let bytes = canonical_bytes(entry);
-    ente_cas::sha256_of(&bytes)
+    arje_cas::sha256_of(&bytes)
 }
 
 /// Forma canónica: el entry serializado JSON con `sha = [0; 32]`.
diff --git a/crates/runtime/ente-brain/src/autopromote.rs b/crates/runtime/arje-brain/src/autopromote.rs
similarity index 100%
rename from crates/runtime/ente-brain/src/autopromote.rs
rename to crates/runtime/arje-brain/src/autopromote.rs
diff --git a/crates/runtime/ente-brain/src/crystallize.rs b/crates/runtime/arje-brain/src/crystallize.rs
similarity index 100%
rename from crates/runtime/ente-brain/src/crystallize.rs
rename to crates/runtime/arje-brain/src/crystallize.rs
diff --git a/crates/runtime/ente-brain/src/dispatch.rs b/crates/runtime/arje-brain/src/dispatch.rs
similarity index 96%
rename from crates/runtime/ente-brain/src/dispatch.rs
rename to crates/runtime/arje-brain/src/dispatch.rs
index f864300..55db72e 100644
--- a/crates/runtime/ente-brain/src/dispatch.rs
+++ b/crates/runtime/arje-brain/src/dispatch.rs
@@ -14,7 +14,7 @@ pub trait ActionSink: Send + Sync {
     /// Spawn una Card decodificada. Implementación: GraphEvent::SpawnRequest.
     fn spawn(&self, card_blob: &str);
     /// Invoke por bus. blob crudo; el sink lo enruta vía bus_mediator.
-    fn invoke(&self, target_cap: ente_card::Capability, blob: Vec<u8>);
+    fn invoke(&self, target_cap: arje_card::Capability, blob: Vec<u8>);
     /// Notifica a un Ente específico (target_id). Implementación: forward por bus.
     fn notify(&self, target_id: ulid::Ulid, message: &str);
     /// Inhibe un comportamiento (placeholder; semántica depende del sink).
@@ -28,7 +28,7 @@ impl ActionSink for NullSink {
     fn spawn(&self, card_blob: &str) {
         info!(blob_len = card_blob.len(), "NullSink::spawn (no-op)");
     }
-    fn invoke(&self, target_cap: ente_card::Capability, blob: Vec<u8>) {
+    fn invoke(&self, target_cap: arje_card::Capability, blob: Vec<u8>) {
         info!(?target_cap, blob_len = blob.len(), "NullSink::invoke (no-op)");
     }
     fn notify(&self, target_id: ulid::Ulid, message: &str) {
diff --git a/crates/runtime/ente-brain/src/engine.rs b/crates/runtime/arje-brain/src/engine.rs
similarity index 99%
rename from crates/runtime/ente-brain/src/engine.rs
rename to crates/runtime/arje-brain/src/engine.rs
index e70ca0f..c9363ca 100644
--- a/crates/runtime/ente-brain/src/engine.rs
+++ b/crates/runtime/arje-brain/src/engine.rs
@@ -7,7 +7,7 @@
 
 use crate::observer::TimedEvent;
 use crate::rules::{EventKind, EventPattern, Rule, Scope};
-use ente_card::Capability;
+use arje_card::Capability;
 use std::collections::HashMap;
 use std::sync::Arc;
 use std::time::Duration;
diff --git a/crates/runtime/ente-brain/src/introspect.rs b/crates/runtime/arje-brain/src/introspect.rs
similarity index 99%
rename from crates/runtime/ente-brain/src/introspect.rs
rename to crates/runtime/arje-brain/src/introspect.rs
index 77972d0..8e4961e 100644
--- a/crates/runtime/ente-brain/src/introspect.rs
+++ b/crates/runtime/arje-brain/src/introspect.rs
@@ -396,7 +396,7 @@ impl IntrospectServer {
                     reachable.extend(crate::audit::reachable_from_head(head));
                 }
                 reachable.extend(extra_roots);
-                match ente_cas::gc(&reachable) {
+                match arje_cas::gc(&reachable) {
                     Ok((deleted, freed_bytes)) => IntrospectResponse::GcResult { deleted, freed_bytes },
                     Err(e) => IntrospectResponse::Error(format!("gc: {e}")),
                 }
diff --git a/crates/runtime/ente-brain/src/lib.rs b/crates/runtime/arje-brain/src/lib.rs
similarity index 100%
rename from crates/runtime/ente-brain/src/lib.rs
rename to crates/runtime/arje-brain/src/lib.rs
diff --git a/crates/runtime/ente-brain/src/loader.rs b/crates/runtime/arje-brain/src/loader.rs
similarity index 99%
rename from crates/runtime/ente-brain/src/loader.rs
rename to crates/runtime/arje-brain/src/loader.rs
index 296ebc1..2ca34ad 100644
--- a/crates/runtime/ente-brain/src/loader.rs
+++ b/crates/runtime/arje-brain/src/loader.rs
@@ -9,7 +9,7 @@
 //! adicionales aquí cuando duela escribir JSON a mano. Hoy: una sola rama.
 
 use crate::rules::Rule;
-use ente_card::EntityCard;
+use arje_card::EntityCard;
 use std::path::Path;
 use tracing::info;
 
diff --git a/crates/runtime/ente-brain/src/metrics.rs b/crates/runtime/arje-brain/src/metrics.rs
similarity index 99%
rename from crates/runtime/ente-brain/src/metrics.rs
rename to crates/runtime/arje-brain/src/metrics.rs
index ad44be2..06b7c79 100644
--- a/crates/runtime/ente-brain/src/metrics.rs
+++ b/crates/runtime/arje-brain/src/metrics.rs
@@ -128,7 +128,7 @@ async fn format_metrics(state: &BrainState) -> String {
         out.push_str("# TYPE ente_brain_audit_head_info gauge\n");
         out.push_str(&format!(
             "ente_brain_audit_head_info{{sha=\"{}\"}} 1\n",
-            ente_cas::hex(&sha)
+            arje_cas::hex(&sha)
         ));
     }
 
diff --git a/crates/runtime/ente-brain/src/observer.rs b/crates/runtime/arje-brain/src/observer.rs
similarity index 100%
rename from crates/runtime/ente-brain/src/observer.rs
rename to crates/runtime/arje-brain/src/observer.rs
diff --git a/crates/runtime/ente-brain/src/rules.rs b/crates/runtime/arje-brain/src/rules.rs
similarity index 99%
rename from crates/runtime/ente-brain/src/rules.rs
rename to crates/runtime/arje-brain/src/rules.rs
index 8c17a27..c78fa2e 100644
--- a/crates/runtime/ente-brain/src/rules.rs
+++ b/crates/runtime/arje-brain/src/rules.rs
@@ -5,7 +5,7 @@
 //! acepta Rules construidas a mano sin pasar por validate() — ver
 //! `engine::insert`.
 
-use ente_card::Capability;
+use arje_card::Capability;
 use serde::{Deserialize, Serialize};
 use ulid::Ulid;
 
diff --git a/crates/runtime/ente-bus/Cargo.toml b/crates/runtime/arje-bus/Cargo.toml
similarity index 77%
rename from crates/runtime/ente-bus/Cargo.toml
rename to crates/runtime/arje-bus/Cargo.toml
index eac2173..c8a0a5d 100644
--- a/crates/runtime/ente-bus/Cargo.toml
+++ b/crates/runtime/arje-bus/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-bus"
+name = "arje-bus"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
+arje-card = { path = "../../protocol/arje-card" }
 serde = { workspace = true }
 postcard = { workspace = true }
 ulid = { workspace = true }
@@ -15,7 +15,7 @@ anyhow = { workspace = true }
 tracing = { workspace = true }
 
 [dev-dependencies]
-ente-echo = { path = "../ente-echo" }
+arje-echo = { path = "../arje-echo" }
 
 [[example]]
 name = "busctl"
diff --git a/crates/runtime/ente-bus/examples/busctl.rs b/crates/runtime/arje-bus/examples/busctl.rs
similarity index 95%
rename from crates/runtime/ente-bus/examples/busctl.rs
rename to crates/runtime/arje-bus/examples/busctl.rs
index 0d5b36e..c0bec53 100644
--- a/crates/runtime/ente-bus/examples/busctl.rs
+++ b/crates/runtime/arje-bus/examples/busctl.rs
@@ -7,7 +7,7 @@
 //!
 //! Si `ENTE_BUS_SOCK` no está en el entorno, cae al path dev por defecto.
 
-use ente_bus::{BusClient, BusRequest};
+use arje_bus::{BusClient, BusRequest};
 use std::env;
 
 #[tokio::main(flavor = "current_thread")]
@@ -36,7 +36,7 @@ async fn main() -> anyhow::Result<()> {
         "invoke-echo" => {
             let msg = args.get(2).map(|s| s.as_str()).unwrap_or("hola");
             BusRequest::Invoke {
-                cap: ente_echo::echo_capability(),
+                cap: arje_echo::echo_capability(),
                 blob: msg.as_bytes().to_vec(),
             }
         }
diff --git a/crates/runtime/ente-bus/src/lib.rs b/crates/runtime/arje-bus/src/lib.rs
similarity index 95%
rename from crates/runtime/ente-bus/src/lib.rs
rename to crates/runtime/arje-bus/src/lib.rs
index 586df9c..131bae9 100644
--- a/crates/runtime/ente-bus/src/lib.rs
+++ b/crates/runtime/arje-bus/src/lib.rs
@@ -6,7 +6,7 @@
 //! Identidad: cada Ente hijo recibe `ENTE_BUS_SOCK` y `ENTE_ID` en su entorno.
 //! El cliente lee ambos vía `BusClient::from_env`.
 
-use ente_card::Capability;
+use arje_card::Capability;
 use serde::{Deserialize, Serialize};
 use std::path::Path;
 use std::str::FromStr;
@@ -23,14 +23,14 @@ pub const MAX_FRAME: usize = 1 << 20; // 1 MiB — protección contra OOM
 /// `Capability::Endpoint { interface: POLKIT_DECISION_IFACE, version: 1 }`
 /// para arbitrar autorizaciones. Recibe blob:
 /// `pid_be | uid_be | action_id_utf8` → responde 1 byte: 1=allow, 0=deny.
-pub const POLKIT_DECISION_IFACE: ente_card::InterfaceId =
-    ente_card::InterfaceId([0xb0; 16]);
+pub const POLKIT_DECISION_IFACE: arje_card::InterfaceId =
+    arje_card::InterfaceId([0xb0; 16]);
 
 /// Interface UUID auto-anunciado por compat-polkit. Diferente al de
 /// decisión para evitar recursión (polkit-compat invoca DECISION pero
 /// no es proveedor de DECISION; se anuncia como SERVICE).
-pub const POLKIT_SERVICE_IFACE: ente_card::InterfaceId =
-    ente_card::InterfaceId([0xa4; 16]);
+pub const POLKIT_SERVICE_IFACE: arje_card::InterfaceId =
+    arje_card::InterfaceId([0xa4; 16]);
 
 /// Credenciales del peer extraídas vía SO_PEERCRED al accept del bus.
 /// Imposibles de falsear desde el cliente — el kernel las inyecta.
@@ -132,7 +132,7 @@ pub struct BusClient {
 /// forwarda. Sync por simplicidad — un handler async se cubre con
 /// `tokio::task::block_in_place` o un canal hacia un task externo.
 pub trait InvokeHandler {
-    fn handle(&mut self, cap: ente_card::Capability, blob: Vec<u8>) -> BusResponse;
+    fn handle(&mut self, cap: arje_card::Capability, blob: Vec<u8>) -> BusResponse;
 }
 
 /// Conexión long-lived para Entes que proveen capacidades. A diferencia de
@@ -157,7 +157,7 @@ impl BusServer {
         Ok(Self { stream, self_id })
     }
 
-    pub async fn announce(&mut self, capabilities: Vec<ente_card::Capability>) -> anyhow::Result<()> {
+    pub async fn announce(&mut self, capabilities: Vec<arje_card::Capability>) -> anyhow::Result<()> {
         let req = BusMessage {
             from: Some(self.self_id),
             seq: 1,
diff --git a/crates/runtime/ente-cas/Cargo.toml b/crates/runtime/arje-cas/Cargo.toml
similarity index 92%
rename from crates/runtime/ente-cas/Cargo.toml
rename to crates/runtime/arje-cas/Cargo.toml
index df0c34c..b310436 100644
--- a/crates/runtime/ente-cas/Cargo.toml
+++ b/crates/runtime/arje-cas/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "ente-cas"
+name = "arje-cas"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
diff --git a/crates/runtime/ente-cas/src/lib.rs b/crates/runtime/arje-cas/src/lib.rs
similarity index 100%
rename from crates/runtime/ente-cas/src/lib.rs
rename to crates/runtime/arje-cas/src/lib.rs
diff --git a/crates/runtime/ente-echo/Cargo.toml b/crates/runtime/arje-echo/Cargo.toml
similarity index 68%
rename from crates/runtime/ente-echo/Cargo.toml
rename to crates/runtime/arje-echo/Cargo.toml
index b3ab6e8..c1ef55d 100644
--- a/crates/runtime/ente-echo/Cargo.toml
+++ b/crates/runtime/arje-echo/Cargo.toml
@@ -1,21 +1,21 @@
 [package]
-name = "ente-echo"
+name = "arje-echo"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [lib]
-name = "ente_echo"
+name = "arje_echo"
 path = "src/lib.rs"
 
 [[bin]]
-name = "ente-echo"
+name = "arje-echo"
 path = "src/main.rs"
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
-ente-bus = { path = "../ente-bus" }
+arje-card = { path = "../../protocol/arje-card" }
+arje-bus = { path = "../arje-bus" }
 anyhow = { workspace = true }
 tokio = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/runtime/ente-echo/src/lib.rs b/crates/runtime/arje-echo/src/lib.rs
similarity index 93%
rename from crates/runtime/ente-echo/src/lib.rs
rename to crates/runtime/arje-echo/src/lib.rs
index 8ebcc32..4de09ed 100644
--- a/crates/runtime/ente-echo/src/lib.rs
+++ b/crates/runtime/arje-echo/src/lib.rs
@@ -1,7 +1,7 @@
 //! Constantes públicas del Ente echo. Lib aparte del bin para que `busctl`
 //! y otros consumidores puedan importar el InterfaceId sin enlazar el binario.
 
-use ente_card::{Capability, InterfaceId};
+use arje_card::{Capability, InterfaceId};
 
 /// UUID estable del interface "echo". Genera nuevo por sed si forkeas.
 pub const ECHO_IFACE: InterfaceId = InterfaceId([
diff --git a/crates/runtime/ente-echo/src/main.rs b/crates/runtime/arje-echo/src/main.rs
similarity index 87%
rename from crates/runtime/ente-echo/src/main.rs
rename to crates/runtime/arje-echo/src/main.rs
index 8ef07ea..e6e66b3 100644
--- a/crates/runtime/ente-echo/src/main.rs
+++ b/crates/runtime/arje-echo/src/main.rs
@@ -2,9 +2,9 @@
 //! responde a invokes echando el blob recibido. Vehículo para validar el
 //! forwarding bus → proveedor → bus → originator.
 
-use ente_bus::{BusResponse, BusServer, InvokeHandler};
-use ente_card::Capability;
-use ente_echo::{echo_capability, ECHO_IFACE, ECHO_VERSION};
+use arje_bus::{BusResponse, BusServer, InvokeHandler};
+use arje_card::Capability;
+use arje_echo::{echo_capability, ECHO_IFACE, ECHO_VERSION};
 use tracing::{info, warn};
 use tracing_subscriber::EnvFilter;
 
@@ -31,7 +31,7 @@ impl InvokeHandler for EchoHandler {
 #[tokio::main(flavor = "current_thread")]
 async fn main() -> anyhow::Result<()> {
     let filter = EnvFilter::try_from_default_env()
-        .unwrap_or_else(|_| EnvFilter::new("ente_echo=info"));
+        .unwrap_or_else(|_| EnvFilter::new("arje_echo=info"));
     tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init();
 
     info!("ente-echo arrancando");
diff --git a/crates/runtime/ente-wasm/Cargo.toml b/crates/runtime/arje-wasm/Cargo.toml
similarity index 79%
rename from crates/runtime/ente-wasm/Cargo.toml
rename to crates/runtime/arje-wasm/Cargo.toml
index 4f28b71..57bb1ca 100644
--- a/crates/runtime/ente-wasm/Cargo.toml
+++ b/crates/runtime/arje-wasm/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
-name = "ente-wasm"
+name = "arje-wasm"
 version = "0.0.1"
 edition.workspace = true
 license.workspace = true
 publish.workspace = true
 
 [dependencies]
-ente-card = { path = "../../protocol/ente-card" }
+arje-card = { path = "../../protocol/arje-card" }
 wasmi = { workspace = true }
 wat = { workspace = true }
 ulid = { workspace = true }
diff --git a/crates/runtime/ente-wasm/src/lib.rs b/crates/runtime/arje-wasm/src/lib.rs
similarity index 99%
rename from crates/runtime/ente-wasm/src/lib.rs
rename to crates/runtime/arje-wasm/src/lib.rs
index 27b5953..4b4461d 100644
--- a/crates/runtime/ente-wasm/src/lib.rs
+++ b/crates/runtime/arje-wasm/src/lib.rs
@@ -11,7 +11,7 @@
 //!
 //! Más adelante: `ente.bus_call`, `ente.cap_invoke`, etc.
 
-use ente_card::EntityCard;
+use arje_card::EntityCard;
 use std::sync::atomic::{AtomicI32, Ordering};
 use std::sync::Arc;
 use tracing::{error, info, warn};
diff --git a/docs/PLAN_MACRO.md b/docs/PLAN_MACRO.md
index a8397e1..5b6ff23 100644
--- a/docs/PLAN_MACRO.md
+++ b/docs/PLAN_MACRO.md
@@ -59,7 +59,7 @@
 
 | módulo | rol | LOC aprox proyectada |
 |---|---|---|
-| `carmen` | compositor Wayland (smithay + ente-incarnate sandbox + delegación de regiones) | 8,000-12,000 |
+| `carmen` | compositor Wayland (smithay + arje-incarnate sandbox + delegación de regiones) | 8,000-12,000 |
 | `akashi` | notes app con ECS + 4 lentes + gravedad semántica + Susurros | 10,000-15,000 |
 | `charka` | transpilador COBOL→Rust + runtime determinista + shadow validator | 25,000-50,000 |
 | `matilda` | administrador servidores + vhosts + Docker (con Ghost remoto) | 6,000-9,000 |
@@ -97,8 +97,8 @@
    │  init/  │         │ runtime/ │         │  compat/ │
    └────┬────┘         └────┬─────┘         └──────────┘
         │                   │
-        │ ente-incarnate    │ brain-split: rules, cognitive, audit
-        │ (+ pivot_root,    │ ente-cas, ente-bus, ente-wasm
+        │ arje-incarnate    │ brain-split: rules, cognitive, audit
+        │ (+ pivot_root,    │ arje-cas, arje-bus, arje-wasm
         │   overlayfs)      │
         │                   │
         └──────────┬────────┘
@@ -160,7 +160,7 @@ Pre-requisitos antes de meter código nuevo. La mayoría paralelizable.
 | #13 | Split brain en brain-rules + brain-cognitive + brain-audit | sandokan, ágora | 3-5 días |
 | #14 | Unificar loader en brahman-cards | reduce duplicación | 1-2 días |
 | #16 | Promover lifecycle a sandokan-lifecycle | sandokan, matilda, charka-shadow, carmen | 4-7 días |
-| #19 | pivot_root + overlayfs en ente-incarnate | carmen, matilda Ghost, sandokan completo | 4-7 días |
+| #19 | pivot_root + overlayfs en arje-incarnate | carmen, matilda Ghost, sandokan completo | 4-7 días |
 | #20 | transport-ssh-multiplex | sandokan::RemoteEngine, matilda | 3-5 días |
 
 Trabajo paralelo posible: 3-4 tracks. Estimación realista: **2 semanas**.
@@ -187,8 +187,8 @@ Módulos de dominio que pueden empezar cuando sus deps de Fase B estén estables
 | #27 | dominium | (mayormente independiente) | 3-6K | 3-4 semanas |
 | #26 | takiy | dime (instancia ort) | 5-8K | 4-6 semanas |
 | #23 | akashi | dime (instancia 384d), separabilidad UI | 10-15K | 6-10 semanas |
-| #21 | matilda | sandokan-lifecycle, ente-incarnate enhanced, transport-ssh | 6-9K | 5-8 semanas |
-| #29 | carmen | ente-incarnate enhanced, sandokan, ente-logind-compat | 8-12K | 8-12 semanas |
+| #21 | matilda | sandokan-lifecycle, arje-incarnate enhanced, transport-ssh | 6-9K | 5-8 semanas |
+| #29 | carmen | arje-incarnate enhanced, sandokan, arje-logind-compat | 8-12K | 8-12 semanas |
 | #31 | ágora | CardKind extension, discovery-dht, brain-audit | 6-10K | 5-8 semanas |
 
 Paralelizable hasta 4-6 tracks simultáneos. Estimación realista: **10-12 semanas**.
@@ -312,7 +312,7 @@ Para considerar cada fase "cerrada":
 - [ ] `cargo check --workspace` verde tras rename a chasqui
 - [ ] brain split: 3 crates separados, brain umbrella opcional, loader unificado
 - [ ] sandokan-lifecycle extraído con tests pasando que cubren shuma's lifecycle existente
-- [ ] ente-incarnate con pivot_root + overlayfs + tests (chroot básico)
+- [ ] arje-incarnate con pivot_root + overlayfs + tests (chroot básico)
 - [ ] transport-ssh-multiplex con tests sobre russh
 
 **Fase B**:
@@ -325,7 +325,7 @@ Para considerar cada fase "cerrada":
 - [ ] takiy: latencia audio <10ms; persistencia ambos formatos
 - [ ] akashi: 4 lentes implementadas; Susurros activos; storage sqlite-vss funcional
 - [ ] matilda: Inspect/Diff/Apply ciclo cerrado; al menos provider Docker funcional
-- [ ] carmen: arranca compositor; renderea alacritty; sandbox via ente-incarnate
+- [ ] carmen: arranca compositor; renderea alacritty; sandbox via arje-incarnate
 - [ ] ágora: emite + verifica + revoca attestations; grafo navegable; integrado con CardKind
 
 **Fase D**:
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index af3870d..ca98ff0 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -7,7 +7,7 @@ impacto (lo que desbloquea más trabajo).
 
 - [x] Split core/ → protocol + init + runtime + compat
 - [x] Renames: shipote→shuma, nouser→akasha, yahweh→nahual, lapaloma→pineal
-- [x] Fraccionamiento: vista-core, barra-core extraídos
+- [x] Fraccionamiento: revista-core, barra-core extraídos
 - [x] SDDs por subdirectorio
 - [x] CHANGELOG particionado por proyecto
 - [x] `cargo check --workspace` pasa
@@ -44,7 +44,7 @@ montable (editor abriendo paths semánticos).
 
 | Crate                  | TODOs | Trabajo                                   |
 | ---------------------- | ----- | ----------------------------------------- |
-| `ente-brain`           | 11    | Rule engine declarativo + observer        |
+| `arje-brain`           | 11    | Rule engine declarativo + observer        |
 | `shuma-core`           | 14    | Supervisión avanzada (restart + health)   |
 | `brahman-handshake`    | 10    | Trust fase 4 (revocaciones, beyond peer)  |
 | `cosmobiologia-engine` | 12    | Sistema GR + harmonics (tareas #55-#63)   |
@@ -71,9 +71,9 @@ Memorias del proyecto detallan:
 
 | Shim                  | Métodos pendientes                   |
 | --------------------- | ------------------------------------ |
-| `ente-logind-compat`  | `Inhibit`, `Sleep` hooks             |
-| `ente-localed-compat` | `SetVariable`                        |
-| `ente-machined-compat`| `MachineImage` operations             |
+| `arje-logind-compat`  | `Inhibit`, `Sleep` hooks             |
+| `arje-localed-compat` | `SetVariable`                        |
+| `arje-machined-compat`| `MachineImage` operations             |
 
 Permite correr GNOME/KDE end-to-end sin parches.
 
@@ -94,4 +94,4 @@ solitario; ~3-4 si se paraleliza (hito 1 con hito 6 son disjuntos).
 - 0 stubs `<50 LOC` que no sean intencionales.
 - `minga-vfs` montable como `mount.minga`.
 - Cosmobiología cubriendo: cartas natales, dial GR, harmonics, 3D, rectificación.
-- GNOME Shell arrancable sobre `arje` (Init = `ente-zero`) sin parches.
+- GNOME Shell arrancable sobre `arje` (Init = `arje-zero`) sin parches.
diff --git a/docs/STATUS.md b/docs/STATUS.md
index a08e174..1f69ee4 100644
--- a/docs/STATUS.md
+++ b/docs/STATUS.md
@@ -5,7 +5,7 @@ y `grep` sobre `src/` en cada crate (sin contar `target/` ni docs).
 
 ## Resumen ejecutivo
 
-- **126 crates** activos en el workspace (124 originales + `vista-core` + `barra-core`).
+- **126 crates** activos en el workspace (124 originales + `revista-core` + `barra-core`).
 - **~78.000 LOC** de Rust en `crates/`.
 - **Build pasa** (`cargo check --workspace`) tras el reorg del 2026-05-19.
 - **2 warnings** no bloqueantes (variant unused + eternal-validation).
@@ -33,8 +33,8 @@ Bootea bare metal + QEMU + initramfs. Pendiente: cobertura tests sobre
 |---|---|---|---|
 | 3,418 | parcial | ~14 | ★★★☆☆ |
 
-`ente-brain` concentra 11 TODOs (rule engine declarativo + observer
-estadístico). `ente-bus`/`ente-cas`/`ente-wasm` estables.
+`arje-brain` concentra 11 TODOs (rule engine declarativo + observer
+estadístico). `arje-bus`/`arje-cas`/`arje-wasm` estables.
 
 ### `compat/` — Cobertura mínima viable
 | LOC | Tests | TODOs | Madurez |
@@ -100,19 +100,19 @@ avanzada (restart policies + health checks).
 
 Landing WASM operativa. 4 crates agnósticos + cdylib + scripts de build.
 
-### `modules/pluma/` — Funcional, pequeño
+### `modules/fana/` — Funcional, pequeño
 | LOC | Tests | TODOs | Madurez |
 |---|---|---|---|
 | 178 | no | 0 | ★★★☆☆ |
 
 Parser + reader web. Pendiente: AST con inline elements (links, emphasis).
 
-### `modules/vista/` — Refactorizado (2026-05-19)
+### `modules/revista/` — Refactorizado (2026-05-19)
 | LOC | Tests | TODOs | Madurez |
 |---|---|---|---|
 | ~530 (177 core + ~350 web) | core: 5/5 verdes | 0 | ★★★★☆ |
 
-`vista-core` agnóstico nuevo + `vista-web` ahora thin DOM binding.
+`revista-core` agnóstico nuevo + `revista-web` ahora thin DOM binding.
 
 ### `modules/barra/` — Refactorizado (2026-05-19)
 | LOC | Tests | TODOs | Madurez |
diff --git a/docs/arje-boot.md b/docs/arje-boot.md
index 3a9edb8..7b19906 100644
--- a/docs/arje-boot.md
+++ b/docs/arje-boot.md
@@ -1,9 +1,9 @@
 # Booteando arje — initramfs, QEMU y bare metal
 
-`arje` es el init absorbido por brahman: `ente-zero` corre como PID 1, lee
+`arje` es el init absorbido por brahman: `arje-zero` corre como PID 1, lee
 la **Tarjeta Semilla** (`/ente/seed.card.json`), monta `/proc /sys /dev
 /sys/fs/cgroup`, y encarna recursivamente cada Card declarada en
-`genesis` vía `ente-incarnate::Incarnator` (`clone(2)` + namespaces + cgroup v2).
+`genesis` vía `arje-incarnate::Incarnator` (`clone(2)` + namespaces + cgroup v2).
 
 Este documento describe el ciclo completo:
 
@@ -21,11 +21,11 @@ Este documento describe el ciclo completo:
 El initrd es un **CPIO + gzip** (formato `newc`, estándar Linux). Su raíz:
 
 ```
-/init                           wrapper sh, ejecuta /sbin/ente-zero
-/sbin/ente-zero                 PID 1 (musl-static por default)
-/usr/sbin/ente-echo
-/usr/sbin/ente-policy-provider
-/usr/sbin/ente-*-compat         13 shims D-Bus (logind, hostnamed, …)
+/init                           wrapper sh, ejecuta /sbin/arje-zero
+/sbin/arje-zero                 PID 1 (musl-static por default)
+/usr/sbin/arje-echo
+/usr/sbin/arje-policy-provider
+/usr/sbin/arje-*-compat         13 shims D-Bus (logind, hostnamed, …)
 /usr/bin/brahman-status         CLI: snapshot del broker (sesiones + matches)
 /usr/bin/busctl                 CLI: bus interno (list-entes, announce, …)
 /usr/bin/brainctl               CLI: cerebro (rules, entropy, crystals)
@@ -36,14 +36,14 @@ El initrd es un **CPIO + gzip** (formato `newc`, estándar Linux). Su raíz:
 ```
 
 Path canónico de la semilla en **prod**: `/ente/seed.card.json` (ver
-`crates/core/ente-zero/src/seed.rs`). En **dev** (no PID 1):
+`crates/core/arje-zero/src/seed.rs`). En **dev** (no PID 1):
 `./seed.card.json` en el cwd, o se sintetiza una mínima.
 
 ## 2. Build del initrd
 
 ### 2a. Por qué musl-static
 
-`ente-zero` corre como **PID 1**: si tiene cualquier dependencia dinámica
+`arje-zero` corre como **PID 1**: si tiene cualquier dependencia dinámica
 (`libgcc_s.so.1`, `libc.so.6`, `ld-linux-x86-64.so.2`) que no está
 presente en el initramfs, el kernel paniquea con
 `error while loading shared libraries: libgcc_s.so.1`.
@@ -96,7 +96,7 @@ ARJE_TARGET=x86_64-unknown-linux-gnu scripts/build-arje-initrd.sh
 1. Verifica que el target musl esté instalado; si no, da el comando
    exacto para instalarlo.
 2. `cargo build --release --target x86_64-unknown-linux-musl` para
-   `ente-zero` + los 14 shims compat.
+   `arje-zero` + los 14 shims compat.
 3. Sanity-check con `file`: aborta si algún binario quedó dinámico.
 4. Valida la seed con `seeds/validate.sh` (parse + `Card::validate`).
 5. Verifica que `busybox` sea estático (también aborta si es dinámico).
@@ -164,9 +164,9 @@ wget -O /tmp/vmlinuz \
 | `loglevel=7`               | log del kernel hasta debug                          |
 | `quiet`                    | silencia banner kernel                              |
 | `RUST_LOG=trace`           | (no se interpreta; usar env en `/init`)             |
-| `init=/sbin/ente-zero`     | salta `/init`, ejecuta directo (no recomendado)     |
+| `init=/sbin/arje-zero`     | salta `/init`, ejecuta directo (no recomendado)     |
 
-`ente-zero` lee `RUST_LOG` y `BRAHMAN_*` del env. Para setearlas, editar
+`arje-zero` lee `RUST_LOG` y `BRAHMAN_*` del env. Para setearlas, editar
 `/init` antes de empaquetar, o agregar `-fw_cfg name=opt/foo,...` a qemu.
 
 ### 3d. Smoke test esperado
@@ -174,9 +174,9 @@ wget -O /tmp/vmlinuz \
 Con `seeds/arje-prod.card.json`:
 
 ```
-ente-zero despierta como PID 1
+arje-zero despierta como PID 1
 Tarjeta Semilla cargada y validada path=/ente/seed.card.json
-bus interno escuchando path=/run/ente-bus.sock
+bus interno escuchando path=/run/arje-bus.sock
 brahman handshake escuchando (Unix) socket=/run/brahman-init.sock
 brahman admin escuchando socket=/run/brahman-admin.sock
 instanciando genesis seed=arje.seed.prod count=16
@@ -242,8 +242,8 @@ de implementar como `Capability::SwitchRoot`.
 seeds/validate.sh seeds/arje-prod.card.json
 ```
 
-El script carga la Card vía `ente_brain::load_card_file()` (que llama a
-`brahman_card::Card::validate()`) y verifica que `ente-zero` la encarne
+El script carga la Card vía `arje_brain::load_card_file()` (que llama a
+`brahman_card::Card::validate()`) y verifica que `arje-zero` la encarne
 hasta `instanciando genesis`.
 
 ### 5c. Customizar
@@ -294,7 +294,7 @@ Validación clave (`brahman_card::Card::validate`):
 
 ### 6a. Tracing
 
-`ente-zero` usa `tracing-subscriber`. Default: `ente_zero=debug,info`.
+`arje-zero` usa `tracing-subscriber`. Default: `arje_zero=debug,info`.
 Override con `RUST_LOG`:
 
 ```bash
@@ -309,10 +309,10 @@ los sockets caen al fallback `/tmp/`:
 
 | socket                       | env override            | servicio                                  |
 | ---------------------------- | ----------------------- | ----------------------------------------- |
-| `/tmp/ente-bus-*.sock`        | `ENTE_BUS_SOCK`         | bus interno (Announce/Invoke/ListEntes)   |
+| `/tmp/arje-bus-*.sock`        | `ENTE_BUS_SOCK`         | bus interno (Announce/Invoke/ListEntes)   |
 | `/tmp/brahman-init.sock`      | `BRAHMAN_INIT_SOCKET`   | handshake brahman                         |
 | `/tmp/brahman-admin.sock`     | `BRAHMAN_ADMIN_SOCKET`  | snapshots de sesiones + matches           |
-| `/tmp/ente-brain.sock`        | `ENTE_BRAIN_SOCK`       | introspección del cerebro (rules, observer) |
+| `/tmp/arje-brain.sock`        | `ENTE_BRAIN_SOCK`       | introspección del cerebro (rules, observer) |
 
 El initrd trae 3 CLI clients precompilados en `/usr/bin/`:
 
@@ -351,7 +351,7 @@ arje# busctl list-entes
 
 arje# brainctl top 5
 spawn 14
-ente_died 0
+arje_died 0
 …
 ```
 
@@ -365,8 +365,8 @@ arje# socat - UNIX-CONNECT:/tmp/brahman-admin.sock | jq .
 ### 6c. Snapshot / restore
 
 ```
-ente-zero --checkpoint /ente/checkpoint.json    # escribe al cerrar
-ente-zero --restore    /ente/checkpoint.json    # reconstruye al boot
+arje-zero --checkpoint /ente/checkpoint.json    # escribe al cerrar
+arje-zero --restore    /ente/checkpoint.json    # reconstruye al boot
 ```
 
 Snapshot adjunto del cerebro: `/ente/checkpoint.brain.json`.
@@ -374,7 +374,7 @@ Snapshot adjunto del cerebro: `/ente/checkpoint.brain.json`.
 ### 6d. Metrics
 
 ```
-ente-zero --metrics-addr 127.0.0.1:9911
+arje-zero --metrics-addr 127.0.0.1:9911
 ```
 
 Endpoint Prometheus desde dentro de la VM. Para exponerlo al host bajo
@@ -382,20 +382,20 @@ QEMU, agregar `-netdev user,hostfwd=tcp::9911-:9911 -device virtio-net,netdev=
 
 ### 6e. Modo DEV en host (sin PID 1)
 
-`ente-zero` detecta si su PID != 1 y entra en **DEV MODE**: no monta
+`arje-zero` detecta si su PID != 1 y entra en **DEV MODE**: no monta
 kernel surface, no se vuelve subreaper, sale tras 4 s. Útil para
 iterar Cards en el host:
 
 ```bash
 mkdir /tmp/arje-test && cp seeds/arje-minimal.card.json /tmp/arje-test/seed.card.json
-cd /tmp/arje-test && target/release/ente-zero
+cd /tmp/arje-test && target/release/arje-zero
 ```
 
 ## 7. Troubleshooting
 
 ### 7a. `error while loading shared libraries: libgcc_s.so.1` al boot
 
-**Causa**: el `/sbin/ente-zero` del initrd se compiló contra glibc
+**Causa**: el `/sbin/arje-zero` del initrd se compiló contra glibc
 (`x86_64-unknown-linux-gnu`) y depende dinámicamente de `libgcc_s.so.1`,
 `libc.so.6`, `ld-linux-x86-64.so.2`. Esas libs no están en el initramfs,
 el kernel mata PID 1 → panic.
@@ -411,7 +411,7 @@ scripts/build-arje-initrd.sh       # ya usa musl por default
 Verificar manualmente que el binario quedó estático:
 
 ```bash
-file target/x86_64-unknown-linux-musl/release/ente-zero
+file target/x86_64-unknown-linux-musl/release/arje-zero
 # → "ELF 64-bit LSB executable, ..., statically linked, ..."
 ```
 
@@ -422,7 +422,7 @@ recomendado.
 
 ### 7b. Kernel panic: `Kernel panic - not syncing: Attempted to kill init!`
 
-**Causa**: `ente-zero` salió con error antes de bind del bus, o `/init`
+**Causa**: `arje-zero` salió con error antes de bind del bus, o `/init`
 crashed antes de exec. PID 1 muriendo = panic kernel.
 
 **Fix**: agregar `panic=10` al cmdline (ya está en el script) para
@@ -464,9 +464,9 @@ target-feature=+crt-static"` o aislando el feature problemático.
 - [ ] `rustup target add x86_64-unknown-linux-musl` instalado en el host build.
 - [ ] `musl-tools` (Debian/Ubuntu) o equivalente disponible.
 - [ ] `busybox-static` disponible para vendorear userspace.
-- [ ] `cargo build --release --target x86_64-unknown-linux-musl -p ente-zero`
+- [ ] `cargo build --release --target x86_64-unknown-linux-musl -p arje-zero`
       compila sin warnings.
-- [ ] `file target/x86_64-unknown-linux-musl/release/ente-zero` reporta
+- [ ] `file target/x86_64-unknown-linux-musl/release/arje-zero` reporta
       "statically linked".
 - [ ] `seeds/validate.sh seeds/arje-prod.card.json` → OK.
 - [ ] `scripts/build-arje-initrd.sh` produce `out/arje.initrd.cpio.gz`.
diff --git a/docs/arje-replace-systemd.md b/docs/arje-replace-systemd.md
index 0fa22c1..e0b454d 100644
--- a/docs/arje-replace-systemd.md
+++ b/docs/arje-replace-systemd.md
@@ -11,14 +11,14 @@
 | `/sbin/init`          | NO se toca (sigue siendo systemd).                       |
 | `/lib/systemd/*`      | NO se toca.                                              |
 | `kernel + initramfs`  | reusamos los del host (firmware, módulos, root FS).      |
-| `init=` en GRUB       | nueva entrada apunta a `/sbin/ente-zero`.                |
+| `init=` en GRUB       | nueva entrada apunta a `/sbin/arje-zero`.                |
 | `GRUB_DEFAULT`        | NO se cambia. Sigue arrancando systemd por default.      |
 | `/ente/seed.card.json`| nueva — define qué arranca arje.                         |
-| `/usr/sbin/ente-*`    | binarios musl-static del fractal.                        |
+| `/usr/sbin/arje-*`    | binarios musl-static del fractal.                        |
 
 Booteo del kernel → initramfs nativo hace su trabajo (mountea root,
 carga módulos) → cuando llega el `switch_root`, en lugar de exec
-`/lib/systemd/systemd`, exec `/sbin/ente-zero`. Esto deja firmware y
+`/lib/systemd/systemd`, exec `/sbin/arje-zero`. Esto deja firmware y
 udev fuera del scope de arje (todavía).
 
 ## 2. Instalación
@@ -31,7 +31,7 @@ $EDITOR seeds/arje-host.card.json
 sudo scripts/install-arje-as-init.sh
 
 # 3. (opcional) bootear arje SÓLO en el próximo reboot (no cambia default)
-sudo grub-reboot "arje (init=/sbin/ente-zero) — kernel $(uname -r)"
+sudo grub-reboot "arje (init=/sbin/arje-zero) — kernel $(uname -r)"
 sudo reboot
 ```
 
@@ -76,16 +76,16 @@ ninguno a tu seed** salvo que sepas que lo usás:
 | `gdm.service`, `lightdm.service`     | DM gráfico — agregalo SÓLO si querés GUI.|
 | `NetworkManager-wait-online.service` | espera red. arje no necesita "esperar".  |
 | `systemd-timesyncd.service`          | reemplaza con cron-like + ntpd one-shot. |
-| `systemd-machined.service`           | reemplazado por `ente-machined-compat`.  |
-| `systemd-logind.service`             | reemplazado por `ente-logind-compat`.    |
-| `systemd-resolved.service`           | reemplazado por `ente-resolved-compat`.  |
-| `systemd-hostnamed.service`          | reemplazado por `ente-hostnamed-compat`. |
-| `systemd-timedated.service`          | reemplazado por `ente-timedated-compat`. |
-| `systemd-localed.service`            | reemplazado por `ente-localed-compat`.   |
-| `systemd-journald.service`           | reemplazado por `ente-journald-compat`.  |
-| `systemd-tmpfiles-*.service`         | reemplazado por `ente-tmpfiles-compat`.  |
-| `systemd-binfmt.service`             | reemplazado por `ente-binfmt-compat`.    |
-| `polkitd.service`                    | reemplazado por `ente-polkit-compat`.    |
+| `systemd-machined.service`           | reemplazado por `arje-machined-compat`.  |
+| `systemd-logind.service`             | reemplazado por `arje-logind-compat`.    |
+| `systemd-resolved.service`           | reemplazado por `arje-resolved-compat`.  |
+| `systemd-hostnamed.service`          | reemplazado por `arje-hostnamed-compat`. |
+| `systemd-timedated.service`          | reemplazado por `arje-timedated-compat`. |
+| `systemd-localed.service`            | reemplazado por `arje-localed-compat`.   |
+| `systemd-journald.service`           | reemplazado por `arje-journald-compat`.  |
+| `systemd-tmpfiles-*.service`         | reemplazado por `arje-tmpfiles-compat`.  |
+| `systemd-binfmt.service`             | reemplazado por `arje-binfmt-compat`.    |
+| `polkitd.service`                    | reemplazado por `arje-polkit-compat`.    |
 
 Las últimas 12 ya están como Cards en `seeds/arje-host.card.json`. Las
 de la mitad de arriba **no** — no las agregues.
@@ -94,11 +94,11 @@ de la mitad de arriba **no** — no las agregues.
 
 | Card label         | reemplaza                  | binario                                      |
 | ------------------ | -------------------------- | -------------------------------------------- |
-| `tmpfiles-boot`    | `systemd-tmpfiles-setup`   | `/usr/sbin/ente-tmpfiles-compat --boot`      |
+| `tmpfiles-boot`    | `systemd-tmpfiles-setup`   | `/usr/sbin/arje-tmpfiles-compat --boot`      |
 | `mount-fstab`      | `local-fs.target`          | `/bin/mount -a` (one-shot)                   |
 | `swap-on`          | `swap.target`              | `/sbin/swapon -a` (one-shot)                 |
 | `dbus-system`      | `dbus.service`             | `/usr/bin/dbus-daemon --system --nofork`     |
-| `compat-*` (×11)   | shims D-Bus de systemd     | `/usr/sbin/ente-*-compat`                    |
+| `compat-*` (×11)   | shims D-Bus de systemd     | `/usr/sbin/arje-*-compat`                    |
 | `network-dhcpcd`   | `NetworkManager` / `networkd` | `/usr/sbin/dhcpcd -B`                     |
 | `sshd`             | `ssh.service`              | `/usr/sbin/sshd -D`                          |
 | `getty-tty1`       | `getty@tty1.service`       | `/sbin/agetty --noclear tty1 linux`          |
@@ -150,7 +150,7 @@ de la mitad de arriba **no** — no las agregues.
 | acción                       | systemd                              | arje                                                    |
 | ---------------------------- | ------------------------------------ | ------------------------------------------------------- |
 | Ver servicios activos        | `systemctl list-units --state=running` | `brahman-status` + `busctl list-entes`               |
-| Ver logs                     | `journalctl -u foo`                  | `ente-journalctl` (TODO en CLI; por ahora `dmesg`)      |
+| Ver logs                     | `journalctl -u foo`                  | `arje-journalctl` (TODO en CLI; por ahora `dmesg`)      |
 | Restart un servicio          | `systemctl restart foo`              | matar el PID (`brain` lo reanuda por `Supervision`)     |
 | Habilitar/Deshabilitar       | `systemctl enable/disable`           | editar `/ente/seed.card.json` + reboot                  |
 | Ver dependencias             | `systemctl list-dependencies foo`    | `brahman-status` muestra references y flow matches      |
@@ -163,7 +163,7 @@ de la mitad de arriba **no** — no las agregues.
 - **udev / hotplug**: arje captura uevents (vía `spawn_uevent_stream`),
   pero no hay reglas declarativas todavía. Para boot inicial, el
   initramfs nativo ya hizo el cold-plug, así que no es bloqueante.
-- **Timers** (cron-like): `ente-timer-compat` existe pero no está en la
+- **Timers** (cron-like): `arje-timer-compat` existe pero no está en la
   seed host por default. Agregalo si querés `*.timer` units migradas.
 - **Service generators**: no hay equivalente a `systemd-fstab-generator`
   ni `systemd-getty-generator`. Tu seed los declara explícitamente.
@@ -198,7 +198,7 @@ default:
 sudo grep -E "^\s*menuentry " /boot/grub/grub.cfg | nl
 
 # Ponerlo como default (usa el índice del menú o el title exacto)
-sudo grub-set-default "arje (init=/sbin/ente-zero) — kernel $(uname -r)"
+sudo grub-set-default "arje (init=/sbin/arje-zero) — kernel $(uname -r)"
 ```
 
 Mantené la entrada systemd como rescue. Si querés acortar la lista de
@@ -211,7 +211,7 @@ Si arje no levanta el primer boot:
 
 1. Volver a GRUB → entrada systemd → bootea normal.
 2. `journalctl --boot=-1` (logs del intento previo).
-3. Buscar `ente-zero` o `Tarjeta Semilla`. Si nada → el ejecutable no
+3. Buscar `arje-zero` o `Tarjeta Semilla`. Si nada → el ejecutable no
    se lanzó (kernel panic temprano, falta `init=` correcto, etc.).
 4. Si arrancó pero falló alguna Card: la próxima vez, antes de reboot:
    ```bash
diff --git a/docs/changelog/akasha.md b/docs/changelog/chasqui.md
similarity index 99%
rename from docs/changelog/akasha.md
rename to docs/changelog/chasqui.md
index 7a613a2..6b87e87 100644
--- a/docs/changelog/akasha.md
+++ b/docs/changelog/chasqui.md
@@ -1,6 +1,6 @@
-# Changelog — akasha
+# Changelog — chasqui
 
-Explorador semántico de Mónadas. Renombrado de `nouser` el 2026-05-19.
+Explorador semántico de Mónadas. Renombrado de `nouser` → `akasha` → el 2026-05-19.
 
 ### feat(nouser-explorer): integración al stack yahweh themed
 Iter 10. `nouser-explorer` (la app paralela a `nakui-explorer`
diff --git a/scripts/rename-chasqui.py b/scripts/rename-chasqui.py
new file mode 100644
index 0000000..8a58255
--- /dev/null
+++ b/scripts/rename-chasqui.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python3
+"""
+Rename akasha → chasqui (2026-05-19, segunda iteración del día).
+
+El rename de la mañana (nouser → akasha) se revierte parcialmente: el
+explorador de nómadas pasa a chasqui (Inca: mensajero corredor) para
+liberar el nombre `akasha` que queda reservado para el módulo de notas
+`akashi` (planeado, sin código aún).
+
+Reusa el patrón de scripts/reorg.py:
+  1. git mv directorios
+  2. package names en Cargo.toml
+  3. paths relativos en Cargo.toml
+  4. imports `use akasha_::` en .rs
+  5. workspace root Cargo.toml
+
+Uso:
+  python3 scripts/rename-chasqui.py --dry-run
+  python3 scripts/rename-chasqui.py
+"""
+
+import os, re, subprocess, sys
+from pathlib import Path
+
+ROOT = Path("/home/sergio/brahman")
+DRY = "--dry-run" in sys.argv
+
+MOVES: dict[str, str] = {
+    "crates/modules/akasha":           "crates/modules/chasqui",
+    "crates/apps/akasha-explorer":     "crates/apps/chasqui-explorer",
+}
+
+# Sub-crates dentro de modules/akasha/ no se renombran (mantienen card/core/nous/...);
+# solo cambia el directorio padre y los nombres de paquete.
+
+PKG_RENAMES: dict[str, str] = {
+    "akasha-card":         "chasqui-card",
+    "akasha-core":         "chasqui-core",
+    "akasha-nous":         "chasqui-nous",
+    "akasha-nous-mock":    "chasqui-nous-mock",
+    "akasha-nous-real":    "chasqui-nous-real",
+    "akasha-explorer":     "chasqui-explorer",
+    # Binario umbrella (bin name = "akasha" en akasha-core/Cargo.toml)
+    "akasha":              "chasqui",
+}
+
+def sh(cmd, check=True):
+    if DRY:
+        print(f"  DRY: {' '.join(cmd)}")
+        return None
+    return subprocess.run(cmd, check=check, cwd=str(ROOT))
+
+def git_mv(src: str, dst: str):
+    src_p = ROOT / src
+    dst_p = ROOT / dst
+    if not src_p.exists():
+        print(f"  SKIP {src} (no existe)")
+        return
+    if dst_p.exists():
+        print(f"  WARN {dst} ya existe — saltando")
+        return
+    dst_p.parent.mkdir(parents=True, exist_ok=True)
+    sh(["git", "mv", src, dst])
+
+def all_cargo_tomls() -> list[Path]:
+    return [p for p in (ROOT / "crates").rglob("Cargo.toml") if "target" not in p.parts]
+
+def all_rs() -> list[Path]:
+    return [p for p in (ROOT / "crates").rglob("*.rs") if "target" not in p.parts]
+
+CURRENT_TO_OLD = {new: old for old, new in MOVES.items()}
+
+def owner_old_for(toml: Path) -> str:
+    cur = str(toml.parent.relative_to(ROOT))
+    # Match cualquier prefix mapeado
+    for new, old in CURRENT_TO_OLD.items():
+        if cur == new or cur.startswith(new + "/"):
+            return cur.replace(new, old, 1)
+    return cur
+
+def resolve_canon(base_dir: str, rel: str) -> str | None:
+    try:
+        return str((ROOT / base_dir / rel).resolve().relative_to(ROOT))
+    except ValueError:
+        return None
+
+def rewrite_paths_in_toml(toml: Path):
+    text = toml.read_text()
+    owner_old = owner_old_for(toml)
+    owner_new = str(toml.parent.relative_to(ROOT))
+
+    def map_target(old_tgt: str) -> str:
+        for old_prefix, new_prefix in MOVES.items():
+            if old_tgt == old_prefix or old_tgt.startswith(old_prefix + "/"):
+                return old_tgt.replace(old_prefix, new_prefix, 1)
+        return old_tgt
+
+    def repl(m: re.Match) -> str:
+        rel_in_file = m.group(1)
+        for base in (owner_old, owner_new):
+            tgt = resolve_canon(base, rel_in_file)
+            if tgt is None:
+                continue
+            new_tgt = map_target(tgt)
+            if (ROOT / new_tgt).exists() or new_tgt != tgt:
+                new_rel = os.path.relpath(str(ROOT / new_tgt), str(ROOT / owner_new))
+                return f'path = "{new_rel}"'
+        return m.group(0)
+
+    new_text = re.sub(r'path\s*=\s*"([^"]+)"', repl, text)
+    if new_text != text:
+        if DRY:
+            print(f"  DRY paths: {toml.relative_to(ROOT)}")
+        else:
+            toml.write_text(new_text)
+
+def rewrite_pkg_names_in_toml(toml: Path):
+    text = toml.read_text()
+    orig = text
+    for old, new in sorted(PKG_RENAMES.items(), key=lambda kv: -len(kv[0])):
+        text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text)
+        text = re.sub(rf'(\bpackage\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text)
+        text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2',
+                      text, flags=re.MULTILINE)
+        text = re.sub(rf'"dep:{re.escape(old)}"', f'"dep:{new}"', text)
+        text = re.sub(rf'"{re.escape(old)}/', f'"{new}/', text)
+        text = re.sub(rf'"{re.escape(old)}"', f'"{new}"', text)
+    if text != orig:
+        if DRY:
+            print(f"  DRY names: {toml.relative_to(ROOT)}")
+        else:
+            toml.write_text(text)
+
+USE_RENAMES = {k.replace("-", "_"): v.replace("-", "_") for k, v in PKG_RENAMES.items()}
+
+def rewrite_imports_in_rs(rs: Path):
+    text = rs.read_text()
+    orig = text
+    for old, new in USE_RENAMES.items():
+        text = re.sub(rf'(?<![A-Za-z0-9_]){re.escape(old)}(?![A-Za-z0-9_])', new, text)
+    if text != orig:
+        if DRY:
+            print(f"  DRY imports: {rs.relative_to(ROOT)}")
+        else:
+            rs.write_text(text)
+
+def rewrite_workspace_toml():
+    p = ROOT / "Cargo.toml"
+    text = p.read_text()
+    orig = text
+    for old, new in MOVES.items():
+        text = text.replace(f'"{old}"', f'"{new}"')
+        text = text.replace(f'"{old}/', f'"{new}/')
+    for old, new in PKG_RENAMES.items():
+        text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2',
+                      text, flags=re.MULTILINE)
+    # Comentario del workspace que dice "akasha" → "chasqui"
+    text = text.replace(
+        "# modules/akasha/ — Explorador semántico de Mónadas (era nouser)",
+        "# modules/chasqui/ — Explorador semántico de nómadas (ex-nouser, ex-akasha)"
+    )
+    if text != orig:
+        if DRY:
+            print("  DRY workspace toml")
+        else:
+            p.write_text(text)
+
+def run():
+    print(f"=== rename-chasqui.py (DRY={DRY}) ===")
+    print(f"  {len(MOVES)} moves, {len(PKG_RENAMES)} pkg renames")
+
+    print("\n-- step 1: git mv --")
+    for old, new in MOVES.items():
+        git_mv(old, new)
+
+    print("\n-- step 2: package names --")
+    for toml in all_cargo_tomls():
+        rewrite_pkg_names_in_toml(toml)
+
+    print("\n-- step 3: paths relativos --")
+    for toml in all_cargo_tomls():
+        rewrite_paths_in_toml(toml)
+
+    print("\n-- step 4: imports en .rs --")
+    for rs in all_rs():
+        rewrite_imports_in_rs(rs)
+
+    print("\n-- step 5: workspace Cargo.toml --")
+    rewrite_workspace_toml()
+
+    print("\nOK")
+
+if __name__ == "__main__":
+    run()
diff --git a/scripts/rename-fase-a.py b/scripts/rename-fase-a.py
new file mode 100644
index 0000000..554434b
--- /dev/null
+++ b/scripts/rename-fase-a.py
@@ -0,0 +1,224 @@
+#!/usr/bin/env python3
+"""
+Fase A · rename batch (2026-05-19):
+  - ente-* → arje-*  (25 crates: protocol/init/runtime/compat)
+  - vista  → revista (vista-core/web → revista-core/web)
+  - pluma  → fana    (pluma-md → fana-md, pluma-reader-web → fana-md-reader-web)
+
+Reusa el patrón de scripts/reorg.py + rename-chasqui.py.
+
+Uso:
+  python3 scripts/rename-fase-a.py --dry-run
+  python3 scripts/rename-fase-a.py
+"""
+
+import os, re, subprocess, sys
+from pathlib import Path
+
+ROOT = Path("/home/sergio/brahman")
+DRY = "--dry-run" in sys.argv
+
+# ============================================================
+# MOVES — leaf crate dirs, old → new (git_mv crea dirs padre)
+# ============================================================
+MOVES: dict[str, str] = {}
+
+ENTE = {
+    "protocol": ["ente-card"],
+    "init":     ["ente-zero", "ente-kernel", "ente-soma",
+                 "ente-snapshot", "ente-incarnate"],
+    "runtime":  ["ente-bus", "ente-cas", "ente-wasm",
+                 "ente-brain", "ente-echo"],
+    "compat":   ["ente-logind-compat", "ente-hostnamed-compat",
+                 "ente-timedated-compat", "ente-localed-compat",
+                 "ente-journald-compat", "ente-resolved-compat",
+                 "ente-polkit-compat", "ente-machined-compat",
+                 "ente-systemd1-compat", "ente-notify-compat",
+                 "ente-timer-compat", "ente-tmpfiles-compat",
+                 "ente-binfmt-compat", "ente-policy-provider"],
+}
+for layer, crates in ENTE.items():
+    for c in crates:
+        new = c.replace("ente-", "arje-", 1)
+        MOVES[f"crates/{layer}/{c}"] = f"crates/{layer}/{new}"
+
+# vista → revista
+MOVES["crates/modules/vista/vista-core"] = "crates/modules/revista/revista-core"
+MOVES["crates/modules/vista/vista-web"]  = "crates/modules/revista/revista-web"
+# pluma → fana
+MOVES["crates/modules/pluma/pluma-md"]         = "crates/modules/fana/fana-md"
+MOVES["crates/modules/pluma/pluma-reader-web"] = "crates/modules/fana/fana-md-reader-web"
+
+# SDD.md de los módulos renombrados
+SDD_MOVES = {
+    "crates/modules/vista/SDD.md": "crates/modules/revista/SDD.md",
+    "crates/modules/pluma/SDD.md": "crates/modules/fana/SDD.md",
+}
+
+# ============================================================
+# PKG_RENAMES — nombres de paquete viejo → nuevo
+# ============================================================
+PKG_RENAMES: dict[str, str] = {}
+for layer, crates in ENTE.items():
+    for c in crates:
+        PKG_RENAMES[c] = c.replace("ente-", "arje-", 1)
+PKG_RENAMES["ente-journalctl"] = "arje-journalctl"   # bin name especial
+PKG_RENAMES["vista-core"] = "revista-core"
+PKG_RENAMES["vista-web"]  = "revista-web"
+PKG_RENAMES["pluma-md"]   = "fana-md"
+PKG_RENAMES["pluma-reader-web"] = "fana-md-reader-web"
+
+# ============================================================
+# Helpers
+# ============================================================
+def sh(cmd, check=True):
+    if DRY:
+        print(f"  DRY: {' '.join(cmd)}")
+        return None
+    return subprocess.run(cmd, check=check, cwd=str(ROOT))
+
+def git_mv(src: str, dst: str):
+    src_p, dst_p = ROOT / src, ROOT / dst
+    if not src_p.exists():
+        print(f"  SKIP {src} (no existe)")
+        return
+    if dst_p.exists():
+        print(f"  WARN {dst} ya existe — saltando")
+        return
+    dst_p.parent.mkdir(parents=True, exist_ok=True)
+    sh(["git", "mv", src, dst])
+
+def all_cargo_tomls():
+    return [p for p in (ROOT / "crates").rglob("Cargo.toml") if "target" not in p.parts]
+
+def all_rs():
+    return [p for p in (ROOT / "crates").rglob("*.rs") if "target" not in p.parts]
+
+CURRENT_TO_OLD = {new: old for old, new in MOVES.items()}
+
+def owner_old_for(toml: Path) -> str:
+    cur = str(toml.parent.relative_to(ROOT))
+    return CURRENT_TO_OLD.get(cur, cur)
+
+def resolve_canon(base_dir: str, rel: str):
+    try:
+        return str((ROOT / base_dir / rel).resolve().relative_to(ROOT))
+    except ValueError:
+        return None
+
+def map_target(old_tgt: str) -> str:
+    return MOVES.get(old_tgt, old_tgt)
+
+def rewrite_paths_in_toml(toml: Path):
+    text = toml.read_text()
+    owner_old = owner_old_for(toml)
+    owner_new = str(toml.parent.relative_to(ROOT))
+
+    def repl(m):
+        rel_in_file = m.group(1)
+        for base in (owner_old, owner_new):
+            tgt = resolve_canon(base, rel_in_file)
+            if tgt is None:
+                continue
+            new_tgt = map_target(tgt)
+            if (ROOT / new_tgt).exists() or new_tgt != tgt:
+                new_rel = os.path.relpath(str(ROOT / new_tgt), str(ROOT / owner_new))
+                return f'path = "{new_rel}"'
+        return m.group(0)
+
+    new_text = re.sub(r'path\s*=\s*"([^"]+)"', repl, text)
+    if new_text != text:
+        if DRY: print(f"  DRY paths: {toml.relative_to(ROOT)}")
+        else:   toml.write_text(new_text)
+
+def rewrite_pkg_names_in_toml(toml: Path):
+    text = toml.read_text()
+    orig = text
+    for old, new in sorted(PKG_RENAMES.items(), key=lambda kv: -len(kv[0])):
+        old_us, new_us = old.replace("-", "_"), new.replace("-", "_")
+        # name = "old" / "old_us"  (package, lib, bin)
+        text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text)
+        text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old_us)}"', rf'\1"{new_us}"', text)
+        text = re.sub(rf'(\bpackage\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text)
+        # dep key al inicio de línea
+        text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2',
+                      text, flags=re.MULTILINE)
+        # features / strings
+        text = re.sub(rf'"dep:{re.escape(old)}"', f'"dep:{new}"', text)
+        text = re.sub(rf'"{re.escape(old)}/', f'"{new}/', text)
+        text = re.sub(rf'"{re.escape(old)}"', f'"{new}"', text)
+    if text != orig:
+        if DRY: print(f"  DRY names: {toml.relative_to(ROOT)}")
+        else:   toml.write_text(text)
+
+USE_RENAMES = {k.replace("-", "_"): v.replace("-", "_") for k, v in PKG_RENAMES.items()}
+
+def rewrite_imports_in_rs(rs: Path):
+    text = rs.read_text()
+    orig = text
+    for old, new in sorted(USE_RENAMES.items(), key=lambda kv: -len(kv[0])):
+        text = re.sub(rf'(?<![A-Za-z0-9_]){re.escape(old)}(?![A-Za-z0-9_])', new, text)
+    if text != orig:
+        if DRY: print(f"  DRY imports: {rs.relative_to(ROOT)}")
+        else:   rs.write_text(text)
+
+def rewrite_workspace_toml():
+    p = ROOT / "Cargo.toml"
+    text = p.read_text()
+    orig = text
+    for old, new in MOVES.items():
+        text = text.replace(f'"{old}"', f'"{new}"')
+    for old, new in PKG_RENAMES.items():
+        text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2',
+                      text, flags=re.MULTILINE)
+    # Comentarios de sección
+    text = text.replace("(era yahweh)", "(era yahweh)")  # no-op, placeholder
+    text = text.replace("# modules/vista/ — Deck horizontal swipe (Flutter PageView)",
+                        "# modules/revista/ — Deck horizontal swipe (Flutter PageView)")
+    text = text.replace("# modules/pluma/ — Markdown agnóstico + visor web",
+                        "# modules/fana/ — Writer DAG editor (absorbe pluma)")
+    if text != orig:
+        if DRY: print("  DRY workspace toml")
+        else:   p.write_text(text)
+
+def cleanup_empty(rel_dir: str):
+    d = ROOT / rel_dir
+    if d.exists() and d.is_dir() and not any(d.iterdir()):
+        if DRY: print(f"  DRY rmdir {rel_dir}")
+        else:   d.rmdir()
+
+def run():
+    print(f"=== rename-fase-a.py (DRY={DRY}) ===")
+    print(f"  {len(MOVES)} moves, {len(PKG_RENAMES)} pkg renames")
+
+    print("\n-- step 1: git mv crates --")
+    for old, new in MOVES.items():
+        git_mv(old, new)
+
+    print("\n-- step 2: git mv SDDs --")
+    for old, new in SDD_MOVES.items():
+        git_mv(old, new)
+
+    print("\n-- step 3: cleanup dirs vacíos --")
+    cleanup_empty("crates/modules/vista")
+    cleanup_empty("crates/modules/pluma")
+
+    print("\n-- step 4: package names --")
+    for toml in all_cargo_tomls():
+        rewrite_pkg_names_in_toml(toml)
+
+    print("\n-- step 5: paths relativos --")
+    for toml in all_cargo_tomls():
+        rewrite_paths_in_toml(toml)
+
+    print("\n-- step 6: imports .rs --")
+    for rs in all_rs():
+        rewrite_imports_in_rs(rs)
+
+    print("\n-- step 7: workspace Cargo.toml --")
+    rewrite_workspace_toml()
+
+    print("\nOK")
+
+if __name__ == "__main__":
+    run()
diff --git a/vamos.txt b/vamos.txt
new file mode 100644
index 0000000..7f4f6ee
--- /dev/null
+++ b/vamos.txt
@@ -0,0 +1,808 @@
+
+● Reporte técnico — Monorepo Brahman
+
+  Estado al 2026-05-19 · 126 crates · ~78,000 LOC · cargo check --workspace verde
+
+  ---
+  0 · Panorama
+
+  Sistema operativo fractal en Rust: cada cómputo se modela como Card, los módulos
+   se acoplan sólo vía contratos serializables (brahman-card), el aislamiento es
+  uniforme (ente-incarnate), y el routing es un service-locator de tipos
+  (brahman-broker). El monorepo se reorganizó hoy en 6 capas físicas:
+
+  crates/
+  ├── protocol/    9 crates · contratos + routing
+  ├── init/        5 crates · PID 1 + encarnación Linux
+  ├── runtime/     5 crates · bus + cas + wasm + brain
+  ├── compat/    14 crates · shims D-Bus systemd
+  ├── modules/   62 crates · funcionalidad de dominio
+  └── apps/      23 crates · binarios finales
+
+  ---
+  1 · Capa protocol/ — 6,260 LOC · ★★★★☆
+
+  ┌─────────────────┬──────┬──────┬──────┬──────────────────────────────────┐
+  │      crate      │ LOC  │ test │ TODO │               rol                │
+  │                 │      │  s   │  s   │                                  │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-card    │ 1,29 │ sí   │ 5    │ Card { soma, payload, flow,      │
+  │                 │ 0    │      │      │ permissions, ... }               │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-card-wi │ 165  │ sí   │ 0    │ Extracción WIT desde componentes │
+  │ t               │      │      │      │  WASM                            │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-cards   │ 643  │ sí   │ 2    │ Templates Nickel + helpers       │
+  │                 │      │      │      │ consumer/producer/broker         │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-handsha │ 2,94 │ sí   │ 10   │ Init↔módulo: Hello/Ping/ListSess │
+  │ ke              │ 2    │      │      │ ions/ListMatches                 │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-broker  │ 995  │ sí   │ 2    │ Matching híbrido (Exact +        │
+  │                 │      │      │      │ Structural)                      │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-admin   │ 225  │ no   │ 0    │ Socket admin para snapshots      │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-sidecar │ 565  │ sí   │ 0    │ spawn(card) para apps            │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ brahman-net     │ 423  │ no   │ 0    │ libp2p                           │
+  │                 │      │      │      │ (TCP+noise+yamux+kad+identify)   │
+  ├─────────────────┼──────┼──────┼──────┼──────────────────────────────────┤
+  │ ente-card       │ —    │ —    │ —    │ Alias legacy (re-export)         │
+  └─────────────────┴──────┴──────┴──────┴──────────────────────────────────┘
+
+  Hecho. Handshake fase 1–3 (libp2p stream → DHT discovery → trust Ed25519).
+  Broker emparejando con dos estrategias. Sidecar reusable por todas las apps.
+  Allowlist/denylist con hot reload <250ms.
+
+  Pendiente. Fase 4 trust: capabilities revocables, beyond-peer (delegación),
+  métricas exportables. Tests faltan en brahman-admin (lo único sin cobertura).
+
+  ---
+  2 · Capa init/ — ~3,600 LOC · ★★★★☆
+
+  ┌────────────────┬──────┬────────────────────────────────────────────────────┐
+  │     crate      │ tipo │                        rol                         │
+  ├────────────────┼──────┼────────────────────────────────────────────────────┤
+  │ ente-zero      │ bin  │ PID 1: reap loop + bus + handshake server +        │
+  │                │      │ brahman-net opc.                                   │
+  ├────────────────┼──────┼────────────────────────────────────────────────────┤
+  │ ente-kernel    │ lib  │ bootstrap_kernel_surface, subreaper,               │
+  │                │      │ SIGCHLD/uevent streams                             │
+  ├────────────────┼──────┼────────────────────────────────────────────────────┤
+  │ ente-soma      │ lib  │ Wrapper ~30 LOC sobre ente-incarnate (compat API   │
+  │                │      │ histórica)                                         │
+  ├────────────────┼──────┼────────────────────────────────────────────────────┤
+  │ ente-incarnate │ lib  │ clone(2) + namespaces + cgroup + rlimits + cpu +   │
+  │                │      │ child_pre_exec                                     │
+  ├────────────────┼──────┼────────────────────────────────────────────────────┤
+  │ ente-snapshot  │ lib  │ FractalSnapshot JSON (v1–v4 con forward-compat)    │
+  └────────────────┴──────┴────────────────────────────────────────────────────┘
+
+  Hecho. Bootea bare metal + QEMU + initramfs (documentado en docs/arje-boot.md).
+  ente-incarnate con builder pattern, ChildStdio + ChildPreExec declarativo,
+  async-signal-safe. Snapshot v4 con replay buffer persistido + live pipelines.
+
+  Pendiente. Cobertura de tests sobre snapshot restore con stale fds. Validación
+  de re-encarnación tras restore.
+
+  ---
+  3 · Capa runtime/ — ~3,400 LOC · ★★★☆☆
+
+  ┌────────────┬───────────────────────────────────────────────────────┬───────┐
+  │   crate    │                          rol                          │ TODOs │
+  ├────────────┼───────────────────────────────────────────────────────┼───────┤
+  │ ente-bus   │ Unix SOCK_STREAM + postcard.                          │ 1     │
+  │            │ Announce/Invoke/ListEntes                             │       │
+  ├────────────┼───────────────────────────────────────────────────────┼───────┤
+  │ ente-cas   │ SHA-256 content-addressed: blobs Wasm + audit log     │ 0     │
+  ├────────────┼───────────────────────────────────────────────────────┼───────┤
+  │ ente-wasm  │ Encarna Payload::Wasm vía wasmi en thread dedicado    │ 1     │
+  ├────────────┼───────────────────────────────────────────────────────┼───────┤
+  │ ente-brain │ Rule engine + observer estadístico + audit chain      │ 11    │
+  ├────────────┼───────────────────────────────────────────────────────┼───────┤
+  │ ente-echo  │ Ente prueba — Capability::Endpoint(echo)              │ 1     │
+  └────────────┴───────────────────────────────────────────────────────┴───────┘
+
+  Hecho. Bus + CAS + wasm operativos. SO_PEERCRED para identidad. Audit chain
+  hashea cada evento del bus al CAS.
+
+  Pendiente crítico. ente-brain concentra el 78% de la deuda técnica de esta capa:
+   el rule engine declarativo está parcialmente implementado, falta el evaluador
+  completo de policies + observer cross-ente.
+
+  ---
+  4 · Capa compat/ — ~5,000 LOC · ★★★☆☆
+
+  14 shims D-Bus operativos como binarios standalone. Suficiente para que
+  desktop-file-utils, xdg-open, gnome-session, login managers y CLIs systemd-aware
+   no rompan al arrancar sobre ente-zero.
+
+  Hecho. Cada shim reclama un well-known name (org.freedesktop.X1), implementa la
+  interfaz mínima del ecosistema, loggea al audit de ente-brain.
+
+  Pendiente. Métodos avanzados — Inhibit/Sleep hooks en logind, SetVariable en
+  localed, MachineImage operations en machined. Necesarios para correr GNOME Shell
+   end-to-end sin parches.
+
+  ---
+  5 · modules/semantic_dht/ (minga) — 5,091 LOC · ★★★★☆
+
+  ┌─────────────┬───────┬──────────────────────────────────────────────┐
+  │    crate    │  LOC  │                     rol                      │
+  ├─────────────┼───────┼──────────────────────────────────────────────┤
+  │ minga-core  │ 3,085 │ Parser tree-sitter + α-hashing (5 lenguajes) │
+  ├─────────────┼───────┼──────────────────────────────────────────────┤
+  │ minga-p2p   │ 1,105 │ libp2p kad + bootstrap + provider records    │
+  ├─────────────┼───────┼──────────────────────────────────────────────┤
+  │ minga-store │ 425   │ Sled backend para índice local               │
+  ├─────────────┼───────┼──────────────────────────────────────────────┤
+  │ minga-cli   │ 474   │ CLI: index, search, peers, bootstrap         │
+  ├─────────────┼───────┼──────────────────────────────────────────────┤
+  │ minga-vfs   │ 2     │ STUB — Mount FUSE de mónadas remotas         │
+  └─────────────┴───────┴──────────────────────────────────────────────┘
+
+  Hecho. α-hashing cubre Rust (let-else, if-let, or-patterns, let-chains), Python,
+   TypeScript, JavaScript, Go. Indexa repos reales. DHT publica + descubre via
+  kad. 15 TODOs en core (más patterns para edge cases).
+
+  Bloqueante para uso end-to-end. minga-vfs es stub de 2 LOC. Sin él no hay forma
+  de montar las mónadas indexadas como filesystem navegable.
+
+  ---
+  6 · modules/nahual/ (ex-yahweh) — 15,968 LOC · ★★★★★
+
+  Framework GPUI backbone del monorepo.
+
+  Libs (núcleo, 8 crates): core, theme, launcher, bus, meta-schema, meta-runtime,
+  providers/{fs,sqlite}. Tema persistente entre runs, MetaUi declarativa,
+  providers de datos.
+
+  Widgets (12 crates): tree, container_core, splitter, tabs, tiled, text_input,
+  meta-form, banner, card, stat-card, app-header, theme-switcher. Cada uno <500
+  LOC, reusable individualmente.
+
+  Hecho. Tests E2E con gpui::TestAppContext. nahual-shell define el patrón
+  estándar de explorer (sidebar+main+status+hot-reload). Consumido por 5 explorers
+   + cosmobiologia.
+
+  Pendiente. Mantenimiento. Documentar el patrón "explorer estándar" como guía de
+  extensión.
+
+  ---
+  7 · modules/pineal/ (ex-lapaloma) — ~3,900 LOC · ★★★☆☆
+
+  13 crates de data-viz con backends pluggables (CPU+GPUI, GPU stub, SVG export).
+
+  Funcionales (5 charts): core (878), render (386), cartesian (1397), financial
+  (688), stream (231), phosphor (312), export.
+
+  Stubs (<50 LOC c/u): polar, heatmap, treemap, flow, mesh.
+
+  Hecho. Trait Canvas agnóstico, RenderPlan con RenderCmd variants, backend GPUI
+  completo. Cartesian con axes + viewport + series. Financial con candlestick +
+  OHLC. Streaming a 60Hz con phosphor trail (alpha decay).
+
+  Pendiente. Cerrar los 5 stubs en orden polar → heatmap → treemap → flow → mesh.
+
+  ---
+  8 · modules/nakui/ — 7,063 LOC · ★★★★☆
+
+  ERP categórico: entidades = objetos, morfismos = operaciones de negocio.
+
+  Hecho. Schema declarativo Nickel (migrado de KCL). Event log con replay al
+  startup. Snapshot/compaction automático. Validación FieldKind cross-field. 6
+  módulos ERP estándar incluidos como ejemplos. CRUD completo + Action::Morphism
+  wired al pipeline.
+
+  Pendiente. Documentar el patrón de morfismos en Nickel como guía para extender
+  el ERP a dominios nuevos.
+
+  ---
+  9 · modules/akasha/ (ex-nouser) — 4,395 LOC · ★★★☆☆
+
+  ┌──────────────────┬───────┬────────────────────────────────────────────────┐
+  │      crate       │  LOC  │                      rol                       │
+  ├──────────────────┼───────┼────────────────────────────────────────────────┤
+  │ akasha-core      │ 2,215 │ Daemon: scanner FS + DB sled + cluster k-means │
+  ├──────────────────┼───────┼────────────────────────────────────────────────┤
+  │ akasha-card      │ 709   │ Card del daemon + capabilities                 │
+  ├──────────────────┼───────┼────────────────────────────────────────────────┤
+  │ akasha-nous      │ (lib) │ Protocolo Nous (JSON line-delimited)           │
+  ├──────────────────┼───────┼────────────────────────────────────────────────┤
+  │ akasha-nous-mock │ (bin) │ Embeddings deterministas (testing)             │
+  ├──────────────────┼───────┼────────────────────────────────────────────────┤
+  │ akasha-nous-real │ 642   │ Embeddings con fastembed + ort                 │
+  └──────────────────┴───────┴────────────────────────────────────────────────┘
+
+  Hecho. Pipeline scan+embed+cluster funcional. notify watcher con debounce +
+  re-publish al broker. Hidratación vía sled + path_hint. Centroid model
+  versionado. Cache de embeddings con write-through al CAS de arje.
+
+  Pendiente crítico. Tests sobre cluster.rs (k-means actual es naive). Manejo de
+  drift de embeddings cuando cambia el modelo subyacente.
+
+  ---
+  10 · modules/shuma/ (ex-shipote) — 6,907 LOC · ★★★★☆
+
+  ┌────────────────┬───────┬───────────────────────────────────────────────────┐
+  │     crate      │  LOC  │                        rol                        │
+  ├────────────────┼───────┼───────────────────────────────────────────────────┤
+  │ shuma-core     │ 3,518 │ WorkspaceManager + pipeline + persist +           │
+  │                │       │ flow_channel                                      │
+  ├────────────────┼───────┼───────────────────────────────────────────────────┤
+  │ shuma-card     │ 655   │ WorkspaceSpec + PipelineSpec + ExitPolicy +       │
+  │                │       │ DiscernPolicy                                     │
+  ├────────────────┼───────┼───────────────────────────────────────────────────┤
+  │ shuma-protocol │ 444   │ Wire postcard length-prefixed                     │
+  ├────────────────┼───────┼───────────────────────────────────────────────────┤
+  │ shuma-discern  │ 307   │ DiscernPipeline + MagicBytes/Card/Json/Toml/Utf8  │
+  │                │       │ probes                                            │
+  └────────────────┴───────┴───────────────────────────────────────────────────┘
+
+  Hecho. 20 fases completadas (A→S, ver docs/changelog/shuma.md):
+  - A: 9 crates iniciales + smoke E2E
+  - B: pipelines con discern enrichment
+  - C: pipeline aislado con O_CLOEXEC + TTL + persistencia
+  - D: snapshot v2 + saved pipelines + log capture
+  - E: stderr separado + fan-out 1→N + tap→broker
+  - F: data plane vivo (FlowChannel con accept loop)
+  - G: replay buffer + templating + child_pre_exec declarativo
+  - H: stats memory+CPU + stop graceful + replay configurable
+  - I: memory.peak + pipeline stop selectivo + sparkline shell
+  - J: CPU% multi-core + pipeline --tail + replay por bytes
+  - K: cpu_cores + quota report + restart-on-failure
+  - L: quota enforcement + cgroup memory.max + pipeline restart
+  - M: backoff exponencial + quota breaches card + logs --follow
+  - N: drain shutdown + snapshot v3 live_pipelines + batched query
+  - O: collision detection sockets + stats history server-side
+  - P: throughput metering + stats history persistido + auth SO_PEERCRED
+  - Q: throughput card + rate-limit token-bucket + snapshot incremental
+  - R: health endpoint + audit log tracing + token bucket real
+  - S: audit log persistente + HTTP/JSON gateway
+
+  Pendiente. Auth en gateway (token, mTLS). Rotación de audit.log con N backups.
+  WIT contracts reales. shipote-shell click handler. Métricas Prometheus.
+
+  ---
+  11 · modules/gioser/ — 2,535 LOC · ★★★★★
+
+  5 crates agnósticos (geom, physics, palette, shaders, canvas-web) + cdylib
+  apps/gioser-web. Landing personal con chacana 3D + tilt físico al mouse + 4 tips
+   elementales en Markdown.
+
+  Hecho. Operativa. Build pipeline scripts/build-gioser-web.sh. Tests sobre
+  geom/physics/palette puros. 0 TODOs.
+
+  ---
+  12 · modules/pluma/ — 178 LOC · ★★★☆☆
+
+  ┌──────────────────┬─────┬───────────────────────────────────────┐
+  │      crate       │ LOC │                  rol                  │
+  ├──────────────────┼─────┼───────────────────────────────────────┤
+  │ pluma-md         │ 90  │ Wrapper pulldown-cmark con AST simple │
+  ├──────────────────┼─────┼───────────────────────────────────────┤
+  │ pluma-reader-web │ 88  │ Reader DOM: fetch + inject + theming  │
+  └──────────────────┴─────┴───────────────────────────────────────┘
+
+  Pendiente. AST con inline elements (links, emphasis) accesibles desde Rust. Sin
+  tests (todavía).
+
+  ---
+  13 · modules/vista/ — 530 LOC · ★★★★☆ (NUEVO HOY)
+
+  ┌────────────┬─────┬───────┬────────────────────────────────────────────┐
+  │   crate    │ LOC │ tests │                    rol                     │
+  ├────────────┼─────┼───────┼────────────────────────────────────────────┤
+  │ vista-core │ 175 │ 5/5   │ DeckState agnóstico + snap + drag decision │
+  ├────────────┼─────┼───────┼────────────────────────────────────────────┤
+  │ vista-web  │ 355 │ —     │ Binding DOM (PointerEvent → DeckState)     │
+  └────────────┴─────┴───────┴────────────────────────────────────────────┘
+
+  Hecho hoy. Lógica de snap (umbral 8px + bias 1.3) y máquina de estados
+  (pointer_down/move/end → DragOutcome) extraída a core agnóstico. vista-web pasa
+  a binding fino. Reusable en backends no-web.
+
+  ---
+  14 · modules/barra/ — 280 LOC · ★★★★☆ (NUEVO HOY)
+
+  ┌────────────┬─────┬───────┬─────────────────────────────────────────────┐
+  │   crate    │ LOC │ tests │                     rol                     │
+  ├────────────┼─────┼───────┼─────────────────────────────────────────────┤
+  │ barra-core │ 90  │ 5/5   │ Task + render_html + sanitize + escape      │
+  ├────────────┼─────┼───────┼─────────────────────────────────────────────┤
+  │ barra-web  │ 190 │ —     │ Mount sobre <ul> + click delegate + centers │
+  └────────────┴─────┴───────┴─────────────────────────────────────────────┘
+
+  Hecho hoy. Modelo Task + render HTML puro extraído a core. barra-web mantiene
+  mount/click/lookups DOM intrínsecos.
+
+  ---
+  15 · modules/cosmobiologia/ — 21,502 LOC · ★★★☆☆
+
+  Crate más grande del monorepo. 11 sub-crates.
+
+  ┌──────────────────────────────────┬────────┬─────────┬───────┐
+  │              crate               │  LOC   │  tests  │ TODOs │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-canvas             │ 2,850  │ no      │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-engine             │ 2,687  │ sí      │ 12    │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-tree               │ 2,295  │ no      │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-render             │ 1,474  │ sí      │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-panel              │ 1,037  │ sí      │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-modules            │ 955    │ —       │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ cosmobiologia-store              │ 760    │ sí      │ —     │
+  ├──────────────────────────────────┼────────┼─────────┼───────┤
+  │ (resto: model, theme, card, web) │ ~1,000 │ parcial │ —     │
+  └──────────────────────────────────┴────────┴─────────┴───────┘
+
+  Hecho. Render agnóstico (DrawCommand + compose_wheel) con dos backends: GPUI
+  nativo + WASM SVG. App standalone funcional. Server HTTP single-user con CRUD.
+  Cliente web demo SSR. Crate WASM con fallback inteligente. Compose wheel rico
+  (palette + dial 3D + spread + coord labels).
+
+  Pendiente (roadmap del proyecto):
+
+  ┌───────┬──────────────────────────────────┬─────────────────────────┐
+  │   #   │               área               │    crates afectados     │
+  ├───────┼──────────────────────────────────┼─────────────────────────┤
+  │ 55-62 │ Sistema GR (8 tareas)            │ engine + canvas + panel │
+  ├───────┼──────────────────────────────────┼─────────────────────────┤
+  │ 63    │ FFT armónico                     │ engine + modules        │
+  ├───────┼──────────────────────────────────┼─────────────────────────┤
+  │ 64-65 │ Research bank (corpus + queries) │ store + engine          │
+  ├───────┼──────────────────────────────────┼─────────────────────────┤
+  │ 66    │ 3D celestial sphere              │ render + canvas         │
+  ├───────┼──────────────────────────────────┼─────────────────────────┤
+  │ 67    │ Rectificador automático          │ engine + modules        │
+  └───────┴──────────────────────────────────┴─────────────────────────┘
+
+  ---
+  16 · apps/ — 23 binarios
+
+  ┌───────────────┬────────────────────────────────────────────────────────────┐
+  │   categoría   │                            apps                            │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Protocol      │ brahman-broker-explorer, brahman-demo                      │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │               │ nahual-shell, nahual-file-explorer,                        │
+  │ Nahual suite  │ nahual-database-explorer, nahual-text-viewer,              │
+  │               │ nahual-image-viewer                                        │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Akasha        │ akasha-explorer                                            │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Nakui         │ nakui-ui, nakui-explorer                                   │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Minga         │ minga-explorer                                             │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Shuma         │ shuma-daemon, shuma-cli, shuma-gateway, shuma-shell        │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Pineal demos  │ pineal-demo, pineal-stream-demo, pineal-phosphor-demo,     │
+  │               │ pineal-financial-demo                                      │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Web           │ gioser-web (cdylib)                                        │
+  ├───────────────┼────────────────────────────────────────────────────────────┤
+  │ Cosmobiología │ cosmobiologia (GPUI), cosmobiologia-cli,                   │
+  │               │ cosmobiologia-server                                       │
+  └───────────────┴────────────────────────────────────────────────────────────┘
+
+  ---
+  17 · Tooling y artefactos cross-cutting
+
+  scripts/
+  ├── reorg.py              ← migración monorepo (hoy)
+  ├── split-changelog.py    ← partición CHANGELOG (hoy)
+  ├── bootstrap-demo.sh     ← escenario reproducible
+  ├── build-arje-initrd.sh  ← initramfs CPIO+gzip musl-static
+  ├── build-gioser-web.sh   ← WASM + wasm-bindgen
+  ├── install-arje-as-init.sh, uninstall-arje.sh
+  └── run-arje-qemu.sh
+
+  seeds/
+  ├── arje-minimal.card.json  ← shell bare
+  ├── arje-host.card.json     ← full host (13 sub-cards)
+  └── arje-prod.card.json     ← 15 sub-cards prod (tmpfiles, binfmt, daemons,
+  getty)
+
+  docs/
+  ├── STATUS.md, ROADMAP.md  ← global (hoy)
+  ├── arje-boot.md           ← initrd + QEMU + bare metal
+  ├── arje-replace-systemd.md
+  └── changelog/             ← 7 buckets por proyecto (hoy)
+
+  ---
+  18 · Métricas agregadas
+
+  ┌───────────────────────┬────────────────────────────────────────────────────┐
+  │       dimensión       │                       valor                        │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ Total crates          │ 126                                                │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ Binarios [[bin]]      │ 35                                                 │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ Librerías             │ 89                                                 │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ cdylib (WASM)         │ 2 (gioser-web, cosmobiologia-web)                  │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ LOC totales           │ ~78,000                                            │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ Crates con tests      │ 65 / 126 (52%) — esperable, compat shims sin tests │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ TODOs/FIXMEs/todo!()  │ 155 total · 78% concentrado en 4 crates            │
+  ├───────────────────────┼────────────────────────────────────────────────────┤
+  │ Cobertura cargo check │ 100% (workspace verde)                             │
+  └───────────────────────┴────────────────────────────────────────────────────┘
+
+  Concentración de deuda técnica:
+  - cosmobiologia-engine: 12 TODOs (sistema GR, harmonics)
+  - ente-brain: 11 TODOs (rule engine)
+  - brahman-handshake: 10 TODOs (trust fase 4)
+  - shuma-core: 14 TODOs (supervisión avanzada)
+  - Otros 65 crates: 108 TODOs distribuidos
+
+  ---
+  19 · Plan global a finalización
+
+  Orden topológico (bottom-up del stack), con dependencias declaradas.
+
+  Hito 1 · Cobertura crítica (semana 1-2)
+
+  Cierra los gaps donde el código existe pero no hay tests, antes de añadir
+  features sobre código no validado.
+
+  ┌───────────────────────────────────────────┬───────────────┬───────────────┐
+  │                   tarea                   │     crate     │  desbloquea   │
+  ├───────────────────────────────────────────┼───────────────┼───────────────┤
+  │ Tests E2E sobre cosmobiologia-canvas      │ cosmo-canvas  │ confianza UI  │
+  ├───────────────────────────────────────────┼───────────────┼───────────────┤
+  │ Tests E2E sobre cosmobiologia-tree        │ cosmo-tree    │ confianza UI  │
+  ├───────────────────────────────────────────┼───────────────┼───────────────┤
+  │ Tests sobre akasha-core::cluster          │ akasha-core   │ drift         │
+  │ (k-means)                                 │               │ handling      │
+  ├───────────────────────────────────────────┼───────────────┼───────────────┤
+  │ Tests FractalSnapshot restore con stale   │ ente-snapshot │ resiliencia   │
+  │ fds                                       │               │               │
+  ├───────────────────────────────────────────┼───────────────┼───────────────┤
+  │ Tests sobre brahman-admin (único protocol │ brahman-admin │ cierre suite  │
+  │  sin tests)                               │               │               │
+  └───────────────────────────────────────────┴───────────────┴───────────────┘
+
+  Salida: ≥1 test por crate sin cobertura actual + matriz de panics.
+
+  Hito 2 · Cerrar stubs bloqueantes (semana 2-3)
+
+  ┌────────────────┬───────────────────┬───────────────────────────────┐
+  │      stub      │ LOC actual → meta │            impacto            │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ minga-vfs      │ 2 → ~600          │ Mount FUSE de mónadas remotas │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ pineal-polar   │ <50 → ~300        │ Coord polar funcional         │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ pineal-heatmap │ <50 → ~250        │ Grid 2D color-mapped          │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ pineal-treemap │ <50 → ~300        │ Rectangular treemap           │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ pineal-flow    │ <50 → ~400        │ Sankey diagrams               │
+  ├────────────────┼───────────────────┼───────────────────────────────┤
+  │ pineal-mesh    │ <50 → ~250        │ Triangle mesh + barycentric   │
+  └────────────────┴───────────────────┴───────────────────────────────┘
+
+  Bloqueante de minga-vfs: estabilizar tras Hito 1 (sin tests es prematuro).
+
+  Hito 3 · Cerrar TODOs concentrados (semana 3-5, paralelo)
+
+  Tres tracks independientes, paralelizables:
+
+  Track A — Brain rule engine (ente-brain, 11 TODOs)
+  - Evaluador completo de policies declarativas
+  - Observer estadístico cross-ente (Bayesian update)
+  - Reglas como Cards (recursión: policies son módulos)
+
+  Track B — Shuma supervisión (shuma-core, 14 TODOs)
+  - Auth gateway (token via env / mTLS)
+  - Rotación audit.log con N backups
+  - WIT contracts reales sobre flow types
+  - Métricas exportables (Prometheus endpoint)
+  - shipote-shell click handler
+
+  Track C — Handshake fase 4 (brahman-handshake, 10 TODOs)
+  - Capabilities revocables
+  - Trust beyond peer (delegación)
+  - Métricas + audit chain hacia brain
+
+  Hito 4 · Cosmobiología innovaciones (semana 4-7)
+
+  Roadmap del proyecto, 5 áreas:
+
+  1. Sistema GR (#55-#62) — dual-ring directas+conversas, scrubbing live, HUD
+  triggers, modo rectificación. Requiere expansión de cosmobiologia-engine +
+  cosmobiologia-panel.
+  2. FFT armónico (#63) — detección automática de ciclos en órbitas. Sobre
+  cosmobiologia-modules.
+  3. Research bank (#64-#65) — corpus de cartas + queries. Sobre
+  cosmobiologia-store + cosmobiologia-engine.
+  4. 3D celestial sphere (#66) — renderer esférico vs el 2D actual. Sobre
+  cosmobiologia-render + cosmobiologia-canvas.
+  5. Rectificador automático (#67) — ajuste de hora natal vía eventos confirmados.
+   Sobre cosmobiologia-engine + cosmobiologia-modules.
+
+  Hito 5 · Compat avanzado systemd (semana 5-7, paralelo a Hitos 3-4)
+
+  ┌──────────────────────┬──────────────────────┬────────────────────┐
+  │         shim         │   método pendiente   │     desbloquea     │
+  ├──────────────────────┼──────────────────────┼────────────────────┤
+  │ ente-logind-compat   │ Inhibit, Sleep hooks │ GNOME power mgmt   │
+  ├──────────────────────┼──────────────────────┼────────────────────┤
+  │ ente-localed-compat  │ SetVariable          │ apps con locale UI │
+  ├──────────────────────┼──────────────────────┼────────────────────┤
+  │ ente-machined-compat │ MachineImage ops     │ nspawn workflows   │
+  └──────────────────────┴──────────────────────┴────────────────────┘
+
+  Meta: GNOME Shell arrancable sobre ente-zero sin parches.
+
+  Hito 6 · Polish + DX + onboarding (semana 7-8)
+
+  - scripts/check.sh que corra fmt + clippy + test --workspace
+  - Aliases legacy de binario: shipote → shuma, yahweh → nahual
+  - README raíz que apunte a los 16 SDDs y al ROADMAP
+  - Actualizar seeds/arje-*.card.json con nombres nuevos
+  - Pluma AST con inline elements completos
+
+  ---
+  20 · Diagrama de dependencias del stack
+
+                      ┌──────────────┐
+                      │  apps/ (23)  │
+                      └──────┬───────┘
+                             ↓
+              ┌──────────────────────────────┐
+              │       modules/ (62)          │
+              │                              │
+              │  cosmobiologia ←──────┐      │
+              │       ↓               │      │
+              │  nahual + pineal      │      │
+              │       ↓               │      │
+              │  shuma  akasha  nakui │      │
+              │       minga           │      │
+              │  gioser pluma vista   │      │
+              │  barra                │      │
+              └──────────────┬────────────┬──┘
+                             ↓            │
+                      ┌─────────────┐     │
+                      │  runtime/   │←────┘
+                      │ bus·cas·    │
+                      │ wasm·brain  │
+                      └──────┬──────┘
+                             ↓
+                      ┌─────────────┐
+                      │   init/     │
+                      │ ente-zero,  │
+                      │ kernel,     │
+                      │ incarnate   │
+                      └──────┬──────┘
+                             ↓
+                      ┌─────────────────┐
+                      │   protocol/     │
+                      │ card·handshake· │
+                      │ broker·sidecar  │ ← TODOS dependen de esto
+                      │ net             │
+                      └─────────────────┘
+
+                      [compat/ corre en paralelo, consume bus/card]
+
+  ---
+  21 · Cronograma global
+
+  sem 1     sem 2     sem 3     sem 4     sem 5     sem 6     sem 7     sem 8
+  ├─Hito1──►
+            ├─Hito2──►
+                      ├─Hito3 Track A (brain)──────────────►
+                      ├─Hito3 Track B (shuma)──────────────►
+                      ├─Hito3 Track C (handshake)──────────►
+                                ├─Hito4 (cosmo innov)─────────────────►
+                                          ├─Hito5 (compat avanzado)──►
+                                                              ├─Hito6 (polish)─►
+
+  Solo persona: ~7-8 semanas continuas. Paralelizado (3 tracks Hito 3 + Hito 4 +
+  Hito 5 disjuntos): ~3-4 semanas.
+
+  ---
+  22 · Bloqueantes críticos (vigilar)
+
+  1. minga-vfs stub → sin él el sistema de archivos de mónadas no existe → bloquea
+   akasha como fuente de datos integrada.
+  2. ente-brain rule engine parcial → sin él, la observabilidad fractal es opaca →
+   bloquea decisiones políticas autónomas del Init.
+  3. Cosmobiología canvas/tree sin tests → 5,145 LOC de UI sin red de seguridad →
+  cualquier refactor en GPUI es riesgoso.
+  4. Compat shims básicos → Inhibit/SetVariable/MachineImage faltan → GNOME no es
+  estable sobre arje.
+
+  ---
+  23 · Resumen de un vistazo
+
+  ┌───────────────┬─────────┬────────┬───────┬─────────────────────────────────┐
+  │  capa/módulo  │ madurez │  LOC   │ tests │        acción siguiente         │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ protocol      │ ★★★★☆   │ 6,260  │ sí    │ fase 4 trust (Hito 3C)          │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ init          │ ★★★★☆   │ 3,600  │ parc. │ snapshot restore tests (H1)     │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ runtime       │ ★★★☆☆   │ 3,400  │ parc. │ brain rule engine (H3A)         │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ compat        │ ★★★☆☆   │ 5,000  │ no    │ métodos avanzados (H5)          │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ minga         │ ★★★★☆   │ 5,091  │ sí    │ vfs (H2) ◄ BLOQUEANTE           │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ nahual        │ ★★★★★   │ 15,968 │ E2E   │ mantenimiento                   │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ pineal        │ ★★★☆☆   │ 3,900  │ sí    │ 5 stubs (H2)                    │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ nakui         │ ★★★★☆   │ 7,063  │ sí    │ docs morfismos (H6)             │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ akasha        │ ★★★☆☆   │ 4,395  │ parc. │ cluster tests (H1)              │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ shuma         │ ★★★★☆   │ 6,907  │ sí    │ auth gateway (H3B)              │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ gioser        │ ★★★★★   │ 2,535  │ sí    │ estable                         │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ pluma         │ ★★★☆☆   │ 178    │ no    │ AST inline (H6)                 │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ vista (HOY)   │ ★★★★☆   │ 530    │ 5/5   │ estable                         │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ barra (HOY)   │ ★★★★☆   │ 280    │ 5/5   │ estable                         │
+  ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤
+  │ cosmobiologia │ ★★★☆☆   │ 21,502 │ parc. │ tests canvas/tree (H1) + innov  │
+  │               │         │        │       │ (H4)                            │
+  └───────────────┴─────────┴────────┴───────┴─────────────────────────────────┘
+
+  Trazo desde aquí: Hito 1 desbloquea Hito 2, que desbloquea Hito 3 en paralelo
+  con Hito 4 y Hito 5, cerrando con Hito 6 polish. Estimación realista a v1.0
+  estable: 6-8 semanas continuas o 3-4 semanas con paralelización agresiva.
+
+
+  temas de dudas (sí te dije que esa ia estaba loca en ese texto):
+  1. no es hypervisor, pero sí ejecuta procesos con capacidad de aislamiento. lo que hablamos antes, acláralo si no lo hablamos antes. pero vamos a estar conectados con brahman, posiblemente ejecutando procesos en dht.
+  2. usa tu criterio, pero la idea es que este como compositor es el pintor del lienzo, pero va a tener la capacidad de delegar a través de brahman trozos de su superficie a otras aplicaciones/módulos, y estos a su vez pueden disponer de subtrozos para otras aplicaciones/modulos. así que vamos a hacer, tanto pintar en wayland, como orquestar las aplicaciones que tendremos dentro. para aplicaciones agnósticas, que va a ser lo "normal", va a comportarse digamos como un compositor normal.
+  3. no, usa protocolo logind. eso del criu déjalo para un futuro. lo del aislamiento va a seguir la misma política de las cards.
+
+  del navegador:
+  tienes razón. bueno, sigue las mejores reglas para repartir la responsabilidad. es el compositor el que define los layers, no? y la pintada. y se las da a las aplicaciones que se lo piden que puede ejecutar el shell/launcher, ayudame en eso, que hoy no dormí bien. modularidad horizontal.
+
+ decisiones:
+ 1. carmen.
+ 2. minga es el git, no la red. la red dht debería ser un core invisible para todo el ecosistema brahman. o sea, c.
+ 3. criu. déjalo para otro día pero no lo olvides.
+ 4. c.
+ 5. declarado.
+ 6. si es forzado, no. pero cuando sea grande lo voy a querer.
+
+
+
+
+
+
+
+
+
+
+
+  ---
+  Nuevo PLAN_MACRO con subtareas multi-nivel
+
+  FASE A · Foundations cleanup + renames batch (sem 1-2)
+  ├─ A1 · Rename batch en código
+  │   ├─ A1.1  Modificar scripts/rename-fase-a.py (add MOVES + PKG_RENAMES)
+  │   ├─ A1.2  Dry-run verificación
+  │   ├─ A1.3  Ejecutar: git mv + sed Cargo.toml + sed .rs + workspace toml
+  │   ├─ A1.4  cargo check --workspace verde
+  │   ├─ A1.5  Actualizar SDDs (init, runtime, compat → arje; revista; fana)
+  │   ├─ A1.6  Actualizar docs/STATUS.md, ROADMAP.md, PLAN_MACRO.md
+  │   ├─ A1.7  Mover
+  docs/changelog/{init,runtime,compat,minga,nahual,nakui,protocol}.md (referencias
+   internas a arje-)
+  │   └─ A1.8  Commit + push
+  │
+  ├─ A2 · Split arje-brain en 3 sub-crates
+  │   ├─ A2.1  arje-brain-rules (engine + rules + dispatch — 678 LOC)
+  │   ├─ A2.2  arje-brain-cognitive (observer + crystallize + autopromote — 799
+  LOC)
+  │   ├─ A2.3  arje-brain-audit (audit + introspect + metrics — 1,201 LOC)
+  │   ├─ A2.4  arje-brain umbrella opcional (features-based) o eliminar
+  │   ├─ A2.5  Migrar consumidores (arje-zero, chasqui-core)
+  │   └─ A2.6  cargo check + commit
+  │
+  ├─ A3 · Unificar loader duplicado
+  │   ├─ A3.1  Mover arje-brain/loader.rs → brahman-cards
+  │   ├─ A3.2  brahman-cards gana load_card_file + load_rules_file +
+  extract_*_from_json
+  │   ├─ A3.3  arje-brain depende de brahman-cards
+  │   └─ A3.4  cargo check + commit
+  │
+  ├─ A4 · Extraer sandokan-lifecycle de shuma-core
+  │   ├─ A4.1  Crear crate runtime/sandokan-lifecycle
+  │   ├─ A4.2  Mover primitivas: TTL + restart backoff + quota enforce + drain +
+  snapshot
+  │   ├─ A4.3  shuma-core depende de sandokan-lifecycle como cliente
+  │   ├─ A4.4  Tests existentes siguen pasando
+  │   └─ A4.5  cargo check + commit
+  │
+  ├─ A5 · Ampliar arje-incarnate con pivot_root + OverlayFS
+  │   ├─ A5.1  Agregar pivot_root al builder de Incarnator
+  │   ├─ A5.2  Agregar capa OverlayFS declarativa (rootfs RO + session RW)
+  │   ├─ A5.3  Tests: chroot básico funciona + overlay funciona
+  │   └─ A5.4  cargo check + commit
+  │
+  └─ A6 · Crear brahman-ssh-multiplex
+      ├─ A6.1  Wrapper sobre russh
+      ├─ A6.2  Canales paralelos + TCP_NODELAY + KeepAlive 15s
+      ├─ A6.3  Reconexión silenciosa
+      ├─ A6.4  Tests con servidor SSH local
+      └─ A6.5  cargo check + commit
+
+  FASE B · Core libraries (sem 2-5)
+  ├─ B1 · sandokan (orquestador library)
+  │   ├─ B1.1  Trait Engine { run/track/telemetry }
+  │   ├─ B1.2  LocalEngine (in-process: arje-incarnate + arje-brain-rules +
+  broker)
+  │   ├─ B1.3  DaemonEngine (postcard sobre Unix socket)
+  │   ├─ B1.4  RemoteEngine (sobre brahman-ssh-multiplex + DaemonEngine remoto)
+  │   ├─ B1.5  Engine::auto() detecta socket y elige
+  │   └─ B1.6  Tests + integración con arje-zero como daemon host
+  │
+  ├─ B2 · verbo (embeddings multi-backend)
+  │   ├─ B2.1  verbo-core (trait Provider, ModelId, EmbeddingVector)
+  │   ├─ B2.2  verbo-cohere (HTTP API remoto)
+  │   ├─ B2.3  verbo-bge-local (bge-code-large vía ort)
+  │   ├─ B2.4  verbo-mini-local (MiniLM-L6-v2 384d vía ort, para badu)
+  │   ├─ B2.5  verbo-fastembed (fallback)
+  │   ├─ B2.6  verbo-daemon (binario --backend X, multi-instancia)
+  │   ├─ B2.7  verbo-client (cliente IPC)
+  │   └─ B2.8  Migrar chasqui-nous-real de fastembed inline → verbo-client
+  │
+  ├─ B3 · brahman-dht (library DHT agnóstica)
+  │   ├─ B3.1  Sobre brahman-net libp2p (kad + provider records)
+  │   ├─ B3.2  Trait DhtBackend con kind: Code | Card | Persona | ...
+  │   ├─ B3.3  Publish + lookup + announce
+  │   └─ B3.4  Consumido por minga-p2p (kind=Code), brahman-card-discovery
+  (kind=Card), agorapura (kind=Persona)
+  │
+  └─ B4 · brahman-card-discovery
+      ├─ B4.1  Trait CardSearch + impls local (CAS + filesystem) + dht (vía
+  brahman-dht)
+      ├─ B4.2  Filtros por kind, flow type, capabilities
+      └─ B4.3  Widget nahual/widgets/card-browser consume CardSearch
+
+  FASE C · Apps standalone (sem 4-12, paralelizables)
+  ├─ C1 · fana (prioridad alta — absorbe pluma + nuevo writer's DAG editor)
+  │   ├─ C1.1  fana-core (NarrativeAtom + NarrativeGraph + CoherenceState)
+  │   ├─ C1.2  fana-md (absorbe pluma-md como parser markdown)
+  │   ├─ C1.5  fana-store (sled o RocksDB + bincode/rkyv zero-copy)
+  │   ├─ C1.6  fana-llm (cliente HTTP a LLMs remotos vía reqwest)
+  │   ├─ C1.7  fana-render-plan (DrawCommands agnósticos: editor + sidepane +
+  ghost trace)
+  │   ├─ C1.8  fana-editor-gpui (WorkspaceEditor View custom +
+  OscilloscopeSidepane + GhostTrace)
+  │   ├─ C1.9  fana-md-reader-web (absorbe pluma-reader-web, sigue siendo dep de
+  gioser-web)
+  │   ├─ C1.10 fana-editor-web (futuro WASM editor)
+  │   ├─ C1.11 apps/fana (binario GPUI)
+  │   └─ C1.12 apps/fana-web (futuro cdylib)
+  │
+  ├─ C2 · badu (note-taking, ex-akashi)
+  ├─ C3 · dominium (simulador psicológico)
+  ├─ C4 · takiy (composición musical)
+  ├─ C5 · matilda (server admin)
+  ├─ C6 · mirada (compositor Wayland, ex-carmen)
+  └─ C7 · agorapura (identidad humana federada)
+
+  FASE D · charka (paralelo multi-mes)
+  FASE E · yachay (integrador, sem 12-18)
+  FASE F · Cobertura tests + cerrar stubs cosmo/pineal (continuo)
+  FASE G · Backlog (rimay, yuyay, apu, tinkuy, nutu, ...)