scoreStatus, clamp, normalización KPI, penalty de tensión, helpers de evidencia, validadores AI.Paraguas integral sobre FARO-TEST-002 (reglas YAML) y FARO-TEST-002.1 (catálogos canónicos). Define la pirámide de pruebas, las 12 capas obligatorias, los 13 quality gates y la malla CI/CD que sostiene la cadena operativa FARO Connect sin romper lo ya construido.
FARO Connect no es una landing. Es una cadena operativa que va de datos a Score a reportes pasando por reglas, tensiones, acciones, evidencia, workflow, timeline, alertas e IA. La estrategia QA del MVP cubre cada eslabón y todos los eslabones funcionando juntos.
Este documento es el paraguas estratégico de calidad que se apoya en tres patas:
tension_code, action_code y evidence_code presentes en los catálogos MVP.La regla ejecutiva es directa: cada cambio debe demostrar que no rompió lo esencial. Cuando se toca Score y se rompen reportes, cuando se toca evidencia y no cierra una acción, cuando se toca RLS y se cruzan empresas, no hay diseño premium que lo salve. Se arregla con bisturí o se previene con QA.
Dataset oficial: Empresa Demo Cuyo S.A. Es la empresa de referencia para todos los tests de integración, smoke pre-demo y demo-check. Score esperado del período: 66 (deterioro vs. 74 del período anterior, delta -8). Tensiones esperadas detectadas: TNS-001, TNS-004 y derivadas. Si una corrida produce un Score lejos de 66, algo se rompió en la cadena.
Sello de gobierno: main no recibe código que rompa gates críticos. Si rompe, se corrige. No se ve después. “Después” en software es ese cementerio donde van a morir las promesas técnicas.
Una pirámide práctica, no aspiracional. No conviene arrancar con 200 tests E2E lentos: queda muy lindo hasta que el pipeline tarda 45 minutos y todos lo saltean. La herramienta de calidad no debe volverse enemiga de la calidad.
scoreStatus, clamp, normalización KPI, penalty de tensión, helpers de evidencia, validadores AI.company_id, contratos API y permisos.FaroScoreCard, TensionInbox, WeeklyReportPage, AccessDenied.Lectura ejecutiva: el 65% del esfuerzo de tests vive en la base (unit + SQL/RLS/API). Ahí está la velocidad de feedback y la cobertura real de los motores críticos (Score, reglas, workflow). El 5% de E2E está reservado para los flujos que un socio técnico, un inversor o un director van a ver corriendo en vivo. Esa proporción protege el pipeline rápido y mantiene la verdad ejecutiva.
Cualquier release del MVP debe ejecutar las 12 capas. No están ordenadas por prioridad sino por orden lógico de ejecución dentro del pipeline: lo rápido y barato primero (typecheck, lint, unit) y lo lento o frágil al final (smoke pre-demo).
tsc --noEmit sobre todo el monorepo. Detecta firmas rotas antes de cualquier test.
eslint . con reglas críticas para FARO: no any en motores, no console.log en código de producción.
Lógica pura sin DB: helpers de Score, clamp, status, confidence, normalización KPI, penalty de tensión.
V001..V109 aplican en DB vacía y sobre seed previo. Funciones faro.score_status() y vistas críticas compilan.
Empresa Demo Cuyo S.A. carga con UUIDs determinísticos. ON CONFLICT DO NOTHING garantiza idempotencia.
Tests cross-company con Empresa A y Empresa B simuladas. Lectura cruzada devuelve 0 rows; insert cruzado lanza error.
Response shape { ok, data } y { error: { code, category, message, request_id } } validado en endpoints críticos.
React Testing Library sobre componentes críticos: render, empty state, error state, props mínimas.
Pipeline completo con seed: KPI → reglas → tensiones → acciones → evidencia → Score → reporte semanal.
Caso esperado Cuyo: Score 74 → 66 (delta -8) con drivers TNS-001, TNS-004, ACTION_EXPIRED, EVIDENCE_MISSING.
Source refs válidos, números no inventados, prompt injection detectado, fallback activo si provider falla. IA nunca crea, cierra ni aprueba.
10 flujos críticos en Playwright sobre staging. Si alguno cae, no se muestra al socio técnico. Tradicional, aburrido, efectivo.
Cada gate es una condición binaria: pasa o no pasa. Los 11 bloqueantes impiden merge si fallan; los 2 de advertencia son ruido controlado que se revisa por humano. Política sin excepciones: main no recibe código que rompa gates críticos.
tsc --noEmit sale sin errores. Firmas rotas no entran a main.
eslint . sin errores. Warnings se permiten pero deben justificarse en PR.
Cobertura global de unit tests mayor o igual a 70%. Helpers críticos (Score, AI validators) mayor o igual a 90%.
Las V001..V109 aplican en DB vacía y sobre seed previo sin error. Re-aplicación es no-op.
Seeds de Empresa Demo Cuyo usan UUIDs fijos. Dos corridas producen el mismo dataset bit a bit.
Empresa A no puede leer ni escribir datos de Empresa B. Tests cross-company en todas las tablas company_id.
Todos los endpoints críticos responden con el response shape canónico, incluyendo request_id en errores.
Cuyo S.A. produce Score 66 ± 2 con drivers esperados. Cualquier deriva activa investigación de motor.
Transiciones de acción siguen máquina de estados: new → in_progress → blocked → resolved → closed. Estados ilegales son rechazados.
Acción crítica no cierra sin evidencia aprobada. Cierre sin evidencia devuelve EVIDENCE_REQUIRED.
El reporte semanal sobre Cuyo produce un snapshot estable: mismo Score, mismas tensiones, misma tabla de acciones vencidas.
Source refs inventadas (TNS-999) son rechazadas. Números fuera del payload se marcan. Prompt injection detectado y bloqueado.
Los 10 flujos críticos de Playwright sobre staging pasan. Sin smoke verde, no se enseña a Horacio, socio técnico ni inversor.
Coverage bajo en módulos no críticos (UI decorativa, helpers de presentación). No bloquea pero queda anotado en el PR.
Diferencias visuales menores (< 1% pixels) en screenshots Playwright. Revisión humana antes de merge.
Cada ambiente tiene un propósito específico y un subconjunto de capas que corre. Lo que se muestra a un socio técnico debe correr en staging o local reproducible. Screenshots sirven; sistema corriendo convence.
| Capa / Ambiente | Local | Test | CI | Staging | Production |
|---|---|---|---|---|---|
| Typecheck | Sí | Sí | Sí | — | — |
| Lint | Sí | Sí | Sí | — | — |
| Unit tests | Sí | Sí | Sí | — | — |
| SQL migrations | Sí | Sí | Sí | Sí | Sí |
| Seeds demo | Sí | Sí | Sí | Sí | — |
| RLS tests | Opt | Sí | Sí | — | — |
| API contract | Opt | Sí | Sí | — | — |
| UI components | Opt | Sí | Sí | — | — |
| Integration E2E | — | Sí | Sí | Sí | — |
| Score formula | Opt | Sí | Sí | Sí | — |
| AI guardrails | — | Sí | Sí | Sí | — |
| Smoke E2E | — | — | Opt | Sí | Sí |
| Health check | Sí | — | — | Sí | Sí |
Leyenda: Sí obligatorio en ese ambiente · Opt opcional, recomendado para desarrolladores · — no se ejecuta. Local prioriza velocidad de feedback; Test es el ambiente automático con DB temporal por suite; CI ejecuta el pipeline completo en cada PR; Staging valida la integración E2E pre-demo/pre-release; Production solo recibe código aprobado y ejecuta smoke + health.
Sin dataset demo controlado no hay QA serio. Datos sueltos no alcanzan: hace falta datos con resultado esperado. Cuyo S.A. cumple ese papel para todo el MVP.
Empresa Demo Cuyo S.A. es la empresa de referencia: una compañía argentina del interior con sucursales múltiples, áreas comercial / finanzas / stock / compras, datos realistas de seis meses y todas las tensiones MVP relevantes ya disparándose por construcción. No es una empresa real; es un instrumento de calidad.
pnpm db:seed:test ejecuta los archivos V025..V050 con UUIDs determinísticos. Empresa Cuyo recibe el ID 10000000-0000-0000-0000-000000000001. Re-ejecutar no duplica filas: ON CONFLICT DO NOTHING en todas las inserts.
Por cada motor hay un archivo expected/*.json: kpi_expected.json, tensions_expected.json, actions_expected.json, score_expected.json (Score actual 66, previous 74), report_expected.json. Los tests comparan output real contra estos archivos.
pnpm qa:demo-check resetea DB, aplica migraciones, siembra Cuyo, corre KPI engine, rules engine, workflow checker y score engine, genera reporte semanal y valida cada output contra el expected JSON. Termina con Result: PASS o Result: FAIL con el primer driver que no cuadra.
{
"company_code": "EMP-DEMO-CUYO",
"company_name": "Empresa Demo Cuyo S.A.",
"period": "2026-05",
"score": {
"current": 66,
"previous": 74,
"delta": -8,
"status": "warning",
"confidence_min": 80
},
"components": {
"kpi_health": 20,
"tension_health": 14,
"execution_health": 12,
"evidence_health": 10,
"governance_health": 10
},
"required_drivers": [
"TNS-001",
"TNS-004",
"ACTION_EXPIRED",
"EVIDENCE_MISSING"
]
}
Decisión aplicada: el caso oficial es Score 74 → 66 (delta -8). Los tests usan tolerance ± 2 sobre el valor actual. Si una corrida produce 64 o 68 el test pasa; si produce 72 o 60 el test falla y se investiga qué cambió en el motor de Score, las reglas o las penalizaciones de tensión. La frase fundacional: “mejor 80% en lo crítico que 100% en funciones decorativas”.
El pipeline se divide en cuatro workflows: lint, test, build y deploy. En cada PR corre el bloque hasta build; en merge a main se suma integration + E2E + deploy a staging; en release production se ejecuta el flujo completo con backup pre-release y monitoreo post-deploy.
name: FARO CI
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: faro
POSTGRES_PASSWORD: faro
POSTGRES_DB: faro_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis:7
ports:
- 6379:6379
env:
DATABASE_URL: postgresql://faro:faro@localhost:5432/faro_test
REDIS_URL: redis://localhost:6379
NODE_ENV: test
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Enable pnpm
run: corepack enable
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm lint
- name: Typecheck
run: pnpm typecheck
- name: Run migrations
run: pnpm db:migrate:test
- name: Seed Cuyo S.A.
run: pnpm db:seed:test
- name: Unit tests
run: pnpm test:unit
- name: SQL and RLS tests
run: pnpm test:sql
- name: API tests
run: pnpm test:api
- name: UI tests
run: pnpm test:ui
- name: Build
run: pnpm build
name: FARO Staging E2E
on:
workflow_dispatch:
push:
branches: [main]
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: corepack enable
- run: pnpm install --frozen-lockfile
- name: Install Playwright
run: pnpm playwright install --with-deps
- name: Run E2E smoke (10 flujos críticos)
env:
BASE_URL: https://staging.faro-connect.example
run: pnpm test:e2e:smoke
- name: Demo-check sobre Cuyo
env:
DATABASE_URL: ${{ secrets.STAGING_DATABASE_URL }}
run: pnpm qa:demo-check
{
"scripts": {
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:unit": "vitest run tests/unit",
"test:sql": "vitest run tests/sql",
"test:api": "vitest run tests/api",
"test:integration": "vitest run tests/integration",
"test:ui": "vitest run tests/ui",
"test:e2e": "playwright test",
"test:e2e:smoke": "playwright test tests/e2e/smoke",
"test:ci": "pnpm lint && pnpm typecheck && pnpm test:unit && pnpm test:sql && pnpm test:api && pnpm test:ui && pnpm build",
"db:migrate:test": "node scripts/db/migrate-test.ts",
"db:seed:test": "node scripts/db/seed-test.ts",
"db:reset:test": "node scripts/db/reset-test.ts",
"qa:demo-check": "node scripts/qa/demo-check.ts"
}
}
Política de pipeline: en PR corre install → lint → typecheck → unit → SQL/RLS → API → UI → build. En merge a main se agregan integration → E2E smoke → docker image → deploy staging → staging smoke. En release production: staging aprobado → backup pre-release → migrations production → deploy → smoke production → health check → monitoreo 30-60 min. Sin esos pasos en ese orden, no hay release.
Antes de mostrar FARO a Horacio, socio técnico, inversor o director, recorrer este checklist completo. La demo siempre falla donde uno dijo “eso no hace falta probarlo”. Ley de Murphy, pero con JavaScript.
director@empresa-demo.com.TNS-001 Crecimiento no rentable.TNS-004 Venta sin conversión a caja.ACT-COM-001 abre y muestra workflow completo.TNS-001, TNS-004)./ops/health muestra DB, Redis, jobs y dead letters.Reglas del smoke: los 30 items deben pasar antes de exhibir FARO. Si uno de los críticos (borde rojo) falla, se cancela la demo. Si fallan ítems importantes (borde ámbar) se acota la demo a las áreas verdes. La trampa clásica: mostrar lo que no se probó. Esa trampa termina en “acá normalmente funciona”, frase prohibida en presentaciones FARO.
Cada bug tiene severidad asignada en el momento del triage. La severidad determina SLA de respuesta y SLA de resolución objetivo. No es burocracia: es lo que evita que un P0 quede en el backlog mientras se discute un P3.
Empresa ve datos de otra. Login completamente roto. Pérdida de datos. Vulnerabilidad crítica RLS.
No recalcula Score. No genera reporte semanal. Cierre de acción no funciona. Notificaciones no se envían.
Reporte no exporta PDF. IA falla parcial pero fallback corre. Timeline muestra eventos desordenados.
Badge visual incorrecto. Texto desalineado. Tooltip sin contenido. Ordenamiento de tabla menor.
Texto o microcopy. Iconografía secundaria. Optimización de query no crítica. Mejora de mensaje de error.
| Paso | Acción | Responsable | Output |
|---|---|---|---|
| 01 | Triage de severidad | QA Lead | Etiqueta SEV-0..4 en issue |
| 02 | Reproducir con seed Cuyo | Dev asignado | Test que falla en CI |
| 03 | Fix con test de regresión | Dev asignado | PR con test verde |
| 04 | Code review obligatorio | Reviewer | Approval o cambios |
| 05 | Merge a main + deploy staging | CI/CD | Staging actualizado |
| 06 | Smoke staging | QA | Smoke verde |
| 07 | Release production (si SEV-0/1) | Lead | Production actualizado |
| 08 | Post-mortem (solo SEV-0) | Equipo | Documento de aprendizaje |
La regression suite ejecuta automáticamente en cada release. Es la red de seguridad: si un cambio rompe alguno de estos casos, el release se cancela. Son los casos cuya rotura humilla en una demo.
| Caso | Esperado | Capa | Estado |
|---|---|---|---|
TNS-001 Crecimiento no rentable detectada | Sí en Cuyo | Integration | Green |
TNS-001 crea / recomienda ACT-COM-001 | Sí | Integration | Green |
TNS-004 Venta sin conversión a caja detectada | Sí en Cuyo | Integration | Green |
Acción crítica vencida pasa a expired + escala L3 | Sí | Workflow | Green |
| Evidencia aprobada habilita cierre | Sí | Workflow | Green |
Acción sin evidencia no cierra (devuelve EVIDENCE_REQUIRED) | Sí | API | Green |
| Score demo queda en 66 ± 2 | Sí | Score formula | Green |
| Reporte semanal incluye Score, tensiones críticas y acciones vencidas | Sí | Integration | Green |
IA no inventa TNS-999 ni números fuera de payload | Sí | AI guardrail | Green |
Viewer no cierra acción (devuelve 403 con PERMISSION_DENIED) | Sí | API | Green |
| Empresa A no ve datos de Empresa B (RLS dos tenants) | 0 rows | SQL/RLS | Green |
| Job fallido va a retry y luego a dead letter | Sí | Jobs | Green |
| Notificación vencida se genera y dispatcher la envía | Sí | Notifications | Green |
| Snapshot Score guarda componentes y drivers | Sí | Score formula | Green |
| Migraciones aplican sobre seed Cuyo previo sin error | Sí | SQL migrations | Green |
Visual: FaroScoreCard no oculta el delta en mobile | Sí | UI | Watch |
Cómo se mantiene la suite: cada bug SEV-0/SEV-1 cerrado agrega al menos un test de regresión a esta lista. Esa es la regla. No se cierra un P0 sin test; sin test, el bug vuelve. Esa fila al final con estado Watch es un caso en observación: pasó dos veces pero no es lo suficientemente estable para promoverlo a Green todavía.
Tres bloques secuenciales que protegen cada publicación. Las casillas se completan en orden; ningún bloque arranca hasta que el anterior está en verde.
pnpm qa:demo-check termina con PASS.release, commit, migrations, score_model, ai_prompts.qa.test_runs.{
"release": "0.3.0-mvp",
"commit": "abc123def456",
"migrations": "V001-V109",
"seed_version": "EMP-DEMO-CUYO v1.2",
"score_model": "FARO_SCORE_MVP v1",
"ai_prompts": [
"AI-EXPLAIN-SCORE v1",
"AI-EXPLAIN-TENSION v1",
"AI-EXPLAIN-ACTION v1"
],
"demo_dataset": "EMP-DEMO-CUYO v1",
"rollback_to": "0.2.7-mvp",
"released_at": "2026-05-31T18:00:00-03:00"
}
Tres documentos componen la estrategia QA del MVP. Saber qué cubre cada uno evita duplicar cobertura y evita huecos donde nadie probó nada.
Valida la integridad del DSL: estructura de regla, scope, operadores, KPIs disponibles, conjunción y disyunción. Cada regla YAML cargada por el parser pasa por este suite antes de llegar al motor evaluador.
Cubre: parser + DSL + reglas individualesVerifica que toda regla apunte a un tension_code presente en faro.tension_definitions, a action_code en action_definitions y a evidence_code en evidence_definitions. Bloquea cualquier código huérfano.
Estrategia integral: pirámide, 12 capas, 13 gates, ambientes, dataset demo, CI/CD, smoke pre-demo, severity, regression y release. Es el sistema operativo de calidad sobre el que viven los dos anteriores.
Cubre: estrategia E2E del MVPRegla de tres: si un bug se encuentra en TEST-002 → corregir regla YAML. Si se encuentra en TEST-002.1 → corregir catálogo canónico o referencia rota. Si se encuentra en QA-001 → revisar la cadena completa (pipeline, integración, ambiente o gate). Cada nivel tiene su responsable de fix; ningún nivel se salta porque “el siguiente lo va a atrapar”.
La estrategia QA no vive sola. Consume catálogos canónicos, valida motores y se apoya en piezas de gobierno, observabilidad y deploy. Las marcadas PENDIENTE aún están en construcción.
30 tensiones canónicas TNS-001..TNS-030. Base de los tests de integración: cada tensión esperada de Cuyo se valida contra este catálogo.
Fórmula y componentes del FARO Score. GATE-08 (score-formula-correct) ejecuta sobre este motor con tolerancia ± 2 sobre Cuyo.
Máquina de estados de acciones y escalamiento L1/L2/L3. GATE-09 y GATE-10 ejecutan sobre este workflow.
DDL completo del sistema. Las capas 04 (migrations) y 06 (RLS) testean directamente las migraciones V001..V109 y la política RLS por company_id.
Matriz visual del estado del MVP. La estrategia QA alimenta esta vista con los resultados de demo-check y smoke staging.
Tests de integridad referencial entre reglas y catálogos canónicos. Documento técnico en construcción.
Especificación de deploy, ambientes (local / test / CI / staging / production) y release management. En construcción.
Observabilidad técnica: jobs, errors, dead letters, health, métricas. Alimenta el GATE-13 (smoke pre-demo).
Gateway IA con guardrails, source refs y validación anti-alucinación. Base de la capa 11 (AI guardrails) y GATE-12.
Gobierno, seguridad, auditoría y permisos. Base de la capa 06 (RLS dos tenants) y GATE-06.
Este documento es el paraguas. Con los catálogos canónicos (tensiones, acciones, evidencias) y los tests YAML ya en lugar, la próxima pieza es activar el pipeline GitHub Actions y construir el dataset Cuyo S.A. ejecutable. Volvé al hub o pasá al motor de Score para ver la fórmula que el GATE-08 valida.
→ Volver al hub modelos NDA