Policy reference
Every agent has one policy, a JSON document edited in Agent Warden → Agents → Edit policy. Each save that changes it creates a new version, and every logged action records the version in force.
{
"schema_version": 1,
"mode": "live",
"abilities": {
"default": "deny",
"rules": { "core/get-site-info": "allow", "woocommerce/*": "hold" }
},
"hard_blocks": {
"publish": true, "delete": true, "trash": true, "settings": true,
"users": true, "plugins_themes": true, "irreversible": true
},
"limits": {
"writes_per_hour": null, "deletes_per_session": null, "session_minutes": null,
"concurrent_sessions": null, "daily_actions": null
},
"schedule": null,
"scopes": {}
}
Unknown keys are refused at every level, so a typo can't silently weaken a policy. Every error is reported at once, with the path of the field.
mode#
| Mode | Effect |
|---|---|
live |
Allowed abilities run |
dry_run (Pro) |
Allowed abilities are simulated. The agent sees what would change, and nothing changes |
approval_required |
Every ability that is not read-only waits for approval |
holds_only |
The same as live in 1.0.0: only abilities with a hold rule wait for approval. It names the per-ability holds mode from the product plan |
abilities#
defaultis alwaysdeny. Abilities installed later stay denied until you allow them.rulesmaps an exact ability name (namespace/name) or a namespace wildcard (namespace/*) toallow,deny, orhold.- Precedence: an exact rule, then a namespace wildcard, then deny. There is no global wildcard.
hard_blocks#
A hard block refuses an action whatever the rules say, approval included. Each block defaults to on, and turning one off must be explicit.
| Block | Refuses |
|---|---|
publish |
Publishing content |
delete |
Permanent deletion |
trash |
Moving content to the trash |
settings |
Changing site options |
users |
Creating, editing, or deleting users |
plugins_themes |
Installing, updating, activating, or deleting plugins and themes |
irreversible |
Any ability classed as irreversible (for example refunds or sent emails) |
limits#
null means unlimited, and 0 means none allowed.
| Limit | Counts |
|---|---|
writes_per_hour |
Changes in the last hour |
deletes_per_session |
Deletions in one session |
session_minutes |
How long one session may last |
concurrent_sessions |
Open sessions at once |
daily_actions |
Actions in the last 24 hours |
schedule#
null, or {"timezone": "Europe/London", "days": ["mon", "tue"], "start": "09:00", "end": "17:00"}. Outside the window every call is refused. An end earlier than start spans midnight. Timezones are IANA names.
scopes (Pro)#
Limit an ability, or a namespace wildcard, to particular content:
"scopes": {
"agentwarden/update-post": {
"post_types": ["post"],
"post_statuses": ["draft", "pending"],
"authors": ["agent"],
"terms": { "category": [12] },
"created_by_agent": true
}
}
ids limits an ability to particular post IDs. "agent" in authors stands for the agent's own user. A call outside its scope is refused before it runs. Saved scopes stay enforced after a downgrade.