openskynet / docs /status /AUDITORIA_INTERNA.md
Darochin's picture
Mirror OpenSkyNet workspace snapshot from Git HEAD
fc93158 verified

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 garantizada
  • src/canvas-host/server.ts: Watchers de archivos sin cerrar apropiadamente
  • src/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_ALIAS
  • src/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.ts
  • src/config/io.ts
  • src/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 instancias
  • return null/undefined - disperso
  • Result<T, E> - no usado
  • try/catch con re-throw - inconsistente

6.3. Configuración Fragmentada

Hallazgo: Configuración distribuida en múltiples archivos:

  • src/config/zod-schema.ts
  • src/config/types.*.ts (múltiples)
  • src/config/schema.*.ts
  • src/config/defaults.ts

Recomendación: Consolidar en un sistema de configuración unificado.


7. RECOMENDACIONES PRIORITARIAS

Prioridad 1 (Inmediata)

  1. Implementar limpieza de timers - Crear utilidad TimerManager con AbortController
  2. Eliminar bloques catch vacíos - Agregar logging mínimo a todos los catch
  3. Reducir uso de any - Crear interfaces para APIs externas

Prioridad 2 (Corto plazo)

  1. Dividir archivos grandes - Refactorizar archivos >700 líneas
  2. Estandarizar imports - Implementar path aliases
  3. Auditar EventEmitters - Asegurar limpieza de listeners

Prioridad 3 (Mediano plazo)

  1. Consolidar configuración - Unificar schemas de configuración
  2. Mejorar cobertura de tipos - Reducir any a <500 instancias
  3. 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:

  1. Estabilidad a largo plazo (memory leaks)
  2. Mantenibilidad (archivos grandes, anys)
  3. 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