---
title: "Verify it."
description: "Pass or fail on every check, with recordings."
---

> Documentation Index
> Fetch the complete documentation index at: https://peskills.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify it.

The skill drives the product in Playwright, records what happens, captures a still at
each checkpoint, and writes one JSON file; a script in the skill renders it into a report
that opens in your browser.

## Say this, get this

| You say | You get |
| --- | --- |
| "Verify the toolbar" | A feature run: one item, a recording with 3 to 6 checkpoints, one verdict |
| "Run the QA list against this PR" | A selective list run: the entries the change set can affect; the rest shown as not run, with a reason |
| "Release check, everything" | Every entry in `.product/qa-list.md`: pass, fail, flag, or skipped, each with evidence |
| "Seed a QA list" | A draft from the repo's routes, scripts, and pins, written to `.product/qa-list.md` for you to prune |

## Modes

| Mode | When |
| --- | --- |
| `feature` | "Verify this", "create a verification for X", or the last step after a build. The checks come from the change and the conversation: what was built, what the user said it must do, what it must not break. |
| `list` | "Run the QA list", "release check", "QA". The user's own markdown list, found under `.product/`; one report item per list entry, every entry present. |

A list run is selective or all, and the report says which. Selective when you name a
change set; all when you say "everything" or name none. Every entry from your list
appears in the report either way.

## Setup

| | |
| --- | --- |
| `required` | python3, for the validator and renderer (no packages) |
| `required` | Playwright with Chromium, for browser checks; without it they report skipped and code checks still run |
| `optional` | ffmpeg, to convert recordings to mp4; otherwise the report plays webm |
| `convention` | a QA list in `.product/`; other locations are remembered in `~/.product-engineering/memories.md` |

```sh
npx playwright install chromium
```

## What it produces

One `report.json` in a temp folder, rendered to `report.html` beside it. Counts by status
up top, failures and flags first. Each browser item has a player with a checkpoint list,
narration per checkpoint, and hover previews on the progress bar; filters by status and
type, a search box, and a jump palette (`J`). Nothing is written to the repo.

A list run, rendered from a QA list of thirteen entries against one change set. Two fails
open on load; the pills filter by status, the chips by check type; `J` opens the jump
palette; the failed browser check has the recording with hover previews on the bar.

The same renderer on a feature run:
<a href="/examples/verify-report/report.html">the sample feature run</a>, one item with a
recording and five checkpoints. The JSON contract is in
[the report contract](/reference/report-contract).

## Handoffs

Fails: [pe-build](/skills/pe-build), with their evidence. Whether it looks right:
[pe-review](/skills/pe-review). Whether it matches the approved mock: pe-review,
fidelity mode. Documenting the behavior verified:
[pe-product-description](/skills/pe-product-description).

## Provenance

Authored in this repository: 3 references, 0 vendored files.  
Apache-2.0 · [skills/pe-verify](https://github.com/backnotprop/product-engineering/tree/main/skills/pe-verify)


Source: https://peskills.dev/skills/pe-verify/index.mdx
