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.
"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
- Cierra el gap "documental → ejecutable" identificado por la matriz de estado de implementación (95 activos en 📄 vs 0 en 🚀).
- Vende confianza por demostración, no por discurso. Un inversor no va a leer 50 anexos — sí va a quedar impactado por ver el sistema corriendo en su laptop en 5 minutos.
- Es la base de toda demo futura. Cada vez que vayas a una reunión con Horacio, un CTO o un inversor, levantás el demo y mostrás. Sin esto, la conversación queda en abstracciones.
- Habilita testing real. Una vez que el dataset corre, podés iterar fórmulas KPI, reglas, umbrales, etc. midiendo impacto en tensiones detectadas.
2Criterios de aceptación
El entregable se acepta si y solo si cumple los 8 criterios objetivos siguientes:
| # | Criterio | Cómo se verifica |
|---|---|---|
| C1 | 5 min desde git clone a primera tensión visible | Cronómetro · documentado en README |
| C2 | ./demo-up.sh en una sola línea levanta todo | Sin comandos adicionales requeridos |
| C3 | Se cargan los 6 meses de datos sintéticos sin errores | Log de seed muestra ✅ por cada CSV |
| C4 | Se calculan los 60 KPIs MVP correctamente | Comparación contra kpi_expected.json |
| C5 | Se disparan las 30 tensiones MVP esperadas | Comparación contra tensiones_expected.json |
| C6 | ./demo-check.sh retorna 0 (assertions pasan) | Exit code + reporte HTML |
| C7 | FARO Score calculado coincide con expected (±0.5 pts) | Assertion en validation |
| C8 | Storyboard de presentación funciona en orden documentado | Dry-run con 1 persona externa siguiendo el guion |
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)
| Servicio | Imagen | Puerto | Función |
|---|---|---|---|
postgres | postgres:15-alpine + extensión pgvector | 5432 | BD principal con DDL del pack precargado |
seed | build local (Node 20 alpine) | — | Job one-shot que carga CSVs + corre seed.sql |
compute | build local (Node 20 alpine) | — | Job one-shot que calcula KPIs + dispara tensiones |
pgadmin (opcional) | dpage/pgadmin4 | 5050 | UI 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:
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ón | Mes | Tensión que debería disparar |
|---|---|---|
| Ventas crecen 22% pero margen cae 8% | m3-m6 | TNS-001 Crecimiento no rentable |
| Stock de producto top SUP_PREMIUM_001 baja a 5 días cobertura | m4 | TNS-027 Stock crítico |
| Cliente "Constructora Norte SA" no compra desde m4 (era top-5) | m4-m6 | TNS-089 Cliente clave en riesgo |
| DSO sube de 32 a 51 días | m3-m6 | TNS-145 Deterioro cobranza |
| Gastos administrativos suben 35% sin justificación | m5 | TNS-198 Gasto fuera de patrón |
| Vendedor "Gómez" cierra 60% menos que su histórico | m5-m6 | TNS-076 Performance comercial |
| Cobranza mora >90d sube 3x | m5-m6 | TNS-152 Mora pesada |
| Compras a proveedor X bajan 80% (riesgo de quiebre) | m4 | TNS-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:
- Reproducibilidad: seed fijo en el generador → mismo output siempre.
- Volumen razonable: ~12.000 ventas (no 100.000, no 100).
- Coherencia interna: una venta tiene FK válido a cliente + producto + vendedor + sucursal. No inventar IDs huérfanos.
- Estacionalidad: ventas más altas en marzo/abril (inicio año fiscal construcción).
- Plantillas oficiales como contrato: respetar las columnas de las 15 plantillas oficiales MVP.
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
- Migrations versionadas: dividir el DDL monolítico en
001_*.sql,002_*.sql, etc. usando Flyway, Sqitch o equivalente. - 60 funciones
fn_kpi_NNN()ejecutables: partir de las fórmulas en A5.2 Fórmulas KPI. Cada función retornaNUMERICdado(company_id UUID, period DATE). - 30 reglas evaluables MVP: las 30 marcadas como
mvp: trueen Biblioteca Tensiones. Pueden ser tablarulescon DSL JSON + función evaluadora SQL, o JSON externo + motor Node. - 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íaCOPY, (d) tira unANALYZEal 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)
- Cargar
kpi_expected.json+tensiones_expected.json+score_expected.json - Querear BD para cada KPI esperado → comparar contra value ± tolerance
- Querear tensiones disparadas → confirmar que todas las
must_trigger:trueestán + severidad correcta - Calcular Score actual → comparar contra esperado
- Generar
check-report.htmlcon tabla de pass/fail + summary - Exit code 0 si todo pasa, 1 si algo falla
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
| Min | Escena | Qué hacés en vivo | Qué decís |
|---|---|---|---|
| 0-1 | Setup | Terminal 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-3 | Carga | Mostrar 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-5 | Resultado | Abrir 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-7 | Drill | Click 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-9 | Acción | Mostrar 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-10 | Score | Mostrar 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:
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
- Repo Git público o privado con todo el código
- Tag
v1.0.0 - README claro con
git clone+./demo-up.sh - Demo grabada (Loom o equivalente · 5 min) corriendo end-to-end · prueba que funciona en SU máquina
- Reporte final de
./demo-check.shcon 8/8 criterios verde
Criterios de revisión por Tomás
- Reproducibilidad: Tomás clona en una máquina limpia (Mac o Linux) y corre
./demo-up.sh. Debe funcionar sin pasos extra. - 5 minutos: cronometrar de clone a primera tensión visible. Si pasa de 8 min, hay que optimizar.
- Las 30 tensiones MVP efectivamente disparan. Sin ese mínimo, no se acepta.
- 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
- Dev full-stack TS/SQL: ideal. 1 persona, 25-35hs.
- Tomás + dev SQL: posible. Tomás guía decisiones de datos sintéticos (qué patrones meter), dev hace el código.
- Agencia técnica: viable si entiende el contexto. Pedir cotización por todo el ticket cerrado, no por hora.
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.