Skip to content
Development
Skill

/wp-abilities-verify

Verify a WordPress plugin's Abilities API registrations: enumerate abilities, check that callback behavior matches each annotation's claim (the adversarial readonly-but-writes detection), validate permissions and schemas, and validate audit documents produced by

From plugin
agent-skills
2.3k19 skills

Claude Code

$ npx -y skills add WordPress/agent-skills --skill wp-abilities-verify --agent claude-code

SKILL.md

wp-abilities-verify.SKILL.md
name: wp-abilities-verify
description: "Verify a WordPress plugin's Abilities API registrations: enumerate abilities, check that callback behavior matches each annotation's claim (the adversarial readonly-but-writes detection), validate permissions and schemas, and validate audit documents produced by wp-abilities-audit."
compatibility: "Targets WordPress 7.0+ plugins (PHP 7.4.0+). Requires a runnable environment (wp-env, docker-based dev stack, or equivalent) for runtime mode; static mode runs entirely from the plugin checkout with no env. Filesystem-based agent with bash + node."

WP Abilities Verify

Verify a WordPress plugin's Abilities API registrations. The centerpiece is the **adversarial annotation correctness check**: a `readonly: true` ability that actually writes (via `$wpdb->update`, `update_option`, a non-GET delegate, etc.) is a security and UX disaster because agents plan actions on the basis of the annotations they introspect. This skill catches those lies by reading the callback body and comparing what it does against what the annotation claims.

The skill also validates audit docs produced by `wp-abilities-audit`, checks permission gates and schema hygiene, and optionally executes each ability against a live environment.

When to use

  • After abilities have been registered in a plugin but before a PR

lands.

  • As a health-check on an already-shipped plugin (catch regressions

where a refactor turned a readonly ability into a writing one).

  • To validate an audit document before handing it to an implementer.

Two modes

  • **Static mode** — runs from the plugin checkout. No env. Enumerates

via source inspection, runs the adversarial correctness check, runs schema and permission lints, and validates audit docs.

  • **Runtime mode** — requires a running env. Does everything static

does PLUS: `wp_get_abilities()` for authoritative enumeration, executes each ability with curated inputs, confirms permission roundtrip against real users, and runs a twin-invocation heuristic on `idempotent: true` abilities to flag candidates for review (return-value equality is a signal, not a verdict — core defines idempotent as "no additional effect on the environment").

Both modes produce the same structured report format.

A static-mode PASS means "no obvious-shape violations," not "verified write-free." For high-stakes plugins, run runtime mode before landing — it catches bootstrap-order, permission-roundtrip, and idempotency issues that static can't. See `references/annotation-correctness.md` for the static blind spots.

Inputs required

1. **Plugin checkout path** — working tree to verify. 2. **Mode** — `static` or `runtime`. Default to static if unspecified. 3. **(Runtime only) Env-up command** — read the plugin's `AGENTS.md`. Common patterns: `npm run wp-env start`, `npx wp-env start`, or a composer-based bring-up. Plugin families with their own dev tooling will document their own command. Do NOT assume `npm run wp-env` works. 4. **(Optional) Audit doc path** — enables cross-checks between the audit and the registered abilities, and validates the audit itself. 5. **Report output path** — explicit path, typically the user's vault.

Prerequisites

  • `wp-project-triage` has been run on the plugin.
  • The plugin has at least one registered ability in source. Zero hits

on `wp_register_ability(` → return a clear "no abilities registered" report, not an empty PASS.

Procedure

1. (If audit provided) Validate the audit doc

Read `references/audit-schema-validation.md`. Validate the audit against the canonical schema owned by `wp-abilities-audit`. Surface missing required fields, multiple `reference_ability: true`, and `backing: null` entries that aren't paired with a `surfaced_gaps` entry. `backing: null` alone is WARN (intentional gap output), not FAIL.

2. Enumerate abilities statically

Read `references/static-enumeration.md`. Find each `wp_register_ability(` call, extract the name, the annotation block, and the execute-callback location. Use a multi-line tool (`rg --multiline --pcre2`) — the canonical formatting splits the call across lines. Record each ability's source-file + line + annotations + callback byte range.

3. (Runtime only) Enumerate via REST + wp-cli

Read `references/runtime-harness.md`. Bring the env up using the command from `AGENTS.md`, then enumerate via `wp_get_abilities()` over wp-cli and cross-check against the static inventory. Source-only → FAIL (registration not firing). Runtime-only → WARN (dynamic registration path).

4. Annotation correctness (the adversarial core)

Read `references/annotation-correctness.md`. Read each callback body and verify it matches the annotation claim:

  • `readonly: true` → callback must not write to the database, the

options table, post / user / term / comment data, the filesystem, cron, or via non-GET HTTP / REST delegates.

  • `destructive: false` → callback must not delete, refund, void,

cancel, or trash.

  • `idempotent: true` → repeated calls with the same input have no

additional effect on the environment (per the `idempotent` annotation's docblock in `class-wp-ability.php`). Static catches counter writes and per-call cron schedules; runtime adds a twin-invocation heuristic for visible state changes.

The reference lists common write patterns as a starting set, not a checklist — plugin vocabularies vary, and the agent extends with verbs specific to the plugin under verification.

False positives get suppressed via an inline `// verify-ignore: <annotation> -- <reason>` comment.

5. Permission roundtrip

Read `references/permission-roundtrip.md`. Static: classify each `permission_callback` against the six shapes (preferred Shape A `current_user_can(...)`; FAIL on Shape B-bad `WP_REST_Request` patterns or Shape E literal `true`). Runtime: anon and subscriber denied; admin allowed (unless deliberately public). When an audit was provided, cross-chec

Read more
@wordpress
Ships withagent-skills

Teach AI coding assistants how to build WordPress the right way. Agent Skills are portable bundles of instructions, checklists, and scripts that help AI assistants (Claude, Copilot, Codex, Cursor, etc.)

Stars on GitHub

Momentum

stars in total
2.3k
Star history of WordPress/agent-skills on GitHub, a chart by star-history.com

Other skills on agent-skills.

blueprint

blueprint

Use when the deliverable is WordPress Playground Blueprint JSON or a Blueprint bundle, including creating, editing, reviewing,…

wordpress-router

wordpress-router

Use when the user asks about WordPress codebases (plugins, themes, block themes, Gutenberg blocks, WP core checkouts) and you…

wp-abilities-api

wp-abilities-api

Use when working with the WordPress Abilities API (wp_register_ability, wp_register_ability_category, /wp-json/wp-abilities/v1/*,…

wp-abilities-audit

wp-abilities-audit

Audit a WordPress plugin's REST surface and produce a standardized audit document proposing Abilities API registrations. Produces…

wp-block-themes

wp-block-themes

Use when developing WordPress block themes: theme.json (global settings/styles), templates and template parts, patterns, style…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills12d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc13d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react2d252k
@facebook@facebookInstall Skill

Questions about wp-abilities-verify.

Which coding agents can use wp-abilities-verify?
wp-abilities-verify installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.