Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Stand up the project's live app and hand it to the user to try a change firsthand, then gate on their verdict before continuing. Use when the user asks to "preview the change", "let me try it", "spin up the app so I can test it", "set it up so I can poke at it", or before finalizing a UI/UX change that needs human eyes.
.claude/skills/tobihagemann-preview/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 157% | 0% |
Bring up the running app and let the user drive it themselves to judge the change, then act on their verdict.
Resolve what to preview using the first match:
If the resolved scope has no user-visible surface to try (a CLI-only change, a library with no entry point, backend work with no UI to look at), present this message: "Nothing to preview — <one-line reason>." Then call update_plan to mark this step completed and continue with the next step of the active workflow.
Check for a project-specific skill or plugin that launches the app, and use it if present. Otherwise use the fallback for the surface type:
Start backend services and frontend together — a frontend-only change still needs the backend running to be exercised. Build first if the project requires a build step.
Start long-running processes in a background shell and wait until each reports ready. Tail their logs in a background shell so backend errors and warnings surface while the user is trying the app.
If a required service cannot be stood up in this session (missing auth provider, external dependency, seed data), or a process fails to start or never reports ready, use request_user_input to surface the blocker and let the user choose how to proceed.
Output as text:
Use request_user_input to ask the user for their verdict after they have tried the app. Three options, with keeping the app running as the default:
Then call update_plan to mark this step completed and continue with the next step of the active workflow.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→fail | 7,922 | 6,162 | -22% | 1 | 1 | 0% | 1,164 | 1,315 | +13% | 0 | 0 | — |
case-01 | fail→fail | 9,974 | 4,755 | -52% | 1 | 1 | 0% | 1,614 | 914 | -43% | 0 | 0 | — |
case-02 | fail→fail | 6,516 | 4,255 | -35% | 1 | 1 | 0% | 1,074 | 899 | -16% | 0 | 0 | — |
case-03 | fail→fail | 2,823 | 5,192 | +84% | 1 | 1 | 0% | 305 | 1,024 | +236% | 0 | 0 | — |
case-04 | fail→fail | 6,554 | 3,161 | -52% | 1 | 1 | 0% | 971 | 1,267 | +30% | 0 | 0 | — |
case-05 | fail→fail | 3,444 | 3,820 | +11% | 1 | 1 | 0% | 161 | 893 | +455% | 0 | 0 | — |
case-07 | fail→pass | 17,753 | 8,818 | -50% | 1 | 1 | 0% | 2,805 | 2,039 | -27% | 0 | 0 | — |
case-08 | fail→fail | 6,434 | 11,191 | +74% | 1 | 1 | 0% | 972 | 1,918 | +97% | 0 | 0 | — |
case-09 | fail→fail | 5,517 | 4,095 | -26% | 1 | 1 | 0% | 869 | 1,402 | +61% | 0 | 0 | — |
case-10 | pass→pass | 9,356 | 4,071 | -56% | 1 | 1 | 0% | 1,428 | 1,377 | -4% | 0 | 0 | — |
case-11 | fail→pass | 8,524 | 2,838 | -67% | 1 | 1 | 0% | 1,370 | 1,191 | -13% | 0 | 0 | — |
case-12 | pass→pass | 8,304 | 2,398 | -71% | 1 | 1 | 0% | 1,200 | 1,029 | -14% | 0 | 0 | — |
case-13 | fail→pass | 9,721 | 4,502 | -54% | 1 | 1 | 0% | 1,619 | 1,383 | -15% | 0 | 0 | — |
case-14 | fail→pass | 28,519 | 2,699 | -91% | 1 | 1 | 0% | 1,242 | 1,155 | -7% | 0 | 0 | — |
case-15 | fail→fail | 5,337 | 2,011 | -62% | 1 | 1 | 0% | 805 | 1,034 | +28% | 0 | 0 | — |
case-16 | pass→fail | 14,812 | 5,499 | -63% | 1 | 1 | 0% | 2,511 | 1,521 | -39% | 0 | 0 | — |
case-17 | pass→fail | 11,526 | 2,915 | -75% | 1 | 1 | 0% | 1,869 | 1,204 | -36% | 0 | 0 | — |
case-18 | pass→pass | 6,733 | 3,731 | -45% | 1 | 1 | 0% | 1,055 | 1,326 | +26% | 0 | 0 | — |
case-19 | fail→pass | 4,488 | 7,355 | +64% | 1 | 1 | 0% | 704 | 1,808 | +157% | 0 | 0 | — |
case-20 | pass→fail | 9,823 | 5,983 | -39% | 1 | 1 | 0% | 1,842 | 1,197 | -35% | 0 | 0 | — |
case-21 | pass→fail | 11,055 | 7,305 | -34% | 1 | 1 | 0% | 1,718 | 1,123 | -35% | 0 | 0 | — |
case-22 | pass→fail | 13,442 | 5,268 | -61% | 1 | 1 | 0% | 2,711 | 1,034 | -62% | 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 15 counted toward the lift figure. The other 7 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 0 percentage points is the difference between those two pass rates over the 15 comparable cases. 5 cases got worse with the skill loaded, and they are 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.