# Verify

> Build, run, and drive the claudelines app locally to verify changes end-to-end.

- Skill: `merit-systems/verify` (Agent Skill)
- Install (CLI): `npx skillmds@latest add merit-systems/verify`
- Raw SKILL.md: https://api.skillmd.com/api/skills/merit-systems/verify/raw
- Safety review: PASS (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: merit-systems (https://skillmd.com/u/merit-systems)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/merit-systems/verify

---


# Verifying claudelines locally

## Stack handle

- `pnpm dev --port 3456` — Next.js dev server. DB access goes through the
  Neon HTTP driver: `DATABASE_URL` (local Postgres in Docker on
  `localhost:5433`) + `NEON_HTTP_PROXY` (local-neon-http-proxy container on
  `localhost:4444/sql`). Both from `.env.local`.
- If API routes 500 with `Failed query …` on every DB endpoint, the proxy
  container is likely wedged (it returns `Control plane request failed` for
  even `select 1`, while direct `psql` on 5433 works). Workaround that
  avoids restarting Docker: run the ~50-line Neon-protocol shim over `pg`
  (POST `/sql`, raw-text types, honor the `Neon-Array-Mode` header) against
  5433 and start dev with `NEON_HTTP_PROXY=http://localhost:<shim>/sql`.
- Migrations: `drizzle-kit migrate` hangs locally (the neon driver can't
  reach a non-Neon Postgres). Apply by hand: `psql "$DATABASE_URL" -f
  drizzle/NNNN_*.sql`, then insert `(hash, created_at)` into
  `drizzle.__drizzle_migrations` — hash = sha256 of the SQL file,
  created_at = the `when` from `drizzle/meta/_journal.json`. Recent
  migrations are hand-written SQL + hand-edited journal (snapshots stopped
  at 0010). Beware `0016_wipe_data.sql` truncates `statuslines`.

## Driving flows

- Public reads are plain curl: `/api/statuslines?q=`, `/api/statuslines/{slug}`,
  `/{slug}/script`, `/api/leaderboard`, site pages at `/statuslines/{slug}`.
- SIWX-signed routes (preview, archive, report, identity/connect): use the
  agentcash MCP `fetch` tool against `http://localhost:3456/...` — it signs
  automatically. The local agentcash wallet address (for seeding owned rows)
  is `address` in `~/.agentcash/wallet.json`.
- Paid routes (register, download, audit) charge real USDC even locally —
  prefer seeding rows straight into Postgres via psql for fixtures, and
  delete them after.

