253 lines
20 KiB
XML
253 lines
20 KiB
XML
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 780" font-family="ui-monospace, 'JetBrains Mono', monospace">
|
||
|
|
<defs>
|
||
|
|
<marker id="af" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#64748b"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="ag" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#059669"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="ar" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#dc2626"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="aa" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#d97706"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="av" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#7c3aed"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="ab" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#2563eb"/>
|
||
|
|
</marker>
|
||
|
|
</defs>
|
||
|
|
|
||
|
|
<!-- background -->
|
||
|
|
<rect width="1080" height="780" fill="#ffffff"/>
|
||
|
|
|
||
|
|
<!-- title -->
|
||
|
|
<text x="540" y="28" text-anchor="middle" font-size="16" font-weight="700" fill="#0f172a">stratumiops — Operation Flow</text>
|
||
|
|
<text x="540" y="46" text-anchor="middle" font-size="10" fill="#64748b">two main flows: knowledge registration · config sealed state — actor-aware, advisory locking</text>
|
||
|
|
|
||
|
|
<!-- ═══ SECTION DIVIDER ══════════════════════════════════════════════ -->
|
||
|
|
<!-- Left flow label -->
|
||
|
|
<rect x="12" y="56" width="518" height="18" rx="4" fill="#f0fdf4" stroke="#059669" stroke-width="1"/>
|
||
|
|
<text x="271" y="68" text-anchor="middle" font-size="9" font-weight="600" fill="#059669" letter-spacing="1">FLOW A — KNOWLEDGE REGISTRATION (stratum register)</text>
|
||
|
|
|
||
|
|
<!-- Right flow label -->
|
||
|
|
<rect x="542" y="56" width="526" height="18" rx="4" fill="#eff6ff" stroke="#2563eb" stroke-width="1"/>
|
||
|
|
<text x="805" y="68" text-anchor="middle" font-size="9" font-weight="600" fill="#2563eb" letter-spacing="1">FLOW B — CONFIG SEALED STATE (stratum config apply)</text>
|
||
|
|
|
||
|
|
<!-- ═══════════════════════════════════════════════════════════════════
|
||
|
|
FLOW A: REGISTER
|
||
|
|
═══════════════════════════════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- A1: Actor / trigger -->
|
||
|
|
<rect x="16" y="82" width="148" height="64" rx="6" fill="#f1f5f9" stroke="#94a3b8" stroke-width="1"/>
|
||
|
|
<text x="90" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#334155" letter-spacing="1">ACTOR</text>
|
||
|
|
<text x="90" y="112" text-anchor="middle" font-size="8" fill="#64748b">developer (TTY)</text>
|
||
|
|
<text x="90" y="124" text-anchor="middle" font-size="8" fill="#64748b">agent (piped)</text>
|
||
|
|
<text x="90" y="136" text-anchor="middle" font-size="8" fill="#64748b">ci / admin</text>
|
||
|
|
|
||
|
|
<line x1="164" y1="114" x2="182" y2="114" stroke="#64748b" stroke-width="1.5" marker-end="url(#af)"/>
|
||
|
|
|
||
|
|
<!-- A2: Lock acquire -->
|
||
|
|
<rect x="184" y="82" width="152" height="64" rx="6" fill="#fff5f5" stroke="#ef4444" stroke-width="1"/>
|
||
|
|
<text x="260" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#dc2626" letter-spacing="1">LOCK ACQUIRE</text>
|
||
|
|
<text x="260" y="112" text-anchor="middle" font-size="8" fill="#be123c">mkdir .stratum/locks/changelog</text>
|
||
|
|
<text x="260" y="124" text-anchor="middle" font-size="8" fill="#be123c">write PID to lock dir</text>
|
||
|
|
<text x="260" y="136" text-anchor="middle" font-size="8" fill="#94a3b8">stale? kill -0 PID → remove</text>
|
||
|
|
|
||
|
|
<line x1="336" y1="114" x2="354" y2="114" stroke="#64748b" stroke-width="1.5" marker-end="url(#af)"/>
|
||
|
|
|
||
|
|
<!-- A3: Form (actor-branching) -->
|
||
|
|
<rect x="356" y="82" width="170" height="64" rx="6" fill="#fffbeb" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="441" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#92400e" letter-spacing="1">FORM (actor-aware)</text>
|
||
|
|
<text x="441" y="112" text-anchor="middle" font-size="8" fill="#b45309">developer → typedialog UI</text>
|
||
|
|
<text x="441" y="124" text-anchor="middle" font-size="8" fill="#b45309">agent/ci → nickel-export + tera</text>
|
||
|
|
<text x="441" y="136" text-anchor="middle" font-size="8" fill="#94a3b8">forms/*.ncl drives field layout</text>
|
||
|
|
|
||
|
|
<line x1="526" y1="114" x2="526" y2="160" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
<text x="530" y="140" font-size="7" fill="#d97706">filled</text>
|
||
|
|
|
||
|
|
<!-- A4: Outputs fan-out -->
|
||
|
|
<rect x="356" y="162" width="170" height="100" rx="6" fill="#f0fdf4" stroke="#059669" stroke-width="1"/>
|
||
|
|
<text x="441" y="178" text-anchor="middle" font-size="9" font-weight="600" fill="#16a34a" letter-spacing="1">REGISTER OUTPUTS</text>
|
||
|
|
<text x="441" y="193" text-anchor="middle" font-size="8" fill="#166534">CHANGELOG append (locked)</text>
|
||
|
|
<text x="441" y="206" text-anchor="middle" font-size="8" fill="#166534">ADR hint → adrs/adr-NNN.ncl</text>
|
||
|
|
<text x="441" y="219" text-anchor="middle" font-size="8" fill="#166534">ontology patch → .ontology/</text>
|
||
|
|
<text x="441" y="232" text-anchor="middle" font-size="8" fill="#166534">mode stub → reflection/modes/</text>
|
||
|
|
<text x="441" y="248" text-anchor="middle" font-size="8" fill="#94a3b8">optional: trigger config apply</text>
|
||
|
|
|
||
|
|
<!-- A5: Lock release -->
|
||
|
|
<rect x="184" y="178" width="152" height="52" rx="6" fill="#fff5f5" stroke="#ef4444" stroke-width="1"/>
|
||
|
|
<text x="260" y="196" text-anchor="middle" font-size="9" font-weight="600" fill="#dc2626" letter-spacing="1">LOCK RELEASE</text>
|
||
|
|
<text x="260" y="210" text-anchor="middle" font-size="8" fill="#be123c">rm -rf .stratum/locks/changelog</text>
|
||
|
|
<text x="260" y="222" text-anchor="middle" font-size="8" fill="#94a3b8">triggered by EXIT trap</text>
|
||
|
|
|
||
|
|
<!-- outputs → lock release arrow -->
|
||
|
|
<line x1="356" y1="212" x2="336" y2="212" stroke="#dc2626" stroke-width="1.5" marker-end="url(#ar)"/>
|
||
|
|
|
||
|
|
<!-- ─── separator A4 → gate validation ─── -->
|
||
|
|
<line x1="441" y1="262" x2="441" y2="310" stroke="#059669" stroke-width="1" marker-end="url(#ag)"/>
|
||
|
|
|
||
|
|
<!-- A6: Gate/ADR validation -->
|
||
|
|
<rect x="16" y="312" width="510" height="68" rx="6" fill="#f1f5f9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="271" y="330" text-anchor="middle" font-size="9" font-weight="600" fill="#92400e" letter-spacing="1">ADR CONSTRAINT VALIDATION (stratum adr validate)</text>
|
||
|
|
<text x="271" y="346" text-anchor="middle" font-size="8" fill="#b45309">nickel export adrs/*.ncl | where status == Accepted | get constraints | where severity == Hard</text>
|
||
|
|
<text x="271" y="360" text-anchor="middle" font-size="8" fill="#b45309">for each: nu -c check_hint → exit 0 + no stdout = pass</text>
|
||
|
|
<text x="271" y="372" text-anchor="middle" font-size="8" fill="#94a3b8">^nickel export (not plugin cache) — always fresh · Superseded ADRs excluded</text>
|
||
|
|
|
||
|
|
<!-- ═══════════════════════════════════════════════════════════════════
|
||
|
|
FLOW B: CONFIG APPLY
|
||
|
|
═══════════════════════════════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- vertical separator line -->
|
||
|
|
<line x1="538" y1="56" x2="538" y2="390" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="4,3"/>
|
||
|
|
|
||
|
|
<!-- B1: Actor / trigger -->
|
||
|
|
<rect x="546" y="82" width="148" height="64" rx="6" fill="#f1f5f9" stroke="#94a3b8" stroke-width="1"/>
|
||
|
|
<text x="620" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#334155" letter-spacing="1">ACTOR</text>
|
||
|
|
<text x="620" y="112" text-anchor="middle" font-size="8" fill="#64748b">developer (TTY)</text>
|
||
|
|
<text x="620" y="124" text-anchor="middle" font-size="8" fill="#64748b">agent (piped)</text>
|
||
|
|
<text x="620" y="136" text-anchor="middle" font-size="8" fill="#64748b">ci / admin</text>
|
||
|
|
|
||
|
|
<line x1="694" y1="114" x2="712" y2="114" stroke="#64748b" stroke-width="1.5" marker-end="url(#af)"/>
|
||
|
|
|
||
|
|
<!-- B2: Lock acquire (manifest) -->
|
||
|
|
<rect x="714" y="82" width="152" height="64" rx="6" fill="#fff5f5" stroke="#ef4444" stroke-width="1"/>
|
||
|
|
<text x="790" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#dc2626" letter-spacing="1">LOCK ACQUIRE</text>
|
||
|
|
<text x="790" y="112" text-anchor="middle" font-size="8" fill="#be123c">mkdir .stratum/locks/manifest</text>
|
||
|
|
<text x="790" y="124" text-anchor="middle" font-size="8" fill="#be123c">write PID to lock dir</text>
|
||
|
|
<text x="790" y="136" text-anchor="middle" font-size="8" fill="#94a3b8">stale? kill -0 PID → remove</text>
|
||
|
|
|
||
|
|
<line x1="866" y1="114" x2="884" y2="114" stroke="#64748b" stroke-width="1.5" marker-end="url(#af)"/>
|
||
|
|
|
||
|
|
<!-- B3: nickel export + hash -->
|
||
|
|
<rect x="886" y="82" width="178" height="64" rx="6" fill="#eff6ff" stroke="#3b82f6" stroke-width="1"/>
|
||
|
|
<text x="975" y="98" text-anchor="middle" font-size="9" font-weight="600" fill="#1d4ed8" letter-spacing="1">EXPORT + HASH</text>
|
||
|
|
<text x="975" y="112" text-anchor="middle" font-size="8" fill="#0284c7">nickel export <profile>.ncl</text>
|
||
|
|
<text x="975" y="124" text-anchor="middle" font-size="8" fill="#0284c7">sha256(export) → seal.hash</text>
|
||
|
|
<text x="975" y="136" text-anchor="middle" font-size="8" fill="#94a3b8">sha256(snapshot) → snapshot_hash</text>
|
||
|
|
|
||
|
|
<line x1="975" y1="146" x2="975" y2="162" stroke="#2563eb" stroke-width="1.5" marker-end="url(#ab)"/>
|
||
|
|
|
||
|
|
<!-- B4: write history entry -->
|
||
|
|
<rect x="886" y="164" width="178" height="80" rx="6" fill="#eff6ff" stroke="#3b82f6" stroke-width="1"/>
|
||
|
|
<text x="975" y="180" text-anchor="middle" font-size="9" font-weight="600" fill="#1d4ed8" letter-spacing="1">HISTORY ENTRY</text>
|
||
|
|
<text x="975" y="195" text-anchor="middle" font-size="8" fill="#0284c7">cfg-<YYYYMMDDTHHmmSS>-<actor>.ncl</text>
|
||
|
|
<text x="975" y="208" text-anchor="middle" font-size="8" fill="#0284c7">ConfigState record (immutable)</text>
|
||
|
|
<text x="975" y="221" text-anchor="middle" font-size="8" fill="#0284c7">seal.hash + snapshot_hash</text>
|
||
|
|
<text x="975" y="234" text-anchor="middle" font-size="8" fill="#0284c7">supersedes: prev entry | null</text>
|
||
|
|
|
||
|
|
<line x1="975" y1="244" x2="975" y2="260" stroke="#2563eb" stroke-width="1.5" marker-end="url(#ab)"/>
|
||
|
|
|
||
|
|
<!-- B5: patch manifest -->
|
||
|
|
<rect x="886" y="262" width="178" height="60" rx="6" fill="#eff6ff" stroke="#3b82f6" stroke-width="1"/>
|
||
|
|
<text x="975" y="278" text-anchor="middle" font-size="9" font-weight="600" fill="#1d4ed8" letter-spacing="1">PATCH MANIFEST</text>
|
||
|
|
<text x="975" y="293" text-anchor="middle" font-size="8" fill="#0284c7">manifest.ncl → active[<profile>]</text>
|
||
|
|
<text x="975" y="306" text-anchor="middle" font-size="8" fill="#0284c7">= <new cfg entry ref></text>
|
||
|
|
<text x="975" y="318" text-anchor="middle" font-size="8" fill="#94a3b8">under manifest lock</text>
|
||
|
|
|
||
|
|
<!-- B6: Lock release -->
|
||
|
|
<rect x="714" y="178" width="152" height="52" rx="6" fill="#fff5f5" stroke="#ef4444" stroke-width="1"/>
|
||
|
|
<text x="790" y="196" text-anchor="middle" font-size="9" font-weight="600" fill="#dc2626" letter-spacing="1">LOCK RELEASE</text>
|
||
|
|
<text x="790" y="210" text-anchor="middle" font-size="8" fill="#be123c">rm -rf .stratum/locks/manifest</text>
|
||
|
|
<text x="790" y="222" text-anchor="middle" font-size="8" fill="#94a3b8">triggered by EXIT trap</text>
|
||
|
|
|
||
|
|
<!-- patch manifest → lock release -->
|
||
|
|
<line x1="886" y1="292" x2="866" y2="292" stroke="#dc2626" stroke-width="1.5" marker-end="url(#ar)"/>
|
||
|
|
|
||
|
|
<!-- B7: audit (drift check) sits below -->
|
||
|
|
<line x1="975" y1="322" x2="975" y2="370" stroke="#2563eb" stroke-width="1" marker-end="url(#ab)"/>
|
||
|
|
|
||
|
|
<!-- ─── B vertical: audit box ─── -->
|
||
|
|
<rect x="546" y="312" width="510" height="68" rx="6" fill="#f1f5f9" stroke="#3b82f6" stroke-width="1"/>
|
||
|
|
<text x="801" y="330" text-anchor="middle" font-size="9" font-weight="600" fill="#1d4ed8" letter-spacing="1">DRIFT AUDIT (stratum config audit)</text>
|
||
|
|
<text x="801" y="346" text-anchor="middle" font-size="8" fill="#0284c7">for each profile in manifest: sha256(live profile.ncl) == manifest.active[p].seal.hash</text>
|
||
|
|
<text x="801" y="360" text-anchor="middle" font-size="8" fill="#0284c7">match → clean · mismatch → drift (warn actor, optionally block)</text>
|
||
|
|
<text x="801" y="372" text-anchor="middle" font-size="8" fill="#94a3b8">read-only; no lock acquired · rollback: verify snapshot_hash → restore → new apply (forward operation)</text>
|
||
|
|
|
||
|
|
<!-- ═══ SUMMARY / EXAMPLES ════════════════════════════════════════════ -->
|
||
|
|
<rect x="12" y="398" width="1056" height="90" rx="8" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1"/>
|
||
|
|
<text x="540" y="418" text-anchor="middle" font-size="10" font-weight="700" fill="#64748b">actor flows through both paths automatically — locking is per-resource, not global</text>
|
||
|
|
|
||
|
|
<rect x="28" y="428" width="230" height="50" rx="5" fill="#f0fdf4" stroke="#166534" stroke-width="1"/>
|
||
|
|
<text x="143" y="444" text-anchor="middle" font-size="8" fill="#16a34a">stratum.sh register</text>
|
||
|
|
<text x="143" y="457" text-anchor="middle" font-size="8" fill="#166534">STRATUM_ACTOR=developer (TTY)</text>
|
||
|
|
<text x="143" y="470" text-anchor="middle" font-size="8" fill="#94a3b8">typedialog form → CHANGELOG locked</text>
|
||
|
|
|
||
|
|
<rect x="272" y="428" width="230" height="50" rx="5" fill="#fffbeb" stroke="#92400e" stroke-width="1"/>
|
||
|
|
<text x="387" y="444" text-anchor="middle" font-size="8" fill="#b45309">stratum.sh config apply prod</text>
|
||
|
|
<text x="387" y="457" text-anchor="middle" font-size="8" fill="#92400e">STRATUM_ACTOR=ci</text>
|
||
|
|
<text x="387" y="470" text-anchor="middle" font-size="8" fill="#94a3b8">manifest lock → cfg-ts-ci.ncl written</text>
|
||
|
|
|
||
|
|
<rect x="516" y="428" width="230" height="50" rx="5" fill="#f5f3ff" stroke="#4338ca" stroke-width="1"/>
|
||
|
|
<text x="631" y="444" text-anchor="middle" font-size="8" fill="#7c3aed">stratum.sh config audit</text>
|
||
|
|
<text x="631" y="457" text-anchor="middle" font-size="8" fill="#4338ca">any actor, no lock needed</text>
|
||
|
|
<text x="631" y="470" text-anchor="middle" font-size="8" fill="#94a3b8">sha256 compare live vs seal.hash</text>
|
||
|
|
|
||
|
|
<rect x="760" y="428" width="296" height="50" rx="5" fill="#eff6ff" stroke="#1d4ed8" stroke-width="1"/>
|
||
|
|
<text x="908" y="444" text-anchor="middle" font-size="8" fill="#1d4ed8">stratum.sh config rollback <ts></text>
|
||
|
|
<text x="908" y="457" text-anchor="middle" font-size="8" fill="#0284c7">verify snapshot_hash → restore → new apply</text>
|
||
|
|
<text x="908" y="470" text-anchor="middle" font-size="8" fill="#94a3b8">rollback is always a forward operation</text>
|
||
|
|
|
||
|
|
<!-- ═══ LEGEND ═══════════════════════════════════════════════════════ -->
|
||
|
|
<rect x="12" y="502" width="1056" height="58" rx="8" fill="#f1f5f9" stroke="#cbd5e1" stroke-width="1"/>
|
||
|
|
<text x="40" y="522" font-size="9" fill="#64748b">Legend:</text>
|
||
|
|
<line x1="100" y1="518" x2="132" y2="518" stroke="#64748b" stroke-width="1.5" marker-end="url(#af)"/>
|
||
|
|
<text x="138" y="522" font-size="8" fill="#94a3b8">main flow</text>
|
||
|
|
<line x1="220" y1="518" x2="252" y2="518" stroke="#059669" stroke-width="1.5" marker-end="url(#ag)"/>
|
||
|
|
<text x="258" y="522" font-size="8" fill="#94a3b8">pass / ok</text>
|
||
|
|
<line x1="340" y1="518" x2="372" y2="518" stroke="#dc2626" stroke-width="1.5" marker-end="url(#ar)"/>
|
||
|
|
<text x="378" y="522" font-size="8" fill="#94a3b8">error / lock release</text>
|
||
|
|
<line x1="478" y1="518" x2="510" y2="518" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
<text x="516" y="522" font-size="8" fill="#94a3b8">form complete</text>
|
||
|
|
<line x1="604" y1="518" x2="636" y2="518" stroke="#2563eb" stroke-width="1.5" marker-end="url(#ab)"/>
|
||
|
|
<text x="642" y="522" font-size="8" fill="#94a3b8">config flow (hash/write)</text>
|
||
|
|
<line x1="748" y1="518" x2="780" y2="518" stroke="#7c3aed" stroke-width="1.5" marker-end="url(#av)"/>
|
||
|
|
<text x="786" y="522" font-size="8" fill="#94a3b8">output / audit</text>
|
||
|
|
|
||
|
|
<text x="40" y="542" font-size="8" fill="#64748b">Lock resources:</text>
|
||
|
|
<text x="130" y="542" font-size="8" fill="#94a3b8">changelog (register) · manifest (config apply/rollback) · backlog (backlog done/cancel)</text>
|
||
|
|
<text x="40" y="555" font-size="8" fill="#64748b">History IDs:</text>
|
||
|
|
<text x="108" y="555" font-size="8" fill="#94a3b8">cfg-<YYYYMMDDTHHmmSS>-<actor>.ncl — timestamp collision-free, no lock needed for history writes</text>
|
||
|
|
|
||
|
|
<!-- ═══ BACKLOG SUB-FLOW ═══════════════════════════════════════════ -->
|
||
|
|
<rect x="12" y="574" width="1056" height="90" rx="8" fill="#f1f5f9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="36" y="592" font-size="9" font-weight="600" fill="#d97706" letter-spacing="1">FLOW C — BACKLOG (stratum backlog …)</text>
|
||
|
|
|
||
|
|
<rect x="28" y="600" width="170" height="54" rx="5" fill="#fafaf9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="113" y="616" text-anchor="middle" font-size="8" font-weight="600" fill="#92400e">backlog list|show</text>
|
||
|
|
<text x="113" y="629" text-anchor="middle" font-size="8" fill="#b45309">read backlog.ncl (no lock)</text>
|
||
|
|
<text x="113" y="642" text-anchor="middle" font-size="8" fill="#94a3b8">nickel export → filter/sort</text>
|
||
|
|
|
||
|
|
<line x1="198" y1="627" x2="216" y2="627" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
|
||
|
|
<rect x="218" y="600" width="178" height="54" rx="5" fill="#fafaf9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="307" y="616" text-anchor="middle" font-size="8" font-weight="600" fill="#92400e">backlog add</text>
|
||
|
|
<text x="307" y="629" text-anchor="middle" font-size="8" fill="#b45309">no lock (append, unique ID)</text>
|
||
|
|
<text x="307" y="642" text-anchor="middle" font-size="8" fill="#94a3b8">typed item: Todo|Bug|Wish|Debt</text>
|
||
|
|
|
||
|
|
<line x1="396" y1="627" x2="414" y2="627" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
|
||
|
|
<rect x="416" y="600" width="192" height="54" rx="5" fill="#fafaf9" stroke="#ef4444" stroke-width="1"/>
|
||
|
|
<text x="512" y="616" text-anchor="middle" font-size="8" font-weight="600" fill="#dc2626">backlog done|cancel</text>
|
||
|
|
<text x="512" y="629" text-anchor="middle" font-size="8" fill="#be123c">mkdir lock on backlog resource</text>
|
||
|
|
<text x="512" y="642" text-anchor="middle" font-size="8" fill="#94a3b8">mutates status field in backlog.ncl</text>
|
||
|
|
|
||
|
|
<line x1="608" y1="627" x2="626" y2="627" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
|
||
|
|
<rect x="628" y="600" width="190" height="54" rx="5" fill="#fafaf9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="723" y="616" text-anchor="middle" font-size="8" font-weight="600" fill="#92400e">backlog promote</text>
|
||
|
|
<text x="723" y="629" text-anchor="middle" font-size="8" fill="#b45309">graduates_to: Adr|Mode|StateTransition</text>
|
||
|
|
<text x="723" y="642" text-anchor="middle" font-size="8" fill="#94a3b8">triggers adr or mode stub creation</text>
|
||
|
|
|
||
|
|
<line x1="818" y1="627" x2="836" y2="627" stroke="#d97706" stroke-width="1.5" marker-end="url(#aa)"/>
|
||
|
|
|
||
|
|
<rect x="838" y="600" width="216" height="54" rx="5" fill="#fafaf9" stroke="#f59e0b" stroke-width="1"/>
|
||
|
|
<text x="946" y="616" text-anchor="middle" font-size="8" font-weight="600" fill="#92400e">backlog roadmap</text>
|
||
|
|
<text x="946" y="629" text-anchor="middle" font-size="8" fill="#b45309">state.ncl dimensions not-yet-reached</text>
|
||
|
|
<text x="946" y="642" text-anchor="middle" font-size="8" fill="#94a3b8">open items by priority (read-only)</text>
|
||
|
|
|
||
|
|
<text x="1068" y="770" text-anchor="end" font-size="8" fill="#cbd5e1">2026-03</text>
|
||
|
|
</svg>
|