Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Add authentication (passkeys/OAuth) to the current Convex app, including the auth.config.ts wiring.
.claude/skills/get-convex-convex-auth/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -14% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -3% | 0% |
<!-- GENERATED from convex-agents content/capabilities/auth.json — do not edit by hand. -->
Install and wire @convex-dev/auth for the current app: a provider (passkeys by default, or OAuth/password), the server config, the client hooks, and a sign-in UI — correctly, including the auth.config.ts that's the #1 real-world auth footgun.
pnpm add jose (it won't hoist otherwise); you need it for step 3.npx @convex-dev/auth wizard: it needs a login/TTY and hangs in non-interactive, anonymous, or CI runs (the #1 auth time-sink). Generate JWT_PRIVATE_KEY + JWKS deterministically with jose:node -e 'import("jose").then(async({generateKeyPair,exportPKCS8,exportJWK})=>{const k=await generateKeyPair("RS256",{extractable:true});const priv=await exportPKCS8(k.privateKey);const pub=await exportJWK(k.publicKey);process.stdout.write(JSON.stringify({JWT_PRIVATE_KEY:priv.trimEnd().replace(/\n/g," "),JWKS:JSON.stringify({keys:{use:"sig",...pub}]})}))})' > .auth-keys.json Then set JWT_PRIVATE_KEY and JWKS (from .auth-keys.json) plus SITE_URL on the deployment. Prefer the Convex MCP envSet tool, one call per var, to avoid shell-quoting the multi-line key. CLI fallback: use the NAME=VALUE form (npx convex env set "JWT_PRIVATE_KEY=$JWT"), NEVER env set JWT_PRIVATE_KEY "$JWT" (the value starts with -----BEGIN and the CLI parses the leading - as an unknown flag). SITE_URL is the dev URL (e.g. http://localhost:3000). Delete .auth-keys.json after.
npx shadcn@latest add <name>; a missing @/components/ui/ is a hard build error.jose (extractable RS256; PKCS8 newlines to spaces; JWKS = {keys:{use:"sig", ...publicJwk}]}). Do NOT run the interactive npx @convex-dev/auth wizard: it hangs headless/anonymous. Set the vars via the MCP envSet tool or the NAME=VALUE CLI form.npx shadcn@latest add ...); a missing @/components/ui/ is a hard build failure.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→fail | 8,355 | 6,874 | -18% | 1 | 1 | 0% | 1,565 | 1,136 | -27% | 0 | 0 | — |
case-01 | fail→fail | 25,468 | 12,961 | -49% | 1 | 1 | 0% | 4,122 | 930 | -77% | 0 | 0 | — |
case-02 | fail→fail | 24,178 | 6,567 | -73% | 1 | 1 | 0% | 5,737 | 1,135 | -80% | 0 | 0 | — |
case-03 | fail→fail | 43,997 | 5,616 | -87% | 1 | 1 | 0% | 7,316 | 1,014 | -86% | 0 | 0 | — |
case-04 | pass→pass | 14,206 | 14,070 | -1% | 1 | 1 | 0% | 2,098 | 3,093 | +47% | 0 | 0 | — |
case-05 | pass→pass | 14,725 | 12,928 | -12% | 1 | 1 | 0% | 2,829 | 2,877 | +2% | 0 | 0 | — |
case-06 | fail→pass | 16,026 | 21,982 | +37% | 1 | 1 | 0% | 3,051 | 4,315 | +41% | 0 | 0 | — |
case-07 | fail→pass | 9,007 | 2,194 | -76% | 1 | 1 | 0% | 1,178 | 1,153 | -2% | 0 | 0 | — |
case-09 | pass→pass | 13,183 | 9,565 | -27% | 1 | 1 | 0% | 2,479 | 2,774 | +12% | 0 | 0 | — |
case-10 | pass→pass | 6,832 | 19,585 | +187% | 1 | 1 | 0% | 1,247 | 3,899 | +213% | 0 | 0 | — |
case-11 | fail→pass | 12,471 | 11,393 | -9% | 1 | 1 | 0% | 2,122 | 2,982 | +41% | 0 | 0 | — |
case-12 | pass→pass | 9,985 | 7,613 | -24% | 1 | 1 | 0% | 1,645 | 2,243 | +36% | 0 | 0 | — |
case-13 | fail→pass | 12,469 | 5,507 | -56% | 1 | 1 | 0% | 2,021 | 1,733 | -14% | 0 | 0 | — |
case-14 | fail→pass | 14,858 | 8,214 | -45% | 1 | 1 | 0% | 2,358 | 2,296 | -3% | 0 | 0 | — |
case-15 | pass→pass | 8,819 | 5,362 | -39% | 1 | 1 | 0% | 1,299 | 1,582 | +22% | 0 | 0 | — |
case-16 | fail→pass | 13,539 | 7,045 | -48% | 1 | 1 | 0% | 1,993 | 1,836 | -8% | 0 | 0 | — |
case-17 | pass→pass | 17,387 | 6,533 | -62% | 1 | 1 | 0% | 2,695 | 2,056 | -24% | 0 | 0 | — |
case-18 | pass→pass | 8,936 | 2,439 | -73% | 1 | 1 | 0% | 1,394 | 1,048 | -25% | 0 | 0 | — |
case-19 | pass→pass | 4,110 | 2,950 | -28% | 1 | 1 | 0% | 676 | 1,210 | +79% | 0 | 0 | — |
case-20 | pass→pass | 3,356 | 3,163 | -6% | 1 | 1 | 0% | 571 | 1,208 | +112% | 0 | 0 | — |
case-21 | pass→pass | 6,027 | 1,794 | -70% | 1 | 1 | 0% | 806 | 1,088 | +35% | 0 | 0 | — |
case-22 | pass→pass | 7,383 | 4,620 | -37% | 1 | 1 | 0% | 1,312 | 1,576 | +20% | 0 | 0 | — |
case-23 | fail→pass | 8,841 | 9,893 | +12% | 1 | 1 | 0% | 1,260 | 2,567 | +104% | 0 | 0 | — |
case-24 | pass→pass | 10,284 | 6,602 | -36% | 1 | 1 | 0% | 1,541 | 1,708 | +11% | 0 | 0 | — |
case-25 | fail→pass | 14,368 | 10,734 | -25% | 1 | 1 | 0% | 2,655 | 2,414 | -9% | 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. 25 cases were attempted, and 21 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.