<mxfile host="app.diagrams.net" agent="architecture-deliverables" version="24.0.0">
  <diagram name="Registration &amp; Device Onboarding" id="05-identity-registration">
    <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="1560" pageHeight="990" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="n.u" value="&lt;b&gt;User&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=#08427b;strokeColor=#073b6f;fontColor=#ffffff;fontSize=12;fontFamily=Segoe UI;verticalAlign=top;spacingTop=9;" vertex="1" parent="1">
          <mxGeometry x="60" y="80" width="180" height="790" as="geometry" />
        </mxCell>
        <mxCell id="n.cl" value="&lt;b&gt;Client App&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="180" height="790" 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="480" y="80" width="180" height="790" as="geometry" />
        </mxCell>
        <mxCell id="n.ac" value="&lt;b&gt;Account 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="690" y="80" width="180" height="790" as="geometry" />
        </mxCell>
        <mxCell id="n.ot" value="&lt;b&gt;OTP Provider&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="900" y="80" width="180" height="790" 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="1110" y="80" width="180" height="790" as="geometry" />
        </mxCell>
        <mxCell id="n.cd" value="&lt;b&gt;Contact Discovery&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="1320" y="80" width="180" height="790" as="geometry" />
        </mxCell>
        <mxCell id="_m1" value="1. enter phone number" 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.1165;exitDx=0;exitDy=0;entryX=0.5;entryY=0.1165;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.u" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m2" value="2. register(E.164, device pubkey)" 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.1671;exitDx=0;exitDy=0;entryX=0.5;entryY=0.1671;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cl" target="n.gw">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m3" value="3. create pending account" 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.2177;exitDx=0;exitDy=0;entryX=0.5;entryY=0.2177;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.gw" target="n.ac">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m4" value="4. rate limit by number, IP, device" 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.2684;exitDx=0;exitDy=0;entryX=0.5;entryY=0.2987;entryDx=0;entryDy=0;align=left;spacingLeft=6;" edge="1" parent="1" source="n.ac" target="n.ac">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="860" y="290" />
              <mxPoint x="860" y="320" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="_m5" value="5. send 6-digit code" 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.3342;exitDx=0;exitDy=0;entryX=0.5;entryY=0.3342;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ac" target="n.ot">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m6" value="6. SMS or voice call" 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.3848;exitDx=0;exitDy=0;entryX=0.5;entryY=0.3848;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ot" target="n.u">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m7" value="7. enter code" 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.4354;exitDx=0;exitDy=0;entryX=0.5;entryY=0.4354;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.u" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m8" value="8. verify(code, attestation)" 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.4861;exitDx=0;exitDy=0;entryX=0.5;entryY=0.4861;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cl" target="n.ac">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m9" value="9. check SIM-swap signals" 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.5367;exitDx=0;exitDy=0;entryX=0.5;entryY=0.5671;entryDx=0;entryDy=0;align=left;spacingLeft=6;" edge="1" parent="1" source="n.ac" target="n.ac">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="860" y="510" />
              <mxPoint x="860" y="530" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="_m10" value="10. account id + device token" 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.6025;exitDx=0;exitDy=0;entryX=0.5;entryY=0.6025;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ac" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m11" value="11. generate 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.6532;exitDx=0;exitDy=0;entryX=0.5;entryY=0.6835;entryDx=0;entryDy=0;align=left;spacingLeft=6;" edge="1" parent="1" source="n.cl" target="n.cl">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="440" y="600" />
              <mxPoint x="440" y="620" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="_m12" value="12. publish identity, signed prekey, 100 one-time 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.7190;exitDx=0;exitDy=0;entryX=0.5;entryY=0.7190;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cl" target="n.kd">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m13" value="13. registration complete" 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.7696;exitDx=0;exitDy=0;entryX=0.5;entryY=0.7696;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.kd" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m14" value="14. upload hashed address book" 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.8203;exitDx=0;exitDy=0;entryX=0.5;entryY=0.8203;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cl" target="n.cd">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m15" value="15. registered contacts, privacy filtered" 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.8709;exitDx=0;exitDy=0;entryX=0.5;entryY=0.8709;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.cd" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="_m16" value="16. re-registration lockout if number reused" 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.9215;exitDx=0;exitDy=0;entryX=0.5;entryY=0.9215;entryDx=0;entryDy=0;" edge="1" parent="1" source="n.ac" target="n.cl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="title" value="Registration &amp; Device Onboarding" 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="1470" 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="1470" height="10" as="geometry" />
        </mxCell>
        <mxCell id="note" value="Private keys never leave the device. Only public key material reaches Key Distribution." 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="920" width="1470" 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="940" width="1470" 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="950" width="1470" height="10" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
