Test Automation
Cypress · Playwright · Selenium · Cucumber / BDD · Jest · TypeScript · JavaScript · Python · Go
Senior SDET · Test Infrastructure & AI Tooling · Phoenix, AZ
I build test infrastructure: E2E and performance frameworks, CI that only runs what a change can touch, and Claude agents that do the triage, with a person on every decision.
01 / Trust
A little about me
Someone re-runs a red build. Someone mutes a spec "temporarily". Eighteen months later nobody can say whether the behaviour it covered still works. You end up paying for a test suite and getting a slot machine.
So most of what I build answers one question in different places: what should we trust, and how do we know? Lately that includes the agents: what an AI should be allowed to decide on its own, and how we'd know it got it right.
My professional journeyExpertise
Cypress · Playwright · Selenium · Cucumber / BDD · Jest · TypeScript · JavaScript · Python · Go
K6 load, stress, spike and soak profiles · Postman · REST and GraphQL suites · Grafana · Prometheus
GitHub Actions · Jenkins · Docker · Kubernetes · AWS · Intelligent test selection · Flakiness triage
Claude Code plugins · Claude Agent SDK · Playwright MCP · Anthropic API · Self-healing selectors · AI flaky-test triage
QA Lab
A real Playwright suite runs against this page in CI on every push. The numbers below come from the last run, not from a text editor. The suite, like the site, was written in a Claude Code session and reviewed by me before it shipped.
Playwright E2E automation
Browse the suite behind this page: smoke checks, navigation, links, this very lab, responsive layout and accessibility.
› Waiting for replay...
The last CI run will replay here, test by test.
Press the button to watch it.
AI in the loop
Claude Code plugins that run the QA loop end to end, an agent that heals drifted selectors, and a benchmark that checks whether more agents beat one. Every one of them keeps a person on the decision and a record of who decided what.
Skills, not prompts. Explore a running app for bugs, file the cases in a test management system, verify each one step by step in a real browser, then generate Playwright specs that trace back to the case. The same loop is packaged as the qa-tms plugin you can install today.
A Playwright framework where a Claude agent repairs one drifted selector, re-runs the spec to prove it, and opens a GitHub issue for anything it shouldn't touch. Known bugs are tracked state, so CI stays green while a bug exists and turns red the moment someone fixes it.
Runs the same task with one Claude agent and then a swarm of them: parallel finders with different lenses, a skeptic per finding, a panel plus a judge. Deterministic scoring and adversarial verification decide whether the extra agents earned their keep. Mostly, they don't.
House rules
Nothing goes out on the agent's say-so. A person approves, the log records who approved it, and the agent's reasoning is right there to argue with.
The self-healing agent edits a selector registry and nothing else. Not assertions, not test logic. A narrow blast radius is what makes autonomy safe to grant.
A fix is kept only if the re-run passes. No key, no cost, no change: dry-run is the default, so the loop is demonstrable before anyone trusts it.
Timing failures and assertion failures go to a human as issues, because a drifted selector can be a real regression in disguise. At Qualia, a P0 gate keeps deploy-blocking tests out of quarantine no matter what the classifier says.
Five thousand lines that read CI logs, classify six flakiness patterns, write the debug report and propose the fix, driven from the Claude Code CLI. Paired with the TestRail-to-Cypress plugin, which walks the live app through Playwright MCP to capture real selectors before it generates a single test.
Ask a three-hundred-page workers' comp claim file a question instead of reading it. Every answer cites the document and page it came from. The core is a pure Python library with the Anthropic API behind a single seam, so the web layer can be replaced without touching the reasoning.
Deal intake for a net-lease brokerage. Drop in an offering memo or a lease and it extracts twenty-four structured fields, each with a confidence grade and the verbatim passage it came from. Nothing reaches Salesforce until a person clicks approve, and the assistant that can read everything can change nothing. That's structural, not a rule it follows.
What I bring to QA
A flaky test is a trust problem, not a testing problem. Retries that hide a real defect are worse than a red build, so quarantine is a loan with interest: granted on evidence, repaid after clean runs, escalated when it expires.
If a tool can't explain a decision, it shouldn't get to make it. Every narrowing, every quarantine, every score lands somewhere a human can argue with it. An automated decision you can't interrogate is an outage nobody filed.
Measure it or don't claim it. A result you can't reproduce is worth less than an honest "we don't know yet", so the benchmarks I publish lead with the flaws the first run found.
Experience
Senior SDET 50% less CI time
Primary developer of Cyclops, a Cypress E2E framework covering six services with 214 tests, and of Cerebro, a K6 performance framework that pulls its scenarios straight out of those E2E tests. Built the intelligent test selection that cut CI execution time in half and folded ten GitHub Actions workflows into one pipeline.
Wrote the AI-powered flaky-test analyzer that diagnoses root causes from CI logs, the Cyclops-Flaky-Fixer plugin with a P0 gate so deploy-blocking tests can never be quarantined by accident, and the TestRail-to-Cypress plugin that walks the live app through Playwright MCP to capture real selectors before generating tests.
Software Developer in Test Framework from scratch
Built the testing framework for a healthcare payments platform from nothing: regression suites across four platforms in Cypress and JavaScript, a hybrid of page objects and app actions that served both legacy and modern stacks, Cucumber BDD, and a Playwright framework for what came next. Stood up CI/CD on Jenkins, Docker and AWS, cut QA cycle time by 20 percent, and mentored the junior automation engineers.
Quality Assurance Engineer 5 products
Manual and automated testing across five products with Selenium and Postman. Wrote the procedure manuals, ran the training sessions, and took an active role in sprint planning.
Selected work
Open-source, built on GitHub Actions and the Claude Agent SDK. They compose in this order: produce the specs, pick which to run, decide which to trust, then check whether any of it was worth the money.
The loop that produces the specs the rest consume: explore a running app, file the cases, verify them in a real browser, generate traceable tests.
View on GitHub Project 02 · SelectRuns only the specs a pull request can actually affect. It never narrows on a guess: anything it can't explain escalates to the full suite.
View on GitHub Project 03 · TrustScores flakiness from same-commit evidence and quarantines the worst offenders with an expiry date, because a quarantine that never comes due is a deleted test with extra steps.
View on GitHub Project 04 · MeasureRuns a task with one AI agent, then with nine, and measures whether the extra agents earned their keep. Mostly it refuses to declare a winner, which is usually the honest answer.
View on GitHub Project 05 · PracticeA deliberately broken app with ten planted bugs. It's the practice dungeon, and it doubles as the fixture everything above is tested against.
View on GitHubThe other half
Same job with the sign flipped: there, randomness is the feature. Keep state consistent, make it reproducible, don't lose the thread. The dice are supposed to be random. The world isn't.
An LLM extracts NPCs, factions, locations and events out of session notes into a queryable world state, so a campaign stops living in six months of increasingly panicked scrawl. Pluggable model: Claude, OpenAI or Bedrock.
A web-based character generator that brews playable D&D 5e characters: every core race and class, subclass selection, and full spell management for casters.
My QA approach
Each step hands evidence to the next. None of them gets to hide how it decided.
An agent explores the product, files the cases and generates specs that trace back to them. A person reviews every one.
Run only what a change can affect. When that can't be justified, run everything.
Score flakiness on evidence, let an agent classify the pattern, and quarantine with an expiry date. Never forever.
Check whether the extra tooling, or the extra agents, earned their keep.
Every automated decision lands somewhere a human can argue with it.
A flaky test is a trust problem,
not a testing problem.