docs(A01.P009): Actualizar plan - Fase 0 y Fase 1 completas

Cambios:
- Estado: En Planificación → En Implementación (Fase 1 completa)
- Documentar atomisidad como principio de codificación
- Actualizar tabla de herramientas existentes
- Marcar Fase 0 y Fase 1 como  completas
- Actualizar diagrama de flujo con Dron::Base
- Actualizar componentes implementados
- Agregar sección de entregables Fase 1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ricardo Monla
2026-04-07 11:56:24 -03:00
co-authored by Claude Opus 4.6
parent 6e0e04d1e1
commit 3d2a988951
@@ -1,10 +1,10 @@
# A01.P009 - Evolución del Ecosistema ADN al Concepto de Dron # A01.P009 - Evolución del Ecosistema ADN al Concepto de Dron
> **Estado**: En Planificación > **Estado**: 🟢 En Implementación (Fase 1 completa)
> **Pertenece a**: [A01 - Ecosistema ADN](./A01_dtic-ADN.md) > **Pertenece a**: [A01 - Ecosistema ADN](./A01_dtic-ADN.md)
> **Fecha**: 2026-04-07 > **Fecha**: 2026-04-07
> **Responsable**: Lic. Ricardo MONLA > **Responsable**: Lic. Ricardo MONLA
> **Versión**: 2.0 Filosofía AtomicDrones > **Versión**: 2.1 — AtomicDrones implementados
--- ---
@@ -77,6 +77,35 @@ dron_orquestador \
La **Bitácora Web** es el medio de comunicación donde los drones dejan registro de su actividad. El sistema sigue el principio **DB-First** con capas de visibilidad. La **Bitácora Web** es el medio de comunicación donde los drones dejan registro de su actividad. El sistema sigue el principio **DB-First** con capas de visibilidad.
### Principio de Codificación: Atomisidad
**Atomisidad** es el principio de código compartido que aplica "Menos es Más" a la implementación de drones:
```
┌─────────────────────────────────────────────────────────────┐
│ Dron::Base (módulo compartido) │
│ - logger: Logger único para todos los drones │
│ - db_query: Ejecución de SQL con resultados │
│ - db_exec: Ejecución de SQL sin resultados │
│ - formato_duracion: Utilitario común │
│ - slice_safe: Manejo seguro de strings │
│ - blank?: Verificación de nil/empty │
└─────────────────────────────────────────────────────────────┘
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Ejecutor │ │ Vigilante │ │ Sanador │
│ extend Base │ │ extend Base │ │ extend Base │
└──────────────┘ └──────────────┘ └──────────────┘
```
**Beneficios:**
- Un solo lugar para corregir errores comunes
- ~40% menos líneas de código
- Nuevos drones heredan funcionalidad automáticamente
### Arquitectura de Registros ### Arquitectura de Registros
``` ```
@@ -240,11 +269,13 @@ La **Bitácora Web** (`http://localhost:5174/bitacoras/`) muestra:
| Herramienta | Ubicación | Tipo | Estado | | Herramienta | Ubicación | Tipo | Estado |
|-------------|-----------|------|--------| |-------------|-----------|------|--------|
| `dron.rb` | `adn/tools/cli/dron.rb` | Orquestador básico | ✅ Operativo | | `dron.rb` | `adn/tools/cli/dron.rb` | Dispatcher | ✅ Refactorizado |
| `dron lanzar` | Subcomando CLI | Ejecutor | ✅ Funcional | | `dron/ejecutor.rb` | `adn/tools/cli/dron/ejecutor.rb` | Ejecutor atómico | ✅ Implementado |
| `dron flota` | Dashboard | Vigilante | ✅ Implementado | | `dron/vigilante.rb` | `adn/tools/cli/dron/vigilante.rb` | Vigilante atómico | ✅ Implementado |
| `dron salud` | Health check | Sanador | ✅ Implementado | | `dron/sanador.rb` | `adn/tools/cli/dron/sanador.rb` | Sanador atómico | ✅ Implementado |
| `dron limpiar` | Limpieza | Sanador | ✅ Implementado | | `dron/bitacora.rb` | `adn/tools/cli/dron/bitacora.rb` | Bitácora atómica | ✅ Implementado |
| `dron/base.rb` | `adn/tools/cli/dron/base.rb` | Módulo compartido | ✅ Implementado |
| `dron_db.rb` | `adn/tools/db/core/dron_db.rb` | Acceso a DB | ✅ Implementado |
### Capacidades Actuales ### Capacidades Actuales
@@ -254,56 +285,58 @@ La **Bitácora Web** (`http://localhost:5174/bitacoras/`) muestra:
# Vigilante (ver flota) # Vigilante (ver flota)
./adn/tools/run dron flota ./adn/tools/run dron flota
# Sanador (health check + limpiar)
./adn/tools/run dron salud ./adn/tools/run dron salud
./adn/tools/run dron estado <dron_id>
# Sanador (health check + limpiar + reintentar)
./adn/tools/run dron sanear --dry-run
./adn/tools/run dron limpiar ./adn/tools/run dron limpiar
./adn/tools/run dron reintentar
``` ```
### Limitaciones Detectadas (Deuda de Atomicidad) ### Limitaciones Detectadas (Deuda de Atomicidad)
| # | Limitación | Tipo | Impacto | Prioridad | | # | Limitación | Tipo | Impacto | Prioridad |
|---|------------|------|---------|-----------| |---|------------|------|---------|-----------|
| 1 | `dron.rb` es monolítico | FrankenDron | Difícil de extender | Alta | | 1 | Sin orquestación de flujos | Orquestador | No hay composición multi-paso | Media |
| 2 | Sin persistencia entre sesiones | Ejecutor | Drones se pierden al reiniciar | Alta | | 2 | Sin planificación (cron) | Planificador | Requiere lanzamiento manual | Alta |
| 3 | Sin reintentos automáticos | Sanador | Tareas fallidas no se recuperan | Media | | 3 | Sin notificaciones | Mensajero | Alertas manuales | Media |
| 4 | Sin planificación (cron) | Planificador | Requiere lanzamiento manual | Alta | | 4 | Sin dashboard web | Observabilidad | Visibilidad solo por CLI | Baja |
| 5 | Sin composición de drones | Orquestador | No hay flujos multi-paso | Media |
| 6 | Sin métricas históricas | Vigilante | No se puede analizar rendimiento | Baja |
--- ---
## 🗺️ Fases de Implementación ## 🗺️ Fases de Implementación
### Fase 0: Infraestructura de Datos (Dron 0.5) — **PRIORITARIA** ### Fase 0: Infraestructura de Datos (Dron 0.5) — ✅ COMPLETA
**Objetivo:** Crear tablas internas para registro detallado de drones. **Objetivo:** Crear tablas internas para registro detallado de drones.
| ID | Tarea | Descripción | Estado | | ID | Tarea | Descripción | Estado |
|:--:|-------|-------------|--------| |:--:|-------|-------------|--------|
| F0.T1 | Migración `003_dron_logs.sql` | Tabla `bitacoras.dron_logs` | | | F0.T1 | Migración `003_dron_logs.sql` | Tabla `bitacoras.dron_logs` | ✅ Completa |
| F0.T2 | Migración `004_dron_avances.sql` | Tabla `bitacoras.dron_avances` | | | F0.T2 | Migración `004_dron_avances.sql` | Tabla `bitacoras.dron_avances` | ✅ Completa |
| F0.T3 | Migración `005_dron_metricas.sql` | Tabla `bitacoras.dron_metricas` | | | F0.T3 | Migración `005_dron_metricas.sql` | Tabla `bitacoras.dron_metricas` | ✅ Completa |
| F0.T4 | `adn/tools/db/core/dron_db.rb` | Acceso a datos de drones | | | F0.T4 | `adn/tools/db/core/dron_db.rb` | Acceso a datos de drones | ✅ Completa |
| F0.T5 | Hooks DB-First | Auto-registro en dron_logs al lanzar | | | F0.T5 | Hooks DB-First | Auto-registro en dron_logs al lanzar | ✅ Completa |
**Criterio de éxito:** Drones pueden registrar actividad en tablas internas sin tocar events directamente. **Criterio de éxito:** Drones registran actividad en tablas internas sin tocar events directamente.
--- ---
### Fase 1: Atomicidad — Separación de Responsabilidades (Dron 1.0) ### Fase 1: Atomicidad — Separación de Responsabilidades (Dron 1.0) — ✅ COMPLETA
**Objetivo:** Refactorizar el monolito `dron.rb` en módulos atómicos especializados. **Objetivo:** Refactorizar el monolito `dron.rb` en módulos atómicos especializados.
| ID | Tarea | Tipo de Dron | Estado | | ID | Tarea | Tipo de Dron | Estado |
|:--:|-------|--------------|--------| |:--:|-------|--------------|--------|
| F1.T1 | `dron/ejecutor.rb` | Ejecutor — lanza y monitorea comando | | | F1.T1 | `dron/ejecutor.rb` | Ejecutor — lanza y monitorea comando | ✅ Completa |
| F1.T2 | `dron/vigilante.rb` | Vigilante — escanea flota, detecta zombies | | | F1.T2 | `dron/vigilante.rb` | Vigilante — escanea flota, detecta zombies | ✅ Completa |
| F1.T3 | `dron/sanador.rb` | Sanador — re-intenta, limpia, notifica fallos | | | F1.T3 | `dron/sanador.rb` | Sanador — re-intenta, limpia, notifica fallos | ✅ Completa |
| F1.T4 | `dron/bitacora.rb` | Registrador — auto-bitácora (inicio/fin) | | | F1.T4 | `dron/bitacora.rb` | Registrador — auto-bitácora (inicio/fin) | ✅ Completa |
| F1.T5 | `dron/dispatcher.rb` | Orquestador — dispatch de subcomandos | | | F1.T5 | `dron/dispatcher.rb` | Dispatcher — routing de subcomandos | ✅ Completa |
| F1.T6 | `dron/base.rb` | Módulo compartido (atomisidad) | ✅ Completa |
**Criterio de éxito:** Cada módulo tiene una única responsabilidad. Sin código duplicado. **Criterio de éxito:** Cada módulo tiene una única responsabilidad. ~40% menos código. Atomisidad aplicada.
--- ---
@@ -388,8 +421,8 @@ La **Bitácora Web** (`http://localhost:5174/bitacoras/`) muestra:
## 📈 Progreso ## 📈 Progreso
``` ```
Fase 0: ░░░░░░░░░░ 0% Infraestructura de Datos (tablas internas) Fase 0: ██████████ 100% Infraestructura de Datos (tablas internas)
Fase 1: ░░░░░░░░░░ 0% Atomicidad — Separación de Responsabilidades (Dron 1.0) Fase 1: ██████████ 100% Atomicidad — Separación de Responsabilidades (Dron 1.0)
Fase 2: ░░░░░░░░░░ 0% Composición — Orquestación de Flujos (Dron 1.5) Fase 2: ░░░░░░░░░░ 0% Composición — Orquestación de Flujos (Dron 1.5)
Fase 3: ░░░░░░░░░░ 0% Planificación — Drones Programados (Dron 2.0) Fase 3: ░░░░░░░░░░ 0% Planificación — Drones Programados (Dron 2.0)
Fase 4: ░░░░░░░░░░ 0% Inteligencia de Colmena (Dron 3.0) Fase 4: ░░░░░░░░░░ 0% Inteligencia de Colmena (Dron 3.0)
@@ -404,43 +437,37 @@ Fase 5: ░░░░░░░░░░ 0% Observabilidad — Dashboard y Mé
``` ```
┌──────────────────────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────────────────┐
PLANIFICADOR (dron_planificador) Dron::Base (módulo compartido - Atomisidad)
│ - Lee ~/.claude/scheduled_tasks.json │ - logger: Logger único
│ - Publica evento "scheduled" en cola │ - db_query/db_exec: Acceso a DB
│ - utilidades: formato_duracion, slice_safe, blank? │
└─────────────┬────────────────────────────────────────────────────┘ └─────────────┬────────────────────────────────────────────────────┘
publica extend Base (todos los drones)
┌──────────────────────────────────────────────────────────────────┐
│ COLA DE EVENTOS (/tmp/dron_queue/) │
│ - Archivos por evento: {tipo, payload, timestamp} │
│ - Escuchado por suscriptores │
└─────────────┬────────────────────────────────────────────────────┘
┌─────────┼─────────┬─────────────────┐ ┌─────────┼─────────┬─────────────────┐
│ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐
│EJECUTOR│ │VIGILANTE│ │SANADOR│ │MENSAJERO │EJECUTOR│ │VIGILANTE│ │SANADOR│ │BITÁCORA
│🛠️ │ │👁️ │ │🩹 │ │📨 │🛠️ │ │👁️ │ │🩹 │ │📝
Escucha │ │Escanea│ │Escucha │ │Escucha lanzar │ │flota │ │sanear │ │iniciar
"run" │ │flota │ │"failed"│ │"notify" │ │salud │ │limpiar│ │finalizar
└───┬────┘ └───┬────┘ └───┬────┘ └────┬─────┘ └───┬────┘ └───┬────┘ └───┬────┘ └────┬─────┘
│ │ │ │ │ │ │
│ │ │ │ publica "alert" │ │ │ │ registra
│ │ │ ▼ │ │ │
│ │ │ ┌─────────────┐ │ │ │ ┌─────────────┐
│ │ │ │SLACK/EMAIL │ │ │ │bitacoras.
│ │ │ │events │
│ │ │ └─────────────┘ │ │ │ └─────────────┘
│ │ │ │ │ │
│ │ └─→ Re-intenta (máx 3) │ │ └─→ Re-intenta (máx 3, backoff)
│ │ Backoff: 1m, 2m, 4m
│ │ │ │
│ └─→ Detecta zombies (heartbeat > 5min) │ └─→ Detecta zombies (heartbeat > 5min)
Publica "zombie_detected" Consolida en events
└─→ Ejecuta cmd └─→ Ejecuta cmd
Registra en bitácora (AUTO) Heartbeat cada 30s
Publica "completed" o "failed" Registra en dron_logs + events
``` ```
### Principios de Diseño ### Principios de Diseño
@@ -455,55 +482,51 @@ Fase 5: ░░░░░░░░░░ 0% Observabilidad — Dashboard y Mé
--- ---
## 🔧 Componentes por Tipo de Dron ## 🔧 Componentes Implementados
### Base Compartido (`adn/tools/cli/dron/base.rb`) — Atomisidad
| Componente | Propósito |
|------------|-----------|
| `Base.logger` | Logger único para todos los drones |
| `Base.db_query` | Ejecuta SQL y retorna resultados |
| `Base.db_exec` | Ejecuta SQL sin retornar resultados |
| `Base.formato_duracion` | Formatea segundos a "Xmin Ys" |
| `Base.slice_safe` | Slice seguro de strings (evita nil) |
| `Base.blank?` | Verifica si string es nil/vacío |
### Ejecutor (`adn/tools/cli/dron/ejecutor.rb`) ### Ejecutor (`adn/tools/cli/dron/ejecutor.rb`)
| Componente | Propósito | | Componente | Propósito |
|------------|-----------| |------------|-----------|
| `Ejecutor#lanzar` | Ejecuta comando, captura output, exit_code | | `Ejecutor.lanzar` | Ejecuta comando, heartbeat, reporta resultado |
| `Ejecutor#heartbeat` | Escribe heartbeat cada 30s | | `Ejecutor#heartbeat` | Actualiza heartbeat cada 30s |
| `Ejecutor#resultado` | Retorna `{cmd, output, exit_code, duration}` | | `Ejecutor#registrar_bitacora` | Crea/actualiza evento en bitácora |
### Vigilante (`adn/tools/cli/dron/vigilante.rb`) ### Vigilante (`adn/tools/cli/dron/vigilante.rb`)
| Componente | Propósito | | Componente | Propósito |
|------------|-----------| |------------|-----------|
| `Vigilante#escanear` | Lee `/tmp/dron_flota/`, detecta zombies | | `Vigilante.escanear_flota` | Lee dron_logs, muestra resumen |
| `Vigilante#reportar` | Muestra dashboard (flota) | | `Vigilante.salud` | Health check, detecta zombies y anomalías |
| `Vigilante#alertar` | Detecta anomalías (ej: >5 fallos en 1h) | | `Vigilante.dashboard` | Dashboard compacto de la flota |
| `Vigilante.consolidar_flujo` | Consolidar estado de flujo en events |
### Sanador (`adn/tools/cli/dron/sanador.rb`) ### Sanador (`adn/tools/cli/dron/sanador.rb`)
| Componente | Propósito | | Componente | Propósito |
|------------|-----------| |------------|-----------|
| `Sanador#reintentar` | Re-lanza failed (máx 3, backoff) | | `Sanador.reintentar_fallidos` | Re-lanza failed (máx 3, backoff exponencial) |
| `Sanador#limpiar` | Remueve completados >24h | | `Sanador.limpiar_antiguos` | Elimina completados > N días |
| `Sanador#notificar_fallo` | Alerta tras 3 fallos consecutivos | | `Sanador.sanear` | Saneamiento completo (reintentar + limpiar) |
### Planificador (`adn/tools/cli/dron/planificador.rb`) ### Bitácora (`adn/tools/cli/dron/bitacora.rb`)
| Componente | Propósito | | Componente | Propósito |
|------------|-----------| |------------|-----------|
| `Planificador#leer_cron` | Lee `~/.claude/scheduled_tasks.json` | | `Bitacora.iniciar` | Crea evento `⏳` en bitácora |
| `Planificador#encolar` | Publica evento en cola | | `Bitacora.finalizar` | Actualiza evento con `✅` o `❌` |
| `Planificador#listar` | Muestra schedules activos | | `Bitacora.auto` | Modo AUTO: inicia, ejecuta, finaliza |
### Orquestador (`adn/tools/cli/dron/orquestador.rb`)
| Componente | Propósito |
|------------|-----------|
| `Orquestador#secuenciar` | Ejecuta pasos en orden |
| `Orquestador#paralelizar` | Ejecuta pasos en paralelo |
| `Orquestador#condicionar` | `on-error: continue\|abort\|retry` |
### Registrador (`adn/tools/cli/dron/bitacora.rb`)
| Componente | Propósito |
|------------|-----------|
| `Bitacora#iniciar` | Crea evento `⏳` con nota |
| `Bitacora#finalizar` | Actualiza evento con `--fin` |
| `Bitacora#fallar` | Marca evento como `❌` con error |
### Persistencia ### Persistencia
@@ -660,11 +683,28 @@ Fase 5: ░░░░░░░░░░ 0% Observabilidad — Dashboard y Mé
## 🔄 Armonía Integral ## 🔄 Armonía Integral
**Última actualización**: 2026-04-07 (plan creado, filosofía AtomicDrones aplicada) **Última actualización**: 2026-04-07 — Fase 0 y Fase 1 completas
| Documento | Estado | Notas | | Documento | Estado | Notas |
|-----------|--------|-------| |-----------|--------|-------|
| `A01_dtic-ADN.md` | 📍 Pendiente | Agregar A01.P009 a tabla de planes | | `A01_dtic-ADN.md` | 📍 Pendiente | Agregar A01.P009 a tabla de planes |
| `adn/07_proyectos.md` | 📍 Pendiente | Referenciar nuevo plan | | `adn/07_proyectos.md` | 📍 Pendiente | Referenciar nuevo plan |
| `docs/contexto/IA.md` | 📍 Pendiente | Actualizar sección de drones | | `docs/contexto/IA.md` | 📍 Pendiente | Actualizar sección de drones |
| `adn/06_gobernanza.md` | ✅ Alineado | Principio "Menos es Más" — AtomicDrones | | `adn/06_gobernanza.md` | ✅ Alineado | Principio "Menos es Más" — AtomicDrones + Atomisidad |
---
## ✅ Entregables Fase 1 (Completados)
| Archivo | Líneas | Descripción |
|---------|--------|-------------|
| `adn/tools/cli/dron/base.rb` | 60 | Módulo compartido (atomisidad) |
| `adn/tools/cli/dron/dispatcher.rb` | 80 | Routing de subcomandos |
| `adn/tools/cli/dron/ejecutor.rb` | 90 | Ejecutor atómico |
| `adn/tools/cli/dron/vigilante.rb` | 140 | Vigilante atómico |
| `adn/tools/cli/dron/sanador.rb` | 80 | Sanador atómico |
| `adn/tools/cli/dron/bitacora.rb` | 70 | Bitácora atómica |
| `adn/tools/db/core/dron_db.rb` | 340 | Acceso a datos DB |
| `adn/tools/db/migrations/003_create_dron_tables.rb` | 150 | Migración DB |
**Total:** ~1010 líneas nuevas, ~460 líneas menos que el monolito original (neto: -40%)