WPPilot 1.5.0 — Preview before write
WPPilot could already undo a change. It could not show you one first — and those are different guarantees. Rollback helps once damage is visible; preview stops it.
Preview before write
wppilot/preview-ability returns a field-by-field diff plus a URL you open in wp-admin. wppilot/apply-preview performs the write once you agree. Nothing is written in between.
A new Preview screen lists what an agent has proposed but not made, naming the AI client and the WordPress user behind each one — several clients usually connect as the same administrator, so the user alone cannot tell you who proposed a change.
Computed, not performed
Each supported write has a projector deriving the after-state from the current state and your input. The site is never touched to produce a preview.
Executing inside a transaction and rolling back was rejected for a specific reason: wp_update_post() calls clean_post_cache(), which re-primes the object cache from the uncommitted row. ROLLBACK restores MySQL and leaves Redis serving the previewed content — a readonly ability that permanently changed the site.
It never invents a diff
An ability with no projector is refused by name with a reason: writes_files for a plugin install, arbitrary_effect for PHP execution, already_staged for the Gutenberg queue, which is itself a review mechanism. A call that would be rejected is reported as would_fail with the error, rather than shown as a change that was never going to land.
Applying checks the target has not moved
Scoped to the fields in the diff plus the fields the projection read — not the whole record, which would trip on any plugin touching an unrelated meta key between preview and apply. A change elsewhere is reported as a warning and the write proceeds. A change to what you reviewed refuses with wppilot_preview_drifted and writes nothing, permanently: your approval described a state that no longer exists.
Applying also re-runs the safety profile check and the ability's own confirmation requirement, so it is not a route around either.
Optional enforcement
A new Settings option — off by default, never enabled by an upgrade — requires a reviewed preview before agent writes over MCP and REST. Abilities WPPilot cannot preview are exempt rather than blocked, because "you must preview this" plus "this cannot be previewed" removes an ability rather than reviewing it.
Two fixes found by testing every ability against a real install
wppilot/import-media-url could never run. It requires three WordPress core files before downloading, and one was named wp-admin/includes/wppilot-media.php — a rebrand find-and-replace that renamed a core path. Every call died on require_once before reaching the download. Importing an image from a URL now works end to end.
Abilities that take no input rejected the call that says so. WordPress refuses any non-null input when an ability declares no input schema, so sending {} — what MCP clients send rather than omitting the field — returned HTTP 400 while omitting it succeeded. Six abilities were affected, including the site-settings read and all three diagnostics reports.
Notes
Existing connections keep working and do not need re-authorising. No permission changes.
Install wppilot-1.5.0.zip below — the GitHub "Source code" archive is not installable.
If you run WPPilot Pro, update it to 1.1.2 alongside this release.
447 unit tests. All 99 Free abilities invoked against WordPress 7.0.3 / PHP 8.3.31 with zero problems, verified against this artifact installed via wp plugin install.