[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-wordpress-wp-abilities-audit":3,"mdc-xpmqmc-key":46,"related-repo-wordpress-wp-abilities-audit":986,"related-org-wordpress-wp-abilities-audit":1099},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":35,"repoUrl":36,"updatedAt":37,"license":38,"forks":39,"topics":40,"repo":41,"sourceUrl":44,"mdContent":45},"wp-abilities-audit","audit WordPress plugins for Abilities API registration","Audit a WordPress plugin's REST surface and produce a standardized audit document proposing Abilities API registrations. Produces a markdown doc with a YAML schema and prose sections that humans and agents can both consume when planning a registration rollout. Works on any WP plugin.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"wordpress","WordPress","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fwordpress.png",[12,16,19,22,25,26,29,32],{"name":13,"slug":14,"type":15},"Abilities API","abilities-api","tag",{"name":17,"slug":18,"type":15},"Documentation","documentation",{"name":20,"slug":21,"type":15},"YAML","yaml",{"name":23,"slug":24,"type":15},"Audit","audit",{"name":9,"slug":8,"type":15},{"name":27,"slug":28,"type":15},"Plugin Development","plugin-development",{"name":30,"slug":31,"type":15},"REST API","rest-api",{"name":33,"slug":34,"type":15},"Code Analysis","code-analysis",1892,"https:\u002F\u002Fgithub.com\u002FWordPress\u002Fagent-skills","2026-05-28T06:48:49.361753",null,284,[],{"repoUrl":36,"stars":35,"forks":39,"topics":42,"description":43},[],"Expert-level WordPress knowledge for AI coding assistants - blocks, themes, plugins, and best practices","https:\u002F\u002Fgithub.com\u002FWordPress\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fwp-abilities-audit","---\nname: wp-abilities-audit\ndescription: \"Audit a WordPress plugin's REST surface and produce a standardized audit document proposing Abilities API registrations. Produces a markdown doc with a YAML schema and prose sections that humans and agents can both consume when planning a registration rollout. Works on any WP plugin.\"\ncompatibility: \"Targets WordPress 7.0+ (PHP 7.4.0+). Filesystem-based agent with bash + node. Requires access to the plugin checkout; some workflows benefit from WP-CLI but don't require it.\"\n---\n\n# WP Abilities Audit\n\nProduce a standardized audit document for a WordPress plugin's REST surface,\nproposing a set of Abilities API registrations grouped by semantic intent. The\naudit doc is a planning artifact for implementers — humans, agents, or both —\nthat captures the controller inventory, capability gates, and proposed\nability shapes in a structured form. A reviewer reading the doc can scope the\nwork without re-deriving the survey.\n\nThis skill works on any plugin that exposes a REST surface. Plugin\nclassification (for purposes of the optional `plugin_family` annotation) is\nthe user's call; the workflow itself is plugin-agnostic.\n\n## When to use\n\n- The task is \"register Abilities API abilities for a WP plugin\" and no audit\n  doc exists yet.\n- Planning participation in a multi-plugin abilities rollout and need a\n  shareable, standardized audit artifact.\n- Pre-flight checking a plugin's agent-readiness before implementing abilities.\n- A PM or non-implementer wants to scope the work before engineering picks it up.\n\n## Inputs required\n\n1. **Plugin checkout path** — working tree of the plugin to audit.\n2. **Triage output** — run `wp-project-triage` first if not already done. The\n   audit consumes `signals.usesAbilitiesApi`, `versions.wordpress`, and\n   `project.kind` from the report.\n3. **Auditor identity** — name and team or context, recorded in the audit's\n   `auditor` field.\n4. **Output path** — where the audit doc should land. Default explicit over\n   implicit; ask if not provided rather than writing into the plugin worktree.\n\n## Prerequisites\n\n- `wp-project-triage` has run successfully and classified the plugin.\n- The plugin has at least one REST controller. If enumeration finds zero\n  controllers, the audit doesn't apply — see \"Failure modes\" below.\n\n## Procedure\n\n### 1. Enumerate REST controllers\n\nRead `references\u002Fcontroller-enumeration.md` now — it covers the two observed\nenumeration paths (glob for standard layouts, grep as the universal fallback)\nand when to use each.\n\nRecord every controller class + file + REST base + routes in a \"Controller\nInventory\" table. The inventory is exhaustive even though only a subset\nbecomes proposed abilities.\n\n### 2. For each controller, extract the backing fields\n\nFor every controller found, extract the fields the audit schema requires:\nclass, file, HTTP method, route, route-registration line number, callback\nname, callback line number, permission callback, whether the callback takes\na `WP_REST_Request` argument or is zero-arg, and the return type.\n\nRead `references\u002Faudit-schema.md` now for the exact field list and the shape\nof `proposed_abilities` entries. Line-number fields may be `null` for\ninherited callbacks — the schema allows this and pairs it with an optional\n`inherited_from` field.\n\n### 3. Confirm capability gate(s)\n\nTrace each controller's `permission_callback` to its `current_user_can()` call\n(or to the post-type capability machinery if the controller extends a\npost-type-backed base).\n\nRead `references\u002Fcapability-gate-tracing.md` now — it documents the two\ncommon mechanisms (direct `check_permission()` vs post-type-backed\n`wc_rest_check_post_permissions()`) and how to represent each in the schema.\nNote explicitly whether read and write gates differ: compound gates are\nrepresented as a `{read, write}` object, not a single string.\n\n### 4. Propose abilities using semantic-intent grouping\n\nDo NOT atomize one ability per HTTP method. Apply the semantic-intent grouping\nheuristic — it's the only grouping rule this skill uses.\n\nRead `..\u002Fwp-abilities-api\u002Freferences\u002Fgrouping-heuristic.md` now — do NOT\nre-derive the rules here. Short version: one ability per real-world question\nor state transition, with filter parameters in `input_schema` collapsing N\nvariants into 1.\n\n**Apply the use-case sanity check before populating any candidate.** Per\n`..\u002Fwp-abilities-api\u002Freferences\u002Fdomain-vs-projection.md`'s use-case-contract\ntest: would a human or agent intentionally perform this behavior through a\nsupported plugin workflow? If yes, the candidate is a real ability —\nproceed to fill in fields. If no, the route is internal transport plumbing\n(cache invalidation, scheduler ticks, bookkeeping endpoints, debug\nintrospection) — keep it in the Controller Inventory section for\ncompleteness, but do NOT promote it to `proposed_abilities`. The route may\nbe useful to inventory; the proposed ability must represent a real\nuser\u002Foperator question or action.\n\nFor each proposed ability that passes the sanity check, fill in every\nfield in the `proposed_abilities` schema: `name`, `intent`, `backing`,\n`permission`, `return_type`, `effort` (S\u002FM\u002FL), `annotations`\n(readonly\u002Fdestructive\u002Fidempotent), `notes`, `risks`, `use_case_fit`,\n`side_effects`, `seed_data_needs`.\n\nThe last three are the implementation-readiness facts the implementer\nand the verify-mode tooling both need: which human\u002Fagent workflow this\nability serves (`use_case_fit`), what the backing path emits on every\ncall (`side_effects` — empty array is a fact, not a missing value), and\nwhat representative data must exist in the test environment for the\nability to execute through the public boundary (`seed_data_needs`).\n\n### 5. Surface gaps and deferred items\n\nThree buckets:\n\n- **`excluded_from_mvp`** — candidates intentionally deferred for risk reasons\n  (real-money writes, irreversible state changes, or prerequisite design\n  work). Each entry gets a one-sentence reason.\n- **`surfaced_gaps`** — MVP candidates with no backing endpoint (ability with\n  `backing: null`), plus high-value endpoints discovered during enumeration\n  that aren't in the MVP list but would be easy future wins.\n- **Risks per ability** — anything about a backing endpoint that the\n  implementer must handle (no idempotency key, two-phase behavior,\n  state-transition caveats, zero-arg endpoints registered with\n  `permission_callback => '__return_true'` that must NOT copy that into the\n  ability registration).\n\n### 6. Write the audit doc\n\nWrite to the explicit output path collected in \"Inputs required\". The\ndocument structure must match `references\u002Faudit-schema.md` exactly:\n\n1. `Last updated: YYYY-MM-DD HH:MM` header.\n2. YAML block with all required top-level metadata + `proposed_abilities`,\n   `excluded_from_mvp`, `surfaced_gaps`.\n3. \"Controller Inventory\" table.\n4. \"Notes and Surprises\" prose section.\n\nA copy-pasteable minimal example showing the full shape lives in\n`references\u002Faudit-schema.md` under \"Minimal valid example\" — start there\nwhen authoring a new audit.\n\n### 7. (Optional) Designate a reference implementation ability\n\nSet `reference_ability: true` on the first ability an implementer should\nland — typically the smallest, safest, highest-leverage read. This gives\ndownstream workflows a deterministic starting point.\n\n## Verification\n\n- The audit conforms to `references\u002Faudit-schema.md` (all required top-level\n  fields present, at least one entry in `proposed_abilities`, annotations\n  complete on every ability).\n- `capability_gate` is a string for single-cap plugins or a `{read, write}`\n  object for post-type-backed plugins.\n- Every ability with `backing: null` also appears in `surfaced_gaps`.\n- The doc round-trips through the validator in `audit-schema.md` \"Known\n  limitations\" without errors.\n\n## Failure modes \u002F debugging\n\n- **Plugin has no REST controllers** — audit doesn't apply. Consider\n  hooks\u002Ffilters-based abilities (out of scope for this skill's current\n  version) or skip abilities adoption for this plugin.\n- **Plugin inherits controllers from another repo** (common for plugins\n  extending core post-type-backed controllers like `WP_REST_Posts_Controller`,\n  or extension plugins built on a parent's REST classes) — capture with\n  `backing.inherited_from: \"\u003Cparent FQCN>\"`. Line-number fields may be\n  `null` per the schema.\n- **Compound capability gate (distinct read\u002Fwrite caps)** — use the\n  structured `{read, write}` form documented in\n  `references\u002Fcapability-gate-tracing.md`. Don't smuggle a `\u002F`-separated\n  string into a field typed as a single cap.\n- **Ambiguous grouping** — route to\n  `..\u002Fwp-abilities-api\u002Freferences\u002Fgrouping-heuristic.md`. Do not invent\n  alternative grouping rules in the audit doc.\n- **Zero-arg endpoints with `permission_callback => '__return_true'`** —\n  legal at the REST layer, but the ability's own `permission_callback` must\n  match the plugin's merchant gate. Never promote `'__return_true'` into an\n  ability registration. Note this in the ability's `risks`.\n- **Output path defaults to plugin worktree** — always ask the user for an\n  explicit output directory (e.g. their vault `plans\u002F`). Writing the audit\n  into the plugin's own git history pollutes the worktree and buries the\n  artifact.\n\n## Escalation\n\n- If the plugin uses an enumeration convention not covered by\n  `references\u002Fcontroller-enumeration.md` (neither the standard glob nor the\n  grep fallback produces a complete inventory), update that reference with\n  the new convention and open a PR so future audits cover it deterministically.\n- If capability tracing hits a mechanism not covered by\n  `references\u002Fcapability-gate-tracing.md`, extend that file rather than\n  encoding the new case in the audit's \"Notes and Surprises\" only.\n",{"data":47,"body":49},{"name":4,"description":6,"compatibility":48},"Targets WordPress 7.0+ (PHP 7.4.0+). Filesystem-based agent with bash + node. Requires access to the plugin checkout; some workflows benefit from WP-CLI but don't require it.",{"type":50,"children":51},"root",[52,60,66,80,87,112,118,203,209,227,233,240,253,258,264,277,312,318,339,375,381,386,406,431,531,557,563,568,625,631,643,690,702,708,721,727,798,804,953,959],{"type":53,"tag":54,"props":55,"children":56},"element","h1",{"id":4},[57],{"type":58,"value":59},"text","WP Abilities Audit",{"type":53,"tag":61,"props":62,"children":63},"p",{},[64],{"type":58,"value":65},"Produce a standardized audit document for a WordPress plugin's REST surface,\nproposing a set of Abilities API registrations grouped by semantic intent. The\naudit doc is a planning artifact for implementers — humans, agents, or both —\nthat captures the controller inventory, capability gates, and proposed\nability shapes in a structured form. A reviewer reading the doc can scope the\nwork without re-deriving the survey.",{"type":53,"tag":61,"props":67,"children":68},{},[69,71,78],{"type":58,"value":70},"This skill works on any plugin that exposes a REST surface. Plugin\nclassification (for purposes of the optional ",{"type":53,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":58,"value":77},"plugin_family",{"type":58,"value":79}," annotation) is\nthe user's call; the workflow itself is plugin-agnostic.",{"type":53,"tag":81,"props":82,"children":84},"h2",{"id":83},"when-to-use",[85],{"type":58,"value":86},"When to use",{"type":53,"tag":88,"props":89,"children":90},"ul",{},[91,97,102,107],{"type":53,"tag":92,"props":93,"children":94},"li",{},[95],{"type":58,"value":96},"The task is \"register Abilities API abilities for a WP plugin\" and no audit\ndoc exists yet.",{"type":53,"tag":92,"props":98,"children":99},{},[100],{"type":58,"value":101},"Planning participation in a multi-plugin abilities rollout and need a\nshareable, standardized audit artifact.",{"type":53,"tag":92,"props":103,"children":104},{},[105],{"type":58,"value":106},"Pre-flight checking a plugin's agent-readiness before implementing abilities.",{"type":53,"tag":92,"props":108,"children":109},{},[110],{"type":58,"value":111},"A PM or non-implementer wants to scope the work before engineering picks it up.",{"type":53,"tag":81,"props":113,"children":115},{"id":114},"inputs-required",[116],{"type":58,"value":117},"Inputs required",{"type":53,"tag":119,"props":120,"children":121},"ol",{},[122,133,175,193],{"type":53,"tag":92,"props":123,"children":124},{},[125,131],{"type":53,"tag":126,"props":127,"children":128},"strong",{},[129],{"type":58,"value":130},"Plugin checkout path",{"type":58,"value":132}," — working tree of the plugin to audit.",{"type":53,"tag":92,"props":134,"children":135},{},[136,141,143,149,151,157,159,165,167,173],{"type":53,"tag":126,"props":137,"children":138},{},[139],{"type":58,"value":140},"Triage output",{"type":58,"value":142}," — run ",{"type":53,"tag":72,"props":144,"children":146},{"className":145},[],[147],{"type":58,"value":148},"wp-project-triage",{"type":58,"value":150}," first if not already done. The\naudit consumes ",{"type":53,"tag":72,"props":152,"children":154},{"className":153},[],[155],{"type":58,"value":156},"signals.usesAbilitiesApi",{"type":58,"value":158},", ",{"type":53,"tag":72,"props":160,"children":162},{"className":161},[],[163],{"type":58,"value":164},"versions.wordpress",{"type":58,"value":166},", and\n",{"type":53,"tag":72,"props":168,"children":170},{"className":169},[],[171],{"type":58,"value":172},"project.kind",{"type":58,"value":174}," from the report.",{"type":53,"tag":92,"props":176,"children":177},{},[178,183,185,191],{"type":53,"tag":126,"props":179,"children":180},{},[181],{"type":58,"value":182},"Auditor identity",{"type":58,"value":184}," — name and team or context, recorded in the audit's\n",{"type":53,"tag":72,"props":186,"children":188},{"className":187},[],[189],{"type":58,"value":190},"auditor",{"type":58,"value":192}," field.",{"type":53,"tag":92,"props":194,"children":195},{},[196,201],{"type":53,"tag":126,"props":197,"children":198},{},[199],{"type":58,"value":200},"Output path",{"type":58,"value":202}," — where the audit doc should land. Default explicit over\nimplicit; ask if not provided rather than writing into the plugin worktree.",{"type":53,"tag":81,"props":204,"children":206},{"id":205},"prerequisites",[207],{"type":58,"value":208},"Prerequisites",{"type":53,"tag":88,"props":210,"children":211},{},[212,222],{"type":53,"tag":92,"props":213,"children":214},{},[215,220],{"type":53,"tag":72,"props":216,"children":218},{"className":217},[],[219],{"type":58,"value":148},{"type":58,"value":221}," has run successfully and classified the plugin.",{"type":53,"tag":92,"props":223,"children":224},{},[225],{"type":58,"value":226},"The plugin has at least one REST controller. If enumeration finds zero\ncontrollers, the audit doesn't apply — see \"Failure modes\" below.",{"type":53,"tag":81,"props":228,"children":230},{"id":229},"procedure",[231],{"type":58,"value":232},"Procedure",{"type":53,"tag":234,"props":235,"children":237},"h3",{"id":236},"_1-enumerate-rest-controllers",[238],{"type":58,"value":239},"1. Enumerate REST controllers",{"type":53,"tag":61,"props":241,"children":242},{},[243,245,251],{"type":58,"value":244},"Read ",{"type":53,"tag":72,"props":246,"children":248},{"className":247},[],[249],{"type":58,"value":250},"references\u002Fcontroller-enumeration.md",{"type":58,"value":252}," now — it covers the two observed\nenumeration paths (glob for standard layouts, grep as the universal fallback)\nand when to use each.",{"type":53,"tag":61,"props":254,"children":255},{},[256],{"type":58,"value":257},"Record every controller class + file + REST base + routes in a \"Controller\nInventory\" table. The inventory is exhaustive even though only a subset\nbecomes proposed abilities.",{"type":53,"tag":234,"props":259,"children":261},{"id":260},"_2-for-each-controller-extract-the-backing-fields",[262],{"type":58,"value":263},"2. For each controller, extract the backing fields",{"type":53,"tag":61,"props":265,"children":266},{},[267,269,275],{"type":58,"value":268},"For every controller found, extract the fields the audit schema requires:\nclass, file, HTTP method, route, route-registration line number, callback\nname, callback line number, permission callback, whether the callback takes\na ",{"type":53,"tag":72,"props":270,"children":272},{"className":271},[],[273],{"type":58,"value":274},"WP_REST_Request",{"type":58,"value":276}," argument or is zero-arg, and the return type.",{"type":53,"tag":61,"props":278,"children":279},{},[280,281,287,289,295,297,303,305,311],{"type":58,"value":244},{"type":53,"tag":72,"props":282,"children":284},{"className":283},[],[285],{"type":58,"value":286},"references\u002Faudit-schema.md",{"type":58,"value":288}," now for the exact field list and the shape\nof ",{"type":53,"tag":72,"props":290,"children":292},{"className":291},[],[293],{"type":58,"value":294},"proposed_abilities",{"type":58,"value":296}," entries. Line-number fields may be ",{"type":53,"tag":72,"props":298,"children":300},{"className":299},[],[301],{"type":58,"value":302},"null",{"type":58,"value":304}," for\ninherited callbacks — the schema allows this and pairs it with an optional\n",{"type":53,"tag":72,"props":306,"children":308},{"className":307},[],[309],{"type":58,"value":310},"inherited_from",{"type":58,"value":192},{"type":53,"tag":234,"props":313,"children":315},{"id":314},"_3-confirm-capability-gates",[316],{"type":58,"value":317},"3. Confirm capability gate(s)",{"type":53,"tag":61,"props":319,"children":320},{},[321,323,329,331,337],{"type":58,"value":322},"Trace each controller's ",{"type":53,"tag":72,"props":324,"children":326},{"className":325},[],[327],{"type":58,"value":328},"permission_callback",{"type":58,"value":330}," to its ",{"type":53,"tag":72,"props":332,"children":334},{"className":333},[],[335],{"type":58,"value":336},"current_user_can()",{"type":58,"value":338}," call\n(or to the post-type capability machinery if the controller extends a\npost-type-backed base).",{"type":53,"tag":61,"props":340,"children":341},{},[342,343,349,351,357,359,365,367,373],{"type":58,"value":244},{"type":53,"tag":72,"props":344,"children":346},{"className":345},[],[347],{"type":58,"value":348},"references\u002Fcapability-gate-tracing.md",{"type":58,"value":350}," now — it documents the two\ncommon mechanisms (direct ",{"type":53,"tag":72,"props":352,"children":354},{"className":353},[],[355],{"type":58,"value":356},"check_permission()",{"type":58,"value":358}," vs post-type-backed\n",{"type":53,"tag":72,"props":360,"children":362},{"className":361},[],[363],{"type":58,"value":364},"wc_rest_check_post_permissions()",{"type":58,"value":366},") and how to represent each in the schema.\nNote explicitly whether read and write gates differ: compound gates are\nrepresented as a ",{"type":53,"tag":72,"props":368,"children":370},{"className":369},[],[371],{"type":58,"value":372},"{read, write}",{"type":58,"value":374}," object, not a single string.",{"type":53,"tag":234,"props":376,"children":378},{"id":377},"_4-propose-abilities-using-semantic-intent-grouping",[379],{"type":58,"value":380},"4. Propose abilities using semantic-intent grouping",{"type":53,"tag":61,"props":382,"children":383},{},[384],{"type":58,"value":385},"Do NOT atomize one ability per HTTP method. Apply the semantic-intent grouping\nheuristic — it's the only grouping rule this skill uses.",{"type":53,"tag":61,"props":387,"children":388},{},[389,390,396,398,404],{"type":58,"value":244},{"type":53,"tag":72,"props":391,"children":393},{"className":392},[],[394],{"type":58,"value":395},"..\u002Fwp-abilities-api\u002Freferences\u002Fgrouping-heuristic.md",{"type":58,"value":397}," now — do NOT\nre-derive the rules here. Short version: one ability per real-world question\nor state transition, with filter parameters in ",{"type":53,"tag":72,"props":399,"children":401},{"className":400},[],[402],{"type":58,"value":403},"input_schema",{"type":58,"value":405}," collapsing N\nvariants into 1.",{"type":53,"tag":61,"props":407,"children":408},{},[409,414,416,422,424,429],{"type":53,"tag":126,"props":410,"children":411},{},[412],{"type":58,"value":413},"Apply the use-case sanity check before populating any candidate.",{"type":58,"value":415}," Per\n",{"type":53,"tag":72,"props":417,"children":419},{"className":418},[],[420],{"type":58,"value":421},"..\u002Fwp-abilities-api\u002Freferences\u002Fdomain-vs-projection.md",{"type":58,"value":423},"'s use-case-contract\ntest: would a human or agent intentionally perform this behavior through a\nsupported plugin workflow? If yes, the candidate is a real ability —\nproceed to fill in fields. If no, the route is internal transport plumbing\n(cache invalidation, scheduler ticks, bookkeeping endpoints, debug\nintrospection) — keep it in the Controller Inventory section for\ncompleteness, but do NOT promote it to ",{"type":53,"tag":72,"props":425,"children":427},{"className":426},[],[428],{"type":58,"value":294},{"type":58,"value":430},". The route may\nbe useful to inventory; the proposed ability must represent a real\nuser\u002Foperator question or action.",{"type":53,"tag":61,"props":432,"children":433},{},[434,436,441,443,449,450,456,457,463,465,471,472,478,479,485,487,493,495,501,502,508,509,515,516,522,523,529],{"type":58,"value":435},"For each proposed ability that passes the sanity check, fill in every\nfield in the ",{"type":53,"tag":72,"props":437,"children":439},{"className":438},[],[440],{"type":58,"value":294},{"type":58,"value":442}," schema: ",{"type":53,"tag":72,"props":444,"children":446},{"className":445},[],[447],{"type":58,"value":448},"name",{"type":58,"value":158},{"type":53,"tag":72,"props":451,"children":453},{"className":452},[],[454],{"type":58,"value":455},"intent",{"type":58,"value":158},{"type":53,"tag":72,"props":458,"children":460},{"className":459},[],[461],{"type":58,"value":462},"backing",{"type":58,"value":464},",\n",{"type":53,"tag":72,"props":466,"children":468},{"className":467},[],[469],{"type":58,"value":470},"permission",{"type":58,"value":158},{"type":53,"tag":72,"props":473,"children":475},{"className":474},[],[476],{"type":58,"value":477},"return_type",{"type":58,"value":158},{"type":53,"tag":72,"props":480,"children":482},{"className":481},[],[483],{"type":58,"value":484},"effort",{"type":58,"value":486}," (S\u002FM\u002FL), ",{"type":53,"tag":72,"props":488,"children":490},{"className":489},[],[491],{"type":58,"value":492},"annotations",{"type":58,"value":494},"\n(readonly\u002Fdestructive\u002Fidempotent), ",{"type":53,"tag":72,"props":496,"children":498},{"className":497},[],[499],{"type":58,"value":500},"notes",{"type":58,"value":158},{"type":53,"tag":72,"props":503,"children":505},{"className":504},[],[506],{"type":58,"value":507},"risks",{"type":58,"value":158},{"type":53,"tag":72,"props":510,"children":512},{"className":511},[],[513],{"type":58,"value":514},"use_case_fit",{"type":58,"value":464},{"type":53,"tag":72,"props":517,"children":519},{"className":518},[],[520],{"type":58,"value":521},"side_effects",{"type":58,"value":158},{"type":53,"tag":72,"props":524,"children":526},{"className":525},[],[527],{"type":58,"value":528},"seed_data_needs",{"type":58,"value":530},".",{"type":53,"tag":61,"props":532,"children":533},{},[534,536,541,543,548,550,555],{"type":58,"value":535},"The last three are the implementation-readiness facts the implementer\nand the verify-mode tooling both need: which human\u002Fagent workflow this\nability serves (",{"type":53,"tag":72,"props":537,"children":539},{"className":538},[],[540],{"type":58,"value":514},{"type":58,"value":542},"), what the backing path emits on every\ncall (",{"type":53,"tag":72,"props":544,"children":546},{"className":545},[],[547],{"type":58,"value":521},{"type":58,"value":549}," — empty array is a fact, not a missing value), and\nwhat representative data must exist in the test environment for the\nability to execute through the public boundary (",{"type":53,"tag":72,"props":551,"children":553},{"className":552},[],[554],{"type":58,"value":528},{"type":58,"value":556},").",{"type":53,"tag":234,"props":558,"children":560},{"id":559},"_5-surface-gaps-and-deferred-items",[561],{"type":58,"value":562},"5. Surface gaps and deferred items",{"type":53,"tag":61,"props":564,"children":565},{},[566],{"type":58,"value":567},"Three buckets:",{"type":53,"tag":88,"props":569,"children":570},{},[571,585,607],{"type":53,"tag":92,"props":572,"children":573},{},[574,583],{"type":53,"tag":126,"props":575,"children":576},{},[577],{"type":53,"tag":72,"props":578,"children":580},{"className":579},[],[581],{"type":58,"value":582},"excluded_from_mvp",{"type":58,"value":584}," — candidates intentionally deferred for risk reasons\n(real-money writes, irreversible state changes, or prerequisite design\nwork). Each entry gets a one-sentence reason.",{"type":53,"tag":92,"props":586,"children":587},{},[588,597,599,605],{"type":53,"tag":126,"props":589,"children":590},{},[591],{"type":53,"tag":72,"props":592,"children":594},{"className":593},[],[595],{"type":58,"value":596},"surfaced_gaps",{"type":58,"value":598}," — MVP candidates with no backing endpoint (ability with\n",{"type":53,"tag":72,"props":600,"children":602},{"className":601},[],[603],{"type":58,"value":604},"backing: null",{"type":58,"value":606},"), plus high-value endpoints discovered during enumeration\nthat aren't in the MVP list but would be easy future wins.",{"type":53,"tag":92,"props":608,"children":609},{},[610,615,617,623],{"type":53,"tag":126,"props":611,"children":612},{},[613],{"type":58,"value":614},"Risks per ability",{"type":58,"value":616}," — anything about a backing endpoint that the\nimplementer must handle (no idempotency key, two-phase behavior,\nstate-transition caveats, zero-arg endpoints registered with\n",{"type":53,"tag":72,"props":618,"children":620},{"className":619},[],[621],{"type":58,"value":622},"permission_callback => '__return_true'",{"type":58,"value":624}," that must NOT copy that into the\nability registration).",{"type":53,"tag":234,"props":626,"children":628},{"id":627},"_6-write-the-audit-doc",[629],{"type":58,"value":630},"6. Write the audit doc",{"type":53,"tag":61,"props":632,"children":633},{},[634,636,641],{"type":58,"value":635},"Write to the explicit output path collected in \"Inputs required\". The\ndocument structure must match ",{"type":53,"tag":72,"props":637,"children":639},{"className":638},[],[640],{"type":58,"value":286},{"type":58,"value":642}," exactly:",{"type":53,"tag":119,"props":644,"children":645},{},[646,657,680,685],{"type":53,"tag":92,"props":647,"children":648},{},[649,655],{"type":53,"tag":72,"props":650,"children":652},{"className":651},[],[653],{"type":58,"value":654},"Last updated: YYYY-MM-DD HH:MM",{"type":58,"value":656}," header.",{"type":53,"tag":92,"props":658,"children":659},{},[660,662,667,668,673,674,679],{"type":58,"value":661},"YAML block with all required top-level metadata + ",{"type":53,"tag":72,"props":663,"children":665},{"className":664},[],[666],{"type":58,"value":294},{"type":58,"value":464},{"type":53,"tag":72,"props":669,"children":671},{"className":670},[],[672],{"type":58,"value":582},{"type":58,"value":158},{"type":53,"tag":72,"props":675,"children":677},{"className":676},[],[678],{"type":58,"value":596},{"type":58,"value":530},{"type":53,"tag":92,"props":681,"children":682},{},[683],{"type":58,"value":684},"\"Controller Inventory\" table.",{"type":53,"tag":92,"props":686,"children":687},{},[688],{"type":58,"value":689},"\"Notes and Surprises\" prose section.",{"type":53,"tag":61,"props":691,"children":692},{},[693,695,700],{"type":58,"value":694},"A copy-pasteable minimal example showing the full shape lives in\n",{"type":53,"tag":72,"props":696,"children":698},{"className":697},[],[699],{"type":58,"value":286},{"type":58,"value":701}," under \"Minimal valid example\" — start there\nwhen authoring a new audit.",{"type":53,"tag":234,"props":703,"children":705},{"id":704},"_7-optional-designate-a-reference-implementation-ability",[706],{"type":58,"value":707},"7. (Optional) Designate a reference implementation ability",{"type":53,"tag":61,"props":709,"children":710},{},[711,713,719],{"type":58,"value":712},"Set ",{"type":53,"tag":72,"props":714,"children":716},{"className":715},[],[717],{"type":58,"value":718},"reference_ability: true",{"type":58,"value":720}," on the first ability an implementer should\nland — typically the smallest, safest, highest-leverage read. This gives\ndownstream workflows a deterministic starting point.",{"type":53,"tag":81,"props":722,"children":724},{"id":723},"verification",[725],{"type":58,"value":726},"Verification",{"type":53,"tag":88,"props":728,"children":729},{},[730,749,767,785],{"type":53,"tag":92,"props":731,"children":732},{},[733,735,740,742,747],{"type":58,"value":734},"The audit conforms to ",{"type":53,"tag":72,"props":736,"children":738},{"className":737},[],[739],{"type":58,"value":286},{"type":58,"value":741}," (all required top-level\nfields present, at least one entry in ",{"type":53,"tag":72,"props":743,"children":745},{"className":744},[],[746],{"type":58,"value":294},{"type":58,"value":748},", annotations\ncomplete on every ability).",{"type":53,"tag":92,"props":750,"children":751},{},[752,758,760,765],{"type":53,"tag":72,"props":753,"children":755},{"className":754},[],[756],{"type":58,"value":757},"capability_gate",{"type":58,"value":759}," is a string for single-cap plugins or a ",{"type":53,"tag":72,"props":761,"children":763},{"className":762},[],[764],{"type":58,"value":372},{"type":58,"value":766},"\nobject for post-type-backed plugins.",{"type":53,"tag":92,"props":768,"children":769},{},[770,772,777,779,784],{"type":58,"value":771},"Every ability with ",{"type":53,"tag":72,"props":773,"children":775},{"className":774},[],[776],{"type":58,"value":604},{"type":58,"value":778}," also appears in ",{"type":53,"tag":72,"props":780,"children":782},{"className":781},[],[783],{"type":58,"value":596},{"type":58,"value":530},{"type":53,"tag":92,"props":786,"children":787},{},[788,790,796],{"type":58,"value":789},"The doc round-trips through the validator in ",{"type":53,"tag":72,"props":791,"children":793},{"className":792},[],[794],{"type":58,"value":795},"audit-schema.md",{"type":58,"value":797}," \"Known\nlimitations\" without errors.",{"type":53,"tag":81,"props":799,"children":801},{"id":800},"failure-modes-debugging",[802],{"type":58,"value":803},"Failure modes \u002F debugging",{"type":53,"tag":88,"props":805,"children":806},{},[807,817,850,882,899,935],{"type":53,"tag":92,"props":808,"children":809},{},[810,815],{"type":53,"tag":126,"props":811,"children":812},{},[813],{"type":58,"value":814},"Plugin has no REST controllers",{"type":58,"value":816}," — audit doesn't apply. Consider\nhooks\u002Ffilters-based abilities (out of scope for this skill's current\nversion) or skip abilities adoption for this plugin.",{"type":53,"tag":92,"props":818,"children":819},{},[820,825,827,833,835,841,843,848],{"type":53,"tag":126,"props":821,"children":822},{},[823],{"type":58,"value":824},"Plugin inherits controllers from another repo",{"type":58,"value":826}," (common for plugins\nextending core post-type-backed controllers like ",{"type":53,"tag":72,"props":828,"children":830},{"className":829},[],[831],{"type":58,"value":832},"WP_REST_Posts_Controller",{"type":58,"value":834},",\nor extension plugins built on a parent's REST classes) — capture with\n",{"type":53,"tag":72,"props":836,"children":838},{"className":837},[],[839],{"type":58,"value":840},"backing.inherited_from: \"\u003Cparent FQCN>\"",{"type":58,"value":842},". Line-number fields may be\n",{"type":53,"tag":72,"props":844,"children":846},{"className":845},[],[847],{"type":58,"value":302},{"type":58,"value":849}," per the schema.",{"type":53,"tag":92,"props":851,"children":852},{},[853,858,860,865,867,872,874,880],{"type":53,"tag":126,"props":854,"children":855},{},[856],{"type":58,"value":857},"Compound capability gate (distinct read\u002Fwrite caps)",{"type":58,"value":859}," — use the\nstructured ",{"type":53,"tag":72,"props":861,"children":863},{"className":862},[],[864],{"type":58,"value":372},{"type":58,"value":866}," form documented in\n",{"type":53,"tag":72,"props":868,"children":870},{"className":869},[],[871],{"type":58,"value":348},{"type":58,"value":873},". Don't smuggle a ",{"type":53,"tag":72,"props":875,"children":877},{"className":876},[],[878],{"type":58,"value":879},"\u002F",{"type":58,"value":881},"-separated\nstring into a field typed as a single cap.",{"type":53,"tag":92,"props":883,"children":884},{},[885,890,892,897],{"type":53,"tag":126,"props":886,"children":887},{},[888],{"type":58,"value":889},"Ambiguous grouping",{"type":58,"value":891}," — route to\n",{"type":53,"tag":72,"props":893,"children":895},{"className":894},[],[896],{"type":58,"value":395},{"type":58,"value":898},". Do not invent\nalternative grouping rules in the audit doc.",{"type":53,"tag":92,"props":900,"children":901},{},[902,912,914,919,921,927,929,934],{"type":53,"tag":126,"props":903,"children":904},{},[905,907],{"type":58,"value":906},"Zero-arg endpoints with ",{"type":53,"tag":72,"props":908,"children":910},{"className":909},[],[911],{"type":58,"value":622},{"type":58,"value":913}," —\nlegal at the REST layer, but the ability's own ",{"type":53,"tag":72,"props":915,"children":917},{"className":916},[],[918],{"type":58,"value":328},{"type":58,"value":920}," must\nmatch the plugin's merchant gate. Never promote ",{"type":53,"tag":72,"props":922,"children":924},{"className":923},[],[925],{"type":58,"value":926},"'__return_true'",{"type":58,"value":928}," into an\nability registration. Note this in the ability's ",{"type":53,"tag":72,"props":930,"children":932},{"className":931},[],[933],{"type":58,"value":507},{"type":58,"value":530},{"type":53,"tag":92,"props":936,"children":937},{},[938,943,945,951],{"type":53,"tag":126,"props":939,"children":940},{},[941],{"type":58,"value":942},"Output path defaults to plugin worktree",{"type":58,"value":944}," — always ask the user for an\nexplicit output directory (e.g. their vault ",{"type":53,"tag":72,"props":946,"children":948},{"className":947},[],[949],{"type":58,"value":950},"plans\u002F",{"type":58,"value":952},"). Writing the audit\ninto the plugin's own git history pollutes the worktree and buries the\nartifact.",{"type":53,"tag":81,"props":954,"children":956},{"id":955},"escalation",[957],{"type":58,"value":958},"Escalation",{"type":53,"tag":88,"props":960,"children":961},{},[962,974],{"type":53,"tag":92,"props":963,"children":964},{},[965,967,972],{"type":58,"value":966},"If the plugin uses an enumeration convention not covered by\n",{"type":53,"tag":72,"props":968,"children":970},{"className":969},[],[971],{"type":58,"value":250},{"type":58,"value":973}," (neither the standard glob nor the\ngrep fallback produces a complete inventory), update that reference with\nthe new convention and open a PR so future audits cover it deterministically.",{"type":53,"tag":92,"props":975,"children":976},{},[977,979,984],{"type":58,"value":978},"If capability tracing hits a mechanism not covered by\n",{"type":53,"tag":72,"props":980,"children":982},{"className":981},[],[983],{"type":58,"value":348},{"type":58,"value":985},", extend that file rather than\nencoding the new case in the audit's \"Notes and Surprises\" only.",{"items":987,"total":1098},[988,999,1016,1030,1041,1062,1082],{"slug":989,"name":989,"fn":990,"description":991,"org":992,"tags":993,"stars":35,"repoUrl":36,"updatedAt":998},"blueprint","create WordPress Playground blueprint files","Use when the deliverable is WordPress Playground Blueprint JSON or a Blueprint bundle, including creating, editing, reviewing, validating schema keys, choosing steps\u002Fresources, and debugging Blueprint files. For only running or sharing a Playground environment, use wp-playground.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[994,995],{"name":9,"slug":8,"type":15},{"name":996,"slug":997,"type":15},"WordPress Playground","wordpress-playground","2026-07-27T06:08:32.306955",{"slug":1000,"name":1000,"fn":1001,"description":1002,"org":1003,"tags":1004,"stars":35,"repoUrl":36,"updatedAt":1015},"wordpress-router","route WordPress codebase tasks","Use when the user asks about WordPress codebases (plugins, themes, block themes, Gutenberg blocks, WP core checkouts) and you need to quickly classify the repo and route to the correct workflow\u002Fskill (blocks, theme.json, REST API, WP-CLI, performance, security, testing, release packaging).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1005,1008,1011,1012],{"name":1006,"slug":1007,"type":15},"Engineering","engineering",{"name":1009,"slug":1010,"type":15},"Triage","triage",{"name":9,"slug":8,"type":15},{"name":1013,"slug":1014,"type":15},"Workflow Automation","workflow-automation","2026-04-06T18:58:21.644368",{"slug":1017,"name":1017,"fn":1018,"description":1019,"org":1020,"tags":1021,"stars":35,"repoUrl":36,"updatedAt":1029},"wp-abilities-api","manage WordPress Abilities API definitions","Use when working with the WordPress Abilities API (wp_register_ability, wp_register_ability_category, \u002Fwp-json\u002Fwp-abilities\u002Fv1\u002F*, @wordpress\u002Fabilities) including defining abilities, categories, meta, REST exposure, and permissions checks for clients.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1022,1025,1028],{"name":1023,"slug":1024,"type":15},"Access Control","access-control",{"name":1026,"slug":1027,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:17.857773",{"slug":4,"name":4,"fn":5,"description":6,"org":1031,"tags":1032,"stars":35,"repoUrl":36,"updatedAt":37},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1033,1034,1035,1036,1037,1038,1039,1040],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":33,"slug":34,"type":15},{"name":17,"slug":18,"type":15},{"name":27,"slug":28,"type":15},{"name":30,"slug":31,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":1042,"name":1042,"fn":1043,"description":1044,"org":1045,"tags":1046,"stars":35,"repoUrl":36,"updatedAt":1061},"wp-abilities-verify","verify WordPress plugin Abilities API registrations","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1047,1048,1049,1050,1051,1054,1057,1060],{"name":13,"slug":14,"type":15},{"name":33,"slug":34,"type":15},{"name":27,"slug":28,"type":15},{"name":30,"slug":31,"type":15},{"name":1052,"slug":1053,"type":15},"Security","security",{"name":1055,"slug":1056,"type":15},"Testing","testing",{"name":1058,"slug":1059,"type":15},"Validation","validation",{"name":9,"slug":8,"type":15},"2026-05-28T06:48:50.590811",{"slug":1063,"name":1063,"fn":1064,"description":1065,"org":1066,"tags":1067,"stars":35,"repoUrl":36,"updatedAt":1081},"wp-block-development","develop WordPress Gutenberg blocks","Use when developing WordPress (Gutenberg) blocks: block.json metadata, register_block_type(_from_metadata), attributes\u002Fserialization, supports, dynamic rendering (render.php\u002Frender_callback), deprecations\u002Fmigrations, viewScript vs viewScriptModule, and @wordpress\u002Fscripts\u002F@wordpress\u002Fcreate-block build and test workflows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1068,1071,1074,1077,1080],{"name":1069,"slug":1070,"type":15},"Frontend","frontend",{"name":1072,"slug":1073,"type":15},"PHP","php",{"name":1075,"slug":1076,"type":15},"React","react",{"name":1078,"slug":1079,"type":15},"UI Components","ui-components",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:24.172876",{"slug":1083,"name":1083,"fn":1084,"description":1085,"org":1086,"tags":1087,"stars":35,"repoUrl":36,"updatedAt":1097},"wp-block-themes","develop WordPress block themes","Use when developing WordPress block themes: theme.json (global settings\u002Fstyles), templates and template parts, patterns, style variations, and Site Editor troubleshooting (style hierarchy, overrides, caching).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1088,1091,1092,1095,1096],{"name":1089,"slug":1090,"type":15},"Design","design",{"name":1069,"slug":1070,"type":15},{"name":1093,"slug":1094,"type":15},"Themes","themes",{"name":1078,"slug":1079,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:58:27.909889",18,{"items":1100,"total":1098},[1101,1106,1113,1119,1130,1141,1149,1157,1170,1185,1205,1218],{"slug":989,"name":989,"fn":990,"description":991,"org":1102,"tags":1103,"stars":35,"repoUrl":36,"updatedAt":998},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1104,1105],{"name":9,"slug":8,"type":15},{"name":996,"slug":997,"type":15},{"slug":1000,"name":1000,"fn":1001,"description":1002,"org":1107,"tags":1108,"stars":35,"repoUrl":36,"updatedAt":1015},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1109,1110,1111,1112],{"name":1006,"slug":1007,"type":15},{"name":1009,"slug":1010,"type":15},{"name":9,"slug":8,"type":15},{"name":1013,"slug":1014,"type":15},{"slug":1017,"name":1017,"fn":1018,"description":1019,"org":1114,"tags":1115,"stars":35,"repoUrl":36,"updatedAt":1029},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1116,1117,1118],{"name":1023,"slug":1024,"type":15},{"name":1026,"slug":1027,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1120,"tags":1121,"stars":35,"repoUrl":36,"updatedAt":37},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1122,1123,1124,1125,1126,1127,1128,1129],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":33,"slug":34,"type":15},{"name":17,"slug":18,"type":15},{"name":27,"slug":28,"type":15},{"name":30,"slug":31,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":1042,"name":1042,"fn":1043,"description":1044,"org":1131,"tags":1132,"stars":35,"repoUrl":36,"updatedAt":1061},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1133,1134,1135,1136,1137,1138,1139,1140],{"name":13,"slug":14,"type":15},{"name":33,"slug":34,"type":15},{"name":27,"slug":28,"type":15},{"name":30,"slug":31,"type":15},{"name":1052,"slug":1053,"type":15},{"name":1055,"slug":1056,"type":15},{"name":1058,"slug":1059,"type":15},{"name":9,"slug":8,"type":15},{"slug":1063,"name":1063,"fn":1064,"description":1065,"org":1142,"tags":1143,"stars":35,"repoUrl":36,"updatedAt":1081},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1144,1145,1146,1147,1148],{"name":1069,"slug":1070,"type":15},{"name":1072,"slug":1073,"type":15},{"name":1075,"slug":1076,"type":15},{"name":1078,"slug":1079,"type":15},{"name":9,"slug":8,"type":15},{"slug":1083,"name":1083,"fn":1084,"description":1085,"org":1150,"tags":1151,"stars":35,"repoUrl":36,"updatedAt":1097},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1152,1153,1154,1155,1156],{"name":1089,"slug":1090,"type":15},{"name":1069,"slug":1070,"type":15},{"name":1093,"slug":1094,"type":15},{"name":1078,"slug":1079,"type":15},{"name":9,"slug":8,"type":15},{"slug":1158,"name":1158,"fn":1159,"description":1160,"org":1161,"tags":1162,"stars":35,"repoUrl":36,"updatedAt":1169},"wp-interactivity-api","build interactive features with WordPress Interactivity API","Use when building or debugging WordPress Interactivity API features (data-wp-* directives, @wordpress\u002Finteractivity store\u002Fstate\u002Factions, block viewScriptModule integration, wp_interactivity_*()) including performance, hydration, and directive behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1163,1164,1165,1168],{"name":1026,"slug":1027,"type":15},{"name":1069,"slug":1070,"type":15},{"name":1166,"slug":1167,"type":15},"JavaScript","javascript",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:20.397676",{"slug":1171,"name":1171,"fn":1172,"description":1173,"org":1174,"tags":1175,"stars":35,"repoUrl":36,"updatedAt":1184},"wp-patterns","generate WordPress block patterns","Generate technically correct, design-distinctive WordPress block patterns. Use when creating block patterns, starter page patterns, template patterns, template part patterns, or improving pattern design quality. Covers pattern registration (PHP headers, auto\u002Fmanual), block markup syntax, theme.json design tokens, categories, template types, accessibility, and i18n\u002Fescaping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1176,1179,1180,1183],{"name":1177,"slug":1178,"type":15},"Block Editor","block-editor",{"name":1089,"slug":1090,"type":15},{"name":1181,"slug":1182,"type":15},"Templates","templates",{"name":9,"slug":8,"type":15},"2026-07-24T05:38:43.101238",{"slug":1186,"name":1186,"fn":1187,"description":1188,"org":1189,"tags":1190,"stars":35,"repoUrl":36,"updatedAt":1204},"wp-performance","investigate and improve WordPress performance","Use when investigating or improving WordPress performance (backend-only agent): profiling and measurement (WP-CLI profile\u002Fdoctor, Server-Timing, Query Monitor via REST headers), database\u002Fquery optimization, autoloaded options, object caching, cron, HTTP API calls, and safe verification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1191,1194,1197,1200,1203],{"name":1192,"slug":1193,"type":15},"Backend","backend",{"name":1195,"slug":1196,"type":15},"Database","database",{"name":1198,"slug":1199,"type":15},"Performance","performance",{"name":1201,"slug":1202,"type":15},"SQL","sql",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:22.909053",{"slug":1206,"name":1206,"fn":1207,"description":1208,"org":1209,"tags":1210,"stars":35,"repoUrl":36,"updatedAt":1217},"wp-phpstan","run PHPStan static analysis on WordPress projects","Use when configuring, running, or fixing PHPStan static analysis in WordPress projects (plugins\u002Fthemes\u002Fsites): phpstan.neon setup, baselines, WordPress-specific typing, and handling third-party plugin classes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1211,1212,1213,1216],{"name":33,"slug":34,"type":15},{"name":1072,"slug":1073,"type":15},{"name":1214,"slug":1215,"type":15},"QA","qa",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:15.318063",{"slug":1219,"name":1219,"fn":1220,"description":1221,"org":1222,"tags":1223,"stars":35,"repoUrl":36,"updatedAt":1232},"wp-playground","manage WordPress Playground instances","Use as the WordPress Playground routing wrapper for ambiguous Playground work, local CLI runs with @wp-playground\u002Fcli, playground.wordpress.net share links, browser previews, snapshots, mounts, version switching, and Xdebug. For Blueprint JSON authoring or review, use the blueprint skill directly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1224,1227,1230,1231],{"name":1225,"slug":1226,"type":15},"Local Development","local-development",{"name":1228,"slug":1229,"type":15},"Sandboxing","sandboxing",{"name":9,"slug":8,"type":15},{"name":996,"slug":997,"type":15},"2026-07-27T06:08:31.31025"]