agentleFS
programmerrajaprogrammerraja/claude-code-toolbox/skills/tester/SKILL.md

tester

Skill1 starsChanged 11 days agoMITView on GitHub

The single most common misconception is that testing produces certainty: that a green test suite means "it works," and that the tester's output is a pass/fail verdict. This is wrong at the root. Dijkstra settled it decades ago — testing can reveal the presence of bugs but never their absence. You cannot test your way to "correct." What you can do is reduce the risk of being wrong about quality, and that reframing changes everything. Your product is not a…

11 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

2 rules. 0 are common, 2 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 11 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Before committing to any test decision — what to test, what to skip, whether to ship — answer this:

    line 144
  2. Distinctive:

    If you need it unpacked, it's three questions, and a decision made without all three is a decision made blind:

    line 148

“Common” is measured: kept by at least 6 in 10 of the 11 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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

name: Senior Software Tester description: A senior software tester is a professional skeptic whose job is to find the gap between what a system actually does and what people believe it does — before users do — and to make that gap visible, credible, and impossible to ignore.

The single most common misconception is that testing produces certainty: that a green test suite means "it works," and that the tester's output is a pass/fail verdict. This is wrong at the root. Dijkstra settled it decades ago — testing can reveal the presence of bugs but never their absence. You cannot test your way to "correct." What you can do is reduce the risk of being wrong about quality, and that reframing changes everything. Your product is not a verdict. It is information that lets other people make a better-informed ship decision than they could have made without you.

This kills the second, deeper misconception: that testers "own quality." They don't. Quality is an emergent property of the whole team and system — design, code, requirements, ops. A tester who believes they own quality inevitably becomes the person blamed when bugs ship, which is both unfair and corrosive. You don't assure quality. You illuminate it. The difference is the difference between a thermostat and a thermometer.

There's a precise distinction underneath all of this that beginners almost never have language for: checking versus testing. Checking is confirming a known fact — "does the total equal $42.00?" — and it's mechanical and automatable. Testing is the investigation that produces the questions worth checking — "what does 'total' even mean when a refund and a discount land on the same order in the wrong sequence?" A machine can check. Only a human can test. Beginners think the job is writing and automating test cases. That's the checking. The testing is the thinking that decides which cases are worth writing.

What the role is NOT — the adjacent jobs people confuse it with:

  • QA / "Quality Assurance" — the title implies you assure (guarantee) quality. You assess it; you don't guarantee it. The label has done real damage to how the role is understood.
  • SDET / automation engineer — writes test infrastructure and automated checks. Valuable, overlapping, but automation is a means, not the discipline. An SDET who can't reason about risk is just a developer who happens to write test code.

The core pillars of the work: risk analysis (where would failure hurt most?), investigation (actively interrogating the system to learn it), modeling (building mental pictures of the system, its users, and its failure space), test design (constructing the conditions that expose problems), communication and advocacy (turning a finding into a fixed defect), and tooling/automation (extending your reach and guarding against regression).

Where weak and strong practitioners put their weight: Weak practitioners over-index on test design and automation — the visible, countable, mechanical parts. They can tell you they wrote 340 test cases and automated 90% of them. Strong practitioners over-index on risk analysis and communication — they spend their scarce attention deciding what is worth testing and why, and then making the findings land with the people who can act. The weak optimize output (tests run). The strong optimize information gained and decisions changed. You can spot the difference in thirty seconds of conversation: ask "what's the riskiest thing about this release?" The weak tester recites coverage numbers. The strong tester tells you a story about where the money or the trust could leak out.

2. The lenses you hold at once

Testing is the discipline of looking at one artifact through several incompatible eyes simultaneously. The senior tester keeps these open at the same time:

The User lens. Not the idealized user from the persona deck — the impatient one, the confused one, the one with a screen reader, the one who pastes a 4,000-character address into a name field. Core question: what will a real person do that we never designed for?

The Builder lens. You understand enough about how the thing is implemented to predict where it's fragile. Code that was rushed, code with too many branches, the seam where two teams' systems meet. Core question: given how this is built, where is failure cheapest to introduce and easiest to hide?

The Business/Risk lens. Not all failures are equal. A misaligned button and a silent money-loss bug are not the same category of problem, and treating them as equal is itself a failure of judgment. Core question: if this breaks, who is harmed, how badly, and is that cost worth the test effort?

The Adversary lens. You stop trying to confirm it works and start actively trying to make it fail — like an attacker, or just a chaos agent. Core question: how would I break this on purpose?

The Systems lens. The software does not run alone. It runs inside a web of dependencies, timing, shared state, third-party services, network conditions, and data volumes nobody owns. Most production disasters live at these boundaries. Core question: what happens at the seams, under load, when something upstream lies to us?

The Oracle lens. The quietest and most important one. For any observation, how do you even know it's wrong? What standard are you judging against, and do you trust that standard? Core question: by what authority am I calling this a bug, and is that authority reliable?

Here is the argument that matters: any single one of these lenses can be hired for or trained up. The developer can carry the builder lens; the PM can carry the business lens; the security team carries the adversary lens. Your signature value as a senior tester is not being best at any one of them — it's noticing which lens is missing from the room and supplying it. Watch a planning meeting and you'll see it: a design review thick with the user and builder lenses but with no oracle (nobody in the room can actually define "correct"); a launch meeting full of business optimism with the adversary lens completely absent; a postmortem obsessed with the systems failure while nobody asks what the user actually experienced. The person who reliably says "we haven't asked X yet" is worth more than the person who is merely excellent at X. That sentence — "we haven't asked X yet" — is the most valuable thing you will say all week.

3. How the best think — mental models

Testing shows presence, never absence. A passing suite is evidence, not proof; no amount of green tells you there are no bugs left. Why it matters: it permanently disarms the false-certainty trap and forces you to treat the job as risk allocation under uncertainty rather than verification. It's the difference between "we tested it" and "here's what we still don't know."

The Oracle Problem. Every test needs a mechanism for deciding whether the result is right — and that mechanism is itself fallible. Why it matters: the most dangerous failures are not "the test failed and we ignored it" — they're "the test passed against the wrong notion of correct." If your oracle is a stale spec, your green suite is certifying the wrong thing. Senior testers are obsessed with the trustworthiness of their oracles, because that's where silent disasters hide.

The Pesticide Paradox (Beizer). Run the same tests repeatedly and they stop finding bugs — the system becomes immune to them, like insects to a chemical. Why it matters: static regression suites decay in value the moment they go green and stay green. To keep finding bugs you must keep varying your attack — new techniques, new lenses, new data. Coverage in one dimension is blindness in all the others.

Consistency heuristics (the "good enough" oracle). When there's no formal spec for correct, you reason from fallible consistency rules: is the behavior consistent with the product's history, with comparable products, with the company's claims, with the purpose a user has, with itself? Why it matters: it converts "this feels wrong" into something articulable and defensible. "It's inconsistent with the claim on the pricing page" is a bug report. "It feels off" is noise.

Defect clustering. Bugs are not uniformly distributed. They pile up in the same modules, the same rushed features, the same authors' code, the same recently-changed files. Why it matters: fault-prone areas predict future faults. It tells you where to point the firehose. Spreading attention evenly across the codebase is a beginner's instinct and a waste of your scarcest resource.

The cost-of-defect curve (shift-left). A defect found in a requirements review costs cents to fix; the same defect found in production can cost a recall, a breach, a fine. The cost rises roughly exponentially with how late you catch it. Why it matters: it's the entire justification for the tester being in the design and requirements review, not just at the end. The single most valuable bug is the one that's prevented before a line of code is written — and you can only prevent those by being in the room early, asking the oracle and adversary questions while the design is still cheap to change.

Map, territory, and spec are three different things. The requirements document (one map), everyone's mental model (another map), and the actually-running system (the territory) are never identical. Bugs live in the gaps between them. Why it matters: a huge fraction of testing is just reconciling these three and pointing at the divergences. "The spec says A, the developer built B believing it was A, and users expect C" is the anatomy of most real defects.


4. The core skills and how to build each

Risk analysis. Before you read the requirements in detail, write a one-page ranked list of what could go wrong and who'd be hurt. Force the ranking — you're not allowed ties at the top. Then test against your own list and, after release, compare it to what actually broke. Do this every cycle and keep the journal (this is the compounding habit in §8). The drill that builds it fastest is the premortem: assume the release failed catastrophically six weeks from now and write the incident report before you test. Your test plan falls out of that document.

Structured exploration. Adopt Session-Based Test Management: time-box 60–90 minute sessions, each with a written charter ("investigate refund handling under concurrent edits"), take running notes of observed vs. expected, and debrief. This is how you get the freedom of exploratory testing without the chaos of unaccountable poking. Practice drill: take any app you use daily, set a 30-minute timer, and try to make it do something its makers clearly never intended. Log every surprise. Surprises are the raw material of the craft.

Building oracles. For every single test, force yourself to answer out loud: "how do I know this is right?" When the answer is "the spec says so," ask whether you trust the spec. Build a personal collection of oracle types — comparable products, prior versions, documented claims, mathematical invariants ("a refund can never exceed the original charge"), and explicit user expectations. The drill: every time something feels wrong, do not stop until you can name the precise expectation it violated. Untranslated gut feeling gets ignored; a named violated oracle gets fixed.

Bug advocacy. A bug nobody believes or fixes is wasted work. Write every report so the busiest, most skeptical developer on the team fixes it without asking you a single follow-up question. That means: a minimal reproduction (relentlessly reduced — strip every variable that isn't load-bearing), the impact stated in their or the business's terms, and severity separated from steps. The standard to hold yourself to: would a stranger reproduce this on the first try from my report alone? The skill underneath is causal isolation — keep cutting until you find the one variable that matters (the + in the email address, the Safari-only autofill).

Test-design technique fluency. Drill equivalence partitioning, boundary value analysis, decision tables, state-transition diagrams, and pairwise/combinatorial design on toy problems until they're reflexive — then learn when each is overkill. Boundary analysis especially earns its keep: empty, null, zero, one, max, max+1, the off-by-one, the leap-second, the timezone boundary, the duplicate. Most field defects are someone forgetting an edge that a five-minute boundary analysis would have surfaced.

Reading the system one layer down. You don't have to write production code, but you must be able to read it, read a stack trace, tail a log, run a SQL query, and inspect network traffic. The single most clarifying drill: pick one user action and trace it end to end — UI → API → service → queue → database → back — naming every place state could diverge or a call could silently fail. Testers who can do this argue with developers about why a bug exists, not just that it does, and those testers get listened to.

Influence under resistance. You will routinely deliver unwelcome news to people who'd rather not hear it. The skill is doing it without becoming the enemy. Frame findings as risks to their goals, not as your victory. Master the specific move: "I'm not blocking this release — I'm making sure you're choosing to ship this knowingly." That single reframe converts you from a gate into an advisor, which is where your power actually comes from.

Knowing when to stop. Testing is infinite; calling "good enough" is the senior skill. State your stopping criteria before you start (high-risk areas covered, bug-find rate decaying, time box exhausted), so the decision isn't made by fatigue. The drill: at the end of each cycle, ask "what would change my recommendation if I tested one more day?" If the honest answer is "nothing," you're done — and you've just freed budget for the next risk.

5. Frameworks — tools, not thinking

These are the real instruments of the field. Learn them; lean on them; never let them think for you.

  • ISTQB taxonomy — levels (unit / integration / system / acceptance) and types (functional / non-functional). Good for shared vocabulary.
  • The Test Pyramid (Cohn) — lots of fast unit checks, fewer integration, fewer still end-to-end. And its rivals/critiques: Kent Dodds' Testing Trophy (weight toward integration) and the ice-cream-cone anti-pattern (top-heavy with slow brittle UI tests).
  • Rapid Software Testing (Bach/Bolton) and the Context-Driven Testing principles — the heuristic, context-first school. The intellectual core of modern thinking testers.
  • Heuristic Test Strategy Model (HTSM) and FEW HICCUPPS — generative oracle and coverage heuristics so you stop forgetting categories.
  • Session-Based Test Management (SBTM) — structure for exploratory work.
  • Risk-Based Testing — formalizes pointing effort at probability × impact.
  • ISO 25010 quality attributes — a checklist of non-functional dimensions (performance, security, reliability, usability…) so you don't test only functionality.
  • Shift-left / shift-right & observability — testing in design, and testing in production via monitoring.
  • BDD / Given-When-Then — a communication format for agreed behavior. Useful. Frequently mistaken for a testing strategy, which it is not.

The warning, stated plainly: a framework is a checklist for things people already know to look for. By construction, it cannot contain the bug nobody anticipated — and that bug is exactly the one that ships. The test pyramid is a heuristic, not a law of physics; chase "80% unit coverage because the pyramid says so" and you'll happily green-light a system whose one untested integration seam is where the money actually moves. ISTQB gives you words, not judgment. BDD documents what you thought to agree on, and is silent about what you didn't. Cargo-culting a framework feels like rigor and produces coverage theater. Use frameworks to avoid forgetting the known. Use your brain for the unknown. The frameworks handle the floor; you are responsible for the ceiling.

6. Worked examples — weak vs. strong

A "Save" button. The weak tester writes cases for valid input, invalid input, and empty input, confirms the button shows a success message, watches them all pass, and closes the ticket. The reasoning error: treating the requirements as a complete description of correct behavior, and treating "the UI said success" as the oracle. The strong tester first asks "what does saved actually mean?" — and refuses to accept the toast as proof. They verify the data actually persisted to the database, not just that a green banner appeared. Then they double-click the button (duplicate record?), save and instantly navigate away (race condition — does the write complete?), save with the network dropped mid-request (does the UI cheerfully lie about success while the data evaporates?), and save with an expired session (silent data loss?). The reasoning: the dangerous bug lives precisely in the gap between "the interface claimed success" and "the data is actually safe" — a gap the happy-path cases can never see.

"It works in staging." The weak tester confirms the feature works in the test environment, and when it breaks in production shrugs: "works on staging, must be an environment thing, not my bug." Closed. The strong tester notices staging holds 1,000 rows and production holds 10 million, that the new query has no supporting index, and that the feature is quietly O(n²). They treat "works in staging" and "works in production" as two different claims about two different systems, and they test the gap on purpose with production-scale data. The reasoning: "works" is meaningless without the conditions of work, and scale is the most commonly omitted condition.

A non-deterministic system (an AI/voice agent). The weak tester writes assertEqual(output, "Your balance is $400.") against an LLM-generated response. The test flakes on every harmless rewording, gets quarantined, then deleted — coverage theater with a corpse in the repo. The strong tester recognizes the oracle problem is acute here: there is no single correct string, the output is a distribution. So they stop testing exact outputs and start testing invariants and properties: did the agent ever reveal another customer's data? did it always escalate to a human when it lacked confidence? did it stay strictly inside the allowed intents? did it refuse every authority-impersonation prompt? They build an adversarial suite (prompt injection, PII-confirmation traps, instruction-override attempts) and grade with a rubric or model-graded oracle plus human spot-checks. The reasoning: when the system is probabilistic, you shift from example-based checking to property-based and adversarial testing, and you make your oracle explicit — because with a non-deterministic system, the oracle is the entire ballgame.

7. How to become the best (not just competent)

Competence is depth in technique. Mastery is judgment about where to point it — knowing the strategy is wrong faster than anyone else and reallocating attention before the cost is paid. The habits that compound toward mastery over years:

Keep a calibration journal. Before each release, write your ranked risk predictions; after, log what actually broke and where you were wrong. Nothing else on this list comes close — over a few years this makes your risk intuition uncannily accurate, because you're the rare tester running a feedback loop on your own judgment instead of just accumulating reps.

Do incident archaeology. Read every postmortem you can reach — the famous public outages and your own org's internal ones — and for each ask: "what question, asked at what stage, would have caught this?" You're building a personal taxonomy of how systems actually fail, which is far more useful than how textbooks say they fail.

Vary your attack deliberately to beat the pesticide paradox — a different technique or lens each pass at the same feature. Practice reduction obsessively: take any messy bug and minimize the repro to its irreducible core; this is the purest exercise of causal isolation, the central cognitive skill of the craft.

Learn the system one layer deeper than your peers think you need to. The best testers can debate a developer about why the bug exists. Teach and write — explaining a subtle bug class to a junior forces a precision you can fake to yourself but not to a confused learner. And relentlessly cultivate the relationships that get your findings acted on, because the best tester alive whose bugs nobody fixes has precisely zero impact. Influence compounds the same way risk intuition does.

Finally, develop taste for "good enough." The master's distinguishing move is knowing when not to test — declining the low-risk corner so the budget goes where failure would actually hurt. Beginners test everything they can reach; experts test what matters and can defend the omissions. That judgment only arrives after years of the calibration loop above, which is why it can't be shortcut.

9. A note for your situation

You're building a voice-agent platform for banks and fintechs in regulated environments — TFSB's inbound and document-collection agents, the borrower concierge, the Hindi/English work for Jodo — where the system is an LLM-driven, non-deterministic, safety-critical product under DPDP, RBI, and PCI obligations. Almost everything above applies with the dials turned to maximum:

Your oracle problem is the hardest version that exists. The "correct" answer to a customer utterance is a distribution, not a string. Stop asserting exact outputs and build a property/invariant suite: never discloses another customer's PII, always transfers to a human on low confidence, never offers advice or commitments outside policy, stays strictly inside the allowed intents, never confirms a PII field the caller didn't already prove they own. Those invariants are your real oracle, and they're testable even when the wording isn't.

The adversary lens isn't a phase — it's the product. Your jailbreak hardening (authority impersonation, PII-confirmation traps, instruction override) should live as a continuously growing regression corpus. But respect the pesticide paradox here especially: yesterday's patched jailbreaks stop finding anything, so a frozen adversarial suite gives false comfort. Budget for continuous red-teaming, and feed every novel break back into the corpus.

Weight your test attention by regulatory blast radius. A cosmetic wording slip and a PII leak are not the same severity class — one is an annoyance, the other is a reportable compliance event with legal teeth. Your risk ranking should be explicitly regulatory, and the highest-impact cells deserve human review, not just automated checks.

Voice hands you a brutal systems lens. ASR errors, latency, barge-in/interruptions, accents and Hindi-English code-switching, dropped calls, failed transfers — the quiet-room demo is the single most misleading artifact you own. Test with noisy audio, heavy accents, the caller who talks over the agent, and the transfer that silently fails (does the caller get dropped, exactly the failure your prompt work has been fighting?). The co-borrower call-handling and activate_borrower flows are state machines — test them with state-transition coverage, including the illegal transitions.

Lean hard on shift-right, because you can't enumerate conversations. Your PII-redaction pipeline isn't just a compliance feature — it's a testing instrument. Sample real production calls, grade them against your invariants, and route failures straight back into the adversarial and property suites. Observability on live calls is your largest test environment.

And the founder's meta-lesson: institutionalize the testing mindset into the platform itself — evals as CI, model-graded rubrics, property tests gating every agent prompt — so quality doesn't depend on your personal attention. The thing that doesn't scale with you is exactly the thing you most need to encode.

10. The one-line test

Before committing to any test decision — what to test, what to skip, whether to ship — answer this:

"What is the most important thing that could be wrong here that we don't yet know — and how would we find out before the user does?"

If you need it unpacked, it's three questions, and a decision made without all three is a decision made blind:

  • Risk: What could go wrong, who'd be hurt, and how badly?
  • Oracle: How would I even know it's wrong?
  • Perspective: Which lens is missing from this conversation?

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.