{
  "version": "xarts.graph-relations/1",
  "family": "graph-relations",
  "operation": "vocabulary-correspondence",
  "provenance": {
    "legacyId": "concept-crosswalk"
  },
  "data": {
    "concepts": [
      {
        "id": "left-1",
        "side": "left",
        "label": "Acción",
        "role": "neutral"
      },
      {
        "id": "right-1",
        "side": "right",
        "label": "Comando (CQRS)",
        "role": "neutral"
      },
      {
        "id": "right-2",
        "side": "right",
        "label": "Caso de uso",
        "role": "neutral"
      },
      {
        "id": "left-2",
        "side": "left",
        "label": "Invariante",
        "role": "neutral"
      },
      {
        "id": "right-3",
        "side": "right",
        "label": "Restricción de integridad",
        "role": "neutral"
      },
      {
        "id": "left-3",
        "side": "left",
        "label": "Tipo de valor",
        "role": "neutral"
      },
      {
        "id": "right-4",
        "side": "right",
        "label": "Objeto valor (DDD)",
        "role": "neutral"
      },
      {
        "id": "left-4",
        "side": "left",
        "label": "Objeto con identidad",
        "role": "neutral"
      },
      {
        "id": "right-5",
        "side": "right",
        "label": "Entidad (DDD)",
        "role": "neutral"
      },
      {
        "id": "left-5",
        "side": "left",
        "label": "Interfaz",
        "role": "neutral"
      },
      {
        "id": "right-6",
        "side": "right",
        "label": "Puerto (hexagonal)",
        "role": "neutral"
      },
      {
        "id": "left-6",
        "side": "left",
        "label": "Compensación",
        "role": "absent"
      }
    ],
    "links": [
      {
        "id": "link-1",
        "leftId": "left-1",
        "rightId": "right-1",
        "shared": "los dos nombran un cambio de estado con nombre propio",
        "difference": "el comando no declara sus criterios de admisión",
        "role": "neutral"
      },
      {
        "id": "link-2",
        "leftId": "left-1",
        "rightId": "right-2",
        "shared": "los dos describen una intención del negocio",
        "difference": "el caso de uso es prosa, no una firma tipada",
        "role": "neutral"
      },
      {
        "id": "link-3",
        "leftId": "left-2",
        "rightId": "right-3",
        "shared": "las dos rechazan el estado que no admiten",
        "difference": "la restricción vive en el motor, no en el modelo",
        "role": "neutral"
      },
      {
        "id": "link-4",
        "leftId": "left-3",
        "rightId": "right-4",
        "shared": "los dos son iguales por su valor, no por su identidad",
        "difference": "el objeto valor no trae conjunto admisible declarado",
        "role": "neutral"
      },
      {
        "id": "link-5",
        "leftId": "left-4",
        "rightId": "right-5",
        "shared": "los dos sobreviven al cambio de sus atributos",
        "difference": "la entidad no declara el origen de cada propiedad",
        "role": "neutral"
      },
      {
        "id": "link-6",
        "leftId": "left-5",
        "rightId": "right-6",
        "shared": "los dos separan lo que se pide de quién lo cumple",
        "difference": "el puerto no obliga a versionar lo que promete",
        "role": "neutral"
      },
      {
        "id": "link-7",
        "leftId": "left-6",
        "rightId": null,
        "shared": "sin precedente encontrado con este nombre",
        "difference": "deshacer un efecto suele quedar fuera del modelo",
        "role": "absent"
      }
    ]
  },
  "relationship": {
    "kind": "declared-correspondence",
    "direction": "undirected",
    "cardinality": "explicit-many-to-many",
    "equalColumns": true,
    "unmatched": "open-ended-dashed",
    "weight": "none"
  },
  "calculation": {
    "order": [
      "link-1",
      "link-2",
      "link-3",
      "link-4",
      "link-5",
      "link-6",
      "link-7"
    ],
    "conceptPlacement": "incident-span-midpoint",
    "conceptInstances": "one-per-identity"
  },
  "layout": {
    "margin": {
      "top": 24,
      "right": 24,
      "bottom": 24,
      "left": 24
    },
    "grid": 8,
    "alignment": "start",
    "laneFraction": 0.36,
    "minimumLane": 200,
    "maximumLane": 420,
    "jumpLane": 24,
    "markerIndent": 16,
    "clearance": 10,
    "rowGap": 12,
    "minimumColumn": 171,
    "padding": {
      "x": 14,
      "y": 12
    },
    "radius": 4,
    "minimumTextWidth": 90,
    "capacity": "reject"
  },
  "text": {
    "family": "'Inter', system-ui, -apple-system, sans-serif",
    "measurement": "shaped",
    "mode": "complete-wrap",
    "concept": {
      "size": 19,
      "weight": 700,
      "lineHeight": 28
    },
    "note": {
      "size": 16,
      "weight": 400,
      "lineHeight": 24
    },
    "heading": {
      "size": 22,
      "weight": 700,
      "lineHeight": 32
    },
    "stamp": {
      "size": 14,
      "weight": 700,
      "lineHeight": 24
    },
    "verdict": {
      "size": 22,
      "weight": 700,
      "lineHeight": 32
    },
    "markerWeight": 500,
    "conceptMaxLines": 30,
    "linkMaxLines": 30,
    "headingMaxLines": 30,
    "footerMaxLines": 30,
    "stampSpacing": 0.06,
    "sharedMarker": "≈",
    "differenceMarker": "≠"
  },
  "marks": {
    "paints": {
      "neutral": {
        "fill": "surface",
        "stroke": "border",
        "text": "textPrimary",
        "dash": ""
      },
      "focus": {
        "fill": "series.blue",
        "stroke": "series.blue",
        "text": "surface",
        "dash": ""
      },
      "warning": {
        "fill": "surface",
        "stroke": "negative",
        "text": "negative",
        "dash": ""
      },
      "absent": {
        "fill": "none",
        "stroke": "textMuted",
        "text": "textMuted",
        "dash": "6 4"
      },
      "favorable": {
        "fill": "surfaceAlt",
        "stroke": "series.teal",
        "text": "textPrimary",
        "dash": ""
      }
    },
    "width": 1.25,
    "connectorColor": "textSecondary",
    "unmatchedDash": "6 4",
    "noteColor": "textMuted",
    "headingColor": "textPrimary",
    "linkColor": "textSecondary",
    "verdictColor": "accent",
    "ruleOpacity": 0.5
  },
  "headings": {
    "left": "Nuestras piezas",
    "right": "Nombres que ya existían"
  },
  "footer": {
    "band": {
      "text": "parentesco, no herencia: ninguna columna deriva de la otra",
      "role": "absent"
    },
    "verdict": "Renombramos cinco piezas con más obligaciones; la sexta es la que nadie modela.",
    "bandStroke": 4,
    "bandHeight": 40,
    "verdictHeight": 32,
    "tableGap": 16,
    "bandTextOffset": 20,
    "bandVerdictGap": 6,
    "verdictGapWithoutBand": 16,
    "verdictTextOffset": 20,
    "ruleWidth": 1.25
  },
  "annotations": [],
  "document": {
    "textOverflow": "preserve",
    "header": {
      "title": "Cinco de nuestras seis piezas ya tenían nombre; la sexta no aparece",
      "subtitle": "Cada vínculo dice en qué se parecen (≈) y en qué se separan (≠). Ninguna columna deriva de la otra.",
      "source": "Correspondencia descrita en el capítulo 28. Esquema conceptual — parentesco declarado, sin escala y sin cronología."
    },
    "spacing": {
      "horizontalPadding": 24,
      "topPadding": 22,
      "bottomPadding": 16,
      "minimumTextGap": 4
    }
  },
  "presentation": {
    "theme": "anlak",
    "dimensions": {
      "width": 940,
      "height": 1030
    },
    "locale": "es-ES",
    "fonts": "reference",
    "surface": "theme",
    "framePadding": 24
  },
  "output": {
    "filename": "concept-crosswalk",
    "embedSpec": true
  }
}
