Files
brahman/crates/modules/shuma
sergio b83d40a833 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>
2026-05-20 00:10:14 +00:00
..

shipote

Runtime de espacios aislados con flujo tipado dentro del fractal brahman.

shipote no es un shell POSIX. Es un daemon long-running que:

  • Aísla procesos en Workspaces (cada uno con su SomaSpec: namespaces, cgroup, rlimits).
  • Encadena comandos en Pipelines (DAG con fan-out, fan-in, taps, replay buffer).
  • Discierne contenido sobre cada flow (detecta application/json, text/markdown, magic bytes, hasta brahman:card).
  • Expone data plane real: subscribers externos se conectan a Unix sockets y reciben los bytes del stream.
  • Se integra al ecosistema vía brahman-sidecar (anuncia Cards al broker).
                         ┌─────────────┐
                         │  shipote    │  daemon long-running
                         │  -daemon    │  $XDG_RUNTIME_DIR/shipote.sock
                         └──────┬──────┘
                                │ admin protocol (postcard)
              ┌─────────────────┼─────────────────┐
              │                 │                 │
        ┌─────▼─────┐     ┌─────▼─────┐     ┌─────▼─────┐
        │ shipote   │     │ shipote-  │     │  HTTP /   │
        │  (CLI)    │     │  shell    │     │  custom   │
        │           │     │  (GUI)    │     │  (futuro) │
        └───────────┘     └───────────┘     └───────────┘

Quick start

# 1. Compilar
cargo build -p shipote-daemon -p shipote-cli

# 2. Arrancar daemon (en una terminal):
SHIPOTE_LOG=info ./target/debug/shipote-daemon

# 3. En otra terminal:
./target/debug/shipote health
./target/debug/shipote workspace create demo.toml
./target/debug/shipote run -w <ws-id> /bin/echo -- hola

Estado actual

  • 11 crates en el monorepo. Ver ARCHITECTURE.md.
  • 85 tests pasando.
  • Compatible con cualquier supervisor (ente-incarnate es reusable — no requiere ser PID 1).

Documentación

  • ARCHITECTURE.md — qué crates lo componen, cómo se conectan, decisiones clave.
  • CLI.md — referencia de comandos del binario shipote.
  • RECIPES.md — specs TOML de workspaces y pipelines con casos prácticos.
  • DEVELOPMENT.md — cómo correr daemon, GUI, tests, snapshot.

Acoplamiento con el resto del monorepo

Reusa Propósito
ente-incarnate (extraído de ente-soma en Fase 0) clone(2) + namespaces + cgroup + rlimits
brahman-card tipos Card, SomaSpec, Flow, TypeRef
brahman-sidecar + brahman-handshake anuncio al broker
ente-snapshot filosofía persistencia (shipote tiene su propio ShipoteSnapshot v4)
yahweh-launcher + widgets GUI shipote-shell
shipote-discern ← usado por yahweh-provider-fs (mime per archivo) y nouser-core::cluster::pick_lens

Limitaciones declaradas

  • mount/pid/net/uts/ipc/cgroup namespaces requieren CAP_SYS_ADMIN o combo con CLONE_NEWUSER.
  • user namespace puede estar bloqueado por sysctl o LSM (apparmor/selinux).
  • cgroup v2 limits (memory.max, pids.max) requieren delegation. Sin delegation, accounting funciona pero el kernel no enforce.
  • Pipeline restart preserva spec pero no ULIDs del pipeline_id (cada relaunch genera uno nuevo).
  • Replay buffer broadcast: subscribers tarde reciben el snapshot del replay (cap configurable por bytes o chunks), pero pueden perder chunks intermedios si el ring rota antes de conectarse.