Agent skill

Verify Setup

by opslane in opslane/verify

One-time setup for /verify and /break. An agent skill from opslane/verify.

MITAuto-check: notes

Install Verify Setup

skills CLI
$ npx skills add opslane/verify --skill verify-setup -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install opslane/verify verify-setup --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/opslane/verify.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/verify-setup .claude/skills/verify-setup && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
verify-setup
GitHub stars
115
Token cost
~3.1k tokens
SKILL.md length
1,344 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

One-time setup for /verify and /break. An agent skill from opslane/verify.

  • Works in 7 steps: Ignore rules → Sniff the repo → Confirm, one question per unknown → …
  • SKILL.md covers 1. Ignore rules, Write the recipe, not the…, 2. Sniff the repo and 3. Confirm, one question per…, plus 4 more sections
  • Calls jq, bash and npx; needs ANTHROPIC_API_KEY and OPENAI_API_KEY

What it does

Verify Setup is an agent skill from opslane/verify. One-time setup for /verify and /break. Sniffs the repo, confirms boot/seed/health with you, writes .verify/setup.json, captures auth if the app needs login, and builds .verify/profile.json, a model of how the app runs.

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: Verification Skill for Claude Code. The licence is MIT.

Example prompts

  • “/verify-setup”

Requirements

  • Node.js
  • Docker
  • A credential in ANTHROPIC_API_KEY
  • A credential in OPENAI_API_KEY

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Ignore rules
  2. Sniff the repo
  3. Confirm, one question per unknown
  4. Write the contract
  5. Capture authentication, if needed
  6. Share with your worktrees
  7. Build the app profile

What it can do on your machine

Read from SKILL.md and the folder at commit 25dc3a9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • jq
    • bash
    • npx
    • git
    • docker
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npx, git, docker and curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • ANTHROPIC_API_KEY
    • OPENAI_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Verify Setup loads about 3.1k tokens when it runs. Until then it costs about 58 tokens; SKILL.md has 1,344 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~58
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:16
    repo's own local `.env` files, chosen by the user. If a user pastes a secret,

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from opslane/verify at commit 25dc3a9, republished under its MIT licence (© opslane). 1,344 words, ~3,091 tokens.

Download SKILL.mdSave it as .claude/skills/verify-setup/SKILL.md (or your agent's skills folder).
name
verify-setup
description
One-time setup for /verify and /break. Sniffs the repo, confirms boot/seed/health with you, writes .verify/setup.json, captures auth if the app needs login, and builds .verify/profile.json, a model of how the app runs.

/verify-setup

Run once per repo. Later /verify runs read .verify/setup.json and ask nothing.

Hard rule: never ask for or store passwords, API keys, or connection strings. The one exception is captured browser session state (.verify/auth.json, written by the auth step below): it holds reusable cookies for the app under test, is gitignored, and deleting the file revokes it. Treat it like a logged-in browser profile, not a secret store. No production connection strings, no cloud keys. The most this file may reference is one of the repo's own local .env files, chosen by the user. If a user pastes a secret, refuse to write it and tell them to keep it in their environment.

1. Ignore rules

bash
grep -qxF ".verify/" .gitignore 2>/dev/null || echo ".verify/" >> .gitignore

.verify/setup.json is the one file meant to be shared. After writing it, offer: "Commit .verify/setup.json so your team skips this interview? (y/n)" — on yes, git add -f .verify/setup.json and commit it.

Write the recipe, not the resolved values

The contract must work in every checkout and worktree of the repo, or the interview repeats forever. Two rules:

  • Ports and hosts go through environment variables. When the repo documents per-worktree port variables (an AGENTS.md export block, a .env.example), write http://localhost:${INGESTION_PORT:-8082} — the repo's own variable name with the repo's default — never the number the current worktree happens to use. URL fields (base_url, health_url) support exactly ${VAR} and ${VAR:-default} — no nesting, no command substitution — expanded identically by the scripts and the engine at run time. Probes and boot are shell programs and expand everything the shell does, for free.

  • Nothing run-scoped. A probe that names a specific run's container (verify-20260901-042757-worker-1) is dead the moment that run ends. Key probes to the compose service via the current run's project instead:

    docker ps --filter "label=com.docker.compose.project=$(jq -r .project .verify/run-env.json)" \
      --filter "label=com.docker.compose.service=worker" --format '{{.State}}' | grep -q running

Before offering the commit, re-read the drafted contract and reject your own draft if any field contains a resolved port number that has a documented variable, or any name containing a run id.

2. Sniff the repo

bash
VERIFY_SCRIPTS="${VERIFY_SCRIPTS:-$CLAUDE_PLUGIN_ROOT/scripts}"
bash "$VERIFY_SCRIPTS/sniff.sh" > /tmp/verify-sniff.json
cat /tmp/verify-sniff.json

3. Confirm, one question per unknown

Use AskUserQuestion. Every option must come from the sniff output; the user corrects rather than authors. A single unambiguous candidate is taken silently and shown in the final summary.

  • Boot: options = each .boot[] candidate (label with its cmd), plus "it's already running (breaks isolation — not recommended)" which selects "mode": "external". The chosen candidate's mode and compose_file are copied into the contract — never mix a process boot with a compose teardown. For "process" mode, health_url is required — do not write the contract until the user supplies the URL to poll. For "compose" mode, write teardown: "docker compose -f <file> down -v" — a throwaway stack that keeps its volumes is not throwaway.
  • Seed: options = .seed[], plus "no seeding" and "I have a data file to load" (if chosen, ask for the path and put it in seed_data_files; it is a plain file the user produced themselves — how they made it is outside verify).
  • Env file: options = .env_files[], plus "none". The chosen file is sourced by the environment manager before boot, seeds, and probes.
  • Base URL: default http://localhost:3000, or the value in the env file if it names one.
  • How do API requests authenticate? A) a header whose value lives in an env var — name the header (for example, X-API-Key) and the env var name; or B) no auth. The value itself is never written anywhere: the contract stores only the header name and the env var name.
  • Probes: for each of worker, sink, storage, ask "is there a one-line command that proves your <part> is alive? (leave blank to skip)". Explain: a part with no probe still runs its criteria, but a failure on it will be reported as possibly environmental rather than blamed on the change. (api, browser, and db have built-in probes; don't ask about them.)

If .has_stack is false: plain-command mode. Write the contract with "mode": "none" and empty boot/teardown/health, and say: "No runnable stack found; /verify will run criteria as plain commands."

4. Write the contract

Write .verify/setup.json. The shape (this example is load-bearing — a test parses it):

json
{
  "mode": "compose",
  "compose_file": "compose.yaml",
  "boot": "docker compose -f compose.yaml up -d --wait",
  "teardown": "docker compose -f compose.yaml down -v",
  "seed": ["scripts/seed-e2e.sql"],
  "seed_data_files": [],
  "health_url": "",
  "base_url": "http://localhost:${APP_PORT:-3000}",
  "auth": {"header": "", "value_env": ""},
  "env_file": ".env.example",
  "observe": {"db_url_env": "DATABASE_URL"},
  "probes": {"worker": "", "sink": "", "storage": ""}
}

Valid modes: "compose", "process" (health_url required), "external", "none".

Show the written file and the summary of silently-taken single candidates.

5. Capture authentication, if needed

Keep authentication as Playwright storage state. It contains no password entry flow or credential capture by Verify; the user logs in directly in the browser.

Check whether the selected base URL is running:

bash
VERIFY_SCRIPTS="${VERIFY_SCRIPTS:-$CLAUDE_PLUGIN_ROOT/scripts}"
BASE_URL=$(jq -r '.base_url' .verify/setup.json | bash "$VERIFY_SCRIPTS/expand.sh" --load-env .verify/setup.json)
curl -sf "$BASE_URL" > /dev/null 2>&1 || echo "⚠ Dev server not running at $BASE_URL. Start it before logging in."

If the app requires login, open Playwright codegen and let the user authenticate:

bash
VERIFY_SCRIPTS="${VERIFY_SCRIPTS:-$CLAUDE_PLUGIN_ROOT/scripts}"
BASE_URL=$(jq -r '.base_url' .verify/setup.json | bash "$VERIFY_SCRIPTS/expand.sh" --load-env .verify/setup.json)
mkdir -p .verify
echo "A browser will open. Log in, then close the browser window."
npx playwright codegen --save-storage=.verify/auth.json "$BASE_URL"
chmod 600 .verify/auth.json

Verify the capture:

bash
if [ -f .verify/auth.json ] && [ -s .verify/auth.json ]; then
  COOKIE_COUNT=$(jq '.cookies | length' .verify/auth.json 2>/dev/null || echo 0)
  echo "✓ Auth state captured: $COOKIE_COUNT cookies"
else
  echo "✗ auth.json is empty. Log in when the browser opens, then close it."
  exit 1
fi

6. Share with your worktrees

A git worktree gets the committed contract for free but not the gitignored files. Push them to the per-repo shared store so every worktree inherits them:

bash
VERIFY_SCRIPTS="${VERIFY_SCRIPTS:-$CLAUDE_PLUGIN_ROOT/scripts}"
bash "$VERIFY_SCRIPTS/shared-store.sh" push

This copies .verify/auth.json and the chosen env file to ~/.verify/<repo-slug>/ (permissions 700/600). Tell the user: deleting that folder stops NEW worktrees inheriting the login; copies already pulled into worktrees remain until their .verify/ is deleted. Run push again whenever auth is recaptured or the env file changes.

Show full SKILL.md (527 more words)Show less

7. Build the app profile

/break attacks a change on a local copy of the app. To pick attacks that match how the app really runs, it reads a profile of the app: what runs in the background, which tables have statuses and what moves them, which outside services it calls, which settings change behaviour when empty, and what sits in front of it in production.

Always build it; it is part of setup, not a question for the user. Build it from the code alone: read the repo, do not boot anything, use no network. It takes a few minutes. If it fails, say so in the summary and finish setup anyway: /break works without it.

Fill exactly this shape and write it to .verify/profile.json (this example is load-bearing: a test checks it against the engine's validator):

json
{
  "version": 1,
  "services": [
    {"name": "api", "kind": "api", "run": "compose service api", "source": "compose.yaml:3"}
  ],
  "actors": [
    {"name": "job-reaper", "kind": "reaper", "service": "worker", "interval_s": 60,
     "interval_env": "REAPER_INTERVAL_MS", "touches": ["jobs"], "source": "worker/src/index.ts:191"}
  ],
  "entities": [
    {"table": "jobs", "status_field": "status", "statuses": ["pending", "claimed", "completed", "dead_letter"],
     "transitions": [
       {"from": "claimed", "to": "pending", "by": "job-reaper", "source": "worker/src/db.ts:1323"},
       {"from": "any", "to": "pending", "by": "request:POST /api/jobs", "source": "api/handler/jobs.go:40"}
     ],
     "source": "migrations/001_jobs.sql:5"}
  ],
  "external": [
    {"name": "anthropic", "kind": "llm", "env": ["ANTHROPIC_API_KEY"], "stubbable": "yes",
     "stub_how": "ANTHROPIC_BASE_URL", "source": "worker/src/llm.ts:12"}
  ],
  "config": [
    {"name": "OPENAI_API_KEY", "default": null, "effect": "empty: no embeddings, duplicates are never merged",
     "source": ".env.example:20"}
  ],
  "edge": {"hops": ["cloudflare", "load_balancer"], "source": "answered by the user"}
}
  • services: every process, from compose files, Procfiles, package scripts or manifests. kind is one of api, worker, web, db, queue, storage, other.
  • actors: every loop, timer, scheduler, poller, reaper, sweeper, cron job, queue consumer, boot-time task and startup migration runner. kind is one of scheduler, poller, reaper, sweeper, consumer, boot_task, migration. touches lists the tables or queues it writes; /break uses it to find the actors that matter for a change.
  • entities: only tables with a status or state field. List the transitions you can find; by is an actor name, request:<METHOD /path>, or unknown.
  • external: every outside API or SDK. stubbable says whether a local stand-in can replace it and stub_how names the setting that points it elsewhere (or null).
  • config: only settings where an empty or default value changes behaviour, with the effect in one line. Never record a secret value.
  • edge: the chain in front of production, outermost first, each hop one of cloudflare, cdn, vercel, load_balancer, nginx_or_ingress, none, unknown. Detect it from deploy files and docs when you can.

Rules:

  • Every item cites source as path:line in this repo. No source, no item.
  • What the code does not show is "unknown", never a guess. Unknowns are fine: /break tests both ways when that is cheap.
  • Do not record which writes lack a guard, who else reads shared data, or how many replicas run. They are easy to get wrong from reading, so /break works them out fresh for each change.
  • Ask the user only when an unknown field would block a likely, valuable attack and their answer changes how it is tested. Use AskUserQuestion with the field's allowed values as the options, never an open question. In practice this is usually one question: confirm the edge chain. Decisions about how to test (whether to point a test tenant at a stub, for example) are yours to make, not questions for the user.
  • Record an answer as "source": "answered by the user".

Check it with the engine and fix every error it reports:

bash
VERIFY_PIPELINE="${VERIFY_PIPELINE:-$CLAUDE_PLUGIN_ROOT/pipeline}"
(cd "$VERIFY_PIPELINE" && npx --no-install tsx src/cli.ts profile-check --repo "$(pwd -P)")

Show the user a short summary: counts per section, the edge chain, and the few config settings with the biggest effect. Then offer: "Commit .verify/profile.json so your team and future runs share it? (y/n)". On yes, git add -f .verify/profile.json and commit it.

Finish with: ✓ Setup complete. Run /verify before your next PR.

© opslane, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/verify-setup of opslane/verify.

Open the folder on GitHubat commit 25dc3a9

Compare with similar skills

Verify Setup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Verify Setup compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Verify Setup this skillopslane/verify115—~3.1kAutomated safety check: NotesMIT
V5 Breaking Changesremotion-dev/remotion62k—~879Automated safety check: PassCustom licence
Breaking Changeshashicorp/terraform-provider-aws11k—~291Automated safety check: PassMPL-2.0
BreakJDArmy/BREAK3861 repos~2.2kAutomated safety check: NotesApache-2.0
What Breakssuboss87/FDEOps954—~337Automated safety check: PassMIT
Break AI Fix Loopssickn33/agentic-awesome-skills47k1 repos~3kAutomated safety check: PassMIT

Similar skills

  • V5 Breaking Changes

    remotion-dev/remotion

    Official

    Implement or review a Remotion 5 breaking change while the v4 and v5 release lines still share code.

    62k GitHub stars~879 tokensUpdated today
    Media & CreativeAuto-check passed
  • Breaking Changes

    hashicorp/terraform-provider-aws

    Official

    Review a PR for possible breaking changes. An agent skill from hashicorp/terraform-provider-aws.

    11k GitHub stars~291 tokensUpdated today
    DevOps & CloudAuto-check passed
  • Break

    JDArmy/BREAK

    BREAK 业务风险枚举与规避知识库 — 查询业务安全风险、规避手段、攻击工具、威胁行为者、行业术语和典型案例,或基于知识库回答业务安全问题

    386 GitHub starsUsed in 1 repo~2.2k tokens
    Auto-check: notes
  • What Breaks

    suboss87/FDEOps

    Assess the impact of a proposed change on dependencies and shared infrastructure.

    954 GitHub stars~337 tokensUpdated today
    Auto-check passed
  • Break AI Fix Loops

    sickn33/agentic-awesome-skills

    Stop ineffective AI coding repair loops with stable failure fingerprints, a three-attempt budget, real-path proof, negative controls, and tested rollback.

    47k GitHub starsUsed in 1 repo~3k tokens
    DevOps & CloudAuto-check passed
  • Break

    genex-games/genex-desktop

    Renders a component you choose in every state and scenario on a temporary page and stress tests it.

    418 GitHub starsUsed in 1 repo~1.7k tokens
    Testing & QAAuto-check passed

More from opslane/verify

  • Break

    opslane/verify

    Try to break a change the way the real world will - network faults, restarts, two things at once, users doing things out of order - on a disposable local stack, and report what broke with a…

    115 GitHub stars~6k tokensUpdated 9 days ago
    Auto-check passed
  • Verify

    opslane/verify

    Verify any change surface against approved acceptance criteria, run the real system, and preserve the report and test artifacts.

    115 GitHub stars~11k tokensUpdated 9 days ago
    Auto-check: notes

Questions about Verify Setup

What does Verify Setup do?

One-time setup for /verify and /break. An agent skill from opslane/verify. Verify Setup is an agent skill from opslane/verify. One-time setup for /verify and /break.

How do I install Verify Setup in Claude Code?

Run `npx skills add opslane/verify --skill verify-setup -a claude-code`. Or copy the skill folder (skills/verify-setup in opslane/verify) into .claude/skills/verify-setup in your project. Claude Code loads it when a task matches its description.

How do I install Verify Setup in Codex?

Run `npx skills add opslane/verify --skill verify-setup -a codex`. Or copy the skill folder (skills/verify-setup in opslane/verify) into .agents/skills/verify-setup in your project. Codex loads it when a task matches its description.

Can I use Verify Setup in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add opslane/verify --skill verify-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/verify-setup, .gemini/skills/verify-setup, .github/skills/verify-setup and .opencode/skills/verify-setup in your project.

What does Verify Setup need to run?

Going by SKILL.md and its folder, Verify Setup needs the command-line tools its instructions call (jq, bash, npx, git, docker and curl) and credentials named ANTHROPIC_API_KEY and OPENAI_API_KEY. Our summary lists: Node.js; Docker; A credential in ANTHROPIC_API_KEY; A credential in OPENAI_API_KEY.

Does Verify Setup access the network?

SKILL.md contains no URLs. Its commands use npx, git, docker and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Verify Setup safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Verify Setup use?

Verify Setup is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Verify Setup use?

About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Verify Setup?

Skills that share tags, products or a category with Verify Setup: V5 Breaking Changes (remotion-dev/remotion, 62k stars), Breaking Changes (hashicorp/terraform-provider-aws, 11k stars), Break (JDArmy/BREAK, 386 stars) and What Breaks (suboss87/FDEOps, 954 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Verify Setup?

opslane (a GitHub organization) maintains it in opslane/verify, which has 115 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 28, 2026.

Source: opslane/verify on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.