.agents/skills/harness-verify/SKILL.md
Phase skill: start the app on an isolated per-task environment and verify the deliverable works — browser checks via Claude in Chrome for UI, HTTP calls for API
npx skillsauth add cowcow02/agentfleet harness-verifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Prove the deliverable works by running the system and checking actual behavior. Verify by proof, not by reading code.
Parallel-safe: every task runs on isolated ports and an isolated database, derived from the task ID, so multiple agents can verify in parallel without colliding.
Derive a 2-digit slot from the task ID (last two digits, zero-padded):
AGE-6 → slot 06AGE-23 → slot 23AGE-105 → slot 0500 (sequential single-runner)From the slot, derive:
| Resource | Pattern | Example (AGE-6) |
| ---------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- |
| API port | 99XX | 9906 |
| Web port | 30XX | 3006 |
| Postgres DB name | agentfleet_age_XX | agentfleet_age_06 |
| DATABASE_URL | postgres://agentfleet:agentfleet@localhost:5432/agentfleet_age_XX | postgres://agentfleet:agentfleet@localhost:5432/agentfleet_age_06 |
The shared docker compose Postgres on port 5432 is reused (one Postgres, many DBs).
Collision note: AGE-6 and AGE-106 share slot
06. Rare in practice — if you spot a collision, surface it; don't silently overwrite.
Compute the per-task slot from the task ID and store the derived values in the state file under outputs.verify.env:
{
"slot": "06",
"api_port": 9906,
"web_port": 3006,
"db_name": "agentfleet_age_06",
"database_url": "postgres://agentfleet:agentfleet@localhost:5432/agentfleet_age_06"
}
Start shared Postgres (idempotent — reuses an existing container):
docker compose up -d
Wait until docker compose exec -T postgres pg_isready -U agentfleet returns ready.
Create the per-task database (idempotent):
docker compose exec -T postgres psql -U agentfleet -d postgres -c \
"CREATE DATABASE agentfleet_age_06" 2>/dev/null || true
Replace 06 with the actual slot. The || true swallows the "already exists" error on retries.
Run DB migrations against the per-task DB:
DATABASE_URL="postgres://agentfleet:agentfleet@localhost:5432/agentfleet_age_06" \
pnpm --filter @agentfleet/db drizzle-kit migrate
Start dev servers with isolated env:
# API on isolated port + isolated DB + CORS pointed at isolated web port
PORT=9906 \
DATABASE_URL="postgres://agentfleet:agentfleet@localhost:5432/agentfleet_age_06" \
WEB_URL="http://localhost:3006" \
pnpm --filter @agentfleet/api dev &
# Web on isolated port + proxy pointed at isolated API port
PORT=3006 \
NEXT_PUBLIC_API_URL="http://localhost:9906" \
pnpm --filter web dev &
Capture both background PIDs so you can shut them down later. Wait for both servers to be ready (poll the port or hit /health with curl).
Verify the deliverable against the isolated environment:
For API changes:
http://localhost:<api_port> (e.g. http://localhost:9906)For UI changes:
mcp__claude-in-chrome__*)http://localhost:<web_port> (e.g. http://localhost:3006)For both:
Build check (uses default config, no isolation needed):
pnpm turbo build
Production build must succeed.
Tear down isolated environment:
# Kill the dev server PIDs you captured in step 5
kill <api_pid> <web_pid> 2>/dev/null || true
# Drop the per-task database to free space and avoid stale state
docker compose exec -T postgres psql -U agentfleet -d postgres -c \
"DROP DATABASE IF EXISTS agentfleet_age_06"
Leave the shared docker compose Postgres running — other agents may still need it.
Record to conversation file:
Insert before the ## Harness Issues marker in .harness/conversations/<task-id>.md (use Edit tool with ## Harness Issues as the anchor — do NOT literally append, that would land below the issues section):
## Verify
**Slot:** 06 (api=9906, web=3006, db=agentfleet_age_06)
**API checks:** <results>
**UI checks:** <results>
**Build:** pass/fail
**Evidence:** <screenshot paths or response summaries>
If you hit friction (port still in use after kill, DB drop blocked, dev server crash, slot collision), append an entry to the literal end of the file — it will land inside the ## Harness Issues section since that section is last.
testing
Launcher — pick up a Linear ticket or task description and drive it through the full phased workflow (pickup → understand → plan → implement → quality → verify → ship).
development
Phase skill: explore the codebase to understand what needs to change for the ticket
testing
Phase skill: commit changes, push branch, create a GitHub pull request, and watch CI to green
development
Discover your team's development lifecycle through a deep dive conversation, then generate a phased workflow tailored to how you actually work.