🔒 Spec Técnica · Tarea 46A · Dataset Demo Ejecutable  ·  NDA OBLIGATORIO
← hub modelos
Spec ejecutable · entregable a dev junior · v1.0 · 2026-05-30

Spec · Dataset Demo Ejecutable

Especificación completa para construir el primer artefacto que demuestre FARO Connect corriendo end-to-end. Un dev junior con TS + PostgreSQL + Docker debería poder ejecutar esta spec en 20-30 horas y producir el entregable que cierra la brecha "pack documental → demo ejecutable".

~25 h
Esfuerzo dev
12
Archivos entregables
6 m
Datos sintéticos
5 min
De clone a demo viva
⚡ TL;DR · 30 segundos

Qué construir: paquete ejecutable que demuestre FARO Connect corriendo end-to-end con datos sintéticos de 6 meses, detectando las 30 tensiones MVP, en menos de 5 minutos desde git clone.  ·  Para qué: poder decirle a un CTO/inversor "esto NO es maqueta — está corriendo ahora en mi laptop".  ·  Esfuerzo: 25 horas dev (rango 20-35h) · TS + PostgreSQL + Docker.  ·  Entrega: repo Git + Loom de 5 min + 8/8 criterios verde en ./demo-check.sh.  ·  Bloqueante para: pasar el pack de "documental" a "ejecutable" — único entregable que cierra ese gap.

1Objetivo

Producir un paquete ejecutable que cualquiera con Docker + Git pueda levantar en 5 minutos y ver FARO Connect funcionando con datos realistas de una empresa demo durante 6 meses, generando KPIs, detectando las 30 tensiones MVP, asignando acciones y mostrando el FARO Score evolucionar.

🎯 La frase a poder decir

"Mirá: cloné el repo, corrí ./demo-up.sh, esperé 3 minutos, y ahora estás viendo FARO procesando datos reales, detectando estas 30 tensiones, asignando estas acciones a estos roles, calculando este score. Esto NO es maqueta — es el sistema real corriendo con datos sintéticos."

Por qué importa esta tarea

2Criterios de aceptación

El entregable se acepta si y solo si cumple los 8 criterios objetivos siguientes:

#CriterioCómo se verifica
C15 min desde git clone a primera tensión visibleCronómetro · documentado en README
C2./demo-up.sh en una sola línea levanta todoSin comandos adicionales requeridos
C3Se cargan los 6 meses de datos sintéticos sin erroresLog de seed muestra ✅ por cada CSV
C4Se calculan los 60 KPIs MVP correctamenteComparación contra kpi_expected.json
C5Se disparan las 30 tensiones MVP esperadasComparación contra tensiones_expected.json
C6./demo-check.sh retorna 0 (assertions pasan)Exit code + reporte HTML
C7FARO Score calculado coincide con expected (±0.5 pts)Assertion en validation
C8Storyboard de presentación funciona en orden documentadoDry-run con 1 persona externa siguiendo el guion
⚠️ Lo que NO es objetivo de esta tarea

NO incluye: UI de producción (eso es la Tarea 46B) · API REST consumible · Multi-tenant · Auth real · Deploy a cloud · CI/CD. Si dev empieza a hacer eso, está fuera de scope y se está agrandando el ticket.

3Arquitectura local

Stack mínimo necesario. Todo corre en Docker — el dev no tiene que instalar PostgreSQL nativo ni Node global.

docker-compose.yml (componentes)

ServicioImagenPuertoFunción
postgrespostgres:15-alpine + extensión pgvector5432BD principal con DDL del pack precargado
seedbuild local (Node 20 alpine)Job one-shot que carga CSVs + corre seed.sql
computebuild local (Node 20 alpine)Job one-shot que calcula KPIs + dispara tensiones
pgadmin (opcional)dpage/pgadmin45050UI web para inspeccionar BD si el dev quiere

Flujo de ./demo-up.sh

#!/bin/bash
set -e
echo "🚀 FARO Demo · levantando entorno..."
docker compose up -d postgres
echo "⏳ Esperando PostgreSQL..."
until docker compose exec -T postgres pg_isready -U faro; do sleep 1; done
echo "📦 Aplicando DDL + migrations..."
docker compose run --rm seed npm run migrate
echo "🌱 Cargando 6 meses de datos demo..."
docker compose run --rm seed npm run seed
echo "🧮 Calculando KPIs..."
docker compose run --rm compute npm run kpis
echo "⚡ Evaluando reglas y detectando tensiones..."
docker compose run --rm compute npm run rules
echo "🧭 Calculando FARO Score..."
docker compose run --rm compute npm run score
echo ""
echo "✅ Demo lista. Acceder a:"
echo "   pgAdmin:  http://localhost:5050"
echo "   Reporte:  ./reports/demo-report.html"
echo ""
docker compose run --rm compute npm run report

4Estructura del repo

Repo Git aparte (sugerido: faro-connect-demo). Estructura propuesta:

faro-connect-demo/ ├── README.md # cómo levantar la demo ├── docker-compose.yml # PostgreSQL + workers ├── Dockerfile # imagen de seed/compute ├── package.json ├── demo-up.sh # ★ entry point (1 comando) ├── demo-down.sh # tear down completo ├── demo-check.sh # ejecuta validation │ ├── data/ # 6 meses de datos sintéticos │ ├── empresa_demo.csv # 1 empresa + 3 sucursales │ ├── usuarios_roles.csv # 12 usuarios con RACI │ ├── clientes.csv # 80 clientes (B2B distribuidor) │ ├── productos.csv # 120 productos │ ├── proveedores.csv # 25 proveedores │ ├── vendedores.csv # 8 vendedores │ ├── ventas_6_meses.csv # ~12.000 ventas │ ├── stock_6_meses.csv # snapshots semanales │ ├── cobranza_6_meses.csv # facturas + pagos + mora │ ├── compras_6_meses.csv # ~800 órdenes │ ├── gastos_6_meses.csv # ~400 gastos operativos │ ├── acciones_historicas.csv # algunas cerradas / vencidas │ └── evidencias_historicas.csv # adjuntas a acciones │ ├── expected/ # ★ assertions para validation │ ├── kpi_expected.json # 60 KPIs MVP con valor esperado │ ├── tensiones_expected.json # 30 tensiones que deben dispararse │ └── score_expected.json # FARO Score esperado (con ±0.5 tolerance) │ ├── sql/ │ ├── 001_extensions.sql # uuid-ossp, pgvector, pg_partman │ ├── 002_schema_core.sql # del pack FARO-Connect-MVP-completo.sql │ ├── 003_maestros.sql # tablas dimensión │ ├── 004_facts.sql # tablas de hechos │ ├── 005_kpis.sql # 60 funciones fn_kpi_NNN() │ ├── 006_reglas.sql # 30 reglas evaluables MVP │ └── seed.sql # carga inicial de demo │ ├── scripts/ │ ├── seed.ts # lee CSVs, hace INSERT en BD │ ├── kpis.ts # corre las 60 funciones KPI │ ├── rules.ts # evalúa reglas y crea tensiones │ ├── workflow.ts # simula 30 días de workflow real │ ├── score.ts # calcula FARO Score por dimensión │ ├── report.ts # genera demo-report.html │ └── check.ts # corre assertions vs expected/ │ ├── reports/ # outputs de la demo │ ├── demo-report.html # ★ reporte navegable de la demo │ └── check-report.html # resultado de validation │ └── docs/ ├── STORYBOARD.md # ★ guion de presentación ├── DATA-GENERATION.md # cómo se generaron los CSVs └── TROUBLESHOOTING.md # errores comunes + soluciones

5Diseño de datos sintéticos

Empresa demo: distribuidora de materiales de construcción "Premium SA". 3 sucursales (Mendoza, San Juan, Córdoba). ~65 empleados. Facturación USD 2.4M/año. Esto es coherente con el resto del pack — no cambiar.

Patrones intencionales (para disparar tensiones)

PatrónMesTensión que debería disparar
Ventas crecen 22% pero margen cae 8%m3-m6TNS-001 Crecimiento no rentable
Stock de producto top SUP_PREMIUM_001 baja a 5 días coberturam4TNS-027 Stock crítico
Cliente "Constructora Norte SA" no compra desde m4 (era top-5)m4-m6TNS-089 Cliente clave en riesgo
DSO sube de 32 a 51 díasm3-m6TNS-145 Deterioro cobranza
Gastos administrativos suben 35% sin justificaciónm5TNS-198 Gasto fuera de patrón
Vendedor "Gómez" cierra 60% menos que su históricom5-m6TNS-076 Performance comercial
Cobranza mora >90d sube 3xm5-m6TNS-152 Mora pesada
Compras a proveedor X bajan 80% (riesgo de quiebre)m4TNS-213 Concentración proveedor

Las 30 tensiones MVP totales deben dispararse — la mayoría con menor severidad. Lo importante: el dataset NO es aleatorio, es intencional. El dev debe trabajar con el equipo FARO para refinar los patrones hasta que las 30 disparen.

Generación de los CSVs

El dev puede usar Python (pandas + faker) o Node (faker.js). El criterio:

💡 Sugerencia: empezar simple

v1: 2 meses + 5 KPIs + 3 tensiones. Validar que el flujo end-to-end funciona. v2: extender a 6 meses, 60 KPIs, 30 tensiones. Esto evita perder días debuggeando un dataset gigante antes de tener pipeline.

6SQL seed + DDL

El DDL de partida ya existe en el pack: FARO-Connect-MVP-completo.sql (25 tablas + 21 funciones + extensiones).

Qué tiene que producir el dev

  1. Migrations versionadas: dividir el DDL monolítico en 001_*.sql, 002_*.sql, etc. usando Flyway, Sqitch o equivalente.
  2. 60 funciones fn_kpi_NNN() ejecutables: partir de las fórmulas en A5.2 Fórmulas KPI. Cada función retorna NUMERIC dado (company_id UUID, period DATE).
  3. 30 reglas evaluables MVP: las 30 marcadas como mvp: true en Biblioteca Tensiones. Pueden ser tabla rules con DSL JSON + función evaluadora SQL, o JSON externo + motor Node.
  4. seed.sql: SQL que: (a) crea la empresa demo + sucursales + usuarios, (b) inserta los maestros desde CSVs vía COPY, (c) inserta los facts vía COPY, (d) tira un ANALYZE al final.

El dev NO debe re-inventar el modelo de datos — el DDL del pack ya está completo y aprobado. Su trabajo es operacionalizarlo (migrations, seed, funciones SQL ejecutables).

7Validation script

./demo-check.sh debe correr automáticamente las assertions y producir un reporte HTML claro.

kpi_expected.json (estructura)

{
  "KPI-001": { "period": "2026-05-01", "value": 198450.00, "tolerance": 0.01 },
  "KPI-002": { "period": "2026-05-01", "value": 0.224, "tolerance": 0.001 },
  "KPI-008": { "period": "2026-05-01", "value": 51.3, "tolerance": 0.5 },
  ...
}

tensiones_expected.json (estructura)

{
  "TNS-001": {
    "must_trigger": true,
    "first_trigger_period": "2026-03-01",
    "severity_min": 3,
    "affects": ["sucursal:mendoza", "area:comercial"]
  },
  "TNS-027": {
    "must_trigger": true,
    "first_trigger_period": "2026-04-15",
    "severity_min": 4,
    "affects": ["producto:SUP_PREMIUM_001"]
  },
  ...
}

check.ts (algoritmo)

  1. Cargar kpi_expected.json + tensiones_expected.json + score_expected.json
  2. Querear BD para cada KPI esperado → comparar contra value ± tolerance
  3. Querear tensiones disparadas → confirmar que todas las must_trigger:true están + severidad correcta
  4. Calcular Score actual → comparar contra esperado
  5. Generar check-report.html con tabla de pass/fail + summary
  6. Exit code 0 si todo pasa, 1 si algo falla
✅ Por qué esto es CI-ready

El día que alguien modifique una fórmula KPI o un umbral de regla, este script detecta automáticamente si rompió algo. Es regresión continua. Sin esto, cada cambio es jugar a la ruleta.

8Storyboard de presentación

El archivo docs/STORYBOARD.md es el guion de 7-10 minutos para mostrarle a Horacio, un CTO o un inversor. No es un README técnico — es teatro guiado.

Estructura propuesta del storyboard

MinEscenaQué hacés en vivoQué decís
0-1SetupTerminal limpio · cloné el repo hace 1 minuto · corro ./demo-up.sh"Esto que estás viendo no es una maqueta — es FARO Connect corriendo. Lo estoy levantando ahora."
1-3CargaMostrar logs en vivo: cargando 12.000 ventas, calculando 60 KPIs, evaluando 30 reglas, detectando tensiones"FARO está leyendo 6 meses de datos sintéticos. En 2 minutos vamos a ver qué problemas detecta."
3-5ResultadoAbrir reports/demo-report.html en browser"Esto es lo que FARO encontró. 30 tensiones activas. Mirá la top: Crecimiento no rentable. Las ventas suben 22% pero el margen cae."
5-7DrillClick en la tensión → ver KPIs que la disparan, drill por sucursal/cliente/producto"FARO no te dice solo 'tenés un problema' — te dice exactamente dónde, cuánto cuesta y a quién asignar la acción."
7-9AcciónMostrar acción asignada con responsable, SLA, evidencia esperada"Cada tensión activa esta acción canónica. Esta va para el Gerente Comercial, vence en 5 días, espera evidencia tipo acta de reunión."
9-10ScoreMostrar FARO Score 71 → 78 después de cierres simulados"Y el Score evoluciona. Esto es lo que el director ve cada lunes en su email."

9Estimación de esfuerzo

Para un dev junior-senior con TS + PostgreSQL + Docker:

Setup + docker-compose
2 h
PostgreSQL + pgvector + Node images
Migrations + DDL split
3 h
Dividir el SQL del pack en numbered migrations
Generación CSVs (Python o Node)
6 h
12 CSVs · 6 meses · patrones intencionales
Scripts seed + kpis
4 h
Lectura CSVs · COPY · funciones fn_kpi_NNN
Rule engine MVP
5 h
30 reglas evaluables · detección tensiones
Validation + report HTML
3 h
check.ts + report.ts + templates
Docs + storyboard
2 h
README · STORYBOARD · TROUBLESHOOTING

Total: 25 horas (sumar 30-40% para imprevistos → presupuestar 30-35h con dev junior, 20-25h con dev senior).

10Entrega + criterios de revisión

Qué se entrega

Criterios de revisión por Tomás

  1. Reproducibilidad: Tomás clona en una máquina limpia (Mac o Linux) y corre ./demo-up.sh. Debe funcionar sin pasos extra.
  2. 5 minutos: cronometrar de clone a primera tensión visible. Si pasa de 8 min, hay que optimizar.
  3. Las 30 tensiones MVP efectivamente disparan. Sin ese mínimo, no se acepta.
  4. El storyboard se puede leer y ejecutar: Tomás hace dry-run con el guion y debe poder presentarlo sin saber el código.

Quién puede ejecutar esta tarea

💡 Próximo paso operativo para Tomás

1. Validar esta spec (¿algo cambia?). 2. Decidir quién la ejecuta. 3. Si terceriza: pasar este HTML como brief + el DDL del pack + las plantillas Excel. 4. Acordar entregable + fecha + presupuesto. 5. Cada semana revisar avance contra los 8 criterios.