{
  "version": "xarts.graph-relations/1",
  "family": "graph-relations",
  "operation": "hierarchical-bundle",
  "provenance": {
    "legacyId": "edgebundling"
  },
  "document": {
    "header": {
      "title": "Los dominios están en el organigrama, no en el código: 19 de los 32 acoplamientos cruzan la frontera",
      "subtitle": "Plataforma de reservas — dependencias entre módulos, agrupadas por el dominio al que el equipo los asignó"
    },
    "footer": {
      "source": "Análisis estático del monorepo, corte de mayo de 2026 (32 acoplamientos entre 16 módulos) — datos ilustrativos",
      "notes": "Cada curva es un acoplamiento entre dos módulos y se traza por dentro del anillo siguiendo el árbol de dominios hasta el ancestro común (agrupamiento de Holten, β = 0,85). El grosor va con el número de puntos de llamada y el área del punto con cuántos acoplamientos toca ese módulo; las dos escalas arrancan en cero. El sentido de la dependencia no se dibuja. Sin anotaciones: en un anillo lleno no hay sitio franco donde apoyar una caja de texto sin taparle el rótulo a una hoja, y el argumento lo lleva el titular.",
      "alt": "Dieciséis módulos repartidos en cinco arcos —Reservas, Contenido, Pagos, Clientes y Plataforma— con las 32 dependencias trazadas por dentro. Diecinueve cruzan de un dominio a otro y se ven como un haz azul que atraviesa el centro; los trece que se quedan en casa quedan como arcos grises pegados a su propio arco. Cinco de los cruces terminan en «Tarifas», que es de Contenido y recibe llamadas de Reservas, Pagos y Clientes; «Pagos» es el único dominio con la mitad de sus vínculos dentro."
    },
    "spacing": {
      "horizontalPadding": 24,
      "topPadding": 22,
      "bottomPadding": 24,
      "minimumTextGap": 6
    }
  },
  "output": {
    "filename": "edgebundling",
    "embedSpec": true,
    "geometryDecimals": 2
  },
  "presentation": {
    "theme": "anlak",
    "dimensions": {
      "width": 1040,
      "height": 880
    },
    "locale": "es-ES",
    "fonts": "reference",
    "surface": "theme",
    "framePadding": 24
  },
  "data": {
    "kind": "grouped-edges",
    "rows": [
      {
        "id": "edge-1",
        "sourceGroup": "Reservas",
        "source": "Búsqueda",
        "targetGroup": "Reservas",
        "target": "Disponibilidad",
        "weight": 24
      },
      {
        "id": "edge-2",
        "sourceGroup": "Reservas",
        "source": "Carrito",
        "targetGroup": "Reservas",
        "target": "Disponibilidad",
        "weight": 18
      },
      {
        "id": "edge-3",
        "sourceGroup": "Reservas",
        "source": "Carrito",
        "targetGroup": "Reservas",
        "target": "Confirmación",
        "weight": 9
      },
      {
        "id": "edge-4",
        "sourceGroup": "Reservas",
        "source": "Confirmación",
        "targetGroup": "Reservas",
        "target": "Disponibilidad",
        "weight": 7
      },
      {
        "id": "edge-5",
        "sourceGroup": "Reservas",
        "source": "Búsqueda",
        "targetGroup": "Contenido",
        "target": "Tarifas",
        "weight": 21
      },
      {
        "id": "edge-6",
        "sourceGroup": "Reservas",
        "source": "Carrito",
        "targetGroup": "Contenido",
        "target": "Tarifas",
        "weight": 16
      },
      {
        "id": "edge-7",
        "sourceGroup": "Reservas",
        "source": "Búsqueda",
        "targetGroup": "Contenido",
        "target": "Fichas de hotel",
        "weight": 12
      },
      {
        "id": "edge-8",
        "sourceGroup": "Reservas",
        "source": "Confirmación",
        "targetGroup": "Contenido",
        "target": "Tarifas",
        "weight": 6
      },
      {
        "id": "edge-9",
        "sourceGroup": "Reservas",
        "source": "Carrito",
        "targetGroup": "Pagos",
        "target": "Pasarela",
        "weight": 11
      },
      {
        "id": "edge-10",
        "sourceGroup": "Reservas",
        "source": "Confirmación",
        "targetGroup": "Pagos",
        "target": "Pasarela",
        "weight": 8
      },
      {
        "id": "edge-11",
        "sourceGroup": "Reservas",
        "source": "Carrito",
        "targetGroup": "Clientes",
        "target": "Perfil",
        "weight": 7
      },
      {
        "id": "edge-12",
        "sourceGroup": "Reservas",
        "source": "Confirmación",
        "targetGroup": "Clientes",
        "target": "Fidelización",
        "weight": 5
      },
      {
        "id": "edge-13",
        "sourceGroup": "Reservas",
        "source": "Confirmación",
        "targetGroup": "Plataforma",
        "target": "Notificaciones",
        "weight": 9
      },
      {
        "id": "edge-14",
        "sourceGroup": "Reservas",
        "source": "Búsqueda",
        "targetGroup": "Plataforma",
        "target": "Identidad",
        "weight": 4
      },
      {
        "id": "edge-15",
        "sourceGroup": "Pagos",
        "source": "Pasarela",
        "targetGroup": "Pagos",
        "target": "Conciliación",
        "weight": 14
      },
      {
        "id": "edge-16",
        "sourceGroup": "Pagos",
        "source": "Reembolsos",
        "targetGroup": "Pagos",
        "target": "Conciliación",
        "weight": 11
      },
      {
        "id": "edge-17",
        "sourceGroup": "Pagos",
        "source": "Reembolsos",
        "targetGroup": "Pagos",
        "target": "Pasarela",
        "weight": 6
      },
      {
        "id": "edge-18",
        "sourceGroup": "Pagos",
        "source": "Conciliación",
        "targetGroup": "Contenido",
        "target": "Tarifas",
        "weight": 9
      },
      {
        "id": "edge-19",
        "sourceGroup": "Pagos",
        "source": "Reembolsos",
        "targetGroup": "Reservas",
        "target": "Confirmación",
        "weight": 5
      },
      {
        "id": "edge-20",
        "sourceGroup": "Pagos",
        "source": "Pasarela",
        "targetGroup": "Plataforma",
        "target": "Auditoría",
        "weight": 7
      },
      {
        "id": "edge-21",
        "sourceGroup": "Clientes",
        "source": "Fidelización",
        "targetGroup": "Clientes",
        "target": "Perfil",
        "weight": 13
      },
      {
        "id": "edge-22",
        "sourceGroup": "Clientes",
        "source": "Consentimientos",
        "targetGroup": "Clientes",
        "target": "Perfil",
        "weight": 8
      },
      {
        "id": "edge-23",
        "sourceGroup": "Clientes",
        "source": "Fidelización",
        "targetGroup": "Contenido",
        "target": "Tarifas",
        "weight": 10
      },
      {
        "id": "edge-24",
        "sourceGroup": "Clientes",
        "source": "Consentimientos",
        "targetGroup": "Plataforma",
        "target": "Notificaciones",
        "weight": 6
      },
      {
        "id": "edge-25",
        "sourceGroup": "Clientes",
        "source": "Perfil",
        "targetGroup": "Plataforma",
        "target": "Identidad",
        "weight": 9
      },
      {
        "id": "edge-26",
        "sourceGroup": "Contenido",
        "source": "Fichas de hotel",
        "targetGroup": "Contenido",
        "target": "Traducciones",
        "weight": 15
      },
      {
        "id": "edge-27",
        "sourceGroup": "Contenido",
        "source": "Tarifas",
        "targetGroup": "Contenido",
        "target": "Traducciones",
        "weight": 7
      },
      {
        "id": "edge-28",
        "sourceGroup": "Contenido",
        "source": "Tarifas",
        "targetGroup": "Reservas",
        "target": "Disponibilidad",
        "weight": 12
      },
      {
        "id": "edge-29",
        "sourceGroup": "Plataforma",
        "source": "Notificaciones",
        "targetGroup": "Plataforma",
        "target": "Identidad",
        "weight": 8
      },
      {
        "id": "edge-30",
        "sourceGroup": "Plataforma",
        "source": "Auditoría",
        "targetGroup": "Plataforma",
        "target": "Identidad",
        "weight": 6
      },
      {
        "id": "edge-31",
        "sourceGroup": "Plataforma",
        "source": "Notificaciones",
        "targetGroup": "Contenido",
        "target": "Traducciones",
        "weight": 5
      },
      {
        "id": "edge-32",
        "sourceGroup": "Plataforma",
        "source": "Auditoría",
        "targetGroup": "Clientes",
        "target": "Perfil",
        "weight": 4
      }
    ]
  },
  "encoding": {
    "id": "id",
    "sourceGroup": "sourceGroup",
    "source": "source",
    "targetGroup": "targetGroup",
    "target": "target",
    "weight": "weight"
  },
  "advisory": {
    "enabled": true,
    "recommendedEdgeCount": 26,
    "messageTemplate": "{chart}: {count} filas por encima de maxItems={threshold}; se pintan todas (sin estrategia largeData declarada)"
  },
  "calculation": {
    "direction": "undirected",
    "degree": "edge-count",
    "groupOrder": "input",
    "leafOrder": "degree-descending",
    "duplicatePairs": "reject",
    "selfLinks": "reject",
    "weightMeaning": "puntos de acoplamiento"
  },
  "layout": {
    "view": "radial-bundle",
    "beta": 0.85,
    "groupGapDegrees": 5,
    "groupRadiusRatio": 0.55,
    "minimumRadius": 52,
    "edgeClearance": 10,
    "noteGap": 14,
    "labelMeasurement": "glyph-advances"
  },
  "marks": {
    "edges": {
      "internalColor": "textMuted",
      "crossingColor": "blue",
      "internalOpacity": 0.6,
      "crossingOpacity": 0.62,
      "dimmedOpacity": 0.1,
      "minWidth": 0.7,
      "maxWidth": 2.6
    },
    "leaves": {
      "minRadius": 2,
      "maxRadius": 5.5,
      "color": "textSecondary"
    },
    "groups": {
      "color": "textMuted",
      "width": 2.5,
      "opacity": 0.5,
      "radiusOffset": 10
    }
  },
  "labels": {
    "leaf": {
      "fontSize": 11,
      "fontWeight": 400,
      "color": "textPrimary",
      "maxWidth": 118,
      "gap": 16
    },
    "group": {
      "fontSize": 11,
      "fontWeight": 600,
      "color": "textSecondary",
      "maxWidth": 150,
      "gap": 11
    },
    "note": {
      "fontSize": 11,
      "color": "textMuted",
      "template": "{crossing} de {total} vínculos cruzan la frontera de rama",
      "degreeOrderText": "hojas ordenadas por número de vínculos dentro de su rama",
      "inputOrderText": "hojas en el orden del fichero",
      "uniformWeightText": "sin columna de peso: trazo uniforme"
    }
  },
  "legend": {
    "internal": "Dentro de su rama",
    "crossing": "Cruza a otra rama",
    "exportMeasurement": "glyph-advances"
  },
  "annotations": []
}
