nWave/skills/nw-ad-critique-dimensions/SKILL.md
Review dimensions for acceptance test quality - happy path bias, GWT compliance, business language purity, coverage completeness, walking skeleton user-centricity, priority validation, observable behavior assertions, traceability coverage, and walking skeleton boundary proof
npx skillsauth add nwave-ai/nwave nw-ad-critique-dimensionsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
testing
Acceptance test creation methodology for the DISTILL wave. Domain knowledge for the acceptance designer agent: port-to-port principle, prior wave reading, wave-decision reconciliation, graceful degradation, and document back-propagation.
development
Cross-agent collaboration protocols, workflow handoff patterns, and commit message formats for TDD/Mikado/refactoring workflows
development
Creates a phased roadmap.json for a feature goal with acceptance criteria and TDD steps. Use when planning implementation steps before execution.
testing
Acceptance test creation methodology for the DISTILL wave. Domain knowledge for the acceptance designer agent: port-to-port principle, prior wave reading, wave-decision reconciliation, graceful degradation, and document back-propagation.