System Audit — Auditoría Sistemática de Repositorios
Resumen
Procedimiento para auditar un repositorio o sistema de software completo: explorar la estructura, leer archivos clave, identificar fortalezas y debilidades, y proponer mejoras priorizadas.
Cuándo usar
- Usuario pide "auditoría", "review", "qué te parece", "qué mejorarías" de un repositorio o sistema
- Evaluación de calidad antes de integrar un sistema nuevo
- Revisión de un proyecto propio para detectar deuda técnica
- Análisis de un framework o patrón encontrado en otro repo
Flujo de Auditoría (5 pasos)
Paso 1: Exploración de estructura
# Árbol de archivos
find . -maxdepth 2 -type f -o -type d | sort
# Conteo de archivos
find . -name "*.md" | wc -l
# Log reciente
git log --oneline -20
# Remote y branch
git remote -v
git branch -a
Objetivo: Entender la escala del proyecto, su historia reciente, y su superficie de código.
Paso 2: Lectura de archivos clave (prioridad)
Leer SIEMPRE estos archivos en orden:
- README → Qué es el proyecto, cómo funciona, badges, estructura
- Archivo de entrada principal (
AGENTS.md, README.md, index.html, main.py, etc.)
- Configuración del sistema (
config.yaml, _system-config.md, .env.example)
- Documentación de arquitectura (
ARCHITECTURE.md, docs/)
- Workflow/CI (
.github/workflows/)
- Índices de conocimiento (skills index, learnings index, clusters)
- Agentes/roles principales (los que definen el comportamiento central)
- Plantillas (templates que otros siguen)
- Estado actual (session state, TODOs pendientes, tareas sin cerrar)
Paso 3: Análisis de fortalezas
Evaluar cada dimensión con criterio (MÍNIMO 8 dimensiones):
| Dimensión |
Qué buscar |
| Arquitectura |
Separación de responsabilidades, patrones de diseño, capas |
| Memoria/conocimiento |
Cómo se almacena, filtra, recupera y deprecia el conocimiento |
| Orquestación |
Cómo se coordinan los componentes, flujos adaptativos |
| Calidad |
Revisión, criticado, validación, tests |
| Documentación |
README, arquitectura, templates, contribución |
| Portabilidad |
Rutas absolutas, dependencias de SO, configuración portable |
| UX/Comunicación |
Checkpoints, formatos de output, protocolos de delegación |
| Auto-mejora |
Aprendizaje acumulado, reaprendizaje, métricas |
| Tokens y costes |
Tracking de tokens, costes por sesión, optimización de contexto |
| Seguridad |
Secrets en repo, .gitignore correcto, credenciales hardcodeadas |
| Deploy/CI/CD |
Workflows funcionales, branches limpios, CI configurado |
| Integración móvil |
Telegram, accesibilidad desde móvil, canales de comunicación |
Regla: Nunca evaluar menos de 8 dimensiones. Las dimensiones de tokens/costes, seguridad y deploy son OBLIGATORIAS en auditorías de sistemas multi-agente.
Paso 4: Detección de problemas (categorías)
Clasificar cada problema encontrado en una de estas categorías:
| Categoría |
Severidad |
Ejemplos |
| 🔴 Crítico |
Rompe el sistema o la portabilidad |
Rutas absolutas hardcodeadas, estado corrupto, datos perdidos |
| 🟡 Importante |
Limita la utilidad o escalabilidad |
Sin métricas, mecanismo de auto-mejora sin usar, criterios subjetivos |
| 🟢 Menor |
Mejora la calidad pero no bloquea |
Branch naming, falta de CHANGELOG, CSS duplicado |
Paso 5: Propuestas de mejora priorizadas
Para cada problema, proponer una mejora concreta:
- Prioridad Alta → Afecta portabilidad, funcionalidad o escalabilidad
- Prioridad Media → Mejora la utilidad, mantenibilidad o coherencia
- Prioridad Baja → Buenas prácticas, consistencia, documentación
Patrones comunes que debes detectar
Patrones de arquitectura bien diseñados
- Dos capas (documental + ejecutable) sin duplicación
- Índice inteligente con carga bajo demanda
- Flujo adaptativo basado en complejidad
- Agente de mantenimiento autónomo (bibliotecario/archiver)
- Protocolos de comunicación estructurados
Patrones de arquitectura problemáticos
- Rutas absolutas hardcodeadas en config
- Mecanismos de auto-mejora sin datos que los alimenten
- Criterios subjetivos donde deberían ser objetivos
- Estado de sesión sin limpieza (tareas "pendientes" que nunca se archivan)
- CSS/estilos duplicados entre componentes
- Verificador de instalación que solo funciona en un SO
Patrones de memoria/conocimiento
- Índice con señales de relevancia + decay (bueno)
- Learnings individuales cargados siempre (malo — gasta tokens)
- Skills sin "ciclo de reaprendizaje" cuando el mecanismo existe
- Clusters dinámicos vs. estáticos
Patrones de criticado — activación objetiva
- Señal de alerta: El Critic se activa por "dudas" subjetivas del orchestrator
- Patrón correcto: 6 criterios objetivos: complejidad ≥4, ≥3 reintentos, ≥3 archivos, impacto alto, reviewer emite WARNINGs, solicitud humana explícita
- Señal de éxito: El orchestrator evalúa los criterios automáticamente sin preguntar
Formato de output
Presentar la auditoría en este formato:
# 🔍 Auditoría Completa — [Nombre del Sistema]
## 📊 Panorama General
| Dimensión | Estado |
|-----------|--------|
| ... | ... |
## ✅ Lo que está MUY BIEN
### 1. [Nombre del aspecto positivo]
[Explicación de POR QUÉ es bueno, no solo QUÉ es bueno]
## ⚠️ Problemas detectados
### 🔴 Críticos
[Problema] → [Por qué es crítico]
### 🟡 Importantes
[Problema] → [Por qué es importante]
### 🟢 Menores
[Problema] → [Por qué es menor]
## 💡 Mejoras que propondría
### Prioridad Alta
[A] [Mejora] → [Impacto esperado]
### Prioridad Media
[B] [Mejora] → [Impacto esperado]
### Prioridad Baja
[C] [Mejora] → [Impacto esperado]
## 📈 Veredicto global
**Puntuación: X/10**
[Resumen de 2-3 líneas con tu opinión honesta sobre el sistema]
Post-Audit Execution Pipeline
Cuando el usuario autoriza ejecutar las mejoras propuestas en la auditoría:
Paso 1: Priorizar por severidad
| Prioridad |
Categoría |
Acción |
| P0 |
🔴 Crítico |
Ejecutar inmediatamente (rompe funcionalidad) |
| P1 |
🟡 Importante |
Ejecutar en orden de impacto |
| P2 |
🟢 Menor |
Ejecutar al final o batch |
Paso 2: Plan de cambios
Antes de ejecutar, presentar plan concreto:
# Para cada problema P0:
- Archivo: path/al/archivo.xyz
- Cambio: descripción exacta del cambio
- Líneas: ~20 afectadas
- Riesgo: bajo/medio/alto
# Para P1-P2, agrupar por dominio (docs, infra, código)
Regla: NO ejecutar sin presentar plan y obtener ✅ del usuario en cambios >3 archivos.
Paso 3: Ejecución
- P0 individuales → directo (terminator, patch)
- P0 paralelos independientes →
delegate_task en paralelo
- P1-P2 relacionados → agrupar en un
delegate_task con todas las instrucciones
- Documentación → Mastermind directo (no requiere delegación)
- CI/Deploy → revisar primero, luego ejecutar
Paso 4: Verificación
Por cada grupo de cambios ejecutado:
git diff --stat para confirmar archivos tocados
- Esanear referencias residuales con
search_files
git commit con mensaje en castellano y descriptivo
git push
Paso 5: Medir delta
Al final de la ejecución:
- Pre-auditoría: 5.6/10
+ Post-ejecución: ~7.5/10
+ Delta: +1.9 puntos
Incluir el delta en el resumen final para que el usuario vea el progreso tangible.
Alternativa: Pipeline de Crons Secuenciales
Cuando el usuario no puede estar presente para supervisar la ejecución en vivo (o las mejoras son muchas y deben ejecutarse una por una):
- Crear crons
once escalonados (15-20 min de separación), cada uno autocontenido
- Cada cron hace UNA mejora concreta: lee archivos → ejecuta cambio → verifica → commit → resumen
- Todos con
deliver: origin para que el usuario vea el progreso en tiempo real
- Último cron = REVISIÓN FINAL: verifica checklist completo, y si algo falla → crea cron de reparación
- Independientes: si uno falla, el siguiente igual funciona (no hay dependencias entre ellos)
- Idempotentes: re-ejecutar uno no rompe nada
Formato del prompt de cada cron:
Eres Mastermind. TAREA: [descripción concreta]
PASOS:
1. [leer/verificar]
2. [ejecutar cambio]
3. [verificar cambio]
4. [commit + push]
RESUMEN: [qué cambió antes→después]
Patrón probado: 14 crons secuenciales para ejecutar mejoras de auditoría, divididos en dos fases:
- Fase 1 (8 crons): Infraestructura y limpieza — README real, Mastermind disclaimer, ChromaDB auto-start, ChromaDB re-index, SOUL.md integration, skill dedup, skill priority consolidation, crons pausados eliminados
- Fase 2 (6 crons): Inteligencia — memoria decay (Ebbinghaus), knowledge graph, skill lifecycle, delegation flows, dashboard HTML, revisión final
- Cada cron es autocontenido (lee → ejecuta → verifica → commit → resumen) e idempotente (re-ejecutar no rompe nada)
- El cron de revisión final verifica checklist completo y crea un cron de mantenimiento semanal que re-ejecuta todo los domingos
- Fase 2 depende de Fase 1 — los crons de inteligencia usan scripts/paths creados en Fase 1. Separar en fases evita que un fallo en infra destruya features de inteligencia
Post-Migration Cleanup Execution
Cuando una migración de plataforma/paradigma ya se completó (v3.1→v4.0, de Obsidian→GitHub, etc.), a menudo quedan referencias residuales en los archivos activos. El ejecutable de limpieza sigue este flujo:
Paso 1: Escaneo sistemático de referencias legacy
Usar search_files con los nombres de la plataforma antigua para encontrar TODAS las referencias en archivos activos (excluyendo legacy/ y .git/):
patterns = ['obsidian', 'opencode', 'ebbinghaus', 'wikilink', '[[', 'slash command']
for root, dirs, files in os.walk(base):
# excluir .git, legacy/, learning-platform/
for fname in files:
if fname.endswith(('.md', '.json', '.html', '.yml', '.sh', '.bat', '.js')):
# buscar cada patrón, reportar línea exacta
Paso 2: Clasificar cada referencia
| Tipo |
Acción |
Ejemplo |
| Contexto de migración (CHANGELOG, tablas comparativas) |
✅ Mantener |
"v3.1 usaba OpenCode + Obsidian" |
| Instrucciones activas (CONTRIBUTING, guías de inicio) |
🔄 Reescribir |
"Abrir como vault de Obsidian" |
| Landing page desactualizada |
🔄 Reescribir |
index.html con 11 agentes, Ebbinghaus |
| Scripts de verificación obsoletos |
🔄 Actualizar o 🗑️ eliminar |
verify-system.bat que chequea .opencode/ |
| Documentación en otro idioma desactualizada |
🔄 Simplificar o 🗑️ eliminar |
README_EN.md que v3.1 |
| READMEs y docs que comparan versiones |
✅ Mantener |
Las comparativas dan contexto |
Paso 3: Ejecutar cambios por archivo
Para cada archivo que necesita cambios:
- Landing page: Reescribir entera (cambia el mensaje, el branding, los KPIs)
- CONTRIBUTING: Reescribir entero (las instrucciones de instalación cambian completamente)
- CHANGELOG: Traducir/actualizar manteniendo el historial
- Scripts de sistema: Actualizar estructura de verificación al nuevo layout
- Workflows CI: Actualizar excludes de paths que ya no existen
Paso 4: Verificación final
Re-escanear para confirmar que no quedan referencias activas:
grep -rl "obsidian\|opencode\|ebbinghaus" --include="*.md" --include="*.html" . | grep -v legacy/ | grep -v .git/
Luego: git add -A && git commit con mensaje descriptivo + push.
Ver references/post-migration-cleanup.md para el caso real de limpieza del Mastermind v3.1→v4.0.
Adjunto: Auditoría de apps Node.js multi-usuario (Express + SQLite)
Cuando el proyecto auditado es una aplicación web Node.js con Express, SQLite (sql.js) y autenticación multiusuario, añadir estas dimensiones específicas al flujo de 5 pasos:
Dimensiones adicionales obligatorias
| Dimensión |
Qué buscar |
Patrón problema |
Referencia |
| Helpers SQL |
¿sql_run, sql_all, sql_get existen? ¿Se usan correctamente? |
sql_run() para SELECT → datos perdidos silenciosamente |
Patrón 1 |
| Aislamiento multi-tenant |
¿Los datos de cada usuario están aislados por usuario_id? |
getMeta('nombre') global en vez de usuarios.nombre |
Patrón 2 |
| Auth |
Token en header vs cookie. ¿Limpieza de sesiones expiradas? |
Token en URL (logs), sin cleanup periódico |
Patrón 3 |
| Onboarding |
¿Formulario fijo o conversacional? ¿Se adapta al usuario? |
Pasos fijos sin IA, sin personalidad de coach |
Patrón 4 |
| Persistencia de chat |
¿Mensajes de IA en servidor o solo localStorage? |
Chat perdido al cambiar navegador/dispositivo |
Patrón 5 |
Cómo leer la referencia
El archivo references/nodejs-multiuser-audit-patterns.md contiene 5 patrones detallados con:
- Síntoma (cómo lo detecta un usuario)
- Causa (qué código lo produce)
- Detección automática (comandos grep/curl)
- Verificación funcional (cómo confirmar el bug)
- Lección (cómo prevenirlo en el futuro)
Checklist rápido para auditoría Node.js multi-usuario
# 1. Verificar helpers SQL
grep -n "function sql_run\|function sql_all\|function sql_get" server.js
# 2. Buscar sql_run usado para SELECT (antipattern)
grep -n "sql_run.*SELECT" server.js
# 3. Buscar getMeta() en funciones perfilUsuario
grep -n "getMeta" server.js | grep -i "nombre\|perfil\|user"
# 4. Verificar auth: limpieza de sesiones
grep -n "DELETE FROM sesiones" server.js
# 5. Verificar si chat tiene persistencia en servidor
grep -n "chat\|mensaje\|conversacion" server.js
# 6. Verificar aislamiento multi-tenant en todas las queries
grep -n "usuario_id" server.js | head -20
# 7. Verificar onboarding
grep -n "onboarding\|onboard" server.js
Audit de Skills del Ecosistema
Cuando el usuario pide auditar el ecosistema de skills (detectar duplicados, project-readmes, CLI wrappers, skills sin tags), usar el patrón skill-audit-pattern como subsección:
Pasos
- Inventario: contar skills, verificar frontmatter (version, description, tags)
- Detectar project-readmes: skills con rutas absolutas de proyecto (>5 rutas = project-readme)
- Detectar CLI wrappers: skills con >3 comandos curl y <5KB
- Detectar duplicados: comparar nombres y descripciones entre agent/ y repo
- Detectar skills >30KB: deberían usar refs pattern
- Generar informe: resumen con hallazgos categorizados por severidad
Criterios de limpieza
- Eliminar: project-readmes, CLI wrappers, duplicados
- Fusionar: skills que cubren lo mismo
- Refactorizar: skills >30KB → usar refs pattern
Pitfalls
- Subagentes fallan silenciosamente en
terminal rm — siempre verificar post-ejecución
agent/skills ≠ /root/workspace/Mastermind/skills — siempre sync después
- No todos los project-readmes son malos — los que contienen patrones de diseño tienen valor educativo
Referencias
references/webapp-integration-testing.md — Patrón para testear APIs externas (ORS, Nominatim, GTFS) durante auditorías de web apps: validar keys, detectar datos simulados, verificar calidad de datasets cacheados.
references/multi-agent-patterns.md — Banco de conocimiento sobre patrones de sistemas multi-agente.
references/audit-cases.md — Casos reales de auditoría con hallazgos, métricas antes/después. Incluye caso Mastermind v3.1→v4.0.
references/migration-audit.md — Checklist de auditoría de migración.
references/post-migration-cleanup.md — Caso real: limpieza de Mastermind v3.1→v4.0, eliminando referencias residuales a Obsidian, OpenCode y Ebbinghaus de todos los archivos activos.
references/nodejs-multiuser-audit-patterns.md — 5 patrones de bugs en apps Node.js multi-usuario (Express + SQLite): sql_run vs sql_all, getMeta() global, auth por token, onboarding conversacional, persistencia de chat.
references/terran-architecture-audit.md — Caso TerrAn iter 116: patrón "fixed pero no aplicado al schema base". 9 issues activos en una fase con 36 fijados. Verificar que los fixes documentados en comentarios realmente modificaron el schema base, no solo que exista una sección de FIX.
references/rls-gap-detection.md — Caso TerrAn v25: 24 issues SEC por RLS enabled sin policy. Detección sistemática con regex + set difference. Fixes: org_id en 7 tablas, 14 policies nuevas, superadmin_bypass corregido, encriptación DNI/NSS.
Ejecución combinada Auditoría + Corrección
Cuando el usuario pide "auditoría + soluciona todo" (o similar), ejecutar el pipeline completo en una sola sesión:
- Auditar (pasos 1-5 del flujo de auditoría)
- Presentar el informe completo con hallazgos priorizados
- Crear plan de corrección como todo list con IDs
- Ejecutar correcciones en orden P0 → P1 → P2, mostrando progreso en tiempo real
- Verificar con el script de verificación del sistema
- Commit + push con mensaje descriptivo
- Medir delta de calidad pre/post
Regla: NO parar entre fases. Terminar un paso, empezar el siguiente inmediatamente. Si el usuario tiene que preguntar "¿por qué has parado?", algo va mal.
Técnica: reemplazo masivo con execute_code
Para limpieza post-auditoría que requiere reemplazar un patrón en múltiples archivos, usar execute_code con un bucle Python:
from hermes_tools import read_file, write_file
import os
base = "/path/to/repo"
for root, dirs, files in os.walk(base):
if '.git' in root or 'legacy/' in root:
continue
for fname in files:
fpath = os.path.join(root, fname)
try:
content = open(fpath).read()
if 'PATTERN' in content:
write_file(fpath, content.replace('PATTERN', 'REPLACEMENT'))
except (UnicodeDecodeError, PermissionError):
pass
Más eficiente que patch individual para 5+ archivos. Usar patch para ediciones quirúrgicas, execute_code para barrido masivo.
Pitfalls
No ser genérico — Cada auditoría debe referenciar archivos específicos, líneas concretas, patrones reales del código
No inventar problemas — Si algo funciona bien, decirlo. La credibilidad depende de la honestidad.
No solo listar — explicar POR QUÉ — "Tienes rutas absolutas" es menos útil que "La ruta C:\\Users\\d_ant\\ en _system-config.md rompe la portabilidad porque cualquier clon tendrá esa ruta hardcodeada"
No dar mejoras vagas — "Añadir tests" es vago. "Un script que simule un ciclo completo con un prompt de prueba y verifique que todos los agentes emiten output en el formato esperado" es accionable
No ignorar el contexto del usuario — Si es un proyecto propio, ser constructivo pero honesto. Si es un repo ajeno, ser objetivo y menos prescriptivo
Verificar auditorías previas contra estado actual — Si el repo ya tiene un audit-*.md, leerlo pero verificar cada hallazgo. Las auditorías previas pueden tener findings ya resueltos (ej: CDN cambió de @master a @latest entre auditorías). No copiar findings sin validar.
Detectar directorios completos stale, no solo referencias de texto — El Post-Migration Cleanup se centra en referencias de texto, pero a menudo hay directorios ENTEROS de código v3.1 que nunca se movieron a legacy/. Escanear la estructura de directorios buscando código que referencia la plataforma antigua completa (no solo menciones sueltas).
No parar en "bueno suficiente" — Si la puntuación es 7/10, presentar los items P2/P3 restantes y ofrecer ejecutarlos. El usuario decide cuándo parar, no el agente. Si presentas 7/10 como "hecho", el usuario frustrado pregunta "¿por qué no luchas por más?".
Un tema = una fuente — Si SOUL.md, AGENTS.md y README.md repiten los mismos niveles de ejecución, human loop o arquitectura, es deuda técnica. Cada pieza de información debe vivir en UN solo archivo con cross-references. Detectar esto como hallazgo "🟡 Importante: documentación duplicada".
Verify debe ser funcional, no solo existencia — check_file "SOUL.md" solo verifica que existe. Añadir check_content "SOUL.md" "Mastermind" verifica que contiene lo esperado. Un verify de 27 checks (existencia + contenido + consistencia + JSON válido) es más valioso que uno de 11 checks de existencia.
set -uo pipefail, NO set -euo pipefail en scripts de test — El flag -e causa que el script se cuelgue cuando grep no encuentra un patrón (exit code 1). Los scripts de verificación y test SIEMPRE usan set -uo pipefail para que los fallos se reporten sin abortar el script. Ejemplo real: un grep de secrets que no encuentra nada retorna exit 1, y con -e el script muere silenciosamente antes de llegar al resumen.
Detección de secrets: patrones específicos, no genéricos — grep "token\|password\|secret" produce falsos positivos con código legítimo (token-tracking, input_tokens, href="tokens/"). Usar patrones de formatos reales: sk-[a-zA-Z0-9]{20,} (API keys), ghp_[a-zA-Z0-9]{36,} (GitHub tokens), AKIA[A-Z0-9]{16,} (AWS keys). Separar en greps individuales y sumar, no usar OR en un solo grep (causa problemas con wc -l).
Sobreingeniería: detectar y cortar — El usuario corregirá explícitamente si el agente tiende a sobreingenierizar ("ten cuidado con la sobreingeniería que te gusta mucho"). Señales: arquitectura documentada que no se implementa, N agentes cuando M bastan, fórmulas complejas sin código, features descritas como "activas" cuando son diseños conceptuales. Regla: En cada auditoría, preguntar activamente "¿esto es funcional o es documentación aspiracional?" y marcar explícitamente la diferencia. Preferir simplificar sobre extender.
Deployment ≠ Integración — Que un componente esté desplegado y funcional técnicamente no significa que esté integrado en el flujo de trabajo. Ejemplo clásico: ChromaDB corriendo con 190 skills indexados pero Mastermind nunca lo consulta. En auditorías, verificar SIEMPRE que cada componente tiene un trigger real que lo invoca, no solo que existe. Añadir una dimensión de auditoría: "¿Se usa de verdad?"
FIXED pero NO aplicado al schema base — Cuando un documento de arquitectura tiene secciones de "FIX" documentadas (comentarios, secciones al final), verificar que el schema base (CREATE TABLEs principales) fue realmente modificado. Es muy común que las soluciones se documenten en comentarios pero el schema original se quede sin cambios. Esto produce:
- RLS policies que referencian funciones/columnas inexistentes → RLS roto en runtime
- CHECK constraints que deberían eliminarse pero siguen en el schema → bloquean personalización
- Dos documentos inconsistentes (ARQUITECTURA.md tiene el fix, RENDIMIENTO-Y-NEGOCIO.md no) → si se implementa con el segundo, se crea un sistema roto
- Verificación obligatoria: Para cada issue marcado como "fixed", leer la definición original de la tabla/columna y verificar que fue modificada, no solo que existe una sección de FIX en otro lugar del mismo documento.
- Ver
references/terran-architecture-audit.md para el caso real de auditoría TerrAn (iter 116).
RLS enabled ≠ RLS policy existe — Patrón crítico detectado en TerrAn/GeoAsset (24 issues SEC): tener ALTER TABLE x ENABLE ROW LEVEL SECURITY NO significa que exista una CREATE POLICY para esa tabla. Una tabla con RLS enabled pero sin policy deniega TODAS las operaciones (incluyendo SELECT) porque la política por defecto es DENY. Detección sistemática:
- Buscar
ALTER TABLE \w+ ENABLE ROW LEVEL SECURITY → lista de tablas con RLS activado
- Buscar
CREATE POLICY \w+ ON \w+ → lista de tablas con policy
- Diferencia = tablas rotas (RLS enabled sin policy = sistema bloqueado)
- También verificar que cada tabla con org_id tiene policy, aunque RLS no esté explícitamente enabled (algunas tablas nuevas pueden no tener ALTER TABLE pero sí necesitan policy)
- Verificar que las policies referencian columnas que realmente existen (ej:
usuarios con policy que usa org_id pero la tabla no tiene columna org_id)
- Ver
references/rls-gap-detection.md para el caso real de 24 issues SEC en TerrAn v25.
audit-state.json como fuente de verdad de issues — Algunos proyectos (TerrAn/GeoAsset) usan un JSON estructurado (audit-state.json) en vez de markdown para trackear issues de auditoría. Formato: fases → issues_found con id, title, severity, description, status (fixed/unknown), fixed_in, fixed_note. Al ejecutar fixes:
- Leer JSON, filtrar issues por fase y status != 'fixed'
- Agrupar por categoría (RLS, org_id, encryption, etc.)
- Ejecutar fixes en execute_code con patch/write_file directo
- Actualizar todos los issues a status='fixed' con fixed_note descriptivo
- Incrementar iteration y actualizar last_run
- Contar active/fixed para reporte final
- Los fixes se hacen directo con execute_code (patch/write_file), NUNCA subagentes — los archivos son grandes (>100KB) y los subagentes timeout.
1---2name: system-audit3description: Procedimiento sistemático para auditar repositorios de sistemas de software — analizar arquitectura, identificar fortalezas, detectar problemas y proponer mejoras con criterios objetivos.4---56# System Audit — Auditoría Sistemática de Repositorios78## Resumen910Procedimiento para auditar un repositorio o sistema de software completo: explorar la estructura, leer archivos clave, identificar fortalezas y debilidades, y proponer mejoras priorizadas.1112## Cuándo usar1314- Usuario pide "auditoría", "review", "qué te parece", "qué mejorarías" de un repositorio o sistema15- Evaluación de calidad antes de integrar un sistema nuevo16- Revisión de un proyecto propio para detectar deuda técnica17- Análisis de un framework o patrón encontrado en otro repo1819## Flujo de Auditoría (5 pasos)2021### Paso 1: Exploración de estructura2223```bash24# Árbol de archivos25find . -maxdepth 2 -type f -o -type d | sort26# Conteo de archivos27find . -name "*.md" | wc -l28# Log reciente29git log --oneline -2030# Remote y branch31git remote -v32git branch -a33```3435**Objetivo:** Entender la escala del proyecto, su historia reciente, y su superficie de código.3637### Paso 2: Lectura de archivos clave (prioridad)3839Leer SIEMPRE estos archivos en orden:40411. **README** → Qué es el proyecto, cómo funciona, badges, estructura422. **Archivo de entrada principal** (`AGENTS.md`, `README.md`, `index.html`, `main.py`, etc.)433. **Configuración del sistema** (`config.yaml`, `_system-config.md`, `.env.example`)444. **Documentación de arquitectura** (`ARCHITECTURE.md`, `docs/`)455. **Workflow/CI** (`.github/workflows/`)466. **Índices de conocimiento** (skills index, learnings index, clusters)477. **Agentes/roles principales** (los que definen el comportamiento central)488. **Plantillas** (templates que otros siguen)499. **Estado actual** (session state, TODOs pendientes, tareas sin cerrar)5051### Paso 3: Análisis de fortalezas5253Evaluar cada dimensión con criterio (MÍNIMO 8 dimensiones):5455| Dimensión | Qué buscar |56|-----------|-----------|57| **Arquitectura** | Separación de responsabilidades, patrones de diseño, capas |58| **Memoria/conocimiento** | Cómo se almacena, filtra, recupera y deprecia el conocimiento |59| **Orquestación** | Cómo se coordinan los componentes, flujos adaptativos |60| **Calidad** | Revisión, criticado, validación, tests |61| **Documentación** | README, arquitectura, templates, contribución |62| **Portabilidad** | Rutas absolutas, dependencias de SO, configuración portable |63| **UX/Comunicación** | Checkpoints, formatos de output, protocolos de delegación |64| **Auto-mejora** | Aprendizaje acumulado, reaprendizaje, métricas |65| **Tokens y costes** | Tracking de tokens, costes por sesión, optimización de contexto |66| **Seguridad** | Secrets en repo, .gitignore correcto, credenciales hardcodeadas |67| **Deploy/CI/CD** | Workflows funcionales, branches limpios, CI configurado |68| **Integración móvil** | Telegram, accesibilidad desde móvil, canales de comunicación |6970**Regla:** Nunca evaluar menos de 8 dimensiones. Las dimensiones de tokens/costes, seguridad y deploy son OBLIGATORIAS en auditorías de sistemas multi-agente.7172### Paso 4: Detección de problemas (categorías)7374Clasificar cada problema encontrado en una de estas categorías:7576| Categoría | Severidad | Ejemplos |77|-----------|-----------|----------|78| **🔴 Crítico** | Rompe el sistema o la portabilidad | Rutas absolutas hardcodeadas, estado corrupto, datos perdidos |79| **🟡 Importante** | Limita la utilidad o escalabilidad | Sin métricas, mecanismo de auto-mejora sin usar, criterios subjetivos |80| **🟢 Menor** | Mejora la calidad pero no bloquea | Branch naming, falta de CHANGELOG, CSS duplicado |8182### Paso 5: Propuestas de mejora priorizadas8384Para cada problema, proponer una mejora concreta:8586- **Prioridad Alta** → Afecta portabilidad, funcionalidad o escalabilidad87- **Prioridad Media** → Mejora la utilidad, mantenibilidad o coherencia88- **Prioridad Baja** → Buenas prácticas, consistencia, documentación8990## Patrones comunes que debes detectar9192### Patrones de arquitectura bien diseñados93- Dos capas (documental + ejecutable) sin duplicación94- Índice inteligente con carga bajo demanda95- Flujo adaptativo basado en complejidad96- Agente de mantenimiento autónomo (bibliotecario/archiver)97- Protocolos de comunicación estructurados9899### Patrones de arquitectura problemáticos100- Rutas absolutas hardcodeadas en config101- Mecanismos de auto-mejora sin datos que los alimenten102- Criterios subjetivos donde deberían ser objetivos103- Estado de sesión sin limpieza (tareas "pendientes" que nunca se archivan)104- CSS/estilos duplicados entre componentes105- Verificador de instalación que solo funciona en un SO106107### Patrones de memoria/conocimiento108- Índice con señales de relevancia + decay (bueno)109- Learnings individuales cargados siempre (malo — gasta tokens)110- Skills sin "ciclo de reaprendizaje" cuando el mecanismo existe111- Clusters dinámicos vs. estáticos112113### Patrones de criticado — activación objetiva114- **Señal de alerta:** El Critic se activa por "dudas" subjetivas del orchestrator115- **Patrón correcto:** 6 criterios objetivos: complejidad ≥4, ≥3 reintentos, ≥3 archivos, impacto alto, reviewer emite WARNINGs, solicitud humana explícita116- **Señal de éxito:** El orchestrator evalúa los criterios automáticamente sin preguntar117118## Formato de output119120Presentar la auditoría en este formato:121122```123# 🔍 Auditoría Completa — [Nombre del Sistema]124125## 📊 Panorama General126| Dimensión | Estado |127|-----------|--------|128| ... | ... |129130## ✅ Lo que está MUY BIEN131### 1. [Nombre del aspecto positivo]132[Explicación de POR QUÉ es bueno, no solo QUÉ es bueno]133134## ⚠️ Problemas detectados135### 🔴 Críticos136[Problema] → [Por qué es crítico]137138### 🟡 Importantes139[Problema] → [Por qué es importante]140141### 🟢 Menores142[Problema] → [Por qué es menor]143144## 💡 Mejoras que propondría145### Prioridad Alta146[A] [Mejora] → [Impacto esperado]147148### Prioridad Media149[B] [Mejora] → [Impacto esperado]150151### Prioridad Baja152[C] [Mejora] → [Impacto esperado]153154## 📈 Veredicto global155**Puntuación: X/10**156157[Resumen de 2-3 líneas con tu opinión honesta sobre el sistema]158```159160## Post-Audit Execution Pipeline161162Cuando el usuario autoriza ejecutar las mejoras propuestas en la auditoría:163164### Paso 1: Priorizar por severidad165166| Prioridad | Categoría | Acción |167|-----------|-----------|--------|168| **P0** | 🔴 Crítico | Ejecutar inmediatamente (rompe funcionalidad) |169| **P1** | 🟡 Importante | Ejecutar en orden de impacto |170| **P2** | 🟢 Menor | Ejecutar al final o batch |171172### Paso 2: Plan de cambios173174Antes de ejecutar, presentar plan concreto:175```python176# Para cada problema P0:177- Archivo: path/al/archivo.xyz178- Cambio: descripción exacta del cambio179- Líneas: ~20 afectadas180- Riesgo: bajo/medio/alto181182# Para P1-P2, agrupar por dominio (docs, infra, código)183```184185**Regla:** NO ejecutar sin presentar plan y obtener ✅ del usuario en cambios >3 archivos.186187### Paso 3: Ejecución188189- **P0 individuales** → directo (terminator, patch)190- **P0 paralelos independientes** → `delegate_task` en paralelo191- **P1-P2 relacionados** → agrupar en un `delegate_task` con todas las instrucciones192- **Documentación** → Mastermind directo (no requiere delegación)193- **CI/Deploy** → revisar primero, luego ejecutar194195### Paso 4: Verificación196197Por cada grupo de cambios ejecutado:1981. `git diff --stat` para confirmar archivos tocados1992. Esanear referencias residuales con `search_files`2003. `git commit` con mensaje en castellano y descriptivo2014. `git push`202203### Paso 5: Medir delta204205Al final de la ejecución:206```diff207- Pre-auditoría: 5.6/10208+ Post-ejecución: ~7.5/10209+ Delta: +1.9 puntos210```211212Incluir el delta en el resumen final para que el usuario vea el progreso tangible.213214### Alternativa: Pipeline de Crons Secuenciales215216Cuando el usuario no puede estar presente para supervisar la ejecución en vivo (o las mejoras son muchas y deben ejecutarse una por una):2172181. **Crear crons `once` escalonados** (15-20 min de separación), cada uno autocontenido2192. **Cada cron hace UNA mejora concreta**: lee archivos → ejecuta cambio → verifica → commit → resumen2203. **Todos con `deliver: origin`** para que el usuario vea el progreso en tiempo real2214. **Último cron = REVISIÓN FINAL**: verifica checklist completo, y si algo falla → crea cron de reparación2225. **Independientes**: si uno falla, el siguiente igual funciona (no hay dependencias entre ellos)2236. **Idempotentes**: re-ejecutar uno no rompe nada224225**Formato del prompt de cada cron:**226```227Eres Mastermind. TAREA: [descripción concreta]228PASOS:2291. [leer/verificar]2302. [ejecutar cambio]2313. [verificar cambio]2324. [commit + push]233RESUMEN: [qué cambió antes→después]234```235236**Patrón probado:** 14 crons secuenciales para ejecutar mejoras de auditoría, divididos en dos fases:237- **Fase 1 (8 crons):** Infraestructura y limpieza — README real, Mastermind disclaimer, ChromaDB auto-start, ChromaDB re-index, SOUL.md integration, skill dedup, skill priority consolidation, crons pausados eliminados238- **Fase 2 (6 crons):** Inteligencia — memoria decay (Ebbinghaus), knowledge graph, skill lifecycle, delegation flows, dashboard HTML, revisión final239- **Cada cron es autocontenido** (lee → ejecuta → verifica → commit → resumen) e **idempotente** (re-ejecutar no rompe nada)240- **El cron de revisión final** verifica checklist completo y crea un **cron de mantenimiento semanal** que re-ejecuta todo los domingos241- **Fase 2 depende de Fase 1** — los crons de inteligencia usan scripts/paths creados en Fase 1. Separar en fases evita que un fallo en infra destruya features de inteligencia242243## Post-Migration Cleanup Execution244245Cuando una migración de plataforma/paradigma ya se completó (v3.1→v4.0, de Obsidian→GitHub, etc.), a menudo quedan **referencias residuales** en los archivos activos. El ejecutable de limpieza sigue este flujo:246247### Paso 1: Escaneo sistemático de referencias legacy248249Usar `search_files` con los nombres de la plataforma antigua para encontrar TODAS las referencias en archivos activos (excluyendo `legacy/` y `.git/`):250251```python252patterns = ['obsidian', 'opencode', 'ebbinghaus', 'wikilink', '[[', 'slash command']253for root, dirs, files in os.walk(base):254 # excluir .git, legacy/, learning-platform/255 for fname in files:256 if fname.endswith(('.md', '.json', '.html', '.yml', '.sh', '.bat', '.js')):257 # buscar cada patrón, reportar línea exacta258```259260### Paso 2: Clasificar cada referencia261262| Tipo | Acción | Ejemplo |263|------|--------|---------|264| **Contexto de migración** (CHANGELOG, tablas comparativas) | ✅ Mantener | "v3.1 usaba OpenCode + Obsidian" |265| **Instrucciones activas** (CONTRIBUTING, guías de inicio) | 🔄 Reescribir | "Abrir como vault de Obsidian" |266| **Landing page desactualizada** | 🔄 Reescribir | index.html con 11 agentes, Ebbinghaus |267| **Scripts de verificación obsoletos** | 🔄 Actualizar o 🗑️ eliminar | verify-system.bat que chequea .opencode/ |268| **Documentación en otro idioma desactualizada** | 🔄 Simplificar o 🗑️ eliminar | README_EN.md que v3.1 |269| **READMEs y docs que comparan versiones** | ✅ Mantener | Las comparativas dan contexto |270271### Paso 3: Ejecutar cambios por archivo272273Para cada archivo que necesita cambios:274- **Landing page**: Reescribir entera (cambia el mensaje, el branding, los KPIs)275- **CONTRIBUTING**: Reescribir entero (las instrucciones de instalación cambian completamente)276- **CHANGELOG**: Traducir/actualizar manteniendo el historial277- **Scripts de sistema**: Actualizar estructura de verificación al nuevo layout278- **Workflows CI**: Actualizar excludes de paths que ya no existen279280### Paso 4: Verificación final281282Re-escanear para confirmar que no quedan referencias activas:283```bash284grep -rl "obsidian\|opencode\|ebbinghaus" --include="*.md" --include="*.html" . | grep -v legacy/ | grep -v .git/285```286287Luego: `git add -A && git commit` con mensaje descriptivo + push.288289Ver `references/post-migration-cleanup.md` para el caso real de limpieza del Mastermind v3.1→v4.0.290291## Adjunto: Auditoría de apps Node.js multi-usuario (Express + SQLite)292293Cuando el proyecto auditado es una **aplicación web Node.js con Express, SQLite (sql.js) y autenticación multiusuario**, añadir estas dimensiones específicas al flujo de 5 pasos:294295### Dimensiones adicionales obligatorias296297| Dimensión | Qué buscar | Patrón problema | Referencia |298|-----------|-----------|-----------------|------------|299| **Helpers SQL** | ¿`sql_run`, `sql_all`, `sql_get` existen? ¿Se usan correctamente? | `sql_run()` para SELECT → datos perdidos silenciosamente | Patrón 1 |300| **Aislamiento multi-tenant** | ¿Los datos de cada usuario están aislados por `usuario_id`? | `getMeta('nombre')` global en vez de `usuarios.nombre` | Patrón 2 |301| **Auth** | Token en header vs cookie. ¿Limpieza de sesiones expiradas? | Token en URL (logs), sin cleanup periódico | Patrón 3 |302| **Onboarding** | ¿Formulario fijo o conversacional? ¿Se adapta al usuario? | Pasos fijos sin IA, sin personalidad de coach | Patrón 4 |303| **Persistencia de chat** | ¿Mensajes de IA en servidor o solo localStorage? | Chat perdido al cambiar navegador/dispositivo | Patrón 5 |304305### Cómo leer la referencia306307El archivo `references/nodejs-multiuser-audit-patterns.md` contiene 5 patrones detallados con:308- Síntoma (cómo lo detecta un usuario)309- Causa (qué código lo produce)310- Detección automática (comandos grep/curl)311- Verificación funcional (cómo confirmar el bug)312- Lección (cómo prevenirlo en el futuro)313314### Checklist rápido para auditoría Node.js multi-usuario315316```bash317# 1. Verificar helpers SQL318grep -n "function sql_run\|function sql_all\|function sql_get" server.js319320# 2. Buscar sql_run usado para SELECT (antipattern)321grep -n "sql_run.*SELECT" server.js322323# 3. Buscar getMeta() en funciones perfilUsuario324grep -n "getMeta" server.js | grep -i "nombre\|perfil\|user"325326# 4. Verificar auth: limpieza de sesiones327grep -n "DELETE FROM sesiones" server.js328329# 5. Verificar si chat tiene persistencia en servidor330grep -n "chat\|mensaje\|conversacion" server.js331332# 6. Verificar aislamiento multi-tenant en todas las queries333grep -n "usuario_id" server.js | head -20334335# 7. Verificar onboarding336grep -n "onboarding\|onboard" server.js337```338339## Audit de Skills del Ecosistema340341Cuando el usuario pide auditar el ecosistema de skills (detectar duplicados, project-readmes, CLI wrappers, skills sin tags), usar el patrón `skill-audit-pattern` como subsección:342343### Pasos3441. **Inventario**: contar skills, verificar frontmatter (version, description, tags)3452. **Detectar project-readmes**: skills con rutas absolutas de proyecto (>5 rutas = project-readme)3463. **Detectar CLI wrappers**: skills con >3 comandos curl y <5KB3474. **Detectar duplicados**: comparar nombres y descripciones entre agent/ y repo3485. **Detectar skills >30KB**: deberían usar refs pattern3496. **Generar informe**: resumen con hallazgos categorizados por severidad350351### Criterios de limpieza352- **Eliminar**: project-readmes, CLI wrappers, duplicados353- **Fusionar**: skills que cubren lo mismo354- **Refactorizar**: skills >30KB → usar refs pattern355356### Pitfalls357- Subagentes fallan silenciosamente en `terminal rm` — siempre verificar post-ejecución358- `agent/skills` ≠ `/root/workspace/Mastermind/skills` — siempre sync después359- No todos los project-readmes son malos — los que contienen patrones de diseño tienen valor educativo360361## Referencias362363- **`references/webapp-integration-testing.md`** — Patrón para testear APIs externas (ORS, Nominatim, GTFS) durante auditorías de web apps: validar keys, detectar datos simulados, verificar calidad de datasets cacheados.364- **`references/multi-agent-patterns.md`** — Banco de conocimiento sobre patrones de sistemas multi-agente.365- **`references/audit-cases.md`** — Casos reales de auditoría con hallazgos, métricas antes/después. Incluye caso Mastermind v3.1→v4.0.366- **`references/migration-audit.md`** — Checklist de auditoría de migración.367- **`references/post-migration-cleanup.md`** — Caso real: limpieza de Mastermind v3.1→v4.0, eliminando referencias residuales a Obsidian, OpenCode y Ebbinghaus de todos los archivos activos.368- **`references/nodejs-multiuser-audit-patterns.md`** — 5 patrones de bugs en apps Node.js multi-usuario (Express + SQLite): `sql_run` vs `sql_all`, `getMeta()` global, auth por token, onboarding conversacional, persistencia de chat.369- **`references/terran-architecture-audit.md`** — Caso TerrAn iter 116: patrón "fixed pero no aplicado al schema base". 9 issues activos en una fase con 36 fijados. Verificar que los fixes documentados en comentarios realmente modificaron el schema base, no solo que exista una sección de FIX.370- **`references/rls-gap-detection.md`** — Caso TerrAn v25: 24 issues SEC por RLS enabled sin policy. Detección sistemática con regex + set difference. Fixes: org_id en 7 tablas, 14 policies nuevas, superadmin_bypass corregido, encriptación DNI/NSS.371372## Ejecución combinada Auditoría + Corrección373374Cuando el usuario pide "auditoría + soluciona todo" (o similar), ejecutar el pipeline completo en una sola sesión:3753761. **Auditar** (pasos 1-5 del flujo de auditoría)3772. **Presentar** el informe completo con hallazgos priorizados3783. **Crear plan de corrección** como todo list con IDs3794. **Ejecutar correcciones** en orden P0 → P1 → P2, mostrando progreso en tiempo real3805. **Verificar** con el script de verificación del sistema3816. **Commit + push** con mensaje descriptivo3827. **Medir delta** de calidad pre/post383384**Regla:** NO parar entre fases. Terminar un paso, empezar el siguiente inmediatamente. Si el usuario tiene que preguntar "¿por qué has parado?", algo va mal.385386### Técnica: reemplazo masivo con execute_code387388Para limpieza post-auditoría que requiere reemplazar un patrón en múltiples archivos, usar `execute_code` con un bucle Python:389390```python391from hermes_tools import read_file, write_file392import os393394base = "/path/to/repo"395for root, dirs, files in os.walk(base):396 if '.git' in root or 'legacy/' in root:397 continue398 for fname in files:399 fpath = os.path.join(root, fname)400 try:401 content = open(fpath).read()402 if 'PATTERN' in content:403 write_file(fpath, content.replace('PATTERN', 'REPLACEMENT'))404 except (UnicodeDecodeError, PermissionError):405 pass406```407408Más eficiente que `patch` individual para 5+ archivos. Usar `patch` para ediciones quirúrgicas, `execute_code` para barrido masivo.409410## Pitfalls411412- **No ser genérico** — Cada auditoría debe referenciar archivos específicos, líneas concretas, patrones reales del código413- **No inventar problemas** — Si algo funciona bien, decirlo. La credibilidad depende de la honestidad.414- **No solo listar — explicar POR QUÉ** — "Tienes rutas absolutas" es menos útil que "La ruta `C:\\Users\\d_ant\\` en `_system-config.md` rompe la portabilidad porque cualquier clon tendrá esa ruta hardcodeada"415- **No dar mejoras vagas** — "Añadir tests" es vago. "Un script que simule un ciclo completo con un prompt de prueba y verifique que todos los agentes emiten output en el formato esperado" es accionable416- **No ignorar el contexto del usuario** — Si es un proyecto propio, ser constructivo pero honesto. Si es un repo ajeno, ser objetivo y menos prescriptivo417- **Verificar auditorías previas contra estado actual** — Si el repo ya tiene un `audit-*.md`, leerlo pero verificar cada hallazgo. Las auditorías previas pueden tener findings ya resueltos (ej: CDN cambió de `@master` a `@latest` entre auditorías). No copiar findings sin validar.418- **Detectar directorios completos stale, no solo referencias de texto** — El Post-Migration Cleanup se centra en referencias de texto, pero a menudo hay directorios ENTEROS de código v3.1 que nunca se movieron a `legacy/`. Escanear la estructura de directorios buscando código que referencia la plataforma antigua completa (no solo menciones sueltas).419- **No parar en "bueno suficiente"** — Si la puntuación es 7/10, presentar los items P2/P3 restantes y ofrecer ejecutarlos. El usuario decide cuándo parar, no el agente. Si presentas 7/10 como "hecho", el usuario frustrado pregunta "¿por qué no luchas por más?".420- **Un tema = una fuente** — Si SOUL.md, AGENTS.md y README.md repiten los mismos niveles de ejecución, human loop o arquitectura, es deuda técnica. Cada pieza de información debe vivir en UN solo archivo con cross-references. Detectar esto como hallazgo "🟡 Importante: documentación duplicada".421- **Verify debe ser funcional, no solo existencia** — `check_file "SOUL.md"` solo verifica que existe. Añadir `check_content "SOUL.md" "Mastermind"` verifica que contiene lo esperado. Un verify de 27 checks (existencia + contenido + consistencia + JSON válido) es más valioso que uno de 11 checks de existencia.422- **`set -uo pipefail`, NO `set -euo pipefail` en scripts de test** — El flag `-e` causa que el script se cuelgue cuando `grep` no encuentra un patrón (exit code 1). Los scripts de verificación y test SIEMPRE usan `set -uo pipefail` para que los fallos se reporten sin abortar el script. Ejemplo real: un grep de secrets que no encuentra nada retorna exit 1, y con `-e` el script muere silenciosamente antes de llegar al resumen.423- **Detección de secrets: patrones específicos, no genéricos** — `grep "token\|password\|secret"` produce falsos positivos con código legítimo (`token-tracking`, `input_tokens`, `href="tokens/"`). Usar patrones de formatos reales: `sk-[a-zA-Z0-9]{20,}` (API keys), `ghp_[a-zA-Z0-9]{36,}` (GitHub tokens), `AKIA[A-Z0-9]{16,}` (AWS keys). Separar en greps individuales y sumar, no usar OR en un solo grep (causa problemas con `wc -l`).424- **Sobreingeniería: detectar y cortar** — El usuario corregirá explícitamente si el agente tiende a sobreingenierizar ("ten cuidado con la sobreingeniería que te gusta mucho"). Señales: arquitectura documentada que no se implementa, N agentes cuando M bastan, fórmulas complejas sin código, features descritas como "activas" cuando son diseños conceptuales. **Regla:** En cada auditoría, preguntar activamente "¿esto es funcional o es documentación aspiracional?" y marcar explícitamente la diferencia. Preferir simplificar sobre extender.425- **Deployment ≠ Integración** — Que un componente esté desplegado y funcional técnicamente no significa que esté integrado en el flujo de trabajo. Ejemplo clásico: ChromaDB corriendo con 190 skills indexados pero Mastermind nunca lo consulta. En auditorías, verificar SIEMPRE que cada componente tiene un trigger real que lo invoca, no solo que existe. Añadir una dimensión de auditoría: "¿Se usa de verdad?"426427- **FIXED pero NO aplicado al schema base** — Cuando un documento de arquitectura tiene secciones de "FIX" documentadas (comentarios, secciones al final), verificar que el schema base (CREATE TABLEs principales) fue realmente modificado. Es muy común que las soluciones se documenten en comentarios pero el schema original se quede sin cambios. Esto produce:428 - RLS policies que referencian funciones/columnas inexistentes → RLS roto en runtime429 - CHECK constraints que deberían eliminarse pero siguen en el schema → bloquean personalización430 - Dos documentos inconsistentes (ARQUITECTURA.md tiene el fix, RENDIMIENTO-Y-NEGOCIO.md no) → si se implementa con el segundo, se crea un sistema roto431 - **Verificación obligatoria:** Para cada issue marcado como "fixed", leer la definición original de la tabla/columna y verificar que fue modificada, no solo que existe una sección de FIX en otro lugar del mismo documento.432 - Ver `references/terran-architecture-audit.md` para el caso real de auditoría TerrAn (iter 116).433434- **RLS enabled ≠ RLS policy existe** — Patrón crítico detectado en TerrAn/GeoAsset (24 issues SEC): tener `ALTER TABLE x ENABLE ROW LEVEL SECURITY` NO significa que exista una `CREATE POLICY` para esa tabla. Una tabla con RLS enabled pero sin policy **deniega TODAS las operaciones** (incluyendo SELECT) porque la política por defecto es DENY. Detección sistemática:435 1. Buscar `ALTER TABLE \w+ ENABLE ROW LEVEL SECURITY` → lista de tablas con RLS activado436 2. Buscar `CREATE POLICY \w+ ON \w+` → lista de tablas con policy437 3. Diferencia = tablas rotas (RLS enabled sin policy = sistema bloqueado)438 4. También verificar que cada tabla con org_id tiene policy, aunque RLS no esté explícitamente enabled (algunas tablas nuevas pueden no tener ALTER TABLE pero sí necesitan policy)439 5. Verificar que las policies referencian columnas que realmente existen (ej: `usuarios` con policy que usa `org_id` pero la tabla no tiene columna `org_id`)440 - Ver `references/rls-gap-detection.md` para el caso real de 24 issues SEC en TerrAn v25.441442- **audit-state.json como fuente de verdad de issues** — Algunos proyectos (TerrAn/GeoAsset) usan un JSON estructurado (`audit-state.json`) en vez de markdown para trackear issues de auditoría. Formato: fases → issues_found con id, title, severity, description, status (fixed/unknown), fixed_in, fixed_note. Al ejecutar fixes:443 1. Leer JSON, filtrar issues por fase y status != 'fixed'444 2. Agrupar por categoría (RLS, org_id, encryption, etc.)445 3. Ejecutar fixes en execute_code con patch/write_file directo446 4. Actualizar todos los issues a status='fixed' con fixed_note descriptivo447 5. Incrementar iteration y actualizar last_run448 6. Contar active/fixed para reporte final449 - Los fixes se hacen directo con execute_code (patch/write_file), NUNCA subagentes — los archivos son grandes (>100KB) y los subagentes timeout.