---
name: Verify Wayfinder Maps
slug: wayfinder-maps-verifier
category: Quality
description: Build, launch, and drive the wayfinder-maps server with a headless browser to verify changes end-to-end. Suitable for validating map visualization, interactions, and cross-browser behavior.
github: "https://github.com/rengwu/wayfinder-maps/tree/main/.claude/skills/verify"
language: Go
stars: 59
forks: 1
install: "git clone https://github.com/rengwu/wayfinder-maps"
added: 2026-07-16T13:43:07.778Z
last_synced: 2026-07-18T04:41:45.191Z
canonical_url: "https://dirskills.com/skills/wayfinder-maps-verifier"
---

# Verify Wayfinder Maps

Build, launch, and drive the wayfinder-maps server with a headless browser to verify changes end-to-end. Suitable for validating map visualization, interactions, and cross-browser behavior.

**Install:** `git clone https://github.com/rengwu/wayfinder-maps`

## README

# Verifying wayfinder-maps

## Build & fixture

```bash
go build -o /tmp/wayfinder-maps ./cmd/wayfinder-maps
```

There is no sample map in the repo. Create an effort dir with `map.md` +
`tickets/NN-slug.md`. Ticket format: YAML frontmatter (`type:`, `blocked_by: [01]`,
`claimed_by:`, `undermined_by: [NN]`) then `# Title`, `## Question`; a `## Answer`
section with prose = resolved, `## Ruled out` = out_of_scope. Map format: `# Name`,
`## Destination`, and fog under `## Not yet specified` as
`- **Title.** clears-with: NN`. Sanity-check the fixture with
`wayfinder-maps status <effort-dir>`.

## Launch

```bash
PORT=78xx /tmp/wayfinder-maps serve <effort-dir>   # pick a fresh port EVERY time
```

Gotcha: the user often has an instance (binary `wm`) already listening; a bind
failure only shows in the log while curl happily talks to the OLD server — check
the serve log says "serving", don't trust the port being answerable.

Dev mode: `WAYFINDER_DEV=cmd/wayfinder-maps/web` (path to web/ from cwd) serves
the frontend from disk with `Cache-Control: no-store` instead of the go:embed copy.

## Drive (GUI surface)

Playwright's cached headless shell works without a full playwright install:

```bash
cd <scratch> && npm i playwright-core
# executablePath: ~/Library/Caches/ms-playwright/chromium_headless_shell-*/chrome-headless-shell-mac-arm64/chrome-headless-shell
```

- Wait ~4s after goto: the constellation fades in over 2.2s (a plain
  `--screenshot --virtual-time-budget` capture shows HUD but NO stars — artifact,
  not a bug).
- App state is inside ES modules (not on window). To click a specific star, find
  it by pixel colour on the canvas (frontier glow is gold) — layout is
  deterministic (fixed PRNG seed), so positions repeat across runs.
- Live-reload probe: append `## Answer\ntext` to a ticket while the map is open;
  the 1.5s poller updates the HUD counts in ~2-3s.
- Recents on the splash come from the user's real config — don't dismiss entries.

Flows worth driving: map render (all statuses + fog + edges), click star → panel
markdown, `data-goto` cross-ticket link, Escape closes, wheel zoom (labels thin
out), back button → splash/maplist.

## WebKit

`npx playwright-core install webkit` (~77MB, cached in ms-playwright) then
`require("playwright-core").webkit.launch()` — no executablePath needed.
Covered headlessly: full map render, the label-alpha fade workaround (capture a
frame ~600ms into loadMap: labels must be dim WITH the stars, not opaque over
them), touch tap via a hasTouch context, wheel zoom, panel markdown.

NOT reachable headlessly — manual Safari checklist:
- Trackpad pinch zooms the map, not the page (gesture* events; Playwright's
  WebKit cannot construct GestureEvent, and Chromium never fires them).
- Touch pan/pinch on a real iOS device or simulator.
