location /docs/ en ns8.conf pasa por proxy_pass a gemma-docs-web.service
(WEBrick, 127.0.0.1:4567) — renderiza on-demand la documentación de
referencia de GEMMA (Protocolos, Guías, etc.) desde su .md, sin archivos
intermedios. Parte de P164 (dtic-GEMMA).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cambios:
- A04.P007: Bugs Operativos (actualización)
- A04.P008: VM Local de Test (actualización)
- A04.P009: SQL Linux Test (nuevo archivo)
- A10.P001: Office365 (actualización)
- w-zombi/data/cmd.json: actualización de comandos
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Manifiesto fundacional del ámbito A11 dtic-GEMMA:
- A11_dtic-GEMMA.md: Espíritu, misión y principios de operación
- A11.P001_Operativa-GEMMA.md: Protocolo de operativa diaria
Contexto:
- GEMMA opera como "número 2" del operador humano
- Ejecuta tareas desde simples (registro en bitácora) hasta complejas (orquestar backups)
- Todas las operaciones usan herramientas del ecosistema ADN
- Trazabilidad total vía bitácora
Actualizaciones:
- docs/contexto/IA.md: Agregada referencia al ámbito A11
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bug 2 — proc_dasuten.rb:
- Separa nodo operacional (srvv-fenix, srv-ns8, etc.) del nodo de bitácora
- Registro siempre bajo nodo=dtic-BKPs / ámbito=dtic-DIIAA
- Agrega constantes NODO_BITACORA y AMBITO_BITACORA
Bug 3 — ejecutor.rb (detectar_nodo_id):
- Ignoraba el parámetro 'nodo' y siempre usaba Socket.gethostname
- Fix: usa el nombre pasado para lookup en DB
- Fallback a hostname local solo si nodo es nil/empty o no existe en DB
- Segundo fallback a hostname si el nodo pasado tampoco existe en DB
DB: creado nodo 'dtic-BKPs' (ID:49, tipo:servicio, ámbito:dtic-DIIAA)
Refs: A04.P006 — Pipeline DASUTEN / A03 BKPs
- 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
BACKEND (ambitos.js):
- Nuevo endpoint GET /api/ambitos/:codigo/proyecto
- Devuelve estructura compatible con frontend existente
- Planes con hitos, métricas y nodos (igual que proyectos)
FRONTEND (ProyectoDashboard.tsx):
- Cambiado default de 'P2601' a 'A04'
- Fetch desde /ambitos/${codigo}/proyecto en lugar de /proyectos
- Mantiene compatibilidad con interfaz existente
DATOS ACTUALIZADOS:
- 29 hitos totales
- 21 completados ✅
- 8 pendientes/legacy ⏳🛑
- 6 planes: A04.P001 a A04.P006
- 60 horas totales (14.5h presencial + 45.5h remoto)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- adn/tools/db/migrations/004_create_planes.sql (NUEVO)
Migración para tabla 'planes' dentro de ámbitos
Reemplaza concepto anterior de 'fases' por 'planes'
Incluye vista resumen_planes para métricas
- servicios/nginx/dtic-bitacoras/tools/sync_dashboard_to_db.js
Actualizado para usar Ámbito A04 (dtic-DASUTEN) en vez de 'P2601'
Planes A04.P001 a A04.P006 en vez de 'fases 1-13'
Migración automática de DB si tablas no existen
27 hitos organizados por plan (Legacy + Workgroup + Backups)
- docs/ambito/dtic-DASUTEN/_hist/260415_dashboard_P2601_actualizacion.md
Documentación completa de la actualización
Incluye estructura de datos, métricas y referencias
**Estructura ADN aplicada:**
- Ámbito: A04 (dtic-DASUTEN)
- Planes: A04.P001 (Red) a A04.P006 (Backups)
- Hitos: 21 completados ✅, 3 pausados ⏸️, 6 legacy 🛑
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- docs/ambito/dtic-DASUTEN/_hist/P2601.legacy_lecciones_aprendidas.md (NUEVO)
Documento completo sobre el enfoque con Domain Controller (23/02-27/03/26)
Incluye: arquitectura descartada, causas del fracaso, timeline, lecciones
- docs/ambito/dtic-DASUTEN/A04.P005_DASUTEN-sin-DC.md
Agregada sección "Contexto Histórico" con referencia al caso de estudio
- docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md
Agregada sección completa sobre el enfoque DC descartado
- docs/contexto/IA.md
Agregada sección "Caso de Estudio: Enfoque con Domain Controller"
Incluye tabla de recursos, señales de alerta y lecciones para futuros proyectos
**Principio aplicado:** "La arquitectura más simple que funciona es mejor que
la arquitectura 'correcta' que apenas se sostiene."
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se corrigió actualizar_heartbeat_web() para que filtre el output
antes de actualizar la Bitácora Web.
Antes: Mostraba ~400 líneas con logs de PostgreSQL
Ahora: Muestra solo ~15 líneas de progreso relevante del dron
El filtrado se aplica en dos lugares:
1. Al acumular líneas (filtrar_lineas_relevantes)
2. Al actualizar heartbeat web (filtrar_output_relevante)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se implementó filtrado de output para que la Bitácora Web muestre
solo las líneas relevantes del progreso del dron, no los ~40 logs
repetitivos de conexión a PostgreSQL.
Cambios:
- filtrar_lineas_relevantes(): Filtra líneas de PostgreSQL en tiempo real
- filtrar_output_relevante(): Filtra y mantiene últimas 20 líneas para heartbeat
- Heartbeat web: Ahora muestra solo progreso del dron, no conexiones DB
Beneficio: La Bitácora Web ahora muestra información útil y legible
en lugar de cientos de líneas de logs técnicos repetitivos.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se implementó mejora en la salida de comandos para hacerla más intuitiva:
Cambios realizados:
- bkps.rb: Encabezado y cierre visual con box drawing para tareas DASUTEN
- ejecutor.rb: Barra de progreso con timer en tiempo real durante ejecución
- A04.P006: Actualizado con resultados del test completo 2026-04-15
Nueva salida visual:
- Encabezado con contexto del pipeline (nombre, hora de inicio)
- Timer en vivo durante la ejecución ([1m 23s] ejecutando...)
- Cierre con estado (✅/❌) y duración total
Resultados del test completo (Pipeline FULL):
- 6 pasos completados exitosamente en 13m 15s
- DBCC CHECKDB: Integridad OK
- Todos los drones atómicos funcionaron correctamente
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mejora en el sistema de latidos de los drones para mostrar el progreso
acumulado en lugar de solo la última línea.
Cambios realizados:
- ejecutor.rb: Acumulación de output en array accumulated_out[]
- actualizar_heartbeat_web(): Muestra últimas 15 líneas en bloque ```text
- A01.P009: Documentada Fase F1.5b con ejemplo técnico
- A04.P006: Actualizado plan DASUTEN con mejora y lección aprendida
Beneficio: Visibilidad completa del progreso de drones multi-paso
(ej: [1/3], [2/3], [3/3] en pipelines de backup/restore)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se actualiza el nombre completo de la oficina:
- Antes: DASUTEN (Departamento de Acción Social Universitaria Tecnológica Nacional)
- Ahora: D.A.S.U.Te.N (Dirección de Acción Social de la Universidad Tecnológica Nacional)
Cambio aplicado en:
- 02_informe_tecnico_DASUTEN.md (sección Resumen Ejecutivo)
- 01_informe_ejecutivo_DASUTEN.md (ya tenía el nombre correcto)
Se copian los informes actualizados al directorio de versiones:
- 01_v0.4.md — Informe ejecutivo con pipeline de backups implementado
- 02_v0.3.md — Informe técnico con anexo G de drones atómicos
Cambios desde versiones anteriores:
- Estado 100% completado (vs 95%)
- Impresión resuelta mediante symlink
- Pipeline de backups documentado (6 drones atómicos)
- Módulo DasuExecutor incorporado
- Integración con bkps.rb detallada
Agregada sección sobre el módulo dasu_executor.rb:
- Funciones disponibles y su propósito
- Ejemplo de uso
- Beneficios de mantenibilidad
Agregada lección aprendida sobre refactorización.
- Arquitectura actualizada: backup directo a X: sin paso intermedio
- Tabla de drones actualizada con nuevos outputs
- Agregada lección aprendida sobre simplificación
Cambios realizados:
1. dasuten_exportar_srvv-fenix.rb:
- Genera backup en disco local: E:\BK_SQL\sysdasuten\
- Copia automáticamente a unidad de red X: (share srv-ns8)
- Usa PowerShell para copiar al share mapeado
- Verifica ambos destinos
2. dasuten_transferir_srvv-fenix-srv-ns8.rb:
- Simplificado: ya no descarga desde fenix vía SMB
- El backup ya está en /mnt/ns8Disco2/bkps-dasuten/
- Copia local: share → /var/tmp/ (para rclone upload)
Flujo actualizado:
1. SQL Server → E:\BK_SQL\sysdasuten\archivo.bak (local fenix)
2. PowerShell → X:\archivo.bak (share srv-ns8)
3. Transfer dron → /var/tmp/archivo.bak (para rclone)
4. Upload dron → Google Drive
Requisito en srvv-fenix:
net use X: \\10.0.10.8\bkps-dasuten /user:rmonla <password>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cambios realizados:
1. srv-ns8 - Share SMB configurado:
- Path: /mnt/ns8Disco2/bkps-dasuten
- Share name: bkps-dasuten
- Usuario: rmonla
- Acceso: \\10.0.10.8\bkps-dasuten
2. dasuten_transferir_srvv-fenix-srv-ns8.rb:
- Elimina copia automática al share
- Agrega nota sobre cómo copiar manualmente desde fenix
- Mantiene backup en /var/tmp/ para upload a Drive
Uso desde srvv-fenix (Windows):
net use X: \\10.0.10.8\bkps-dasuten /user:rmonla <password>
copy E:\BK_SQL\sysdasuten\archivo.bak X:\
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cambios realizados:
1. dasuten_transferir_srvv-fenix-srv-ns8.rb:
- Agrega paso [3/3] para copiar al directorio compartido
- Directorio: /mnt/ns8Disco2/bkps-dasuten/
- Mantiene copia temporal en /var/tmp/ para upload a Drive
- Output incluye backup_ns8 con ruta completa
Flujo actualizado:
srvv-fenix (E:\BK_SQL\sysdasuten\)
↓ SMB
srv-ns8 (/var/tmp/) ← temporal para upload
↓ copia local
srv-ns8 (/mnt/ns8Disco2/bkps-dasuten/) ← share permanente
Resultado:
- Backup original se preserva en fenix
- Copia en share ns8 para resguardo local
- Copia temporal para upload a Google Drive
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cambios realizados:
1. dasuten_exportar_srvv-fenix.rb (FULL):
- Nuevo formato: E:\BK_SQL\sysdasuten\sysdasuten_FULL_YYYYMMDD_HHMMSS.bak
- Crea directorio con xp_create_subdir si no existe
- Usa compresión nativa de SQL Server (WITH COMPRESSION)
- Output: backup_tipo='full'
2. dasuten_exportar_diferencial_srvv-fenix.rb (DIF):
- Nuevo formato: E:\BK_SQL\sysdasuten\sysdasuten_DIF_YYYYMMDD_HHMMSS.bak
- Crea directorio si no existe
- Usa compresión nativa (WITH DIFFERENTIAL, COMPRESSION)
- Output: backup_tipo='differential'
3. dasuten_download_drive-dasu-sql4.rb:
- Lee nombre de archivo desde upload_output JSON
- Guarda como F:\BACKUP\{nombre_real_del_archivo}.bak
- Soporta formatos FULL y DIF
4. dasuten_restaurar_dasu-sql4.rb:
- Lee backup_local desde download_output JSON
- Busca patrón sysdasuten_FULL_*.bak si no hay output
- Encuentra el más reciente por LastWriteTime
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>