Web: Walkthrough
The sign-off walkthrough: discover every open state, plan every route on every intended device, capture through asset-shot under the capture naming rule, gate the results and record what failed
SKILL.mdskills/web-walkthrough/SKILL.md
GitHubThe sign-off walkthrough
Load web-conventions and asset-conventions first. Scripts: ~/.claude/library/scripts/web/open-states.ts (Node, Playwright) and walkthrough-plan.py; capture runs through asset-shot.
Step 1: Inputs
- Routes: slug to path, from the inventory (scope document §4 or the review's inventory table), else per
asset-conventionsdetection. A route with a parameter takes the sample value the inventory names. - Devices: from the scope document §2 or
$ARGUMENTS. Names map to widths: phone 390, tablet 834, desktop 1440, unless the scope gives widths; a scope that gives only widths uses them as the prefix. One device means no prefix. - Base: a served origin (start the dev server as
asset-shotStep 1 does) or a directory of HTML. - Planned open states: from the inventory's open-states column, as
[{route, specifier, javascript}]in a scratch file.
Say all four back in one table before running anything.
Step 2: Discover
cd ~/.claude/library/scripts/web && node --experimental-strip-types open-states.ts --base <base> --routes '<json>' --devices '<json>' --out <scratch>/states.json
Every details, aria-expanded="false", aria-haspopup and hidden aria-controls target becomes a state with the JS that opens it. Each state also carries toolbarMoved: the controls of the toolbar the trigger sits in (or any toolbar above it) whose position changed when it opened. That is principle 4's test.
Step 3: Plan
python3 ~/.claude/library/scripts/web/walkthrough-plan.py --base <base> --routes '<json>' --devices '<json>' --states <scratch>/states.json --planned <scratch>/planned.json --out docs/assets/walkthrough.yml --json
Show the YAML and the unplanned states (discovered, not in the inventory) and stop for approval, per asset-conventions. An unplanned state is a gap in the inventory: add it there or say why it is not a state worth capturing.
Step 4: Capture
Invoke asset-shot with docs/assets/walkthrough.yml no frame (a walkthrough is evidence, not a README mockup; add framing only when Jason asks). Captures land in docs/assets/walkthrough/ under the naming rule, apart from the README's docs/assets/shots/. Run the quality gate from asset-conventions on every PNG.
Step 5: Record
check.py coverage docs/assets/walkthrough --routes <slugs> --devices <names> --json: a missing capture is a finding under principle 8.- Every state with a non-empty
toolbarMovedis a finding under principle 4:wherethe route and the trigger's name, detail the controls that moved and by how much. - Every capture that failed the quality gate twice is an entry with
source: walkthrough, severitymajor, the file name inwhereDetail.
Write them to the store as web-check Step 4 does (live store or observations.py add), then re-export.
Step 6: Report
One table: route, device, captures, open states, findings. Then the paths written and the observations.py status line. Findings reopen the branch; a clean status is the end of the walkthrough.