← Volver al índice de anexos
Macrobloque 2·Datos·Anexo 9 / 40

Anexo 9 · RAW y trazabilidad

Etapa: Fases 1.3 y 2.1
PÚBLICO

ANEXO 9

RAW y trazabilidad

Este anexo corresponde a la Fase 2 — Resguardo, especialmente a las etapas RAW y Control de origen de FARO Connect.


1. Objetivo del anexo

El objetivo del Anexo 9 — RAW y trazabilidad es definir cómo FARO Connect guarda la información original, sin modificarla, para que cada dato, KPI, alerta, tensión, recomendación o acción pueda ser auditado desde su origen.

La pregunta central es:

¿De dónde salió este dato y cómo llegó hasta esta conclusión?

FARO debe poder responder eso con precisión.

No alcanza con decir:

“El margen bajó.”

FARO tiene que poder demostrar:

El margen bajó porque:
- se tomó la venta del archivo ventas_mayo.xlsx,
- cargado el 27/05/2026,
- por Administración,
- desde la sucursal San Juan,
- procesado en el lote LOAD_2026_05_27_001,
- usando costo unitario del ERP,
- con descuento informado por Comercial,
- y validado contra la tabla maestra de productos.

Eso es trazabilidad. Sin trazabilidad, FARO puede ser interesante, pero no confiable.


2. Tesis del Anexo 9

La tesis es:

FARO Connect debe conservar siempre el dato original antes de limpiarlo, normalizarlo, interpretarlo o usarlo para tomar decisiones.

El dato original es la evidencia.

Después se puede limpiar, ordenar, corregir, mapear, normalizar y enriquecer. Pero la versión original no debe perderse nunca.

En términos simples:

RAW = lo que llegó.
Staging = lo que se limpió.
Normalizado = lo que se ordenó.
Modelo ejecutivo = lo que se puede usar para dirigir.

Si algo sale mal, FARO debe poder volver al RAW y reconstruir el camino.


3. Qué es RAW

RAW significa dato crudo.

Es la información guardada exactamente como llegó desde la fuente.

Puede venir desde:

Excel
ERP
CRM
Banco
WhatsApp
PDF
API
POS
Google Sheets
Sistema de stock
Sistema de RRHH
Formulario interno
Acta de reunión

Ejemplo:

Un Excel trae este producto:

Cem x50

FARO lo guarda así en RAW:

{
  "producto": "Cem x50",
  "cantidad": "100",
  "precio": "$ 8.500",
  "descuento": "8%",
  "vendedor": "Juan P.",
  "fecha": "27/05/26"
}

Después, en normalización, puede transformarlo en:

{
  "product_id": "PROD_001",
  "producto_normalizado": "CEMENTO_BOLSA_50KG",
  "cantidad": 100,
  "precio_unitario": 8500,
  "descuento": 0.08,
  "vendedor_id": "EMP_014",
  "fecha": "2026-05-27"
}

Pero el RAW original queda guardado.


4. Por qué RAW es crítico

Motivo Explicación
Auditoría Permite revisar de dónde salió cada dato.
Trazabilidad Permite seguir el camino del dato desde origen hasta KPI.
Corrección Si una regla estaba mal, se puede reprocesar desde el RAW.
Confianza Dirección puede confiar en que el número es defendible.
Legal / contable Algunos datos pueden necesitar respaldo documental.
Aprendizaje Permite comparar dato original, dato corregido y resultado final.
Evitar manipulación Nadie puede cambiar un dato sin dejar rastro.

La regla debería ser:

FARO nunca destruye el dato original. Lo preserva, lo versiona y lo audita.


5. Diferencia entre RAW, Staging, Normalización y Modelo Ejecutivo

Capa Qué contiene Ejemplo
RAW Dato original como llegó. “Cem x50”, “27/05/26”, “$ 8.500”.
Staging Dato limpiado técnicamente. fecha 2026-05-27, precio 8500.
Normalización Dato estandarizado contra maestros. PROD_001, EMP_014, CLIENTE_003.
Modelo ejecutivo Dato listo para KPIs y decisiones. Venta con producto, cliente, margen, vendedor, sucursal y cobranza.

Ejemplo completo:

RAW:
"Cem x50"

Staging:
"cem x50"

Normalización:
"CEMENTO_BOLSA_50KG"

Modelo ejecutivo:
Producto PROD_001, categoría Cemento, costo actualizado, margen calculable.

6. Qué debe guardar FARO en RAW

FARO debe guardar dos cosas:

1. El dato original.
2. La metadata de origen.

6.1 Dato original

Puede ser:

Fila de Excel.
Archivo completo.
Evento API.
Mensaje de WhatsApp.
Movimiento bancario.
Registro de ERP.
PDF.
Acta.
Formulario.

6.2 Metadata de origen

Debe incluir:

Fuente.
Usuario o sistema que lo envió.
Fecha y hora de carga.
Empresa.
Sucursal.
Área.
Archivo original.
Versión.
Lote de carga.
Estado.
Cantidad de registros.
Errores detectados.
Hash o identificador único.

Sin metadata, el RAW queda rengo. Es como tener una factura sin fecha ni proveedor.


7. Metadata obligatoria por carga

Campo Para qué sirve
load_id Identifica el lote de carga.
source_id Identifica la fuente.
source_type ERP, Excel, API, banco, WhatsApp, etc.
company_id Empresa a la que pertenece.
branch_id Sucursal, si aplica.
area Área dueña del dato.
uploaded_by Usuario o sistema que cargó.
uploaded_at Fecha y hora de carga.
file_name Nombre del archivo, si aplica.
file_version Versión del archivo.
record_count Cantidad de registros recibidos.
status Recibido, validado, observado, rechazado, procesado.
checksum / hash Control para detectar cambios o duplicados.
processing_version Versión de reglas usadas para procesar.

Ejemplo:

{
  "load_id": "LOAD_2026_05_27_001",
  "source_id": "EXCEL_VENTAS_001",
  "source_type": "excel",
  "company_id": "COMP_001",
  "branch_id": "SUC_SAN_JUAN",
  "area": "Comercial",
  "uploaded_by": "administracion",
  "uploaded_at": "2026-05-27T22:00:00",
  "file_name": "ventas_mayo.xlsx",
  "file_version": "v1",
  "record_count": 1200,
  "status": "received",
  "checksum": "a93f8d1c...",
  "processing_version": "rules_v1.0"
}

8. Modelo de base de datos RAW

Una estructura inicial podría ser así:

CREATE TABLE raw_imports (
    id UUID PRIMARY KEY,
    load_id TEXT UNIQUE NOT NULL,
    source_id TEXT NOT NULL,
    source_type TEXT NOT NULL,
    company_id TEXT NOT NULL,
    branch_id TEXT,
    area TEXT,
    uploaded_by TEXT,
    uploaded_at TIMESTAMP DEFAULT now(),
    file_name TEXT,
    file_version TEXT,
    record_count INTEGER,
    status TEXT DEFAULT 'received',
    checksum TEXT,
    processing_version TEXT,
    raw_payload JSONB,
    created_at TIMESTAMP DEFAULT now()
);

Para eventos individuales:

CREATE TABLE raw_events (
    id UUID PRIMARY KEY,
    load_id TEXT,
    source_id TEXT NOT NULL,
    event_type TEXT NOT NULL,
    company_id TEXT NOT NULL,
    branch_id TEXT,
    area TEXT,
    occurred_at TIMESTAMP,
    received_at TIMESTAMP DEFAULT now(),
    raw_payload JSONB NOT NULL,
    status TEXT DEFAULT 'received',
    checksum TEXT,
    created_at TIMESTAMP DEFAULT now()
);

Para archivos:

CREATE TABLE raw_files (
    id UUID PRIMARY KEY,
    load_id TEXT UNIQUE NOT NULL,
    source_id TEXT NOT NULL,
    file_name TEXT NOT NULL,
    file_type TEXT,
    file_size_bytes BIGINT,
    storage_path TEXT NOT NULL,
    uploaded_by TEXT,
    uploaded_at TIMESTAMP DEFAULT now(),
    checksum TEXT,
    status TEXT DEFAULT 'stored'
);

9. Ejemplo de RAW de venta

Registro original

{
  "fecha": "27/05/26",
  "cliente": "Constructora Norte",
  "producto": "Cem x50",
  "cantidad": "100",
  "precio": "$ 8.500",
  "descuento": "8%",
  "vendedor": "Juan P.",
  "sucursal": "SJ"
}

RAW guardado

{
  "load_id": "LOAD_2026_05_27_001",
  "source": "ventas_mayo.xlsx",
  "row_number": 128,
  "raw_payload": {
    "fecha": "27/05/26",
    "cliente": "Constructora Norte",
    "producto": "Cem x50",
    "cantidad": "100",
    "precio": "$ 8.500",
    "descuento": "8%",
    "vendedor": "Juan P.",
    "sucursal": "SJ"
  }
}

Dato normalizado posterior

{
  "fecha": "2026-05-27",
  "customer_id": "CLI_003",
  "product_id": "PROD_001",
  "cantidad": 100,
  "precio_unitario": 8500,
  "descuento": 0.08,
  "employee_id": "EMP_014",
  "branch_id": "SUC_SAN_JUAN"
}

10. Trazabilidad de punta a punta

La trazabilidad debe permitir seguir el dato desde el origen hasta la decisión.

Ejemplo:

Archivo original
→ RAW
→ Staging
→ Normalización
→ Tabla maestra
→ Fact table
→ KPI
→ Señal
→ Regla
→ Alerta
→ Tensión
→ Diagnóstico
→ Acción
→ Responsable
→ Seguimiento
→ FARO Score

Ejemplo aplicado:

ventas_mayo.xlsx fila 128
→ raw_imports LOAD_2026_05_27_001
→ staging_sales
→ fact_sales
→ KPI margen bruto
→ señal margen bajo
→ regla margen < 22%
→ alerta margen crítico
→ tensión crecimiento no rentable
→ acción auditar descuentos
→ responsable Gerente Comercial
→ seguimiento 72 horas
→ impacto en FARO Score

11. Tabla de linaje del dato

FARO debería tener una tabla de linaje.

CREATE TABLE data_lineage (
    id UUID PRIMARY KEY,
    raw_id UUID NOT NULL,
    staging_id UUID,
    normalized_id UUID,
    fact_table TEXT,
    fact_id UUID,
    kpi_code TEXT,
    signal_id UUID,
    alert_id UUID,
    tension_id UUID,
    action_id UUID,
    score_snapshot_id UUID,
    created_at TIMESTAMP DEFAULT now()
);

Esto permite responder preguntas como:

¿Qué datos alimentaron este KPI?
¿Qué carga generó esta alerta?
¿Qué regla disparó esta tensión?
¿Qué acción nació de este diagnóstico?
¿Qué registros afectaron el FARO Score?

12. Versionado de datos y reglas

No basta con guardar el dato. También hay que guardar con qué regla fue procesado.

Ejemplo:

Regla de margen v1:
margen crítico < 20%

Regla de margen v2:
margen crítico < 22%

Regla de margen v3:
margen crítico depende de industria y producto.

Si FARO recalcula el pasado, debe saber con qué versión lo hizo.

Modelo sugerido:

CREATE TABLE processing_rules_versions (
    id UUID PRIMARY KEY,
    rule_code TEXT NOT NULL,
    version TEXT NOT NULL,
    description TEXT,
    rule_definition JSONB,
    active_from TIMESTAMP,
    active_to TIMESTAMP,
    created_by TEXT,
    created_at TIMESTAMP DEFAULT now()
);

Ejemplo:

{
  "rule_code": "MARGIN_CRITICAL",
  "version": "v1.2",
  "definition": {
    "threshold": 0.22,
    "operator": "<",
    "industry": "construction_supplies"
  },
  "active_from": "2026-05-01"
}

13. Hash y control de integridad

Para evitar duplicados o detectar cambios, FARO puede generar un hash del registro o archivo.

Ejemplo:

import hashlib
import json

def generar_hash(payload):
    payload_ordenado = json.dumps(payload, sort_keys=True, ensure_ascii=False)
    return hashlib.sha256(payload_ordenado.encode("utf-8")).hexdigest()

Uso:

registro = {
    "fecha": "27/05/26",
    "cliente": "Constructora Norte",
    "producto": "Cem x50",
    "cantidad": "100"
}

checksum = generar_hash(registro)
print(checksum)

Esto permite detectar:

Duplicados.
Archivos modificados.
Cargas repetidas.
Cambios no autorizados.

14. Estados del dato RAW

Estado Significado
received El dato fue recibido.
stored El dato fue guardado en RAW.
validated Pasó validación inicial.
observed Tiene errores, pero puede revisarse.
rejected No cumple condiciones mínimas.
processed Pasó a staging.
normalized Fue vinculado a maestros.
integrated Alimenta el modelo ejecutivo.
reprocessed Fue procesado nuevamente.
archived Conservado, pero fuera del flujo activo.

15. Auditoría de cambios

FARO debe registrar cualquier modificación, reproceso o corrección.

Tabla sugerida:

CREATE TABLE audit_log (
    id UUID PRIMARY KEY,
    entity_type TEXT NOT NULL,
    entity_id UUID NOT NULL,
    action TEXT NOT NULL,
    previous_value JSONB,
    new_value JSONB,
    changed_by TEXT,
    changed_at TIMESTAMP DEFAULT now(),
    reason TEXT
);

Ejemplo:

{
  "entity_type": "normalized_product",
  "entity_id": "PROD_ALIAS_001",
  "action": "alias_updated",
  "previous_value": {
    "alias": "Cem x50",
    "product_id": null
  },
  "new_value": {
    "alias": "Cem x50",
    "product_id": "PROD_001"
  },
  "changed_by": "data_admin",
  "reason": "Normalización contra maestro de productos"
}

16. Ejemplo: auditoría de una alerta

Supongamos que FARO genera esta alerta:

Alerta: margen crítico en cemento bolsa 50kg.

FARO debe poder mostrar:

Elemento Valor
Fuente original ventas_mayo.xlsx
Lote LOAD_2026_05_27_001
Producto RAW Cem x50
Producto normalizado CEMENTO_BOLSA_50KG
Costo usado ERP costos, versión 2026-05
Venta neta $850.000
Costo total $700.000
Margen calculado 17.6%
Regla aplicada margen < 22%
Alerta generada margen crítico
Tensión relacionada crecimiento no rentable
Acción sugerida auditar descuentos altos

Eso es FARO serio. Lo demás es “confía en mí, bro”, pero con logo.


17. Trazabilidad de documentos

Para PDFs, facturas, presupuestos, remitos o contratos, FARO debe guardar:

Archivo original.
Texto extraído.
Campos detectados.
Confianza de extracción.
Usuario que validó.
Versión procesada.
Relación con proveedor / cliente / operación.

Ejemplo:

{
  "document_id": "DOC_001",
  "file_name": "factura_proveedor_123.pdf",
  "source": "mail_compras",
  "raw_storage_path": "s3://faro/raw/docs/factura_proveedor_123.pdf",
  "extracted_fields": {
    "proveedor": "Proveedor Norte SA",
    "fecha": "2026-05-27",
    "importe": 1250000,
    "producto": "Hierro 8mm"
  },
  "extraction_confidence": 0.87,
  "validated_by": "administracion"
}

18. Trazabilidad de WhatsApp o mensajes

Los mensajes pueden ser útiles, pero son peligrosos si se usan sin control.

FARO debe guardar:

Mensaje original.
Número o usuario.
Fecha y hora.
Canal.
Texto completo.
Extracción estructurada.
Confianza.
Validación humana si corresponde.

Ejemplo:

{
  "message_id": "MSG_001",
  "channel": "whatsapp",
  "from": "vendedor_juan",
  "received_at": "2026-05-27T10:32:00",
  "raw_text": "Necesito 100 bolsas de cemento para Obra Norte mañana",
  "extracted_data": {
    "cliente": "Obra Norte",
    "producto": "cemento",
    "cantidad": 100,
    "fecha_requerida": "2026-05-28"
  },
  "confidence": 0.78,
  "requires_validation": true
}

Regla sana:

Un WhatsApp puede iniciar un flujo, pero no debería generar una decisión crítica sin validación.


19. Trazabilidad de decisiones

No solo los datos operativos deben tener trazabilidad. Las decisiones también.

Cada decisión debe guardar:

Quién la tomó.
Cuándo.
Con qué información.
Qué diagnóstico la originó.
Qué tensión estaba relacionada.
Qué acción generó.
Qué KPI buscaba mejorar.
Qué resultado tuvo.

Modelo:

CREATE TABLE decision_log (
    id UUID PRIMARY KEY,
    decision_code TEXT,
    title TEXT,
    description TEXT,
    created_by TEXT,
    decided_by TEXT,
    decided_at TIMESTAMP,
    related_tension_id UUID,
    related_alert_id UUID,
    related_kpis JSONB,
    expected_impact JSONB,
    action_id UUID,
    result_status TEXT,
    created_at TIMESTAMP DEFAULT now()
);

Ejemplo:

{
  "decision_code": "DEC_2026_001",
  "title": "Limitar descuentos mayores al 8%",
  "decided_by": "Dirección",
  "related_tension": "crecimiento_no_rentable",
  "related_kpis": ["margen_bruto", "descuento_promedio"],
  "expected_impact": {
    "margen_bruto": "+3 puntos"
  },
  "action": "auditar_descuentos_altos",
  "result_status": "en_seguimiento"
}

20. Trazabilidad de FARO Score

El FARO Score no puede ser un número mágico.

Debe tener desglose.

Ejemplo:

{
  "score_snapshot_id": "SCORE_2026_05_27",
  "score": 72,
  "componentes": {
    "kpis": -10,
    "tensiones": -8,
    "alertas_vencidas": -4,
    "acciones_en_fecha": 6,
    "calidad_datos": -2
  },
  "principales_causas": [
    "margen_bruto_en_rojo",
    "crecimiento_no_rentable",
    "acciones_comerciales_vencidas"
  ]
}

FARO debe poder responder:

¿Por qué el score bajó?
¿Qué tensión lo afectó?
Qué KPI lo afectó?
Qué acción vencida lo afectó?
¿Qué área debe actuar?

21. Reprocesamiento desde RAW

Una de las grandes ventajas del RAW es poder reprocesar.

Ejemplo:

Antes:
Producto “Cem x50” no estaba vinculado al maestro.

Después:
Se vincula a CEMENTO_BOLSA_50KG.

Entonces:
FARO reprocesa ventas históricas afectadas.
Recalcula margen.
Recalcula tensiones.
Recalcula score.

Ejemplo conceptual:

def reprocesar_lote(load_id):
    raw_records = obtener_raw_por_lote(load_id)

    for raw in raw_records:
        staging = transformar_a_staging(raw)
        normalizado = normalizar(staging)
        integrar_modelo_ejecutivo(normalizado)

    recalcular_kpis(load_id)
    recalcular_alertas(load_id)
    recalcular_tensiones(load_id)

    return {
        "load_id": load_id,
        "status": "reprocessed"
    }

22. Retención de datos

FARO debe definir cuánto tiempo conserva cada tipo de dato.

Tipo de dato Retención sugerida
RAW operativo 5 años o según política del cliente.
RAW financiero / contable 5 a 10 años, según normativa local.
Logs de auditoría 5 años mínimo.
Decisiones ejecutivas Permanente o histórico largo.
FARO Score snapshots Histórico completo.
Archivos temporales Eliminación controlada.
Datos sensibles RRHH Según política de privacidad y legislación.

La política exacta depende del país, industria y contrato. Pero como criterio, FARO debe estar preparado para retención larga y auditoría seria.


23. Seguridad del RAW

RAW puede contener información sensible.

Por eso debe protegerse.

Medidas recomendadas:

Control de acceso por rol.
Cifrado en reposo.
Cifrado en tránsito.
Logs de acceso.
Separación por empresa.
Separación por sucursal si corresponde.
Permisos por área.
Auditoría de descargas.
Anonimización cuando aplique.
Backups.
Política de retención.

Ejemplo de permisos:

Rol Puede ver RAW Puede reprocesar Puede modificar mapeos
Dirección Parcial / reportes No No
Sistemas
Administración Datos de su área No Parcial
Finanzas Datos financieros No Parcial
Comercial Datos comerciales No No
Auditor Sí, lectura No No

24. Riesgos si no existe RAW y trazabilidad

Riesgo Consecuencia
No se puede auditar Nadie sabe de dónde salió un número.
No se puede corregir histórico Errores quedan enterrados.
No se puede reprocesar Cambios en reglas no aplican hacia atrás.
No se detectan duplicados Ventas, gastos o stock pueden inflarse.
No hay confianza directiva Dirección duda del sistema.
No hay defensa técnica Un socio técnico puede cuestionar toda la arquitectura.
No hay cumplimiento Riesgo legal, contable o contractual.
FARO Score pierde credibilidad El número parece inventado.

25. Ejemplo completo: de venta a tensión

Dato original

Archivo: ventas_mayo.xlsx
Fila: 128
Producto: Cem x50
Cantidad: 100
Precio: $8.500
Descuento: 12%
Vendedor: Juan P.

RAW

Se guarda exactamente como llegó.

Staging

Precio = 8500
Descuento = 0.12
Cantidad = 100
Fecha normalizada

Normalización

Producto = CEMENTO_BOLSA_50KG
Vendedor = EMP_014
Sucursal = SUC_SAN_JUAN

Modelo ejecutivo

Venta neta.
Costo.
Margen.
Cliente.
Vendedor.
Sucursal.
Condición de cobro.

KPI

Margen bruto = 19%

Regla

Si margen < 22% y descuento > 10%, activar alerta.

Alerta

Margen crítico con descuento alto.

Tensión

Crecimiento no rentable.

Acción

Auditar operaciones con descuento superior al 8%.

Responsable

Gerente Comercial.

Trazabilidad

FARO puede mostrar toda la cadena desde la fila 128 del Excel hasta la acción generada.

26. Output final del Anexo 9

Al finalizar este anexo, FARO debe tener definido:

1. Modelo de almacenamiento RAW.
2. Metadata obligatoria por fuente.
3. Estructura de lotes de carga.
4. Tabla de eventos RAW.
5. Tabla de archivos RAW.
6. Tabla de linaje del dato.
7. Tabla de auditoría de cambios.
8. Versionado de reglas de procesamiento.
9. Hash de integridad.
10. Estados del dato RAW.
11. Política de reprocesamiento.
12. Política de retención.
13. Permisos de acceso al RAW.
14. Trazabilidad de KPIs.
15. Trazabilidad de alertas.
16. Trazabilidad de tensiones.
17. Trazabilidad de acciones.
18. Trazabilidad de FARO Score.

27. Conexión con otros anexos

Próximo anexo Qué recibe desde Anexo 9
Anexo 8 — Fuentes e ingesta Lotes, archivos, eventos y metadata de origen.
Anexo 10 — Calidad de datos RAW para validar completitud, errores y consistencia.
Anexo 11 — Staging y normalización Datos originales para limpiar y transformar.
Anexo 13 — Tablas maestras Alias y valores originales para unificar entidades.
Anexo 17 — Biblioteca de KPIs Base auditable de los datos usados en fórmulas.
Anexo 20 — Reglas de negocio Versiones de reglas aplicadas sobre datos.
Anexo 21 — Alertas FARO Evidencia de origen de cada alerta.
Anexo 22 — Biblioteca de tensiones Datos originales que justifican cada tensión.
Anexo 33 — Medición posterior Comparación entre datos antes y después.
Anexo 35 — FARO Score Desglose auditable del score.
Anexo 36 — Aprendizaje Historial confiable para aprender patrones.

RAW y trazabilidad son la columna vertebral de confianza de FARO Connect. Cada dato se guarda como llegó, con su origen, fecha, usuario, fuente, versión y estado. Desde ahí FARO puede reconstruir el camino completo: dato original, KPI, alerta, tensión, acción, seguimiento y FARO Score.

Versión 1.0 · Última revisión: 2026-05-28 Anexo 9 de 40 · Fases 1.3 y 2.1