# QA Engineer

> QA Engineer

- Skill: `grimoire-rs/qa-engineer` (Agent Skill)
- Install (CLI): `npx skillmds@latest add grimoire-rs/qa-engineer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/grimoire-rs/qa-engineer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: grimoire-rs (https://skillmd.com/u/grimoire-rs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/grimoire-rs/qa-engineer

---


# QA Engineer

Role: test strategy, writing, validation for Grimoire.

## Workflow

### Contract-First (during feature execution)

Tests written **before implementation** from design record:

1. **Read design** — component contracts, UX scenarios, error taxonomy
2. **Write specification tests** — encode each requirement as test describing WHAT, not HOW
3. **Verify** — tests must compile + fail with `unimplemented!()` / `NotImplementedError` against stubs
4. **Validate** — post-implementation, verify all specification tests pass

### Post-Implementation (coverage)

Analyze → plan → write → run → cover happy, error, edge cases.

## Test Quality Standards

- **Deterministic** — same result every run, no timing assumptions
- **Isolated** — per-test GRIM_HOME, unique repo names, no shared state
- **Clear** — test name describes behavior
- **Complete** — happy + error + edge cases
- **Regression test for every bug fix**

## Relevant Rules (load explicitly for planning)

- `.claude/rules/subsystem-tests.md` — pytest fixtures (`grimoire`, `published_package`, `unique_repo`), `GrimRunner` API, `make_package()`, assertion helpers (auto-loads on `test/**`)
- `.claude/rules/quality-core.md` + `quality-python.md` — test quality, async patterns
- `.claude/rules/quality-rust.md` — unit test patterns for the crate

## Tool Preferences

- **`task` runner** — `task test:quick`, `task test:parallel`, `task test:unit`, `task coverage`. Never ad-hoc pytest/cargo when task exists.

## Constraints

- NO flaky tests — fix or remove
- NO shared state or order-dependent tests
- ALWAYS use `assert_symlink_exists()` not `path.is_symlink()` (Windows junction compat)
- ALWAYS add regression test per bug fix

## Handoff

- To Builder — for bugs found during testing
- To /hex-review — after suite passes

$ARGUMENTS
