gherkin
Gherkin BDD Conventions
Standards for generating BDD scenarios, step definitions, and maintaining the bdd/ scaffold.
Scaffold Structure
The canonical bdd/ directory tree:
bdd/
├── features/
│ ├── INDEX.md
│ ├── cross-domain/
│ └── {domain}/
│ └── {feature-name}.feature
├── steps/
│ ├── INDEX.md
│ ├── world.[ext]
│ ├── common_steps.[ext]
│ ├── api_steps.[ext]
│ ├── db_steps.[ext]
│ └── {domain}_steps.[ext]
Note: bdd/.claude/rules/ is user-created when needed for custom domain mappings — it is not part of the auto-generated scaffold.
Language Detection Rules
Scan existing step files to determine the language:
- Glob
bdd/steps/*.*and count file extensions:.py,.go,.ts. - If no step files exist → default to Python (behave).
- If one language detected → use that language.
- If multiple languages detected → use the majority language and warn: "Mixed languages detected in
bdd/steps/: {list}. Using majority language: {language}." - Never create step files in a different language than detected.
Language-to-Framework Mapping
| Extension | Language | Framework | Step syntax |
|---|---|---|---|
.py |
Python | behave | @given, @when, @then decorators |
.go |
Go | godog | ctx.Step registration in InitializeScenario |
.ts |
TypeScript | cucumber-js | Given, When, Then from @cucumber/cucumber |
Format Detection Rules
- Glob
bdd/features/**/*.feature.md. - Glob
bdd/features/**/*.feature(excluding.feature.mdmatches). - If
.feature.mdfiles exist → use MDG format (Markdown-Gherkin). - Else if
.featurefiles exist → use standard Gherkin. - Else → default to standard Gherkin (
.feature). - Never mix formats within
bdd/features/.
Domain Detection Priority
Determine domain subdirectories under bdd/features/ using this priority — stop at the first source that yields names:
- User-defined rules: Glob
bdd/.claude/rules/*.mdfor explicit domain mappings. - BDD conventions file: Read
bdd/CLAUDE.mdfor domain conventions. - Existing domain folders: Glob
bdd/features/*/— preserve existing domains. - Changelog: Read
prd/changelog.mdfor domain-organized sections. - PRD specs: Glob
prd/specs/*/and group slugs into logical domains. - Codebase structure: Glob top-level and
server//src/subdirectories.
If no sources yield domains, create a single general/ domain folder. Always ensure cross-domain/ exists. Use kebab-case naming.
File Naming Rules (FR-0KTg-016)
- Use kebab-case:
user-registration.feature, notuserRegistration.featureoruser_registration.feature - Name must describe the feature, not a scenario:
password-reset.feature, notforgot-password-click.feature
Tagging Rules (FR-0KTg-017)
Every scenario must have at least one tag. Choose from:
| Tag | When to use |
|---|---|
@smoke |
Core happy-path scenarios that must always pass |
@regression |
Standard coverage scenarios |
@critical |
Scenarios testing security, data integrity, or financial correctness |
@backend |
Scenarios that test server-side behavior only |
@fullstack |
Scenarios requiring UI + backend interaction |
@{domain} |
Domain-specific tag matching the folder name (e.g., @auth, @billing) |
Scenarios may have multiple tags. Feature-level tags: @{domain} and one priority tag (@smoke, @regression, or @critical).
Step Writing Rules
| Rule | Requirement | Good example | Bad example |
|---|---|---|---|
| Declarative Given (FR-0KTg-018) | Given steps describe state, not procedures | Given user alice is logged in |
Given I open the login page and type alice into the username field |
| Exact Then (FR-0KTg-019) | Then steps make exact assertions | Then the balance is exactly $94.00 |
Then the balance is around $94 |
| Reusable patterns | Use parameterized patterns for similar steps | Given user {name} is logged in |
Given user alice is logged in + Given user bob is logged in as separate steps |
Gherkin Construct Selection (FR-0KTg-046 through FR-0KTg-049)
| Situation | Construct | Example |
|---|---|---|
| Unique flow with specific setup and assertion | Scenario |
Login with valid credentials |
| Same flow tested with different inputs/outputs | Scenario Outline + Examples |
Login with various invalid credentials |
| Multiple scenarios sharing the same preconditions | Background |
All scenarios need a logged-in user |
| Structured input data in a step | Data table | Creating a user with multiple fields |
Prefer Scenario Outline over multiple near-identical Scenario blocks. Use Background sparingly — only for truly shared preconditions, not convenience.
Step Reuse Policy (FR-0KTg-012)
Before creating any step definitions, read bdd/steps/INDEX.md to identify existing reusable patterns. For each step in the generated feature file:
- Search INDEX.md for a matching pattern (exact or parameterized).
- If match exists → reuse. Do not create a duplicate.
- If no match → create a new step definition.
Step File Placement
| Category | File | When to use |
|---|---|---|
| Common | common_steps.[ext] |
Generic steps reusable across domains: login, navigation, time manipulation, basic CRUD |
| API | api_steps.[ext] |
HTTP request/response steps: sending requests, checking status codes, validating response bodies |
| Database | db_steps.[ext] |
Database assertion steps: checking row counts, verifying column values, seeding test data |
| Domain-specific | {domain}_steps.[ext] |
Steps unique to a business domain: billing calculations, notification rules, auth policies |
If the target step file exists, append new definitions. If not, create it using the matching template from templates/.
Step Definition Rules (FR-0KTg-020)
Every new step definition must include:
- A docstring (Python) or doc comment (Go, TypeScript) describing what the step does
- Parameter descriptions with types in the docstring
- A
TODO: implement stepplaceholder body (not an empty body)
Index Maintenance Rules (FR-0KTg-029)
Both bdd/features/INDEX.md and bdd/steps/INDEX.md must be updated together after any generation. Never leave partial index state — updating one without the other could introduce drift.
Reference Files
| File | Description |
|---|---|
| references/scaffold.md | Scaffold creation and index validation procedure (Steps 2a-2h) |
| references/exploration.md | Codebase exploration for generic feature names (Steps 2-exp-a to 2-exp-e) |
| references/generation.md | Feature file and step definition generation (Steps 3-pre to 3d) |
| templates/ | Individual file templates (INDEX.md, world modules, features, steps) |
| references/splitting.md | Feature file splitting when scenario count exceeds 15 (Step 3e) |