Auditoría Interna - OpenClaw/OpenSkyNet
Fecha: 2026-03-14
Auditor: OpenSkyNet (asistente científico cognitivo-operativo)
Alcance: Código fuente completo (src/, extensions/, configuración)
1. RESUMEN EJECUTIVO
| Categoría | Hallazgos Críticos | Hallazgos Medios | Hallazgos Baja |
|---|---|---|---|
| Seguridad | 2 | 4 | 8 |
| Rendimiento | 3 | 5 | 6 |
| Deuda Técnica | 5 | 12 | 20 |
| Arquitectura | 4 | 8 | 10 |
| TOTAL | 14 | 29 | 44 |
Estado general: ⚠️ MODERADO - El proyecto tiene deuda técnica significativa pero no hay vulnerabilidades críticas inmediatas.
2. HALLAZGOS CRÍTICOS
2.1. Memory Leaks Potenciales (CRÍTICO)
Problema: Desbalance entre timers creados y limpiados.
setInterval/setTimeout: 439 instancias
clearInterval/clearTimeout: 273 instancias
Diferencia: 166 timers potencialmente huérfanos
Ubicaciones críticas:
src/agents/subagent-registry.ts: Uso extensivo de timers sin limpieza garantizadasrc/canvas-host/server.ts: Watchers de archivos sin cerrar apropiadamentesrc/gateway/server.impl.ts: Múltiples intervalos de mantenimiento
Impacto: Acumulación de memoria en ejecuciones prolongadas, potencial crash del gateway.
Recomendación: Implementar patrón AbortController para limpieza centralizada de todos los timers.
2.2. EventEmitter Sin Limpieza (CRÍTICO)
Problema: 196 EventEmitters sin removeListener correspondiente.
Ejemplo problemático:
// src/agents/subagent-registry.ts
shutdownSignal.addEventListener("abort", onShutdown, { once: true });
// ...
shutdownSignal.removeEventListener("abort", onShutdown);
Aunque algunos usan { once: true }, no todos los casos están cubiertos.
Impacto: Memory leak en suscripciones a eventos, especialmente en reconexiones de gateway.
2.3. Uso Extensivo de any (CRÍTICO)
Estadísticas:
any/as any/as unknown: ~1,912 instancias@ts-ignore/@ts-expect-error: 3 instancias// @ts-nocheck: 0 archivos (bueno)
Ejemplo problemático:
// src/telegram/bot.ts
const fetchForClient = telegramTransport.fetch as unknown as NonNullable<
ApiClientOptions["fetch"]
>;
Impacto: Pérdida de type safety, errores en runtime no detectados en compilación.
Recomendación: Crear interfaces explícitas para todos los puntos de integración con APIs externas.
2.4. Bloques Catch Vacíos (CRÍTICO)
Problema: Múltiples bloques catch que silencian errores:
// src/pairing/pairing-store.ts:476
} catch {}
// src/canvas-host/a2ui.ts:106
} catch {}
// src/canvas-host/a2ui.ts:130
} catch {}
Impacto: Errores silenciados que dificultan debugging, comportamiento indefinido.
Recomendación: Toda excepción debe ser al menos logueada, idealmente manejada explícitamente.
2.5. Dependencias Circulares Potenciales (ALTO)
Problema: Importaciones con múltiples niveles de ../:
- 460 archivos con 4+ niveles de
../ - 10 archivos con 6+ niveles de
../
Ejemplo:
// src/channels/plugins/onboarding/whatsapp.test.ts
import { ... } from "../../../utils.js";
Impacto: Dificultad para testing unitario, acoplamiento excesivo entre módulos.
3. HALLAZGOS DE SEGURIDAD
3.1. Manejo de Secretos (MEDIO)
Hallazgo: Referencias a secretos en múltiples lugares:
src/config/types.secrets.ts: DEFAULT_SECRET_PROVIDER_ALIASsrc/config/io.runtime-snapshot-write.test.ts: Comentarios sobre preservación de secretos
Estado: ✅ Bien manejado - Usan referencias en lugar de valores planos.
3.2. Inyección de Comandos (BAJO)
Hallazgo: src/process/exec.ts tiene protección contra inyección:
const WINDOWS_UNSAFE_CMD_CHARS_RE = /[&|<>^%\r\n]/;
Estado: ✅ Bien protegido - Rechaza caracteres peligrosos.
3.3. Prototype Pollution (BAJO)
Hallazgo: Uso correcto de Object.prototype.hasOwnProperty.call() en:
src/config/sessions/store.tssrc/config/io.tssrc/config/merge-patch.proto-pollution.test.ts
Estado: ✅ Protegido contra prototype pollution.
4. HALLAZGOS DE RENDIMIENTO
4.1. Archivos Excesivamente Grandes (ALTO)
| Archivo | Líneas | Problema |
|---|---|---|
src/security/audit.test.ts |
3,671 | Test monolítico |
src/agents/subagent-announce.format.e2e.test.ts |
2,968 | Test E2E muy largo |
src/agents/pi-embedded-runner/run/attempt.ts |
2,813 | Lógica compleja |
src/memory/qmd-manager.test.ts |
2,805 | Test monolítico |
src/telegram/bot.create-telegram-bot.test.ts |
2,262 | Test extenso |
Recomendación: Dividir archivos >700 líneas (límite sugerido en AGENTS.md).
4.2. Uso de WebSocket (MEDIO)
Estadística: 964 referencias a WebSocket/ws
Problema: Alto uso de conexiones persistentes sin manejo claro de reconexión.
4.3. Operaciones de Filesystem (BAJO)
Estadística: 5,197 operaciones de filesystem
Observación: Uso intensivo de I/O síncrono potencialmente bloqueante.
5. DEUDA TÉCNICA
5.1. TODOs/FIXMEs Pendientes
Conteo: ~8 TODOs/FIXMEs no-test
Ejemplos:
// src/acp/translator.ts
// TODO: when ChatEventSchema gains a structured errorKind field
// src/agents/pi-embedded-runner/compact.ts
// TODO(#7175): Consider exposing full message snapshots
// TODO(#9611): Consider exposing compaction summaries
5.2. Uso de Console (BAJO)
Estadística: 179 usos de console.log/warn/error/debug
Problema: Mezcla de logging - debería usar el sistema de logging unificado.
5.3. Imports Relativos Excesivos (MEDIO)
Estadística:
- 8,758 imports relativos (
../) - 628 exports relativos
Problema: Dificulta refactorización y movimiento de archivos.
Recomendación: Usar path aliases de TypeScript (@/, #/).
6. INCONSISTENCIAS ARQUITECTURALES
6.1. Patrones Mixtos de Importación
Hallazgo: Mezcla de:
import { x } from "./file.js"(ESM)import x = require("x")(CommonJS legacy)- Dynamic imports dispersos
Recomendación: Estandarizar en ESM puro.
6.2. Manejo de Errores Inconsistente
Patrones encontrados:
throw new Error()- 3,073 instanciasreturn null/undefined- dispersoResult<T, E>- no usadotry/catchcon re-throw - inconsistente
6.3. Configuración Fragmentada
Hallazgo: Configuración distribuida en múltiples archivos:
src/config/zod-schema.tssrc/config/types.*.ts(múltiples)src/config/schema.*.tssrc/config/defaults.ts
Recomendación: Consolidar en un sistema de configuración unificado.
7. RECOMENDACIONES PRIORITARIAS
Prioridad 1 (Inmediata)
- Implementar limpieza de timers - Crear utilidad
TimerManagerconAbortController - Eliminar bloques catch vacíos - Agregar logging mínimo a todos los catch
- Reducir uso de
any- Crear interfaces para APIs externas
Prioridad 2 (Corto plazo)
- Dividir archivos grandes - Refactorizar archivos >700 líneas
- Estandarizar imports - Implementar path aliases
- Auditar EventEmitters - Asegurar limpieza de listeners
Prioridad 3 (Mediano plazo)
- Consolidar configuración - Unificar schemas de configuración
- Mejorar cobertura de tipos - Reducir
anya <500 instancias - Documentar arquitectura - Crear diagrama de dependencias
8. MÉTRICAS DEL PROYECTO
Total archivos TypeScript: ~5,079
Total líneas de código: ~665,000
Tests: ~2,123 archivos
Cobertura objetivo: 70% (según AGENTS.md)
Deuda técnica estimada:
- any/as unknown: 1,912 instancias
- Timers sin limpieza: 166 potenciales
- EventEmitters sin cleanup: 196
- Archivos >700 líneas: ~30
9. CONCLUSIÓN
El proyecto OpenClaw es funcional y bien estructurado pero acumula deuda técnica significativa que podría impactar:
- Estabilidad a largo plazo (memory leaks)
- Mantenibilidad (archivos grandes, anys)
- Calidad del código (inconsistencias)
No se encontraron vulnerabilidades críticas de seguridad en el código analizado.
Próxima auditoría recomendada: Después de implementar las recomendaciones de Prioridad 1.
Documento generado por OpenSkyNet - Asistente Científico Cognitivo-Operativo
Fecha: 2026-03-14 | Revisión: 1.0