ontoref/assets/web/protocol-flow-light.svg

274 lines
28 KiB
XML
Raw Normal View History

2026-03-13 00:19:51 +00:00
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="578" viewBox="0 0 900 578">
<defs>
<marker id="a" markerWidth="7" markerHeight="5" refX="6" refY="2.5" orient="auto">
<polygon points="0 0,7 2.5,0 5" fill="#64748b"/>
</marker>
<marker id="ab" markerWidth="7" markerHeight="5" refX="6" refY="2.5" orient="auto">
<polygon points="0 0,7 2.5,0 5" fill="#60a5fa"/>
</marker>
<marker id="ao" markerWidth="7" markerHeight="5" refX="6" refY="2.5" orient="auto">
<polygon points="0 0,7 2.5,0 5" fill="#E8A838"/>
</marker>
<marker id="ag" markerWidth="7" markerHeight="5" refX="6" refY="2.5" orient="auto">
<polygon points="0 0,7 2.5,0 5" fill="#4ade80"/>
</marker>
<marker id="ar" markerWidth="7" markerHeight="5" refX="6" refY="2.5" orient="auto">
<polygon points="0 0,7 2.5,0 5" fill="#f87171"/>
</marker>
</defs>
<!-- Background -->
<rect width="900" height="578" fill="#f8fafc"/>
<!-- ══════════════════════════════════════════════════════════════
SECTION 1 — PROTOCOL LAYERS
══════════════════════════════════════════════════════════════ -->
<!-- section label -->
<text x="30" y="20" font-family="'JetBrains Mono',monospace" font-size="8.5" fill="#94a3b8" letter-spacing="2" font-weight="700">PROTOCOL LAYERS</text>
<!-- Left connector spine (dashed) -->
<line x1="31.5" y1="30" x2="31.5" y2="298" stroke="#cbd5e1" stroke-width="1.5" stroke-dasharray="3 3"/>
<!-- ── L1: DECLARATIVE / NICKEL ── y=30 -->
<rect x="28" y="30" width="844" height="40" rx="3" fill="#60a5fa" fill-opacity="0.07" stroke="#60a5fa" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="30" width="3" height="40" rx="1" fill="#60a5fa"/>
<text x="40" y="46" font-family="'JetBrains Mono',monospace" font-size="8" fill="#60a5fa" font-weight="700" letter-spacing="1.5">DECLARATIVE · NICKEL</text>
<text x="40" y="60" font-family="'JetBrains Mono',monospace" font-size="7" fill="#60a5fa" fill-opacity="0.6">type-safe contracts · fails at definition time</text>
<!-- chips -->
<rect x="222" y="36" width="52" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="248" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">.ontology/</text>
<rect x="280" y="36" width="46" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="303" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">adrs/*.ncl</text>
<rect x="332" y="36" width="56" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="360" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">modes/*.ncl</text>
<rect x="394" y="36" width="56" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="422" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">schemas/*.ncl</text>
<rect x="456" y="36" width="40" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="476" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">qa.ncl</text>
<rect x="502" y="36" width="56" height="16" rx="3" fill="#60a5fa" fill-opacity="0.12" stroke="#60a5fa" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="530" y="47" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#60a5fa">config.ncl</text>
<!-- inter-layer arrow + label -->
<line x1="31.5" y1="70" x2="31.5" y2="77" stroke="#60a5fa" stroke-opacity="0.4" stroke-width="1" marker-end="url(#ab)"/>
<text x="42" y="76" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#94a3b8" letter-spacing="0.5">nickel export → JSON</text>
<!-- ── L2: KNOWLEDGE GRAPH ── y=80 -->
<rect x="28" y="80" width="844" height="40" rx="3" fill="#c084fc" fill-opacity="0.07" stroke="#c084fc" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="80" width="3" height="40" rx="1" fill="#c084fc"/>
<text x="40" y="96" font-family="'JetBrains Mono',monospace" font-size="8" fill="#c084fc" font-weight="700" letter-spacing="1.5">KNOWLEDGE GRAPH · .ontology/</text>
<text x="40" y="110" font-family="'JetBrains Mono',monospace" font-size="7" fill="#c084fc" fill-opacity="0.6">self-describing · actor-agnostic · machine-queryable</text>
<!-- chips -->
<rect x="222" y="86" width="42" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="243" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">axioms</text>
<rect x="270" y="86" width="46" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="293" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">tensions</text>
<rect x="322" y="86" width="52" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="348" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">practices</text>
<rect x="380" y="86" width="62" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="411" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">nodes + edges</text>
<rect x="448" y="86" width="50" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="473" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">invariants</text>
<rect x="504" y="86" width="34" height="16" rx="3" fill="#c084fc" fill-opacity="0.12" stroke="#c084fc" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="521" y="97" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#c084fc">gates</text>
<!-- inter-layer arrow -->
<line x1="31.5" y1="120" x2="31.5" y2="127" stroke="#f97316" stroke-opacity="0.4" stroke-width="1" marker-end="url(#ao)"/>
<text x="42" y="126" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#94a3b8" letter-spacing="0.5">reads KG via nickel export</text>
<!-- ── L3: OPERATIONAL / NUSHELL ── y=130 -->
<rect x="28" y="130" width="844" height="40" rx="3" fill="#f97316" fill-opacity="0.07" stroke="#f97316" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="130" width="3" height="40" rx="1" fill="#f97316"/>
<text x="40" y="146" font-family="'JetBrains Mono',monospace" font-size="8" fill="#f97316" font-weight="700" letter-spacing="1.5">OPERATIONAL · NUSHELL</text>
<text x="40" y="160" font-family="'JetBrains Mono',monospace" font-size="7" fill="#f97316" fill-opacity="0.6">16 modules · DAG-validated modes · typed pipelines</text>
<!-- chips -->
<rect x="222" y="136" width="40" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="242" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">adr.nu</text>
<rect x="268" y="136" width="52" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="294" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">backlog.nu</text>
<rect x="326" y="136" width="54" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="353" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">describe.nu</text>
<rect x="386" y="136" width="44" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="408" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">sync.nu</text>
<rect x="436" y="136" width="46" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="459" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">coder.nu</text>
<rect x="488" y="136" width="54" height="16" rx="3" fill="#f97316" fill-opacity="0.12" stroke="#f97316" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="515" y="147" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#f97316">+11 modules</text>
<!-- inter-layer arrow -->
<line x1="31.5" y1="170" x2="31.5" y2="177" stroke="#4ade80" stroke-opacity="0.4" stroke-width="1" marker-end="url(#ag)"/>
<text x="42" y="176" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#94a3b8" letter-spacing="0.5">dispatches command + actor</text>
<!-- ── L4: ENTRY POINT / BASH→NU ── y=180 -->
<rect x="28" y="180" width="844" height="40" rx="3" fill="#4ade80" fill-opacity="0.07" stroke="#4ade80" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="180" width="3" height="40" rx="1" fill="#4ade80"/>
<text x="40" y="196" font-family="'JetBrains Mono',monospace" font-size="8" fill="#4ade80" font-weight="700" letter-spacing="1.5">ENTRY POINT · BASH → NU</text>
<text x="40" y="210" font-family="'JetBrains Mono',monospace" font-size="7" fill="#4ade80" fill-opacity="0.6">actor detect · advisory lock · NICKEL_IMPORT_PATH</text>
<!-- chips -->
<rect x="222" y="186" width="52" height="16" rx="3" fill="#4ade80" fill-opacity="0.12" stroke="#4ade80" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="248" y="197" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#4ade80">./ontoref</text>
<rect x="280" y="186" width="62" height="16" rx="3" fill="#4ade80" fill-opacity="0.12" stroke="#4ade80" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="311" y="197" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#4ade80">actor detect</text>
<rect x="348" y="186" width="64" height="16" rx="3" fill="#4ade80" fill-opacity="0.12" stroke="#4ade80" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="380" y="197" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#4ade80">advisory lock</text>
<rect x="418" y="186" width="62" height="16" rx="3" fill="#4ade80" fill-opacity="0.12" stroke="#4ade80" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="449" y="197" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#4ade80">→ ontoref.nu</text>
<!-- inter-layer arrow -->
<line x1="31.5" y1="220" x2="31.5" y2="227" stroke="#22d3ee" stroke-opacity="0.4" stroke-width="1" marker-end="url(#a)"/>
<text x="42" y="226" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#94a3b8" letter-spacing="0.5">optional · caches · serves · never required</text>
<!-- ── L5: RUNTIME / RUST + axum ── y=230 -->
<rect x="28" y="230" width="844" height="40" rx="3" fill="#22d3ee" fill-opacity="0.07" stroke="#22d3ee" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="230" width="3" height="40" rx="1" fill="#22d3ee"/>
<text x="40" y="246" font-family="'JetBrains Mono',monospace" font-size="8" fill="#22d3ee" font-weight="700" letter-spacing="1.5">RUNTIME · RUST + axum (optional daemon)</text>
<text x="40" y="260" font-family="'JetBrains Mono',monospace" font-size="7" fill="#22d3ee" fill-opacity="0.6">10 UI pages · 19 MCP tools · actor registry · search · SurrealDB?</text>
<!-- chips -->
<rect x="222" y="236" width="76" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="260" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">ontoref-daemon</text>
<rect x="304" y="236" width="56" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="332" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">axum HTTP</text>
<rect x="366" y="236" width="46" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="389" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">MCP ×19</text>
<rect x="418" y="236" width="46" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="441" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">DashMap</text>
<rect x="470" y="236" width="38" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="489" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">search</text>
<rect x="514" y="236" width="56" height="16" rx="3" fill="#22d3ee" fill-opacity="0.12" stroke="#22d3ee" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="542" y="247" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#22d3ee">SurrealDB?</text>
<!-- inter-layer arrow -->
<line x1="31.5" y1="270" x2="31.5" y2="277" stroke="#facc15" stroke-opacity="0.4" stroke-width="1" marker-end="url(#a)"/>
<text x="42" y="276" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#94a3b8" letter-spacing="0.5">configures · ONTOREF_PROJECT_ROOT</text>
<!-- ── L6: ADOPTION ── y=280 -->
<rect x="28" y="280" width="844" height="40" rx="3" fill="#facc15" fill-opacity="0.07" stroke="#facc15" stroke-opacity="0.25" stroke-width="0.8"/>
<rect x="28" y="280" width="3" height="40" rx="1" fill="#facc15"/>
<text x="40" y="296" font-family="'JetBrains Mono',monospace" font-size="8" fill="#facc15" font-weight="700" letter-spacing="1.5">ADOPTION · PER-PROJECT</text>
<text x="40" y="310" font-family="'JetBrains Mono',monospace" font-size="7" fill="#facc15" fill-opacity="0.6">templates/ · one ontoref checkout · zero lock-in</text>
<!-- chips -->
<rect x="222" y="286" width="56" height="16" rx="3" fill="#facc15" fill-opacity="0.12" stroke="#facc15" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="250" y="297" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#facc15">templates/</text>
<rect x="284" y="286" width="74" height="16" rx="3" fill="#facc15" fill-opacity="0.12" stroke="#facc15" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="321" y="297" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#facc15">adopt_ontoref</text>
<rect x="364" y="286" width="108" height="16" rx="3" fill="#facc15" fill-opacity="0.12" stroke="#facc15" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="418" y="297" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#facc15">ONTOREF_PROJECT_ROOT</text>
<rect x="478" y="286" width="62" height="16" rx="3" fill="#facc15" fill-opacity="0.12" stroke="#facc15" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="509" y="297" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#facc15">zero lock-in</text>
<rect x="546" y="286" width="58" height="16" rx="3" fill="#facc15" fill-opacity="0.12" stroke="#facc15" stroke-width="0.5" stroke-opacity="0.4"/>
<text x="575" y="297" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#facc15">plain NCL</text>
<!-- ══════════════════════════════════════════════════════════════
DIVIDER
══════════════════════════════════════════════════════════════ -->
<line x1="28" y1="334" x2="872" y2="334" stroke="#cbd5e1" stroke-width="1"/>
<!-- ══════════════════════════════════════════════════════════════
SECTION 2 — REQUEST FLOWS
══════════════════════════════════════════════════════════════ -->
<text x="30" y="348" font-family="'JetBrains Mono',monospace" font-size="8.5" fill="#94a3b8" letter-spacing="2" font-weight="700">REQUEST FLOWS</text>
<!-- ── FLOW 1: CLI ── -->
<text x="30" y="366" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#64748b">CLI path — developer · agent · CI</text>
<!-- node helper: rounded rect + label + sublabel -->
<!-- Node: Actor -->
<rect x="30" y="372" width="100" height="36" rx="4" fill="#60a5fa" fill-opacity="0.1" stroke="#60a5fa" stroke-opacity="0.5" stroke-width="1"/>
<text x="80" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#60a5fa" font-weight="700">Actor</text>
<text x="80" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#60a5fa" fill-opacity="0.7">dev · agent · CI</text>
<!-- arrow -->
<line x1="130" y1="390" x2="156" y2="390" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: ./ontoref -->
<rect x="158" y="372" width="100" height="36" rx="4" fill="#4ade80" fill-opacity="0.1" stroke="#4ade80" stroke-opacity="0.5" stroke-width="1"/>
<text x="208" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#4ade80" font-weight="700">./ontoref</text>
<text x="208" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#4ade80" fill-opacity="0.7">bash wrapper</text>
<!-- arrow + lock label -->
<line x1="258" y1="390" x2="284" y2="390" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<text x="271" y="387" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="5.5" fill="#94a3b8">lock</text>
<!-- Node: ontoref.nu -->
<rect x="286" y="372" width="100" height="36" rx="4" fill="#f97316" fill-opacity="0.1" stroke="#f97316" stroke-opacity="0.5" stroke-width="1"/>
<text x="336" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#f97316" font-weight="700">ontoref.nu</text>
<text x="336" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#f97316" fill-opacity="0.7">Nu dispatcher</text>
<!-- arrow -->
<line x1="386" y1="390" x2="412" y2="390" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: module.nu -->
<rect x="414" y="372" width="100" height="36" rx="4" fill="#f97316" fill-opacity="0.1" stroke="#f97316" stroke-opacity="0.5" stroke-width="1"/>
<text x="464" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#f97316" font-weight="700">module.nu</text>
<text x="464" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#f97316" fill-opacity="0.7">adr · backlog · etc</text>
<!-- arrow + nickel label -->
<line x1="514" y1="390" x2="540" y2="390" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<text x="527" y="387" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="5.5" fill="#94a3b8">export</text>
<!-- Node: .ontology/ -->
<rect x="542" y="372" width="100" height="36" rx="4" fill="#c084fc" fill-opacity="0.1" stroke="#c084fc" stroke-opacity="0.5" stroke-width="1"/>
<text x="592" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#c084fc" font-weight="700">.ontology/</text>
<text x="592" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#c084fc" fill-opacity="0.7">nickel export</text>
<!-- arrow -->
<line x1="642" y1="390" x2="668" y2="390" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: reflection/ -->
<rect x="670" y="372" width="100" height="36" rx="4" fill="#60a5fa" fill-opacity="0.1" stroke="#60a5fa" stroke-opacity="0.5" stroke-width="1"/>
<text x="720" y="386" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#60a5fa" font-weight="700">reflection/</text>
<text x="720" y="398" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#60a5fa" fill-opacity="0.7">qa.ncl · backlog</text>
<!-- daemon optional branch (dashed, from ontoref.nu node bottom) -->
<line x1="336" y1="408" x2="336" y2="420" stroke="#22d3ee" stroke-opacity="0.35" stroke-width="0.8" stroke-dasharray="3 2"/>
<rect x="286" y="420" width="100" height="22" rx="3" fill="#22d3ee" fill-opacity="0.07" stroke="#22d3ee" stroke-opacity="0.3" stroke-width="0.7"/>
<text x="336" y="435" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#22d3ee" fill-opacity="0.7">daemon? (optional)</text>
<!-- ── FLOW 2: MCP / AI AGENT ── -->
<text x="30" y="462" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#64748b">MCP path — AI agent · Claude Code · any MCP client</text>
<!-- Node: AI Agent -->
<rect x="30" y="468" width="100" height="36" rx="4" fill="#E8A838" fill-opacity="0.1" stroke="#E8A838" stroke-opacity="0.5" stroke-width="1"/>
<text x="80" y="482" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#E8A838" font-weight="700">AI Agent</text>
<text x="80" y="494" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#E8A838" fill-opacity="0.7">Claude · any MCP</text>
<!-- arrow -->
<line x1="130" y1="486" x2="156" y2="486" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: MCP server -->
<rect x="158" y="468" width="110" height="36" rx="4" fill="#22d3ee" fill-opacity="0.1" stroke="#22d3ee" stroke-opacity="0.5" stroke-width="1"/>
<text x="213" y="482" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#22d3ee" font-weight="700">MCP server</text>
<text x="213" y="494" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#22d3ee" fill-opacity="0.7">stdio · HTTP /mcp</text>
<!-- arrow -->
<line x1="268" y1="486" x2="294" y2="486" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: 19 tools -->
<rect x="296" y="468" width="100" height="36" rx="4" fill="#22d3ee" fill-opacity="0.1" stroke="#22d3ee" stroke-opacity="0.5" stroke-width="1"/>
<text x="346" y="482" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#22d3ee" font-weight="700">19 tools</text>
<text x="346" y="494" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#22d3ee" fill-opacity="0.7">read · write · query</text>
<!-- arrow -->
<line x1="396" y1="486" x2="422" y2="486" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Node: NCL files -->
<rect x="424" y="468" width="100" height="36" rx="4" fill="#60a5fa" fill-opacity="0.1" stroke="#60a5fa" stroke-opacity="0.5" stroke-width="1"/>
<text x="474" y="482" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#60a5fa" font-weight="700">NCL files</text>
<text x="474" y="494" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#60a5fa" fill-opacity="0.7">git-versioned</text>
<!-- ── FLOW 3: PRE-COMMIT BARRIER ── -->
<text x="30" y="524" font-family="'JetBrains Mono',monospace" font-size="7.5" fill="#64748b">Pre-commit barrier — notification-gated commit path</text>
<!-- Node: git commit -->
<rect x="30" y="530" width="100" height="36" rx="4" fill="#f87171" fill-opacity="0.1" stroke="#f87171" stroke-opacity="0.5" stroke-width="1"/>
<text x="80" y="544" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#f87171" font-weight="700">git commit</text>
<text x="80" y="556" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#f87171" fill-opacity="0.7">pre-commit fires</text>
<!-- warn arrow -->
<line x1="130" y1="548" x2="156" y2="548" stroke="#f97316" stroke-opacity="0.7" stroke-width="1" marker-end="url(#ao)"/>
<!-- Node: GET /notifications -->
<rect x="158" y="530" width="120" height="36" rx="4" fill="#22d3ee" fill-opacity="0.1" stroke="#22d3ee" stroke-opacity="0.5" stroke-width="1"/>
<text x="218" y="544" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#22d3ee" font-weight="700">GET /notify</text>
<text x="218" y="556" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#22d3ee" fill-opacity="0.7">/pending?token=X</text>
<!-- arrow -->
<line x1="278" y1="548" x2="304" y2="548" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<!-- Diamond: pending? -->
<polygon points="330,530 356,548 330,566 304,548" fill="#f97316" fill-opacity="0.1" stroke="#f97316" stroke-opacity="0.6" stroke-width="1"/>
<text x="330" y="552" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="7" fill="#f97316" font-weight="700">pending?</text>
<!-- YES arrow (right) -->
<line x1="356" y1="548" x2="382" y2="548" stroke="#f97316" stroke-opacity="0.7" stroke-width="1" marker-end="url(#ao)"/>
<text x="369" y="545" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="5.5" fill="#f87171">YES</text>
<!-- Node: BLOCK -->
<rect x="384" y="530" width="100" height="36" rx="4" fill="#f87171" fill-opacity="0.12" stroke="#f87171" stroke-opacity="0.6" stroke-width="1"/>
<text x="434" y="544" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#f87171" font-weight="700">BLOCK</text>
<text x="434" y="556" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#f87171" fill-opacity="0.7">until acked in UI</text>
<!-- NO arc (down from diamond then right to pass) -->
<path d="M330,566 Q330,578 345,578 L520,578 Q535,578 535,566 L535,566" fill="none" stroke="#4ade80" stroke-opacity="0.4" stroke-width="0.8" stroke-dasharray="3 2" marker-end="url(#ag)"/>
<text x="432" y="576" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="5.5" fill="#4ade80" fill-opacity="0.7">NO — daemon unreachable → fail-open</text>
<!-- arrow from BLOCK -->
<line x1="484" y1="548" x2="510" y2="548" stroke="#475569" stroke-width="1" marker-end="url(#a)"/>
<text x="497" y="545" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="5.5" fill="#4ade80">acked</text>
<!-- Node: PASS -->
<rect x="512" y="530" width="100" height="36" rx="4" fill="#4ade80" fill-opacity="0.12" stroke="#4ade80" stroke-opacity="0.6" stroke-width="1"/>
<text x="562" y="544" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="8" fill="#4ade80" font-weight="700">PASS ✓</text>
<text x="562" y="556" text-anchor="middle" font-family="'JetBrains Mono',monospace" font-size="6.5" fill="#4ade80" fill-opacity="0.7">commit proceeds</text>
<!-- footer -->
<text x="872" y="574" text-anchor="end" font-family="'JetBrains Mono',monospace" font-size="7" fill="#94a3b8">ontoref v0.1.0</text>
</svg>