Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Convex backend specialist. Use this agent for any code inside a `convex/` directory — function definitions, schemas, indexes, queries, mutations, actions, HTTP endpoints, cron jobs, file storage, auth wiring, and component installation. Knows the object-form function syntax, validator patterns, resource limits, and component ecosystem that generic Claude routinely gets wrong.
.claude/skills/get-convex-convex-expert/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 126% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 277% | 0% |
| case-22 | ✗→✓ | ▲ Improved | -19% | 0% |
<!-- GENERATED from convex-agents content/capabilities/convex-expert.json — do not edit by hand. -->
Always-on Convex backend specialist invoked before touching any code inside a convex/ directory. Knows the object-form function syntax, validator requirements, index naming rules, internal-vs-public discipline, schema evolution patterns, resource limits, component ecosystem, and runtime error decoder that generic models routinely get wrong.
.collect() on a table that can grow — use .withIndex(...) and .paginate(paginationOptsValidator)/.take(n) instead. This is the single most common Convex deploy-blocking and perf defect..index(...) in schema.ts for every read path and query it with .withIndex(...); .filter() is a full table scan, never a substitute for a WHERE.query/mutation/action/internalQuery/internalMutation/internalAction come from "./_generated/server"; api/internal come from "./_generated/api"; NEVER import { query } from "convex/server" or import { internal } from "./_generated/server" in application code — both are hard deploy failures.v.literal("exact value") for a fixed string/enum member (e.g. v.union(v.literal("open"), v.literal("closed"))) — not a bare v.string() when the set of values is fixed."use node"; goes only at the top of action-only modules — a file with "use node" can never also export a query or mutation (they don't run in the Node runtime); split the file if you need both.convex/ directory — never write schema.ts/queries/mutations/actions at the project root.npx tsc --noEmit and, when a deployment is available (or via a local anonymous one: CONVEX_AGENT_MODE=anonymous npx convex dev --once), push it. Fix every error it reports before finishing — one verify round catches the wrong-relative-import / duplicate-symbol / unbalanced-paren class that otherwise breaks the deploy.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | pass→pass | 9,865 | 6,084 | -38% | 1 | 1 | 0% | 1,339 | 2,071 | +55% | 0 | 0 | — |
case-01 | fail→fail | 17,131 | 24,217 | +41% | 1 | 1 | 0% | 3,771 | 4,726 | +25% | 0 | 0 | — |
case-02 | fail→pass | 18,946 | 25,632 | +35% | 1 | 1 | 0% | 2,818 | 6,363 | +126% | 0 | 0 | — |
case-03 | fail→pass | 24,577 | 31,689 | +29% | 1 | 1 | 0% | 3,767 | 5,504 | +46% | 0 | 0 | — |
case-04 | pass→pass | 10,820 | 11,928 | +10% | 1 | 1 | 0% | 2,217 | 2,642 | +19% | 0 | 0 | — |
case-05 | pass→pass | 12,575 | 10,642 | -15% | 1 | 1 | 0% | 1,793 | 2,576 | +44% | 0 | 0 | — |
case-06 | pass→pass | 12,990 | 10,496 | -19% | 1 | 1 | 0% | 1,813 | 2,414 | +33% | 0 | 0 | — |
case-07 | pass→pass | 17,712 | 15,375 | -13% | 1 | 1 | 0% | 3,338 | 3,377 | +1% | 0 | 0 | — |
case-08 | pass→pass | 6,492 | 6,763 | +4% | 1 | 1 | 0% | 939 | 1,845 | +96% | 0 | 0 | — |
case-10 | pass→pass | 15,029 | 16,031 | +7% | 1 | 1 | 0% | 2,738 | 4,215 | +54% | 0 | 0 | — |
case-11 | fail→fail | 4,726 | 10,262 | +117% | 1 | 1 | 0% | 860 | 2,437 | +183% | 0 | 0 | — |
case-12 | pass→pass | 9,300 | 9,681 | +4% | 1 | 1 | 0% | 1,697 | 2,639 | +56% | 0 | 0 | — |
case-13 | pass→pass | 9,422 | 7,580 | -20% | 1 | 1 | 0% | 1,435 | 1,887 | +31% | 0 | 0 | — |
case-14 | pass→pass | 13,063 | 7,207 | -45% | 1 | 1 | 0% | 1,915 | 1,991 | +4% | 0 | 0 | — |
case-15 | pass→pass | 9,721 | 5,365 | -45% | 1 | 1 | 0% | 1,605 | 2,000 | +25% | 0 | 0 | — |
case-16 | pass→pass | 15,932 | 10,843 | -32% | 1 | 1 | 0% | 2,344 | 2,903 | +24% | 0 | 0 | — |
case-17 | pass→pass | 9,742 | 11,107 | +14% | 1 | 1 | 0% | 1,849 | 2,594 | +40% | 0 | 0 | — |
case-18 | fail→pass | 16,243 | 24,155 | +49% | 1 | 1 | 0% | 2,491 | 4,646 | +87% | 0 | 0 | — |
case-19 | fail→pass | 5,386 | 11,246 | +109% | 1 | 1 | 0% | 827 | 3,116 | +277% | 0 | 0 | — |
case-20 | pass→pass | 15,984 | 9,469 | -41% | 1 | 1 | 0% | 2,256 | 2,201 | -2% | 0 | 0 | — |
case-21 | pass→pass | 7,185 | 3,028 | -58% | 1 | 1 | 0% | 955 | 1,412 | +48% | 0 | 0 | — |
case-22 | fail→pass | 16,151 | 6,742 | -58% | 1 | 1 | 0% | 2,718 | 2,189 | -19% | 0 | 0 | — |
case-23 | pass→pass | 14,083 | 15,595 | +11% | 1 | 1 | 0% | 2,120 | 3,177 | +50% | 0 | 0 | — |
case-24 | fail→pass | 4,012 | 8,113 | +102% | 1 | 1 | 0% | 683 | 2,184 | +220% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +25 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.