17 KiB
P2604.08 - Implementación del Modelo Ámbito/Nodo en el Ecosistema ADN
Estado: ⏳ Propuesto
Pertenece a: P2604 - Mejoras ADN
Fecha: 2026-03-20
Responsable: Lic. Ricardo MONLA
Versión: 1.7Progreso General:
██████████ 100%(PLAN COMPLETO ✅)
- Fase 1 (DB-First):
██████████100%- Fase 2 (CLI Ruby):
██████████100%- Fase 3 (API REST):
██████████100%- Fase 4 (Frontend):
██████████100%- Fase 5 (Validación):
██████████95%
Resumen
El ecosistema ADN necesita evolucionar para reflejar la jerarquía organizativa real donde los ámbitos agrupen lógicamente a los nodos. Esto impacta en la base de datos, CLI, API y frontend web. La implementación sigue el principio DB-First y el patrón "Menos es Más" del ADN.
Cambio conceptual principal:
- Antes: Fichas por Nodo → seleccionar nodo → ver eventos
- Ahora: Fichas por Ámbito → seleccionar ámbito → ver eventos de todos sus nodos (con columna Nodo)
Estructura:
- Ámbito raíz:
dtic-DIIAA(agrupa infraestructura, servicios y bitácoras) - Sub-ámbito:
dtic-DASUTEN(departamento externo gestionado) - Nodos:
srv-dasu,sql-dasuten,dc-dasuten,srv-ns8,srvv-koha, etc.
Análisis de Impacto
Herramientas y Componentes Afectados
| # | Componente | Tipo | Impacto | Prioridad |
|---|---|---|---|---|
| 1 | bitacoras.nodos |
Base de Datos | Alta | Crítica |
| 2 | bitacoras.entradas |
Base de Datos | Alta | Crítica |
| 3 | bitacoras.temas |
Base de Datos | Media | Alta |
| 4 | bitacoras.resumen_nodos |
Base de Datos | Media | Alta |
| 5 | bitacoras.hitos |
Base de Datos | Baja | Media |
| 6 | adn/tools/cli/db/nodo.rb |
CLI Ruby | Alta | Crítica |
| 7 | adn/tools/cli/db/evento.rb |
CLI Ruby | Alta | Crítica |
| 8 | adn/tools/cli/nodos.rb |
CLI Ruby | Alta | Crítica |
| 9 | adn/tools/cli/ambitos.rb |
CLI Ruby | Alta | Crítica |
| 10 | adn/tools/core/ (helpers) |
CLI Ruby | Media | Alta |
| 11 | API Node.js (backend/) |
API REST | Alta | Crítica |
| 12 | Frontend Vite (frontend/src/) |
UI Web | Alta | Crítica |
| 13 | adn/tools/core/mejoras_sensor.rb |
Herramienta | Baja | Media |
| 14 | Hooks pre-commit | Git | Baja | Baja |
Modelo de Datos
Diagrama de Relaciones
┌─────────────┐ 1:N (parent) ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ ambitos │───────────────│ ambitos │ │ nodos │ │ entradas │
│ (raíz) │ │ (hijos) │ │ │ │ │
├─────────────┤ ├─────────────┤ ├─────────────┤ ├─────────────┤
│ id (PK) │ │ id (PK) │──1:N──│ ambito_id │──1:N──│ nodo_id │
│ nombre │ │ nombre │ │ id (PK) │ │ ambito_id │
│ parent_id │ │ parent_id │ │ nombre │ │ descripcion │
│ descripcion │ │ descripcion │ │ ip │ │ estado │
│ activo │ │ activo │ │ tipo │ │ modo │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
Jerarquía de ámbitos:
dtic-DIIAA(raíz, parent_id = NULL)dtic-DASUTEN(parent_id → dtic-DIIAA)- Nodos de infraestructura y servicios (parent_id → dtic-DIIAA)
Relaciones:
ambitos→ambitos(self-reference): Uno a muchos (1:N) — jerarquía padre/hijoambitos→nodos: Uno a muchos (1:N) — Un ámbito contiene muchos nodosnodos→entradas: Uno a muchos (1:N) — Un nodo contiene muchos eventosentradas→ambitos: Muchos a uno (N:1) — Cada evento pertenece a un ámbito (derivado del nodo)
Nota: El ambito_id en entradas se propaga automáticamente desde el nodo_id (app-level o trigger). El nodo sigue siendo la entidad primaria de registro.
Nueva Tabla: bitacoras.ambitos
CREATE TABLE bitacoras.ambitos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50) NOT NULL UNIQUE,
descripcion TEXT,
parent_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL,
activo BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_ambitos_nombre ON bitacoras.ambitos(nombre);
CREATE INDEX idx_ambitos_parent ON bitacoras.ambitos(parent_id);
Modificación: bitacoras.nodos
ALTER TABLE bitacoras.nodos
ADD COLUMN ambito_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL;
CREATE INDEX idx_nodos_ambito ON bitacoras.nodos(ambito_id);
Modificación: bitacoras.entradas
ALTER TABLE bitacoras.entradas
ADD COLUMN ambito_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL;
CREATE INDEX idx_entradas_ambito ON bitacoras.entradas(ambito_id);
Ámbitos Detectados (Propuestos)
| Ámbito | Nodos Asociados | Descripción |
|---|---|---|
dtic-DIIAA |
srv-ns8, srv-pmox1, srv-pmox2, srv-pmox3, srv-xen1, srvv-*, dtic-BITACORAS | Ámbito raíz que agrupa toda la infraestructura y servicios propios de DIIAA |
dtic-DASUTEN |
srv-dasu, dasu-srvv-dc, sql-dasuten, dc-dasuten, pc-dasu0, pcv-dasu* | Departamento de Servicios de UTN (sistema externo gestionado por DIIAA) |
dtic-BITACORAS |
Sistema de bitácoras (auto-referencia) | Sistema de registro ADN (se incluye en dtic-DIIAA) |
Jerarquía propuesta:
dtic-DIIAA (raíz)
├── Infraestructura: srv-ns8, srv-pmox1, srv-pmox2, srv-pmox3, srv-xen1
├── Servicios: srvv-dtic, srvv-koha, srvv-sitio*, srvv-docs, srvv-dns
├── Bitácoras: dtic-BITACORAS
└── Sub-ámbitos:
└── dtic-DASUTEN: srv-dasu, dasu-srvv-dc, sql-dasuten, dc-dasuten, pc-dasu0, pcv-dasu*
Fases de Implementación
Fase 1: Base de Datos (DB-First)
1.1 - Crear tabla ambitos
- Script de migración
adn/tools/db/migrations/001_create_ambitos.sql - Datos iniciales: seed con ámbitos detectados (
dtic-DASUTEN,dtic-BITACORAS, etc.) - Verificar integridad referencial
1.2 - Modificar tabla nodos
- Añadir columna
ambito_id - Migrar nodos existentes al ámbito correspondiente
- Crear índice para queries por ámbito
1.3 - Modificar tabla entradas
- Añadir columna
ambito_id(nullable) - Propagar ámbito automáticamente desde el
nodo_idasociado (app-level o trigger PostgreSQL) - Queries disponibles:
entradas.nodo_id→ Obtener eventos por nodo (N:1)entradas.ambito_id→ Obtener eventos por ámbito (N:1, derivado)- JOIN con
nodos→ Obtener ámbito del nodo directamente - JOIN triple
entradas → nodos → ambitos→ Filtrar eventos por ámbito y ver nodo
- Verificar historial de eventos existentes
1.4 - Nueva tabla resumen_ambitos (vista materializada)
CREATE TABLE bitacoras.resumen_ambitos (
id SERIAL PRIMARY KEY,
ambito_id INTEGER REFERENCES bitacoras.ambitos(id),
fecha DATE,
total_entradas INTEGER DEFAULT 0,
tiempo_total INTERVAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(ambito_id, fecha)
);
Fase 2: CLI Ruby (adn/tools/)
2.1 - Nuevo comando: ambitos
./adn/tools/run ambitos listar
./adn/tools/run ambitos crear --nombre <nombre> --descripcion <desc>
./adn/tools/run ambitos info <nombre>
./adn/tools/run ambitos nodos <nombre> # Lista nodos del ámbito
./adn/tools/run ambitos --help # Mostrar ayuda del comando
2.2 - Estructura del comando
- Crear
adn/tools/cli/ambitos.rb - Crear
adn/tools/db/core/ambito_db.rb - Incluir ayuda normalizada (heredada de
core/help_formatter.rb) - Integrar en dispatcher principal (
adn/tools/run)
2.3 - Modificar nodo.rb
- Añadir
--ambito <nombre>anodo:crear - Listar nodos mostrando la columna/etiqueta de su ámbito actual
2.4 - Modificar evento.rb
- Filtrar eventos mediante
--ambito <nombre_o_id>enevento:listar - (Opcional) Poder asignar evento a ámbito si no tiene nodo
2.5 - Modificar nodos.rb
- Subcomando
nodos listar --ambito <nombre> - Subcomando
nodos agrupar --por ambitos - Incluir
--helpnormalizado
2.6 - Modificar salud.rb
- Añadir métricas por ámbito en
--dashboard - Soportar
--ambito <nombre>en estadísticas - Incluir
--helpnormalizado
2.7 - Helpers compartidos (core/)
- Verificar/crear
core/help_formatter.rbpara normalizar--help - Verificar/crear
core/error_handler.rbpara mensajes de error - Asegurar consistencia en todos los subcomandos
Resumen de Implementación Fase 2 (20/03)
db nodo:crear: Soporte para--ambito <id|nombre>para asociar nodo en creación.db nodo:listar: Re-escrito para soportar metadata cruzada (LEFT JOIN) incluyendo--ambitoy columna de Ámbito.db evento:listar: Filtro expandido a múltiples nodos mediante--ambito <nombre>en modo DB-first.nodos.rb: Mantenido pero compatibilizado; soportanodos agrupar --por ambitos(DB) ynodos listar --ambito(Cruce MD-DB).salud.rb: Formateado--helpy se añadieron querys DB para ámbitos y nodos.
Fase 3: API Node.js (servicios/nginx/dtic-bitacoras/backend/)
3.2 - Modificar endpoints existentes
GET /api/nodos→ incluirambito_idyambito_nombreGET /api/entradas→ filtrar porambito_idGET /api/bitacoras/:id→ incluir resumen por ámbito
3.1 - Nuevos endpoints REST
GET /api/ambitos→ Listar ámbitosPOST /api/ambitos→ Crear ámbitoGET /api/ambitos/:id→ Info de ámbitoPUT /api/ambitos/:id→ Actualizar ámbitoDELETE /api/ambitos/:id→ Eliminar ámbitoGET /api/ambitos/:id/nodos→ Nodos del ámbitoGET /api/nodos?ambito=:id→ Filtrar nodos por ámbitoPOST /api/entradas→ Crear entrada (con ambito_id automático/manual)GET /api/ambitos/stats/global→ Métricas por ámbitoGET /api/ambitos/:id/dashboard→ Dashboard unificado
Fase 4: Frontend Vite (servicios/nginx/dtic-bitacoras/frontend/)
4.1 - Diseño visual: Fichas por Ámbito
Cambio principal:
- Antes: Fichas por Nodo (seleccionar nodo → ver eventos)
- Ahora: ✅ Fichas por Ámbito (implementado 2026-03-25)
Implementado:
- Vista principal agrupa entradas por ámbito en lugar de por nodo
- Cada ficha de ámbito muestra todos los eventos de sus nodos
- Columna "Nodo" identifica el origen de cada evento
- Badge muestra cantidad de nodos y entradas del ámbito
📅 2026-03-20
📂 dtic-DASUTEN
Resumen de eventos registrados.
├───────────────────────────────────────────────────────────────────────┤
| ID | I | F | Descripción | J | E | Nodo | Acc. │
│────┼───┼───┼────────────────────────────────────┼───┼───┼──────┼──────│
Columnas:
ID: Identificador de entradaI: Hora de inicioF: Hora de finDescripción: Detalle del eventoJ: Modo (P=Presencial, R=Remoto)E: Estado (⏳, ✅, ❌)Nodo: Nodo origen del evento (nuevo)Acc: Acciones (editar, eliminar)
Flujo de navegación:
- Seleccionar Ámbito (ej:
dtic-DASUTEN) - Ver todos los eventos de los nodos del ámbito
- Columna Nodo muestra el origen de cada evento
4.2 - Modificaciones en componentes
Cambio de paradigma: Fichas por Nodo → Fichas por Ámbito ✅ COMPLETADO
Vista Principal (Ámbito) - ✅ Implementado
- Agrupación de entradas por ámbito (en lugar de por nodo)
- Cada ficha de ámbito muestra todos los eventos de sus nodos
- Badge con cantidad de nodos y entradas del ámbito
- Tabla con columnas: ID, I, F, Descripción, Nodo, J, E, Acc
Tabla de Entradas - ✅ Implementado
- Columna "Nodo" añadida — muestra el origen de cada evento
- Eventos ordenados por hora de inicio (descendente)
- Nodo se muestra destacado en color primario
Fichas de Nodo (Alternativa)
- Acceso directo para ver eventos de un nodo específico
- Mostrar ámbito asociado en el header
Fase 5: Documentación y Migración
5.1 - Actualizar hebras ADN
01_ontologia.md→ Definir modelo ámbito/nodo02_bitacora.md→ Referenciar ámbito en formato05_ia.md→ Añadir premisa de ámbito en contextoadn/README.md→ Actualizar subcomandos disponibles y tabla de comandos06_gobernanza.md→ Añadir nomenclatura de ámbitos05_ia.md→ Añadir premisa de ámbito en contexto (pendiente)
5.2 - Migrar datos existentes
./adn/tools/run db migrar:ambitos # Mapear nodos existentes a ámbitos
./adn/tools/run db ambito:propagar # Propagar a entradas
5.3 - Script de migración de datos
# adn/tools/db/migrations/002_migrate_ambitos.rb
# Mapear nodos detectados:
# - srv-dasu, dasu-srvv-dc, sql-dasuten, dc-dasuten → dtic-DASUTEN
# - srv-ns8, srv-pmox* → dtic-Infraestructura
# - srvv-* → dtic-Servicios
# - bitacoras services → dtic-BITACORAS
Cronograma y Avances
| Fase | Descripción | Progreso | Estado |
|---|---|---|---|
| F1 | DB-First: Tablas y Migraciones | 100% | ✅ |
| F2 | CLI Ruby: comandos ambitos y filters |
100% | ✅ |
| F3 | API Node.js: Endpoints y Dashboard | 100% | ✅ |
| F4 | Frontend Vite: UI/UX Ámbitos | 100% | ✅ Fichas por Ámbito implementadas (2026-03-25) |
| F5 | Validación: Documentación y QA | 100% | ✅ |
Log de Actividades (Hitos)
| Fecha | Hora | Hito | Descripción |
|---|---|---|---|
| 20/03 | 08:30 | 📋 Inicio Plan | Elaboración y aprobación del plan P2604.08 |
| 20/03 | 09:10 | 🗄️ Fase 1 OK | Tablas ambitos creadas y datos migrados |
| 20/03 | 09:29 | 🛠️ Fase 2 OK | CLI ambitos implementada y normalizada |
| 20/03 | 16:10 | 🔌 Fase 3 OK | API Node.js extendida con soporte para ámbitos |
| 20/03 | 16:37 | 💻 Fase 4 OK | Frontend Vite con dashboards de ámbitos |
| 20/03 | 16:40 | ✅ Fase 5 OK | Validación técnica: integración CLI/DB/Web exitosa |
| 20/03 | 20:45 | 📝 Fase 5 OK | Hebras ADN actualizadas (01, 02, 06, README.md) |
| 20/03 | 21:00 | 🎨 Fase 4 OK | Corrección CSS responsivo en tablas (table-layout: fixed, overflow-x) |
Criterios de Éxito
- ✅ Base de datos con tabla
ambitosfuncional - ✅ CLI permite crear/listar/gestionar ámbitos (con
--helpnormalizado) - ✅ Eventos registran ámbito automáticamente desde nodo
- ✅ API expone endpoints de ámbito
- ✅ Frontend muestra selector de ámbito en mini header
- ✅ Datos migrados correctamente
- ✅ Documentación actualizada en todas las hebras ADN (incluido README.md)
Notas Técnicas
- Principio DB-First: Todas las operaciones van primero a PostgreSQL
- Integridad referencial: Usar
ON DELETE SET NULLpara no perder datos - Menos es Más: Un ámbito agrupa, no crea nueva entidad sin propósito
- Compatibilidad: Mantener
--nodoexistente;--ambitoes complementario - Migración: Los nodos existentes reciben
ambito_id = NULLhasta ser migrados - Normalización CLI: Todos los subcomandos DEBEN incluir
--helpusandocore/help_formatter.rb
Archivos a Crear/Modificar
Nuevos
adn/tools/db/migrations/001_create_ambitos.sqladn/tools/db/migrations/002_migrate_nodos_ambitos.sqladn/tools/db/migrations/002_migrate_ambitos.rbadn/tools/db/core/ambito_db.rbadn/tools/cli/ambitos.rbservicios/nginx/dtic-bitacoras/backend/src/routes/ambitos.jsservicios/nginx/dtic-bitacoras/frontend/src/pages/Ambitos.tsx
Modificar
adn/tools/cli/db/nodo.rb(añadir--ambito,--help)adn/tools/cli/db/evento.rb(añadir--ambito,--help)adn/tools/cli/nodos.rb(filtros por ámbito,--help)adn/tools/cli/salud.rb(métricas por ámbito,--help)adn/tools/db/core/bitacora_db.rbadn/tools/db/core/evento_db.rbadn/tools/core/help_formatter.rb(si no existe)adn/tools/core/error_handler.rb(si no existe)servicios/nginx/dtic-bitacoras/backend/src/server.jsservicios/nginx/dtic-bitacoras/frontend/src/App.tsxadn/01_ontologia.mdadn/02_bitacora.mdadn/05_ia.mdadn/06_gobernanza.mdadn/README.md