Audits a WordPress plugin's REST surface and produces a standardized audit document proposing Abilities API registrations. Useful for planning Abilities API rollout or scoping work.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wordpress-agent-skills-9:wp-abilities-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Produce a standardized audit document for a WordPress plugin's REST surface,
Produce a standardized audit document for a WordPress plugin's REST surface, proposing a set of Abilities API registrations grouped by semantic intent. The audit doc is a planning artifact for implementers — humans, agents, or both — that captures the controller inventory, capability gates, and proposed ability shapes in a structured form. A reviewer reading the doc can scope the work without re-deriving the survey.
This skill works on any plugin that exposes a REST surface. Plugin
classification (for purposes of the optional plugin_family annotation) is
the user's call; the workflow itself is plugin-agnostic.
wp-project-triage first if not already done. The
audit consumes signals.usesAbilitiesApi, versions.wordpress, and
project.kind from the report.auditor field.wp-project-triage has run successfully and classified the plugin.Read references/controller-enumeration.md now — it covers the two observed
enumeration paths (glob for standard layouts, grep as the universal fallback)
and when to use each.
Record every controller class + file + REST base + routes in a "Controller Inventory" table. The inventory is exhaustive even though only a subset becomes proposed abilities.
For every controller found, extract the fields the audit schema requires:
class, file, HTTP method, route, route-registration line number, callback
name, callback line number, permission callback, whether the callback takes
a WP_REST_Request argument or is zero-arg, and the return type.
Read references/audit-schema.md now for the exact field list and the shape
of proposed_abilities entries. Line-number fields may be null for
inherited callbacks — the schema allows this and pairs it with an optional
inherited_from field.
Trace each controller's permission_callback to its current_user_can() call
(or to the post-type capability machinery if the controller extends a
post-type-backed base).
Read references/capability-gate-tracing.md now — it documents the two
common mechanisms (direct check_permission() vs post-type-backed
wc_rest_check_post_permissions()) and how to represent each in the schema.
Note explicitly whether read and write gates differ: compound gates are
represented as a {read, write} object, not a single string.
Do NOT atomize one ability per HTTP method. Apply the semantic-intent grouping heuristic — it's the only grouping rule this skill uses.
Read ../wp-abilities-api/references/grouping-heuristic.md now — do NOT
re-derive the rules here. Short version: one ability per real-world question
or state transition, with filter parameters in input_schema collapsing N
variants into 1.
Apply the use-case sanity check before populating any candidate. Per
../wp-abilities-api/references/domain-vs-projection.md's use-case-contract
test: would a human or agent intentionally perform this behavior through a
supported plugin workflow? If yes, the candidate is a real ability —
proceed to fill in fields. If no, the route is internal transport plumbing
(cache invalidation, scheduler ticks, bookkeeping endpoints, debug
introspection) — keep it in the Controller Inventory section for
completeness, but do NOT promote it to proposed_abilities. The route may
be useful to inventory; the proposed ability must represent a real
user/operator question or action.
For each proposed ability that passes the sanity check, fill in every
field in the proposed_abilities schema: name, intent, backing,
permission, return_type, effort (S/M/L), annotations
(readonly/destructive/idempotent), notes, risks, use_case_fit,
side_effects, seed_data_needs.
The last three are the implementation-readiness facts the implementer
and the verify-mode tooling both need: which human/agent workflow this
ability serves (use_case_fit), what the backing path emits on every
call (side_effects — empty array is a fact, not a missing value), and
what representative data must exist in the test environment for the
ability to execute through the public boundary (seed_data_needs).
Three buckets:
excluded_from_mvp — candidates intentionally deferred for risk reasons
(real-money writes, irreversible state changes, or prerequisite design
work). Each entry gets a one-sentence reason.surfaced_gaps — MVP candidates with no backing endpoint (ability with
backing: null), plus high-value endpoints discovered during enumeration
that aren't in the MVP list but would be easy future wins.permission_callback => '__return_true' that must NOT copy that into the
ability registration).Write to the explicit output path collected in "Inputs required". The
document structure must match references/audit-schema.md exactly:
Last updated: YYYY-MM-DD HH:MM header.proposed_abilities,
excluded_from_mvp, surfaced_gaps.A copy-pasteable minimal example showing the full shape lives in
references/audit-schema.md under "Minimal valid example" — start there
when authoring a new audit.
Set reference_ability: true on the first ability an implementer should
land — typically the smallest, safest, highest-leverage read. This gives
downstream workflows a deterministic starting point.
references/audit-schema.md (all required top-level
fields present, at least one entry in proposed_abilities, annotations
complete on every ability).capability_gate is a string for single-cap plugins or a {read, write}
object for post-type-backed plugins.backing: null also appears in surfaced_gaps.audit-schema.md "Known
limitations" without errors.WP_REST_Posts_Controller,
or extension plugins built on a parent's REST classes) — capture with
backing.inherited_from: "<parent FQCN>". Line-number fields may be
null per the schema.{read, write} form documented in
references/capability-gate-tracing.md. Don't smuggle a /-separated
string into a field typed as a single cap.../wp-abilities-api/references/grouping-heuristic.md. Do not invent
alternative grouping rules in the audit doc.permission_callback => '__return_true' —
legal at the REST layer, but the ability's own permission_callback must
match the plugin's merchant gate. Never promote '__return_true' into an
ability registration. Note this in the ability's risks.plans/). Writing the audit
into the plugin's own git history pollutes the worktree and buries the
artifact.references/controller-enumeration.md (neither the standard glob nor the
grep fallback produces a complete inventory), update that reference with
the new convention and open a PR so future audits cover it deterministically.references/capability-gate-tracing.md, extend that file rather than
encoding the new case in the audit's "Notes and Surprises" only.3plugins reuse this skill
First indexed Jun 6, 2026
npx claudepluginhub joshuarweaver/cascade-code-general-misc-4 --plugin wordpress-agent-skills-9Verifies WordPress plugin Abilities API registrations: checks callback behavior matches annotations (readonly-but-writes detection), validates permissions and schemas, and validates audit documents.
Reviews WordPress plugin/theme code for missing REST permission_callbacks, unescaped block output, missing input sanitization, and missing nonce/capability checks.
Reviews WordPress plugins, themes, and blocks for security vulnerabilities, internationalization issues, performance problems, and API correctness before shipping.