{
  "type": "excalidraw",
  "version": 2,
  "source": "https://excalidraw.com",
  "appState": { "viewBackgroundColor": "#ffffff", "gridSize": 20 },
  "files": {},
  "elements": [
    {
      "type": "text", "id": "titre", "x": 40, "y": 24, "width": 760, "height": 35,
      "text": "ElectriCore — architecture d'ensemble",
      "originalText": "ElectriCore — architecture d'ensemble",
      "fontSize": 28, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100001, "version": 1, "versionNonce": 100002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "sous_titre", "x": 40, "y": 64, "width": 900, "height": 25,
      "text": "Les données vont dans un seul sens ; tout le monde passe par l'API ; le core ignore l'ERP.",
      "originalText": "Les données vont dans un seul sens ; tout le monde passe par l'API ; le core ignore l'ERP.",
      "fontSize": 16, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#3b82f6", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100003, "version": 1, "versionNonce": 100004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "sum1", "x": 1090, "y": 30, "width": 140, "height": 36,
      "strokeColor": "#c2410c", "backgroundColor": "#fed7aa", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100010, "version": 1, "versionNonce": 100011, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sum1t", "type": "text"}, {"id": "suma1", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "sum1t", "x": 1098, "y": 38, "width": 124, "height": 20,
      "text": "SFTP Enedis", "originalText": "SFTP Enedis",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100012, "version": 1, "versionNonce": 100013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sum1", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "sum2", "x": 1270, "y": 30, "width": 120, "height": 36,
      "strokeColor": "#047857", "backgroundColor": "#a7f3d0", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100014, "version": 1, "versionNonce": 100015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sum2t", "type": "text"}, {"id": "suma1", "type": "arrow"}, {"id": "suma2", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "sum2t", "x": 1278, "y": 38, "width": 104, "height": 20,
      "text": "DuckDB", "originalText": "DuckDB",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100016, "version": 1, "versionNonce": 100017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sum2", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "sum3", "x": 1430, "y": 30, "width": 130, "height": 36,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100018, "version": 1, "versionNonce": 100019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sum3t", "type": "text"}, {"id": "suma2", "type": "arrow"}, {"id": "suma3", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "sum3t", "x": 1438, "y": 38, "width": 114, "height": 20,
      "text": "core Polars", "originalText": "core Polars",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100020, "version": 1, "versionNonce": 100021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sum3", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "sum4", "x": 1600, "y": 30, "width": 110, "height": 36,
      "strokeColor": "#1e3a5f", "backgroundColor": "#93c5fd", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100022, "version": 1, "versionNonce": 100023, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sum4t", "type": "text"}, {"id": "suma3", "type": "arrow"}, {"id": "suma4", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "sum4t", "x": 1608, "y": 38, "width": 94, "height": 20,
      "text": "API hub", "originalText": "API hub",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100024, "version": 1, "versionNonce": 100025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sum4", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "sum5", "x": 1750, "y": 30, "width": 190, "height": 36,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100026, "version": 1, "versionNonce": 100027, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sum5t", "type": "text"}, {"id": "suma4", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "sum5t", "x": 1758, "y": 38, "width": 174, "height": 20,
      "text": "Telegram · Odoo", "originalText": "Telegram · Odoo",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100028, "version": 1, "versionNonce": 100029, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sum5", "lineHeight": 1.25
    },
    {
      "type": "arrow", "id": "suma1", "x": 1234, "y": 48, "width": 32, "height": 0,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100030, "version": 1, "versionNonce": 100031, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [32, 0]],
      "startBinding": {"elementId": "sum1", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "sum2", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "suma2", "x": 1394, "y": 48, "width": 32, "height": 0,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100032, "version": 1, "versionNonce": 100033, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [32, 0]],
      "startBinding": {"elementId": "sum2", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "sum3", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "suma3", "x": 1564, "y": 48, "width": 32, "height": 0,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100034, "version": 1, "versionNonce": 100035, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [32, 0]],
      "startBinding": {"elementId": "sum3", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "sum4", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "suma4", "x": 1714, "y": 48, "width": 32, "height": 0,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 100036, "version": 1, "versionNonce": 100037, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [32, 0]],
      "startBinding": {"elementId": "sum4", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "sum5", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },

    {
      "type": "rectangle", "id": "salle_donnees", "x": 40, "y": 150, "width": 480, "height": 560,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200001, "version": 1, "versionNonce": 200002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "salle_donnees_titre", "x": 60, "y": 165, "width": 420, "height": 26,
      "text": "1 · DONNÉES — ingestion/ (dlt + dbt)", "originalText": "1 · DONNÉES — ingestion/ (dlt + dbt)",
      "fontSize": 20, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200003, "version": 1, "versionNonce": 200004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "salle_donnees_st", "x": 60, "y": 196, "width": 440, "height": 36,
      "text": "le mouvement ne casse jamais ;\nla transformation est rejouable",
      "originalText": "le mouvement ne casse jamais ;\nla transformation est rejouable",
      "fontSize": 13, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200005, "version": 1, "versionNonce": 200006, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "ellipse", "id": "sftp", "x": 130, "y": 256, "width": 220, "height": 76,
      "strokeColor": "#c2410c", "backgroundColor": "#fed7aa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200010, "version": 1, "versionNonce": 200011, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "sftp_t", "type": "text"}, {"id": "don_a1", "type": "arrow"}],
      "link": null, "locked": false
    },
    {
      "type": "text", "id": "sftp_t", "x": 160, "y": 274, "width": 160, "height": 40,
      "text": "SFTP Enedis\n*.zip chiffrés AES", "originalText": "SFTP Enedis\n*.zip chiffrés AES",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200012, "version": 1, "versionNonce": 200013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "sftp", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "etl_box", "x": 130, "y": 388, "width": 220, "height": 64,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200014, "version": 1, "versionNonce": 200015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "etl_box_t", "type": "text"}, {"id": "don_a1", "type": "arrow"}, {"id": "don_a2", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "etl_box_t", "x": 140, "y": 398, "width": 200, "height": 40,
      "text": "dlt — landing brut\ndbt — linéarisation SQL", "originalText": "dlt — landing brut\ndbt — linéarisation SQL",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200016, "version": 1, "versionNonce": 200017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "etl_box", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "duckdb", "x": 110, "y": 508, "width": 260, "height": 124,
      "strokeColor": "#047857", "backgroundColor": "#a7f3d0", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200018, "version": 1, "versionNonce": 200019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "duckdb_t", "type": "text"}, {"id": "don_a2", "type": "arrow"}, {"id": "vers_loaders", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "duckdb_t", "x": 120, "y": 518, "width": 240, "height": 86,
      "text": "DuckDB\nflux_enedis_pipeline.duckdb\nflux_raw.raw_* (brut)\nflux_enedis.flux_* (typé)",
      "originalText": "DuckDB\nflux_enedis_pipeline.duckdb\nflux_raw.raw_* (brut)\nflux_enedis.flux_* (typé)",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#047857", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200020, "version": 1, "versionNonce": 200021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "duckdb", "lineHeight": 1.25
    },
    {
      "type": "arrow", "id": "don_a1", "x": 240, "y": 336, "width": 0, "height": 46,
      "strokeColor": "#c2410c", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200022, "version": 1, "versionNonce": 200023, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 46]],
      "startBinding": {"elementId": "sftp", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "etl_box", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "don_a2", "x": 240, "y": 456, "width": 0, "height": 46,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200024, "version": 1, "versionNonce": 200025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 46]],
      "startBinding": {"elementId": "etl_box", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "duckdb", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "text", "id": "don_note", "x": 90, "y": 652, "width": 360, "height": 36,
      "text": "déclenché par POST /ingestion/run (cron 02:00,\nbot /ingestion, ou à la main) — détail : ingestion.md",
      "originalText": "déclenché par POST /ingestion/run (cron 02:00,\nbot /ingestion, ou à la main) — détail : ingestion.md",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 200026, "version": 1, "versionNonce": 200027, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.3
    },

    {
      "type": "rectangle", "id": "salle_calculs", "x": 580, "y": 150, "width": 720, "height": 560,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300001, "version": 1, "versionNonce": 300002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "salle_calculs_titre", "x": 600, "y": 165, "width": 620, "height": 26,
      "text": "2 · CALCULS — core/ (Polars, ERP-agnostique)",
      "originalText": "2 · CALCULS — core/ (Polars, ERP-agnostique)",
      "fontSize": 20, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300003, "version": 1, "versionNonce": 300004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "salle_calculs_st", "x": 600, "y": 196, "width": 640, "height": 20,
      "text": "la chaîne canonique de la facturation — LazyFrames purs, composés par builds/",
      "originalText": "la chaîne canonique de la facturation — LazyFrames purs, composés par builds/",
      "fontSize": 13, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300005, "version": 1, "versionNonce": 300006, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "loaders", "x": 600, "y": 235, "width": 680, "height": 48,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300010, "version": 1, "versionNonce": 300011, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "loaders_t", "type": "text"}, {"id": "vers_loaders", "type": "arrow"}, {"id": "calc_a1", "type": "arrow"}, {"id": "calc_a4", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "loaders_t", "x": 610, "y": 249, "width": 660, "height": 20,
      "text": "core/loaders — DuckDBQuery : c15() · r151() · r15() · releves_harmonises()",
      "originalText": "core/loaders — DuckDBQuery : c15() · r151() · r15() · releves_harmonises()",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300012, "version": 1, "versionNonce": 300013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "loaders", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "p_historique", "x": 790, "y": 320, "width": 300, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300014, "version": 1, "versionNonce": 300015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "p_historique_t", "type": "text"}, {"id": "calc_a1", "type": "arrow"}, {"id": "calc_a2", "type": "arrow"}, {"id": "calc_a3", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "p_historique_t", "x": 800, "y": 330, "width": 280, "height": 38,
      "text": "pipeline_historique\névénements C15 enrichis", "originalText": "pipeline_historique\névénements C15 enrichis",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300016, "version": 1, "versionNonce": 300017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "p_historique", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "p_abonnements", "x": 640, "y": 415, "width": 270, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300018, "version": 1, "versionNonce": 300019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "p_abonnements_t", "type": "text"}, {"id": "calc_a2", "type": "arrow"}, {"id": "calc_a5", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "p_abonnements_t", "x": 650, "y": 425, "width": 250, "height": 38,
      "text": "pipeline_abonnements\npériodes + turpe fixe", "originalText": "pipeline_abonnements\npériodes + turpe fixe",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300020, "version": 1, "versionNonce": 300021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "p_abonnements", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "p_energie", "x": 980, "y": 415, "width": 270, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300022, "version": 1, "versionNonce": 300023, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "p_energie_t", "type": "text"}, {"id": "calc_a3", "type": "arrow"}, {"id": "calc_a4", "type": "arrow"}, {"id": "calc_a6", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "p_energie_t", "x": 990, "y": 425, "width": 250, "height": 38,
      "text": "pipeline_energie\ncadrans + turpe variable", "originalText": "pipeline_energie\ncadrans + turpe variable",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300024, "version": 1, "versionNonce": 300025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "p_energie", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "p_facturation", "x": 790, "y": 510, "width": 300, "height": 60,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300026, "version": 1, "versionNonce": 300027, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "p_facturation_t", "type": "text"}, {"id": "calc_a5", "type": "arrow"}, {"id": "calc_a6", "type": "arrow"}, {"id": "calc_a7", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "p_facturation_t", "x": 800, "y": 520, "width": 280, "height": 40,
      "text": "pipeline_facturation\nagrégation mensuelle par PDL", "originalText": "pipeline_facturation\nagrégation mensuelle par PDL",
      "fontSize": 13, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300028, "version": 1, "versionNonce": 300029, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "p_facturation", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "builds", "x": 760, "y": 605, "width": 360, "height": 52,
      "strokeColor": "#1e3a5f", "backgroundColor": "#93c5fd", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300030, "version": 1, "versionNonce": 300031, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "builds_t", "type": "text"}, {"id": "calc_a7", "type": "arrow"}, {"id": "vers_api", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "builds_t", "x": 770, "y": 615, "width": 340, "height": 32,
      "text": "builds.contexte_du_mois()\n→ ContexteMensuel (bundle des 4 frames)", "originalText": "builds.contexte_du_mois()\n→ ContexteMensuel (bundle des 4 frames)",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300032, "version": 1, "versionNonce": 300033, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "builds", "lineHeight": 1.3
    },
    {
      "type": "arrow", "id": "calc_a1", "x": 940, "y": 283, "width": 0, "height": 33,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300034, "version": 1, "versionNonce": 300035, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 33]],
      "startBinding": {"elementId": "loaders", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_historique", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "calc_a2", "x": 860, "y": 376, "width": 85, "height": 35,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300036, "version": 1, "versionNonce": 300037, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [-85, 35]],
      "startBinding": {"elementId": "p_historique", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_abonnements", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "calc_a3", "x": 1020, "y": 376, "width": 95, "height": 35,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300038, "version": 1, "versionNonce": 300039, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [95, 35]],
      "startBinding": {"elementId": "p_historique", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_energie", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "calc_a4", "x": 1180, "y": 283, "width": 0, "height": 128,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300040, "version": 1, "versionNonce": 300041, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 128]],
      "startBinding": {"elementId": "loaders", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_energie", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "text", "id": "calc_a4_label", "x": 1196, "y": 335, "width": 80, "height": 18,
      "text": "relevés", "originalText": "relevés",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300042, "version": 1, "versionNonce": 300043, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "arrow", "id": "calc_a5", "x": 775, "y": 471, "width": 85, "height": 35,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300044, "version": 1, "versionNonce": 300045, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [85, 35]],
      "startBinding": {"elementId": "p_abonnements", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_facturation", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "calc_a6", "x": 1115, "y": 471, "width": 95, "height": 35,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300046, "version": 1, "versionNonce": 300047, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [-95, 35]],
      "startBinding": {"elementId": "p_energie", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "p_facturation", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "calc_a7", "x": 940, "y": 570, "width": 0, "height": 31,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300048, "version": 1, "versionNonce": 300049, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 31]],
      "startBinding": {"elementId": "p_facturation", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "builds", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "text", "id": "calc_note", "x": 600, "y": 676, "width": 640, "height": 18,
      "text": "Pandera @pa.check_types à chaque frontière · aucun import Odoo ici (ADR-0016)",
      "originalText": "Pandera @pa.check_types à chaque frontière · aucun import Odoo ici (ADR-0016)",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300050, "version": 1, "versionNonce": 300051, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "arrow", "id": "vers_loaders", "x": 370, "y": 560, "width": 230, "height": -301,
      "strokeColor": "#047857", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 300052, "version": 1, "versionNonce": 300053, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [180, 0], [180, -301], [230, -301]],
      "startBinding": {"elementId": "duckdb", "focus": 0, "gap": 6},
      "endBinding": {"elementId": "loaders", "focus": 0, "gap": 6},
      "startArrowhead": null, "endArrowhead": "arrow"
    },

    {
      "type": "rectangle", "id": "salle_acces", "x": 1360, "y": 150, "width": 600, "height": 560,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400001, "version": 1, "versionNonce": 400002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "salle_acces_titre", "x": 1380, "y": 165, "width": 480, "height": 26,
      "text": "3 · ACCÈS — api/ + bot/ (le hub)", "originalText": "3 · ACCÈS — api/ + bot/ (le hub)",
      "fontSize": 20, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400003, "version": 1, "versionNonce": 400004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "salle_acces_st", "x": 1380, "y": 196, "width": 560, "height": 20,
      "text": "ADR-0009 : tout passe par l'API — le bot est un client comme les autres",
      "originalText": "ADR-0009 : tout passe par l'API — le bot est un client comme les autres",
      "fontSize": 13, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400005, "version": 1, "versionNonce": 400006, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "api_box", "x": 1500, "y": 235, "width": 320, "height": 80,
      "strokeColor": "#1e3a5f", "backgroundColor": "#93c5fd", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400010, "version": 1, "versionNonce": 400011, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "api_box_t", "type": "text"}, {"id": "vers_api", "type": "arrow"}, {"id": "acc_a1", "type": "arrow"}, {"id": "acc_a2", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "api_box_t", "x": 1510, "y": 245, "width": 300, "height": 40,
      "text": "FastAPI :8001 — le hub\nauth X-API-Key", "originalText": "FastAPI :8001 — le hub\nauth X-API-Key",
      "fontSize": 14, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400012, "version": 1, "versionNonce": 400013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "api_box", "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "endpoints_chip", "x": 1380, "y": 355, "width": 270, "height": 130,
      "strokeColor": "#1e293b", "backgroundColor": "#1e293b", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400014, "version": 1, "versionNonce": 400015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "acc_a1", "type": "arrow"}, {"id": "acc_a3", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "endpoints_chip_t", "x": 1393, "y": 365, "width": 246, "height": 106,
      "text": "GET  /health\nGET  /flux/{table}\nPOST /ingestion/run {mode}\nGET  /ingestion/jobs\nGET  /taxes/accise/….xlsx\nGET  /facturation/check/odoo",
      "originalText": "GET  /health\nGET  /flux/{table}\nPOST /ingestion/run {mode}\nGET  /ingestion/jobs\nGET  /taxes/accise/….xlsx\nGET  /facturation/check/odoo",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#22c55e", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400016, "version": 1, "versionNonce": 400017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.45
    },
    {
      "type": "rectangle", "id": "bot_box", "x": 1690, "y": 355, "width": 250, "height": 52,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400018, "version": 1, "versionNonce": 400019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "bot_box_t", "type": "text"}, {"id": "acc_a2", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "bot_box_t", "x": 1700, "y": 365, "width": 230, "height": 32,
      "text": "bot Telegram\nin-process (lifespan API)", "originalText": "bot Telegram\nin-process (lifespan API)",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400020, "version": 1, "versionNonce": 400021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "bot_box", "lineHeight": 1.3
    },
    {
      "type": "rectangle", "id": "bot_chip", "x": 1690, "y": 432, "width": 250, "height": 130,
      "strokeColor": "#1e293b", "backgroundColor": "#1e293b", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400022, "version": 1, "versionNonce": 400023, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "bot_chip_t", "x": 1703, "y": 442, "width": 226, "height": 106,
      "text": "/ingestion  All·Test·Rebuild·Resync\n/flux  stats · export XLSX\n/perimetre  entrées·sorties\n/taxes  accise · CTA\n/facturation  docs · check\n🚨 alerte si job failed",
      "originalText": "/ingestion  All·Test·Rebuild·Resync\n/flux  stats · export XLSX\n/perimetre  entrées·sorties\n/taxes  accise · CTA\n/facturation  docs · check\n🚨 alerte si job failed",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#93c5fd", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400024, "version": 1, "versionNonce": 400025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.45
    },
    {
      "type": "rectangle", "id": "services_box", "x": 1380, "y": 545, "width": 270, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400026, "version": 1, "versionNonce": 400027, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "services_box_t", "type": "text"}, {"id": "acc_a3", "type": "arrow"}, {"id": "vers_odoo", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "services_box_t", "x": 1390, "y": 555, "width": 250, "height": 32,
      "text": "api/services\nfacturation · taxes · ingestion · duckdb", "originalText": "api/services\nfacturation · taxes · ingestion · duckdb",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400028, "version": 1, "versionNonce": 400029, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "services_box", "lineHeight": 1.3
    },
    {
      "type": "text", "id": "bot_note", "x": 1690, "y": 580, "width": 250, "height": 36,
      "text": "zéro logique métier côté bot\n(test_bot_topology.py)",
      "originalText": "zéro logique métier côté bot\n(test_bot_topology.py)",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400030, "version": 1, "versionNonce": 400031, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.3
    },
    {
      "type": "text", "id": "etlrun_note", "x": 1380, "y": 640, "width": 560, "height": 18,
      "text": "POST /ingestion/run → subprocess python -m electricore.ingestion — suivi via /ingestion/jobs",
      "originalText": "POST /ingestion/run → subprocess python -m electricore.ingestion — suivi via /ingestion/jobs",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400032, "version": 1, "versionNonce": 400033, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "arrow", "id": "acc_a1", "x": 1515, "y": 315, "width": 0, "height": 36,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400034, "version": 1, "versionNonce": 400035, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 36]],
      "startBinding": {"elementId": "api_box", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "endpoints_chip", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "acc_a2", "x": 1815, "y": 355, "width": 0, "height": -36,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400036, "version": 1, "versionNonce": 400037, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, -36]],
      "startBinding": {"elementId": "bot_box", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "api_box", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "acc_a3", "x": 1515, "y": 485, "width": 0, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400038, "version": 1, "versionNonce": 400039, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 56]],
      "startBinding": {"elementId": "endpoints_chip", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "services_box", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "vers_api", "x": 1120, "y": 631, "width": 380, "height": -356,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 400040, "version": 1, "versionNonce": 400041, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [210, 0], [210, -356], [380, -356]],
      "startBinding": {"elementId": "builds", "focus": 0, "gap": 6},
      "endBinding": {"elementId": "api_box", "focus": 0, "gap": 6},
      "startArrowhead": null, "endArrowhead": "arrow"
    },

    {
      "type": "rectangle", "id": "salle_erp", "x": 1360, "y": 770, "width": 600, "height": 310,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500001, "version": 1, "versionNonce": 500002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "salle_erp_titre", "x": 1380, "y": 785, "width": 480, "height": 26,
      "text": "5 · ERP — integrations/odoo", "originalText": "5 · ERP — integrations/odoo",
      "fontSize": 20, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500003, "version": 1, "versionNonce": 500004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "salle_erp_st", "x": 1380, "y": 816, "width": 560, "height": 20,
      "text": "l'adaptateur vit hors du core (ADR-0016), consommé par api/services",
      "originalText": "l'adaptateur vit hors du core (ADR-0016), consommé par api/services",
      "fontSize": 13, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500005, "version": 1, "versionNonce": 500006, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "rectangle", "id": "odoo_chip", "x": 1380, "y": 855, "width": 340, "height": 112,
      "strokeColor": "#1e293b", "backgroundColor": "#1e293b", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500010, "version": 1, "versionNonce": 500011, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "odoo_chip_t", "x": 1393, "y": 865, "width": 314, "height": 90,
      "text": "odoo.query('sale.order',\n  domain=[('x_pdl','!=',False)])\n .follow('invoice_ids')\n .filter(pl.col('amount_total')>100)\n .collect()  # DataFrame Polars",
      "originalText": "odoo.query('sale.order',\n  domain=[('x_pdl','!=',False)])\n .follow('invoice_ids')\n .filter(pl.col('amount_total')>100)\n .collect()  # DataFrame Polars",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#93c5fd", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500012, "version": 1, "versionNonce": 500013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.45
    },
    {
      "type": "rectangle", "id": "reader_box", "x": 1750, "y": 855, "width": 200, "height": 60,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500014, "version": 1, "versionNonce": 500015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "reader_box_t", "type": "text"}, {"id": "vers_odoo", "type": "arrow"}, {"id": "erp_a1", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "reader_box_t", "x": 1760, "y": 865, "width": 180, "height": 32,
      "text": "OdooReader · OdooQuery\nOdooWriter", "originalText": "OdooReader · OdooQuery\nOdooWriter",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500016, "version": 1, "versionNonce": 500017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "reader_box", "lineHeight": 1.3
    },
    {
      "type": "ellipse", "id": "odoo_erp", "x": 1750, "y": 975, "width": 200, "height": 64,
      "strokeColor": "#c2410c", "backgroundColor": "#fed7aa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500018, "version": 1, "versionNonce": 500019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "odoo_erp_t", "type": "text"}, {"id": "erp_a1", "type": "arrow"}],
      "link": null, "locked": false
    },
    {
      "type": "text", "id": "odoo_erp_t", "x": 1780, "y": 991, "width": 140, "height": 32,
      "text": "Odoo ERP\nXML-RPC", "originalText": "Odoo ERP\nXML-RPC",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500020, "version": 1, "versionNonce": 500021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "odoo_erp", "lineHeight": 1.3
    },
    {
      "type": "arrow", "id": "erp_a1", "x": 1850, "y": 915, "width": 0, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500022, "version": 1, "versionNonce": 500023, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 56]],
      "startBinding": {"elementId": "reader_box", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "odoo_erp", "focus": 0, "gap": 4},
      "startArrowhead": "arrow", "endArrowhead": "arrow"
    },
    {
      "type": "text", "id": "erp_note", "x": 1380, "y": 995, "width": 340, "height": 36,
      "text": "le core n'importe jamais Odoo — schémas\nPandera FactureOdoo, CommandeVenteOdoo",
      "originalText": "le core n'importe jamais Odoo — schémas\nPandera FactureOdoo, CommandeVenteOdoo",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500024, "version": 1, "versionNonce": 500025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.3
    },
    {
      "type": "arrow", "id": "vers_odoo", "x": 1515, "y": 601, "width": 335, "height": 245,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 500026, "version": 1, "versionNonce": 500027, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 139], [335, 139], [335, 245]],
      "startBinding": {"elementId": "services_box", "focus": 0, "gap": 6},
      "endBinding": {"elementId": "reader_box", "focus": 0, "gap": 6},
      "startArrowhead": null, "endArrowhead": "arrow"
    },

    {
      "type": "rectangle", "id": "salle_deploy", "x": 40, "y": 770, "width": 1260, "height": 310,
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600001, "version": 1, "versionNonce": 600002, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "salle_deploy_titre", "x": 60, "y": 785, "width": 640, "height": 26,
      "text": "4 · DÉPLOIEMENT — VPS, docker compose (ADR-0011)",
      "originalText": "4 · DÉPLOIEMENT — VPS, docker compose (ADR-0011)",
      "fontSize": 20, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#1e40af", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600003, "version": 1, "versionNonce": 600004, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "text", "id": "salle_deploy_st", "x": 60, "y": 816, "width": 680, "height": 20,
      "text": "une image ghcr unique, trois conteneurs, un volume — 1 client = 1 stack (ADR-0015)",
      "originalText": "une image ghcr unique, trois conteneurs, un volume — 1 client = 1 stack (ADR-0015)",
      "fontSize": 13, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600005, "version": 1, "versionNonce": 600006, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.25
    },
    {
      "type": "ellipse", "id": "internet", "x": 60, "y": 855, "width": 160, "height": 56,
      "strokeColor": "#c2410c", "backgroundColor": "#fed7aa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600010, "version": 1, "versionNonce": 600011, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "internet_t", "type": "text"}, {"id": "dep_a1", "type": "arrow"}],
      "link": null, "locked": false
    },
    {
      "type": "text", "id": "internet_t", "x": 90, "y": 869, "width": 100, "height": 28,
      "text": "Internet\nHTTPS", "originalText": "Internet\nHTTPS",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#374151", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600012, "version": 1, "versionNonce": 600013, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "internet", "lineHeight": 1.2
    },
    {
      "type": "rectangle", "id": "caddy_box", "x": 280, "y": 855, "width": 180, "height": 56,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600014, "version": 1, "versionNonce": 600015, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "caddy_box_t", "type": "text"}, {"id": "dep_a1", "type": "arrow"}, {"id": "dep_a2", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "caddy_box_t", "x": 290, "y": 865, "width": 160, "height": 32,
      "text": "caddy :443\nTLS auto", "originalText": "caddy :443\nTLS auto",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600016, "version": 1, "versionNonce": 600017, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "caddy_box", "lineHeight": 1.3
    },
    {
      "type": "rectangle", "id": "ctn_api", "x": 520, "y": 845, "width": 340, "height": 76,
      "strokeColor": "#1e3a5f", "backgroundColor": "#3b82f6", "fillStyle": "solid",
      "strokeWidth": 3, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600018, "version": 1, "versionNonce": 600019, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "ctn_api_t", "type": "text"}, {"id": "dep_a2", "type": "arrow"}, {"id": "dep_a3", "type": "arrow"}, {"id": "dep_a4", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "ctn_api_t", "x": 530, "y": 855, "width": 320, "height": 32,
      "text": "electricore-api — uvicorn :8001\n= API + bot + core + jobs d'ingestion", "originalText": "electricore-api — uvicorn :8001\n= API + bot + core + jobs d'ingestion",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600020, "version": 1, "versionNonce": 600021, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "ctn_api", "lineHeight": 1.3
    },
    {
      "type": "rectangle", "id": "ctn_etl", "x": 920, "y": 845, "width": 340, "height": 76,
      "strokeColor": "#1e3a5f", "backgroundColor": "#60a5fa", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600022, "version": 1, "versionNonce": 600023, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "ctn_etl_t", "type": "text"}, {"id": "dep_a3", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "ctn_etl_t", "x": 930, "y": 855, "width": 320, "height": 32,
      "text": "electricore-ingestion — supercronic\nne calcule rien : il curl l'API", "originalText": "electricore-ingestion — supercronic\nne calcule rien : il curl l'API",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#ffffff", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600024, "version": 1, "versionNonce": 600025, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "ctn_etl", "lineHeight": 1.3
    },
    {
      "type": "rectangle", "id": "volume_box", "x": 520, "y": 965, "width": 340, "height": 54,
      "strokeColor": "#047857", "backgroundColor": "#a7f3d0", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600026, "version": 1, "versionNonce": 600027, "isDeleted": false,
      "groupIds": [], "boundElements": [{"id": "volume_box_t", "type": "text"}, {"id": "dep_a4", "type": "arrow"}],
      "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "volume_box_t", "x": 530, "y": 975, "width": 320, "height": 32,
      "text": "volume duckdb_data\nla base vit ici, partagée api ⟷ ingestion", "originalText": "volume duckdb_data\nla base vit ici, partagée api ⟷ ingestion",
      "fontSize": 12, "fontFamily": 3, "textAlign": "center", "verticalAlign": "middle",
      "strokeColor": "#047857", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600028, "version": 1, "versionNonce": 600029, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": "volume_box", "lineHeight": 1.3
    },
    {
      "type": "rectangle", "id": "cron_chip", "x": 920, "y": 965, "width": 360, "height": 84,
      "strokeColor": "#1e293b", "backgroundColor": "#1e293b", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600030, "version": 1, "versionNonce": 600031, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": {"type": 3}
    },
    {
      "type": "text", "id": "cron_chip_t", "x": 933, "y": 975, "width": 334, "height": 54,
      "text": "0 2 * * *   POST /ingestion/run {'mode':'all'}\n30 3 * * *  backup_duckdb.sh → /backups",
      "originalText": "0 2 * * *   POST /ingestion/run {'mode':'all'}\n30 3 * * *  backup_duckdb.sh → /backups",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#22c55e", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600032, "version": 1, "versionNonce": 600033, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.45
    },
    {
      "type": "text", "id": "ghcr_note", "x": 60, "y": 965, "width": 320, "height": 54,
      "text": "image unique :\nghcr.io/energie-de-nantes/electricore\nCI GitHub → release → pull sur le VPS",
      "originalText": "image unique :\nghcr.io/energie-de-nantes/electricore\nCI GitHub → release → pull sur le VPS",
      "fontSize": 12, "fontFamily": 3, "textAlign": "left", "verticalAlign": "top",
      "strokeColor": "#64748b", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600034, "version": 1, "versionNonce": 600035, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "containerId": null, "lineHeight": 1.3
    },
    {
      "type": "arrow", "id": "dep_a1", "x": 224, "y": 883, "width": 50, "height": 0,
      "strokeColor": "#c2410c", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600036, "version": 1, "versionNonce": 600037, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [50, 0]],
      "startBinding": {"elementId": "internet", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "caddy_box", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "dep_a2", "x": 464, "y": 883, "width": 52, "height": 0,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600038, "version": 1, "versionNonce": 600039, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [52, 0]],
      "startBinding": {"elementId": "caddy_box", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "ctn_api", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "dep_a3", "x": 916, "y": 883, "width": 52, "height": 0,
      "strokeColor": "#1e3a5f", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600040, "version": 1, "versionNonce": 600041, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [-52, 0]],
      "startBinding": {"elementId": "ctn_etl", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "ctn_api", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    },
    {
      "type": "arrow", "id": "dep_a4", "x": 690, "y": 921, "width": 0, "height": 40,
      "strokeColor": "#047857", "backgroundColor": "transparent", "fillStyle": "solid",
      "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0,
      "seed": 600042, "version": 1, "versionNonce": 600043, "isDeleted": false,
      "groupIds": [], "boundElements": null, "link": null, "locked": false,
      "points": [[0, 0], [0, 40]],
      "startBinding": {"elementId": "ctn_api", "focus": 0, "gap": 4},
      "endBinding": {"elementId": "volume_box", "focus": 0, "gap": 4},
      "startArrowhead": null, "endArrowhead": "arrow"
    }
  ]
}
