diff --git a/docs/superpowers/notes/2026-10-18-divi-faehigkeiten.md b/docs/superpowers/notes/2026-10-18-divi-faehigkeiten.md index 758aa60..b979b85 100644 --- a/docs/superpowers/notes/2026-10-18-divi-faehigkeiten.md +++ b/docs/superpowers/notes/2026-10-18-divi-faehigkeiten.md @@ -25,8 +25,12 @@ pauschale Sperre der Divi-Absicherung (2026-09-29) durch eine Freigabe je Fähig 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`, `DeclaresRequirements` für `lit-content-create`, - das nur mit `divi` `page-write` braucht). `DiviFeatureGate` prüft sie vor dem Aufruf, auch im `permission_callback` - (nur bei `tools/call`, nicht beim Auflisten). Die Adapter prüfen vor jedem Schreiben zusätzlich selbst + das nur mit `divi` und 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 mit + `unsupported`). `DiviFeatureGate` prüft sie vor dem Aufruf, auch im `permission_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`); `DiviSaver` ergänzt je Speicherbereich `library-write` bzw. `tb-write`. - **Ablehnung:** `divi_untested` (mindestens eine Fähigkeit ungetestet, keine inkompatibel) oder `divi_incompatible`, HTTP 423, Details `features` (`id`, `label`, `state`, `problems`) und ein Hinweis, der die Fähigkeiten nennt und @@ -44,12 +48,19 @@ pauschale Sperre der Divi-Absicherung (2026-09-29) durch eine Freigabe je Fähig 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.json` wurde unter PHP 8.4 berechnet. Reflection gibt Typen je + PHP-Version unterschiedlich aus (z. B. `iterable` ab 8.2 als `Traversable|array`); eine andere PHP-Version in + Produktion kann deshalb scheinbare `signature`-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-reference` erzeugt 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. -- **Admin-Freigabe und Signaturen:** Die Admin-Freigabe 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 - nach einer Admin-Freigabe nicht; Aufrufe, Mirrors und Konstanten sperren weiter. +- **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`, Ergebnis `refused`) werden nur für schreibende Werkzeuge protokolliert; eine diff --git a/src/Integrations/Bootable.php b/src/Integrations/Bootable.php index 514cd27..7dd47ae 100644 --- a/src/Integrations/Bootable.php +++ b/src/Integrations/Bootable.php @@ -13,6 +13,9 @@ defined('ABSPATH') || exit; */ interface Bootable { - /** Registers the integration's own hooks, routes, CLI commands and admin tabs. Called once by Plugin. */ + /** + * Registers the integration's own hooks, routes, CLI commands and admin tabs. IntegrationRegistry::boot() calls it + * at most once per request. + */ public function boot(): void; } diff --git a/src/Integrations/Divi/Release/SignatureFingerprint.php b/src/Integrations/Divi/Release/SignatureFingerprint.php index a2307e0..51accfa 100644 --- a/src/Integrations/Divi/Release/SignatureFingerprint.php +++ b/src/Integrations/Divi/Release/SignatureFingerprint.php @@ -27,6 +27,10 @@ defined('ABSPATH') || exit; * requests and that change spelling without changing meaning; only "has a default" matters for the number of * arguments the plugin may omit. * - The body: a changed body is no change of the interface (mirrors cover the code the plugin repeats). + * + * Type strings come from Reflection and differ between PHP versions (e.g. `iterable` reads as `Traversable|array` + * from 8.2). The reference was computed under PHP 8.4; another PHP version can therefore report a spurious signature + * problem – it only blocks the automatic release (fail closed), never releases; --update-reference regenerates it. */ final class SignatureFingerprint {