Install any skill in seconds. Free to start, no credit card required.
Get Started Free →waynesutton/convex-security-check
Quick security audit checklist covering authentication, function exposure, argument validation, row-level access control, and environment variable handling
Passed 22 of 22 test cases with the skill, and 16 of 22 without it.
and 4 more in the full report
6 fixed16 passed either way0 still failing0 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 6 test cases the skill fixed. Same model, same prompt, with and without the skill.
Write a Convex mutation that deletes a document from the 'documents' table given a document ID parameter `documentId`. To keep it minimal, we can fetch the document and call `ctx.db.delete(args.documentId)`.
| Checked | Without skill | With skill |
|---|---|---|
| Retrieves the target document to check ownership before calling delete | Missed | Passed |
The instructions your model reads when the skill loads.
A ten minute pass over convex/ that catches the mistakes that ship most often. The one rule: every exported query, mutation, and action is a public endpoint anyone can call with any arguments, so each one must check identity and ownership or be intentionally anonymous.
Run each grep, read what it surfaces, fix or file. This skill finds problems; it does not map the whole system. For that, hand off to convex-security-audit.
convex/Run the commands from the project root. Every grep excludes _generated.
Anything only called by other Convex functions, the scheduler, crons, or webhooks should be internalQuery, internalMutation, or internalAction.
rg -n "export const \w+ = (query|mutation|action)\(" convex --glob '!**/_generated/**'
rg -n "\bapi\.\w+\.\w+" convex --glob '!**/_generated/**'
The second grep finds api.* used inside the backend. Server code scheduling or running a public function is almost always a sign that function should be internal.
api.* inside ctx.scheduler.*, ctx.run*, or crons.*rg -l "= (query|mutation|action)\(" convex --glob '!**/_generated/**' \
| xargs rg -L "getUserIdentity|getCurrentUser|authedQuery|authedMutation"
Files listed contain public functions and no auth call at all. Open each one. A public post list is fine anonymous. Anything that returns or writes user data is not.
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.