Files
sergio 2bd6aaad02 feat(shuma): cajón de resultados del shell — desplegable desde el pie
Fase 3c: el shell muestra la salida de los comandos en un cajón que se
despliega hacia arriba sobre el escritorio.

carmen — la ventana del shell deja de tener un alto fijo: `render_loc`
la ancla al pie de la salida y la coloca por su **tamaño real**, así
puede crecer hacia arriba. La franja reservada sigue siendo la barra
(40 px); el cajón, al abrirse, se solapa sobre las teseladas sin
re-teselar. `render_loc` toma ahora el alto de la salida.

shuma-shell — un clic en el estado alterna `drawer_open`: la ventana
crece (`Window::resize`, que GPUI 0.2 expone) a barra + cajón, o
vuelve a sólo barra. El cajón reusa `render_run` para pintar los
últimos comandos y su salida, con scroll. `render_launcher` pasa a una
columna: cajón opcional arriba, barra abajo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 07:05:14 +00:00

1119 lines
80 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
● 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 13 (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 (v1v4 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, ...)
cargo build -p sandokan-cli
./target/debug/sandokan daemon & # terminal/background
./target/debug/sandokan run /bin/sleep 300 # → card_id
./target/debug/sandokan list
./target/debug/sandokan status <card-id>
./target/debug/sandokan stop <card-id>
● Comandos de prueba
target/ está en 22 GB — pero tranquilo: está gitignored, el repo git
real son 96 MB. El "desborde" es disco, no el repositorio. Más abajo
el cargo clean.
Todo de una
cargo check --workspace # compila los ~145 crates
cargo test --workspace # corre TODOS los tests (~270)
sandokan — el ejecutable interactivo
cargo build -p sandokan-cli
./target/debug/sandokan daemon & # deja el daemon
corriendo
./target/debug/sandokan run /bin/sleep 300 # imprime un card_id
./target/debug/sandokan list # lo ves activo
./target/debug/sandokan status <card-id> # → Running
./target/debug/sandokan telemetry <card-id> # → mem / nproc
./target/debug/sandokan stop <card-id> # → detenido
./target/debug/sandokan status <card-id> # → Killed
Tests por área (lo construido esta sesión)
# Fase A — foundations
cargo test -p arje-brain-rules -p arje-brain-cognitive -p
arje-brain-audit \
-p sandokan-lifecycle -p arje-incarnate
# Fase B — orquestador + discovery
cargo test -p sandokan-core -p sandokan-local -p sandokan-daemon -p sandokan \
-p brahman-dht -p brahman-card-discovery -p brahman-ssh-multiplex
# Fase F — pineal (6 charts)
cargo test -p pineal-render -p pineal-export -p pineal-heatmap \
-p pineal-polar -p pineal-treemap -p pineal-flow -p
pineal-mesh
# Apps Fase C — núcleos
cargo test -p fana-core -p fana-graph -p fana-store -p fana-semantic
# fana
cargo test -p shuma-intent
# shuma shell
cargo test -p verbo-core -p verbo-mock
# verbo
cargo test -p dominium-core
# dominium
Validación arje (boot — ya existía)
seeds/validate.sh seeds/arje-minimal.card.json
⚠ Disco — cargo clean
target/ = 22 GB y va a seguir creciendo (gpui, libp2p, russh son
pesados). Cuando quieras recuperar ese espacio:
cargo clean # borra target/ entero — recupera ~22 GB
Tras eso, el próximo cargo build recompila todo desde cero (lento,
~varios min). Recomendación: corré tus pruebas, y cuando termines una
tanda, cargo clean. No afecta nada del código ni del repo — sólo
artefactos de compilación.
¿Querés que lo corra yo ahora (cargo clean), o lo dejás para cuando
termines de probar esta tanda? Si lo corro ahora, tu próxima prueba
recompila de cero.
Lo construido — 6 módulos, 16 crates nuevos
┌───────────┬───────────────────────────────┬───────┬────────────────────────────────┐
│ módulo │ crates │ tests │ estado │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ dominium │ render-plan, canvas-gpui, app │ 37 │ ✅ completo │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ verbo │ verbo-daemon │ 8 │ ✅ daemon entre-procesos │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ fana │ render-plan, editor-gpui, app │ 12 │ ✅ editor DAG (prioridad alta) │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ agorapura │ core, graph, app │ 22 │ ✅ identidad federada │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ badu │ core, gravity, app │ 29 │ núcleo + demo │
├───────────┼───────────────────────────────┼───────┼────────────────────────────────┤
│ takiy │ takiy-core │ 24 │ núcleo de teoría musical │
└───────────┴───────────────────────────────┴───────┴────────────────────────────────┘
132 tests nuevos, todos verdes. cargo check --workspace verde en cada commit. 14 commits pusheados.
Para que verifiques tú (apps GPUI — no las puedo ver)
cargo run -p dominium # simulador isométrico vivo
cargo run -p fana # editor DAG — «Mutar raíz» dispara la onda de choque
cargo run -p shuma-shell # el shell de 3 zonas
Ya verifiqué yo (CLI, corren bien)
cargo run -p agorapura # Venezuela atestigua a Yumaira; firma falsa rechazada; veredictos por política
cargo run -p badu # cuaderno: grafo de enlaces + clústeres por gravedad semántica
Verificación
Apps GPUI — necesito que las veas tú:
cargo run -p dominium # simulador isométrico vivo
cargo run -p fana # editor DAG — «Mutar raíz» dispara la onda de choque
cargo run -p shuma-shell # el shell de 3 zonas
Demos CLI — ya las verifiqué yo, corren bien:
cargo run -p agorapura # Venezuela atestigua a Yumaira; veredictos por política
cargo run -p badu # cuaderno: grafo de enlaces + clústeres por gravedad
cargo run -p matilda # inventario → docker-compose + nginx + plan de reconciliación
cargo run -p yachay # notebook: orden de ejecución + digest cambia al editar
matilda — el puente plan→ejecución
Avancé el módulo de server admin con matilda-apply: traduce el Plan de reconciliación a pasos concretos —los archivos a escribir y los comandos a
correr en el servidor— y a un script bash listo para ejecutar. cargo run -p matilda ahora lo imprime:
# crear contenedor «api»
docker run -d --name api --restart unless-stopped -p 9000:9000 ...
# actualizar contenedor «web»
docker rm -f web
docker run -d --name web ...
# crear vhost «api.jlsoltech.com»
cat > /etc/nginx/sites-enabled/api.jlsoltech.com.conf <<'MATILDA_EOF'
server { listen 443 ssl; ... }
MATILDA_EOF
nginx -t && nginx -s reload
1 · El ejecutable
apps/matilda ya es un ejecutable CLI completo:
cargo run -p matilda -- example > /tmp/inv.json
cargo run -p matilda -- plan /tmp/inv.json --discover
cargo run -p matilda -- apply /tmp/inv.json --host deploy@servidor
2 · Embebido en el shell — cargo run -p shuma-shell
matilda ahora es una herramienta del shell, no una app aparte. Dentro de la ventana de shuma:
:matilda plan /tmp/inv.json → tarjeta con el plan de reconciliación
:matilda script /tmp/inv.json → tarjeta con el script bash
:matilda apply /tmp/inv.json → ejecuta el script de verdad
- Reconcilia contra el estado real de la máquina (lee tus contenedores docker + sitios nginx).
- plan/script aparecen como tarjetas sintéticas en el feed.
- apply corre el script como cualquier comando: salida en streaming, captura acotada, botón de matar, acordeón — todo el aparato del shell,
gratis.
- El panel [RUN] tiene ahora una sección [tools] con ⚙ matilda — un clic precarga :matilda plan en el input para que sólo nombres el archivo.
Flujo end-to-end demoable hoy sin gráficos:
cargo run -p mirada-body --example headless -- /tmp/mirada.sock # el Cuerpo
MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada # el Cerebro
Sin MIRADA_SOCKET, mirada corre en simulación: ventanas sintéticas y teclado propio (n abre, j/k foco, tab cicla layout, 1-9 escritorios).
El Cuerpo de verdad — mirada-compositor:
Compositor Wayland teselante real sobre smithay, con dos backends gráficos (main() elige; --winit/--drm lo fuerzan):
· winit — corre anidado, una ventana dentro de tu sesión X11/Wayland (para desarrollar sin dejar el escritorio).
· drm — corre nativo sobre una TTY, sin sesión anfitriona: toma GPU (DRM/KMS/GBM/EGL), teclado y ratón (libinput).
cargo run -p mirada-compositor # autónomo: Cerebro Desktop embebido, un solo proceso
WAYLAND_DISPLAY=wayland-1 foot # lanza clientes contra él (imprime su WAYLAND_DISPLAY al arrancar)
MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada-compositor # enlazado: la app mirada (Cerebro GPUI) decide la geometría
cargo run -p mirada-compositor -- --drm # nativo sobre TTY (MIRADA_STARTUP=foot lanza un cliente al arrancar)
Habla wl_compositor/xdg_shell/wl_shm/wl_seat/wl_data_device/xdg-decoration/zwp_linux_dmabuf; compone con GlesRenderer.
dmabuf permite clientes que pintan por GPU (apps GPUI, navegadores acelerados). Reusa mirada-body y mirada-link.
En --drm el foco sigue al puntero y clics/rueda van a la ventana debajo; el cursor toma la forma del cliente.
Cada ventana lleva un marco fino: azul la enfocada, gris las demás.
Super+arrastre mueve la ventana (botón izq.) o la redimensiona (der.) — al arrastrarla pasa a flotar.
Fuerza xdg-decoration ServerSide y no dibuja marco: las ventanas teseladas van sin barra de título.
Lanzar programas: acción spawn:<comando> del keymap (Super+Shift+Return → spawn:foot por defecto).
Lanzador de apps: mirada-launcher (escanea los .desktop, lista filtrable de terminal); atado a Super+p.
Conmutación de VT: Ctrl+Alt+Fn salta a otra TTY y vuelve sin romper la sesión (pausa DRM + libinput).
Acople del shell: una ventana con app_id "carmen.shell" se ancla en una franja al pie; el resto tesela arriba.
shuma-shell --launcher: corre como ese shell — barra compacta GPUI con la línea de comandos + barra de ventanas.
La barra de ventanas las consulta por el socket de control de carmen (ListWindows); un clic enfoca.
Clic en el estado despliega el cajón de resultados: la ventana del shell crece y carmen la ancla al pie.
Sesión: ~/.config/mirada/autostart (un comando por línea) + script session/mirada-session + carmen.desktop.
Ver crates/apps/mirada-compositor/README.md.
Atajos de teclado configurables — mirada-brain::Keymap:
El keymap vive sólo en el Cerebro; el Cuerpo nunca lo ve (sólo recibe la lista de cadenas a interceptar, GrabKeys).
Disco: RON de texto en ~/.config/mirada/keymap.ron — editable a mano, versionable, recargado en caliente (notify).
Si falta, la app escribe uno por defecto documentado; si está corrupto, avisa y usa el de por defecto sin pisarlo.
cargo run -p mirada-brain --example keymap-default # imprime el keymap por defecto en RON
Acciones como cadena estable: "focus-next", "layout:grid", "workspace:3", "spawn:foot" (DesktopAction: Display + FromStr).
Sin ejecutable configurador: el editor de texto del usuario, y la app mirada sobre el mismo API Keymap.
API de acciones — mirada-ctl + HUD interactivo:
Toda acción converge en Desktop::apply(DesktopAction); el keymap es sólo un front-end más.
mirada-ctl — control externo por CLI (estilo swaymsg/hyprctl):
mirada-ctl focus-next # cambia el foco
mirada-ctl focus-window 5 # enfoca una ventana concreta (FocusWindow: salta de escritorio si hace falta)
mirada-ctl workspace 3 # va al escritorio 3
mirada-ctl windows # lista las ventanas (id, escritorio, app, título)
mirada-ctl actions # lista las acciones disponibles
Socket de control aparte (mirada-brain::ctl: CtlRequest/CtlReply, marco postcard). Lo abre el Cerebro:
siempre la app mirada; mirada-compositor sólo en modo embebido.
HUD interactivo: en la app mirada, pips de escritorio y ventanas del lienzo son clicables.
cargo run -p mirada-brain --example headless-ctl # Cerebro sin gráficos para probar mirada-ctl
Layouts — 7 modos de teselado, intercambiables por el API:
master-stack · centered-master · spiral (espiral de Fibonacci) · grid · columns · rows · monocle
mirada-ctl layout spiral # fija un modo
mirada-ctl cycle-layout # siguiente modo (LayoutMode::next)
mirada-ctl grow-master / shrink-master # redimensiona el área maestra (Super+l / Super+h)
Atajos directos: Super+t/m/g/c/r/d/s. CenteredMaster y Spiral pensados para monitores anchos.
El motor (mirada-layout::tile) es puro y determinista; split() reparte sin perder un píxel.
nmaster + promover a maestra + smart gaps (al estilo dwm):
LayoutParams.master_count = nº de ventanas en el área maestra (MasterStack y CenteredMaster).
mirada-ctl inc-master / dec-master # Super+, / Super+. — nmaster ±1 (acotado 1..9)
mirada-ctl promote-to-master # Super+Return — la enfocada salta al puesto maestro
Smart gaps: una sola ventana va a sangre, sin margen desperdiciado.
combo_string del compositor ahora canoniza teclas con nombre (Return, Tab, F5, flechas…),
no sólo caracteres imprimibles — así Super+Return es un atajo válido del keymap.
Ventanas flotantes — toggle-float (Super+f):
La ventana enfocada sale del teselado a un rectángulo libre (centrado, 60% de pantalla);
las demás reteselan sin ella. Workspace guarda las flotantes aparte; layout() las pone al final.
WindowPlacement y BodyOp::Configure llevan floating: bool — el Cuerpo las compone por encima
(mirada-compositor ordena las flotantes al frente de la lista front-to-back).
mirada-ctl toggle-float # alterna flotante / teselada
Reglas de ventana — mirada-brain::rules:
Config declarativa en RON (~/.config/mirada/rules.ron); el Desktop la consulta en cada
WindowOpened y manda la ventana a su escritorio / la hace flotar.
Cada regla casa por subcadena de app_id y/o title (sin mayúsculas); gana la primera.
Ejemplo: (app_id: "firefox", workspace: 2) · (title: "Picture-in-Picture", floating: true)
La primera vez se escribe una plantilla con ejemplos comentados.
Pantalla completa — toggle-fullscreen (Super+Shift+f):
La ventana enfocada cubre toda la salida (sin gap), oculta al resto y se lleva el foco.
Workspace.fullscreen: Option<WindowId>; WindowPlacement/BodyOp::Configure llevan fullscreen: bool;
el Cuerpo le fija el estado xdg_toplevel Fullscreen. Alternar de nuevo restaura el teselado.
mirada-ctl toggle-fullscreen
Multi-monitor real — el Desktop tesela todas las salidas:
Cada Output muestra un escritorio distinto; relayout() las tesela todas en un solo Place.
Pedir un escritorio que ya muestra otra salida → las intercambia (ningún escritorio se ve 2 veces).
mirada-ctl focus-output-next # Super+o — mueve el foco al siguiente monitor
El foco del teclado es único: sólo la ventana enfocada de la salida enfocada.
cargo run -p mirada-brain --example headless-ctl # ahora levanta 2 salidas
Scratchpad — terminal desplegable (Super+`):
send-to-scratchpad guarda la ventana enfocada (sale del teselado, en ningún escritorio).
toggle-scratchpad la invoca flotando y centrada en el escritorio actual, o la oculta.
Una ventana del scratchpad te sigue: invocarla desde otro escritorio la trae consigo.
mirada-ctl windows la lista como «esc scratch».
Fullscreen iniciado por el cliente + HUD multi-salida:
BodyEvent::FullscreenRequest — cuando un cliente pide xdg set_fullscreen, el Cuerpo
(XdgShellHandler::fullscreen_request) avisa al Cerebro y la ventana entra a pantalla completa sola.
El lienzo de la app mirada dibuja ahora todas las salidas a escala, cada una con su marco;
en simulación, Shift+n añade un monitor más.