Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a short annotated visual walkthrough from real final-state screenshots or rendered artifacts. Use when a user asks for demo screenshots or a caller requires visual evidence after UI or rendered-output changes.
.claude/skills/udecode-walkthrough/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 29% | 0% |
Explain a completed change with a few annotated visuals. Run this after final verification. A walkthrough explains proof; it does not replace proof.
The caller decides whether the walkthrough is required. Follow the stricter repo rule when one exists.
For UI-gated workflows, treat app pages, websites, components, styles, visual content, and generated or rendered output as UI changes. If the packet changed one of those surfaces, run the walkthrough in the final handoff.
When the caller requires a walkthrough and it cannot be produced, block closeout with the exact missing tool, access, or artifact. Do not waive it silently.
When the caller requires a diff check and no relevant UI or rendered-output change exists, record:
txtWalkthrough: N/A — no UI or rendered-output change in this packet.
For a diff-gated workflow, capture the baseline before the first file mutation, including plan creation:
bashnode .agents/skills/walkthrough/scripts/diff-baseline.mjs capture \ --output tmp/walkthrough/<slug>/baseline.json
At closeout, compare the final checkout with that baseline:
bashnode .agents/skills/walkthrough/scripts/diff-baseline.mjs compare \ --baseline tmp/walkthrough/<slug>/baseline.json \ --output tmp/walkthrough/<slug>/diff-receipt.json
Use producedFileDiff for the file-diff gate. Use changedPaths and the final diff to decide whether UI or rendered output changed. The receipt detects committed clean-tree changes, tracked working changes, executable-bit changes, symlink changes, and untracked files without git status.
Keep receipts local. Do not publish file hashes. If an older packet has no baseline, reconstruct it from the recorded starting commit or base ref and the packet's changed-file ledger. Mark the receipt as reconstructed. New packets must capture the baseline before mutation. The helper excludes its own baseline and receipt paths from the comparison, but the output directory should still be ignored by the repo.
Read only what explains the completed result:
Reuse valid final-state screenshots. Do not rerun an expensive flow only to capture the same state.
Do not stop at a link or button that promises a result. Open the result and show the saved record, receipt, message, packet, or other final artifact. When a preview and its downloadable or readable artifact both exist, inspect both and fail the walkthrough if their material claims disagree. Report the contradiction instead of choosing the friendlier surface.
Use one to four frames. Each frame should explain one point:
Prefer the shortest sequence a non-developer can understand in under one minute. Do not turn every field or test into a callout.
For QA, product-owner, or end-to-end walkthroughs, keep one subject, one user goal, one decision scope, and one time context across the whole sequence. If a frame changes any of them, label it as a separate example instead of implying causality. A screen captured after an action is not proof that the action caused that state unless the identity and time boundary match.
For UI or rendered-output changes:
For an explicit walkthrough of non-UI work, render the real final source, diff, report, document, CLI result, or provider read-back. Never invent a product screen to make backend or workflow work look visual.
Prefer light mode when both themes are equally truthful. Keep the verified theme when the change concerns dark mode or switching would misrepresent the result.
Save originals and annotated copies under a repo-approved ignored directory. Default to:
txttmp/walkthrough/<slug>/
Use paired names:
txt01-<step>-original.png 01-<step>-annotated.png
Inspect each source image first. Use a deterministic local image editor, such as Sharp with SVG overlays, to add only:
Keep labels to one sentence. Use product language, not implementation terms. Keep the product screenshot untouched except for the thin outlines and number markers. Never place explanation text over the product.
When the walkthrough explains a change inside an existing product, use color alone to distinguish provenance:
work.
not say "already there" or "already existed" in the label.
Use one small two-color legend in the side rail. The legend is the only provenance text; never repeat NEW / CHANGED, existing context, or equivalent badges in notes. Classify the exact feature, not the whole screen. An existing page with a new row gets gray context and a blue outline on the row. Never mark the whole screen blue merely because the screenshot was captured after the work.
Match each side-rail note to its target with the same number and provenance color. Put the number marker just outside the target outline so it never covers product text. Use no arrows by default. Add one only when numbered outlines cannot disambiguate nearby targets, and make it touch the target outline edge. Keep outlines thin and product text readable.
Keep planned or unbuilt work out of completed-product screenshots. Name it in caption prose outside the image when it matters.
Do not use these colors for severity, status, success, or failure. Product colors remain product evidence. Annotation colors explain only whether the called-out behavior changed.
Never add, remove, rewrite, beautify, or simulate product content. Compare the annotated result with the original. If product text, values, layout, or state changed, discard it and regenerate. The original is proof. The annotation is explanation.
Never use generative image editing for walkthrough annotations. It can alter the product evidence instead of merely explaining it.
health data, or other repo-restricted content to an image tool.
product work.
Apply these rules to annotation labels, captions, and the final handoff:
verification, and remaining risk when they apply.
correct and safe.
Show every annotated image inline with an absolute local path. Give each image one short caption stating what to notice. Name the related test, browser, external, or source proof.
When a PR or tracker needs images, follow the owning repo's upload policy and replace local paths with hosted URLs there.
Close only when:
context, or label each discontinuity as a separate example;
control;
contradiction as a blocker;
numbered target outline;
the side rail;
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 28,729 | 15,195 | -47% | 1 | 1 | 0% | 3,783 | 2,355 | -38% | 0 | 0 | — |
case-02 | fail→fail | 12,167 | 5,832 | -52% | 1 | 1 | 0% | 1,053 | 2,329 | +121% | 0 | 0 | — |
case-03 | fail→fail | 117,660 | 15,059 | -87% | 1 | 1 | 0% | 8,223 | 2,369 | -71% | 0 | 0 | — |
case-04 | fail→pass | 13,150 | 2,545 | -81% | 1 | 1 | 0% | 1,477 | 2,530 | +71% | 0 | 0 | — |
case-05 | fail→pass | 19,372 | 7,049 | -64% | 1 | 1 | 0% | 2,445 | 2,469 | +1% | 0 | 0 | — |
case-06 | fail→pass | 17,011 | 6,290 | -63% | 1 | 1 | 0% | 1,868 | 3,037 | +63% | 0 | 0 | — |
case-07 | fail→pass | 16,599 | 4,815 | -71% | 1 | 1 | 0% | 1,819 | 2,821 | +55% | 0 | 0 | — |
case-08 | pass→pass | 16,264 | 9,590 | -41% | 1 | 1 | 0% | 1,835 | 2,826 | +54% | 0 | 0 | — |
case-09 | pass→pass | 14,798 | 2,014 | -86% | 1 | 1 | 0% | 1,612 | 2,382 | +48% | 0 | 0 | — |
case-10 | fail→fail | 16,035 | 10,936 | -32% | 1 | 1 | 0% | 1,805 | 3,052 | +69% | 0 | 0 | — |
case-11 | fail→pass | 19,979 | 11,271 | -44% | 1 | 1 | 0% | 2,336 | 3,019 | +29% | 0 | 0 | — |
case-12 | fail→pass | 18,428 | 12,182 | -34% | 1 | 1 | 0% | 2,139 | 3,447 | +61% | 0 | 0 | — |
case-13 | pass→pass | 14,338 | 8,333 | -42% | 1 | 1 | 0% | 1,486 | 2,664 | +79% | 0 | 0 | — |
case-14 | fail→pass | 14,465 | 7,894 | -45% | 1 | 1 | 0% | 1,598 | 2,470 | +55% | 0 | 0 | — |
case-15 | fail→pass | 10,171 | 8,755 | -14% | 1 | 1 | 0% | 1,836 | 2,746 | +50% | 0 | 0 | — |
case-16 | pass→pass | 12,672 | 8,458 | -33% | 1 | 1 | 0% | 1,344 | 2,719 | +102% | 0 | 0 | — |
case-17 | pass→pass | 19,367 | 6,985 | -64% | 1 | 1 | 0% | 2,212 | 2,942 | +33% | 0 | 0 | — |
case-18 | fail→pass | 13,392 | 9,655 | -28% | 1 | 1 | 0% | 1,472 | 2,817 | +91% | 0 | 0 | — |
case-19 | pass→pass | 16,016 | 3,045 | -81% | 1 | 1 | 0% | 1,404 | 2,571 | +83% | 0 | 0 | — |
case-20 | fail→pass | 10,885 | 10,627 | -2% | 1 | 1 | 0% | 1,541 | 2,835 | +84% | 0 | 0 | — |
case-21 | pass→pass | 12,595 | 6,374 | -49% | 1 | 1 | 0% | 1,242 | 2,900 | +133% | 0 | 0 | — |
case-22 | pass→pass | 10,947 | 20,721 | +89% | 1 | 1 | 0% | 1,151 | 3,571 | +210% | 0 | 0 | — |
case-23 | pass→fail | 9,344 | 16,906 | +81% | 1 | 1 | 0% | 789 | 2,348 | +198% | 0 | 0 | — |
case-24 | pass→pass | 16,840 | 30,191 | +79% | 1 | 1 | 0% | 3,993 | 7,078 | +77% | 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, and 20 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 +38 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.