opción
HogarHogar Skill DevOps y CI/CD debug-buttercup

debug-buttercup

trailofbits/skills trailofbits/skills

Depura el CRS (Cyber Reasoning System) de Buttercup que se ejecuta en Kubernetes. Úsalo para diagnosticar fallos de pods, bucles de reinicio, fallos de Redis, presión sobre los recursos, saturación de disco, problemas con DinD o cualquier comportamiento anómalo de los servicios en el espacio de nombres crs. Abarca la clasificación de incidencias, el análisis de registros, la inspección de colas y los patrones de fallo habituales para: redis, fuzzer-bot, coverage-bot, seed-gen, patcher, build-bot, scheduler, task-server, task-downloader, program-model, litellm, dind, tracer-bot, merger-bot, competition-api y pov-reprod.

...Expandir todo
35
Tiempo actualizado 29 de junio de 2026

Acerca de debug-buttercup

La skill « debug-buttercup » está diseñada para solucionar y diagnosticar problemas en el sistema Buttercup Cyber Reasoning System (CRS) implementado en Kubernetes. Se centra en identificar las causas raíz de los fallos de los pods, los bucles de reinicio, los fallos de Redis, la sobrecarga de recursos, la saturación del disco, los problemas de Docker-in-Docker (DinD) y otros comportamientos anómalos de los servicios en el espacio de nombres `crs`. Al proporcionar una clasificación sistemática y un análisis de registros, ayuda a los ingenieros a localizar con precisión el origen de los fallos y a reducir el tiempo de inactividad en todo el sistema.

La skill ofrece capacidades para flujos de trabajo de clasificación, incluyendo la comprobación del estado de los pods, la revisión de eventos, la inspección de registros y la comparación de los límites de recursos reales con las configuraciones previstas. Permite detectar tanto problemas históricos como actuales, distinguiendo entre recuentos acumulados de reinicios y fallos activos. Debug-buttercup también facilita la detección de fallos en cascada, en los que un único problema de servicio, como la indisponibilidad de Redis, puede desencadenar reinicios generalizados. Los usuarios pueden analizar los registros de todas las réplicas, ver registros en tiempo real y recopilarlos en disco para un examen más detallado. También se incluyen comprobaciones de la presión sobre los recursos, tanto a nivel de pod como de nodo, para identificar limitaciones de CPU, memoria y disco.

Esta skill es ideal para operadores de Kubernetes, ingenieros de fiabilidad del sitio y desarrolladores que trabajan con el CRS Buttercup y que necesitan mantener la estabilidad del sistema y resolver rápidamente los incidentes. Entre los casos de uso habituales se incluyen la investigación de reinicios inesperados de pods, el diagnóstico de servicios que no responden, la verificación del avance de las colas y la resolución de fallos en las comprobaciones de estado. Al centrarse en los fallos dentro del espacio de nombres `crs`, « debug-buttercup » garantiza una resolución de problemas específica y eficiente sin afectar a implementaciones no relacionadas ni a tareas de optimización del rendimiento.

Preguntas frecuentes

¿Cuándo debo utilizar « debug-buttercup »?

Utiliza esta skill cuando los pods del espacio de nombres `crs` se bloqueen, se reinicien de forma inesperada, sufran presión de recursos o cuando servicios como Redis no respondan. También resulta útil para diagnosticar atascos en las colas, fallos de DinD, problemas del programador y otros comportamientos anómalos en el sistema CRS.

¿Puedo utilizar « debug-buttercup » fuera del espacio de nombres de CRS?

No, esta skill está diseñada específicamente para depurar servicios dentro del espacio de nombres `crs` de Kubernetes. Para problemas en otros espacios de nombres, debes utilizar los métodos estándar de resolución de problemas de Kubernetes u otras herramientas adecuadas.

¿ debug-buttercup gestiona implementaciones o actualizaciones?

No, no está pensada para implementar ni actualizar Buttercup. Las tareas de implementación y actualización deben realizarse utilizando Helm y las guías oficiales de implementación.

¿Cómo ayuda « debug-buttercup » con los fallos en cadena?

Identifica fallos de dependencias compartidas, como la caída de Redis, que pueden provocar el reinicio de varios pods. Al analizar los registros `--previous` de todos los servicios, permite a los ingenieros centrarse en la causa raíz en lugar de en los pods individuales.

¿Incluye la skill comprobaciones de recursos?

Sí, « debug-buttercup » incluye comandos para inspeccionar el uso de la CPU, la memoria y el disco, tanto a nivel de pod como de nodo, lo que ayuda a identificar las causas de los fallos relacionadas con los recursos.

Ver en GitHub

Debug Buttercup

When to Use

  • Pods in the crs namespace are in CrashLoopBackOff, OOMKilled, or restarting
  • Multiple services restart simultaneously (cascade failure)
  • Redis is unresponsive or showing AOF warnings
  • Queues are growing but tasks are not progressing
  • Nodes show DiskPressure, MemoryPressure, or PID pressure
  • Build-bot cannot reach the Docker daemon (DinD failures)
  • Scheduler is stuck and not advancing task state
  • Health check probes are failing unexpectedly
  • Deployed Helm values don't match actual pod configuration

When NOT to Use

  • Deploying or upgrading Buttercup (use Helm and deployment guides)
  • Debugging issues outside the crs Kubernetes namespace
  • Performance tuning that doesn't involve a failure symptom

Namespace and Services

All pods run in namespace crs. Key services:

LayerServices
Infraredis, dind, litellm, registry-cache
Orchestrationscheduler, task-server, task-downloader, scratch-cleaner
Fuzzingbuild-bot, fuzzer-bot, coverage-bot, tracer-bot, merger-bot
Analysispatcher, seed-gen, program-model, pov-reproducer
Interfacecompetition-api, ui

Triage Workflow

Always start with triage. Run these three commands first:

# 1. Pod status - look for restarts, CrashLoopBackOff, OOMKilledkubectl get pods -n crs -o wide# 2. Events - the timeline of what went wrongkubectl get events -n crs --sort-by='.lastTimestamp'# 3. Warnings only - filter the noisekubectl get events -n crs --field-selector type=Warning --sort-by='.lastTimestamp'

Then narrow down:

# Why did a specific pod restart? Check Last State Reason (OOMKilled, Error, Completed)kubectl describe pod -n crs <pod-name> | grep -A8 'Last State:'# Check actual resource limits vs intendedkubectl get pod -n crs <pod-name> -o jsonpath='{.spec.containers[0].resources}'# Crashed container's logs (--previous = the container that died)kubectl logs -n crs <pod-name> --previous --tail=200# Current logskubectl logs -n crs <pod-name> --tail=200

Historical vs Ongoing Issues

High restart counts don't necessarily mean an issue is ongoing -- restarts accumulate over a pod's lifetime. Always distinguish:

  • --tail shows the end of the log buffer, which may contain old messages. Use --since=300s to confirm issues are actively happening now.
  • --timestamps on log output helps correlate events across services.
  • Check Last State timestamps in describe pod to see when the most recent crash actually occurred.

Cascade Detection

When many pods restart around the same time, check for a shared-dependency failure before investigating individual pods. The most common cascade: Redis goes down -> every service gets ConnectionError/ConnectionRefusedError -> mass restarts. Look for the same error across multiple --previous logs -- if they all say redis.exceptions.ConnectionError, debug Redis, not the individual services.

Log Analysis

# All replicas of a service at oncekubectl logs -n crs -l app=fuzzer-bot --tail=100 --prefix# Stream livekubectl logs -n crs -l app.kubernetes.io/name=redis -f# Collect all logs to disk (existing script)bash deployment/collect-logs.sh

Resource Pressure

# Per-pod CPU/memorykubectl top pods -n crs# Node-levelkubectl top nodes# Node conditions (disk pressure, memory pressure, PID pressure)kubectl describe node <node> | grep -A5 Conditions# Disk usage inside a podkubectl exec -n crs <pod> -- df -h# What's eating diskkubectl exec -n crs <pod> -- sh -c 'du -sh /corpus/* 2>/dev/null'kubectl exec -n crs <pod> -- sh -c 'du -sh /scratch/* 2>/dev/null'

Redis Debugging

Redis is the backbone. When it goes down, everything cascades.

# Redis pod statuskubectl get pods -n crs -l app.kubernetes.io/name=redis# Redis logs (AOF warnings, OOM, connection issues)kubectl logs -n crs -l app.kubernetes.io/name=redis --tail=200# Connect to Redis CLIkubectl exec -n crs <redis-pod> -- redis-cli# Inside redis-cli: key diagnosticsINFO memory          # used_memory_human, maxmemoryINFO persistence     # aof_enabled, aof_last_bgrewrite_status, aof_delayed_fsyncINFO clients         # connected_clients, blocked_clientsINFO stats           # total_connections_received, rejected_connectionsCLIENT LIST          # see who's connectedDBSIZE               # total keys# AOF configurationCONFIG GET appendonly     # is AOF enabled?CONFIG GET appendfsync   # fsync policy: everysec, always, or no# What is /data mounted on? (disk vs tmpfs matters for AOF performance)
kubectl exec -n crs <redis-pod> -- mount | grep /datakubectl exec -n crs <redis-pod> -- du -sh /data/

Queue Inspection

Buttercup uses Redis streams with consumer groups. Queue names:

QueueStream Key
Buildfuzzer_build_queue
Build Outputfuzzer_build_output_queue
Crashfuzzer_crash_queue
Confirmed Vulnsconfirmed_vulnerabilities_queue
Download Tasksorchestrator_download_tasks_queue
Ready Taskstasks_ready_queue
Patchespatches_queue
Indexindex_queue
Index Outputindex_output_queue
Traced Vulnstraced_vulnerabilities_queue
POV Requestspov_reproducer_requests_queue
POV Responsespov_reproducer_responses_queue
Delete Taskorchestrator_delete_task_queue
# Check stream length (pending messages)kubectl exec -n crs <redis-pod> -- redis-cli XLEN fuzzer_build_queue# Check consumer group lagkubectl exec -n crs <redis-pod> -- redis-cli XINFO GROUPS fuzzer_build_queue# Check pending messages per consumerkubectl exec -n crs <redis-pod> -- redis-cli XPENDING fuzzer_build_queue build_bot_consumers - + 10# Task registry sizekubectl exec -n crs <redis-pod> -- redis-cli HLEN tasks_registry# Task state countskubectl exec -n crs <redis-pod> -- redis-cli SCARD cancelled_taskskubectl exec -n crs <redis-pod> -- redis-cli SCARD succeeded_taskskubectl exec -n crs <redis-pod> -- redis-cli SCARD errored_tasks

Consumer groups: build_bot_consumers, orchestrator_group, patcher_group, index_group, tracer_bot_group.

Health Checks

Pods write timestamps to /tmp/health_check_alive. The liveness probe checks file freshness.

# Check health file freshnesskubectl exec -n crs <pod> -- stat /tmp/health_check_alivekubectl exec -n crs <pod> -- cat /tmp/health_check_alive

If a pod is restart-looping, the health check file is likely going stale because the main process is blocked (e.g. waiting on Redis, stuck on I/O).

Telemetry (OpenTelemetry / Signoz)

All services export traces and metrics via OpenTelemetry. If Signoz is deployed (global.signoz.deployed: true), use its UI for distributed tracing across services.

# Check if OTEL is configuredkubectl exec -n crs <pod> -- env | grep OTEL# Verify Signoz pods are running (if deployed)kubectl get pods -n platform -l app.kubernetes.io/name=signoz

Traces are especially useful for diagnosing slow task processing, identifying which service in a pipeline is the bottleneck, and correlating events across the scheduler -> build-bot -> fuzzer-bot chain.

Volume and Storage

# PVC statuskubectl get pvc -n crs# Check if corpus tmpfs is mounted, its size, and backing typekubectl exec -n crs <pod> -- mount | grep corpus_tmpfskubectl exec -n crs <pod> -- df -h /corpus_tmpfs 2>/dev/null# Check if CORPUS_TMPFS_PATH is setkubectl exec -n crs <pod> -- env | grep CORPUS# Full disk layout - what's on real disk vs tmpfskubectl exec -n crs <pod> -- df -h

CORPUS_TMPFS_PATH is set when global.volumes.corpusTmpfs.enabled: true. This affects fuzzer-bot, coverage-bot, seed-gen, and merger-bot.

Deployment Config Verification

When behavior doesn't match expectations, verify Helm values actually took effect:

# Check a pod's actual resource limitskubectl get pod -n crs <pod-name> -o jsonpath='{.spec.containers[0].resources}'# Check a pod's actual volume definitionskubectl get pod -n crs <pod-name> -o jsonpath='{.spec.volumes}'

Helm values template typos (e.g. wrong key names) silently fall back to chart defaults. If deployed resources don't match the values template, check for key name mismatches.

Service-Specific Debugging

For detailed per-service symptoms, root causes, and fixes, see references/failure-patterns.md.

Quick reference:

  • DinD: kubectl logs -n crs -l app=dind --tail=100 -- look for docker daemon crashes, storage driver errors
  • Build-bot: check build queue depth, DinD connectivity, OOM during compilation
  • Fuzzer-bot: corpus disk usage, CPU throttling, crash queue backlog
  • Patcher: LiteLLM connectivity, LLM timeout, patch queue depth
  • Scheduler: the central brain -- kubectl logs -n crs -l app=scheduler --tail=-1 --prefix | grep "WAIT_PATCH_PASS\|ERROR\|SUBMIT"

Diagnostic Script

Run the automated triage snapshot:

bash {baseDir}/scripts/diagnose.sh

Pass --full to also dump recent logs from all pods:

bash {baseDir}/scripts/diagnose.sh --full

This collects pod status, events, resource usage, Redis health, and queue depths in one pass.

Todos los archivos

3 archivos
SKILL.md 9.7k
Ver

Instalar debug-buttercup

Descarga y descomprime los archivos de las habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/trailofbits/skills/blob/main/plugins/debug-buttercup/skills/debug-buttercup/SKILL.md # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/. Claude la detectará automáticamente y la utilizará.
Repositorio trailofbits/skills

Habilidades relacionadas

Verification &amp; Quality Assurance
Tiempo actualizado 29 de junio de 2026
base44-cli
Tiempo actualizado 29 de junio de 2026
klingai-upgrade-migration
Tiempo actualizado 3 de julio de 2026
Railway CLI Management
Tiempo actualizado 2 de julio de 2026
OR