docs: Diagramm der Zielarchitektur (Divi-Freigabe je Fähigkeit) statt Fahrplan-Übersicht

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-18 21:44:20 +02:00
co-authored by Claude Opus 5.5
parent 2facad1cbe
commit a7a9c09de8
3 changed files with 489 additions and 292 deletions
@@ -0,0 +1,304 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "Zielarchitektur: Divi-Freigabe je Fähigkeit",
"output": "2026-10-18-architektur-divi-faehigkeiten.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
}
},
"components": [
{
"id": "client",
"type": "external",
"label": "MCP-Client",
"sublabel": "KI-Assistent",
"pos": [
40,
190
],
"size": [
150,
64
]
},
{
"id": "registrar",
"type": "backend",
"label": "AbilityRegistrar",
"sublabel": "AbilityGuard-Liste",
"pos": [
250,
350
],
"size": [
150,
64
],
"tag": "kein Divi-Import"
},
{
"id": "core_tools",
"type": "backend",
"label": "Kern-Tools",
"sublabel": "WordPress · Media · Core",
"pos": [
250,
510
],
"size": [
150,
64
]
},
{
"id": "ports",
"type": "backend",
"label": "Ports",
"sublabel": "Builder · Logo · Status",
"pos": [
40,
510
],
"size": [
150,
64
],
"tag": "Divi implementiert"
},
{
"id": "feature_gate",
"type": "security",
"label": "DiviFeatureGate",
"sublabel": "lehnt je Fähigkeit ab",
"pos": [
470,
190
],
"size": [
150,
64
]
},
{
"id": "release_gate",
"type": "security",
"label": "ReleaseGate",
"sublabel": "Matrix je Fähigkeit",
"pos": [
690,
190
],
"size": [
150,
64
]
},
{
"id": "resolver",
"type": "backend",
"label": "ReleaseResolver",
"sublabel": "Manifest · Fingerabdrücke",
"pos": [
910,
190
],
"size": [
150,
64
],
"tag": "Auto-Freigabe"
},
{
"id": "status",
"type": "frontend",
"label": "Anzeige",
"sublabel": "site-status · Tab · CLI",
"pos": [
690,
40
],
"size": [
150,
64
]
},
{
"id": "divi_tools",
"type": "backend",
"label": "Divi-Tools",
"sublabel": "erklären Fähigkeiten",
"pos": [
470,
350
],
"size": [
150,
64
]
},
{
"id": "adapters",
"type": "backend",
"label": "Divi-Adapter",
"sublabel": "assertFeature()",
"pos": [
690,
350
],
"size": [
150,
64
],
"tag": "fail closed"
},
{
"id": "divi",
"type": "external",
"label": "Divi 5",
"sublabel": "Theme-Code",
"pos": [
910,
510
],
"size": [
150,
64
]
}
],
"boundaries": [
{
"kind": "region",
"label": "Kern (ohne Divi-Import)",
"wraps": [
"registrar",
"core_tools",
"ports"
]
},
{
"kind": "region",
"label": "Divi-Integration",
"wraps": [
"feature_gate",
"release_gate",
"resolver",
"status",
"divi_tools",
"adapters"
]
}
],
"connections": [
{
"id": "call",
"from": "client",
"to": "registrar",
"label": "Tool-Aufruf",
"variant": "emphasis"
},
{
"id": "guard",
"from": "registrar",
"to": "feature_gate",
"label": "Guard",
"variant": "security",
"fromSide": "top",
"toSide": "left"
},
{
"id": "ask",
"from": "feature_gate",
"to": "release_gate",
"label": "frei?",
"variant": "security"
},
{
"id": "matrix",
"from": "resolver",
"to": "release_gate",
"label": "Matrix"
},
{
"id": "probe",
"from": "resolver",
"to": "divi",
"label": "Signaturen",
"variant": "dashed",
"labelDy": 24
},
{
"id": "show",
"from": "status",
"to": "release_gate",
"label": "liest",
"labelDy": 24
},
{
"id": "run_divi",
"from": "registrar",
"to": "divi_tools",
"label": "führt aus"
},
{
"id": "run_core",
"from": "registrar",
"to": "core_tools"
},
{
"id": "use_ports",
"from": "core_tools",
"to": "ports"
},
{
"id": "use_adapters",
"from": "divi_tools",
"to": "adapters"
},
{
"id": "assert",
"from": "adapters",
"to": "release_gate",
"label": "assertFeature",
"variant": "security"
},
{
"id": "divi_api",
"from": "adapters",
"to": "divi",
"label": "Divi-API"
}
],
"cards": [
{
"dot": "emerald",
"title": "Kern entkoppelt",
"items": [
"Registrar kennt nur AbilityGuard und ToolRefusal",
"WordPress, Media, Core rufen Divi über Ports",
"CoreIndependenceTest verbietet Divi-Importe"
]
},
{
"dot": "cyan",
"title": "Fähigkeiten",
"items": [
"Manifest-Einträge gehören zu Fähigkeiten",
"Signatur- und Mirror-Fingerabdrücke je Aufruf",
"Neue Divi-Version: Freigabe je Fähigkeit"
]
},
{
"dot": "rose",
"title": "Sperre",
"items": [
"Gate lehnt nur Tools mit gesperrter Fähigkeit ab",
"Lesen wie Schreiben; Tools bleiben registriert",
"Adapter prüfen zusätzlich vor jedem Schreiben"
]
}
]
}
@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="archify 2.16.0">
<title>Etappe 4 – Pläne im Überblick Diagram</title>
<title>Zielarchitektur: Divi-Freigabe je Fähigkeit Diagram</title>
<script>
// Resolve the theme before first paint so light-preference users don't
// see a dark flash. The toolbar script below re-applies with UI state.
@@ -4955,7 +4955,7 @@
data-preset-badge-blueprint="BLUEPRINT / REV 01"
data-preset-badge-editorial="EDITORIAL / FIELD NOTE">
<div class="pulse-dot"></div>
<h1>Etappe 4 – Pläne im Überblick</h1>
<h1>Zielarchitektur: Divi-Freigabe je Fähigkeit</h1>
</div>
</div>
@@ -5004,9 +5004,9 @@
<!-- Main Diagram -->
<div class="diagram-container" data-detail-level="read"
data-preset-badge-editorial-plate="ARCHIFY / PLATE 04">
<svg viewBox="0 0 1000 534" role="img" lang="en" aria-labelledby="archify-diagram-title archify-diagram-description" data-preset="classic" data-quality-profile="showcase">
<title id="archify-diagram-title">Etappe 4 – Pläne im Überblick</title>
<desc id="archify-diagram-description">A workflow diagram generated by Archify.</desc>
<svg viewBox="0 0 1130 662" role="img" lang="en" aria-labelledby="archify-diagram-title archify-diagram-description" data-preset="classic" data-quality-profile="showcase">
<title id="archify-diagram-title">Zielarchitektur: Divi-Freigabe je Fähigkeit</title>
<desc id="archify-diagram-description">An architecture diagram generated by Archify.</desc>
<!-- Definitions -->
<defs>
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
@@ -5029,136 +5029,208 @@
<!-- Background Grid -->
<rect width="100%" height="100%" fill="url(#grid)" />
<!-- Swimlanes -->
<rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-0" x="40" y="52" width="742" height="106" rx="10" class="c-lane" stroke-width="1"/>
<text x="54" y="74" class="t-dim" font-size="10" font-weight="600">01 / Fertig</text>
<!-- Boundaries (behind everything) -->
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="0" data-composition-frame-label="Kern (ohne Divi-Import)" x="10" y="320" width="420" height="274" rx="12" class="c-region" stroke-width="1"/>
<rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-1" x="40" y="178" width="742" height="106" rx="10" class="c-lane" stroke-width="1"/>
<text x="54" y="200" class="t-dim" font-size="10" font-weight="600">02 / Zwischenschritt (geplant)</text>
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="1" data-composition-frame-label="Divi-Integration" x="440" y="10" width="650" height="424" rx="12" class="c-region" stroke-width="1"/>
<rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-2" x="40" y="304" width="742" height="106" rx="10" class="c-lane" stroke-width="1"/>
<text x="54" y="326" class="t-dim" font-size="10" font-weight="600">03 / Danach</text>
<!-- Connection paths (before components for correct z-order) -->
<path data-edge-from="client" data-edge-to="registrar" data-edge-label="Tool-Aufruf" data-edge-key="0" data-edge-id="call" data-composition-points="190,222;220,222;220,382;250,382" d="M 190 222 L 212 222 Q 220 222 220 230 L 220 374 Q 220 382 228 382 L 250 382" class="a-emphasis" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
<path data-edge-from="registrar" data-edge-to="feature_gate" data-edge-label="Guard" data-edge-key="1" data-edge-id="guard" data-composition-points="325,350;325,326;446,326;446,222;470,222" d="M 325 350 L 325 334 Q 325 326 333 326 L 438 326 Q 446 326 446 318 L 446 230 Q 446 222 454 222 L 470 222" class="a-security" stroke-width="1.5" marker-end="url(#arrowhead-security)"/>
<path data-edge-from="feature_gate" data-edge-to="release_gate" data-edge-label="frei?" data-edge-key="2" data-edge-id="ask" data-composition-points="620,222;690,222" d="M 620 222 L 690 222" class="a-security" stroke-width="1.5" marker-end="url(#arrowhead-security)"/>
<path data-edge-from="resolver" data-edge-to="release_gate" data-edge-label="Matrix" data-edge-key="3" data-edge-id="matrix" data-composition-points="910,222;840,222" d="M 910 222 L 840 222" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="resolver" data-edge-to="divi" data-edge-label="Signaturen" data-edge-key="4" data-edge-id="probe" data-composition-points="985,254;985,510" d="M 985 254 L 985 510" class="a-dashed" stroke-width="1.5" marker-end="url(#arrowhead-dashed)"/>
<path data-edge-from="status" data-edge-to="release_gate" data-edge-label="liest" data-edge-key="5" data-edge-id="show" data-composition-points="765,104;765,190" d="M 765 104 L 765 190" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="registrar" data-edge-to="divi_tools" data-edge-label="führt aus" data-edge-key="6" data-edge-id="run_divi" data-composition-points="400,382;470,382" d="M 400 382 L 470 382" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="registrar" data-edge-to="core_tools" data-edge-key="7" data-edge-id="run_core" data-composition-points="325,414;325,510" d="M 325 414 L 325 510" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="core_tools" data-edge-to="ports" data-edge-key="8" data-edge-id="use_ports" data-composition-points="250,542;190,542" d="M 250 542 L 190 542" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="divi_tools" data-edge-to="adapters" data-edge-key="9" data-edge-id="use_adapters" data-composition-points="620,382;690,382" d="M 620 382 L 690 382" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<path data-edge-from="adapters" data-edge-to="release_gate" data-edge-label="assertFeature" data-edge-key="10" data-edge-id="assert" data-composition-points="765,350;765,254" d="M 765 350 L 765 254" class="a-security" stroke-width="1.5" marker-end="url(#arrowhead-security)"/>
<path data-edge-from="adapters" data-edge-to="divi" data-edge-label="Divi-API" data-edge-key="11" data-edge-id="divi_api" data-composition-points="840,382;875,382;875,542;910,542" d="M 840 382 L 867 382 Q 875 382 875 390 L 875 534 Q 875 542 883 542 L 910 542" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<!-- Phase headers -->
<line x1="48" y1="35" x2="260" y2="35" class="a-default" stroke-width="1.1"/>
<rect x="48" y="27" width="212" height="16" rx="4" class="c-mask"/>
<text x="154" y="39" class="t-muted" font-size="8" font-weight="600" text-anchor="middle">Umgesetzt</text>
<line x1="288" y1="35" x2="770" y2="35" class="a-emphasis" stroke-width="1.1"/>
<rect x="288" y="27" width="482" height="16" rx="4" class="c-mask"/>
<text x="529" y="39" class="t-backend" font-size="8" font-weight="600" text-anchor="middle">Kern entkoppeln + Freigabe je Fähigkeit</text>
<!-- Workflow groups -->
<!-- Edge paths -->
<path data-edge-from="decouple" data-edge-to="features" data-edge-key="0" data-composition-points="390,246;418,246" d="M 390 246 L 418 246" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
<path data-edge-from="display" data-edge-to="stage_4c_e" data-edge-label="weiter" data-edge-key="1" data-composition-points="770,246;804.8,246;804.8,372;770,372" d="M 770 246 L 804.8 246 L 804.8 372 L 770 372" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
<path data-edge-from="features" data-edge-to="matrix_gate" data-edge-key="2" data-composition-points="510,246;538,246" d="M 510 246 L 538 246" class="a-emphasis" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
<path data-edge-from="matrix_gate" data-edge-to="display" data-edge-key="3" data-composition-points="650,246;678,246" d="M 650 246 L 678 246" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
<path data-edge-from="stage_4a" data-edge-to="stage_4b" data-edge-key="4" data-composition-points="140,120;168,120" d="M 140 120 L 168 120" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
<path data-edge-from="stage_4b" data-edge-to="decouple" data-edge-label="dann" data-edge-key="5" data-composition-points="260,120;334,120;334,212" d="M 260 120 L 334 120 L 334 212" class="a-default" stroke-width="1.4" marker-end="url(#arrowhead)"/>
<!-- Nodes -->
<g id="node-stage_4a" data-node-id="stage_4a" data-node-label="4a Presets" tabindex="0" role="button" aria-label="Focus 4a Presets, Pipeline + Snapshots, Fertig › Umgesetzt" aria-pressed="false" data-node-kind="database" data-node-sublabel="Pipeline + Snapshots" data-node-context="Fertig › Umgesetzt">
<title>4a Presets · Pipeline + Snapshots · Fertig › Umgesetzt</title>
<rect x="48" y="94" width="92" height="52" rx="6" class="c-mask"/>
<rect x="48" y="94" width="92" height="52" rx="6" class="c-database" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(54 100) scale(0.6875)">
<ellipse cx="8" cy="4" rx="5" ry="2"/>
<path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
<!-- Components -->
<g id="node-client" data-node-id="client" data-node-label="MCP-Client" tabindex="0" role="button" aria-label="Focus MCP-Client, KI-Assistent, Architecture component" aria-pressed="false" data-node-kind="external" data-node-sublabel="KI-Assistent" data-node-context="Architecture component">
<title>MCP-Client · KI-Assistent · Architecture component</title>
<rect x="40" y="190" width="150" height="64" rx="6" class="c-mask"/>
<rect x="40" y="190" width="150" height="64" rx="6" class="c-external" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="external" class="semantic-sigil s-external" transform="translate(46 196) scale(0.6875)">
<rect x="2.5" y="5" width="8.5" height="8" rx="1.5"/>
<path d="M8 2.5h5.5V8M13.5 2.5 7.5 8.5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="94" y="115" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">4a Presets</text>
<text data-detail="context" x="94" y="132" class="t-muted" font-size="7" text-anchor="middle">Pipeline + Snapshots</text>
<text data-node-label="" data-detail-anchor="" x="115" y="220" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">MCP-Client</text>
<text data-detail="context" x="115" y="236" class="t-muted" font-size="9" text-anchor="middle">KI-Assistent</text>
</g>
<g id="node-stage_4b" data-node-id="stage_4b" data-node-label="4b Zuweisen" tabindex="0" role="button" aria-label="Focus 4b Zuweisen, assign + detach, Fertig › Umgesetzt" aria-pressed="false" data-node-kind="database" data-node-sublabel="assign + detach" data-node-tag="2624 Tests" data-node-context="Fertig › Umgesetzt">
<title>4b Zuweisen · assign + detach · Fertig › Umgesetzt · 2624 Tests</title>
<rect x="168" y="86" width="92" height="68" rx="6" class="c-mask"/>
<rect x="168" y="86" width="92" height="68" rx="6" class="c-database" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(174 92) scale(0.6875)">
<ellipse cx="8" cy="4" rx="5" ry="2"/>
<path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
</g>
<text data-node-label="" data-detail-anchor="" x="214" y="107" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">4b Zuweisen</text>
<text data-detail="context" x="214" y="124" class="t-muted" font-size="8" text-anchor="middle">assign + detach</text>
<text data-detail="fine" x="214" y="142" class="t-database" font-size="7" text-anchor="middle">2624 Tests</text>
</g>
<g id="node-decouple" data-node-id="decouple" data-node-label="Kern entkoppeln" tabindex="0" role="button" aria-label="Focus Kern entkoppeln, Guard + Ports, Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit" aria-pressed="false" data-node-kind="backend" data-node-sublabel="Guard + Ports" data-node-tag="Tasks 1–3" data-node-context="Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit">
<title>Kern entkoppeln · Guard + Ports · Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit · Tasks 1–3</title>
<rect x="278" y="212" width="112" height="68" rx="6" class="c-mask"/>
<rect x="278" y="212" width="112" height="68" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(284 218) scale(0.6875)">
<g id="node-registrar" data-node-id="registrar" data-node-label="AbilityRegistrar" tabindex="0" role="button" aria-label="Focus AbilityRegistrar, AbilityGuard-Liste, Kern (ohne Divi-Import)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="AbilityGuard-Liste" data-node-tag="kein Divi-Import" data-node-context="Kern (ohne Divi-Import)">
<title>AbilityRegistrar · AbilityGuard-Liste · Kern (ohne Divi-Import) · kein Divi-Import</title>
<rect x="250" y="350" width="150" height="64" rx="6" class="c-mask"/>
<rect x="250" y="350" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(256 356) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="334" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Kern entkoppeln</text>
<text data-detail="context" x="334" y="250" class="t-muted" font-size="8" text-anchor="middle">Guard + Ports</text>
<text data-detail="fine" x="334" y="268" class="t-backend" font-size="7" text-anchor="middle">Tasks 1–3</text>
<text data-node-label="" data-detail-anchor="" x="325" y="380" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">AbilityRegistrar</text>
<text data-detail="context" x="325" y="396" class="t-muted" font-size="9" text-anchor="middle">AbilityGuard-Liste</text>
<text data-detail="fine" x="325" y="406" class="t-backend" font-size="7" text-anchor="middle">kein Divi-Import</text>
</g>
<g id="node-features" data-node-id="features" data-node-label="Fähigkeiten" tabindex="0" role="button" aria-label="Focus Fähigkeiten, Manifest + Signaturen, Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit" aria-pressed="false" data-node-kind="backend" data-node-sublabel="Manifest + Signaturen" data-node-tag="Tasks 4–5" data-node-context="Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit">
<title>Fähigkeiten · Manifest + Signaturen · Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit · Tasks 4–5</title>
<rect x="418" y="212" width="92" height="68" rx="6" class="c-mask"/>
<rect x="418" y="212" width="92" height="68" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(424 218) scale(0.6875)">
<g id="node-core_tools" data-node-id="core_tools" data-node-label="Kern-Tools" tabindex="0" role="button" aria-label="Focus Kern-Tools, WordPress · Media · Core, Kern (ohne Divi-Import)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="WordPress · Media · Core" data-node-context="Kern (ohne Divi-Import)">
<title>Kern-Tools · WordPress · Media · Core · Kern (ohne Divi-Import)</title>
<rect x="250" y="510" width="150" height="64" rx="6" class="c-mask"/>
<rect x="250" y="510" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(256 516) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="464" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Fähigkeiten</text>
<text data-detail="context" x="464" y="250" class="t-muted" font-size="6.6" text-anchor="middle">Manifest + Signaturen</text>
<text data-detail="fine" x="464" y="268" class="t-backend" font-size="7" text-anchor="middle">Tasks 4–5</text>
<text data-node-label="" data-detail-anchor="" x="325" y="540" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Kern-Tools</text>
<text data-detail="context" x="325" y="556" class="t-muted" font-size="9" text-anchor="middle">WordPress · Media · Core</text>
</g>
<g id="node-matrix_gate" data-node-id="matrix_gate" data-node-label="Matrix + Sperre" tabindex="0" role="button" aria-label="Focus Matrix + Sperre, je Fähigkeit, Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit" aria-pressed="false" data-node-kind="security" data-node-sublabel="je Fähigkeit" data-node-tag="Tasks 6–9" data-node-context="Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit">
<title>Matrix + Sperre · je Fähigkeit · Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit · Tasks 6–9</title>
<rect x="538" y="212" width="112" height="68" rx="6" class="c-mask"/>
<rect x="538" y="212" width="112" height="68" rx="6" class="c-security" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(544 218) scale(0.6875)">
<g id="node-ports" data-node-id="ports" data-node-label="Ports" tabindex="0" role="button" aria-label="Focus Ports, Builder · Logo · Status, Kern (ohne Divi-Import)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="Builder · Logo · Status" data-node-tag="Divi implementiert" data-node-context="Kern (ohne Divi-Import)">
<title>Ports · Builder · Logo · Status · Kern (ohne Divi-Import) · Divi implementiert</title>
<rect x="40" y="510" width="150" height="64" rx="6" class="c-mask"/>
<rect x="40" y="510" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(46 516) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="115" y="540" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Ports</text>
<text data-detail="context" x="115" y="556" class="t-muted" font-size="9" text-anchor="middle">Builder · Logo · Status</text>
<text data-detail="fine" x="115" y="566" class="t-backend" font-size="7" text-anchor="middle">Divi implementiert</text>
</g>
<g id="node-feature_gate" data-node-id="feature_gate" data-node-label="DiviFeatureGate" tabindex="0" role="button" aria-label="Focus DiviFeatureGate, lehnt je Fähigkeit ab, Divi-Integration" aria-pressed="false" data-node-kind="security" data-node-sublabel="lehnt je Fähigkeit ab" data-node-context="Divi-Integration">
<title>DiviFeatureGate · lehnt je Fähigkeit ab · Divi-Integration</title>
<rect x="470" y="190" width="150" height="64" rx="6" class="c-mask"/>
<rect x="470" y="190" width="150" height="64" rx="6" class="c-security" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(476 196) scale(0.6875)">
<path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
<path d="m5.8 8 1.5 1.5 3-3"/>
</g>
<text data-node-label="" data-detail-anchor="" x="594" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Matrix + Sperre</text>
<text data-detail="context" x="594" y="250" class="t-muted" font-size="8" text-anchor="middle">je Fähigkeit</text>
<text data-detail="fine" x="594" y="268" class="t-security" font-size="7" text-anchor="middle">Tasks 6–9</text>
<text data-node-label="" data-detail-anchor="" x="545" y="220" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">DiviFeatureGate</text>
<text data-detail="context" x="545" y="236" class="t-muted" font-size="9" text-anchor="middle">lehnt je Fähigkeit ab</text>
</g>
<g id="node-display" data-node-id="display" data-node-label="Anzeige" tabindex="0" role="button" aria-label="Focus Anzeige, Status, Admin, CLI, Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit" aria-pressed="false" data-node-kind="frontend" data-node-sublabel="Status, Admin, CLI" data-node-tag="Tasks 10–11" data-node-context="Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit">
<title>Anzeige · Status, Admin, CLI · Zwischenschritt (geplant) › Kern entkoppeln + Freigabe je Fähigkeit · Tasks 10–11</title>
<rect x="678" y="212" width="92" height="68" rx="6" class="c-mask"/>
<rect x="678" y="212" width="92" height="68" rx="6" class="c-frontend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="frontend" class="semantic-sigil s-frontend" transform="translate(684 218) scale(0.6875)">
<g id="node-release_gate" data-node-id="release_gate" data-node-label="ReleaseGate" tabindex="0" role="button" aria-label="Focus ReleaseGate, Matrix je Fähigkeit, Divi-Integration" aria-pressed="false" data-node-kind="security" data-node-sublabel="Matrix je Fähigkeit" data-node-context="Divi-Integration">
<title>ReleaseGate · Matrix je Fähigkeit · Divi-Integration</title>
<rect x="690" y="190" width="150" height="64" rx="6" class="c-mask"/>
<rect x="690" y="190" width="150" height="64" rx="6" class="c-security" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(696 196) scale(0.6875)">
<path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
<path d="m5.8 8 1.5 1.5 3-3"/>
</g>
<text data-node-label="" data-detail-anchor="" x="765" y="220" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">ReleaseGate</text>
<text data-detail="context" x="765" y="236" class="t-muted" font-size="9" text-anchor="middle">Matrix je Fähigkeit</text>
</g>
<g id="node-resolver" data-node-id="resolver" data-node-label="ReleaseResolver" tabindex="0" role="button" aria-label="Focus ReleaseResolver, Manifest · Fingerabdrücke, Divi-Integration" aria-pressed="false" data-node-kind="backend" data-node-sublabel="Manifest · Fingerabdrücke" data-node-tag="Auto-Freigabe" data-node-context="Divi-Integration">
<title>ReleaseResolver · Manifest · Fingerabdrücke · Divi-Integration · Auto-Freigabe</title>
<rect x="910" y="190" width="150" height="64" rx="6" class="c-mask"/>
<rect x="910" y="190" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(916 196) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="985" y="220" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">ReleaseResolver</text>
<text data-detail="context" x="985" y="236" class="t-muted" font-size="9" text-anchor="middle">Manifest · Fingerabdrücke</text>
<text data-detail="fine" x="985" y="246" class="t-backend" font-size="7" text-anchor="middle">Auto-Freigabe</text>
</g>
<g id="node-status" data-node-id="status" data-node-label="Anzeige" tabindex="0" role="button" aria-label="Focus Anzeige, site-status · Tab · CLI, Divi-Integration" aria-pressed="false" data-node-kind="frontend" data-node-sublabel="site-status · Tab · CLI" data-node-context="Divi-Integration">
<title>Anzeige · site-status · Tab · CLI · Divi-Integration</title>
<rect x="690" y="40" width="150" height="64" rx="6" class="c-mask"/>
<rect x="690" y="40" width="150" height="64" rx="6" class="c-frontend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="frontend" class="semantic-sigil s-frontend" transform="translate(696 46) scale(0.6875)">
<rect x="2" y="3" width="12" height="10" rx="2"/>
<path d="M2 6.5h12"/>
<circle cx="4.1" cy="4.8" r=".7" class="sigil-fill"/>
<circle cx="6.3" cy="4.8" r=".7" class="sigil-fill"/>
</g>
<text data-node-label="" data-detail-anchor="" x="724" y="233" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Anzeige</text>
<text data-detail="context" x="724" y="250" class="t-muted" font-size="7.7" text-anchor="middle">Status, Admin, CLI</text>
<text data-detail="fine" x="724" y="268" class="t-frontend" font-size="7" text-anchor="middle">Tasks 10–11</text>
<text data-node-label="" data-detail-anchor="" x="765" y="70" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Anzeige</text>
<text data-detail="context" x="765" y="86" class="t-muted" font-size="9" text-anchor="middle">site-status · Tab · CLI</text>
</g>
<g id="node-stage_4c_e" data-node-id="stage_4c_e" data-node-label="4c – 4e" tabindex="0" role="button" aria-label="Focus 4c – 4e, Farben bis Version, Danach › Kern entkoppeln + Freigabe je Fähigkeit" aria-pressed="false" data-node-kind="cloud" data-node-sublabel="Farben bis Version" data-node-context="Danach › Kern entkoppeln + Freigabe je Fähigkeit">
<title>4c – 4e · Farben bis Version · Danach › Kern entkoppeln + Freigabe je Fähigkeit</title>
<rect x="678" y="346" width="92" height="52" rx="6" class="c-mask"/>
<rect x="678" y="346" width="92" height="52" rx="6" class="c-cloud" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="cloud" class="semantic-sigil s-cloud" transform="translate(684 352) scale(0.6875)">
<path d="M4.3 12.5h7.3a2.4 2.4 0 0 0 .2-4.8 4 4 0 0 0-7.5-1.3A3.1 3.1 0 0 0 4.3 12.5Z"/>
<g id="node-divi_tools" data-node-id="divi_tools" data-node-label="Divi-Tools" tabindex="0" role="button" aria-label="Focus Divi-Tools, erklären Fähigkeiten, Divi-Integration" aria-pressed="false" data-node-kind="backend" data-node-sublabel="erklären Fähigkeiten" data-node-context="Divi-Integration">
<title>Divi-Tools · erklären Fähigkeiten · Divi-Integration</title>
<rect x="470" y="350" width="150" height="64" rx="6" class="c-mask"/>
<rect x="470" y="350" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(476 356) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="724" y="367" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">4c – 4e</text>
<text data-detail="context" x="724" y="384" class="t-muted" font-size="7.7" text-anchor="middle">Farben bis Version</text>
<text data-node-label="" data-detail-anchor="" x="545" y="380" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Divi-Tools</text>
<text data-detail="context" x="545" y="396" class="t-muted" font-size="9" text-anchor="middle">erklären Fähigkeiten</text>
</g>
<!-- Edge labels -->
<g id="node-adapters" data-node-id="adapters" data-node-label="Divi-Adapter" tabindex="0" role="button" aria-label="Focus Divi-Adapter, assertFeature(), Divi-Integration" aria-pressed="false" data-node-kind="backend" data-node-sublabel="assertFeature()" data-node-tag="fail closed" data-node-context="Divi-Integration">
<title>Divi-Adapter · assertFeature() · Divi-Integration · fail closed</title>
<rect x="690" y="350" width="150" height="64" rx="6" class="c-mask"/>
<rect x="690" y="350" width="150" height="64" rx="6" class="c-backend" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(696 356) scale(0.6875)">
<path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="765" y="380" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Divi-Adapter</text>
<text data-detail="context" x="765" y="396" class="t-muted" font-size="9" text-anchor="middle">assertFeature()</text>
<text data-detail="fine" x="765" y="406" class="t-backend" font-size="7" text-anchor="middle">fail closed</text>
</g>
<g data-detail="context" data-edge-from="display" data-edge-to="stage_4c_e" data-edge-label="weiter" data-edge-key="1">
<rect x="768" y="226" width="38.8" height="14" rx="3" class="c-mask"/>
<text x="787.4" y="236" class="t-muted" font-size="8" text-anchor="middle">weiter</text>
<g id="node-divi" data-node-id="divi" data-node-label="Divi 5" tabindex="0" role="button" aria-label="Focus Divi 5, Theme-Code, Architecture component" aria-pressed="false" data-node-kind="external" data-node-sublabel="Theme-Code" data-node-context="Architecture component">
<title>Divi 5 · Theme-Code · Architecture component</title>
<rect x="910" y="510" width="150" height="64" rx="6" class="c-mask"/>
<rect x="910" y="510" width="150" height="64" rx="6" class="c-external" stroke-width="1.5"/>
<g aria-hidden="true" data-semantic-sigil="external" class="semantic-sigil s-external" transform="translate(916 516) scale(0.6875)">
<rect x="2.5" y="5" width="8.5" height="8" rx="1.5"/>
<path d="M8 2.5h5.5V8M13.5 2.5 7.5 8.5"/>
</g>
<text data-node-label="" data-detail-anchor="" x="985" y="540" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Divi 5</text>
<text data-detail="context" x="985" y="556" class="t-muted" font-size="9" text-anchor="middle">Theme-Code</text>
</g>
<!-- Connection labels -->
<g data-detail="context" data-edge-from="client" data-edge-to="registrar" data-edge-label="Tool-Aufruf" data-edge-key="0" data-edge-id="call">
<rect x="188.6" y="282" width="62.8" height="14" rx="3" class="c-mask"/>
<text x="220" y="292" class="t-backend" font-size="8" text-anchor="middle">Tool-Aufruf</text>
</g>
<g data-detail="context" data-edge-from="registrar" data-edge-to="feature_gate" data-edge-label="Guard" data-edge-key="1" data-edge-id="guard">
<rect x="368.5" y="306" width="34" height="14" rx="3" class="c-mask"/>
<text x="385.5" y="316" class="t-security" font-size="8" text-anchor="middle">Guard</text>
</g>
<g data-detail="context" data-edge-from="feature_gate" data-edge-to="release_gate" data-edge-label="frei?" data-edge-key="2" data-edge-id="ask">
<rect x="638" y="202" width="34" height="14" rx="3" class="c-mask"/>
<text x="655" y="212" class="t-security" font-size="8" text-anchor="middle">frei?</text>
</g>
<g data-detail="context" data-edge-from="resolver" data-edge-to="release_gate" data-edge-label="Matrix" data-edge-key="3" data-edge-id="matrix">
<rect x="855.6" y="202" width="38.8" height="14" rx="3" class="c-mask"/>
<text x="875" y="212" class="t-muted" font-size="8" text-anchor="middle">Matrix</text>
</g>
<g data-detail="context" data-edge-from="resolver" data-edge-to="divi" data-edge-label="Signaturen" data-edge-key="4" data-edge-id="probe">
<rect x="956" y="258" width="58" height="14" rx="3" class="c-mask"/>
<text x="985" y="268" class="t-messagebus" font-size="8" text-anchor="middle">Signaturen</text>
</g>
<g data-detail="context" data-edge-from="status" data-edge-to="release_gate" data-edge-label="liest" data-edge-key="5" data-edge-id="show">
<rect x="748" y="108" width="34" height="14" rx="3" class="c-mask"/>
<text x="765" y="118" class="t-muted" font-size="8" text-anchor="middle">liest</text>
</g>
<g data-detail="context" data-edge-from="registrar" data-edge-to="divi_tools" data-edge-label="führt aus" data-edge-key="6" data-edge-id="run_divi">
<rect x="408.4" y="362" width="53.199999999999996" height="14" rx="3" class="c-mask"/>
<text x="435" y="372" class="t-muted" font-size="8" text-anchor="middle">führt aus</text>
</g>
<g data-detail="context" data-edge-from="stage_4b" data-edge-to="decouple" data-edge-label="dann" data-edge-key="5">
<rect x="282" y="100" width="30" height="14" rx="3" class="c-mask"/>
<text x="297" y="110" class="t-muted" font-size="8" text-anchor="middle">dann</text>
<g data-detail="context" data-edge-from="adapters" data-edge-to="release_gate" data-edge-label="assertFeature" data-edge-key="10" data-edge-id="assert">
<rect x="728.8" y="330" width="72.4" height="14" rx="3" class="c-mask"/>
<text x="765" y="340" class="t-security" font-size="8" text-anchor="middle">assertFeature</text>
</g>
<g data-detail="context" data-edge-from="adapters" data-edge-to="divi" data-edge-label="Divi-API" data-edge-key="11" data-edge-id="divi_api">
<rect x="850.8" y="442" width="48.4" height="14" rx="3" class="c-mask"/>
<text x="875" y="452" class="t-muted" font-size="8" text-anchor="middle">Divi-API</text>
</g>
<!-- Boundary labels (foreground masks keep routes out of titles) -->
<g data-graph-role="structural-frame-label" data-composition-frame-id="0" data-composition-frame-kind="region" data-composition-frame-label="Kern (ohne Divi-Import)">
<rect data-graph-role="structural-frame-label-mask" x="14" y="330" width="134.2" height="16" rx="3" class="c-mask"/>
<text data-boundary-label="" x="18" y="343" class="t-cloud" font-size="9" font-weight="600">Kern (ohne Divi-Import)</text>
</g>
<g data-graph-role="structural-frame-label" data-composition-frame-id="1" data-composition-frame-kind="region" data-composition-frame-label="Divi-Integration">
<rect data-graph-role="structural-frame-label-mask" x="444" y="20" width="96.39999999999999" height="16" rx="3" class="c-mask"/>
<text data-boundary-label="" x="448" y="33" class="t-cloud" font-size="9" font-weight="600">Divi-Integration</text>
</g>
<!-- Legend -->
@@ -5352,37 +5424,36 @@
<div class="card">
<div class="card-header">
<div class="card-dot emerald"></div>
<h3>4b umgesetzt</h3>
<h3>Kern entkoppelt</h3>
</div>
<ul>
<li>&bull; Preset-Stapel, Gruppen-Presets, clear_overrides</li>
<li>&bull; lit/divi-presets-assign und lit/divi-design-detach</li>
<li>&bull; Höchstens 50 Seiten je Aufruf, Revision je Seite</li>
<li>&bull; Registrar kennt nur AbilityGuard und ToolRefusal</li>
<li>&bull; WordPress, Media, Core rufen Divi über Ports</li>
<li>&bull; CoreIndependenceTest verbietet Divi-Importe</li>
</ul>
</div>
<div class="card">
<div class="card-header">
<div class="card-dot cyan"></div>
<h3>Zwischenschritt</h3>
<h3>Fähigkeiten</h3>
</div>
<ul>
<li>&bull; Registrar und Kern ohne Divi-Import</li>
<li>&bull; Jede Divi-Anforderung gehört zu Fähigkeiten</li>
<li>&bull; Nur betroffene Tools werden gesperrt</li>
<li>&bull; Fail closed: Adapter prüfen weiter je Fähigkeit</li>
<li>&bull; Manifest-Einträge gehören zu Fähigkeiten</li>
<li>&bull; Signatur- und Mirror-Fingerabdrücke je Aufruf</li>
<li>&bull; Neue Divi-Version: Freigabe je Fähigkeit</li>
</ul>
</div>
<div class="card">
<div class="card-header">
<div class="card-dot rose"></div>
<h3>Entscheidungen</h3>
<h3>Sperre</h3>
</div>
<ul>
<li>&bull; Neue Divi-Version: Freigabe je Fähigkeit</li>
<li>&bull; Lese-Tools werden bei Bruch abgelehnt</li>
<li>&bull; Tools bleiben registriert, Aufruf lehnt ab</li>
<li>&bull; Gate lehnt nur Tools mit gesperrter Fähigkeit ab</li>
<li>&bull; Lesen wie Schreiben; Tools bleiben registriert</li>
<li>&bull; Adapter prüfen zusätzlich vor jedem Schreiben</li>
</ul>
</div>
</div>
@@ -1,178 +0,0 @@
{
"schema_version": 2,
"diagram_type": "workflow",
"meta": {
"title": "Etappe 4 – Pläne im Überblick",
"output": "2026-10-18-plaene-uebersicht.html",
"quality_profile": "showcase",
"viewBox": [
1000,
534
],
"legend": {
"mode": "hidden"
}
},
"lanes": [
{
"id": "done",
"label": "Fertig"
},
{
"id": "next",
"label": "Zwischenschritt (geplant)"
},
{
"id": "later",
"label": "Danach"
}
],
"phases": [
{
"id": "built",
"label": "Umgesetzt",
"fromCol": 0,
"toCol": 1
},
{
"id": "between",
"label": "Kern entkoppeln + Freigabe je Fähigkeit",
"fromCol": 2,
"toCol": 5,
"variant": "emphasis"
}
],
"mainPath": [
"stage_4a",
"stage_4b",
"decouple",
"features",
"matrix_gate",
"display",
"stage_4c_e"
],
"nodes": [
{
"id": "stage_4a",
"lane": "done",
"col": 0,
"type": "database",
"label": "4a Presets",
"sublabel": "Pipeline + Snapshots"
},
{
"id": "stage_4b",
"lane": "done",
"col": 1,
"type": "database",
"label": "4b Zuweisen",
"sublabel": "assign + detach",
"tag": "2624 Tests"
},
{
"id": "decouple",
"lane": "next",
"col": 2,
"type": "backend",
"label": "Kern entkoppeln",
"sublabel": "Guard + Ports",
"tag": "Tasks 1–3",
"width": 112
},
{
"id": "features",
"lane": "next",
"col": 3,
"type": "backend",
"label": "Fähigkeiten",
"sublabel": "Manifest + Signaturen",
"tag": "Tasks 4–5"
},
{
"id": "matrix_gate",
"lane": "next",
"col": 4,
"type": "security",
"label": "Matrix + Sperre",
"sublabel": "je Fähigkeit",
"tag": "Tasks 6–9",
"width": 112
},
{
"id": "display",
"lane": "next",
"col": 5,
"type": "frontend",
"label": "Anzeige",
"sublabel": "Status, Admin, CLI",
"tag": "Tasks 10–11"
},
{
"id": "stage_4c_e",
"lane": "later",
"col": 5,
"type": "cloud",
"label": "4c – 4e",
"sublabel": "Farben bis Version"
}
],
"edges": [
{
"from": "stage_4a",
"to": "stage_4b"
},
{
"from": "stage_4b",
"to": "decouple",
"label": "dann"
},
{
"from": "decouple",
"to": "features"
},
{
"from": "features",
"to": "matrix_gate",
"variant": "emphasis"
},
{
"from": "matrix_gate",
"to": "display"
},
{
"from": "display",
"to": "stage_4c_e",
"label": "weiter"
}
],
"cards": [
{
"dot": "emerald",
"title": "4b umgesetzt",
"items": [
"Preset-Stapel, Gruppen-Presets, clear_overrides",
"lit/divi-presets-assign und lit/divi-design-detach",
"Höchstens 50 Seiten je Aufruf, Revision je Seite"
]
},
{
"dot": "cyan",
"title": "Zwischenschritt",
"items": [
"Registrar und Kern ohne Divi-Import",
"Jede Divi-Anforderung gehört zu Fähigkeiten",
"Nur betroffene Tools werden gesperrt",
"Fail closed: Adapter prüfen weiter je Fähigkeit"
]
},
{
"dot": "rose",
"title": "Entscheidungen",
"items": [
"Neue Divi-Version: Freigabe je Fähigkeit",
"Lese-Tools werden bei Bruch abgelehnt",
"Tools bleiben registriert, Aufruf lehnt ab"
]
}
]
}