- La firma del método no aceptaba :ambito_id causando 'unknown keyword'
- Los drones (ejecutor.rb) pasaban ambito_id al crear eventos en bitácora web
- El error silenciaba el registro → eventos de drones no aparecían en bitácora
- Solución: agregar ambito_id: nil a firma, columna INSERT y params
Refs: A04.P006 — Pipeline DASUTEN Full backup 2026-04-21
Cambios:
- ejecutor.rb: Corregir lectura de output con Open3
- bitacora_db.rb: Agregar métodos crear_evento/actualizar_evento (public)
- dron_db.rb: Corregir conversión de PG::Result a Hash (.first.to_h)
- vigilante.rb: Corregir formato de fecha en dashboard
- migrations/004: Crear tabla bitacoras.events para Bitácora Web
Pruebas:
- dron lanzar --evento AUTO --nota "Test" -- echo "hola" ✅
- dron flota ✅
- dron salud ✅
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implementación del sistema AtomicDrones basado en "Menos es Más":
- Refactorización de dron.rb a dispatcher + módulos atómicos
- Nuevos módulos: ejecutor, vigilante, sanador, bitacora
- DronDB para acceso a datos en PostgreSQL
- Tablas: dron_logs, dron_avances, dron_metricas
- Views: vw_dron_estado, vw_dron_zombies, vw_dron_metricas_semanal
- Health check con detección de zombies (heartbeat > 5min)
- Dashboard compacto de la flota
- Saneamiento con reintentos (backoff exponencial) y limpieza
Comandos soportados:
- dron lanzar: Ejecutar comando como dron
- dron flota: Dashboard de la flota
- dron salud: Health check activo
- dron estado <ID>: Estado detallado
- dron sanear: Saneamiento completo
- dron limpiar: Limpieza de antiguos
- dron reintentar: Re-intentar fallidos
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>