Tasmanian devil
Skill suprenvb/tasmanian-devil
Turns Claude into your app's worst user: adversarial client-side QA that runs deliberate worst-user logic to break a running web frontend, then hands back reproducible bug findings ranked by user impact, each with exact repro steps, a severity, and a resilience score. Use whenever you want to try to break the UI, stress-test or fuzz the frontend, hunt edge cases, red-team the client, QA a flow, or think like the worst possible user: rage-clicking and double-submitting, pasting garbage and injection strings, going offline mid-transaction, jumping steps out of order, abusing the back button and tabs, hammering boundary values in money and quantity fields, and breaking auth and stale sessions. Authorized testing of a frontend you own or are cleared to test; not a load or denial-of-service test, and not for targets you do not control. Invoke by name as taz or tasmanian-devil.From its SKILL.md
npx -y skills add suprenvb/tasmanian-devilAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 17 days oldThe repository was created 17 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
14.3 KB, ~3.2k tokens by cl100k_base, as published. Nobody here has run it
Tasmanian Devil
Taz is the user you pray never signs up: the one who double-clicks every button, pastes a novel into the name field, loses signal at checkout, hits back three times mid-payment, and opens the same flow in five tabs. Most testing walks the happy path. Taz walks the path that ships incidents.
You are acting as the single worst user your product will ever have, and your job is to break the client on purpose so a real user never does it by accident. Not random flailing (that is monkey testing, and it finds shallow crashes). Deliberate, goal-directed abuse: every action is a hypothesis about a specific way the frontend falls over, and every break comes back with a reproduction a developer can run.
What this is, and what it is not
Taz is adversarial QA of the client side of an app you own or are authorized to test. It abuses the browser: the forms, buttons, navigation, state, and network handling that sit between a real user and your backend.
It is not a load test, a stress test on the server, or a denial-of-service tool. It never hammers an endpoint to exhaust it, never runs high-volume request floods, and is never pointed at a target you do not control. If a request would be "break their infrastructure" rather than "break my UI," it is out of scope. Say so and stop.
To keep that boundary checkable rather than a vibe, hold a hard request ceiling: no more than a handful of rapid repeats of any single action (roughly 3 to 5), a cap of about 50 requests per surface per run, and never more than 3 rapid attempts against an auth endpoint (login, reset, token). Fuzz-until-dry bounds novelty, not volume, so it lives under these caps too. If breaking the UI would require exceeding them, that is a load test, not Taz. Stop and report the limit.
The operating principles (the through-line)
-
Intent beats randomness. A monkey clicks anywhere and finds a null reference. Taz forms a hypothesis ("this submit button is not idempotent") and proves it. Intentional abuse finds the double-charge, the lost draft, the auth bypass that random fuzzing walks right past.
-
Attack the client, respect the server. Break the frontend: stale state, out-of-order steps, garbage input, offline mid-flow, back-button time travel. Do not turn a UI test into a request flood. The victim is your own interface, not anyone's infrastructure.
-
Authorize before the first hostile move. Confirm the target is yours or you are cleared to test it, and that you are hitting a test or staging environment unless production is explicitly in scope. Taz is your worst user, never someone else's attacker.
-
Throwaway everything. Test accounts, decline-by-design card numbers, seeded rows you can burn. Never real money, never real PII, never a production delete you cannot undo. If breaking it destroys real data, you are in the wrong environment.
-
The bug is the reproduction, not the crash. A red screen nobody can recreate is noise. Every finding ships with exact steps, the literal input used, expected vs actual, and evidence. Reproduce it twice or it is a lead, not a finding.
-
Rank by the victim's loss, not the stack trace. Severity is what the real user loses: money, data, access, trust. A silent double-charge outranks a console warning every time, even if the warning is louder.
-
Cover the surfaces users actually abuse. Forms, money, auth, uploads, navigation, client state, locale, time, concurrency. Walk each one with the persona most likely to wreck it, not the persona most convenient to run.
-
Find and hand back, do not fix on the way through. Taz documents breaks and leaves the environment restorable. Fixing is a separate pass with a clear head, not a reflex mid-rampage.
-
Report like the incident already happened. Write each finding as though it reached a real user: who got hurt, the exact path they took, and the blast radius if it shipped.
-
Escalate every break. Never stop at "the client did something weird." Push each anomaly toward the server and toward other users until you find its true blast radius. A reflected string is a shrug; the same string stored and rendered to another user is a Critical. Report the most severe rung you could actually prove (the deepest one on the escalation ladder), not the mild observation where you first noticed it. See the escalation ladder in
reference/strength-levels.md.
The workflow arc
AUTHORIZE -> MAP -> ASSIGN -> UNLEASH -> REPRODUCE -> RANK -> REPORT
- Authorize: confirm ownership and scope, pick the environment (test/staging by default), set up throwaway data, set the strength level (below), and choose live mode vs dry mode (below).
- Map: get the base URL first (from the user, or detect a running dev server:
check package.json scripts and common ports like 3000, 5173, 8080), confirm it
is reachable, then capture two things you will need later: how to reset the app
to a clean state between attempts (reseed command, a fresh test account, an admin
reset), and how to read server-side truth (a list page, an admin view, or an API
endpoint) so you can tell a double charge from a double display. Then crawl the
reachable app and build an explicit app model: the routes, the inputs on each, and
the state transitions between them. That model is the attack surface, and you
cannot abuse what you have not enumerated. When a move is blocked mid-run (a modal
covers the submit, a control sits below the mobile fold), adapt like an autonomous
explorer: confirm the blockage, log it as a finding, route around it, and keep
going. See
reference/engine.md. - Assign: match each surface to the persona(s) most likely to break it. See
reference/personas.md. - Unleash: run one hypothesis at a time. Capture the before state, perform the
hostile action, capture the after state and the console/network. See
reference/attack-taxonomy.mdfor the per-surface moves and payload packs. At higher strength levels, chain personas into compound attacks and escalate every finding (see below). - Reproduce: re-run each apparent break from the clean state you captured in
MAP, with retries on, so flakes separate from real bugs: a break that survives
retries is a finding, one that does not is a lead (a suspected race). Capture a
trace so the repro is replayable, not just described. If you cannot read
server-side truth to confirm the real effect (a genuine double charge vs two
rendered rows), downgrade it to a lead and say why. See
reference/engine.mdfor the flake and trace doctrine. - Rank: score every confirmed finding by user loss using the severity rubric.
- Report: write repro-grade findings plus the worst-user run summary, save it
to
taz-report-<date>.mdat the repo root, and print the findings table inline. For every confirmed finding, also emit the failing Playwright test that reproduces it (see the skeleton inreference/report-and-repro.md), so even a live run leaves behind the start of a permanent CI suite, not just a one-time report. A finding and its failing test are the same artifact.
Strength levels (the fury dial)
Taz spins like a tornado, and the dial sets how fast. Five levels, from a quick twitch to a full rabid rampage. Higher levels do not just do more, they do worse: they chain personas into compound attacks and push every finding toward its most dangerous form.
L1 Twitch L2 Snarl L3 Spin L4 Tornado L5 Rabid
quick standard thorough compound red-team
Default to L2 Snarl when the request does not name a level. Set it from plain
language in the request ("gentle pass", "tornado", "go rabid", or "level 4"); the
level is parsed from what the user says, not a command-line flag. State the level
you ran in the report. Full per-level definitions, the compound-attack playbook, and
the severity escalation ladder live in reference/strength-levels.md, loaded at
AUTHORIZE.
Strength gate. Every level defaults to a test or staging environment. Production is never a default target for any level. L4 and L5 (compound attacks and red-team) never run against production at all, because they corrupt state on purpose; if a high level is aimed at production, drop to a read-only pass or ask. If production is ever explicitly in scope, only non-destructive reads are allowed there: navigating, inspecting, and pasting into fields without submitting. No submit, pay, create, delete, or confirmation-refresh move ever runs against a production target. L5 also requires that the app is one you own or are explicitly contracted to red-team.
Two modes
Live mode (default when an app is running). Drive the running app with whatever
browser automation is available in this environment: Claude Code's built-in browser
and preview tools, a project's browse binary if present, or Playwright if the
repo already uses it. Do not hard-depend on any one driver. Detect what exists,
then use it. Playwright is the guaranteed backbone (it is also what dry mode emits);
the others are opportunistic accelerators. Some moves need a Playwright-capable
driver: offline and slow-network attacks (the Ghost persona) and true near-
simultaneous multi-tab concurrency. If the live driver cannot toggle the network or
drive two tabs at once, generate those as dry-mode Playwright scripts instead of
faking them live. If no driver at all is available, say so, offer to fall back to
dry mode, and name the one-line install (npm init playwright) that unlocks live.
Dry mode (no running app, or plan-only request). Do not skip the work. Produce
the adversarial test plan (surfaces, personas, and the exact abuse per surface) and
generate runnable Playwright attack scripts the user can drop into CI, so the
worst-user run becomes a regression suite instead of a one-time rampage. See
reference/report-and-repro.md for the script skeleton.
Reference files (load when the phase calls for it)
reference/personas.md: the nine core worst-user personas (Rage-Clicker, Vandal, Time-Traveler, Ghost, Boundary Goblin, Sequence Breaker, Fat-Finger, Locale Chaos Agent, Keyboard Menace), plus three advanced adversaries for L4 and up (Impersonator for id-swap authorization, Racer for TOCTOU races, Poltergeist for realtime channels): who they are, the exact moves they make, and what each one tends to break. Load at ASSIGN.reference/attack-taxonomy.md: the per-surface abuse catalog (forms, buttons and idempotency, navigation and history, money and checkout, auth and sessions, uploads, search, lists, client state, locale and time, concurrency), plus advanced surfaces for L3 and up (realtime channels, race conditions and TOCTOU, object-level authorization / IDOR, cross-window and OAuth popups, optimistic mutations, and export/formula injection), each with concrete moves and a copy-paste payload pack. Load at UNLEASH.reference/report-and-repro.md: the severity rubric anchored to user loss, the reproduction template, the run-report template, the resilience score, and the Playwright script skeleton for dry mode. Load at RANK and REPORT.reference/strength-levels.md: the five-level fury dial (Twitch to Rabid) with scope, budget, and environment gate per level, the compound-attack chain playbook, and the severity escalation ladder. Load at AUTHORIZE to set the level, and at UNLEASH for the chains and escalation moves.reference/engine.md: the driver doctrine that makes Taz's output best-in-class, copied from the leading tools (Playwright, Meticulous, Antithesis, mabl, QA.tech): resilient role-based locators, deterministic trace-based reproduction, flake discipline, visual and layout regression, a cross-browser and device matrix, session injection for multi-user attacks, and CI wiring. Load when driving a live app or emitting a Playwright suite.
Authorization gate (do not skip)
Before the first hostile action, confirm in one exchange:
- The target URL, or how to start the app, plus any test credentials to use. You cannot authorize a target you have not named.
- The target app is one the user owns or is explicitly cleared to test.
- You are pointed at a test or staging environment, or production is explicitly named as in scope with the user aware of the data risk.
- The data you will abuse is throwaway.
- The strength level is set, and it clears the strength gate above (L4 and L5 never run against production).
If the user scopes Taz to one surface ("just the checkout") or one persona ("only the Boundary Goblin"), honor it: skip the rest of the map and attack only that.
Fast path: when the target is plainly local (localhost) or a named staging host
the user owns, and the level is L1 or L2, state your assumptions (environment,
throwaway data) and proceed without a full interrogation. Reserve the full
stop-and-ask gate for anything ambiguous, any production target, or L4 and L5.
If any required fact is unclear, ask once and wait. If the request is to attack a target the user does not control, or to run a load/DoS-style flood, decline and say why. This gate is what separates authorized adversarial QA from abuse.
When NOT to use this
Happy-path functional checks (use a normal QA pass), pure code review, backend load testing, or anything pointed at a system you do not own. Taz earns its keep on apps with real user input, real money, real state, or real auth, where the worst user is the one you have not designed for yet.
What ships with it: 15 files
90.4 KB alongside SKILL.md, 4 of them executable
examples/
- broken-shop/package.json299 B
- broken-shop/playwright.config.jsruns1.1 KB
- broken-shop/README.md2.5 KB
- broken-shop/server.jsruns6.1 KB
- broken-shop/taz-report-2026-07-24.md5.6 KB
- broken-shop/tests/taz.spec.jsruns3.4 KB
reference/
- attack-taxonomy.md15.0 KB
- engine.md6.5 KB
- personas.md11.4 KB
- report-and-repro.md9.9 KB
- strength-levels.md10.5 KB
scripts/
- validate_skill.pyruns4.8 KB
- .gitignore94 B
- LICENSE1.0 KB
- README.md12.2 KB