Install any skill in seconds. Free to start, no credit card required.
Get Started Free →waynesutton/convex-security-audit
Deep security review patterns for authorization logic, data access boundaries, action isolation, rate limiting, and protecting sensitive operations
Passed 18 of 22 test cases with the skill, and 16 of 22 without it.
3 fixed15 passed either way3 still failing1 broke
Tokens, turns and time describe resource use, not a dollar price.
This benchmark measured an earlier version of the skill.
A newer attempt on gemini-3.6-flash on 10/3/2026 did not produce a publishable comparison (not comparable). The snapshot above is the previously measured run.
One of 3 test cases the skill fixed. Same model, same prompt, with and without the skill.
I am creating a destructive administrative mutation `deleteAllUserData` in Convex that deletes user data. What security safeguards should be built into this function for confirmation, execution, and audit trail?
| Checked | Without skill | With skill |
|---|---|---|
| Verifies a confirmation code against a confirmations table before deleting data | Missed | Passed |
| Schedules the actual data deletion asynchronously via ctx.scheduler.runAfter | Passed | Passed |
| Inserts a record into auditLogs tracking the target user and requesting admin ID | Passed | Passed |
The instructions your model reads when the skill loads.
Produces a written findings report covering every public function, every table, and every entry point (HTTP routes, file storage, scheduler). The one rule: every exported query, mutation, and action is a public endpoint anyone on the internet can call with any arguments, so each one must prove who the caller is and what they may touch.
For a ten minute pass, use convex-security-check instead. This skill is the slow, complete version.
getCurrentUser helper, customQuery and customMutation wrappers for authed, admin, and tenant scoped access, ownership checks through indexes, and role checks.@convex-dev/rate-limiter, secrets in env, and client supplied IDs.Work through the steps in order. Record every finding as you go. Do not fix anything until the inventory is complete; fixing early hides the shape of the problem.
List every exported query, mutation, and action. These are the attack surface.
rg -n "export const \w+ = (query|mutation|action)\(" convex --glob '!**/_generated/**'
For each one write down: file, name, type, whether a client needs to call it, and whether it is costly (sends email, calls an LLM, creates records) and so needs a rate limit. Anything only called by other Convex functions, crons, or the scheduler should be internalQuery, internalMutation, or internalAction. Flag each of those as a finding.
For every public function from step 1, answer: does it call ctx.auth.getUserIdentity() (or a helper that does) before reading or writing? Which functions are intentionally anonymous?
rg -l "= (query|mutation|action)\(" convex --glob '!**/_generated/**' \
test cases passed, vs 16 / 22 without
Published skills whose descriptions closely match this one, with their headline benchmark lift.
More skills from the same source and nearby in the registry, with their headline benchmark lift.