CommunityProgramación y desarrollogithub.com

openclaw-test-heap-leaks

Investiga el crecimiento de memoria en pruebas pnpm de OpenClaw, OOM de Vitest, picos de RSS y deltas de instantáneas de heap.

¿Qué es openclaw-test-heap-leaks?

Esta habilidad está diseñada para diagnosticar problemas de memoria en pruebas unitarias de JavaScript/TypeScript usando el framework Vitest. Proporciona un flujo de trabajo estructurado para investigar y clasificar el crecimiento de memoria, distinguiendo entre fugas reales y retención de módulos en workers compartidos. Soporta plataformas como Claude Code, Cursor, Codex y similares, así como herramientas de desarrollo (DevTools) y scripts de Node.js. La habilidad guía al usuario desde la reproducción del problema hasta la verificación de la solución, utilizando evidencias como instantáneas de heap, perfiles de muestreo y deltas RSS. Incluye un harness dedicado para validar correcciones en tiempo de ejecución (como fugas en closures) y ofrece heurísticas para evitar falsos positivos. El objetivo es reducir el tiempo de depuración y aumentar la precisión en la clasificación de fugas de memoria, permitiendo a los desarrolladores parchear la capa correcta (configuración de Vitest, limpieza de pruebas o código de aplicación) con confianza.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/openclaw-test-heap-leaks

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Fugas de Heap en Pruebas de OpenClaw

Usa esta habilidad para investigaciones de memoria en pruebas. No te bases solo en RSS cuando haya instantáneas de heap disponibles. Trata los deltas de nombres de instantáneas como evidencia de triaje, no como prueba, hasta que los retenedores o dominadores respalden la conclusión.

Lee primero ../openclaw-test-performance/SKILL.md para conocer los comandos actuales de rendimiento de pruebas y el enrutamiento de pruebas.

Para correcciones en tiempo de ejecución (por ejemplo, fugas en closures en servicios de larga duración como el gateway), consulta Validación de correcciones en tiempo de ejecución más abajo; utiliza un harness dedicado en lugar del flujo de trabajo de perfil de pruebas unitarias.

Flujo de Trabajo

  1. Reproduce primero la forma del fallo.

    • Coincide con el punto de entrada real y el presupuesto de workers. Para una línea base amplia de pruebas unitarias rápidas con RSS máximo por configuración y temporización de archivos principales, comienza con:

      pnpm test:perf:groups \
        --config test/vitest/vitest.unit-fast.config.ts \
        --allow-failures \
        --output .artifacts/test-perf/unit-fast-memory.json
      
    • Para un archivo sospechoso, vuelve a ejecutar ese archivo con un worker y recopila evidencia de wall/RSS: /usr/bin/time -l pnpm test <archivo> --maxWorkers=1 --reporter=verbose.

    • La ejecución actual de pnpm test está planificada por scripts/test-projects.mts. Registra la configuración de Vitest o el shard impreso y conserva esa forma cuando el informe sea específico de la configuración o del presupuesto de workers.

  2. Recopila la evidencia de heap más sólida disponible.

    • Ejecuta pnpm test:perf:profile:runner -- --output-dir .artifacts/test-perf/vitest-runner-profile -- <archivo> para obtener un perfil de CPU más un perfil de heap por muestreo del runner de pruebas unitarias. Abre el perfil de heap en DevTools e inspecciona las familias de asignación más grandes.
    • La salida de .heapprofile por muestreo no es un .heapsnapshot; no la pases al helper de delta de instantáneas.
    • Cuando un harness dedicado u otro productor conocido emita archivos .heapsnapshot repetidos, compara las instantáneas del mismo PID con .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs.
    • Si no hay instantáneas ni perfiles de heap disponibles, el crecimiento de RSS es evidencia útil de triaje, pero mantén la clasificación de fuga como no concluyente.
  3. Clasifica el crecimiento antes de elegir una corrección.

    • Si el crecimiento está dominado por cadenas fuente transformadas por Vite/Vitest, Module, system / Context, bytecode, arreglos de descriptores o mapas de propiedades, trátalo como probable crecimiento de grafo de módulos retenidos en workers de larga duración.
    • Si el crecimiento está dominado por objetos de la aplicación, cachés, buffers, manejadores de servidor, temporizadores, estado de mocks, estado de sqlite u objetos similares de tiempo de ejecución, trátalo como una probable limpieza o fuga de ciclo de vida.
    • Si los nombres son ambiguos, detente antes de una etiqueta confiada e inspecciona retenedores/dominadores en DevTools para los principales deltas.
  4. Corrige la capa adecuada.

    • Para probable crecimiento de módulos transformados retenidos en workers compartidos:
      • Inspecciona la configuración de Vitest propietaria y la división en procesos en scripts/test-projects.test-support.mjs. Corrige la vida útil del proceso o la propiedad del proyecto allí solo cuando la evidencia de la misma forma muestre que la retención del worker compartido es la causa.
      • test/vitest/vitest.unit-fast-isolated.config.ts es para pruebas con estado auditadas que necesitan un grafo de módulos fresco. No lo uses como una lista genérica de puntos calientes de memoria.
    • Para fugas reales:
      • Parchea la prueba implicada o la ruta de limpieza en tiempo de ejecución.
      • Busca afterEach/afterAll faltantes, brechas en el reinicio de módulos, estado global retenido, manejadores de base de datos no liberados, o listeners/timers que sobreviven al archivo.
  5. Verifica con la prueba más directa.

    • Vuelve a ejecutar el mismo comando agrupado o con ámbito y confirma que la tendencia de RSS máximo o OOM se ha reducido.
    • Cuando un productor dedicado emita perfiles o instantáneas de heap, repite el mismo productor y compara artefactos equivalentes.
    • Para cambios de enrutamiento o configuración, verifica que la configuración de Vitest o el shard esperado se inicie y que las pruebas afectadas se completen.

Heurísticas

  • No llames a todo fuga. El crecimiento en un proyecto compartido de Vitest no aislado puede ser un problema de vida útil del worker, no una fuga de objetos de la aplicación.
  • scripts/test-projects.mts, scripts/test-group-report.mts y scripts/run-vitest-profile.mts son los puntos de entrada actuales de ejecución, RSS agrupado y perfil.
  • Las líneas [test] starting ... identifican la configuración de Vitest o el shard para reproducir.
  • .artifacts/vitest-shard-timings.json almacena las duraciones de configuración/shard para la planificación. No es un mapa de puntos calientes de memoria ni un manifiesto de comportamiento a nivel de archivo.
  • Cuando las mismas familias de objetos retenidos crecen en múltiples intervalos dentro del mismo PID de worker, confía en las instantáneas sobre la intuición, luego confirma las llamadas ambiguas con evidencia de retenedores.

Comparación de Instantáneas

  • Comparación directa:
    • node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs before.heapsnapshot after.heapsnapshot
  • Selección automática de instantáneas más tempranas/tardías por PID dentro de un carril:
    • node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs --lane-dir <directorio-de-instantáneas>
  • Banderas útiles:
    • --top 40
    • --min-kb 32
    • --pid 16133

Lee primero los deltas positivos principales. Un gran crecimiento positivo en artefactos de transformación de módulos apunta a un problema de vida útil del proceso compartido o de propiedad del proyecto; un gran crecimiento positivo en objetos de tiempo de ejecución sugiere una fuga real. Si los nombres por sí solos no lo resuelven, abre el mismo par de instantáneas en DevTools e inspecciona retenedores/dominadores para las filas principales antes de declarar la causa raíz.

Validación de correcciones en tiempo de ejecución (no memoria de pruebas)

El flujo de trabajo anterior es para diagnosticar el crecimiento de memoria de los workers de Vitest. Para validar que una corrección en tiempo de ejecución/closure realmente libera el estado capturado, usa el harness dedicado:

  • pnpm leak:embedded-run — ejecuta scripts/embedded-run-abort-leak.ts. Itera N ejecuciones abortadas en un ámbito con forma de función que imita runEmbeddedAttempt, escribe instantáneas de heap y reporta un veredicto de PASA/NO PASA sobre el crecimiento de retención usando FinalizationRegistry para el conteo de instancias rastreadas más el delta de RSS.

Modos:

  • closure-extracted (predeterminado) — forma de corrección de producción (helper a nivel de módulo).
  • closure-inline — forma previa a la corrección (closure dentro del ámbito del runner). Úsalo como una comprobación de sensibilidad: si pasa, has roto el harness, no corregido un error.
  • synthetic-leak — retiene deliberadamente a través de un bucket a nivel de módulo. Úsalo para confirmar que el harness puede detectar fugas antes de confiar en un PASA en una corrección real.

Las instantáneas se alojan en .tmp/embedded-run-abort-leak/. Compara con el mismo script que arriba:

node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs \
  .tmp/embedded-run-abort-leak/baseline-*.heapsnapshot \
  .tmp/embedded-run-abort-leak/batch-N-*.heapsnapshot --top 30

Al corregir una fuga diferente en tiempo de ejecución, añade un nuevo harness junto a este en lugar de readaptarlo. La función de fixture debe imitar el ámbito léxico de la función donde reside la fuga, no ser un bucle de aborto genérico.

Expectativas de Salida

Al usar esta habilidad, reporta:

  • El comando exacto de reproducción.
  • Qué configuración de Vitest o target se reprodujo, y qué PID se comparó cuando había instantáneas disponibles.
  • Las familias de objetos retenidos dominantes del perfil de heap o del delta de instantáneas, cuando estén disponibles.
  • Si el problema es probablemente una fuga real o un probable crecimiento de módulos retenidos en workers compartidos, además de si los retenedores/dominadores lo confirmaron.
  • La corrección concreta o el parche de reducción de impacto.
  • Lo que verificaste y qué sobrecarga de instantáneas te impidió verificar.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills when explicitly requested; install, verify, update, uninstall, publish, or sync skills.

Skills relacionados