Safety — five gates on every write

Five things happen before your site changes.

Most WordPress AI integrations are a thin wrapper over the REST API: the agent calls, something happens, and you find out by looking. SiteHelm is built the other way round.

Every write passes the same five gates in the same order, whichever of the operations it is, and whichever agent asked. None of them can be switched off from the agent's side — the plugin owns the gate, not the caller.

Gate 1 — preview

Nothing is written on the first call.

A write called without a plan token does not write. It returns a plan: the current value, the proposed value, and a token. Applying it is a second, deliberate call carrying that token.

The token is bound to the arguments it was issued for. Change one of them and the token is stale — the plugin answers StalePlan rather than applying a change you never saw.

Every one of the writes in the catalogue declares preview required. There is no operation that skips this.

Gate 2 — capability

Your WordPress permissions, not the agent’s.

SiteHelm authenticates as a real WordPress user through an Application Password, and every operation asks WordPress for a named capability against the specific object before it does anything.

An editor account gets an editor’s reach. There is no service account, no bypass, and no god-mode key: revoke the Application Password and the agent is out, immediately and completely.

Gates 3 and 4 — snapshot, verify

The old value is kept, and the new one is read back.

Before a change lands, the prior state is snapshotted. After it lands, SiteHelm reads the site back and compares what it found against what the plan promised.

A write that lands but disagrees with its own promise is reported as VerificationFailed, with completedSteps saying how far it got. That is a different answer from success, and the plugin will not round it up.

Snapshot
required, supported, or not applicable

Supported covers writes that create rather than overwrite, where there is no prior state to keep.

Rollback
required, supported, unsupported, or not applicable

A destructive operation must declare required.

Risk
low, medium, or high

Blast radius, not difficulty. A site-wide design token change is high risk even though it is a small edit.

Cue 4 — blackout

A refusal is information, not an error.

There are exactly eleven ways SiteHelm says no. It is a closed set, and every one of them carries an operator-facing message and, where one exists, the remedy.

AuthenticationFailed
No authenticated WordPress user

Check the Application Password, and that it is sent over HTTPS

Forbidden
The user lacks the capability for this object

Use an account with the required role

IntegrationUnavailable
The required plugin is not active

Activate Elementor, ACF, or Meta Box

UnsupportedVersion
The plugin is present but below its floor

Update the plugin

InvalidInput
Arguments failed the input schema or a validation rule

Correct the arguments; the message names the offending key

TargetNotFound
The addressed object does not exist

Re-read to get a current identifier

Conflict
The target changed under you, or the request contradicts itself

Re-read and retry

StalePlan
The plan token was reused, expired, or the arguments changed

Take a fresh preview

ExecutionFailed
The write did not land

Retry with a fresh plan

VerificationFailed
The write landed but the read-back disagreed with the promise

Inspect the site; completedSteps says how far it got

RollbackUnavailable
The recorded state cannot be restored

Fix by hand; the message says what is missing

What a refusal never carries

A message written for the person reading it, and nothing written for an attacker: no a stack trace, a filesystem path, a SQL fragment, a database error string, an authorization header, and no a resolved IP address.

And four things it will always refuse

Never
Arbitrary PHP

No eval, no snippet store, no theme-file editor. There is no path from an agent to executing code.

Never
Unrestricted SQL

No query passthrough. Every read and write goes through a typed operation with a schema.

Never
Unrestricted filesystem

No arbitrary file writes, and no WP-CLI passthrough.

Never
Irreversible deletion

Nothing is destroyed without a snapshot that can put it back.

Gate 5 — the ledger

Every change is written down, and most can be put back.

The audit ledger records what changed, when, by whom, and whether the snapshot behind it can still restore the previous state. It is readable from the plugin’s own Activity screen and through audit-list, so the agent can check its own work.

Rollback is one control on that screen. There is also a global write pause, per-module and per-operation switches, and a revoke that ends a connection outright — none of which an agent can reach.

79 operations, and the controls that govern them, are all in the free plugin. Safety is not a paid tier.

Activity — illustrative
content.update Applied
elementor.global-colors.update Rolled back
user.role.set Refused

Synthetic rows, drawn to show the shape of the log.

Read the catalogue Install it