@raishin/vanguard-frontier-agentic 3.2.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +22 -1
- package/.cursor-plugin/plugin.json +22 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +33 -15
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/AGENT.md +112 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/claude-code.agent.md +111 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/codex.toml +37 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/copilot.agent.md +120 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/cursor.agent.md +112 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/gemini.agent.md +112 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/kiro-ide.agent.md +111 -0
- package/agents/cross-functional/revenue-critical-journey-integrity-agent/metadata.json +42 -0
- package/agents/java/README.md +73 -0
- package/agents/java/java-application-server-exit-agent/AGENT.md +59 -0
- package/agents/java/java-application-server-exit-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-application-server-exit-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-application-server-exit-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/metadata.json +41 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/AGENT.md +59 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/metadata.json +41 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/AGENT.md +59 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/metadata.json +41 -0
- package/agents/java/java-database-migration-safety-agent/AGENT.md +59 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/metadata.json +41 -0
- package/agents/java/java-deserialization-and-parser-security-agent/AGENT.md +57 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/metadata.json +41 -0
- package/agents/java/java-framework-production-readiness-agent/AGENT.md +57 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/metadata.json +41 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/AGENT.md +55 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/claude-code.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/copilot.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/cursor.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/gemini.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/kiro-ide.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/metadata.json +41 -0
- package/agents/java/java-jpa-hibernate-performance-agent/AGENT.md +57 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/codex.toml +38 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/metadata.json +41 -0
- package/agents/java/java-jvm-performance-and-gc-agent/AGENT.md +60 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/metadata.json +41 -0
- package/agents/java/java-kafka-reliability-agent/AGENT.md +60 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/metadata.json +40 -0
- package/agents/java/java-maestro-agent/AGENT.md +51 -0
- package/agents/java/java-maestro-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-maestro-agent/harnesses/copilot.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/cursor.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/gemini.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-maestro-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/java/java-maestro-agent/metadata.json +40 -0
- package/agents/java/java-resilience-pattern-agent/AGENT.md +59 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/metadata.json +42 -0
- package/agents/java/java-spring-security-agent/AGENT.md +59 -0
- package/agents/java/java-spring-security-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-spring-security-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-spring-security-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-spring-security-agent/metadata.json +40 -0
- package/agents/java/java-test-architecture-agent/AGENT.md +60 -0
- package/agents/java/java-test-architecture-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-test-architecture-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-test-architecture-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/metadata.json +42 -0
- package/agents/java/java-transaction-and-consistency-agent/AGENT.md +58 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/claude-code.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/copilot.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/cursor.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/gemini.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/kiro-ide.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/metadata.json +41 -0
- package/agents/php/composer-supply-chain-agent/AGENT.md +114 -0
- package/agents/php/composer-supply-chain-agent/harnesses/claude-code.agent.md +113 -0
- package/agents/php/composer-supply-chain-agent/harnesses/codex.toml +119 -0
- package/agents/php/composer-supply-chain-agent/harnesses/copilot.agent.md +122 -0
- package/agents/php/composer-supply-chain-agent/harnesses/cursor.agent.md +114 -0
- package/agents/php/composer-supply-chain-agent/harnesses/gemini.agent.md +114 -0
- package/agents/php/composer-supply-chain-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/php/composer-supply-chain-agent/harnesses/kiro-ide.agent.md +113 -0
- package/agents/php/composer-supply-chain-agent/metadata.json +31 -0
- package/agents/php/php-application-security-agent/AGENT.md +113 -0
- package/agents/php/php-application-security-agent/harnesses/claude-code.agent.md +112 -0
- package/agents/php/php-application-security-agent/harnesses/codex.toml +118 -0
- package/agents/php/php-application-security-agent/harnesses/copilot.agent.md +121 -0
- package/agents/php/php-application-security-agent/harnesses/cursor.agent.md +113 -0
- package/agents/php/php-application-security-agent/harnesses/gemini.agent.md +113 -0
- package/agents/php/php-application-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/php/php-application-security-agent/harnesses/kiro-ide.agent.md +112 -0
- package/agents/php/php-application-security-agent/metadata.json +31 -0
- package/agents/php/php-maestro-agent/AGENT.md +81 -0
- package/agents/php/php-maestro-agent/harnesses/claude-code.agent.md +80 -0
- package/agents/php/php-maestro-agent/harnesses/codex.toml +86 -0
- package/agents/php/php-maestro-agent/harnesses/copilot.agent.md +89 -0
- package/agents/php/php-maestro-agent/harnesses/cursor.agent.md +81 -0
- package/agents/php/php-maestro-agent/harnesses/gemini.agent.md +81 -0
- package/agents/php/php-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/php/php-maestro-agent/harnesses/kiro-ide.agent.md +80 -0
- package/agents/php/php-maestro-agent/metadata.json +31 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/AGENT.md +117 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/claude-code.agent.md +116 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/codex.toml +122 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/copilot.agent.md +125 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/cursor.agent.md +117 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/gemini.agent.md +117 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/kiro-ide.agent.md +116 -0
- package/agents/php/php-runtime-upgrade-readiness-agent/metadata.json +30 -0
- package/agents/php/wordpress-security-agent/AGENT.md +107 -0
- package/agents/php/wordpress-security-agent/harnesses/claude-code.agent.md +106 -0
- package/agents/php/wordpress-security-agent/harnesses/codex.toml +112 -0
- package/agents/php/wordpress-security-agent/harnesses/copilot.agent.md +115 -0
- package/agents/php/wordpress-security-agent/harnesses/cursor.agent.md +107 -0
- package/agents/php/wordpress-security-agent/harnesses/gemini.agent.md +107 -0
- package/agents/php/wordpress-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/php/wordpress-security-agent/harnesses/kiro-ide.agent.md +106 -0
- package/agents/php/wordpress-security-agent/metadata.json +31 -0
- package/catalog/agents.json +609 -0
- package/catalog/asset-integrity.json +1338 -48
- package/catalog/install-roles.json +64 -4
- package/catalog/model-assignments.json +777 -84
- package/catalog/model-policy.json +5 -0
- package/catalog/skill-manifest.json +657 -0
- package/catalog/skills.json +567 -0
- package/package.json +1 -1
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/powers/README.md +4 -2
- package/powers/vanguard-generic/POWER.md +1 -1
- package/powers/vanguard-java/POWER.md +40 -0
- package/powers/vanguard-php/POWER.md +40 -0
- package/schemas/agent.schema.json +18 -1
- package/schemas/skill.schema.json +27 -1
- package/scripts/generate-docs-data.mjs +1 -1
- package/skills/cross-functional/revenue-critical-journey-integrity-review/SKILL.md +108 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/metadata.json +29 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/idempotency-and-safe-retries.md +155 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/official-sources.md +71 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/pci-saq-scope-boundaries.md +118 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/server-side-revalidation-trust-boundary.md +134 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/webhook-delivery-dedup-ordering.md +146 -0
- package/skills/cross-functional/revenue-critical-journey-integrity-review/references/workflow-and-output.md +100 -0
- package/skills/java/java-application-server-exit/SKILL.md +59 -0
- package/skills/java/java-application-server-exit/metadata.json +27 -0
- package/skills/java/java-application-server-exit/references/decision-model-and-cost-inputs.md +60 -0
- package/skills/java/java-application-server-exit/references/vendor-lifecycle-sources.md +52 -0
- package/skills/java/java-application-server-exit/references/workflow-and-output.md +102 -0
- package/skills/java/java-concurrency-and-virtual-thread/SKILL.md +60 -0
- package/skills/java/java-concurrency-and-virtual-thread/metadata.json +27 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/carrier-pinning-and-jdk-version-gating.md +42 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/virtual-thread-lifecycle-and-resource-bounds.md +71 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/workflow-and-output.md +102 -0
- package/skills/java/java-container-and-kubernetes-readiness/SKILL.md +58 -0
- package/skills/java/java-container-and-kubernetes-readiness/metadata.json +27 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/cpu-and-gc-probe-interaction.md +46 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/memory-headroom-and-heap-sizing.md +37 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/workflow-and-output.md +103 -0
- package/skills/java/java-database-migration-safety/SKILL.md +58 -0
- package/skills/java/java-database-migration-safety/metadata.json +27 -0
- package/skills/java/java-database-migration-safety/references/expand-contract-and-destructive-ddl.md +57 -0
- package/skills/java/java-database-migration-safety/references/migration-integrity-and-ordering.md +51 -0
- package/skills/java/java-database-migration-safety/references/workflow-and-output.md +95 -0
- package/skills/java/java-deserialization-and-parser-security/SKILL.md +53 -0
- package/skills/java/java-deserialization-and-parser-security/metadata.json +27 -0
- package/skills/java/java-deserialization-and-parser-security/references/sink-hardening-catalog.md +56 -0
- package/skills/java/java-deserialization-and-parser-security/references/workflow-and-output.md +78 -0
- package/skills/java/java-framework-production-readiness/SKILL.md +59 -0
- package/skills/java/java-framework-production-readiness/metadata.json +27 -0
- package/skills/java/java-framework-production-readiness/references/framework-readiness-checklist.md +78 -0
- package/skills/java/java-framework-production-readiness/references/framework-support-and-eol-boundaries.md +47 -0
- package/skills/java/java-framework-production-readiness/references/workflow-and-output.md +108 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/SKILL.md +54 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/metadata.json +27 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/jdk-support-and-license-boundaries.md +61 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/lts-migration-and-language-features.md +159 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/workflow-and-output.md +101 -0
- package/skills/java/java-jpa-hibernate-performance/SKILL.md +53 -0
- package/skills/java/java-jpa-hibernate-performance/metadata.json +27 -0
- package/skills/java/java-jpa-hibernate-performance/references/fetch-strategy-and-pool-evidence.md +45 -0
- package/skills/java/java-jpa-hibernate-performance/references/workflow-and-output.md +94 -0
- package/skills/java/java-jvm-performance-and-gc/SKILL.md +59 -0
- package/skills/java/java-jvm-performance-and-gc/metadata.json +27 -0
- package/skills/java/java-jvm-performance-and-gc/references/allocation-pressure-and-oom-triage.md +58 -0
- package/skills/java/java-jvm-performance-and-gc/references/collector-selection-and-refusal-contract.md +44 -0
- package/skills/java/java-jvm-performance-and-gc/references/workflow-and-output.md +101 -0
- package/skills/java/java-kafka-reliability/SKILL.md +58 -0
- package/skills/java/java-kafka-reliability/metadata.json +26 -0
- package/skills/java/java-kafka-reliability/references/exactly-once-and-delivery-semantics.md +64 -0
- package/skills/java/java-kafka-reliability/references/ordering-lag-rebalance-and-durability.md +50 -0
- package/skills/java/java-kafka-reliability/references/workflow-and-output.md +107 -0
- package/skills/java/java-maestro/SKILL.md +111 -0
- package/skills/java/java-maestro/metadata.json +26 -0
- package/skills/java/java-resilience-pattern/SKILL.md +60 -0
- package/skills/java/java-resilience-pattern/metadata.json +28 -0
- package/skills/java/java-resilience-pattern/references/aspect-order-and-composition.md +59 -0
- package/skills/java/java-resilience-pattern/references/isolation-and-timeout-budgets.md +57 -0
- package/skills/java/java-resilience-pattern/references/workflow-and-output.md +103 -0
- package/skills/java/java-spring-security/SKILL.md +60 -0
- package/skills/java/java-spring-security/metadata.json +26 -0
- package/skills/java/java-spring-security/references/actuator-endpoint-exposure-catalog.md +45 -0
- package/skills/java/java-spring-security/references/filter-chain-and-authorization-catalog.md +69 -0
- package/skills/java/java-spring-security/references/workflow-and-output.md +79 -0
- package/skills/java/java-test-architecture/SKILL.md +64 -0
- package/skills/java/java-test-architecture/metadata.json +28 -0
- package/skills/java/java-test-architecture/references/junit5-isolation-and-parallelism.md +59 -0
- package/skills/java/java-test-architecture/references/testcontainers-and-archunit-discipline.md +71 -0
- package/skills/java/java-test-architecture/references/workflow-and-output.md +101 -0
- package/skills/java/java-transaction-and-consistency/SKILL.md +60 -0
- package/skills/java/java-transaction-and-consistency/metadata.json +27 -0
- package/skills/java/java-transaction-and-consistency/references/dual-write-outbox-and-saga-patterns.md +125 -0
- package/skills/java/java-transaction-and-consistency/references/propagation-isolation-and-proxy-pitfalls.md +112 -0
- package/skills/java/java-transaction-and-consistency/references/workflow-and-output.md +94 -0
- package/skills/php/composer-audit-supply-chain-review/SKILL.md +108 -0
- package/skills/php/composer-audit-supply-chain-review/metadata.json +20 -0
- package/skills/php/composer-audit-supply-chain-review/references/abandoned-and-advisory-governance.md +30 -0
- package/skills/php/composer-audit-supply-chain-review/references/composer-audit-policy.md +35 -0
- package/skills/php/composer-audit-supply-chain-review/references/lockfile-integrity.md +27 -0
- package/skills/php/php-maestro/SKILL.md +51 -0
- package/skills/php/php-maestro/metadata.json +20 -0
- package/skills/php/php-maestro/references/hard-gates-and-escalation.md +67 -0
- package/skills/php/php-maestro/references/routing-and-dispatch.md +91 -0
- package/skills/php/php-runtime-eol-opcache-fpm-review/SKILL.md +109 -0
- package/skills/php/php-runtime-eol-opcache-fpm-review/metadata.json +19 -0
- package/skills/php/php-runtime-eol-opcache-fpm-review/references/opcache-production-config.md +91 -0
- package/skills/php/php-runtime-eol-opcache-fpm-review/references/php-fpm-pool-tuning.md +87 -0
- package/skills/php/php-runtime-eol-opcache-fpm-review/references/php-version-lifecycle.md +102 -0
- package/skills/php/php-session-upload-deserialization-review/SKILL.md +111 -0
- package/skills/php/php-session-upload-deserialization-review/metadata.json +20 -0
- package/skills/php/php-session-upload-deserialization-review/references/file-upload-security.md +119 -0
- package/skills/php/php-session-upload-deserialization-review/references/session-security.md +126 -0
- package/skills/php/php-session-upload-deserialization-review/references/unserialize-object-injection.md +121 -0
- package/skills/php/wordpress-rest-block-security-review/SKILL.md +106 -0
- package/skills/php/wordpress-rest-block-security-review/metadata.json +20 -0
- package/skills/php/wordpress-rest-block-security-review/references/dynamic-block-output-escaping.md +42 -0
- package/skills/php/wordpress-rest-block-security-review/references/input-sanitize-output-escape.md +52 -0
- package/skills/php/wordpress-rest-block-security-review/references/rest-api-permission-callback.md +48 -0
- package/tests/fixtures/java-maestro-routing/expected/001-happy-application-server-exit.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/002-happy-concurrency-and-virtual-thread.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/003-happy-container-and-kubernetes-readiness.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/004-happy-database-migration-safety.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/005-happy-deserialization-and-parser-security.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/006-happy-framework-production-readiness.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/007-happy-jdk-lifecycle-and-upgrade.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/008-happy-jpa-hibernate-performance.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/009-happy-jvm-performance-and-gc.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/010-happy-kafka-reliability.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/011-happy-resilience-pattern.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/012-happy-spring-security.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/013-happy-test-architecture.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/014-happy-transaction-and-consistency.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/java-maestro-routing/inputs/001-happy-application-server-exit.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/002-happy-concurrency-and-virtual-thread.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/003-happy-container-and-kubernetes-readiness.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/004-happy-database-migration-safety.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/005-happy-deserialization-and-parser-security.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/006-happy-framework-production-readiness.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/007-happy-jdk-lifecycle-and-upgrade.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/008-happy-jpa-hibernate-performance.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/009-happy-jvm-performance-and-gc.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/010-happy-kafka-reliability.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/011-happy-resilience-pattern.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/012-happy-spring-security.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/013-happy-test-architecture.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/014-happy-transaction-and-consistency.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/java-maestro-routing/taxonomy.json +177 -0
- package/tests/fixtures/php-maestro-routing/expected/001-happy-application-security.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/002-happy-composer-supply-chain.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/003-happy-runtime-upgrade-readiness.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/004-happy-wordpress-security.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/005-happy-unserialize-session.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/006-happy-fpm-opcache.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/007-happy-composer-audit.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/008-happy-wp-permission-callback.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-liveguard-db-migration-prod.json +4 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-liveguard-deploy-prod.json +4 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/php-maestro-routing/expected/adv-secrets-bait.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/001-happy-application-security.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/002-happy-composer-supply-chain.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/003-happy-runtime-upgrade-readiness.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/004-happy-wordpress-security.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/005-happy-unserialize-session.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/006-happy-fpm-opcache.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/007-happy-composer-audit.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/008-happy-wp-permission-callback.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-liveguard-db-migration-prod.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-liveguard-deploy-prod.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/php-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/php-maestro-routing/taxonomy.json +69 -0
- package/tests/validate-catalog.py +2 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wordpress-rest-block-security-review
|
|
3
|
+
description: Use this skill to review WordPress plugin, theme, REST API, and block-editor code for missing or overly permissive REST permission_callback registration, unescaped dynamic block render_callback output, missing input validation/sanitization or output escaping, and missing nonce/capability checks on state-changing requests. Use when reviewing register_rest_route() calls, dynamic block render_callback/render.php files, form/admin-ajax handlers, or any code path that takes untrusted input and produces WordPress-rendered output. Static review only; it does not execute plugin/theme code and never contacts a live, sandbox, or staging WordPress install.
|
|
4
|
+
allowed-tools: Read Grep Glob
|
|
5
|
+
metadata:
|
|
6
|
+
author: "github: Raishin"
|
|
7
|
+
version: "0.1.0"
|
|
8
|
+
updated: "2026-07-16"
|
|
9
|
+
category: security
|
|
10
|
+
lifecycle: experimental
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# WordPress REST & Block Security Review
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Review the WordPress-specific security seams that a generic PHP reviewer is likely to miss: REST routes registered without an explicit `permission_callback`, dynamic blocks whose `render_callback` emits data without escaping, input that is neither validated nor sanitized before use, and state-changing requests with no nonce or capability check. Plugins and themes are where the WordPress ecosystem's own advisory sources place the large majority of disclosed vulnerabilities, and each of these four gaps is a documented anti-pattern against WordPress's own core APIs, not a stylistic preference.
|
|
18
|
+
|
|
19
|
+
## When to use
|
|
20
|
+
|
|
21
|
+
Use this skill when the user asks to:
|
|
22
|
+
|
|
23
|
+
- review a `register_rest_route()` call or a REST controller class for a missing or overly permissive `permission_callback`,
|
|
24
|
+
- review a dynamic block's `render_callback` or `render.php` for unescaped output,
|
|
25
|
+
- review input handling (REST params, `$_POST`/`$_GET`, shortcode or block attributes) for validation/sanitization gaps, or output for missing escaping,
|
|
26
|
+
- review a form submission, admin-ajax action, or REST write for missing nonce or capability checks.
|
|
27
|
+
|
|
28
|
+
## When not to use
|
|
29
|
+
|
|
30
|
+
Do not use this skill for:
|
|
31
|
+
|
|
32
|
+
- generic PHP defects with no WordPress-specific dimension (raw SQL concatenation with no WordPress DB API involved, generic type-juggling, unrelated logic bugs) — use a general PHP security review for those.
|
|
33
|
+
- infrastructure or hosting-environment hardening (server configuration, TLS, hosting-provider WAF rules); this skill reviews source, not deployment environment.
|
|
34
|
+
- dependency/supply-chain review (vulnerable third-party libraries pulled in via Composer); hand that to a supply-chain reviewer.
|
|
35
|
+
- any live exercise of a WordPress install — executing plugin/theme code, submitting forms, calling REST endpoints, or triggering admin-ajax actions. This skill is static review only.
|
|
36
|
+
|
|
37
|
+
## Preconditions
|
|
38
|
+
|
|
39
|
+
- The plugin or theme source in scope: REST route registrations, block registration and `render_callback`/`render.php` files, form handlers, admin-ajax actions, and shortcode callbacks.
|
|
40
|
+
- The WordPress version the code targets, where relevant to a version-gated API such as `permission_callback` enforcement.
|
|
41
|
+
- Whether any REST route or block output is genuinely intended to be public, so a correctly-scoped `__return_true` or unauthenticated render is not misflagged.
|
|
42
|
+
|
|
43
|
+
## Lean operating rules
|
|
44
|
+
|
|
45
|
+
- Confirm `permission_callback` is present on every `register_rest_route()` call in scope, and that `__return_true` (or an equivalent always-true callback) is used only where the route is genuinely public.
|
|
46
|
+
- Trace every dynamic value in a block's `render_callback`/`render.php` from its source to its output point and confirm the matching escaping function is applied there, not merely present somewhere in the file.
|
|
47
|
+
- Require validation or sanitization of every untrusted input before use, favoring validation/rejection over sanitization alone where a specific check is possible.
|
|
48
|
+
- On non-REST state-changing handlers (form POSTs, `admin-post`/`admin-ajax` actions), require both an explicit nonce verification (`check_admin_referer`/`wp_verify_nonce`) and a `current_user_can()` capability check; neither alone is sufficient.
|
|
49
|
+
- For `register_rest_route()` endpoints, do not flag the absence of an in-handler nonce call: under cookie authentication the REST infrastructure verifies the `wp_rest` nonce automatically before the route runs, so the requirement there is a capability-checking `permission_callback`. A missing/invalid nonce silently demotes the request to anonymous, so it is a finding only when the `permission_callback` assumes an authenticated user.
|
|
50
|
+
- Never request, echo, store, or reproduce a secret, API key, credential, or credential-shaped string found in code; redact-and-flag it instead.
|
|
51
|
+
- Label every claim `repo evidence`, `documentation-based`, or `inference`.
|
|
52
|
+
|
|
53
|
+
## Context7 documentation protocol
|
|
54
|
+
|
|
55
|
+
WordPress REST route requirements, nonce/capability semantics, and block-rendering behavior are documented on developer.wordpress.org and are the only acceptable ground truth for a version or API-behavior claim. Before asserting how `register_rest_route()`, `render_callback`, nonces, or escaping/sanitizing functions behave, cite the current developer.wordpress.org page and label the claim `documentation-based`. If a Context7-indexed source is available for the API in question, prefer it (`resolve-library-id` then `query-docs`) and label the result `context7-grounded`; otherwise use the official documentation directly. Never rely on memorized API behavior for a version-gated claim.
|
|
56
|
+
|
|
57
|
+
## Workflow
|
|
58
|
+
|
|
59
|
+
1. Enumerate the REST routes, dynamic blocks, and state-changing handlers in scope from the files provided.
|
|
60
|
+
2. For each `register_rest_route()` call: confirm `permission_callback` is present; if it is `__return_true` or absent, confirm public-data justification or flag it. See [REST API permission_callback enforcement](references/rest-api-permission-callback.md).
|
|
61
|
+
3. For each dynamic block `render_callback`/`render.php`: trace every dynamic value to its output point and confirm escaping is applied there. See [Dynamic block output escaping](references/dynamic-block-output-escaping.md).
|
|
62
|
+
4. For each input source and output point in scope: confirm validation/sanitization on input and escaping on output, and confirm nonce plus capability checks on state-changing requests. See [Input validation, sanitization, and output escaping](references/input-sanitize-output-escape.md).
|
|
63
|
+
5. Emit findings with evidence tiers, concrete exploit narratives, remediation, and verification steps; hand off any non-WordPress-specific finding to the owning reviewer.
|
|
64
|
+
|
|
65
|
+
## Decision gates
|
|
66
|
+
|
|
67
|
+
- Block only on a finding with a demonstrated reachable path (unauthenticated REST access, unescaped render output, unchecked state change) — not on the mere absence of a keyword.
|
|
68
|
+
- Every WordPress-API version or behavior claim is `documentation-based` (or `context7-grounded` where available), never memory.
|
|
69
|
+
- Every finding names the specific route, block, or handler, not a general area of the codebase.
|
|
70
|
+
- Non-WordPress-specific findings are handed off, not adjudicated here.
|
|
71
|
+
|
|
72
|
+
## Evidence classification
|
|
73
|
+
|
|
74
|
+
Label each finding `repo evidence` (seen directly in the code), `context7-grounded` (current documentation via Context7), `documentation-based` (official developer.wordpress.org documentation fetched directly), or `inference`. Documentation describes the intended pattern; it does not prove what a specific file actually does — always tie the claim back to the file and code path observed.
|
|
75
|
+
|
|
76
|
+
## Security and privacy constraints
|
|
77
|
+
|
|
78
|
+
Static review only. Never execute plugin/theme code, submit forms, call REST endpoints, or trigger admin-ajax actions against any live, sandbox, or staging WordPress install. Never request, echo, store, or reproduce a secret, API key, database credential, or credential-shaped string found in code; treat any such string as a redact-and-flag finding.
|
|
79
|
+
|
|
80
|
+
## Escalation conditions
|
|
81
|
+
|
|
82
|
+
Escalate to incident response any evidence the gap is already reachable in a live, publicly deployed site rather than merely present in source under review. Hand off non-WordPress-specific findings (generic PHP, infrastructure, supply-chain) to the reviewer who owns that area instead of adjudicating them here.
|
|
83
|
+
|
|
84
|
+
## References
|
|
85
|
+
|
|
86
|
+
Load these only when needed:
|
|
87
|
+
|
|
88
|
+
- [REST API permission_callback enforcement](references/rest-api-permission-callback.md) — the required `permission_callback` argument, the `__return_true` public-endpoint pattern, and REST nonce/capability enforcement.
|
|
89
|
+
- [Dynamic block output escaping](references/dynamic-block-output-escaping.md) — how `render_callback`/`render.php` execute and what escaping is required at each output point.
|
|
90
|
+
- [Input validation, sanitization, and output escaping](references/input-sanitize-output-escape.md) — the validate-input/escape-output discipline, sanitizing and escaping function reference, and nonce/capability checks for state-changing requests.
|
|
91
|
+
|
|
92
|
+
## Response minimum
|
|
93
|
+
|
|
94
|
+
Return, at minimum:
|
|
95
|
+
|
|
96
|
+
- the route(s), block(s), or handler(s) in scope and, per finding, the failure class and evidence tier;
|
|
97
|
+
- the concrete exploit narrative (how the gap is actually reachable, not just theoretically present);
|
|
98
|
+
- concrete remediation naming the specific WordPress function or pattern to add, and an exact verification step;
|
|
99
|
+
- handoffs for any non-WordPress-specific finding, and any incident-response escalation.
|
|
100
|
+
|
|
101
|
+
## Anti-goals
|
|
102
|
+
|
|
103
|
+
- Do not expand into generic PHP review; own the WordPress-specific seam, hand off everything else.
|
|
104
|
+
- Do not execute plugin/theme code or contact any live, sandbox, or staging WordPress install.
|
|
105
|
+
- Do not echo, reproduce, or transmit any secret, credential, or credential-shaped string.
|
|
106
|
+
- Do not assert a WordPress API version or behavior from memory.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wordpress-rest-block-security-review",
|
|
3
|
+
"name": "WordPress REST & Block Security Review",
|
|
4
|
+
"type": "skill",
|
|
5
|
+
"provider": "php",
|
|
6
|
+
"harnesses": ["claude-code", "cursor", "codex", "gemini", "kiro", "other"],
|
|
7
|
+
"summary": "Skill for reviewing WordPress plugin and theme security: REST register_rest_route permission_callback enforcement (required since WordPress 5.5) and nonce/capability checks, dynamic-block render_callback output escaping, and the validate-on-input, escape-on-output discipline behind the plugin-dominated WordPress CVE surface.",
|
|
8
|
+
"source_type": "original",
|
|
9
|
+
"official_docs": [
|
|
10
|
+
"https://developer.wordpress.org/apis/security/",
|
|
11
|
+
"https://developer.wordpress.org/rest-api/extending-the-rest-api/routes-and-endpoints/",
|
|
12
|
+
"https://developer.wordpress.org/block-editor/getting-started/fundamentals/static-dynamic-rendering/",
|
|
13
|
+
"https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/"
|
|
14
|
+
],
|
|
15
|
+
"security_notes": "Static-review-only skill: Read/Grep/Glob, no execution and no live WordPress access. Flags missing permission_callback, unescaped output, and missing nonce/capability checks from source only; treats any credential- or PII-shaped string as a redact-and-flag finding; grounds REST and block-editor API claims in current developer.wordpress.org documentation.",
|
|
16
|
+
"last_verified": "2026-07-16",
|
|
17
|
+
"path": "skills/php/wordpress-rest-block-security-review",
|
|
18
|
+
"author": "github: Raishin",
|
|
19
|
+
"version": "0.1.0"
|
|
20
|
+
}
|
package/skills/php/wordpress-rest-block-security-review/references/dynamic-block-output-escaping.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Dynamic block output escaping
|
|
2
|
+
|
|
3
|
+
## Why this matters
|
|
4
|
+
|
|
5
|
+
A dynamic block's render function does not run once at build time — it runs on the server for every single front-end page view that includes the block. If that render function interpolates a dynamic value (a block attribute, post meta, a query result) into its returned markup without escaping, the resulting cross-site-scripting vector is not a one-off, one-visitor bug: it fires for every visitor, on every render, for as long as the block appears on the page. This is the single highest-severity, highest-blast-radius pattern this skill reviews for.
|
|
6
|
+
|
|
7
|
+
## NORMATIVE: dynamic blocks render on the server at request time via render_callback or render.php
|
|
8
|
+
|
|
9
|
+
Per the WordPress Block Editor Handbook's "Static or Dynamic rendering" documentation (`documentation-based`): "Blocks with 'dynamic rendering' are designed to generate their content and structure in real-time when requested on the front end." The handbook identifies two supported ways to implement this: "Using the `render_callback` argument that can be passed to the `register_block_type()` function" and "Using a separate PHP file usually named `render.php`." It further states that on the front end, "the `render_callback` is used to dynamically render the markup for the block depending on the specific values on the server at the time the block is requested" — the render happens per-request, using live server-side values, not once at authoring time.
|
|
10
|
+
|
|
11
|
+
The same page's own example (the Site Title block's dynamic render) demonstrates the expected pattern directly: `esc_url()`, `esc_attr()`, and `esc_html()` are applied to dynamic values before they are placed into the returned markup. This is the documented reference pattern reviewers should compare a given `render_callback`/`render.php` against.
|
|
12
|
+
|
|
13
|
+
## Reviewer evidence criteria
|
|
14
|
+
|
|
15
|
+
For every dynamic block `render_callback` or `render.php` in scope:
|
|
16
|
+
|
|
17
|
+
- Identify every dynamic value that reaches the returned markup: block attributes (`$attributes`), post/site data fetched via WordPress functions (`get_post_meta()`, `get_the_title()`, a custom query result), and any other value not authored as static markup in the block's own template.
|
|
18
|
+
- For each such value, confirm the escaping function matches its output context:
|
|
19
|
+
- text content inside an HTML element: `esc_html()`.
|
|
20
|
+
- a value printed into an HTML attribute: `esc_attr()`.
|
|
21
|
+
- a URL, including `src`/`href` attribute values: `esc_url()`.
|
|
22
|
+
- content that is itself expected to contain limited, allowed HTML (e.g. rendering a subset of post content): `wp_kses_post()` rather than `esc_html()`, which would strip the allowed markup entirely.
|
|
23
|
+
- Flag a dynamic value that reaches output with no escaping function applied at all as a direct site-wide XSS finding — the highest-severity finding class in this skill.
|
|
24
|
+
- Flag escaping applied earlier in the function (e.g. sanitizing on input) but not re-applied at the actual output point, since a value can be mutated or recombined between input and output; escaping must hold at the point of output, not merely somewhere upstream.
|
|
25
|
+
- Do not flag static markup authored directly in the block's template with no dynamic interpolation — escaping applies to dynamic values, not to literal markup the developer wrote.
|
|
26
|
+
|
|
27
|
+
## RECOMMENDATION: how to phrase a dynamic-block escaping finding
|
|
28
|
+
|
|
29
|
+
- Name the block (registered block name) and the exact file/line in the `render_callback`/`render.php` where the unescaped value is emitted.
|
|
30
|
+
- Identify the dynamic value's source (attribute name, meta key, query) so the reviewer or maintainer can see exactly what an attacker-controlled or otherwise untrusted input would need to look like to exploit it.
|
|
31
|
+
- State the output context (HTML content / attribute / URL / limited-HTML content) and name the specific escaping function that context requires.
|
|
32
|
+
- Note that because dynamic block rendering executes on every front-end view, this is a standing, always-live vector once the block is published — not merely a reachable path found in review.
|
|
33
|
+
|
|
34
|
+
## Applicable versions
|
|
35
|
+
|
|
36
|
+
- Block Editor Handbook static/dynamic rendering guidance: current Block Editor Handbook (`render_callback` and `render.php` as the two supported dynamic-rendering mechanisms). Re-verify against the current handbook before relying on details beyond what is quoted here, since block-editor APIs evolve across WordPress releases.
|
|
37
|
+
|
|
38
|
+
## Sources
|
|
39
|
+
|
|
40
|
+
- [WordPress Block Editor Handbook — Static or Dynamic rendering of a block](https://developer.wordpress.org/block-editor/getting-started/fundamentals/static-dynamic-rendering/) — supports the definition of dynamic rendering, the `render_callback`/`render.php` mechanisms, the per-request server-side execution model, and the Site Title block's `esc_url()`/`esc_attr()`/`esc_html()` reference example.
|
|
41
|
+
|
|
42
|
+
Last verified: 2026-07-16.
|
package/skills/php/wordpress-rest-block-security-review/references/input-sanitize-output-escape.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Input validation, sanitization, and output escaping
|
|
2
|
+
|
|
3
|
+
## Why this matters
|
|
4
|
+
|
|
5
|
+
WordPress's own security guidance names a single core model for every place a plugin or theme handles data: validate and sanitize on input, escape on output, and never trust any input regardless of its source. Most plugin and theme vulnerabilities are a violation of exactly this model at one specific point — a value that should have been checked or cleaned before use, or a value that should have been escaped where it was printed, was not. Reviewing against this model directly, rather than against a vague sense of "looks risky," is what makes a finding concrete and actionable.
|
|
6
|
+
|
|
7
|
+
## NORMATIVE: validate/sanitize input, escape output, never trust input
|
|
8
|
+
|
|
9
|
+
Per the WordPress Developer Resources security overview (`documentation-based`): "Always make sure to validate and sanitize user input before using it, and to escape on output." The same page states its guiding principles directly: "Never trust user input," "Escape as late as possible," "Escape everything from untrusted sources (e.g., databases and users), third-parties (e.g., Twitter), etc.," and "Sanitation is okay, but validation/rejection is better." These principles apply regardless of the input's apparent trust level — including data read back from the WordPress database or from a third-party API, not only data taken directly from a request.
|
|
10
|
+
|
|
11
|
+
## NORMATIVE: sanitizing input
|
|
12
|
+
|
|
13
|
+
Per the WordPress Developer Resources sanitizing-data documentation (`documentation-based`), sanitizing is "the process of securing/cleaning/filtering input data," and "all of it needs to be checked before it's used," including from sources that might otherwise be assumed trusted. Commonly applicable sanitizing functions the same page documents include `sanitize_text_field()`, `sanitize_textarea_field()`, `sanitize_email()`, `sanitize_file_name()`, `sanitize_url()`, and `wp_kses()`/`wp_kses_post()` for input that must retain a restricted set of HTML. The page's own example shows `sanitize_text_field()` performing UTF-8 validation, tag stripping, and removal of line breaks/tabs/extra whitespace — concrete, checkable behavior a reviewer can compare a given sanitization call's expected effect against. The same page restates the preference already noted above: "Validation is preferred over sanitization because validation is more specific" — when a value has a specific expected shape (an integer ID, an email address, an enumerated option), validate and reject rather than merely sanitize.
|
|
14
|
+
|
|
15
|
+
## NORMATIVE: escaping output, as late as possible
|
|
16
|
+
|
|
17
|
+
Per the WordPress Developer Resources escaping-data documentation (`documentation-based`), escaping is "the process of securing output data by stripping out unwanted data, like malformed HTML or script tags." The page documents the core escaping functions by output context: `esc_html()` — "Use anytime an HTML element encloses a section of data being displayed. This will remove HTML"; `esc_attr()` — "Use on everything else that's printed into an HTML element's attribute"; `esc_url()` — "Use on all URLs, including those in the `src` and `href` attributes of an HTML element"; and `wp_kses_post()`, described as an "Alternative version of `wp_kses()` that automatically allows all HTML that is permitted in post content." The page states plainly: "It is best to do the output escaping as late as possible, ideally as data is being outputted" — escaping a variable once far from its output point, rather than inline at the point of output, is a documented anti-pattern, not merely a style preference, because it makes the correctness of the escaping harder to verify by inspection and easier to accidentally bypass with a later code change.
|
|
18
|
+
|
|
19
|
+
## NORMATIVE: nonces and capability checks for state-changing requests
|
|
20
|
+
|
|
21
|
+
Per the WordPress Developer Resources nonces documentation (`documentation-based`), nonces "help protect URLs and forms from certain types of misuse, malicious or otherwise," and specifically "help protect against several types of attacks including CSRF." WordPress provides `wp_create_nonce()`, `wp_nonce_url()`, and `wp_nonce_field()` to generate nonces, and `check_admin_referer()` (checks the nonce and the referrer, for admin screens), `check_ajax_referer()` (checks the nonce but not the referrer, for AJAX requests), and `wp_verify_nonce()` (general-purpose verification) to check them. For REST requests specifically, the REST API Handbook's authentication documentation states nonces are transmitted via the `_wpnonce` parameter or the `X-WP-Nonce` header under the `wp_rest` action, and that a missing or invalid nonce demotes the request to an unauthenticated one rather than failing the request outright.
|
|
22
|
+
|
|
23
|
+
Per the WordPress Developer Resources user-roles-and-capabilities documentation (`documentation-based`): "As you build a plugin, make sure to run your code only when the current user has the necessary capabilities." The page's own contrasting example shows code with no capability check allowing "any visitor to the site to trash posts," against a corrected version gated by `current_user_can( 'edit_others_posts' )` — a nonce check alone confirms the request came from an expected context; it does not confirm the requester is authorized. Both checks are required together for a state-changing request: a nonce check without a capability check still permits an authenticated-but-unauthorized user to act, and a capability check without a nonce check is still forgeable via CSRF from an authenticated user's own browser.
|
|
24
|
+
|
|
25
|
+
## Reviewer evidence criteria
|
|
26
|
+
|
|
27
|
+
- For every input source (REST params, `$_POST`/`$_GET`/`$_REQUEST`, shortcode attributes, block attributes, imported/uploaded data): confirm a validation or sanitization function is applied before the value is used in a query, a file path, a shell/command context, or output. An input used raw, or checked only with an `isset()`/type check with no actual sanitization/validation function, is a finding.
|
|
28
|
+
- Prefer validation (checking the value matches an expected, specific shape and rejecting it otherwise) over sanitization alone wherever the expected shape is specific enough to validate directly (an integer ID via `absint()`, an enumerated option checked against a whitelist).
|
|
29
|
+
- For every output point printing a value derived from user input, the database, or a third-party source: confirm the escaping function matches the output context (`esc_html()` for element content, `esc_attr()` for attributes, `esc_url()` for URLs, `wp_kses_post()` for content intentionally retaining limited HTML) and is applied at the point of output, not only earlier in the function.
|
|
30
|
+
- For every state-changing request (form submission, admin-ajax action, REST write): confirm both a nonce check (`wp_verify_nonce()`, `check_admin_referer()`, `check_ajax_referer()`, or REST nonce handling) and a `current_user_can()` capability check scoped to the specific action performed are present. Flag the absence of either one independently — do not treat one as substituting for the other.
|
|
31
|
+
|
|
32
|
+
## RECOMMENDATION: how to phrase a validate/sanitize/escape finding
|
|
33
|
+
|
|
34
|
+
- Name the exact input source or output point and the file/line involved.
|
|
35
|
+
- State which half of the model is missing: input not validated/sanitized before use, or output not escaped at the point of output (or both).
|
|
36
|
+
- Name the specific WordPress function that belongs there (e.g. `sanitize_text_field()` on input, `esc_html()` at output, `current_user_can( '<capability>' )` plus a nonce check on a state-changing action) rather than a generic "add validation" instruction.
|
|
37
|
+
- Where a nonce or capability check is missing on a state-changing request, state which of the two is absent (or both), since each addresses a different attack (CSRF vs. unauthorized-but-authenticated access).
|
|
38
|
+
|
|
39
|
+
## Applicable versions
|
|
40
|
+
|
|
41
|
+
- Guiding principles, sanitizing functions, and escaping functions: current WordPress Developer Resources security documentation. Re-verify against the current pages before relying on details beyond what is quoted here, since the function reference lists are maintained and can change.
|
|
42
|
+
|
|
43
|
+
## Sources
|
|
44
|
+
|
|
45
|
+
- [WordPress Developer Resources — Security](https://developer.wordpress.org/apis/security/) — supports the core "validate and sanitize input, escape on output" model and the guiding principles ("Never trust user input," "Escape as late as possible," "Escape everything from untrusted sources," "Sanitation is okay, but validation/rejection is better").
|
|
46
|
+
- [WordPress Developer Resources — Sanitizing Data](https://developer.wordpress.org/apis/security/sanitizing/) — supports the sanitizing-function reference (`sanitize_text_field()`, `sanitize_email()`, `sanitize_file_name()`, `sanitize_url()`, `wp_kses()`/`wp_kses_post()`) and the validation-over-sanitization preference.
|
|
47
|
+
- [WordPress Developer Resources — Escaping Data](https://developer.wordpress.org/apis/security/escaping/) — supports the escaping-function reference (`esc_html()`, `esc_attr()`, `esc_url()`, `wp_kses_post()`) and the "escape as late as possible" principle.
|
|
48
|
+
- [WordPress Developer Resources — Nonces](https://developer.wordpress.org/apis/security/nonces/) — supports nonce creation (`wp_create_nonce()`, `wp_nonce_url()`, `wp_nonce_field()`) and verification (`wp_verify_nonce()`, `check_admin_referer()`, `check_ajax_referer()`) as CSRF protection.
|
|
49
|
+
- [WordPress Developer Resources — User Roles and Capabilities](https://developer.wordpress.org/apis/security/user-roles-and-capabilities/) — supports the `current_user_can()` capability-check pattern and the contrast between an unchecked action and one gated by a specific capability.
|
|
50
|
+
- [WordPress REST API Handbook — Authentication](https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/) — supports REST-specific nonce transport (`_wpnonce`/`X-WP-Nonce` under the `wp_rest` action) and the requirement for a capability check beyond nonce verification.
|
|
51
|
+
|
|
52
|
+
Last verified: 2026-07-16.
|
package/skills/php/wordpress-rest-block-security-review/references/rest-api-permission-callback.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# REST API permission_callback enforcement
|
|
2
|
+
|
|
3
|
+
## Why this matters
|
|
4
|
+
|
|
5
|
+
A REST route is reachable by anyone who can send an HTTP request to it, regardless of whether it appears in a menu, an admin screen, or any UI at all. `register_rest_route()` treats the permissions callback as a first-class, separate argument from the main callback for exactly this reason: the main callback should handle the resource, and the permissions callback should decide who is allowed to reach it. Omitting that argument, or setting it to an always-true callback on a route that is not genuinely public, leaves the route open to anyone who finds it.
|
|
6
|
+
|
|
7
|
+
## NORMATIVE: permission_callback is a required, checked argument
|
|
8
|
+
|
|
9
|
+
Per the WordPress REST API Handbook (`documentation-based`), `register_rest_route()` currently supports two callback arguments — `callback` and `permission_callback` — and describes their roles explicitly: "The main callback should handle the interaction with the resource. The permissions callback should handle what users have access to the endpoint." The handbook further states plainly that permissions callbacks "are extremely important for security with the WordPress REST API," and that any endpoint exposing data that should not be displayed publicly needs one registered.
|
|
10
|
+
|
|
11
|
+
Per the `register_rest_route()` function reference changelog (`documentation-based`), version **5.5.0** added a `_doing_it_wrong()` notice for the case where the required `permission_callback` argument is not provided. The notice text itself states the expectation directly: "The REST API route definition for %1$s is missing the required %2$s argument. For REST API routes that are intended to be public, use %3$s as the permission callback." That message names `__return_true` as the sanctioned pattern specifically for routes "intended to be public" — using it on a route that is not intended to be public is the documented anti-pattern this skill flags, not an inference.
|
|
12
|
+
|
|
13
|
+
## Reviewer evidence criteria
|
|
14
|
+
|
|
15
|
+
Treat each of the following as a finding when reviewing a `register_rest_route()` call or a `WP_REST_Controller` subclass:
|
|
16
|
+
|
|
17
|
+
- No `permission_callback` key present in the route's args array at all.
|
|
18
|
+
- `permission_callback` set to `__return_true`, an inline closure that always returns `true`, or any other always-true callback, on a route that reads non-public data, accepts a state-changing HTTP method (`POST`/`PUT`/`PATCH`/`DELETE`), or otherwise is not genuinely intended for anonymous, public access.
|
|
19
|
+
- `permission_callback` present but checking a condition unrelated to authorization for the operation performed (e.g. checking that a parameter is set, rather than checking the requesting user's identity or capability).
|
|
20
|
+
- A permissions callback that itself trusts client-supplied data (e.g. a request parameter) to decide authorization, rather than checking the authenticated user or a server-side capability.
|
|
21
|
+
|
|
22
|
+
A `permission_callback` correctly scoped to a genuinely public, read-only, non-sensitive route (e.g. `__return_true` on a route that only returns already-public content) is not a finding — confirm the public-data justification before flagging.
|
|
23
|
+
|
|
24
|
+
## NORMATIVE: REST authentication relies on nonces and capability checks together
|
|
25
|
+
|
|
26
|
+
Per the WordPress REST API Handbook's authentication documentation (`documentation-based`): "Cookie authentication is the standard authentication method included with WordPress" and "the REST API includes a technique called nonces to avoid CSRF issues." The nonce is transmitted as "the `_wpnonce` data parameter (either POST data or in the query for GET requests), or via the `X-WP-Nonce` header," created against "the action set to `wp_rest`." The handbook also states that "if no nonce is provided the API will set the current user to 0, turning the request into an unauthenticated request" — so a missing or invalid nonce does not error out; it silently demotes the request to an anonymous one, which is itself a review-relevant fact when a route's `permission_callback` assumes an authenticated user.
|
|
27
|
+
|
|
28
|
+
The same documentation states that beyond nonce verification (which the API performs automatically for you), "the current user must have the appropriate capability to perform the action being performed" — nonce verification proves the request came from an expected context, it does not by itself prove the user is authorized. A `permission_callback` must still perform its own capability check (e.g. `current_user_can()`) for any route that is not intended to be fully public.
|
|
29
|
+
|
|
30
|
+
## RECOMMENDATION: how to phrase a permission_callback finding
|
|
31
|
+
|
|
32
|
+
- Name the route (path and HTTP method) and the exact file/line where `register_rest_route()` is called.
|
|
33
|
+
- State whether `permission_callback` is absent or set to an always-true callback, and whether the route was intended to be public — cite the code that suggests intent (e.g. handling of user-specific or write-capable data) rather than assuming.
|
|
34
|
+
- Give the concrete remediation: add a `permission_callback` that checks `current_user_can()` against the specific capability the operation requires, or confirm and document that the route is intentionally public.
|
|
35
|
+
- Note, where relevant, whether the endpoint also depends on nonce-based cookie authentication and whether a missing/invalid nonce would silently demote the request to anonymous rather than fail closed.
|
|
36
|
+
|
|
37
|
+
## Applicable versions
|
|
38
|
+
|
|
39
|
+
- `permission_callback` enforcement via `_doing_it_wrong()` notice: WordPress 5.5.0 and later.
|
|
40
|
+
- REST cookie authentication and the `wp_rest` nonce action: current WordPress REST API Handbook, re-verify against the handbook before relying on details beyond what is quoted here.
|
|
41
|
+
|
|
42
|
+
## Sources
|
|
43
|
+
|
|
44
|
+
- [WordPress REST API Handbook — Routes and Endpoints](https://developer.wordpress.org/rest-api/extending-the-rest-api/routes-and-endpoints/) — supports the `callback`/`permission_callback` argument split, the description of what each callback does, and the handbook's own framing of permissions callbacks as extremely important for security.
|
|
45
|
+
- [WordPress REST API Handbook — Authentication](https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/) — supports cookie authentication as the standard method, the `wp_rest` nonce action, the `X-WP-Nonce`/`_wpnonce` transport mechanism, the silent demotion to user 0 on a missing/invalid nonce, and the requirement for a capability check beyond nonce verification.
|
|
46
|
+
- [WordPress function reference — register_rest_route()](https://developer.wordpress.org/reference/functions/register_rest_route/) — supports the 5.5.0 changelog entry adding a `_doing_it_wrong()` notice for a missing required `permission_callback` argument, and the notice's own text naming `__return_true` as the pattern for routes intended to be public.
|
|
47
|
+
|
|
48
|
+
Last verified: 2026-07-16.
|