{
  "schema_version": 1,
  "diagram_type": "dataflow",
  "meta": {
    "title": "Flujo de datos de analítica de producto",
    "output": "examples/dataflow-product-analytics.html",
    "viewBox": [
      1080,
      520
    ],
    "animation": "trace",
    "quality_profile": "showcase",
    "views": [
      {
        "id": "collection-path",
        "label": "Ruta de recopilación",
        "focus": [
          "web",
          "mobile",
          "edge",
          "stream"
        ],
        "note": "Sigue los eventos de producto desde los clientes hasta el flujo ordenado."
      },
      {
        "id": "consent-boundary",
        "label": "Consentimiento y datos personales",
        "focus": [
          "edge",
          "consent",
          "pii"
        ],
        "note": "Explora el control de políticas y el almacén restringido de identidad."
      },
      {
        "id": "analytics-consumers",
        "label": "Consumidores de datos preparados",
        "focus": [
          "stream",
          "warehouse",
          "dashboard",
          "features",
          "model"
        ],
        "note": "Consulta los datos preparados, paneles y características derivadas."
      }
    ],
    "locale": "es"
  },
  "stages": [
    {
      "label": "Fuentes"
    },
    {
      "label": "Ingreso"
    },
    {
      "label": "Proceso"
    },
    {
      "label": "Almacén"
    },
    {
      "label": "Consumo"
    }
  ],
  "nodes": [
    {
      "id": "web",
      "type": "frontend",
      "label": "Aplicación web",
      "sublabel": "SDK del navegador",
      "stage": 0,
      "row": 0,
      "tag": "eventos"
    },
    {
      "id": "mobile",
      "type": "frontend",
      "label": "Móvil",
      "sublabel": "iOS / Android",
      "stage": 0,
      "row": 2,
      "tag": "eventos"
    },
    {
      "id": "edge",
      "type": "cloud",
      "label": "API de entrada",
      "sublabel": "recolector",
      "stage": 1,
      "row": 1,
      "tag": "TLS"
    },
    {
      "id": "consent",
      "type": "security",
      "label": "Consentimiento",
      "sublabel": "filtro de políticas",
      "stage": 2,
      "row": 0,
      "tag": "control de privacidad"
    },
    {
      "id": "stream",
      "type": "messagebus",
      "label": "Flujo de eventos",
      "sublabel": "tema de Kafka",
      "stage": 2,
      "row": 2,
      "tag": "ordenado"
    },
    {
      "id": "pii",
      "type": "security",
      "label": "Bóveda personal",
      "sublabel": "cifrado",
      "stage": 3,
      "row": 0,
      "tag": "restringido"
    },
    {
      "id": "warehouse",
      "type": "database",
      "label": "Almacén analítico",
      "sublabel": "tablas analíticas",
      "stage": 3,
      "row": 1,
      "tag": "preparado"
    },
    {
      "id": "features",
      "type": "database",
      "label": "Características",
      "sublabel": "lote diario",
      "stage": 3,
      "row": 2,
      "tag": "derivado"
    },
    {
      "id": "dashboard",
      "type": "backend",
      "label": "Paneles",
      "sublabel": "métricas de producto",
      "stage": 4,
      "row": 0,
      "tag": "SQL"
    },
    {
      "id": "model",
      "type": "backend",
      "label": "Modelo de ML",
      "sublabel": "tarea de clasificación",
      "stage": 4,
      "row": 2,
      "tag": "características"
    }
  ],
  "flows": [
    {
      "id": "web-clickstream",
      "from": "web",
      "to": "edge",
      "label": "clics",
      "classification": "uso",
      "variant": "emphasis",
      "fromSide": "right",
      "toSide": "left",
      "via": [
        [
          205,
          157
        ],
        [
          205,
          271
        ]
      ],
      "labelAt": [
        204,
        190
      ]
    },
    {
      "id": "mobile-events",
      "from": "mobile",
      "to": "edge",
      "label": "eventos de aplicación",
      "classification": "eventos del dispositivo",
      "variant": "default",
      "fromSide": "right",
      "toSide": "left",
      "via": [
        [
          222,
          385
        ],
        [
          222,
          271
        ]
      ],
      "labelAt": [
        220,
        342
      ]
    },
    {
      "id": "consent-enrichment",
      "from": "edge",
      "to": "consent",
      "label": "identidad y permiso",
      "classification": "datos personales",
      "variant": "security",
      "fromSide": "top",
      "toSide": "left",
      "via": [
        [
          315,
          112
        ],
        [
          450,
          112
        ],
        [
          450,
          157
        ]
      ],
      "labelAt": [
        382,
        100
      ]
    },
    {
      "id": "accepted-events",
      "from": "edge",
      "to": "stream",
      "label": "eventos aceptados",
      "classification": "solo añadir",
      "variant": "emphasis",
      "fromSide": "right",
      "toSide": "left",
      "via": [
        [
          420,
          271
        ],
        [
          420,
          385
        ]
      ],
      "labelAt": [
        438,
        324
      ]
    },
    {
      "id": "identity-map",
      "from": "consent",
      "to": "pii",
      "label": "identidad",
      "classification": "PII cifrada",
      "variant": "security",
      "route": "straight",
      "labelAt": [
        638,
        144
      ]
    },
    {
      "id": "normalized-facts",
      "from": "stream",
      "to": "warehouse",
      "label": "datos normalizados",
      "classification": "sin datos personales",
      "variant": "emphasis",
      "fromSide": "right",
      "toSide": "left",
      "via": [
        [
          638,
          385
        ],
        [
          638,
          271
        ]
      ],
      "labelAt": [
        638,
        326
      ]
    },
    {
      "id": "daily-aggregates",
      "from": "warehouse",
      "to": "features",
      "label": "agregados diarios",
      "classification": "lote",
      "variant": "dashed",
      "fromSide": "bottom",
      "toSide": "top",
      "route": "straight",
      "labelAt": [
        745,
        326
      ]
    },
    {
      "id": "metrics-query",
      "from": "warehouse",
      "to": "dashboard",
      "label": "SQL de métricas",
      "classification": "solo lectura",
      "variant": "default",
      "fromSide": "right",
      "toSide": "bottom",
      "via": [
        [
          852,
          271
        ],
        [
          960,
          271
        ]
      ],
      "labelAt": [
        876,
        258
      ]
    },
    {
      "id": "feature-vectors",
      "from": "features",
      "to": "model",
      "label": "vectores",
      "classification": "derivado",
      "variant": "dashed",
      "route": "straight",
      "labelAt": [
        852,
        372
      ]
    },
    {
      "id": "restricted-join",
      "from": "pii",
      "to": "dashboard",
      "label": "unión restringida",
      "classification": "solo autorizados",
      "variant": "security",
      "route": "straight",
      "labelAt": [
        852,
        144
      ]
    }
  ],
  "cards": [
    {
      "dot": "emerald",
      "title": "Ruta principal de datos",
      "items": [
        "Los eventos avanzan por las fases de origen, ingreso, proceso, almacenamiento y consumo",
        "La ruta principal permanece clara junto a los flujos secundarios por lotes",
        "Las etiquetas nombran los datos en lugar de usar verbos genéricos de API"
      ]
    },
    {
      "dot": "rose",
      "title": "Límite de datos sensibles",
      "items": [
        "Las rutas de consentimiento y datos personales usan el estilo de seguridad",
        "Los datos personales van a una bóveda restringida, separada del almacén analítico",
        "Las uniones restringidas se muestran sin dar a entender que el acceso sea libre"
      ]
    },
    {
      "dot": "orange",
      "title": "Consumidores de datos derivados",
      "items": [
        "Los paneles leen datos preparados del almacén",
        "Los vectores de características se derivan por lotes de las tablas analíticas",
        "Las rutas de consumo se distinguen de la recopilación y del consentimiento"
      ]
    }
  ]
}
