- ente-systemd1-compat: org.freedesktop.systemd1.Manager. Cada Ente vivo
del fractal aparece como `<label>.service`. ListUnits/GetUnit/
GetUnitByPID consultan al bus interno (BusRequest::ListEntes). Start/
Stop/Restart son stubs que loguen — Cards ya están en el grafo, no se
inician/paran on-demand. Reload/ListUnitFiles/ListJobs vacíos.
Properties: Version, Architecture, Features, Environment.
- ente-notify-compat: listener en /run/systemd/notify para sd_notify.
Decodifica KEY=value lines (READY/STATUS/MAINPID/WATCHDOG/STOPPING)
y log estructurado. Permisos 0666 para que cualquier proceso escriba.
- ente-soma inyecta NOTIFY_SOCKET=/run/systemd/notify en cada Ente
encarnado (junto a ENTE_BUS_SOCK + ENTE_ID).
- ente-binfmt-compat: lee /usr/lib/binfmt.d, /etc/binfmt.d, /run/binfmt.d
en orden. Cada línea no-comment se escribe a /proc/sys/fs/binfmt_misc/
register. EEXIST silencioso (handler ya registrado por boot anterior).
OneShot pattern.
- ente-timer-compat: scheduler cron 5-field UTC (min hour dom mon dow).
Soporta `*`, `N`, `*/N` por field. Lee /etc/ente/timers.json. Tick
alineado al próximo minuto exacto, evalúa todos los timers cada
60s. Decompose epoch via Howard Hinnant Civil from days. fire() loguea
por ahora — spawn real requiere SpawnRequest via bus.
3 shims añadidos: 0xa6 systemd1, 0xa7 notify, 0xa8 timer.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ente-journalctl: bin nuevo en ente-journald-compat. Lee
~/.local/share/ente/journal/index.log, parse timestamp:source:unit:sha,
filtra --unit/--source/--since/--grep/--tail, restituye blobs desde CAS
y formatea (pretty | --json). Default extrae MESSAGE de journald native.
- compat-machined: org.freedesktop.machine1.Manager con
ListMachines/GetMachine/Register/Terminate. Lista vacía + NotFound —
apps que llaman al boot ya no quedan en timeout.
- compat-polkit: query_policy() consulta el bus interno por el cap
POLKIT_DECISION_IFACE con blob (pid_be|uid_be|action_id_utf8). Si hay
proveedor su byte de respuesta gobierna; si no, default-allow.
Anuncia POLKIT_SERVICE_IFACE (separado para evitar recursión).
- docs/gnome-boot-test.md: procedimiento end-to-end para arrancar GNOME
con ente-zero como PID 1 en QEMU. scripts/build-rootfs.sh overlaya
binarios + symlink /init. scripts/run-vm.sh boot QEMU con KVM y GTK.
docs/seed-gnome-test.k Card Semilla con genesis para 8 shims +
dbus-daemon + NetworkManager + gdm.
8 compat-shims operativos en paralelo cubriendo: logind, hostnamed,
timedated, localed, journald, resolved, polkit, machined.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patrón de compat-logind extendido a 4 servicios más que GNOME/KDE consultan
al boot. Cada uno: anuncia al bus interno, intenta RequestName en system bus,
degrada a idle si la policy lo bloquea, sirve método mientras esté arriba.
- compat-hostnamed: org.freedesktop.hostname1. Properties read /etc/hostname,
/etc/os-release, /sys/class/dmi/id/* y uname(). Setters log + cache.
- compat-timedated: org.freedesktop.timedate1. Timezone via readlink
/etc/localtime. ListTimezones desde /usr/share/zoneinfo.
- compat-localed: org.freedesktop.locale1. Lee /etc/locale.conf,
/etc/vconsole.conf, /etc/X11/xorg.conf.d/00-keyboard.conf.
- compat-journald: stub datagram listener en /run/systemd/journal/socket
y /dev/log. Decodifica syslog y journald native, emite tracing events.
Dev seed los incluye condicionalmente. Verificado: los 5 shims
(logind+4 nuevos) anunciados al bus interno con auth SO_PEERCRED.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- quota_for_capability(cap) tabla por variante: Spawn 2, FilesystemRoot 2,
Endpoint 16, Journal 32. mediate_capability rechaza con QuotaExceeded
si holder ya tiene N tokens activos.
- ente_cas::list_all_shas() + gc(reachable). audit::reachable_from_head()
walks la cadena. Endpoint GcCas con extra_roots para Wasm SHAs.
brainctl gc-cas.
- PatternCrystal::Burst (kind, count, freq_hz) y Silence (kind, since_secs).
detect_pattern_crystals + endpoint PatternCrystals + brainctl patterns.
- Observer.dirty_marginal/dirty_cooccur tracking. snapshot() marca
consumo (clears dirty); snapshot_delta() emite sólo lo cambiado.
apply_delta() merges incremental sobre estado existente. Útil para
checkpoints frecuentes con poco overhead.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 3 tests integración audit con CAS aislado por test (ENTE_CAS_ROOT en
tempdir): flush_round_trip_preserves_chain, replay_reconstructs_engine_state,
replay_after_eviction_still_works.
- AuditLog tracks last_flush_at_ms + subscriber_count. metrics expone:
audit_chain_length, audit_in_memory, audit_subscribers,
audit_last_flush_age_seconds, audit_head_info{sha=...}.
- ttl_for_capability() tabla per-variant: Spawn/FilesystemRoot 30s,
Endpoint/KernelNetlink/LegacyLogind 5min, Journal 1h.
mediate_capability y renew_grant consultan la tabla.
- ObserverSnapshot serializable (sin Instants — last_seen se anchora a
now() al restore). Counters, cooccurrencias e histogramas persistidos.
Snapshot adjunto al fractal: <checkpoint>.brain.json. --restore lo
carga si existe.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- GapHistogram añade sum_squares_secs → stddev en O(1). GapStats serializable
con count/mean/stddev/max.
- Crystal incluye gap_stats?: GapStats. crystal_to_rule emite Sequence con
within_ms = (mean+2σ)*1000 cuando gap_stats.count >= 4; fallback a Single.
- audit::collect_chain_from_cas() recoge la cadena en orden cronológico.
replay_chain() reconstruye RuleEngine aplicando PromoteCrystal/RemoveRule.
Endpoint ReplayAudit + brainctl replay.
- GrantedCapability con expires_at: Instant. DEFAULT_GRANT_TTL = 60s.
EnteGraph::renew_grant + purge_expired_grants. Tick cada 10s en el bucle
primordial.
- AuditLog::subscribe() entrega un mpsc::UnboundedReceiver. append() empuja
a todos los subscribers, purgando los muertos. IntrospectRequest::StreamAudit
toma posesión de la conn y envía AuditStreamFrame en bucle. brainctl
stream-audit imprime entries en directo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- audit::verify_chain_from_cas() recorre prev_sha desde head hasta genesis,
valida sha256(blob)==sha del CAS para detectar tampering. Endpoint
VerifyAudit + brainctl audit-verify.
- autopromote loop background: cada N segundos detecta cristales sobre
threshold y los promueve sin operador. Anti-doble vía HashSet de pares
(ant, con). Flag --autopromote-secs.
- GapHistogram con buckets exponenciales (1ms..1000s) capturado en
observer.record(). top_gap_pairs(K) limita cardinalidad. Expuesto en
Prometheus como ente_brain_pair_gap_seconds histogram per pair.
- BusRequest::UpdateCapabilities con auth obligatorio (sólo el dueño puede
modificar sus caps). Incarnated.dynamic_provides separa runtime de la
Card immutable. Graph mediator actualiza providers index + revoca grants.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- AuditLog::flush_to_cas() persiste entries pendientes con bytes canónicos
(sha=[0;32]) para que CAS-sha == entry.sha. AuditHeadPointer en disco
tras cada flush — verificación posterior sin escanear el log entero.
- IntrospectRequest::FlushAudit / ReloadRules. brainctl flush-audit / reload.
- Auto-flush task cada 10s cuando --audit-head está configurado.
- ReloadRules { path? } vacía engine + carga (.k vía kcl CLI o .json).
- Observer con time-decay opcional: count * 0.5^(age/half_life).
conditional_prob y pmi consumen valores decayed transparentemente.
- --brain-half-life flag CLI.
- KCL Rust SDK descartado: kcl-* en crates.io son del proyecto KittyCAD,
no KusionStack. Subprocess al CLI sigue siendo la vía canónica.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>