Produce visual PR evidence — a screenshot or video — whenever a change has on-screen impact. Tests are never a substitute; a change can be backend by cause and visible by effect. Capture via the project's e2e harness on a pu box, or by driving a live kolu with the chrome-devtools MCP; host on a GitHub release and post a `## Evidence` comment. Triggers on "post evidence", "screenshot the change", "record a video of this", "show it working", "prove it", or finishing any change whose effect is v...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add juspay/kolu --skill evidence --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Evidence?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/juspay-evidence-kolu)More formats (shields.io, HTML) on the badges page.
---
name: evidence
description: >-
Produce visual PR evidence — a screenshot or video — whenever a change has
on-screen impact. Tests are never a substitute; a change can be backend by
cause and visible by effect. Capture via the project's e2e harness on a pu
box, or by driving a live kolu with the chrome-devtools MCP; host on a GitHub
release and post a `## Evidence` comment. Triggers on "post evidence",
"screenshot the change", "record a video of this", "show it working", "prove
it", or finishing any change whose effect is visible on screen.
---
# evidence — PR screenshots & video
## The gate — answer this first
> If someone exercised what this change affects, would the screen look
> DIFFERENT — before vs. after?
- **YES → a visual artifact is mandatory.** Static (end-state, single moment,
before↔after) → **screenshot**. Motion (transition, flow, live update,
animation) → **video**. A value-over-time element — a running timer, live
counter, anything whose *job* is to change on its own — is motion: a frozen
clock and a live one are pixel-identical in one frame, so watch it tick.
A screenshot is a complete deliverable, not a runner-up to video.
- **NO → skip with one explicit PR line: `No visual impact: <why>.`** Silent
skips are not allowed; neither is manufacturing a tenuous pixel for a change
whose screen truly doesn't differ.
Excuses that don't hold (each was tried on a real PR and rejected):
- **"Backend change, no UI surface."** Backend by cause can be visible by
effect — trace the effect to the screen, not the cause to a layer.
- **"No scenario exercises it."** That decides *how* you capture, never
*whether*.
- **"It's a CLI/TUI — here's a transcript."** A terminal is an on-screen
surface, and a pasted transcript is not a visual artifact. Record the real
binary with vhs/asciinema.
- **"The tests prove it."** Tests accompany the artifact, never replace it.
- **"I reconstructed the output — close enough."** A synthesized artifact
(formatter output posted as a recording, mocked data, a stub's clip) is a
fabrication, and it hides the very bug evidence exists to expose. The
artifact comes from really executing the change end-to-end against real
data — and read the real output to confirm the feature works before posting.
## Capture
Runs on an ephemeral **pu box** (see the pu skill), never locally, so evidence
reflects a clean CI-like build of the PR's commit.
**Prefer the existing Cucumber + Playwright e2e harness** — `KOLU_EVIDENCE=1`
turns on video recording (see `packages/tests/support/hooks.ts`) and you select
a scenario by name. It's the default because the clip comes from the same code
CI runs. The one thing to avoid building is a *parallel capture harness* that
duplicates the step library; everything else is fair game when the harness
can't reach the state: pull a still from a recorded clip, drive a live kolu
with the chrome-devtools MCP and `take_screenshot`, `vhs` for a TUI, ordinary
shell setup for on-disk preconditions. Never skip for lack of a canned path.
**Delegate capture to a subagent** so the main context stays clear: brief it
with the box, branch, image-or-video, the scenario or live state, a `<slug>`,
the PR number, and the release tag; it returns the markdown it posted.
Commands, harness details, transcode settings, and vhs gotchas:
**[CAPTURE.md](CAPTURE.md)**.
## Host & post
- **`evidence-assets` is the one fixed release tag.** It already exists; verify
it does, never create another, never derive a tag from the PR number.
- **The local filename IS the asset name** — copy back as `/tmp/<slug>.png`,
not a decorated name, or every `…/download/evidence-assets/<slug>.png` embed
404s.
- GIF embeds inline (keep under GitHub's ~10 MB limit); MP4 links via the
shared player (`juspay.github.io/video-evidence`). PNG embeds like a GIF.
- Use a single-quoted heredoc when posting so backticks and `$` survive.
- **Tear the box down** when finished: `pu destroy "$host"`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!