Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Production error → triaged, root-caused, repaired, and certified (tsc + rehearsal + reproduce-then-gone) fix PR for a human to merge — then confirm the error stops recurring. Never auto-merges.
.claude/skills/get-convex-convex-self-heal/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 71% | 0% |
<!-- GENERATED from convex-agents content/capabilities/self-heal.json — do not edit by hand. -->
Sentry/Datadog/Vercel can go error→investigate→draft-PR, but they treat the backend as opaque and stop at the human merge gate with an unverified diff. Convex can do the step they can't: because the error rows live in the user's own deployment and the fix can be rehearsed on a preview of that deployment, the platform certifies the fix against real invariants before anyone reviews it. This capability is the composition capstone — it wires sentinel (capture) → the findings bus (diagnose) → the fixers (repair) → migrate-rehearse/tsc/probe (certify) → a human PR (decide) → deploy-guard (promote). The human keeps the merge button; the machine does everything up to and including proving the fix works.
(a) tsc --noEmit clean; (b) if the fix touches schema/data, run it through migrate-rehearse on a preview seeded with a prod snapshot — the schema-conformance gate must pass on real-shaped data; (c) reproduce-then-confirm-gone: replay the error's triggering input against the fixed code (a convex-test case or an MCP run on the preview) and assert the failure no longer occurs; (d) no-regression: the finding must be gone AND no new bus finding introduced on the touched function. A fix that fails any applicable certification is NOT proposed — it's reported as 'attempted, could not certify' with what failed.
logs (failures) to confirm that error signature stops recurring (do NOT use insights for this — it tracks only OCC/read-limit perf events, not arbitrary error signatures) — the loop is only closed when the error stops recurring in prod. If it recurs, reopen with the new evidence.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,757 | 13,246 | +130% | 1 | 1 | 0% | 186 | 1,733 | +832% | 0 | 0 | — |
case-02 | fail→fail | 11,743 | 7,684 | -35% | 1 | 1 | 0% | 1,556 | 1,642 | +6% | 0 | 0 | — |
case-03 | fail→fail | 7,931 | 6,187 | -22% | 1 | 1 | 0% | 1,118 | 1,770 | +58% | 0 | 0 | — |
case-04 | fail→pass | 13,093 | 4,916 | -62% | 1 | 1 | 0% | 2,112 | 1,980 | -6% | 0 | 0 | — |
case-05 | pass→pass | 10,877 | 6,818 | -37% | 1 | 1 | 0% | 1,697 | 2,098 | +24% | 0 | 0 | — |
case-06 | pass→pass | 18,040 | 7,307 | -59% | 1 | 1 | 0% | 2,314 | 2,208 | -5% | 0 | 0 | — |
case-07 | pass→pass | 11,624 | 7,099 | -39% | 1 | 1 | 0% | 1,609 | 2,334 | +45% | 0 | 0 | — |
case-08 | fail→pass | 10,559 | 7,511 | -29% | 1 | 1 | 0% | 1,641 | 2,214 | +35% | 0 | 0 | — |
case-09 | pass→fail | 3,265 | 2,920 | -11% | 1 | 1 | 0% | 436 | 1,619 | +271% | 0 | 0 | — |
case-10 | fail→fail | 11,737 | 10,233 | -13% | 1 | 1 | 0% | 1,718 | 2,644 | +54% | 0 | 0 | — |
case-11 | fail→pass | 8,782 | 3,354 | -62% | 1 | 1 | 0% | 1,158 | 1,860 | +61% | 0 | 0 | — |
case-12 | fail→pass | 14,227 | 9,097 | -36% | 1 | 1 | 0% | 2,093 | 2,513 | +20% | 0 | 0 | — |
case-13 | fail→pass | 10,203 | 6,295 | -38% | 1 | 1 | 0% | 1,329 | 2,272 | +71% | 0 | 0 | — |
case-14 | pass→pass | 16,600 | 4,388 | -74% | 1 | 1 | 0% | 2,222 | 2,050 | -8% | 0 | 0 | — |
case-15 | pass→pass | 21,984 | 9,098 | -59% | 1 | 1 | 0% | 3,716 | 2,755 | -26% | 0 | 0 | — |
case-16 | pass→pass | 11,053 | 6,257 | -43% | 1 | 1 | 0% | 1,661 | 2,104 | +27% | 0 | 0 | — |
case-17 | fail→pass | 20,895 | 15,519 | -26% | 1 | 1 | 0% | 3,283 | 3,593 | +9% | 0 | 0 | — |
case-18 | pass→pass | 9,852 | 3,165 | -68% | 1 | 1 | 0% | 1,416 | 1,753 | +24% | 0 | 0 | — |
case-19 | fail→pass | 10,223 | 4,704 | -54% | 1 | 1 | 0% | 1,568 | 2,086 | +33% | 0 | 0 | — |
case-20 | pass→pass | 14,952 | 13,306 | -11% | 1 | 1 | 0% | 2,216 | 3,423 | +54% | 0 | 0 | — |
case-21 | pass→pass | 18,683 | 16,490 | -12% | 1 | 1 | 0% | 2,856 | 3,294 | +15% | 0 | 0 | — |
case-22 | pass→pass | 12,482 | 12,462 | -0% | 1 | 1 | 0% | 2,422 | 3,543 | +46% | 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. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 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 +27 percentage points is the difference between those two pass rates over the 20 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.