<?xml version='1.0' encoding='ascii'?>
<mxfile host="Electron" type="device"><diagram name="Mobile" id="mobile"><mxGraphModel grid="0" page="0" background="#ffffff" adaptiveColors="none"><root><mxCell id="0" /><mxCell id="1" parent="0" /><mxCell id="2" value="A blocked edit prevents overlap" style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;fillColor=#eef5fc;strokeColor=#0f6cbd;strokeWidth=2;spacing=8;shape=label;fillColor=#ffffff;strokeColor=none;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="0" width="300" height="48" /></mxCell><mxCell id="3" value="Session A&#10;Edits service.py&#10;Leaves it uncommitted" style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;fillColor=#eef5fc;strokeColor=#0f6cbd;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="65" width="300" height="90" /></mxCell><mxCell id="4" value="Session B, its own worktree&#10;Tries to edit service.py" style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;fillColor=#eef5fc;strokeColor=#0f6cbd;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="200" width="300" height="80" /></mxCell><mxCell id="5" value="then" edge="1" parent="1" source="3" target="4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;labelBackgroundColor=#ffffff;strokeColor=#0f6cbd;strokeWidth=2;endArrow=block;"><mxGeometry as="geometry" relative="1" /></mxCell><mxCell id="6" value="Collision gate: REFUSED&#10;B's tool call never runs.&#10;The message names the holder." style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#a4262c;fillColor=#fde7e9;strokeColor=#a4262c;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="325" width="300" height="100" /></mxCell><mxCell id="7" value="before write" edge="1" parent="1" source="4" target="6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;labelBackgroundColor=#ffffff;strokeColor=#0f6cbd;strokeWidth=2;endArrow=block;"><mxGeometry as="geometry" relative="1" /></mxCell><mxCell id="8" value="Session B&#10;Edits parser.py instead" style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;fillColor=#eef5fc;strokeColor=#0f6cbd;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="470" width="300" height="80" /></mxCell><mxCell id="9" value="choose other work" edge="1" parent="1" source="6" target="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;labelBackgroundColor=#ffffff;strokeColor=#0f6cbd;strokeWidth=2;endArrow=block;"><mxGeometry as="geometry" relative="1" /></mxCell><mxCell id="10" value="Both branches land" style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;fillColor=#eef5fc;strokeColor=#0f6cbd;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="595" width="300" height="65" /></mxCell><mxCell id="11" value="" edge="1" parent="1" source="8" target="10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;fontFamily=Arial;fontSize=16;fontColor=#242424;labelBackgroundColor=#ffffff;strokeColor=#0f6cbd;strokeWidth=2;endArrow=block;"><mxGeometry as="geometry" relative="1" /></mxCell><mxCell id="12" value="Without the gate, both writes can&#10;succeed. The loss surfaces at merge&#10;or later." style="whiteSpace=nowrap;html=0;fontFamily=Arial;fontSize=16;fontColor=#835b00;fillColor=#fff4ce;strokeColor=#835b00;strokeWidth=2;spacing=8;rounded=1;arcSize=8;" vertex="1" parent="1"><mxGeometry as="geometry" x="0" y="695" width="300" height="95" /></mxCell></root></mxGraphModel></diagram></mxfile>