- Expandir manifiesto con las 5 fases del pipeline de intervención
(detección, pausa, modulación, redirección, mantenimiento)
- Agregar teoría de campo unificado: formalización A ≈ U, algoritmo
de perdón como procedimiento operativo sobre memoria
- Agregar métricas: Co, H, IR, PA + protocolo de práctica
- Agregar ontología operativa, epistemología probabilística y telos
- Mantener estructura de 10 secciones con tono uniforme
- 63 fragmentos indexados en Qdrant
- Combinar 'Manifiesto del Ser Desnudo' (texto experiencial) con
'Propósito y alcance' (axiomas, ecuaciones, dinámica de sistemas)
- Estructura en 7 secciones que integran poesía + matemática:
I. Origen, II. Cuerpo Formal, III. Dinámica, IV. Sombras,
V. Medicina, VI. Práctica, VII. Centro de la Nada
- Reindexado en Qdrant (45 fragmentos)
- Respaldo del original (tierra.md.bak)
- Changed install_deck_delegation → install_controls_delegation:
listener on document, not just #deck (controls are outside deck now)
- Graph node click: use dyn_into::<HtmlElement>() then click() instead
of dyn_ref which may fail on <a> elements
- .page-controls visibility: changed from (wrong) to
- Graph node callback: use HTMLElement.click() instead of
dispatch_event(MouseEvent), which wasn't working (untrusted event)
- Moved the minimize/close buttons from dynamic JS creation to
static HTML in index.html (always present, hidden by default)
- sync_page_controls() now just toggles opacity/pointer-events
instead of creating DOM elements
- Graph callback now creates a web_sys::MouseEvent('click') and
dispatches it on the corresponding .tip element.
- The existing install_tip_clicks listener captures it and calls
open_or_switch with proper coordinates.
- Changed all relative paths (./styles.css → /styles.css,
./pkg/gioser_web.js → /pkg/gioser_web.js,
./md/*.md → /md/*.md) to absolute so they don't break when
pushState changes URL to /estudio/aire etc.
- Caddy already has try_files fallback to /index.html for SPA routing.
- Graph: nodes are draggable via pointer events. Snap back with
spring transition on release (cubic-bezier 0.34,1.56,0.64,1)
- Removed hover bounce animation (was distracting)
- Page controls (minimize/close): now fixed position in viewport
(top-right, z-index 100), not inside the deck-page scroll area.
Created once in sync_page_controls() on show/hide deck.
Controls detect active page when data-minimize/close-page is empty.
- Hash routing → history.pushState: URLs are /estudio/aire etc.
popstate listener handles back/forward. Initial path read on boot.
- Added PointerEvent feature to gioser-graph-web Cargo.toml
- Added History feature to gioser-web Cargo.toml
- Edges and nodes now in separate SVG <g> groups (edges first = behind)
- Stroke width: 0.6 + w*4.0 instead of normalized range (more visible variation)
- Brightness: uses raw weight directly, not normalized against max
- Edges group has no breathing animation (only nodes breathe)
- Each edge color is a 50/50 blend of its two nodes' camino colors
- Extra brightness proportional to weight (higher weight = closer to white)
- Edge opacity/width also varies by weight
- Edges drawn before nodes in SVG (already behind them)
- Fix: map positions by node.id (UUID) not doc_id — edges now draw
- Index the 4 docs/ files into Qdrant (15 fragments via index-gioser-docs.py)
- Page background: single smooth radial-gradient per element (no color
divisions), animated 'page-breathe' — opacity pulses 0.35↔0.80
- Graph CSS: 'graph-breathe' 5s opacity animation (feels alive)
- Uses setInterval(50ms) waiting for offsetWidth > 0
- Falls back to minWidth/minHeight after 10s timeout
- Solves 'cannot access property w' when deck is hidden (scale 0)
- Wraps the entire fetch+render in requestAnimationFrame
so the container has real size before Cytoscape runs cose layout
- Uses 'preset' layout first, then cose with animate:'end'
to play nice with 0-size containers during deck animation
- cytoscape-graph.js now uses MutationObserver, not DOMContentLoaded
(the <gioser-graph> element is created dynamically by WASM)
- Remove unused dispatchEvent from lib.rs
- Rebuild WASM
- Switch from circles to horizontal rounded rectangles with text inside
- Text size 12px body + 8px sublabel (camino), no overlaps
- Edge stroke-width proportional to semantic weight
- Fix 'Layout was forced' warning
- Reduce CSS page-ambience animations: only opacity (no transform)
to fix 'breathing background' visual glitch
- Layout: more separation (k*1.6), 80 iterations
- Add gioser-graph-web dependency to gioser-web
- After markdown loads, mount SVG semantic graph below content
- Graph fetches from api.gioser.net/graph endpoint
- Uses Qdrant k-NN edges, colored by camino
- Callback navigation placeholder (will be wired in next commit)
Síntoma: el screenshot del usuario en la VPS Hetzner mostraba systemd
booteando y se quedaba congelado en el último printk del kernel justo
antes del switch-root. arje-zero arrancaba bien pero su salida iba al
serial invisible.
Causa: el cmdline traía `console=tty1 console=ttyS0,115200` — y el
kernel hace que `/dev/console` apunte al ÚLTIMO `console=`, así toda la
salida de stdout/stderr de arje-zero (tracing + banner de la rescue
shell) caía en ttyS0 (serial), no en la VGA que muestra noVNC.
Dos arreglos:
- Orden de consolas invertido en el menuentry → `/dev/console` = tty1
(lo que efectivamente se ve en la consola web del proveedor).
- arje-zero también escribe a `/dev/kmsg` (ring buffer del kernel), que
el kernel hace eco a TODAS las consolas registradas — el mecanismo
que usa systemd para que sus mensajes salgan tanto en VGA como en
serial. Defense in depth: el banner de rescue y un eco temprano
«despierta como PID 1» aparecen sí o sí en cualquier consola.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diagnóstico: en el VPS Fedora arje-zero caía como PID 1 y el cmdline
traía `panic=10`, así que el kernel rebooteaba cada 10 s. Tres causas
encadenadas, todas arregladas:
1) **Cmdline `ro` + sin `/run` tmpfs.** El menuentry montaba `/` como
sólo lectura (systemd lo remonta rw temprano; arje no). Sin eso, el
socket del bus interno se intenta crear sobre un FS de sólo lectura
y falla con EROFS → spawn_bus devuelve Err → PID 1 sale → kernel
panic. arje-kernel ahora remonta `/` rw en el bootstrap y monta
`/run`, `/tmp`, `/dev/pts`, `/dev/shm` como tmpfs — superficies
escribibles aunque la raíz quede ro.
2) **PID 1 saliendo en cualquier `?`.** Doctrina dura nueva: PID 1
NUNCA puede salir. Cualquier error de arranque ahora cae a una
`emergency_shell()` que imprime el diagnóstico en `/dev/console`,
abre `/bin/sh` y, si la shell muere, la reabre — así el operador
puede reparar en vez de mirar la máquina reiniciarse en bucle.
3) **El script no conocía grub2 (Fedora).** `install-arje-as-init.sh`
sólo probaba `update-grub` (Debian) y `grub-mkconfig` (Arch). Ahora
detecta `grub2-mkconfig` y resuelve el `grub.cfg` correcto
(UEFI/BIOS, fedora/redhat/centos/almalinux/rocky). El menuentry
también pasa de `ro` a `rw` — el remount es belt-and-suspenders.
Mismo arreglo en `uninstall-arje.sh`.
Renaser intacto: estos cambios son Linux-side puro (arje-kernel y
arje-zero usan nix/libc/tracing); renaser sólo comparte mirada-layout y
formato, ninguno tocado.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Repaso de los 11 shims restantes buscando métodos que devolvían éxito
sin hacer el trabajo (como los dos setters de localed). Resultado:
timedated — tres setters arreglados de verdad:
- SetTime: aplica el reloj con clock_settime(CLOCK_REALTIME) en vez de
sólo loggear; si falla (sin CAP_SYS_TIME) devuelve error honesto.
- SetLocalRTC: escribe la tercera línea de /etc/adjtime (UTC|LOCAL),
conservando las dos primeras.
- SetNTP: arje no gestiona un daemon NTP — en vez de fingir éxito,
rechaza honestamente; `CanNTP` pasa a `false` para que GNOME deje el
toggle deshabilitado y ni llegue a llamarlo.
systemd1 — StopUnit/RestartUnit/KillUnit dejaban creer que habían
detenido la unit; ahora devuelven NotSupported honesto (como StartUnit).
Lo demás del repaso ya era honesto: resolved/machined devuelven
NotSupported de frente; polkit/tmpfiles/notify/binfmt/journald no
mienten. timer-compat queda como hueco conocido y autodocumentado (sus
timers disparan pero el spawn es un no-op a la espera del bus).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
`Inhibit` dejó de ser un stub que devolvía NotSupported. Ahora cumple
el contrato de systemd-logind:
- Crea un pipe; el cliente recibe el extremo de escritura, el shim
conserva el de lectura. Mientras el cliente no cierre su fd, el
inhibidor sigue activo; al cerrarlo —o morir— el shim ve EOF y una
tarea guardiana lo retira de la tabla.
- Tabla de inhibidores activos + método `ListInhibitors`.
- Las propiedades `BlockInhibited` / `DelayInhibited` ahora reflejan
los inhibidores reales (tokens únicos del modo, unidos por `:`),
en vez de devolver siempre vacío.
Es lo que GNOME/KDE usan para frenar la suspensión automática durante
una presentación o una descarga. 1 test (`inhibited_what`).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>