<mxfile host="app.diagrams.net" agent="architecture-deliverables" version="24.0.0">
  <diagram name="Multi-Device Linking and Synchronisation" id="13-multi-device-sync">
    <mxGraphModel dx="1400" dy="900" background="#ffffff" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="940" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="n.pri" value="&lt;b&gt;Primary Device&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#1a2b45;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="60" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.cmp" value="&lt;b&gt;Companion Device&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#1a2b45;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="270" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.gw" value="&lt;b&gt;Edge Gateway&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#1a2b45;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="490" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.dev" value="&lt;b&gt;Device Service&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#1a2b45;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="710" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.kd" value="&lt;b&gt;Key Distribution&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#e1d5e7;strokeColor=#9673a6;fontColor=#3a2b44;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="920" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.ch" value="&lt;b&gt;Chat Service&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#1a2b45;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="1140" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="n.peer" value="&lt;b&gt;Peer Device&lt;/b&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;collapsible=0;recursiveResize=0;outlineConnect=0;size=58;rounded=1;arcSize=8;fillColor=#f5f5f5;strokeColor=#8c8c8c;fontColor=#333333;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="1350" y="80" width="190" height="740" as="geometry" />
        </mxCell>
        <mxCell id="_m1" value="1. generate its own identity key pair" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.1243;exitDx=0;exitDy=0;entryX=0.5;entryY=0.1568;entryDx=0;entryDy=0;align=left;spacingLeft=6;" edge="1" parent="1" source="n.cmp" target="n.cmp">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="450" y="170" />
              <mxPoint x="450" y="200" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="_m2" value="2. request linking nonce" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.1946;exitDx=0;exitDy=0;entryX=0.5;entryY=0.1946;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cmp" target="n.gw">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m3" value="3. issue challenge, 60 s TTL" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.2486;exitDx=0;exitDy=0;entryX=0.5;entryY=0.2486;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.gw" target="n.dev">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m4" value="4. QR payload" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#5a6570;exitX=0.5;exitY=0.3027;exitDx=0;exitDy=0;entryX=0.5;entryY=0.3027;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.dev" target="n.cmp">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m5" value="5. scan QR, verify nonce and fingerprint" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.3568;exitDx=0;exitDy=0;entryX=0.5;entryY=0.3892;entryDx=0;entryDy=0;align=left;spacingLeft=6;" edge="1" parent="1" source="n.pri" target="n.pri">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="230" y="350" />
              <mxPoint x="230" y="370" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="_m6" value="6. authorise device, signed by account identity" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.4270;exitDx=0;exitDy=0;entryX=0.5;entryY=0.4270;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.pri" target="n.dev">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m7" value="7. register companion identity and prekeys" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.4811;exitDx=0;exitDy=0;entryX=0.5;entryY=0.4811;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.dev" target="n.kd">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m8" value="8. encrypted history bundle" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.5351;exitDx=0;exitDy=0;entryX=0.5;entryY=0.5351;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.pri" target="n.cmp">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m9" value="9. backlog from its own device inbox" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.5892;exitDx=0;exitDy=0;entryX=0.5;entryY=0.5892;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ch" target="n.cmp">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m10" value="10. new message, one ciphertext per device" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.6432;exitDx=0;exitDy=0;entryX=0.5;entryY=0.6432;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.peer" target="n.ch">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m11" value="11. deliver device copy" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.6973;exitDx=0;exitDy=0;entryX=0.5;entryY=0.6973;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ch" target="n.pri">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m12" value="12. deliver device copy" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.7514;exitDx=0;exitDy=0;entryX=0.5;entryY=0.7514;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ch" target="n.cmp">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m13" value="13. read receipt" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;strokeColor=#5a6570;exitX=0.5;exitY=0.8054;exitDx=0;exitDy=0;entryX=0.5;entryY=0.8054;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cmp" target="n.ch">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m14" value="14. sync read state across devices" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=open;endFill=0;dashed=1;strokeColor=#d79b00;exitX=0.5;exitY=0.8595;exitDx=0;exitDy=0;entryX=0.5;entryY=0.8595;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ch" target="n.pri">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m15" value="15. revoke device, rotate sender keys" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;strokeWidth=1.4;fontSize=10;fontColor=#42536a;labelBackgroundColor=#ffffff;fontFamily=Segoe UI;verticalAlign=bottom;endArrow=block;endFill=1;dashed=1;strokeColor=#b85450;fontColor=#b85450;exitX=0.5;exitY=0.9135;exitDx=0;exitDy=0;entryX=0.5;entryY=0.9135;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.pri" target="n.dev">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="title" value="Multi-Device Linking and Synchronisation" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=20;fontStyle=1;fontColor=#16202c;fontFamily=Segoe UI;" vertex="1" parent="1">
          <mxGeometry x="40" y="20" width="1510" height="30" as="geometry" />
        </mxCell>
        <mxCell id="rule" value="" style="line;strokeWidth=1;html=1;strokeColor=#c9d3de;" vertex="1" parent="1">
          <mxGeometry x="40" y="50" width="1510" height="10" as="geometry" />
        </mxCell>
        <mxCell id="note" value="Each device is an independent Signal session; the primary device is not a relay." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=10;fontColor=#8a97a5;fontFamily=Segoe UI;" vertex="1" parent="1">
          <mxGeometry x="40" y="870" width="1510" height="20" as="geometry" />
        </mxCell>
        <mxCell id="foot-rule" value="" style="line;strokeWidth=1;html=1;strokeColor=#e3e9ef;" vertex="1" parent="1">
          <mxGeometry x="40" y="890" width="1510" height="10" as="geometry" />
        </mxCell>
        <mxCell id="foot" value="v 1.0   ·   owner Platform Architecture   ·   date 2026-08" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=9;fontColor=#9aa7b4;fontFamily=Segoe UI;" vertex="1" parent="1">
          <mxGeometry x="40" y="900" width="1510" height="10" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
