Black Friday: 79% off every plugin Shop the sale →

Severities and Rules

Each finding is produced by a rule. A rule has an ID, a title, a fixed severity, an explanation of why the problem matters, fix advice and a link to the relevant WordPress documentation.

Severities#

SeverityMeaning
CriticalLogged-out visitors or subscribers can run something that may change data. Fix immediately.
HighDestructive abilities exposed to remote clients, or writable by contributors and authors. Fix soon.
MediumMissing annotations, loose or missing input validation, or an orphaned category. Fix in the next release.
LowQuality issues: missing output schema, short description.
InfoNot a problem. Tells you which channels an ability is exposed on, so you know the attack surface.

Built-in rules#

SeverityRule IDTitleFires when
Criticallow-privilege-writeVisitors or subscribers can run an ability that may change dataThe permission check passes for Anonymous or Subscriber and the ability is not annotated read-only.
Highdestructive-exposedDestructive ability is exposed to remote clientsThe ability is annotated destructive and is effectively exposed to REST or MCP.
Highauthor-writeContributors or authors can run a destructive or unannotated abilityThe permission check passes for Contributor or Author and the ability is destructive or has no annotations.
Mediummissing-annotationsMissing behavior annotationsNeither readonly nor destructive is set.
Mediuminput-schemaInput is not strictly validatedThere is no input schema, or an object schema without additionalProperties: false.
Mediumunregistered-categoryCategory is not registeredThe ability’s category is no longer registered.
Lowoutput-schemaNo output schemaThere is no output schema.
Lowshort-descriptionDescription is too shortThe description is empty or under 20 characters.
Infoexposure-summaryExposed to remote clientsThe ability is exposed, listing each channel and where its exposure comes from.

How a finding is written#

Every finding includes:

  • Message: what was observed, for example “The permission check passes for: Anonymous, Subscriber. The ability is not annotated read-only.”
  • Why it matters: the risk in plain language.
  • How to fix: concrete advice, such as using current_user_can( 'edit_post', $input['id'] ) instead of __return_true or is_user_logged_in(), or adding readonly => true when the ability really changes nothing.
  • Documentation: a link to the Abilities API handbook, the schema guide, or the relevant Make WordPress post.

Fingerprints#

Each finding has a stable fingerprint made of its rule ID and ability name. The History tab, the “new since last audit” badge and the email alerts all compare fingerprints, so a problem you already know about is never counted as new again.

Why some rules rarely fire#

Core refuses to register an ability whose category does not exist and requires a non-empty description. So unregistered-category only fires when a category is removed after its abilities registered, and short-description in practice means “under 20 characters”.

Adding your own rules#

Developers can add, remove or replace rules with the abau_rules filter. See Hooks & Filters.

Was this article helpful?