From c9b31a61da18f79dcbb9deb134c3529a9d1f51c8 Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Sat, 26 Sep 2026 11:24:27 +0200 Subject: [PATCH] docs: fix review round 1 - tree_rev in save pipeline, single-source D7 in Sec 10/11.3/14 Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7 --- docs/superpowers/specs/2026-09-25-wp-lit-mcp-design.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/superpowers/specs/2026-09-25-wp-lit-mcp-design.md b/docs/superpowers/specs/2026-09-25-wp-lit-mcp-design.md index 49af026..0609854 100644 --- a/docs/superpowers/specs/2026-09-25-wp-lit-mcp-design.md +++ b/docs/superpowers/specs/2026-09-25-wp-lit-mcp-design.md @@ -234,7 +234,7 @@ Kurzform setzt Admin-Labels automatisch (` – `), sofern nich ### 5.6 Speicher-Pipeline -1. Rechte prüfen (`edit_post`), `rev` prüfen. +1. Rechte prüfen (`edit_post`), `tree_rev` prüfen. 2. Änderung auf dem BlockTree ausführen, validieren (alles oder nichts). 3. Serialisieren, `wp_slash()`, `wp_update_post()` – Status unverändert, vorher Wiederherstellungspunkt (Revision). Für Benutzer ohne `unfiltered_html` wird kses für genau diesen Aufruf abgeschaltet: `filter_block_content()` würde sonst jeden unveränderten Block neu serialisieren (Byte-Identität, globale Module; in DDEV nachgewiesen). Das ist nur vertretbar, weil keine client-gelieferte Zeichenkette ungeprüft in `post_content` gelangt (D7): Klartext-Werte werden je Feldtyp bereinigt (Text: `sanitize_text_field`; Rich-Text: `wp_kses_post`, abhängig von `unfiltered_html`; URLs: `esc_url_raw`, geroutet über die Attribut-Metadaten des Katalogs, ersatzweise über den Schlüsselnamen). Werte mit `$variable(...)$` – ob aus Platzhaltern erzeugt oder unverändert aus `lit/divi-node-get` zurückgegeben – werden geparst, streng geprüft (zulässiger Typ, existierende gcid-/gvid-/Dynamic-Content-Quellennamen, whitelisted Settings-Schlüssel, String-Settings bereinigt) und vom Plugin neu serialisiert; alles andere wird mit `validation_failed` abgelehnt. Ob Divi das Dynamic-Content-`before`/`after` bei der Ausgabe selbst escaped, wird in Etappe 2b im Divi-Quellcode verifiziert; die Bereinigung gilt unabhängig davon (Verteidigung in der Tiefe, R2). 4. Post-Meta `_et_pb_use_divi_5=on`, `_et_pb_use_builder=on` setzen. @@ -419,7 +419,7 @@ Themen: `overview`, `divi-structure`, `divi-shortform`, `divi-attrs`, `divi-plac - Whitelists für WP-Einstellungen und Divi-Theme-Optionen. - Uploads: `wp_safe_remote_get`, MIME-Whitelist, Größenlimits. - Destruktive Aktionen: `confirm: true` erforderlich; kein endgültiges Löschen von Posts. -- Eingaben werden gegen JSON Schema und fachlich validiert; Texte in Divi-Attributen mit `wp_kses_post` (Text-Module) bzw. `sanitize_text_field` (einfache Felder). +- Eingaben werden gegen JSON Schema und fachlich validiert; Bereinigung von Divi-Schreibwerten siehe §5.6/D7 (eine Quelle der Wahrheit): je Feldtyp (`sanitize_text_field`/`wp_kses_post`/`esc_url_raw`, URLs geroutet über Katalog-Metadaten bzw. Schlüsselname), `$variable(...)$`-Werte geparst/geprüft/neu serialisiert, sonst `validation_failed`. - HTTPS erforderlich (Hinweis im Admin, wenn nicht aktiv). ## 11. MCP-Konformität @@ -444,7 +444,7 @@ Referenz: https://modelcontextprotocol.io/specification - `inputSchema` für jedes Tool, `outputSchema` wo strukturiert (JSON Schema 2020-12); Ergebnisse als `structuredContent` + Text. - Fachliche Fehler als `isError: true`, Protokollfehler als JSON-RPC-Fehler. - Annotations korrekt: `readOnlyHint` (Lese-Tools), `destructiveHint` (Löschen, Ersetzen, Austausch), `idempotentHint`. -- Zustandslos: kein serverseitiger Sitzungszustand; `rev` als explizites, servererzeugtes Handle in Tool-Argumenten. +- Zustandslos: kein serverseitiger Sitzungszustand; `rev`/`tree_rev` als explizite, servererzeugte Handles in Tool-Argumenten. - Deterministische Reihenfolge der Tool-Liste. - Cursor-Paginierung für Listen. - Tool-Namen spezifikationskonform und eindeutig (`lit-…`). @@ -487,7 +487,7 @@ Kann-Kriterien nach Etappe 4 oder bei freier Kapazität. | Divi ändert Speicherformat | Divi-eigene Metadaten/Funktionen nutzen, Fixtures, Tests je Divi-Update, `builderVersion` setzen | | `.well-known`/POST auf `/wp-json/` durch Hoster/WAF blockiert | Site-Health-Test, Fehlersuche-Doku | | Design-Qualität neuer Abschnitte ohne Vorlagen | Library-first-Arbeitsweise, Designsystem-Platzhalter, Guides, Warnungen | -| Parallele Bearbeitung im Builder | `rev`-Sperre | +| Parallele Bearbeitung im Builder | `tree_rev`-Sperre | | Datenformate Designsystem nur aus Code abgeleitet (lokal keine Daten) | vor Etappe 4 echte Daten im Builder anlegen und als Fixtures sichern | ## 15. Offene Punkte (in Etappen zu klären)