# ADN — Arquitectura de Datos y Normas (dtic-DIIAA) > **DIRECTIVA PARA AGENTES IA**: Este archivo es tu punto de entrada obligatorio. > Léelo COMPLETO antes de ejecutar cualquier acción sobre el repositorio. ## Identidad del Proyecto | Clave | Valor | | :--------------- | :----------------------------------------------------------------- | | **Nombre** | dtic-DIIAA (Departamento de Investigación de IA y Automatización) | | **Repositorio** | `/home/rmonla/Documentos/GitHub/dtic-DIIAA` | | **Idioma** | Español (TODO: docs, commits, comentarios, interacciones) | | **Lenguaje** | Ruby (lenguaje de desarrollo para componentes y herramientas) | | **Filosofía** | DB-First (Base de Datos PostgreSQL → Web) | | **Zona Horaria** | `America/Argentina/Buenos_Aires` (UTC-3) | | **Red remota** | **Tailscale** (Cuenta: `pcdasu0@frlr.utn.edu.ar`) | --- ## Desarrollo y Registro de Actividades ### Lenguaje de Desarrollo: Ruby - **Ruby es el lenguaje estándar** para todos los componentes, scripts y herramientas del proyecto. - **Justificación**: Manejo robusto de excepciones, escalabilidad estructural y consistencia frente a la fragilidad de Bash para secuencias complejas. - **Alcance**: Scripts de automatización (`tools/`), procesadores de respaldos, utilidades de gestión y cualquier lógica operativa recurrente. - **Excepción**: Bash se permite únicamente para one-liners, wrappers de lanzamiento y tareas triviales de sistema donde Ruby introduzca complejidad innecesaria. ### Filosofía DB-First (Base de Datos PostgreSQL → Web) **El sistema sigue una arquitectura DB-First donde PostgreSQL es la fuente de verdad única:** 1. **Base de Datos como Fuente Primaria**: Todas las bitácoras, eventos, nodos y proyectos se almacenan primero en PostgreSQL. 2. **Web como Interfaz**: La capa web (API Node.js + Frontend Vite) consume datos directamente de la base de datos. 3. **Sin Duplicación MD**: Los archivos `.md` son exportaciones secundarias, no fuentes primarias (evitar el anti-patrón MD-First). 4. **Validador Obsoleto**: La herramienta `validador` está en desuso por estar orientada a validación de archivos `.md` en lugar de validación de coherencia en la base de datos. ### Registro en Bitácora (DB-First) **Toda actividad de desarrollo DEBE registrarse directamente en la base de datos PostgreSQL:** 1. **Auto-Registro Obligatorio**: Cualquier trabajo en componentes, scripts o herramientas Ruby debe registrarse como entrada en la bitácora del día usando `db evento:crear`. 2. **Formato DB-First**: Usar exclusivamente los subcomandos `db` de `./adn/tools/run` para operaciones CRUD. 3. **Trazabilidad en DB**: Cada modificación queda documentada en PostgreSQL con: - Contexto del cambio (qué componente y por qué) - Estado (✅ completado, ⏳ en proceso, ❌ fallido) - Métricas híbridas (tiempo invertido) - Relaciones con nodos y proyectos 4. **Exportación Opcional**: La exportación a Markdown es opcional y solo para archivo histórico, no para operación. ### Flujo de Trabajo DB-First 1. **Iniciar jornada**: `./adn/tools/run jornada iniciar [modo] [HH:MM]` (registra en DB) 2. **Registrar actividad**: `./adn/tools/run db evento:crear [opciones]` (estado y modo se calculan automáticamente) 3. **Desarrollar componente Ruby**: Seguir principios "Menos es Más" (atómico, reutilizable) 4. **Operaciones DB**: Usar `./adn/tools/run db` para todas las operaciones (listar, actualizar, eliminar) 5. **Registrar finalización**: `./adn/tools/run db evento:actualizar --fin HH:MM` (estado se calcula automáticamente) 6. **Verificar en Web**: Acceder a `http://localhost:5174` - La bitácora se actualiza automáticamente cada 30s o al recuperar el foco 7. **Resguardar cambios**: Commit y push con formato `[Categoría] Descripción` ### Subcomandos DB Disponibles ```bash # Salud de la base de datos ./adn/tools/run db salud:bd ./adn/tools/run db evento:crear --nodo --descripcion "..." [--plantilla ] ./adn/tools/run db evento:listar [--desde FECHA] [--hasta FECHA] [--nodo NODO] [--ambito AMBITO] [--detalle] ./adn/tools/run db evento:actualizar [--fin HH:MM] [--descripcion "..."] # Estado ✅ se calcula automáticamente con --fin ./adn/tools/run db evento:eliminar # Gestión de ámbitos (agrupadores de nodos) ./adn/tools/run db ámbito:crear --nombre [--descripcion "texto"] [--parent-id ] ./adn/tools/run db ámbito:listar ./adn/tools/run db ámbito:nodos # Gestión de nodos ./adn/tools/run db nodo:crear --nombre --tipo [--ambito ] ./adn/tools/run db nodo:listar [--tipo TIPO] [--ambito AMBITO] # Estadísticas ./adn/tools/run db estadisticas [--ambito AMBITO] ``` --- ## Principios Rectores del ADN ### Tríptico Rector Los tres principios que rigen toda decisión operativa del proyecto son: 1. **Menos es Más (Simplicidad Radical)**: Cada componente debe justificar su existencia y ser atómico y reutilizable. Preferir herramientas unificadas sobre scripts temporales, eliminar duplicaciones y consolidar funcionalidades dispersas. Los componentes deben diseñarse como piezas modulares que puedan ser reutilizadas por otros, evitando monolitos hardcodeados y promoviendo la composición sobre la duplicación. 2. **Armonía Integral**: El ADN, las Bitácoras, los Nodos y los Proyectos forman un organismo interconectado. La coherencia es un requisito de supervivencia. 3. **Mejora Continua (Evolución Progresiva)**: El ADN no es estático; evoluciona a partir de descubrimientos y buenas prácticas emergentes de la operación diaria. ### Principio Rector: Armonía Integral **Si un dato cambia en un sitio, DEBE propagarse a todos los demás.** El ADN, las Bitácoras, los Nodos y los Proyectos forman un organismo interconectado. Ante cualquier inconsistencia detectada, **resolverla es prioritario antes de avanzar**. --- ## Estructura del Directorio `adn/` ``` adn/ ├── README.md ← ESTE ARCHIVO (punto de entrada IA) ├── 00_indice.md ← Mapa general del ADN y tabla de bitácoras ├── 01_ontologia.md ← Definición de nodos, servicios y topología de red ├── 02_bitacora.md ← Formato del registro diario y reglas de triggers ├── 03_seguridad.md ← Protocolos de seguridad, bóveda y secretos ├── 04_iconografia.md ← Taxonomía visual: iconos semánticos para estados ├── 05_ia.md ← ⚠️ FUENTE ÚNICA DE VERDAD para premisas IA ├── 06_gobernanza.md ← Nomenclatura, codificación, armonía y evolución ├── 07_proyectos.md ← Gestión transversal de proyectos e hitos ├── triggers.yml ← Configuración del motor de triggers (propagación) ├── conocimiento/ ← Base de conocimiento asimilado │ └── configuracion_bd.md └── tools/ ← Motor de ejecución y automatización (ver abajo) ``` Las hebras `01` a `07` son documentos normativos vivos. La hebra `05_ia.md` es la referencia canónica y exclusiva de las directivas que un agente IA debe seguir. --- ## Herramienta CLI: `adn/tools/run` > **REGLA DB-FIRST**: Antes de crear scripts temporales o ejecutar SQL directo, > busca si ya existe un subcomando `db` que haga lo que necesitas. **Punto de entrada**: `./adn/tools/run [opciones]` ### Subcomandos Disponibles (DB-First) | Subcomando | Descripción | Filosofía | | :------------------------------------ | :----------------------------------------------- | :------------------ | | `db ` | **Operaciones DB-First** (fuente de verdad) | PostgreSQL Primario | | `jornada iniciar [modo] [HH:MM]` | Registrar inicio de jornada laboral en DB | DB-First | | `jornada cerrar [modo] [HH:MM]` | Registrar cierre de jornada laboral en DB | DB-First | | `jornada estado` | Ver estado de la jornada actual desde DB | DB-First | | `contexto [--cmd]` | Obtener contexto topológico y SSH de un nodo | Consulta DB | | `nodos info ` | Mostrar metadata completa de un nodo (IP, SSH, auth) | Consulta Fichas | | `nodos agrupar [--servidor SRV]` | Agrupar VMs por servidor anfitrión | Consulta Fichas | | `nodos listar [--tipo TIPO]` | Listar nodos desde fichas | Consulta Fichas | | `nodos buscar ` | Buscar nodos por nombre o contenido | Consulta Fichas | | `salud [--dashboard] [--json]` | Ver salud general del sistema ADN | Incluye DB | | `backup [--mode MODO]` | Ejecutar backup seguro de un nodo | Registra en DB | | `triggers [--listar/--registrar]` | Gestión del motor de triggers | Sincroniza DB | | `plan [subcomando]` | Gestión de planes y progreso de proyectos | DB-First | | `estados` | Listar tareas en proceso (⏳) desde DB | DB-First | | `proceso ` | Ejecutar procesos técnicos automatizados | Registra en DB | | `generar bitacora [fecha]` | Generar nueva bitácora en DB (YYYY-MM-DD) | DB-First | | `generar nodo ` | Generar ficha de nodo en DB | DB-First | | `generar proyecto ` | Generar manifiesto de proyecto en DB | DB-First | | `conocimiento asimilar ` | Asimilar documentación al ADN | Almacena en DB | | `msp ` | Gestión de MSPs NotebookLM (auditar, registrar, listar) | Integración MCP | | `ssh ` | Ejecución remota segura via SSH + Candados (lee fichas) | Via NodosInfo | | `ssh --listar` | Listar nodos con SSH configurado | Consulta Fichas | | `ayuda [subcomando]` | Mostrar ayuda detallada | - | | `validador [--watch] [--fix]` | ⚠️ **OBSOLETO** - Validación MD-First antigua | MD-First (evitar) | ### Subcomandos de Base de Datos (`db`) - Fuente de Verdad | Subcomando | Descripción | Filosofía | | :------------------------ | :--------------------------------------------- | :------------------ | | `db salud:bd` | Verificar conexión y estado de PostgreSQL | DB-First | | `db bitacora:crear` | Crear nueva bitácora diaria en DB | DB-First | | `db bitacora:listar` | Listar bitácoras existentes desde DB | DB-First | | `db evento:crear` | Crear entrada (estado y modo se calculan auto.) | DB-First | | `db evento:listar` | Listar entradas con filtros desde DB | DB-First | | `db evento:actualizar` | Actualizar entrada (estado auto. si --fin) | DB-First | | `db evento:eliminar` | Eliminar una entrada existente por ID de DB | DB-First | | `db nodo:crear` | Crear nuevo nodo en DB | DB-First | | `db nodo:listar` | Listar nodos desde DB | DB-First | | `db estadisticas` | Mostrar estadísticas del sistema desde DB | DB-First | | `db hito:crear` | Crear nuevo hito de proyecto en DB | DB-First | | `db hito:listar` | Listar hitos desde DB | DB-First | | `db migrar:md [fecha]` | Migrar bitácora .md legacy a DB (una vez) | Migración | | `db archivar:md` | Mover archivos .md migrados al histórico | Limpieza | ### Ejemplos Frecuentes (DB-First) ```bash # 1. INICIO DE JORNADA (registra en DB) ./adn/tools/run jornada iniciar presencial 08:00 # 2. REGISTRAR ACTIVIDAD (estado y modo se calculan automáticamente) ./adn/tools/run db evento:crear --nodo srv-ns8 --descripcion "Mejora del hook pre-commit" --inicio 09:00 # 2a. Con hora de fin (estado será ✅ automáticamente) ./adn/tools/run db evento:crear --nodo srv-ns8 --descripcion "Tarea completada" --inicio 09:00 --fin 10:00 # 3. LISTAR ACTIVIDADES DEL DÍA (consulta DB) ./adn/tools/run db evento:listar --desde $(date +%Y-%m-%d) # 4. ACTUALIZAR ENTRADA AL FINALIZAR (estado se calcula desde --fin) ./adn/tools/run db evento:actualizar --fin 12:30 # 5. CERRAR JORNADA (registra en DB) ./adn/tools/run jornada cerrar remoto 18:00 # 6. VER ESTADO ACTUAL (desde DB) ./adn/tools/run jornada estado # 7. LISTAR NODOS DESDE BASE DE DATOS ./adn/tools/run db nodo:listar --tipo srvv # 8. BUSCAR NODOS EN DB ./adn/tools/run nodos buscar dasuten # 9. VER SALUD DEL SISTEMA (incluye DB) ./adn/tools/run salud --dashboard # 10. BACKUP CON REGISTRO EN DB ./adn/tools/run backup sql-dasuten # 11. VER ESTADÍSTICAS DEL SISTEMA ./adn/tools/run db estadisticas # 12. AUDITAR MSPs (NotebookLM) ./adn/tools/run msp auditar # 13. LISTAR MSPs DISPONIBLES ./adn/tools/run msp listar # 14. ACCEDER A INTERFAZ WEB (DB → Web) # http://localhost:5174 (Frontend Vite) # http://localhost:3002 (API Node.js) ``` --- ## Directivas Críticas para IA (Actualizado DB-First) 1. **DB-First es obligatorio**: PostgreSQL es la fuente de verdad única. NUNCA operar sobre archivos `.md` como fuente primaria. 2. **Usar subcomandos `db`**: Para cualquier operación CRUD, usar `./adn/tools/run db `. 3. **Auto-Registro en DB**: Toda acción autónoma de la IA DEBE registrarse como entrada en la bitácora del día usando `db evento:crear`. 4. **Ruby como lenguaje de desarrollo**: Todos los componentes nuevos deben escribirse en Ruby, siguiendo principios "Menos es Más" (atómicos, reutilizables). 5. **Reutilizar submódulos CLI**: Antes de crear nueva lógica, verificar si existe submódulo en `cli//` (ej: `nodos/info.rb`, `ssh/ejecutor.rb`). Duplicar código está prohibido. Infraestructura genuina vive en `core/` (colores, constants, logger, error_handler). 6. **Validador obsoleto**: NO usar `validador` (orientado a MD-First). En su lugar, validar coherencia mediante consultas a la base de datos. 6. **Secretos en bóveda**: NUNCA exponer contraseñas en texto plano. Usar `candados` (`eval $(ruby adn/tools/seguridad/candados.rb load )`). 7. **Topología primero**: Antes de conectarte a un nodo, consultar `./adn/tools/run contexto ` para entender su ubicación en la red. 8. **Exportación opcional**: Los archivos `.md` son solo para archivo histórico. La operación real ocurre en PostgreSQL → Web. 9. **Verificar en Web**: Tras modificar la DB, acceder a `http://localhost:5174` para verificar que los cambios se reflejan correctamente. 10. **Zona horaria**: Siempre `America/Argentina/Buenos_Aires`. Ya configurada en herramientas y contenedores Docker. --- ## Estructura de tools/ ``` adn/tools/ ├── run ← Entry point CLI (ejecutable Ruby) ├── cli/ ← Subcomandos CLI (1 archivo + submódulos por comando) │ ├── ayuda.rb ← Documentación interna de la herramienta │ ├── backup.rb ← Backup seguro de nodos │ │ └── backup/configurador.rb ← Carga de configuración YAML │ ├── conocimiento.rb ← Asimilación de documentación │ ├── contexto.rb ← Contexto topológico de nodos (usa nodos/info) │ ├── db.rb ← Dispatcher de subcomandos DB │ │ └── db/ ← Subcomandos DB (evento, bitacora, nodo, etc.) │ ├── estados.rb ← Tareas en proceso (⏳) desde DB │ ├── generar.rb ← Generación de bitácoras, nodos y proyectos │ ├── jornada.rb ← Inicio/cierre de jornada (DB-First) │ ├── msp.rb ← Gestión de MSPs NotebookLM │ ├── nodos.rb ← Gestión de nodos (info, listar, agrupar, buscar) │ │ └── nodos/info.rb ← Extracción de metadata de fichas .md │ ├── plan.rb ← Gestión de planes y progreso │ ├── proceso.rb ← Procesos técnicos automatizados │ ├── salud.rb ← Métricas de salud del ADN │ ├── ssh.rb ← Ejecución remota segura via SSH + Candados │ │ └── ssh/ejecutor.rb ← Abstracción de ejecución remota │ ├── tailscale.rb ← Gestión de Tailscale (nodos, status) │ ├── triggers.rb ← Gestión del motor de triggers │ │ ├── triggers/motor.rb ← Motor de triggers (reacción automática) │ │ └── triggers/eventos.rb ← Bus de eventos (pub/sub desacoplado) │ └── validador.rb ← ⚠️ OBSOLETO (MD-First) ├── core/ ← Infraestructura genuina (solo utilidades compartidas) │ ├── colores.rb ← Constantes de color para terminal │ ├── conciliador.rb ← Saneamiento preventivo de pendientes │ ├── constants.rb ← Constantes globales (rutas, estados) │ ├── error_handler.rb ← Helper para mensajes de error estandarizados │ ├── help_formatter.rb ← Formateador de ayuda estandarizado │ └── logger.rb ← Logger estructurado (JSON) ├── db/ ← Capa de acceso a datos (PostgreSQL) │ ├── core/ ← bitacora_db.rb (CRUD principal), buscadores │ ├── cli/ ← Scripts CLI para exportación masiva │ ├── exporters/ ← md_exporter.rb (DB → Markdown) │ └── importers/ ← Importadores (Markdown → DB) ├── config/ ← Configuración │ ├── database.yml ← Conexión PostgreSQL (puerto 5433) │ └── config.yml ← Configuración general ├── hooks/ ← Git hooks (pre-commit) ├── parsers/ ← Parsers especializados (plan.rb) ├── seguridad/ ← candados (gestión de secretos) └── sondas/ ← Sondas remotas (w-zombi) ``` --- ## Base de Datos (PostgreSQL) | Clave | Valor | | :----------- | :----------------------------- | | **Host** | `localhost` | | **Puerto** | `5433` (Docker → 5432 interno) | | **Database** | `dtic_bitacoras` | | **Schema** | `bitacoras` | | **Config** | `adn/tools/config/database.yml`| ### Tablas Principales (schema `bitacoras`) | Tabla | Descripción | | :---------- | :---------------------------------------------------- | | `nodos` | Servidores, VMs, PCs, servicios del sistema | | `bitacoras` | Bitácoras diarias (fecha única por registro) | | `entradas` | Entradas cronológicas en formato I-F-D-E | | `temas` | Agrupadores de entradas por nodo | | `gestion` | Items de control de gestión (pendientes, en proceso) | | `proyectos` | Proyectos transversales | | `fases` | Fases de los proyectos | | `hitos` | Hitos individuales de cada fase | ### Docker Compose Ubicación: `servicios/nginx/dtic-bitacoras/docker-compose.yml` Servicios: `postgres` (BD), `api` (Node.js, puerto 3002), `frontend` (Vite, puerto 5174). --- ## Directorios del Repositorio | Directorio | Propósito | | :--------------- | :----------------------------------------------------- | | `adn/` | Núcleo genético: hebras, herramientas, conocimiento | | `nodos/` | Fichas técnicas de cada nodo (1 archivo .md por nodo) | | `docs/bitacoras/`| Bitácoras diarias exportadas en Markdown | | `docs/proyectos/`| Manifiestos de proyectos | | `docs/plan/` | Planes de mejora y arquitectura | | `servicios/` | Docker Compose y configs de servicios (nginx, etc.) | | `logs/` | Logs estructurados del sistema ADN | | `automatizacion/`| Scripts legacy (en proceso de migración a adn/tools) | --- ## Notas de Migración (MD-First → DB-First) ### Componentes Obsoletos (MD-First) - **`validador`**: Herramienta para validar archivos `.md` - en desuso - **`md_exporter.rb`**: Exportador DB → MD - uso solo para archivo histórico - **Hooks pre-commit MD**: En proceso de migración a validación de coherencia DB ### Componentes Actuales (DB-First) - **`./adn/tools/run db`**: Subcomandos CRUD para PostgreSQL - **API Node.js (puerto 3002)**: Interfaz REST para operaciones DB - **Frontend Vite (puerto 5174)**: Interfaz web que consume API - **Docker Compose**: Contenedores PostgreSQL + API + Frontend ### Flujo de Migración Completo 1. **Fase 1**: Operación híbrida (MD + DB) - **COMPLETADO** 2. **Fase 2**: DB como fuente primaria, MD como histórico - **ACTUAL** 3. **Fase 3**: Eliminación completa de dependencias MD-First - **PLANIFICADO** ### Buenas Prácticas Actuales 1. **Siempre comenzar con `db evento:crear`** antes de cualquier trabajo 2. **Usar `db evento:actualizar`** al finalizar para registrar métricas 3. **Consultar `db evento:listar`** para ver estado actual 4. **Verificar en `http://localhost:5174`** para confirmar cambios 5. **Usar `jornada iniciar/cerrar`** para gestión de tiempo de trabajo