Duplicate-Before-Edit Workflow
How Respira stages a page edit on a duplicate, why the original stays untouched until you approve, and when a write goes live directly.
Overview
When an AI assistant edits a page through Respira, the edit does not land on your live page. Respira creates a duplicate, writes to the duplicate, and leaves the original exactly as it was until a human approves the change.
This is the default for everything page-shaped: pages, posts, and custom post types.
What you'll learn
- What actually happens to your live page when an agent edits it
- Where you approve or reject a staged change
- When a write goes live directly instead, and how to tell in advance
Why staging rather than undo
Undo is a promise you make after the damage. Staging is a promise you make before it.
An agent that edits live and rolls back on failure still leaves a window where your page is wrong, and it depends on the agent noticing. Staging removes the window: the visitor-facing page does not change until a person says so.
Respira keeps both. Staged writes are the default, and snapshots sit underneath for the cases where a write does go live.
The flow
The agent asks to edit a page
You ask your assistant to change something. It calls a write tool such as respira_update_page or respira_update_element.
Respira creates a duplicate
The duplicate is a real WordPress post, marked as a Respira duplicate and linked back to the original. The original is not modified. You can keep working on it in WordPress while the duplicate exists.
The write lands on the duplicate
Builder content, styling and metadata are written to the duplicate. The agent gets back the duplicate's ID and preview URL, so it can show you what changed before you decide.
You approve or reject in WordPress
Approving copies the duplicate's content onto the original and cleans the duplicate up. Rejecting discards the duplicate and leaves the original untouched.
Where approval happens
Approval is a WordPress admin action, not an agent action. You approve from the Respira screens inside wp-admin.
This is deliberate and worth stating plainly: approve_duplicate, reject_duplicate and detach_duplicate exist in the plugin's REST layer but are not exposed as MCP tools. An agent can create and fill a duplicate. It cannot approve its own work.
So an assistant cannot talk itself into publishing. The approval step needs a person in WordPress, which is the whole point of the design.
Share preview links (8.7.5+)
The person whose yes matters often has no WordPress login: a client, a colleague, an outside reviewer. Since plugin 8.7.5, every staged duplicate returns a share preview link alongside the write, and the response message repeats it so assistants quote the right URL.
- The link renders that one draft, to anyone who has it, with no login and no account. It grants nothing else.
- It expires after 14 days by default (the
respira_preview_share_ttl_daysoption tunes it per site). - Rejecting the staged change trashes the duplicate, which also kills the link immediately. Approving publishes the change, so the link has done its job.
- The token is signed with the site's own salt and nothing is stored: there is no list of share links to manage or leak.
The plain page URL (?page_id=...) stays login-gated while the post is a draft. If someone reports a preview link "not working," check they were sent the share link from the response, not the page URL.
The full guide, including how to change the lifetime and what the person sees, is on Share preview links.
When a write goes live directly
Staging is the default, not the only path. Some writes go straight to the live object, and Respira says which before it does.
Editing an original on purpose. If you want the agent to edit the live page rather than a duplicate, the site needs Direct Editing enabled, and the call has to carry both force=true and confirm_live_edit=true. An attempt without them is refused with a confirmation_required response naming what would change. Direct Editing is off by default.
Site-level structures. Templates, patterns, navigation and global styles are not pages and have no duplicate to stage on. They use structural proposals instead: a write can be parked as a pending proposal for you to approve, and every write is fingerprint-checked, snapshotted, read back, and server-render verified. Structural writes are beta-gated per site and off by default.
Divi Theme Builder global layouts. These are snapshotted and reversible but written live, because Divi resolves a global layout by ID and a duplicate would compete with the original rather than stand in for it. The first attempt is refused and names the blast radius; re-sending with confirm_live_edit=true proceeds. That is a confirmation, not an approval.
What a duplicate is not
A duplicate is not a revision, and not a draft of the original. It is a separate post that Respira tracks. Two consequences worth knowing:
- It appears in your posts list while it exists, marked as a Respira duplicate
- If you never approve or reject it, it stays there. Rejecting is the tidy way to say no
To keep a duplicate as a standalone page rather than merge it back, detach it. Detaching breaks the link to the original and leaves you with an ordinary page.
Related
Safety philosophy
The full safety contract: snapshots, verification states, and what "verified" means.