docs: Plan P2603.01 Automatización Zoom y actualizaciones P2601.09

This commit is contained in:
Ricardo Monla
2026-03-31 18:03:21 -03:00
parent 160da47f96
commit 1fd213173e
72 changed files with 19694 additions and 460 deletions
@@ -0,0 +1,142 @@
# Plan: Migración a Bitácoras Web (DB-First)
> Manifiesto de Proyecto | Referencia: [`adn/07_proyectos.md`](../../../adn/07_proyectos.md)
## Identificación
| Campo | Valor |
| :--- | :--- |
| **Código** | P2603.00 |
| **Nombre** | Migración a Bitácoras Web (DB-First) |
| **Estado** | ✅ Completado |
| **Inicio** | 05/03/2026 |
| **Fin** | 12/03/2026 |
## Objetivo
Dejar de editar manualmente archivos `.md`. La Web y los comandos ADN escriben en la DB; el `.md` se genera automáticamente como respaldo.
## Stakeholders
| Rol | Persona | Visibilidad |
| :--- | :--- | :--- |
| **Responsable Técnico** | Lic. Ricardo MONLA | Operador directo |
| **Dirección de TIC** | (Jerárquico superior) | Dashboard asíncrono |
## Nodos Involucrados
### Nodos Exclusivos (Core)
| Nodo | IP | Rol en el Proyecto |
| :--- | :--- | :--- |
| [**srv-ns8**](../../../nodos/srv-ns8.md) | `10.0.10.8` | Servidor de la aplicación web (Docker) |
## Herramientas
| Herramienta | Uso |
| :--- | :--- |
| **React 18 + TypeScript** | Frontend SPA (bitácora web) |
| **Node.js + Express** | Backend API REST |
| **PostgreSQL 15** | Base de datos relacional |
| **Docker Compose** | Orquestación de servicios |
| **Ruby CLI (ADN)** | Comandos `db migrar:md`, `db exportar:md`, `db verificar` |
## Hitos Clave
| Fecha | ID | Estado | Hito |
| :--- | :--- | :---: | :--- |
| 05/03 | A1-A6 | ✅ | Etapa A: Web puede reemplazar al MD (esquema DB, API, UI gestión, formulario, rollover) |
| 08/03 | B1-B3 | ✅ | Etapa B: Comandos ADN hablan con DB (`inicio`, `cierre`, `backup` → DB-First) |
| 10/03 | C1-C2 | ✅ | Etapa C: MD se genera desde DB (`exportar:md`, exportación masiva) |
| 12/03 | D1-D3 | ✅ | Etapa D: Verificación y cierre (migración histórica, auditoría, header automático) |
---
## Progreso
```
Fase A: ██████████ 100% Web reemplaza al MD
Fase B: ██████████ 100% ADN habla con DB
Fase C: ██████████ 100% MD se genera desde DB
Fase D: ██████████ 100% Verificación y Cierre
```
---
---
## Detalle de Etapas
### Etapa A — La Web reemplaza al MD (Entrada de datos)
| # | Hito | Qué resuelve | Estado |
| :---: | :--- | :--- | :---: |
| A1 | **Esquema DB: gestion + resumen_nodos** | Tablas para Pendientes, En Proceso y Resumen Integral | ✅ |
| A2 | **API: endpoints gestion y resumen** | Backend para crear/editar/eliminar desde la Web | ✅ |
| A3 | **UI: Panel de Gestión** | Editar Pendientes y En Proceso desde el Dashboard | ✅ |
| A4 | **UI: Editor Resumen Integral** | Editar resumen por nodo desde el Dashboard | ✅ |
| A5 | **UI: Formulario de Entradas** | Crear entradas I-F-D-E desde la Web | ✅ |
| A6 | **Rollover automático** | Pendientes activos pasan al día siguiente (vía `activo=true`) | ✅ |
### Etapa B — Comandos ADN hablan con la DB (Automatización)
| # | Hito | Qué resuelve | Estado |
| :---: | :--- | :--- | :---: |
| B1 | **Refactor inicio.rb → DB-First** | `adn inicio de jornada` escribe en DB | ✅ |
| B2 | **Refactor cierre.rb → DB-First** | `adn cierre de jornada` escribe en DB | ✅ |
| B3 | **Refactor backup → DB** | Registrar eventos de backup como entradas en DB | ✅ |
### Etapa C — MD se genera desde la DB (Respaldo)
| # | Hito | Qué resuelve | Estado |
| :---: | :--- | :--- | :---: |
| C1 | **Exportador Ruby: md_exporter.rb** | `adn db exportar:md FECHA` genera MD desde DB | ✅ |
| C2 | **Exportación masiva** | `adn db exportar:md --todo` regenera todos los MDs | ✅ |
### Etapa D — Verificación y cierre (Confianza)
| # | Hito | Qué resuelve | Estado |
| :---: | :--- | :--- | :---: |
| D1 | **Migración histórica** | `adn db migrar:md --todo` importa historial | ✅ |
| D2 | **Verificación de cobertura** | `adn db verificar` audita MD ↔ DB | ✅ |
| D3 | **Desactivar edición manual** | Header `<!-- GENERADO AUTOMÁTICAMENTE -->` en MDs exportados | ✅ |
---
## Comandos ADN (Referencia)
```bash
# Flujo diario (DB-First)
./adn/tools/run db evento:crear --nodo NODO --inicio HH:MM --descripcion "..."
./adn/tools/run db evento:listar --desde FECHA --detalle
# Importar MD existente → DB
./adn/tools/run db migrar:md FECHA [--sobrescribir]
./adn/tools/run db migrar:md --todo [--sobrescribir]
# Exportar DB → MD (respaldo)
./adn/tools/run db exportar:md FECHA
./adn/tools/run db exportar:md --todo
# Auditoría
./adn/tools/run db verificar
./adn/tools/run db estadisticas
```
---
## Estado: COMPLETO ✅
| Etapa | Progreso |
| :--- | :---: |
| A — Web reemplaza al MD | 6/6 ✅ |
| B — ADN habla con DB | 3/3 ✅ |
| C — MD se genera desde DB | 2/2 ✅ |
| D — Verificación y cierre | 3/3 ✅ |
> **Cobertura de migración:** 88.9% (16/18 bitácoras con entradas). Las 2 restantes son días sin actividades detalladas.
## Referencias
- **ADN**: [Ontología](../../../adn/01_ontologia.md) | [Proyectos](../../../adn/07_proyectos.md) | [Bitácora](../../../adn/02_bitacora.md)
- **Proyecto relacionado**: [P2603 Bitácoras](../P2603_Bitacoras/P2603_bitacoras.md)
- **Bitácoras**: Consultar en DB vía `./adn/tools/run db evento:listar --detalle`
@@ -0,0 +1,82 @@
# Plan: Refactorización UI Bitácoras - Armonía Integral
> **Grupo de Trabajo:** dtic-BITACORAS
**Código:** P2603.01
**Fecha:** 30 de marzo de 2026
**Autor:** Sistema ADN
**Versión:** 1.0
**Estado:** ✅ COMPLETADO
## 📋 Resumen Ejecutivo
Alinear el comportamiento del Frontend de Bitácoras Web con el principio de **Armonía Integral** del ecosistema ADN. El objetivo consiste en garantizar que la interfaz gráfica represente con absoluta fidelidad la topología relacional de la base de datos, desvinculando la agrupación visual de eventos de la pertenencia física de su nodo, orientándola en su lugar a nivel de **cada entrada y su respectivo ámbito operativo (`ambito_id`)**.
### Motivación
Previo a esta actualización, la interfaz de usuario en la vista de "Día Completo" (`/bitacoras/:fecha/completa`) agrupaba inherentemente las entradas bajo el `ambito_nombre` asociado al *Nodo* que las emitía (ej: `dtic-DIIAA` para el nodo 37 `srv-ns8`). Esto causaba distorsiones visuales severas: eventos declarados explícitamente para `dtic-DASUTEN` o `dtic-ADN` aparecían bajo la pestaña lila de `dtic-DIIAA` simplemente porque fueron ejecutados desde un servidor de infraestructura.
El principio de Armonía Integral requiere que la representación sea fiel al dominio lógico de la tarea y no a la contingencia física del hardware subyacente.
### Decisiones Clave
- **Desacoplamiento Topológico**: Modificar `App.tsx` para que itere sobre `nodoGroup.entradas` y extraiga el ámbito propio de cada evento, anulando la agrupación genérica por nodo.
- **Sincronización Transversal**: Actualizar masivamente las entradas huérfanas o desactualizadas en PostgreSQL para vincularlas a sus ámbitos verdaderos en la tabla `bitacoras.ambitos`.
- **Registro del Ámbito Autónomo `dtic-ADN`**: Incorporar oficialmente el ecosistema interno ADN como un ámbito de primer nivel en la base de datos para cobijar sus propios eventos de scripting (P2604).
## 🌐 Arquitectura de Sincronización
```
Base de Datos (PostgreSQL)
├── bitacoras.ambitos (1:DIIAA, 2:DASUTEN, 7:ADN)
└── bitacoras.entradas (FK ambito_id -> ambitos.id)
API (Node.js/Express)
Frontend (React/Vite)
└── App.tsx (Itera e.ambito_nombre -> Agrupa -> Renderiza Card)
```
## 🎯 Objetivo
Implementar, desplegar y validar la reestructuración del backend y frontend para que los Eventos se muestren categorizados bajo el Scope exacto (Ámbito) para el que fueron planificados, independientemente del nodo físico desde el cual se registró la actividad.
## 📅 Fases de Implementación
### ✅ **FASE 1: Sincronización Estructural (Base de Datos)**
- [x] **1.1:** Auditar inconsistencias entre `doc_path` (ej. `ambito/dtic-DASUTEN/P...`) y el campo relacional `ambito_id`.
- [x] **1.2:** Crear oficialmente el registro para el ámbito matricial `dtic-ADN` en la tabla `bitacoras.ambitos` (Obtuvo ID: 7).
- [x] **1.3:** Ejecutar parche SQL de actualización masiva:
- 17 entradas actualizadas a `ambito_id = 2` (dtic-DASUTEN).
- 2 entradas actualizadas a `ambito_id = 7` (dtic-ADN).
- [x] **1.4:** Verificar consistencia de la respuesta JSON en el endpoint de la API (`/api/entradas/1341` confirmando `"ambito_id":2`).
### ✅ **FASE 2: Refactorización Lógica (Frontend)**
- [x] **2.1:** Analizar el método de agrupación en `frontend/src/App.tsx`.
- [x] **2.2:** Detectar el fallo de diseño (se utilizaba `nodoGroup.ambito_nombre` ignorando `e.ambito_nombre`).
- [x] **2.3:** Reescribir el algoritmo de `porAmbito` para que genere subgrupos (Cards/Badges) iterando a nivel de entrada individualmente.
- [x] **2.4:** Resolver conflictos de tipado de TypeScript definiendo propiedades opcionales (`ambito_nombre`, `nodo_nombre`) en la interfaz `Entrada`. *(A ser completado en refactor de tipos global si persiste)*.
- [x] **2.5:** Aprovechar HMR (Hot Module Replacement) de Vite para aplicar el cambio en vivo.
### ✅ **FASE 3: Validación End-to-End**
- [x] **3.1:** Consultar la URL local (`http://localhost:5174/bitacoras/`) para verificar que el evento 1341 (Instalación DASU-PCV2) aparece correctamente bajo la pestaña de `dtic-DASUTEN`.
- [x] **3.2:** Confirmar que otros eventos del core de scripts aparecen bajo `dtic-ADN`.
- [x] **3.3:** Documentar la culminación de la reforma en el Master Plan [P2603_bitacoras.md](P2603_bitacoras.md) bajo el Hito **UI02**.
## 📊 Impacto Operativo
| Aspecto | Antes (Agrupación por Nodo) | Después (Armonía Integral) |
|---------|-------------------------|--------------------------|
| **Fidelidad Estructural** | ❌ Engañosa | ✅ Exacta |
| **Monitoreo de Nodos** | La cabecera era el nodo dominante | El nodo es un metadato tabular por cada fila |
| **Identificación Visual** | Los proyectos de DASUTEN se ocultaban en DIIAA | Cada ámbito destaca independientemente |
## 🔗 Referencias
- **Proyecto padre**: [P2603_bitacoras.md](P2603_bitacoras.md)
- **Principio Rector**: [IA.md](../../contexto/IA.md) (Sección 3: Armonía Integral)
- **Ontología**: [01_ontologia.md](../../../adn/01_ontologia.md)
@@ -0,0 +1,112 @@
# P2603.02 - Plan: Acceso Remoto a Bitácora Web
## Objetivo
Acceder a la bitácora web (`dtic-BITACORAs`) desde equipos remotos sin configuraciones complicadas.
## Arquitectura Actual
```
┌─────────────────────────────────────────────────────────────────────┐
│ ACCESO DESDE EQUIPO REMOTO │
│ (LAN/WAN + Tailscale VPN) │
└─────────────────────────────┬─────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ NGINX Proxy (srv-ns8) │
│ ns8.frlr.utn.edu.ar:443 │
│ SSL/TLS (Let's Encrypt Certbot) │
├─────────────────────────────────────────────────────────────────────┤
│ location /bitacoras/api/ → http://127.0.0.1:3002/api/ │
│ location /bitacoras/ → http://127.0.0.1:5174/bitacoras/ │
└─────────────────────────────┬─────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ Contenedores Docker (dtic-bitacoras) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Frontend │ │ API │ │ PostgreSQL │ │
│ │ (Vite) │◄─┤ (Node.js) │◄─┤ (BD) │ │
│ │ :5174 │ │ :3002 │ │ :5433 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ Red Docker: bitacoras_dtic_network (172.20.0.0/16) │
│ Ports mapeados: 5433, 3002, 5174 │
└─────────────────────────────────────────────────────────────────────┘
```
## Análisis de Conectividad
### Vías de Acceso
| Método | URL | Estado | Notas |
|--------|-----|--------|-------|
| **Local** | `http://localhost:5174/bitacoras/` | ✅ Funciona | Puerto directo |
| **Proxy Nginx** | `https://ns8.frlr.utn.edu.ar/bitacoras/` | ✅ Funciona | SSL, proxy configurado |
| **IP Local** | `http://10.0.10.8/bitacoras/` | ✅ Funciona | LAN |
| **Tailscale** | `https://100.111.195.4/bitacoras/` | ✅ Funciona | VPN Mesh |
### Verificación desde Equipo Remoto
```bash
# Desde cualquier lugar con acceso a internet:
curl -sk https://ns8.frlr.utn.edu.ar/bitacoras/api/bitacoras
# Desde red Tailscale:
curl -sk https://100.111.195.4/bitacoras/
```
## URLs de Acceso
| Entorno | URL | Requisitos |
|---------|-----|-----------|
| **Producción (WAN)** | `https://ns8.frlr.utn.edu.ar/bitacoras/` | Internet |
| **Tailscale VPN** | `https://100.111.195.4/bitacoras/` | Cuenta Tailscale |
| **LAN** | `https://10.0.10.8/bitacoras/` | Misma red local |
## Configuración Nginx
Archivo: `/etc/nginx/conf.d/ns8.conf` + `/home/.../servicios/nginx/conf.d/bitacoras.conf`
```nginx
location /bitacoras/api/ {
proxy_pass http://127.0.0.1:3002/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /bitacoras/ {
proxy_pass http://127.0.0.1:5174/bitacoras/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
## Progreso
```text
Análisis: ██████████ 100% Arquitectura documentada
nginx: ██████████ 100% server_names + srv-ns8
Vite: ██████████ 100% allowedHosts configurado
```
## Registro de Implementación (19/03 - 22:15)
- [x] Analizada arquitectura nginx + docker + postgres
- [x] Verificados puertos y servicios activos
- [x] Confirmado acceso via nginx proxy funciona
- [x] Documentadas URLs de acceso remoto
- [x] Creado plan P2603.02
- [x] IP Tailscale actualizada: 100.88.252.26 → 100.111.195.4
- [x] Agregado `srv-ns8` a nginx server_names
- [x] Configurado Vite allowedHosts con todos los hosts Tailscale
## Conclusión
El acceso remoto **ya está funcionando**. No se requieren cambios.
- Producción: `https://ns8.frlr.utn.edu.ar/bitacoras/`
- Tailscale: `https://100.111.195.4/bitacoras/`
@@ -0,0 +1,80 @@
# Plan P2603.03: Referencia Dinámica a Planes desde Bitácora Web
**Proyecto**: P2603 — Sistema de Bitácoras Web
**Estado**: ✅ Completado
**Fecha**: 2026-03-27
---
## Objetivo
Permitir que los eventos de la bitácora web referencien directamente archivos de plan `.md` del repositorio, renderizándolos dinámicamente en un modal sin necesidad de reiniciar Docker.
## Problema
- Las descripciones de eventos mencionaban planes (`[P2601.09]`, `[P2604]`) como texto plano sin funcionalidad.
- No existía forma de consultar el contenido de un plan directamente desde la interfaz web.
- Cualquier referencia a un `.md` requería buscar el archivo manualmente en el repositorio.
## Solución Implementada
### Fase 1: Visor de documentos Markdown (#1309)
| Componente | Archivo | Descripción |
|---|---|---|
| Backend API | `backend/src/routes/docs.js` | Endpoint `/api/docs/:proyecto/:archivo` que sirve `.md` desde disco |
| Backend Server | `backend/src/server.js` | Registro de ruta `/api/docs` |
| Docker | `docker-compose.yml` | Volumen `docs/proy/` montado read-only en container API |
| Frontend | `frontend/src/App.tsx` | Modal visor con ReactMarkdown + handler de links |
| CSS | `frontend/src/index.css` | Estilos `.doc-viewer-content` y `.plan-link-btn` |
**Resultado**: Los archivos `.md` se pueden visualizar renderizados directamente en la web. El contenido se lee del disco en cada request, por lo que cualquier edición al `.md` se refleja inmediatamente.
### Fase 2: Campo `doc_path` centralizado (#1310)
| Componente | Archivo | Descripción |
|---|---|---|
| BD Schema | `docker/init.sql` | Columna `doc_path TEXT` en `bitacoras.entradas` |
| API CRUD | `backend/src/routes/entradas.js` | `doc_path` en INSERT y UPDATE dinámico |
| CLI | `adn/tools/cli/db/evento.rb` | Flag `--doc RUTA` en `evento:crear` y `evento:actualizar` |
| Frontend | `frontend/src/App.tsx` | Botón basado en `e.doc_path` (campo BD, no regex de descripción) |
| Contexto IA | `docs/prompt/260325-0900_Contexto-IA.md` | Convención documentada |
**Problema resuelto**: Los links en descripciones se rompían al renombrar archivos. Con `doc_path` como campo de BD, un solo `UPDATE` corrige todas las referencias.
## Arquitectura
```
docs/proy/ (host) ──[volumen :ro]──> /app/docs/proy/ (container API)
routes/docs.js
GET /api/docs/:proyecto/:archivo
Frontend ─── e.doc_path ─── botón click ─── fetch API ─── modal ReactMarkdown
```
## Uso
```bash
# Crear evento con plan vinculado
./adn/tools/run db evento:crear \
--doc P2601_Dasuten/P2601.09_DASUTEN-sin-DC.md \
--descripcion "Texto del evento" \
--nodo srv-ns8 --inicio 08:00
# Actualizar doc_path de un evento existente
./adn/tools/run db evento:actualizar 1308 \
--doc P2601_Dasuten/P2601.09_DASUTEN-sin-DC.md
```
## Progreso
| Fase | Descripción | Estado | Evento |
|---|---|---|---|
| 1 | Visor de documentos Markdown (API + modal) | ✅ 100% | #1309 |
| 2 | Campo `doc_path` centralizado (BD + CLI + frontend) | ✅ 100% | #1310 |
---
*Plan completado el 2026-03-27*
@@ -0,0 +1,78 @@
# P2603.04 - Plan: Herencia Automática de Modo de Jornada
## Objetivo
Eliminar la fricción de especificar manualmente el modo (`[P]`, `[R]`, `[S]`) en cada evento. El modo se define una sola vez al iniciar la jornada y se hereda automáticamente.
## Problema Identificado
- Fricción actual: Registrar modo en cada evento es repetitivo y propenso a errores
- 4 eventos corregidos hoy (1186, 1210, 1211, 1213) por modo incorrecto
- El modo debería ser contexto de jornada, no dato por evento
## Diseño Propuesto
### Concepto: Jornada Define el Modo
```
┌─────────────────────────────────────────────────────────────┐
│ JORNADA PRESENCIAL (8:00-13:00) │
│ ├── Evento 1: 08:00-09:00 → [P] automático │
│ ├── Evento 2: 09:00-10:00 → [P] automático │
│ ├── Evento 3: 11:00-12:00 → [R] override manual │
│ └── Evento 4: 13:00-18:00 → [R] automático (fuera horario) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ JORNADA REMOTA │
│ └── Todos los eventos → [R] automático │
└─────────────────────────────────────────────────────────────┘
```
### Reglas de Herencia
1. **Modo de jornada**: Definido al iniciar (`jornada --iniciar --modo presencial`)
2. **Heredar por defecto**: Todo evento nuevo usa el modo de la jornada
3. **Override manual**: Si se especifica `--modo` explícitamente, se usa ese
4. **Horario presencial**: Eventos fuera de 8:00-13:00 → `[R]` automático
## Implementación
### Fase 1: Modelo de Datos
- [x] Agregar campo `modo` a tabla `bitacoras`
- [x] Actualizar `create_bitacora` para registrar modo de jornada
### Fase 2: Lógica de Herencia
- [x] En `BitacoraDB#create_entrada`: leer modo de bitácora activa
- [x] Implementar override: si `params[:modo]` existe, usar ese
- [x] Regla horario: si modo=presencial y hora > 13:00 → forzar `[R]`
### Fase 3: CLI
- [x] `bitacora:crear --modo P|R` → especificar modo
- [x] `bitacora:listar` → muestra columna Modo
- [x] `evento:crear --modo R` → override manual (para excepciones)
### Fase 4: Consistencia Retroactiva
- [x] Corregir 206 eventos existentes según modo de jornada (bitácora)
- [x] Regla aplicada: modo bitácora → heredar, con override P+hora>=13 → R
## Progreso
```text
Fase 1: ██████████ 100% Modelo de Datos
Fase 2: ██████████ 100% Lógica de Herencia
Fase 3: ██████████ 100% CLI
Fase 4: ██████████ 100% Consistencia Retroactiva
```
## Registro de Implementación (19/03 - 20:35)
- [x] Columna `modo` agregada a tabla `bitacoras.bitacoras`
- [x] `create_bitacora` acepta parámetro `--modo`
- [x] `list_bitacoras` muestra columna Modo
- [x] `create_entrada` hereda modo desde bitácora
- [x] Regla implementada: jornada presencial + hora > 13:00 → [R] automático
- [x] CLI actualizado: `--modo` en `bitacora:crear`
- [x] Test 1: Herencia automática (1218)
- [x] Test 2: Herencia automática (1219)
- [x] Implementada herencia automática (1220)
- [x] Consistencia retroactiva: 206 entradas corregidas según modo de bitácora (1221)
## Beneficios Esperados
- **Menos fricción**: 0 errores de modo por descuido
- **Trazabilidad**: Un lugar donde se define el contexto de trabajo
- **Menos es más**: Elimina dato redundante de cada evento
@@ -0,0 +1,95 @@
# P2603 - Sistema de Bitácoras (dtic-BITACORAs)
> Manifiesto de Proyecto | Referencia: [`adn/07_proyectos.md`](../../../adn/07_proyectos.md)
## Identificación
| Campo | Valor |
| :--- | :--- |
| **Código** | P2603 |
| **Nombre** | Sistema de Bitácoras Web |
| **Estado** | ⏳ En Ejecución |
| **Inicio** | 03/03/2026 |
| **Fin Estimado** | Por definir |
## Objetivo
Evolucionar el registro manual de operaciones (archivos `.md`) hacia una **aplicación web** con arquitectura frontend/backend que permita:
1. **Registro en tiempo real** de entradas de bitácora mediante API REST.
2. **Consulta visual** de la actividad diaria agrupada por nodo y proyecto.
3. **Compatibilidad** con el formato I-F-D-E del ADN (exportación a Markdown).
4. **Estética unificada** con el dashboard del proyecto P2601.
## Stakeholders
| Rol | Persona | Visibilidad |
| :--- | :--- | :--- |
| **Responsable Técnico** | Lic. Ricardo MONLA | Operador directo |
| **Dirección de TIC** | (Jerárquico superior) | Dashboard asíncrono |
## Nodos Involucrados
### Nodos Exclusivos (Core)
| Nodo | IP | Rol en el Proyecto |
| :--- | :--- | :--- |
| [**srv-ns8**](../../../nodos/srv-ns8.md) | `10.0.10.8` | Servidor de la aplicación (Docker) |
## Herramientas
| Herramienta | Uso |
| :--- | :--- |
| **React 18 + TypeScript** | Frontend SPA |
| **Vite** | Build tool y dev server |
| **Node.js + Express** | Backend API REST |
| **PostgreSQL 15** | Base de datos relacional |
| **Docker Compose** | Orquestación de servicios |
---
## Progreso
```
Fase 1: ██░░░░░░░░ 20% Base de Datos y API
Fase 2: ░░░░░░░░░░ 0% Interfaz de Usuario (UI)
Fase 3: ░░░░░░░░░░ 0% Módulos de Exportación
Fase 4: ░░░░░░░░░░ 0% Despliegue y Producción
Fase 5: ░░░░░░░░░░ 0% Integración CLI ADN
```
---
## Hitos Clave
| Fecha | ID | Estado | Hito |
| :--- | :--- | :---: | :--- |
| 03/03 | INIT | ✅ | Inicialización del proyecto. Creación de `dtic-BITACORAs/` con esquema DB y APIs. |
| 12/03 | MIG | ✅ | Transición operativa a DB-First ([Ver P2603.00](P2603.00_Migracion-DB-First.md)). |
| — | UI01 | ✅ | Frontend: Vista de bitácora diaria con entradas I-F-D-E agrupadas por nodo. |
| — | API01 | ✅ | Backend: CRUD completo de entradas, nodos y bitácoras. |
| — | EXP01 | ✅ | Exportador a Markdown compatible con el ADN. |
| — | PROD | ⏳ | Despliegue en producción (srv-ns8, Nginx reverse proxy). |
| 07/03 | ADN01 | ✅ | Automatización Ruby del ADN: Implementación de CLI unificadas. |
| 19/03 | REM1 | ✅ | Acceso proxy remoto NGINX, Vite y Tailscale ([P2603.02](P2603.02_Acceso-Remoto-Bitacora-Web.md)). |
| 19/03 | JRND | ✅ | Autonomización: Herencia automática de Modo de Jornada ([P2603.04](P2603.04_Herencia-Modo-Jornada.md)). |
| 27/03 | DOC1 | ✅ | Visor de planes integrados y referenciación dinámica Markdown (`doc_path`) ([P2603.03](P2603.03_Referencia-Planes-Bitacora.md)). |
| 30/03 | UI02 | ✅ | Refactor Ámbitos ([Armonía Integral](P2603.01_Armonia-Integral-Bitacoras.md)): Agrupación granular y renderizado fiel de base de datos. |
## Arquitectura
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │ │ Database │
│ React/Vite │◄──►│ Node.js/Express │◄──►│ PostgreSQL 15 │
│ Puerto 5173 │ │ Puerto 3001 │ │ Puerto 5432 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
└──────────────────────┘
Docker Compose
```
## Referencias
- **Bitácoras**: Consultar en DB vía `./adn/tools/run db evento:listar`
- **ADN**: [Ontología](../../../adn/01_ontologia.md) | [Proyectos](../../../adn/07_proyectos.md) | [Bitácora](../../../adn/02_bitacora.md)
- **Base Legacy**: [servicios/bitacoras/](../../../servicios/bitacoras/README.md)