# Operabilidad Y Logs Esta nota fija el mapa real de observabilidad de `~/openskynet`: qué artefactos se generan, dónde quedan, y qué mirar para entender estado interno, trabajo autónomo y errores. ## Resumen OpenSkyNet sí genera bastante rastro operativo, pero no está unificado en un solo backend. Hoy la observabilidad está repartida en cuatro planos: 1. `Gateway/runtime general` 2. `Sesiones y transcripts por agente` 3. `Cron y trabajo autónomo periódico` 4. `Estado interno Omega/Skynet` La consecuencia práctica es simple: - para errores del servicio y canales: mirar `journalctl` + rolling log - para trabajo interno real del agente: mirar `sessions.json` + `*.jsonl` - para cron: mirar `cron/jobs.json` + `cron/runs/*.jsonl` - para Skynet/Omega: mirar `~/openskynet/.openskynet/*` + `memory/SKYNET_*.md` ## Fuentes Principales ### 1. Gateway y runtime general Rutas y comandos principales: - `journalctl --user -u openskynet-gateway.service -n 200 --no-pager` - `/tmp/openclaw/openclaw-YYYY-MM-DD.log` - Web UI -> pestaña `Logs` Código relevante: - [logger.ts](/home/daroch/openskynet/src/logging/logger.ts#L1) - [logs.ts](/home/daroch/openskynet/src/gateway/server-methods/logs.ts#L1) - [openskynet-gateway.service](/home/daroch/.config/systemd/user/openskynet-gateway.service#L1) Qué cubre: - arranque/parada del gateway - errores HTTP/WebSocket - errores de channels/providers - mensajes de runtime y subsistemas - eventos visibles por `logs.tail` Notas: - el rolling log por defecto vive en `/tmp/openclaw`, no en `~/.openskynet` - `logs.tail` lee el archivo resuelto por `getResolvedLoggerSettings().file` - el servicio systemd actual no redirige a un archivo propio bajo `~/.openskynet/logs`; el primer lugar a mirar sigue siendo `journalctl` ### 2. Sesiones y transcripts por agente Rutas: - `~/.openskynet/agents//sessions/sessions.json` - `~/.openskynet/agents//sessions/.jsonl` Ejemplo real: - [sessions.json](/home/daroch/.openskynet/agents/openskynet/sessions/sessions.json#L1) Qué cubre: - historial real de conversaciones/turnos - herramienta invocada por turno - contexto de entrega - session key - paths a transcript - metadata persistida de skills/model snapshots Uso práctico: - si quieres saber “qué hizo realmente el agente”, esto vale más que el log general - para heartbeats y cron aislado, el transcript `jsonl` es la fuente más fina de auditoría ### 3. Cron y trabajo autónomo periódico Rutas: - [jobs.json](/home/daroch/.openskynet/cron/jobs.json#L1) - `~/.openskynet/cron/runs/.jsonl` Ejemplo real: - [9d162660-de31-4c07-b227-99af71165ec5.jsonl](/home/daroch/.openskynet/cron/runs/9d162660-de31-4c07-b227-99af71165ec5.jsonl#L1) Qué cubre: - definición activa de jobs - `nextRunAtMs`, `lastRunStatus`, `consecutiveErrors` - historia de cada corrida - `error`, `summary`, `sessionId`, `sessionKey` - `model`, `provider`, `usage` - estado de entrega por canal Esto hoy es uno de los mejores puntos de observabilidad del sistema. Si un cron “hizo algo raro” o falló sin quedar claro en UI, esta es la primera fuente a revisar. ### 4. Estado interno Omega/Skynet Rutas de workspace: - `~/openskynet/.openskynet/living-memory/state/*.json` - `~/openskynet/.openskynet/living-memory/history.jsonl` - `~/openskynet/.openskynet/omega-*/*.json` - `~/openskynet/.openskynet/skynet-*/*.json` - `~/openskynet/memory/SKYNET_*.md` Ejemplos reales: - [agent_openskynet_main.json](/home/daroch/openskynet/.openskynet/living-memory/state/agent_openskynet_main.json#L1) - [history.jsonl](/home/daroch/openskynet/.openskynet/living-memory/history.jsonl#L1) - [agent_openskynet_main.json](/home/daroch/openskynet/.openskynet/skynet-nucleus/agent_openskynet_main.json#L1) - [agent_openskynet_main.json](/home/daroch/openskynet/.openskynet/skynet-study-program/agent_openskynet_main.json#L1) - [agent_openskynet_main.json](/home/daroch/openskynet/.openskynet/skynet-continuity/agent_openskynet_main.json#L1) - [SKYNET_PULSE.md](/home/daroch/openskynet/memory/SKYNET_PULSE.md#L1) - [SKYNET_COMMITMENT.md](/home/daroch/openskynet/memory/SKYNET_COMMITMENT.md#L1) Qué cubre: - estado vivo unificado - historia causal/eventos entre ciclos - identidad operativa - foco activo - continuidad - compromiso actual - experimento activo - snapshots de state authority / agenda / nucleus / study program Importante: - esto no es un “log lineal” como `journalctl` - la autoridad operativa vive primero en `.openskynet/` - `memory/SKYNET_*.md` debe leerse como vista humana derivada, no como fuente primaria - `memory/YYYY-MM-DD.md` es historia humana y puede quedar obsoleto rápido; no debe usarse para responder estado actual del sistema ## Logs Especializados Además del plano general, existen logs o artefactos especializados: - `~/openskynet/.openskynet/heartbeat.log` - `~/openskynet/.openskynet/omega-empirical-metrics.json` - `~/openskynet/.openskynet/holographic-memory.json` - `~/openskynet/.openskynet/jepa-empirical-log.jsonl` - `~/openskynet/.openskynet/omega-thoughts.jsonl` - `~/.openskynet/autonomy-decisions.jsonl` - `~/.openskynet/autonomy-metrics.json` - `~/.openskynet/logs/config-audit.jsonl` - `~/.openskynet/logs/cache-trace.jsonl` - `~/.openskynet/logs/raw-stream.jsonl` - `~/.openskynet/logs/commands.log` - `~/.openskynet/logs/anthropic-payload.jsonl` No todos estos existen siempre. Muchos aparecen solo si la ruta o el subsistema se activa. ## Qué Mirar Según El Problema ### El gateway o la Web UI están raros Mirar: - `journalctl --user -u openskynet-gateway.service -n 200 --no-pager` - `/tmp/openclaw/openclaw-YYYY-MM-DD.log` ### Un canal Telegram/WhatsApp/Web parece fallar Mirar: - `journalctl` - rolling log `/tmp/openclaw/openclaw-YYYY-MM-DD.log` - `Health` y `Debug` en Web UI Observación: - hoy no hay un archivo de log por canal dedicado y estable para cada provider - la mayoría de esos errores cae al log general del gateway ### El cron despertó y no sabes qué hizo Mirar: - [jobs.json](/home/daroch/.openskynet/cron/jobs.json#L1) - `~/.openskynet/cron/runs/*.jsonl` - luego el transcript `sessionId` asociado ### El heartbeat trabajó solo y quieres auditarlo Mirar: - `last-heartbeat` por gateway/UI - `~/.openskynet/agents/openskynet/sessions/sessions.json` - el `jsonl` de esa sesión ### Quieres entender en qué está trabajando Skynet Mirar: - `~/openskynet/.openskynet/living-memory/state/*.json` - `~/openskynet/.openskynet/living-memory/history.jsonl` - `~/openskynet/memory/SKYNET_PULSE.md` - `~/openskynet/memory/SKYNET_CONTINUITY.md` - `~/openskynet/memory/SKYNET_ACTIVE_EXPERIMENT.md` - `~/openskynet/memory/SKYNET_COMMITMENT.md` - `~/openskynet/.openskynet/skynet-*/*.json` ## Problemas Y Huecos Actuales Estos son los principales huecos reales del pipeline de observabilidad: ### 1. Observabilidad fragmentada - el estado principal vive en `~/.openskynet` - el log general vive en `/tmp/openclaw` - varios experimentos viven en `~/openskynet/.openskynet` Esto obliga a mirar tres raíces distintas para entender el sistema. ### 2. Legacy naming todavía mezclado Aunque el producto ya es `OpenSkyNet`, persisten nombres `openclaw` en: - nombres de logs - métodos gateway - rutas legacy - documentación interna No rompe operación, pero confunde diagnóstico. ### 3. Falta de logs dedicados por subsistema de canal Telegram, WhatsApp, Web, Discord y otros no tienen hoy un archivo dedicado consistente por provider. El error operativo termina mezclado en el log general del gateway. ### 4. Skynet/Omega tiene buen estado, pero poco tracing lineal Hay snapshots muy útiles, pero menos “timeline continua” de bajo costo para reconstruir: - qué decidió - qué descartó - qué cambió entre ciclos Esto mejora ahora con `living-memory/history.jsonl`, pero todavía no cubre todo el runtime general. ### 6. Artefactos humanos redundantes pueden contaminar la lectura Si aparecen archivos como `memory/SKYNET_FOCAL_POINT.md`, `memory/SKYNET_RESEARCH_HARVEST.md` o diarios autónomos nuevos, trátalos como derivados/experimentales a menos que estén respaldados por un store estructurado y un pipeline canónico. ### 5. Algunas rutas especializadas no usan siempre la raíz canónica El riesgo histórico era que ciertos componentes resolvieran su storage por cuenta propia. Ejemplo: `AutonomyLogger` antes podía divergir del state dir activo/perfil. Eso ya fue alineado a la resolución canónica. ## Ruta Operativa Recomendada Para diagnóstico rápido, este orden funciona bien: 1. `journalctl --user -u openskynet-gateway.service -n 200 --no-pager` 2. `/tmp/openclaw/openclaw-YYYY-MM-DD.log` 3. `~/.openskynet/cron/jobs.json` 4. `~/.openskynet/cron/runs/*.jsonl` 5. `~/.openskynet/agents/openskynet/sessions/sessions.json` 6. `~/.openskynet/agents/openskynet/sessions/*.jsonl` 7. `~/openskynet/memory/SKYNET_*.md` 8. `~/openskynet/.openskynet/skynet-*/*.json` 9. `~/openskynet/.openskynet/living-memory/state/*.json` 10. `~/openskynet/.openskynet/living-memory/history.jsonl` ## Próximos Mejorables Si se quiere endurecer de verdad la operabilidad futura, los siguientes pasos serían sensatos: 1. Unificar logs generales y estado bajo una sola raíz operativa. 2. Exponer cron runs, session transcripts y últimos errores críticos directamente en la Web UI. 3. Agregar logs dedicados por provider/canal. 4. Agregar un `Skynet activity trace` lineal además de snapshots. 5. Crear un comando único tipo `openskynet doctor observability` o `openskynet logs map`. ## Reset De Memoria Viva Plan en seco: ```bash node --import tsx scripts/openskynet-memory-reset.ts ``` Ejecución real: ```bash node --import tsx scripts/openskynet-memory-reset.ts --execute ``` Incluyendo vistas humanas derivadas: ```bash node --import tsx scripts/openskynet-memory-reset.ts --include-human-readable --execute ```