Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
8.0 KiB
8.0 KiB
Divi-Freigabe je Fähigkeit – Entscheidungen
Stand 2026-10-18, Branch etappe-4. Plan: docs/superpowers/plans/2026-10-18-divi-faehigkeiten.md. Ersetzt die
pauschale Sperre der Divi-Absicherung (2026-09-29) durch eine Freigabe je Fähigkeit und löst den Kern von Divi.
Entscheidungen des Nutzers
- E1 Automatische Freigabe je Fähigkeit. Eine Divi-Version ohne Freigabe wird je Fähigkeit freigegeben, wenn alle
Anforderungen dieser Fähigkeit unverändert sind: jeder Aufruf existiert und nimmt die Argumentzahl an, sein
Signatur-Fingerabdruck stimmt mit
fingerprints.jsonüberein, jeder Mirror-Fingerabdruck stimmt, jede Konstante ist definiert. Der Filterlit_mcp_divi_auto_release(bool, Standardtrue) schaltet das ab; dann gilt für nicht freigegebene Versionen wieder „alles ungetestet“. Eine Admin-Freigabe gibt alle Fähigkeiten ohne Probleme frei. - E2 Lese-Werkzeuge lehnen ebenfalls ab, wenn eine ihrer Fähigkeiten nicht nutzbar ist (
divi_untestedbzw.divi_incompatible), statt ininternal_errorzu laufen. Der frühere Hinweis inwarningsentfällt. - E3 Gesperrte Werkzeuge bleiben registriert und lehnen beim Aufruf ab.
lit-site-statusmeldet je Fähigkeit Zustand, Quelle, Probleme und betroffene Werkzeuge; der Reiter „Divi“ zeigt dieselbe Tabelle; ein Admin-Hinweis erscheint, sobald eine Fähigkeit nicht nutzbar ist;wp lit-mcp divi-checkgibt die Matrix aus. - E4 Umfang: Kern-Entkopplung und Sperre je Fähigkeit samt Anzeige; weitere Wartbarkeit kommt später.
Umsetzung
- Elf Fähigkeiten (
DiviFeature):page-read,page-write,catalog,dynamic-sources,design-read,preset-write,library-read,library-write,roles,tb-read,tb-write. Jeder Manifest-Eintrag (Aufruf, Mirror, Konstante) trägt seine Fähigkeiten; geteilte Aufrufe (z. B.remove_static_resourcesfür Seiten und Theme Builder) tragen alle betroffenen, ein Bruch sperrt bewusst beide. Ein Test verlangt mindestens eine Fähigkeit je Anforderung. - Werkzeuge erklären ihre Fähigkeiten (
RequiresDiviFeatures,DeclaresRequirementsfürlit-content-create, das nur mitdiviund nur bei aktivem Divi 5 etwas braucht:page-read,page-write,catalog,design-read,dynamic-sources–DiviContentComposer::FEATURES; ohne aktives Divi antwortet das Werkzeug selbst mitunsupported).DiviFeatureGateprüft sie vor dem Aufruf, auch impermission_callback. Im vendorten mcp-adapter ruft nur der Werkzeugaufruf diesen Callback auf (tools/call:Handlers/Tools/ToolsHandler.php,call_tool();mcp-adapter-execute-ability:Abilities/ExecuteAbilityAbility.php), das Auflisten nicht. Die Adapter prüfen vor jedem Schreiben zusätzlich selbst (assertFeature);DiviSaverergänzt je Speicherbereichlibrary-writebzw.tb-write. - Ablehnung:
divi_untested(mindestens eine Fähigkeit ungetestet, keine inkompatibel) oderdivi_incompatible, HTTP 423, Detailsfeatures(id,label,state,problems) und ein Hinweis, der die Fähigkeiten nennt und sagt, dass andere Divi-Werkzeuge weiter funktionieren. - Zustand: Code-, Signatur- und Konstanten-Prüfungen laufen je Request live. Gecacht wird nur die Mirror-Prüfung
(Transient
lit_mcp_divi_state, Format 2: Mirror-Probleme mit Art und Fähigkeiten, ein Tag); ein Eintrag im alten Format zählt als Miss. Ein Divi-Hotfix ohne Versionssprung wird so sofort erkannt. - Kern ohne Divi:
CoreIndependenceTesterzwingt, dassAbilities,Admin,ChangeLog,Cli,Guides,Integrations/{Core,Media,Pods,WordPress},Serversowie die Dateien direkt untersrc/undsrc/Integrations/nichts ausIntegrations\Diviimportieren (auch kein Alias-Import). Einzige Ausnahme istPlugin.phpals Composition Root. Die Divi-Oberfläche liegt in der Divi-Integration:Integrations/Divi/Admin/DiviTab.phpundIntegrations/Divi/Cli/DiviCheckCommand.php.
Ergänzungen bei der Umsetzung
- Signatur-Fingerabdruck vergleicht die Aufrufform, nie das Verhalten. Er enthält Parameterzahl, Typen und Rückgabetyp, aber keine Parameternamen und keine Default-Werte (die Adapter rufen Divi positional). 14 der 29 Divi-Symbole sind untypisiert; dort sichert der Hash nur Aufrufform und Parameterzahl. Ein neuer optionaler Parameter am Ende sperrt die Fähigkeit (fail closed, gewollt); ein geänderter Default-Wert fällt nicht auf. Die automatische Freigabe sagt daher „Aufrufe unverändert“, nicht „funktioniert“.
- Referenz und PHP-Version:
fingerprints.jsonwurde unter PHP 8.4 berechnet. Reflection gibt Typen je PHP-Version unterschiedlich aus (z. B.iterableab 8.2 alsTraversable|array); eine andere PHP-Version in Produktion kann deshalb scheinbaresignature-Probleme melden. Das zählt nur für die automatische Freigabe einer nicht freigegebenen Divi-Version und schlägt geschlossen fehl: Es entsteht schlimmstenfalls ein falsches „inkompatibel“/„ungetestet“, nie eine falsche Freigabe.wp lit-mcp divi-check --update-referenceerzeugt die Referenz neu. - Mirror ohne Referenz ist ein harter Befund (Art
mirror), auch bei freigegebener Version: sonst würde ein Nachbau ungeprüft schreiben. „Referenz fehlt → ungetestet“ gilt nur für Aufruf-Signaturen und nur bei nicht freigegebener Version. - Freigabe und Signaturen: Eine freigegebene Version – per Admin-Freigabe (
ReleaseStore) oder im Code getestet (DiviReleases::TESTED) – berücksichtigt Signatur-Probleme nicht; Signaturen dienen der Automatik für Versionen ohne Freigabe. Ein Divi-Hotfix ohne Versionssprung, der nur eine Signatur ändert, sperrt bei einer freigegebenen Version nicht; Aufrufe, Mirrors und Konstanten sperren weiter. - Registrierungs-Prüfungen (Post-Typen, Taxonomien, Block-Typen) bleiben informativ und sperren nicht. Die Schreibprobe bleibt der Seitenpfad und ist nur für die Admin-Freigabe nötig.
- Protokoll: Ablehnungen (
ChangeLog, Ergebnisrefused) werden nur für schreibende Werkzeuge protokolliert; eine abgelehnte Lese-Anfrage ändert nichts. Da das Gate vorpermission()läuft, bekommen Aufrufer ohne Recht die Divi-Sperre stattforbiddenund einen Protokolleintrag; es entsteht kein Leck, weil die Antwort nur Fähigkeiten nennt. Die Eigenschaftwarningsbleibt im Ausgabeschema der Divi-Werkzeuge. - Eingabeabhängige Fähigkeiten:
lit-site-statusund der Reiter zeigen je Werkzeug die Grundmenge; je nach Eingabe (Bibliotheks- oder Theme-Builder-Ziel,dry_run: false,nodes) kommen weitere hinzu.dynamic-sourcesist eine Obermenge: ein Bruch sperrt alle Werkzeuge mit Composer. - Exit-Code von
wp lit-mcp divi-check: 0 = Prüfung grün und alle Fähigkeiten nutzbar, 1 = Prüfung rot, 2 = Prüfung grün, aber mindestens eine Fähigkeit nicht nutzbar. Skripte, die nur 0/1 kennen, lesen 2 als Fehler – gewollt. - Admin-Hinweis: erscheint für Administratoren bei aktivem Divi auf allen Admin-Seiten außer dem Reiter „Divi“; er ist nicht wegklickbar und verschwindet mit der Ursache. Die Freigabe-Formulare im Reiter richten sich weiter nach dem Gesamtzustand; die Freigabe selbst verlangt einen vollständig grünen Prüfbericht.
Smoke
tests/Integration/divi-release-smoke.sh simuliert eine Abweichung ohne Divi-Dateien oder fingerprints.json
anzufassen: Es trägt ein Mirror-Problem für page-write in den Cache lit_mcp_divi_state ein. Das kann nur
verschärfen, gilt nur für diesen Schlüssel (stateKey()), höchstens zehn Minuten, und der EXIT-Trap löscht den
Transient. Ein Filter im Produktionscode für die Referenz wurde verworfen: er wäre ein zusätzlicher Weg, die Sperre zu
beeinflussen, ohne dass ein Test ihn bräuchte.
Offen
- Der Admin-Hinweis berechnet den Zustand auf jeder Admin-Seite (Reflection und Dateihashes je Aufruf); bei Bedarf kurzlebig cachen.
DesignArea::feature(): Farben (color-write) und Variablen (variable-write) haben seit Etappe 4c eigene Fähigkeiten; Theme-Optionen bekommen ihre mit 4d.