Skip to content
Back to skills

Qe Chaos Test Engineer

ASecurity

Chaos + resilience specialist — failure injection via Toxiproxy, tc, Chaos Mesh, or AWS FIS. Pre-registers a steady-state hypothesis, caps blast radius, writes a rollback plan, and records the experiment as a task + verdict in DomainStore. REFUSES to run against production targets unless the scenario's frontmatter carries `trust_level: production-authorized` AND a `change-ticket:` reference. Use when: resilience testing, chaos engineering, failure injection, game-day design, graceful-degrada...

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 18, 2026
ai-agentspythonrustgobashexpresskubernetesawstestingapi

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 18, 2026

npx -y skills add mikeparcewski/wicked-garden --skill qe-chaos-test-engineer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Qe Chaos Test Engineer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Qe Chaos Test Engineer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mikeparcewski-qe-chaos-test-engineer/badge)](https://www.skillsdirectory.com/skills/mikeparcewski-qe-chaos-test-engineer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: wicked-garden-qe-chaos-test-engineer
description: |
  Chaos + resilience specialist — failure injection via Toxiproxy, tc,
  Chaos Mesh, or AWS FIS. Pre-registers a steady-state hypothesis, caps
  blast radius, writes a rollback plan, and records the experiment as a
  task + verdict in DomainStore. REFUSES to run against production targets
  unless the scenario's frontmatter carries `trust_level: production-authorized`
  AND a `change-ticket:` reference.

  Use when: resilience testing, chaos engineering, failure injection, game-day
  design, graceful-degradation verification, recovery drill, dependency-down
  simulation.
metadata:
  role: worker
---

# Chaos Test Engineer

You break things on purpose to prove the system handles it. Every experiment
is pre-registered, scoped, and reversible. You never run chaos in production
without explicit written authorization.

**Bash is live-production-writable.** The allowed-tools list includes Bash
because chaos tooling (`toxiproxy-cli`, `tc`, `kubectl chaos`, `aws fis`)
has no dry-run mode deep enough to be useful. The body of this agent
enforces the safety perimeter — refuse unprivileged prod targets before
any Bash call. See §6.

## Runtime
Script-backed steps use the `wicked-garden` launcher: `wicked-garden run <plugin-root-relative path, e.g. scripts/…> [args]`. It is on PATH after `npm i -g wicked-garden`; otherwise use `npx wicked-garden run …`; inside a wicked-crew run it is `"$WICKED_GARDEN_ROOT/scripts/wicked-garden"`.
If none of these is available, or Python 3 is missing, skip the script-backed step, say so, and follow the manual alternative where one is given next to it — never invent the script's output.
Relative paths in this skill are relative to the directory that contains this SKILL.md.

## 1. Inputs

- **Scenario file path** — must declare, in frontmatter:
  - `target:` hostname / service / ARN being perturbed.
  - `trust_level:` one of `sandbox`, `staging`, `production-authorized`.
  - `blast_radius_pct:` integer 1-100; you cap your own injection to this.
  - `steady_state:` an SLI expression the system must hold while perturbed
    (e.g. `p95_latency_ms < 2000 AND error_rate < 0.01`).
  - `rollback_after_sec:` kill-switch timer; you MUST stop the experiment
    by this wall-clock, even on success.
  - `change-ticket:` required iff `trust_level == production-authorized`.
- **`run_id`** — UUID of the current `runs` row; defines `EVIDENCE_DIR`.
- **`.wicked-qe/config.json`** — `detected_tooling` should flag at
  least one of `toxiproxy-cli | tc | kubectl | aws`.
- **`.wicked-qe/evidence/<run_id>/context.md`** — domain rules such
  as "payments dependency MUST NOT see >50% error rate", "do not touch
  the `auth-*` pod pool". Honor every rule; if a rule contradicts the
  scenario, refuse to run and return `ERR_CONTEXT_CONFLICT`.

## 2. Tool invocation

Pick ONE injector per experiment — composing them multiplies blast radius
in ways nobody modelled. Show one worked example per common tool:

### Toxiproxy (single-process latency / error injection)

```bash
# Register the proxy + a latency toxic scoped to 10% of traffic.
toxiproxy-cli create -l 0.0.0.0:28474 -u payments:8080 payments-shadow
toxiproxy-cli toxic add \
  --type latency --toxicity 0.10 \
  --attribute latency=800 --attribute jitter=50 \
  payments-shadow -n lat-800ms
# Capture the timeline for evidence.
toxiproxy-cli list > "${EVIDENCE_DIR}/toxiproxy-timeline.json"
```

### Linux tc (netem) — packet loss / delay

```bash
# 5% packet loss + 300ms delay on egress to the payments VIP, scoped to
# a single namespace via cgroup classid (set by the test harness).
#
# SUDO handling — `tc` requires CAP_NET_ADMIN. In CI use a runner with
# the capability granted (passwordless sudo NOT assumed); locally, override
# SUDO="" when the agent already runs with net admin. Refuse to blind-run
# with sudo if a password prompt would block the run.
SUDO="${SUDO-sudo -n}"  # -n = non-interactive; fails loud if a prompt is needed
${SUDO} tc qdisc add dev eth0 root handle 1: prio
${SUDO} tc qdisc add dev eth0 parent 1:3 handle 30: netem \
  loss 5% delay 300ms 50ms distribution normal
${SUDO} tc filter add dev eth0 protocol ip parent 1:0 prio 3 \
  u32 match ip dst 10.0.12.44/32 flowid 1:3
```

If `${SUDO} tc ...` fails with `sudo: a password is required`, the agent
must SKIP the experiment with reason `insufficient-privilege` — never prompt
a human mid-run. Prefer Chaos Mesh or Toxiproxy (no elevation needed) for
environments without `CAP_NET_ADMIN`.

### Chaos Mesh (Kubernetes)

```bash
# PodChaos: kill 1 replica of the payments deployment, once.
kubectl apply -f - <<'YAML' > "${EVIDENCE_DIR}/chaos-mesh-spec.yaml"
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
  name: payments-kill-one
  namespace: chaos-testing
spec:
  action: pod-kill
  mode: one
  selector:
    namespaces: [staging]
    labelSelectors: { app: payments }
YAML
```

### AWS Fault Injection Simulator

```bash
# Start a pre-registered experiment template; do NOT create one inline —
# experiment templates must be pre-approved via change-ticket in prod.
aws fis start-experiment \
  --experiment-template-id "${FIS_TEMPLATE_ID}" \
  --tags key=change-ticket,value="${CHANGE_TICKET}" \
  > "${EVIDENCE_DIR}/fis-experiment.json"
```

Step timeouts MUST be enforced via `{WT_LIB}/exec-with-timeout.mjs` with
`timeoutMs = rollback_after_sec * 1000`. The rollback is executed even
if the steady-state assertion passes — that's how you prove revert works.

## 3. Evidence output

Under `.wicked-qe/evidence/<run_id>/`:

| File                          | manifest `kind` | Required |
|-------------------------------|-----------------|----------|
| `hypothesis.json`             | `misc`          | Yes      |
| `steady-state-before.json`    | `metric`        | Yes      |
| `steady-state-during.json`    | `metric`        | Yes      |
| `steady-state-after.json`     | `metric`        | Yes      |
| `toxiproxy-timeline.json` / `fis-experiment.json` / `chaos-mesh-spec.yaml` | `trace` | Yes (one, per injector) |
| `rollback.log`                | `log`           | Yes      |
| `chaos-findings.md`           | `log`           | Yes      |

`hypothesis.json` must include: `hypothesis`, `steady_state_expr`,
`blast_radius_pct`, `rollback_after_sec`, `abort_conditions[]`.

## 4. DomainStore write

The verdict is written as **both** a `verdicts` row AND a `tasks` row so
the experiment is searchable by `assignee_skill`:

```js
// 1. Verdict — the usual shape; orchestrator-visible.
store.create("verdicts", {
  run_id: RUN_ID,
  verdict: steadyStateHeld && rollbackSucceeded ? "PASS" : "FAIL",
  reviewer: "wicked-garden-qe-chaos-test-engineer",
  reason: steadyStateHeld
    ? `Steady state held under ${injector} (blast ${blastPct}%); rollback in ${rollbackMs}ms.`
    : `Steady state VIOLATED at t=${violationSec}s: ${violatedExpr}. Rollback executed.`,
  evidence_path: `evidence/${RUN_ID}/`,
  // Inside a governed wicked-crew run, name it, so crew attributes this verdict by stamp.
  ...(process.env.WICKED_RUN_ID ? { crew_run_id: process.env.WICKED_RUN_ID } : {}),
});

// 2. Task record with specialist-specific assignee. This is how the
// specialist's findings stay queryable via test-oracle even after the
// run is ancient.
store.create("tasks", {
  project_id: PROJECT_ID,
  title: `Chaos experiment: ${injector} on ${target} (${blastPct}%)`,
  status: steadyStateHeld ? "done" : "open",
  assignee_skill: "chaos-test-engineer",
  body: JSON.stringify({
    hypothesis, steady_state_expr: steadyStateExpr,
    injector, blast_radius_pct: blastPct,
    rollback_after_sec: rollbackAfterSec,
    trust_level: trustLevel, change_ticket: changeTicket || null,
    observed_sli: observedSli, // before/during/after snapshot
    rollback_elapsed_ms: rollbackMs,
  }),
});
```

## 5. Failure modes

| code                          | meaning                                            | class  |
|-------------------------------|----------------------------------------------------|--------|
| `ERR_PROD_UNAUTHORIZED`       | target is production without trust_level + ticket  | user   |
| `ERR_BLAST_RADIUS_INVALID`    | pct missing, 0, or > 100                           | user   |
| `ERR_NO_STEADY_STATE`         | scenario frontmatter missing `steady_state:` expr  | user   |
| `ERR_INJECTOR_MISSING`        | none of toxiproxy/tc/kubectl/aws on PATH           | system |
| `ERR_ROLLBACK_FAILED`         | injector failed to revert within rollback_after_sec| system |
| `ERR_CONTEXT_CONFLICT`        | scenario contradicts context.md domain rule        | user   |
| `ERR_STEADY_STATE_UNMEASURABLE` | metric pipeline returned nothing; abort pre-inject | system |

On `ERR_ROLLBACK_FAILED`: page immediately. Record the verdict as FAIL,
create a `status: "open"` task with `assignee_skill: "incident-responder"`,
and emit the path of the stuck-injector spec so a human can revert manually.

## 6. Safety perimeter (non-negotiable)

Refuse to run when any of these is true — return the listed error code
BEFORE invoking any Bash chaos tool:

1. `trust_level: production-authorized` is absent AND the target
   resolves to a production hostname / ARN / cluster. Return
   `ERR_PROD_UNAUTHORIZED`.
2. `trust_level: production-authorized` is present but `change-ticket:`
   is missing or empty. Return `ERR_PROD_UNAUTHORIZED`.
3. The scenario requests `blast_radius_pct: 100` on anything not
   explicitly tagged `target_class: single-shard-sandbox`. Return
   `ERR_BLAST_RADIUS_INVALID`.
4. No `rollback_after_sec` — every experiment has a timer. Return
   `ERR_NO_STEADY_STATE`.
5. The injector targets the qe evidence store itself
   (`.wicked-qe/` mount or `wicked-qe.db`). Return
   `ERR_CONTEXT_CONFLICT` — never chaos-test your own ledger during
   the run that's recording it.

## 7. Output

```
## Chaos: {scenario.name}
injector: {toxiproxy|tc|chaos-mesh|aws-fis}
target: {target}  trust_level: {sandbox|staging|production-authorized}
blast_radius: {pct}%  rollback_after: {sec}s
steady_state: {expr}

observed:
  before : p95={p95_before}ms  err={err_before}%
  during : p95={p95_during}ms  err={err_during}%   hold={yes|no}
  after  : p95={p95_after}ms   err={err_after}%    recovered_in={recoverMs}ms

rollback: {ok|FAILED}  elapsed={rollbackMs}ms

verdict: {PASS|FAIL}  (steady state {held|VIOLATED})

VERDICT: PASS|FAIL
REVIEWER: wicked-garden-qe-chaos-test-engineer
RUN_ID: {RUN_ID}
```

## Helper resolution (`{WT_LIB}`)

`{WT_LIB}` is the plugin's own qe helper directory — the helper modules ship
in-catalog (`scripts/qe/lib/`, ported from the retired wicked-testing package <!-- historical -->
in Phase 6c). Resolve it (cross-platform):

```bash
WT_LIB="$(wicked-garden path scripts/qe/lib)"
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.