<mxfile host="app.diagrams.net" version="24.7.17">
  <diagram name="Extrio single-instance architecture" id="extrio-architecture">
    <mxGraphModel dx="1440" dy="900" grid="1" gridSize="10" page="1" pageScale="1" pageWidth="1400" pageHeight="1000" background="#f3f5f0">
      <root>
        <mxCell id="0"/><mxCell id="1" parent="0"/>
        <mxCell id="title" value="EXTRIO / SINGLE-INSTANCE ARCHITECTURE / v0.6 PUBLIC ALPHA" style="text;html=1;fontSize=22;fontStyle=1;fontColor=#24331c;align=left;" vertex="1" parent="1"><mxGeometry x="60" y="30" width="1280" height="50" as="geometry"/></mxCell>
        <mxCell id="web" value="React desktop console&#xa;Review, operation state, evidence" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e4ebde;strokeColor=#80936e;fontSize=16;" vertex="1" parent="1"><mxGeometry x="80" y="110" width="320" height="80" as="geometry"/></mxCell>
        <mxCell id="api" value="FastAPI /api/v1&#xa;Auth, contracts, durable commands" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e4ebde;strokeColor=#80936e;fontSize=16;" vertex="1" parent="1"><mxGeometry x="540" y="110" width="320" height="80" as="geometry"/></mxCell>
        <mxCell id="mcp" value="Governed MCP&#xa;No rule-publication tool" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e4ebde;strokeColor=#80936e;fontSize=16;" vertex="1" parent="1"><mxGeometry x="1030" y="110" width="290" height="80" as="geometry"/></mxCell>
        <mxCell id="worker" value="INDEPENDENT WORKER / Durable job leases" style="swimlane;startSize=42;horizontal=1;fillColor=#e7eee0;swimlaneFillColor=#f3f5f0;strokeColor=#9cac90;fontSize=17;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="60" y="280" width="1280" height="470" as="geometry"/></mxCell>
        <mxCell id="explore" value="Crawl4AI&#xa;Public / authorized page samples" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#cde7e7;strokeColor=#63949a;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="30" y="90" width="280" height="100" as="geometry"/></mxCell>
        <mxCell id="compile" value="Model → RulePlan&#xa;Server validates → GatherSpec" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#cde7e7;strokeColor=#63949a;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="480" y="90" width="280" height="100" as="geometry"/></mxCell>
        <mxCell id="review" value="HUMAN REVIEW&#xa;Ed25519-attested RuleVersion" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#efdbd0;strokeColor=#aa8169;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="930" y="90" width="310" height="100" as="geometry"/></mxCell>
        <mxCell id="frozen" value="Pin rule + attestation&#xa;Verify at API and Worker" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0edc7;strokeColor=#819859;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="30" y="300" width="280" height="100" as="geometry"/></mxCell>
        <mxCell id="runtime" value="Deterministic runtime / NO LLM&#xa;HTTP / Browser, CSS / JSONPath" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0edc7;strokeColor=#819859;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="480" y="300" width="280" height="100" as="geometry"/></mxCell>
        <mxCell id="data" value="Quality gate → Items + lineage&#xa;Checkpoints / Webhook delivery" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0edc7;strokeColor=#819859;fontSize=15;" vertex="1" parent="worker"><mxGeometry x="930" y="300" width="310" height="100" as="geometry"/></mxCell>
        <mxCell id="store" value="SHARED PERSISTENCE&#xa;SQLite / PostgreSQL · Durable state and job leases · File evidence and key material" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e4ebde;strokeColor=#80936e;fontSize=16;" vertex="1" parent="1"><mxGeometry x="160" y="840" width="1080" height="80" as="geometry"/></mxCell>
        <mxCell id="note" value="Current implementation, not a distributed or multi-tenant production claim. Human approval is a control-plane action, not an autonomous Worker capability." style="text;whiteSpace=wrap;fontSize=12;fontColor=#647356;align=left;" vertex="1" parent="1"><mxGeometry x="60" y="940" width="1280" height="35" as="geometry"/></mxCell>
        <mxCell id="e1" edge="1" parent="1" source="web" target="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e2" edge="1" parent="1" source="api" target="worker" value="202 Accepted / queued operation" style="edgeStyle=orthogonalEdgeStyle;rounded=0;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e3" edge="1" parent="worker" source="explore" target="compile" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e4" edge="1" parent="worker" source="compile" target="review" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e5" edge="1" parent="worker" source="review" target="frozen" style="edgeStyle=orthogonalEdgeStyle;exitX=0.5;exitY=1;entryX=0.5;entryY=0;strokeColor=#a3816c;endArrow=block;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1085" y="240"/><mxPoint x="170" y="240"/></Array></mxGeometry></mxCell>
        <mxCell id="e6" edge="1" parent="worker" source="frozen" target="runtime" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e7" edge="1" parent="worker" source="runtime" target="data" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#76856a;endArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e8" edge="1" parent="1" source="worker" target="store" style="edgeStyle=orthogonalEdgeStyle;strokeColor=#76856a;endArrow=block;startArrow=block;"><mxGeometry relative="1" as="geometry"/></mxCell>
        <mxCell id="e9" edge="1" parent="1" source="mcp" target="store" style="edgeStyle=orthogonalEdgeStyle;exitX=1;exitY=0.5;entryX=1;entryY=0.5;strokeColor=#76856a;endArrow=block;dashed=1;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1380" y="150"/><mxPoint x="1380" y="880"/></Array></mxGeometry></mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
