From nw
Reviews acceptance tests for quality using 9 dimensions: happy path bias, GWT compliance, business language purity, coverage completeness, walking skeleton focus, priority, assertions, traceability, and boundaries.
npx claudepluginhub nwave-ai/nwave --plugin nwThis skill uses the workspace's default tool permissions.
Load when performing peer review of acceptance tests (during *handoff-develop).
Provides structured critique dimensions for peer reviewing code and tests: detects implementation bias (YAGNI, premature optimization), validates test quality (coupling, flakiness), checks completeness and priorities.
Generates production-ready BDD/Gherkin test cases from acceptance criteria, PRD paths, Jira IDs, or interactively using ISTQB techniques. Use for QA test specs.
Reviews work-items for testability of acceptance criteria, ensuring specific, measurable, verifiable outcomes with concrete verification strategies.
Share bugs, ideas, or general feedback.
Load when performing peer review of acceptance tests (during *handoff-develop).
Pattern: Only successful scenarios, error paths missing.
Detection: Count success vs error scenarios. Error should be at least 40%. Missing coverage examples: login success but no invalid password | Payment processed but no decline/timeout | Search results but no empty/error cases.
Severity: blocker (production error handling untested).
Pattern: Scenarios violate Given-When-Then structure.
Violations: Missing Given context | Multiple When actions (split into separate scenarios) | Then with technical assertions instead of business outcomes. Each scenario: Given (context), When (single action), Then (observable outcome).
Severity: high (tests not behavior-driven).
Pattern: Technical terms leak into acceptance tests.
Flag: database, API, HTTP, REST, JSON, classes, methods, services, controllers, status codes (500, 404), infrastructure (Redis, Kafka, Lambda).
Business alternatives: "Customer data is stored" not "Database persists record" | "Order is confirmed" not "API returns 200 OK" | "Payment fails" not "Gateway throws exception"
Severity: high (tests coupled to implementation).
Pattern: User stories lack acceptance test coverage.
Validation: Map each story to scenarios | Verify all AC have corresponding tests | Confirm edge cases and boundaries tested.
Severity: blocker (unverified requirements).
Pattern: Walking skeletons describe technical layer connectivity instead of user value.
Detection litmus test for @walking_skeleton scenarios:
Violations: "End-to-end order flow through all layers" (technical framing) | Then "order row inserted in database" (internal side effects) | Given "database contains user record" instead of "customer has an account"
Severity: high (skeletons that only prove wiring miss the point -- first skeleton should be demo-able to stakeholder).
Pattern: Tests address secondary concerns while larger gaps exist.
Questions: 1. Is this the largest bottleneck? (timing data or gap analysis) | 2. Simpler alternatives considered? | 3. Constraint prioritization correct? | 4. Test design decisions data-justified?
Severity: blocker if wrong problem addressed, high if no measurement data.
Pattern: Tests assert internal state or method calls instead of observable behavior.
For EVERY Then step in EVERY scenario, apply this mechanical checklist:
Concrete violations to flag:
assert mock_repo.save.called — asserts method call, not observable outcomeassert len(db.query(Order).all()) == 1 — asserts internal DB stateassert obj._internal_field == "value" — asserts private stateassert os.path.exists("output.json") — asserts file existence (implementation detail)Concrete passing assertions:
assert result.is_confirmed() — observable business outcomeassert result.order_number is not None — return value from driving portassert "confirmation" in customer_notification.subject — observable user outcomeRelationship to Dim 5 (Walking Skeleton User-Centricity):
Severity: high (tests coupled to implementation break on refactoring).
Pattern: Scenarios exist without traceability to upstream wave artifacts.
Two mandatory traceability checks:
Check A — Story-to-Scenario mapping:
docs/feature/{feature-id}/discuss/user-stories.mdCheck B — Environment-to-Scenario mapping:
docs/feature/{feature-id}/devops/environments.yamlclean, with-pre-commit, with-stale-configWhat this dimension does NOT cover:
Severity: blocker for Check A (untraceable requirements), high for Check B (untested environments).
review_id: "accept_rev_{timestamp}"
reviewer: "acceptance-designer (review mode)"
strengths:
- "{positive test design aspect with example}"
issues_identified:
happy_path_bias:
- issue: "Feature {name} only tests success"
severity: "blocker"
recommendation: "Add error scenarios: invalid input, timeout, service failure"
gwt_format:
- issue: "Scenario has multiple When actions"
severity: "high"
recommendation: "Split into separate scenarios"
business_language:
- issue: "Technical term '{term}' in scenario"
severity: "high"
recommendation: "Replace with: '{business alternative}'"
coverage_gaps:
- issue: "User story {US-ID} has no acceptance tests"
severity: "blocker"
recommendation: "Create scenarios for all AC of {US-ID}"
walking_skeleton_centricity:
- issue: "Walking skeleton '{name}' describes technical flow, not user goal"
severity: "high"
recommendation: "Reframe: title as user goal, Then steps as observable user outcomes"
observable_behavior:
- issue: "Scenario '{name}' Then step asserts internal state: {assertion}"
severity: "high"
recommendation: "Replace with observable outcome assertion: {alternative}"
traceability_coverage:
- issue: "Story {US-ID} has no matching scenario"
severity: "blocker"
recommendation: "Create at least one scenario tagged @{US-ID}"
- issue: "Environment '{env}' has no matching Given clause in walking skeletons"
severity: "high"
recommendation: "Add walking skeleton with Given clause: 'Given a {env} environment with {preconditions}'"
walking_skeleton_boundary:
- issue: "WS strategy not declared in wave-decisions.md"
severity: "blocker"
recommendation: "Auto-detect strategy and confirm with user"
- issue: "WS uses @in-memory under Strategy {C/B/D} for local resource adapter"
severity: "blocker"
recommendation: "Replace InMemory with real adapter (tmp_path, real subprocess)"
- issue: "Driven adapter '{name}' has no real I/O integration test"
severity: "blocker"
recommendation: "Add integration test with real I/O for this adapter"
approval_status: "approved|rejected_pending_revisions|conditionally_approved"
The acceptance-designer-reviewer (Sentinel) owns Dimensions 1-9 during DISTILL.
Responsibilities that belong to OTHER reviewers (do NOT evaluate these):
If a finding touches KPI measurement or infrastructure readiness, tag it @escalate:{reviewer} in the review output and move on. Do NOT attempt to evaluate it.
For walking skeleton scenarios, validate that the WS actually proves adapter wiring with real I/O.
Is the WS strategy declared in wave-decisions.md?
Does the WS implementation match the declared strategy?
Does every driven adapter have a real I/O integration test?
Walking skeleton fixtures — what adapter tier do they use?
Grep for @in-memory on walking skeleton scenarios under strategies B/C/D.