Documentation menu

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.

json
{
  "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#

  • default is always deny. Abilities installed later stay denied until you allow them.
  • rules maps an exact ability name (namespace/name) or a namespace wildcard (namespace/*) to allow, deny, or hold.
  • 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:

json
"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.