Senior Quality Engineer · ISTQB CTFL · Ann Arbor, Michigan
Nearly eight years in quality engineering, all of it consulting for NTT DATA, which has put me in a new domain every year or two: healthcare, utilities, consumer goods, logistics. I have automated React and Angular UI, API, integration and mobile testing in object-oriented Java, C#, TypeScript and Swift, and have worked across REST and SOAP APIs, databases and asynchronous messaging.
I've led and mentored four quality engineers on a cross-platform application serving more than five million users, directed onshore, nearshore and offshore quality engineers, reviewing their test cases and pull requests, was my team's release quality gate on production releases, and designed a containerized .NET API framework whose tests ran in a GitHub Actions pipeline.
I've used GitHub Copilot Plugin on three client engagements as a force multiplier while writing and debugging automated test cases. I also build with Anthropic Claude Code and OpenAI Codex, and I published a study of LLM-assisted failure triage against a deterministic baseline.
A published study · TypeScript, Playwright, Python
A test fails overnight. Someone has to decide whether the product, the test or the environment is at fault, or whether the test is simply flaky.
I wanted to know whether a language model does that better than a simple baseline, so I first built a test application: a deliberately defective application and API with twenty-two cataloged defects and four injectable flakes. Each defect carries the classification a correct triage system should assign, so every failure it produces has a known right answer. That repository contains no AI, so the application shares no components with the classifiers being measured.
Result: deterministic clustering (grouping failures by their error
evidence and labeling each group by what it has historically been) scored 73.2% macro F1
at no cost and with no dependencies. Adding Claude Opus 5 (claude-opus-5) on
the ambiguous cases lowered that to 61.3% and cost $0.31 a run.
The difference comes from one behavior. The model finds the same real broken tests the clustering finds, with identical recall, then labels twenty more failures "broken test" that were not. Five of those were genuine product bugs.
The model was also weakest on the deliberately ambiguous cases, where a model would be expected to help most. Two cross-run frequency hypotheses that seemed reasonable contributed nothing, measured three separate ways.
The labeled corpus is published as a checksummed release and cited by tag, so the numbers can be reproduced. The deterministic baseline runs from a clean checkout with one command and no credentials. An earlier version of this result was measured against a corpus that was later regenerated, which made the published figure unverifiable. The repository documents the fix alongside the superseded numbers.
ai-qa-proving-ground (the defective application and its corpus) · ai-qa-failure-triage (the classifier and the scoring)
Built with Anthropic Claude Code · FastAPI, MariaDB, React
Tracks job applications end to end: company, role, source, status, salary range, dates, notes, next action and contacts. A FastAPI service in Python with SQLAlchemy models and Alembic migrations, running against MariaDB over the MySQL wire protocol, with a React single-page front end built in Vite.
Two repositories deployed independently, with requirements and architecture in a third that both consume as a git submodule, so there is one copy rather than several that can drift. Two Chrome extensions sit alongside them: one scrapes a posting and files it, the other marks an existing application closed in a single click. The whole thing runs on a self-hosted Debian machine on my local network with a nightly backup to Backblaze, with work tracked in Jira.
backend · frontend · shared docs · import extension · close-posting extension
Built with Anthropic Claude Code · Python, no dependencies
I was driving the Jira board for the Job Tracker project through Atlassian's hosted Rovo MCP server. It worked, but it meters against Rovo credits and is not offered on the Free plan, so keeping one integration alive meant paying for a tier I had no other use for. The REST API underneath it is available on every plan, unmetered.
So I built, with Claude Code, a short Python program that talks to it directly: a single file, no dependencies, any Python 3.9 or later. It also turned out better in two ways. It runs anywhere there is a shell (a terminal, an editor, a CI job, more than one AI coding agent), whereas an MCP server only works where it has been configured. And it can be read, tested and changed, which a hosted service cannot.
I chose no dependencies because a tool I use every few weeks can break between uses if
its dependencies change. transition takes a status name rather than Jira's
internal transition id and makes the lookup round trip itself. When the status is not
reachable from where the issue currently sits, the error lists the ones that are.
Jira Command-Line Client on GitHub: the repository, with unit tests run in GitHub Actions
Built with Anthropic Claude Code · skills, subagents, a job board that refreshes itself
Applying for a job is a set of repeatable tasks: check whether a posting is the employer's own, judge whether the role fits, tailor a résumé, draft a cover letter, finalize it. I built a Claude Code skill for each one, and a manager agent that hands each step to a subagent running the matching skill and collects what comes back.
The manager keeps a small state file for every job, and it is the only thing I talk to. When a subagent has a question or needs a decision, it goes back to the manager, which puts it on an HTML job board I keep open in a browser. The board refreshes itself and sorts jobs into waiting on me, agents working and finished, so I can see what needs me without scrolling through a chat. I can hand it several postings at once and each one moves through the steps on its own.
Nothing is applied for, published or sent without my explicit approval at that step.
job-application-workflow : the manager, subagents, skills and board, with a demo and no personal data
Every engagement below was delivered as an NTT DATA consultant, with a new client, domain and technology stack every year or two.
Bachelor of Science in Computer Science, Eastern Michigan University, Ypsilanti, MI
ISTQB Certified Tester Foundation Level (CTFL), ASTQB, September 2026, syllabus v4.0 (verify in the AT*SQA registry)