browser-qa
Skill1 starsChanged 4 months agoMITView on GitHub
Use whenever the user asks to QA, test, verify, click through, dogfood, smoke-test, or regression-test a website/web app; check login, admin/authenticated flows, responsive UI, browser console/network errors; or validate a local dev server, Docker Compose stack, staging/production deployment, frontend URL, or API-backed UI. Mandatory orchestrator: discover and persist the project QA profile, deployment method, URLs, health checks, and credential sources before opening the browser. Never guess startup commands, URLs, accounts, or passwords.
- Reads credentials
24 other projects use a version of this.
Adopted by
Most recently taken up by
- Rojios/everything-claude-codetheir own version, first seen Nov 8, 2026
- agenticluke/browser-qa-plustheir own version, first seen Nov 8, 2026
- pankaj-mahaur/Agent-Daemontheir own version, first seen Nov 6, 2026
- angusfretwell/skillstheir own version, first seen Nov 4, 2026
- renepf/claude-skillstheir own version, first seen Oct 25, 2026
- davidanthonyn/claude-skillstheir own version, first seen Oct 20, 2026
Used with
Projects with it also use opensource-pipeline, security-bounty-hunter and 5 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
TironFoxSkillopensource-pipeline
Open-source pipeline: fork, sanitize, and package private projects for safe public release. Chains 3 agents (forker, sanitizer, packager). Triggers: '/opensource', 'open source this', 'make this public', 'prepare for open source'.
Also in 3 projects that use this
RojiosSkillsecurity-bounty-hunter
Hunt for exploitable, bounty-worthy security issues in repositories. Focuses on remotely reachable vulnerabilities that qualify for real reports instead of noisy local-only findings.
Also in 3 projects that use this
Exploration-labsSkilltoken-budget-advisor
Proactive token budget assessment and task chunking strategy. Use this skill when queries involve multiple large file uploads, requests for comprehensive multi-document analysis, complex multi-step workflows with heavy research (10+ tool calls), phrases like "complete analysis", "full audit", "thorough review", "deep dive", or tasks combining extensive research with large output artifacts. This skill helps assess token consumption risk early and recommend chunking strategies before beginning work.
Also in 3 projects that use this
ElasticSkillaccessibility
Accessibility guidance for Kibana. Use this skill when working with or reviewing EUI components, resolving a11y-related (@elastic/eui) ESLint issues, and ensuring proper use of ARIA attributes, focus management, keyboard interactions, and accessible naming conventions.
Also in 3 projects that use this
nilssonrSkillseo
Full SEO workflow for auditing pages and creating SEO-optimized content. Provides checklists with educational explanations aligned with Google Search Central documentation.
Also in 3 projects that use this
Microsoft AzureSkillgit-workflow
Squad branching model: dev-first workflow with insiders preview channel
Also in 3 projects that use this
Other versions24 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 24
- loulanyue/awesome-claude-notes★ 272same name
- Fmarzochi/EGC★ 61same name
- woxiangyangzhimao/skills★ 14same name
- gongyijie85/dsh-ecc★ 8same name
- zero-click/zero-ratchet★ 8same name
- AbdurRafay2004/handoff★ 4same name
- bhagyamudgal/skills★ 2same name
- quokkify/skills★ 2same name
- angusfretwell/skills★ 1same name
- cskwork/browser-qa★ 1same name
14 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
42 rules. 0 are common, 32 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 23 edited versions we read keep these.
32
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 19
Run browser QA only after proving what to deploy, where it is reachable, and how authentication is obtained.
- Distinctive: line 28
Hard rule: do not open the app or begin authenticated QA while deployment mode, target URL, or required credentials are unresolved.
- Distinctive: line 32
Use for any request that means:
- Distinctive: line 35
test login, admin, authenticated, checkout, form, navigation, modal, or responsive flows
- Distinctive: line 37
verify local dev, Docker Compose, preview, staging, or production deployment
- Distinctive: line 38
run browser regression after frontend/backend changes
- Distinctive: line 40
Do not use as the primary workflow for unit tests or for authoring a durable Playwright suite.
- Very specific: line 44
Before the first browser navigation, all applicable rows must be READY or explicitly N/A:
- Distinctive: line 57
If a required gate is unresolved:
- Distinctive: line 61
ask the user only for the irretrievable missing fact.
- Distinctive: line 66
Use these project-local files:
- Distinctive: line 75
Search for an existing profile in this order:
- Very specific: line 83
When no valid profile exists, discovery is incomplete until .browser-qa/profile.json has been written and read back successfully.
- Distinctive: line 85
After discovery, deployment verification, or corrected configuration, update the profile immediately so later QA runs do not repeat or …
- Distinctive: line 87
If the current tool/runtime cannot write project files, state that persistence is blocked and do not claim the environment has been saved.
- Very specific: line 98
Never place passwords, tokens, cookies, API keys, or production secrets in profile.json, logs, screenshots, commits, or reports.
- Distinctive: line 100
If the user explicitly wants local credential persistence:
- Very specific: line 103
add .browser-qa/env.local to .gitignore before writing a secret.
- Very specific: line 104
create .browser-qa/env.example containing names/placeholders only.
- Distinctive: line 105
never print secret values back in the final report.
- Distinctive: line 107
Do not create or store plaintext credentials without user authorization.
- Distinctive: line 111
Use at least this shape; add project-specific fields when useful:
- Distinctive: line 204
When multiple modes are available, prefer an already-running verified target, then the project's documented default.
- Distinctive: line 210
Update the profile only with verified URLs.
- Distinctive: line 214
Search for credential sources in this order:
- Distinctive: line 222
test fixtures or authentication setup commands
- Distinctive: line 226
Do not infer passwords from project names, usernames, or common defaults.
- Very specific: line 228
If a source is known but its value is unavailable, record the variable/source name in the profile and ask only for that missing value.
- Very specific: line 232
Write .browser-qa/profile.json, then read it back and verify:
- Distinctive: line 241
Only after this succeeds may browser execution begin.
- Distinctive: line 249
start/health commands still exist.
- Distinctive: line 263
Use unique synthetic test data and the least-privileged test account available.
- Very specific: line 265
Do not reset databases, reseed shared environments, run migrations, stop shared services, or execute docker compose down -v unless …
- Distinctive: line 269
Use a fresh browser context/profile for each environment unless the project profile explicitly points to an approved reusable storage state.
- Distinctive: line 283
Keep at least a report, failure screenshots, sanitized console/network excerpts, and tested route/viewport matrix.
- Very specific: line 304
Use only semantic public steps: navigate, role/name click, expect_url, and expect_visible.
- Distinctive: line 325
After the gate is ready:
- Distinctive: line 329
Check console errors and failed network requests after navigation and significant interactions.
- Very specific: line 331
If auth is required, resolve secrets privately and test login/logout/session behavior.
- Distinctive: line 333
Test important flows at a narrow viewport when the product supports general users.
- Distinctive: line 337
Prefer accessible role/name, labels, visible text, stable test IDs, then CSS selectors.
- Distinctive: line 355
Never report authenticated QA as passed when credentials were unavailable.
“Common” is measured: kept by at least 6 in 10 of the 23 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Browser QA Orchestrator
Overview
Run browser QA only after proving what to deploy, where it is reachable, and how authentication is obtained. The browser is the execution phase, not the discovery mechanism.
This skill has a hard readiness gate:
project discovery → persisted QA profile → deployment/health proof
→ credential resolution → browser execution → evidence/reportHard rule: do not open the app or begin authenticated QA while deployment mode, target URL, or required credentials are unresolved. Never invent defaults. Public-route QA may continue only when its target is independently verified; report authenticated routes as blocked.
When to Use
Use for any request that means:
- QA/test/verify/check/dogfood a website or web app
- test login, admin, authenticated, checkout, form, navigation, modal, or responsive flows
- inspect console errors, failed browser requests, blank pages, or UI/backend integration failures
- verify local dev, Docker Compose, preview, staging, or production deployment
- run browser regression after frontend/backend changes
Do not use as the primary workflow for unit tests or for authoring a durable Playwright suite; hand those off after exploratory QA establishes the correct environment.
Non-Negotiable Readiness Gate
Before the first browser navigation, all applicable rows must be READY or explicitly N/A:
| Gate | Required proof |
| Project root | Repository/project root identified |
| QA profile | .browser-qa/profile.json loaded or newly written |
| Deployment mode | One of local-dev, docker-compose, or deployed; supported by project evidence |
| Start command | Exact command from project docs/config, or N/A for an already deployed target |
| Target URL | Exact frontend URL, not an inferred port with no evidence |
| Health | URL and required services actually respond |
| Authentication | N/A, or login path plus resolvable credential source/session setup |
| Scope | Public/authenticated routes or critical flows identified |
If a required gate is unresolved:
- continue deterministic discovery;
- do not guess;
- ask the user only for the irretrievable missing fact;
- mark affected QA scope
BLOCKEDrather than pretending it was tested.
Project-Local Artifacts
Use these project-local files:
.browser-qa/
├── profile.json # required, non-secret QA contract
├── env.example # optional credential variable names/placeholders
└── env.local # optional secrets, local-only and gitignoredSearch for an existing profile in this order:
.browser-qa/profile.json.opencode/browser-qa.json.browser-qa.md(legacy; migrate useful facts into the JSON profile)
Persistence is mandatory
When no valid profile exists, discovery is incomplete until .browser-qa/profile.json has been written and read back successfully. Do not merely describe what should be saved.
After discovery, deployment verification, or corrected configuration, update the profile immediately so later QA runs do not repeat or forget the result. Preserve user-maintained notes and do not overwrite a valid profile with a generic template.
If the current tool/runtime cannot write project files, state that persistence is blocked and do not claim the environment has been saved.
Secret handling
profile.json stores references, never secret values. It may contain:
- environment variable names such as
QA_ADMIN_USERNAME - local secret file path such as
.browser-qa/env.local - setup command or documented seed account location
- login/session setup instructions that contain no secret
Never place passwords, tokens, cookies, API keys, or production secrets in profile.json, logs, screenshots, commits, or reports.
If the user explicitly wants local credential persistence:
- create/use
.browser-qa/env.local; - add
.browser-qa/env.localto.gitignorebefore writing a secret; - create
.browser-qa/env.examplecontaining names/placeholders only; - never print secret values back in the final report.
Do not create or store plaintext credentials without user authorization. Prefer existing environment variables or secret managers.
Required Profile Contract
Use at least this shape; add project-specific fields when useful:
{
"schema_version": 3,
"project_name": "example-app",
"project_root": ".",
"environment": "local",
"safety": {
"destructive_actions_allowed": false,
"read_only": true,
"test_data_prefix": "qa-"
},
"preferred_mode": "docker-compose",
"runtime": {
"working_directory": ".",
"cleanup_policy": "stop-started",
"start_commands": ["docker compose up -d"],
"stop_commands": ["docker compose down"],
"health_commands": ["docker compose ps"]
},
"services": [
{
"name": "web",
"kind": "frontend",
"url": "http://127.0.0.1:5173",
"health_path": "/",
"login_path": "/signin"
}
],
"auth": {
"required": true,
"strategy": "form",
"credential_sources": {
"username": {"type": "env", "name": "QA_ADMIN_USERNAME"},
"password": {"type": "env", "name": "QA_ADMIN_PASSWORD"}
},
"secret_file": ".browser-qa/env.local",
"seed_or_setup_command": null
},
"qa_paths": {
"public": ["/", "/signin"],
"authenticated": ["/dashboard"],
"admin": []
},
"readiness": {
"public": "ready",
"authenticated": "blocked",
"admin": "n/a"
},
"run_policy": {
"max_idempotent_retries": 1,
"evidence_root": ".browser-qa/runs"
},
"log_sources": {
"commands": ["docker compose logs --tail=200 web api"]
},
"discovery": {
"status": "ready",
"evidence": ["README.md", "compose.yaml", ".env.example"],
"last_discovered_at": "ISO-8601 timestamp",
"last_verified_at": "ISO-8601 timestamp"
},
"fingerprints": {},
"notes": []
}Use discovery.status values: ready, partial, or blocked. Add a scope-specific readiness map: public, authenticated, and admin each use ready, blocked, stale, or n/a. Public QA may begin only when readiness.public is ready; authentication/admin paths run only when that exact scope is ready. This permits a truthful public-only QA run while credentials are unavailable.
Discovery Workflow
1. Locate instructions and deployment evidence
Inspect, when present, in this order:
AGENTS.md,CLAUDE.md,.cursorrules, project-specific agent instructionsREADME*,docs/, setup/deployment/runbookspackage.json, lockfiles, workspace files, Makefile/Taskfilecompose.yaml,compose.yml,docker-compose*.yml, Dockerfiles.env.example,.env.sample, configuration schemas (do not expose.envsecrets)- framework configs (
vite,next,nuxt,angular, proxies/base URLs) - CI/CD and deployment manifests when testing a deployed environment
- seed scripts, fixtures, migrations, test users, auth docs
Record the exact evidence that supports each profile value. A plausible command or common port is not evidence.
2. Choose deployment mode from evidence
- deployed: user supplied a URL or project deployment metadata identifies the intended environment.
- docker-compose: compose config is documented as the normal integrated-app path and exposes the required frontend/services.
- local-dev: package/task scripts document the intended dev workflow and dependencies are available.
When multiple modes are available, prefer an already-running verified target, then the project's documented default. Do not start both. If modes imply materially different data/auth behavior and intent is unclear, ask the user.
3. Resolve URL and health checks
Derive URLs from explicit config, compose port mappings, runtime output, or project docs. Start services only with the discovered command. Then prove readiness using service status plus HTTP checks; a running process/container alone is insufficient.
Update the profile only with verified URLs. If startup fails, inspect logs and fix/return the blocker before browser QA.
4. Resolve authentication before authenticated QA
Search for credential sources in this order:
A credential reference is not resolved merely because an environment-variable name or file path is present. Before authenticated QA, verify the referenced environment variable exists, the authorized secret file is readable, or the user-provided source is explicitly marked resolved for this run. Never print its value.
- already-exported QA/test environment variables named by the project
.browser-qa/env.local(load without printing)- documented development/test accounts
- seed/bootstrap scripts and their documented output
- test fixtures or authentication setup commands
- an existing reusable browser storage state/session
- user-provided credentials
Do not infer passwords from project names, usernames, or common defaults. Do not reset/create accounts unless the user authorized that side effect.
If a source is known but its value is unavailable, record the variable/source name in the profile and ask only for that missing value. Continue verified public QA if useful; authenticated scope remains BLOCKED.
5. Persist and validate
Write .browser-qa/profile.json, then read it back and verify:
- required fields are populated;
- commands and URLs match discovered evidence;
- credential entries are references, not values;
discovery.statusreflects actual readiness;- secret files are gitignored;
- profile secrets have not leaked into Git status/diff.
Only after this succeeds may browser execution begin.
Reuse and Staleness
On later runs, load the profile before broad repository discovery. Revalidate only what can drift:
- project root still matches;
- target URL responds;
- start/health commands still exist;
- credential source is resolvable without revealing it;
- fingerprints for deployment/auth source files have not changed.
Refresh discovery when the profile is missing, partial/blocked, URLs fail, relevant fingerprints change, or the user requests another environment. Update last_verified_at after successful checks.
Safety and Environment Policy
Classify the target before actions:
local,dev,test,preview: normal QA actions are allowed within user scope.staging: avoid destructive workflows unless explicitly included.production: requiresafety.read_only: trueand default to read-only smoke checks. Do not submit purchases, send messages, delete/update data, create real accounts, trigger billing, upload sensitive files, or run load tests without explicit authorization.
Use unique synthetic test data and the least-privileged test account available. Never reuse a production administrator when a QA role exists. Redact personal data, secrets, cookies, authorization headers, and tokens from screenshots, browser/network dumps, logs, and reports.
Do not reset databases, reseed shared environments, run migrations, stop shared services, or execute docker compose down -v unless explicitly authorized. Track every process/container started by QA and clean up only resources created by this run. Respect a profile field such as runtime.cleanup_policy (leave-running, stop-started, or project-command).
Run Isolation and Evidence
Use a fresh browser context/profile for each environment unless the project profile explicitly points to an approved reusable storage state. Never mix local, staging, and production cookies. Clear or close temporary browser state after the run.
Assign a run ID and create .browser-qa/runs/<run-id>/manifest.json before browser actions when filesystem access is available:
node browser-qa/scripts/create-run-manifest.mjs --profile .browser-qa/profile.jsonThe manifest is the execution contract: it records profile hash, environment, target URLs, scope readiness, viewport matrix, results, evidence, retries, and cleanup. Validate it before reporting completion:
node browser-qa/scripts/validate-run-manifest.mjs --manifest .browser-qa/runs/<run-id>/manifest.jsonKeep at least a report, failure screenshots, sanitized console/network excerpts, and tested route/viewport matrix.
For every failure, capture route, viewport, exact steps, expected result, actual result, and supporting evidence. The default retry budget is one retry and only for idempotent actions. Never retry purchase, create, delete, update, submit, send, or other non-idempotent actions automatically. A retry may classify a symptom as FLAKY, but must not erase the first failure; two different outcomes are reported as FLAKY, not ordinary PASS.
Learning Loop: Explore → Verify → Generate
The QA system becomes more useful only when it turns verified observations into reusable, safe artifacts. Do not treat an arbitrary browser transcript as a regression test.
Store learned public flows under .browser-qa/flows/<flow-id>.json. A flow has these states:
candidate → verified → stable → generated
↘ stale → candidate (after rediscovery)- Candidate: extract a successful, cleaned-up public run with structured
manifest.results[].steps. - Verified: at least two successful observations.
- Stable: at least three successful observations with the same semantic step signature and no fallback selectors.
- Generated: compile only a stable public flow to a Playwright candidate; review it before it enters CI.
- Stale: a failed replay, changed flow signature, changed target/profile, or confirmed route/API/UI change invalidates the flow. Do not keep replaying stale scripts; return to exploratory QA.
Use only semantic public steps: navigate, role/name click, expect_url, and expect_visible. Do not automatically learn or generate authentication, admin, payment, send, create, delete, update, upload, or other side-effecting flows.
# Extract a candidate from a completed QA run
node browser-qa/scripts/learn-flow.mjs --manifest .browser-qa/runs/<run-id>/manifest.json --flow .browser-qa/flows/public-nav.json --id public-nav
# After additional independent successful runs, promote it
node browser-qa/scripts/promote-flow.mjs --flow .browser-qa/flows/public-nav.json
node browser-qa/scripts/validate-flow.mjs --flow .browser-qa/flows/public-nav.json
# Stable public flows may generate a review-required Playwright candidate
node browser-qa/scripts/generate-playwright.mjs --flow .browser-qa/flows/public-nav.json --output .browser-qa/generated/public-nav.spec.ts
# If replay fails because the app changed, invalidate rather than blindly retry
node browser-qa/scripts/invalidate-stale-flow.mjs --flow .browser-qa/flows/public-nav.json --reason "navigation route changed"Generated tests require QA_BASE_URL, are public/read-only by design, and must be reviewed before committing or enabling CI.
Browser Execution
After the gate is ready:
- Open the verified primary frontend URL.
- Confirm rendered content, not only HTTP 200.
- Check console errors and failed network requests after navigation and significant interactions.
- Exercise the profile's critical public routes.
- If auth is required, resolve secrets privately and test login/logout/session behavior.
- Exercise authenticated/admin paths, navigation, forms, validation, dialogs, lists/tables, and error states in scope.
- Test important flows at a narrow viewport when the product supports general users.
- Correlate silent UI failures with frontend/backend logs.
- Capture reproducible evidence for each defect.
Prefer accessible role/name, labels, visible text, stable test IDs, then CSS selectors. Prefer observable readiness (URL, network, element state) over fixed sleeps.
Reporting
Lead with the verdict. Include:
- environment and exact verified URL (without secrets)
- deployment mode and health proof
- credential source status (
resolved,not required, orblocked; never values) - tested public/authenticated/admin scope
- passes and failures with exact routes/interactions
- console/network/log evidence
- blocked and untested scope
- whether
.browser-qa/profile.jsonwas created or updated - remaining risks
- cleanup performed and resources intentionally left running
- flaky behavior and retry outcomes
Never report authenticated QA as passed when credentials were unavailable.
Common Pitfalls
- Browser first: opening a guessed localhost port before discovery. Fix: enforce the readiness table.
- Template theater: generating a TODO profile but never filling or reading it back. Fix: persistence requires project-specific values and validation.
- Container equals healthy: compose says
Up, but the frontend/API is unusable. Fix: require HTTP/render proof. - Credential guessing: trying
admin/adminor claiming login is impossible without searching seeds/docs/env references. Fix: follow credential-source order. - Secret leakage: putting passwords in profile/report/Git. Fix: references in profile; optional gitignored
env.localonly with authorization. - Discovery every run: ignoring the profile. Fix: load it first and refresh only stale fields.
- Silent scope reduction: testing public pages and omitting blocked authenticated scope. Fix: explicitly report it.
- Wrong environment: mixing local, staging, and production URLs/accounts. Fix: profile includes a named environment and one verified target.
Verification Checklist
- Matching browser-QA requests loaded this orchestrator
- Project root and instruction files identified
- Deployment mode and exact commands supported by evidence
- Target URL and required services verified healthy
- Authentication marked not required or credential source resolved
- No username/password/token was guessed or exposed
.browser-qa/profile.jsonwritten/updated and read back- Local secret file, if used, is gitignored and authorized
- Browser context isolated from other environments
- Destructive/production actions respected the safety policy
- Browser tested rendered UI, console, network, and scoped flows
- Authenticated scope is either tested or explicitly blocked
- Evidence saved with secrets and personal data redacted
- Learned flows, if any, came from completed public runs and passed their promotion gate
- Generated Playwright candidates were reviewed before CI/commit
- Resources started by QA were cleaned up per policy
- Report states environment, profile persistence, evidence, retries, cleanup, and remaining risks
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

