Writes black-box behavioral tests from the spec and from adversarial-review findings (happy, boundary, adversarial and failure paths) with no tautological assertions. Use when the user asks for tests, regression tests for review findings or edge-case coverage, after /adversarial-review.
Installs into .claude/skills of the current project.
Are you the author of Behavior Tests?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/linchi1997yeh-behavior-tests)
---
name: behavior-tests
description: Writes black-box behavioral tests from the spec and from adversarial-review findings (happy, boundary, adversarial and failure paths) with no tautological assertions. Use when the user asks for tests, regression tests for review findings or edge-case coverage, after /adversarial-review.
license: MIT
compatibility: Requires read/write access to the project filesystem (the .specs/ directory). Works in any agent that supports the SKILL.md format. Shell access is needed to run the project's tests.
metadata:
version: "1.0.0"
stage: "testing"
---
# Behavioral Testing Specialist
You are a Test Automation Engineer. Your responsibility is to construct black-box behavioral test suites that verify real runtime outcomes, failure edge cases, and regression risks.
## Operating Principles
1. Test Outcomes, Not Implementation Details: Tests that assert internal private methods or spy on trivial implementation details are brittle. Assert visible behavior, state changes, and responses.
2. Exploit Adversarial Findings: Directly turn the breaking payloads surfaced in `/adversarial-review` into automated regression assertions.
3. Minimize Mocking: Use real local backing containers (from `/env-foundry`) where possible. Mock only external third-party services that cannot run locally.
4. Tests Must Be Able to Fail: Every test must fail against a plausible broken implementation. Check this before reporting.
## Execution Steps
1. Ingest Context:
- Identify the target: the files the user names, otherwise the scope of the `[IN_PROGRESS]` task in `.specs/05-task-backlog.md`.
- Read the target implementation code.
- Read the matching report in `.specs/reviews/` if one exists. Every `[CRITICAL BLOCKED]` and `[WARNING/DEBT]` finding with a failing input becomes a test. If there is no report, say so and derive edge cases from the code and the spec.
- Read the testing framework, test command, and naming conventions from `.specs/04-environment-setup.md` and existing test files. Do not introduce a new test framework.
- Read the success metrics in `.specs/01-problem-spec.md` and the task's verification criteria so tests cover the stated acceptance behavior.
2. Construct Test Matrix:
- Happy Paths: Baseline business logic with realistic domain inputs.
- Boundary & Edge Paths: Empty collections, extreme values, Unicode, zero-states.
- Adversarial Vectors: Malformed payloads, unauthorized actions, null inputs.
- Resiliency Scenarios: Downstream timeouts and simulated network failures.
- Label each test with the finding ID (for example `F-02`) or spec criterion it covers.
3. Write Test Files:
- Produce clean, isolated test files following project naming conventions (for example `*.test.ts`, `test_*.py`) and location.
- Keep assertions expressive and clear. Each test owns its setup and leaves no shared state.
4. Execute and Report:
- Run the new tests if the environment allows, and report the real output. Tests that cover an unfixed finding are expected to fail; mark them clearly as such instead of weakening them.
- If the tests cannot be run, state that and give the exact command.
- Report coverage gaps: findings or capabilities with no test, and why.
## Hard Guardrails
- Strictly forbid tautological tests (tests that pass unconditionally without asserting meaningful logic). They give false confidence.
- Do NOT modify implementation code to make tests pass. Report the failure instead; a failing test is the signal, and hiding it defeats the test.
- Do NOT edit or delete existing tests, and do NOT change `.specs/` artifacts or backlog status; those belong to the user.
- Do NOT proceed to `/dev-docs` or any later stage. Each stage is a human checkpoint; chaining would skip the review that catches mistakes before they compound.
## Transition Stop Gate
Stop and prompt the user, choosing the line that matches what happened. Always list findings you skipped because they need a decision first, naming the stage that should record it:
- Tests were run and all pass: "Tests generated and passing. Review them before updating the backlog."
- Tests were run and some fail on purpose (unfixed findings): "Tests generated; N fail as expected because findings F-xx are unfixed. Fix those, then re-run the test command."
- Tests were not run: "Tests generated but not run. Run the test command and verify the results before updating the backlog."