doc-bdd-fixer

📁 vladm3105/aidoc-flow-framework 📅 8 days ago
9
总安装量
9
周安装量
#32679
全站排名
安装命令
npx skills add https://github.com/vladm3105/aidoc-flow-framework --skill doc-bdd-fixer

Agent 安装分布

codex 9
amp 8
github-copilot 8
kimi-cli 8
gemini-cli 8
cursor 8

Skill 文档

doc-bdd-fixer

Purpose

Automated fix skill that reads the latest audit/review report and applies fixes to BDD (Behavior-Driven Development) documents. This skill bridges the gap between doc-bdd-reviewer/doc-bdd-audit (which identify issues) and the corrected BDD, enabling iterative improvement cycles.

Layer: 4 (BDD Quality Improvement)

Upstream: BDD document, Audit/Review Report (BDD-NN.A_audit_report_vNNN.md preferred, BDD-NN.R_review_report_vNNN.md legacy), EARS (source requirements)

Downstream: Fixed BDD, Fix Report (BDD-NN.F_fix_report_vNNN.md)


When to Use This Skill

Use doc-bdd-fixer when:

  • After Review: Run after doc-bdd-reviewer identifies issues
  • Iterative Improvement: Part of Review -> Fix -> Review cycle
  • Automated Pipeline: CI/CD integration for quality gates
  • Batch Fixes: Apply fixes to multiple BDD based on review reports

Do NOT use when:

  • No audit/review report exists (run doc-bdd-audit or doc-bdd-reviewer first)
  • Creating new BDD (use doc-bdd or doc-bdd-autopilot)
  • Only need validation (use doc-bdd-validator)

Skill Dependencies

Skill Purpose When Used
doc-bdd-audit Preferred source of normalized findings Input (reads audit report)
doc-bdd-reviewer Legacy/alternate source of issues to fix Input (reads review report)
doc-naming Element ID standards Fix element IDs
doc-bdd BDD creation rules Create missing sections
doc-ears-reviewer Upstream EARS validation Check upstream alignment

Workflow Overview

flowchart TD
  A[Input: BDD Path] --> B[Find Latest Audit/Review Report]
  B --> C{Report Found?}
  C -->|No| D[Run doc-bdd-audit or doc-bdd-reviewer First]
  C -->|Yes| E[Parse Report]

    E --> F[Categorize Issues]

    subgraph FixPhases["Fix Phases"]
        F --> F0[Phase 0: Fix Structure Violations]
        F0 --> G[Phase 1: Create Missing Files]
        G --> H[Phase 2: Fix Broken Links]
        H --> I[Phase 3: Fix Element IDs]
        I --> J[Phase 4: Fix Content Issues]
        J --> K[Phase 5: Update References]
        K --> K2[Phase 6: Handle Upstream Drift]
    end

    K2 --> L[Write Fixed BDD]
    L --> M[Generate Fix Report]
    M --> N{Re-run Review?}
    N -->|Yes| O[Invoke doc-bdd-reviewer]
    O --> P{Score >= Threshold?}
    P -->|No, iterations < max| F
    P -->|Yes| Q[COMPLETE]
    N -->|No| Q

Fix Phases

Phase 0: Fix Structure Violations (CRITICAL)

Fixes BDD documents that are not in nested folders. This phase runs FIRST because all subsequent phases depend on correct folder structure.

Nested Folder Rule: ALL BDD documents MUST be in nested folders regardless of document size.

Required Structure:

BDD Type Required Location
Markdown docs/04_BDD/BDD-NN_{slug}/BDD-NN_{slug}.md
Feature docs/04_BDD/BDD-NN_{slug}/BDD-NN_{slug}.feature

Fix Actions:

Issue Code Issue Fix Action
REV-STR001 BDD not in nested folder Create folder, move file, update all links
REV-STR002 BDD folder name doesn’t match BDD ID Rename folder to match
REV-STR003 Monolithic BDD >25KB should be sectioned Flag for manual review

Structure Fix Workflow:

def fix_bdd_structure(bdd_path: str) -> list[Fix]:
    """Fix BDD structure violations."""
    fixes = []

    filename = os.path.basename(bdd_path)
    parent_folder = os.path.dirname(bdd_path)

    # Extract BDD ID and slug from filename (supports .md and .feature)
    match = re.match(r'BDD-(\d+)_([^/]+)\.(md|feature)', filename)
    if not match:
        return []  # Cannot auto-fix invalid filename

    bdd_id = match.group(1)
    slug = match.group(2)
    expected_folder = f"BDD-{bdd_id}_{slug}"

    # Check if already in nested folder
    if os.path.basename(parent_folder) != expected_folder:
        # Create nested folder
        new_folder = os.path.join(os.path.dirname(parent_folder), expected_folder)
        os.makedirs(new_folder, exist_ok=True)

        # Move file
        new_path = os.path.join(new_folder, filename)
        shutil.move(bdd_path, new_path)
        fixes.append(f"Moved {bdd_path} to {new_path}")

        # Update upstream links in moved file
        content = Path(new_path).read_text()
        updated_content = content.replace('../03_EARS/', '../../03_EARS/')
        updated_content = updated_content.replace('../02_PRD/', '../../02_PRD/')
        Path(new_path).write_text(updated_content)
        fixes.append(f"Updated relative links for nested folder structure")

    return fixes

Link Path Updates After Move:

Original Path Updated Path
../03_EARS/EARS-01_slug/EARS-01.md ../../03_EARS/EARS-01_slug/EARS-01.md
../02_PRD/PRD-01_slug/PRD-01.md ../../02_PRD/PRD-01_slug/PRD-01.md

Phase 1: Create Missing Files

Creates files that are referenced but don’t exist.

Scope:

Missing File Action Template Used
BDD-00_GLOSSARY.md Create BDD glossary Glossary template
BDD-NN_STEP_DEFS.md Create step definitions placeholder Step Defs template
Feature files (*.feature) Create placeholder with TODO sections Feature template
Shared context files Create placeholder Context template

BDD Glossary Template:

---
title: "BDD-00: Behavior Glossary"
tags:
  - bdd
  - glossary
  - reference
custom_fields:
  document_type: glossary
  artifact_type: BDD-REFERENCE
  layer: 4
---

# BDD-00: Behavior Glossary

Common terminology used across all BDD Feature Documents.

## Gherkin Keywords

| Term | Definition | Context |
|------|------------|---------|
| Feature | High-level behavior description | Feature header |
| Scenario | Specific test case | Test definition |
| Scenario Outline | Parameterized scenario | Data-driven tests |
| Given | Precondition setup | Context |
| When | Action trigger | Event |
| Then | Expected outcome | Assertion |
| And | Additional step | Continuation |
| But | Negative continuation | Exception |
| Background | Shared preconditions | Reusable setup |
| Examples | Data table for outlines | Test data |

## Step Definition Terms

| Term | Definition | Context |
|------|------------|---------|
| Step Definition | Code binding for Gherkin step | Implementation |
| World | Shared context object | State management |
| Hook | Before/After lifecycle method | Setup/teardown |
| Tag | Scenario/Feature annotation | Filtering |

## Domain Terms

<!-- Add project-specific terminology below -->

| Term | Definition | Context |
|------|------------|---------|
| [Term] | [Definition] | [Where used] |

Feature Placeholder Template:

# language: en
# encoding: UTF-8

@placeholder @needs-completion
Feature: [Feature Name]
  As a [role]
  I want [capability]
  So that [benefit]

  # TODO: Created by doc-bdd-fixer as placeholder
  # Complete this feature file to resolve broken link issues

  Background:
    Given [TODO: Define shared preconditions]

  @todo
  Scenario: [TODO: Define scenario name]
    Given [TODO: Define precondition]
    When [TODO: Define action]
    Then [TODO: Define expected outcome]

Step Definitions Placeholder Template:

---
title: "BDD Step Definitions: [Module Name]"
tags:
  - bdd
  - step-definitions
  - reference
custom_fields:
  document_type: step-definitions
  status: placeholder
  created_by: doc-bdd-fixer
---

# BDD Step Definitions: [Module Name]

> **Status**: Placeholder - Requires completion

## 1. Overview

[TODO: Document step definitions overview]

## 2. Given Steps

| Step Pattern | Implementation | Status |
|--------------|----------------|--------|
| `Given [pattern]` | [TODO] | Placeholder |

## 3. When Steps

| Step Pattern | Implementation | Status |
|--------------|----------------|--------|
| `When [pattern]` | [TODO] | Placeholder |

## 4. Then Steps

| Step Pattern | Implementation | Status |
|--------------|----------------|--------|
| `Then [pattern]` | [TODO] | Placeholder |

## 5. Shared Helpers

[TODO: Document shared helper functions]

---

*Created by doc-bdd-fixer as placeholder. Complete this document to resolve broken link issues.*

Phase 2: Fix Broken Links

Updates links to point to correct locations.

Fix Actions:

Issue Code Issue Fix Action
REV-L001 Broken internal link Update path or create target file
REV-L002 External link unreachable Add warning comment, keep link
REV-L003 Absolute path used Convert to relative path
REV-L004 Broken EARS reference Update to correct EARS path
REV-L005 Broken feature file reference Update or create feature file

Path Resolution Logic:

def fix_link_path(bdd_location: str, target_path: str) -> str:
    """Calculate correct relative path based on BDD location."""

    # Monolithic BDD: docs/04_BDD/BDD-01.md
    # Sectioned BDD: docs/04_BDD/BDD-01_slug/BDD-01.3_section.md
    # Feature files: tests/bdd/features/*.feature

    if is_sectioned_bdd(bdd_location):
        # Need to go up one more level
        return "../" + calculate_relative_path(bdd_location, target_path)
    else:
        return calculate_relative_path(bdd_location, target_path)

EARS Link Fix:

BDD Type Original Link Fixed Link
Monolithic ../03_EARS/EARS-01.md ../03_EARS/EARS-01.md
Sectioned ../03_EARS/EARS-01.md ../../03_EARS/EARS-01.md

Feature File Link Fix:

BDD Type Original Link Fixed Link
Monolithic ../../tests/bdd/features/auth.feature ../../tests/bdd/features/auth.feature
Sectioned ../../tests/bdd/features/auth.feature ../../../tests/bdd/features/auth.feature

Phase 3: Fix Element IDs

Converts invalid element IDs to correct format.

Conversion Rules:

Pattern Issue Conversion
BDD.NN.01.SS Code 01 invalid for BDD BDD.NN.35.SS (Feature Spec)
BDD.NN.25.SS Code 25 invalid for BDD BDD.NN.36.SS (Scenario Spec)
BDD.NN.22.SS Code 22 invalid for BDD BDD.NN.37.SS (Step Definition)
FEAT-XXX Legacy pattern BDD.NN.35.SS
SCEN-XXX Legacy pattern BDD.NN.36.SS
STEP-XXX Legacy pattern BDD.NN.37.SS

Type Code Mapping (BDD-specific valid codes: 35, 36, 37):

Invalid Code Valid Code Element Type
01 35 Feature Specification
02 36 Scenario Specification
03 37 Step Definition
05 36 Scenario Specification
06 37 Step Definition
22 35 Feature Specification
25 36 Scenario Specification
26 37 Step Definition

Regex Patterns:

# Find element IDs with invalid type codes for BDD
invalid_bdd_type_01 = r'BDD\.(\d{2})\.01\.(\d{2})'
replacement_01 = r'BDD.\1.35.\2'

invalid_bdd_type_25 = r'BDD\.(\d{2})\.25\.(\d{2})'
replacement_25 = r'BDD.\1.36.\2'

invalid_bdd_type_22 = r'BDD\.(\d{2})\.22\.(\d{2})'
replacement_22 = r'BDD.\1.37.\2'

# Find legacy patterns
legacy_feat = r'###\s+FEAT-(\d+):'
legacy_scen = r'###\s+SCEN-(\d+):'
legacy_step = r'###\s+STEP-(\d+):'

Phase 4: Fix Content Issues

Addresses placeholders, incomplete content, and BDD-specific syntax issues.

Fix Actions:

Issue Code Issue Fix Action
REV-P001 [TODO] placeholder Flag for manual completion (cannot auto-fix)
REV-P002 [TBD] placeholder Flag for manual completion (cannot auto-fix)
REV-P003 Template date YYYY-MM-DD Replace with current date
REV-P004 Template name [Name] Replace with metadata author or flag
REV-P005 Empty section Add minimum template content
REV-B001 Missing Gherkin keyword Flag for manual review
REV-B002 Invalid scenario structure Flag for manual review
REV-B003 Missing Given/When/Then Flag for manual review
REV-B004 Orphan step definition Flag for manual review

Auto-Replacements:

replacements = {
    'YYYY-MM-DDTHH:MM:SS': datetime.now().strftime('%Y-%m-%dT%H:%M:%S'),
    'YYYY-MM-DD': datetime.now().strftime('%Y-%m-%d'),
    'MM/DD/YYYY': datetime.now().strftime('%m/%d/%Y'),
    '[Current date]': datetime.now().strftime('%Y-%m-%dT%H:%M:%S'),
    '[Feature Name]': extract_feature_name_from_metadata(),
}

Gherkin Structure Validation:

Pattern Type Required Structure Auto-Fix
Feature Feature: [name] + user story format No (flag)
Scenario Scenario: [name] + Given/When/Then No (flag)
Scenario Outline Scenario Outline + Examples table No (flag)
Background Background: + Given steps only No (flag)
Step Given/When/Then/And/But + description No (flag)

Phase 5: Update References

Ensures traceability and cross-references are correct.

Fix Actions:

Issue Fix Action
Missing @ref: for created files Add reference tag
Incorrect cross-BDD path Update to correct relative path
Missing EARS traceability Add EARS reference with @trace: EARS-NN
Missing traceability entry Add to traceability matrix
Missing feature tag Add appropriate tag

Traceability Format:

<!-- Traceability to EARS -->
@trace: EARS-01.25.01 -> BDD-01.35.01

<!-- Reference to upstream -->
@ref: [EARS-01 Section 3](../03_EARS/EARS-01.md#3-functional-requirements)

Tag Traceability in Feature Files:

@trace:EARS-01.25.01 @feature:BDD-01.35.01
Feature: User Authentication

Phase 6: Handle Upstream Drift (Auto-Merge)

Addresses issues where upstream EARS documents have changed since BDD creation. Uses a tiered auto-merge system based on change percentage to automatically incorporate new requirements.

6.0.1 Hash Validation Fixes

FIX-H001: Invalid Hash Placeholder

Trigger: Hash contains placeholder instead of SHA-256

Fix:

sha256sum <upstream_file_path> | cut -d' ' -f1

Update cache with: sha256:<64_hex_output>

FIX-H002: Missing Hash Prefix

Trigger: 64 hex chars but missing sha256: prefix

Fix: Prepend sha256: to value

FIX-H003: Upstream File Not Found

Trigger: Cannot compute hash (file missing)

Fix: Set drift_detected: true, add to manual review

Code Description Auto-Fix Severity
FIX-H001 Replace placeholder hash with actual SHA-256 Yes Error
FIX-H002 Add missing sha256: prefix Yes Warning
FIX-H003 Upstream file not found Partial Error

Upstream: EARS (Layer 3) Downstream: ADR (Layer 5)


6.1 Change Percentage Calculation

Calculate drift percentage by comparing EARS content hashes:

def calculate_change_percentage(
    original_ears_hash: str,
    current_ears_hash: str,
    original_content: str,
    current_content: str
) -> float:
    """Calculate percentage of content changed in upstream EARS."""

    if original_ears_hash == current_ears_hash:
        return 0.0

    # Line-based diff calculation
    original_lines = set(original_content.strip().split('\n'))
    current_lines = set(current_content.strip().split('\n'))

    added_lines = current_lines - original_lines
    removed_lines = original_lines - current_lines

    total_original = len(original_lines)
    if total_original == 0:
        return 100.0 if current_lines else 0.0

    change_percentage = (len(added_lines) + len(removed_lines)) / total_original * 100
    return round(change_percentage, 2)

6.2 Tiered Auto-Merge Thresholds

Tier Change % Action Version Increment User Approval
Tier 1 < 5% Auto-merge new scenarios Patch (1.0.0 -> 1.0.1) No
Tier 2 5-15% Auto-merge with detailed changelog Minor (1.0.1 -> 1.1.0) No
Tier 3 > 15% Archive current, trigger regeneration Major (1.1.0 -> 2.0.0) Yes (recommended)

6.3 Tier 1: Minor Drift (< 5%)

Trigger: Small additions or clarifications in upstream EARS.

Actions:

  1. Parse new EARS requirements not covered by existing BDD scenarios
  2. Generate new scenarios with auto-generated tags
  3. Append to appropriate feature file
  4. Increment patch version

Auto-Generated Scenario Tag Format:

@BDD-{NN}-SC-{SS}

Where:

  • NN = BDD document number (01-99)
  • SC = Scenario identifier
  • SS = Sequential scenario number (01-99)

Example:

# Auto-merged from EARS-01 drift (2026-02-10)
@BDD-01-SC-13 @auto-merged @trace:EARS-01.25.12
Scenario: User receives notification on password expiry
  Given a user with password expiring in 7 days
  When the daily notification job runs
  Then the user receives an expiry warning email

Tier 1 Changelog Entry:

### v1.0.1 (2026-02-10) - Patch

**Drift Merge**: Tier 1 (3.2% change detected in EARS-01)

| Added Scenarios | Tag | Source |
|-----------------|-----|--------|
| User receives notification on password expiry | @BDD-01-SC-13 | EARS-01.25.12 |

6.4 Tier 2: Moderate Drift (5-15%)

Trigger: Significant additions or modifications in upstream EARS.

Actions:

  1. Parse all new/modified EARS requirements
  2. Generate new scenarios for additions
  3. Mark existing scenarios for review if source requirement modified
  4. Generate detailed changelog
  5. Increment minor version

Detailed Changelog Format:

### v1.1.0 (2026-02-10) - Minor

**Drift Merge**: Tier 2 (8.7% change detected in EARS-01, EARS-02)

#### New Scenarios Added

| Scenario | Tag | Feature File | Source |
|----------|-----|--------------|--------|
| User receives notification on password expiry | @BDD-01-SC-13 | auth.feature | EARS-01.25.12 |
| Admin can force password reset | @BDD-01-SC-14 | auth.feature | EARS-01.25.13 |
| Session timeout configurable per role | @BDD-01-SC-15 | session.feature | EARS-02.25.05 |

#### Scenarios Marked for Review

| Scenario | Tag | Reason | Source Change |
|----------|-----|--------|---------------|
| User authenticates with valid credentials | @BDD-01-SC-01 | Source requirement modified | EARS-01.25.01 v2 |

#### Upstream Changes Summary

| Document | Sections Changed | Lines Added | Lines Removed |
|----------|------------------|-------------|---------------|
| EARS-01.md | 3.1, 3.5, 4.2 | 24 | 6 |
| EARS-02.md | 5.1 | 8 | 0 |

Review Marker for Modified Source:

# REVIEW: Source requirement EARS-01.25.01 modified on 2026-02-10
# Original: "User must authenticate with username and password"
# Updated: "User must authenticate with username and password or SSO"
@BDD-01-SC-01 @needs-review @trace:EARS-01.25.01
Scenario: User authenticates with valid credentials
  # ... existing steps ...

6.5 Tier 3: Major Drift (> 15%)

Trigger: Substantial changes indicating major requirement evolution.

Actions:

  1. Archive current BDD version
  2. Create archive manifest
  3. Trigger regeneration workflow
  4. Increment major version

No Deletion Policy:

Existing scenarios are NEVER deleted. Instead:

# DEPRECATED: Superseded by EARS-01 v3 changes (2026-02-10)
# Reason: Authentication flow redesigned to support SSO-only mode
# Archive: BDD-01_v1.1.0_archive/auth.feature
@BDD-01-SC-01 @deprecated @archive:v1.1.0
Scenario: User authenticates with username and password
  # ... existing steps preserved ...

Archive Manifest Creation:

Location: docs/04_BDD/BDD-{NN}_v{X.Y.Z}_archive/MANIFEST.md

---
title: "BDD-01 Archive Manifest v1.1.0"
tags:
  - bdd
  - archive
  - manifest
custom_fields:
  archive_date: "2026-02-10T16:00:00"
  archive_reason: "Tier 3 drift (22.4% change in EARS-01)"
  original_version: "1.1.0"
  new_version: "2.0.0"
  triggering_upstream: "EARS-01 v3"
---

# BDD-01 Archive Manifest v1.1.0

## Archive Summary

| Field | Value |
|-------|-------|
| Archived Version | 1.1.0 |
| Archive Date | 2026-02-10T16:00:00 |
| Reason | Tier 3 upstream drift (22.4% change) |
| Triggering Upstream | EARS-01 v3 |
| New Version | 2.0.0 (regeneration triggered) |

## Archived Files

| File | Scenarios | Status |
|------|-----------|--------|
| BDD-01.md | - | Archived |
| auth.feature | 5 | 3 deprecated, 2 preserved |
| session.feature | 3 | 1 deprecated, 2 preserved |
| api.feature | 8 | 4 deprecated, 4 preserved |

## Deprecated Scenarios

| Tag | Scenario | Deprecation Reason |
|-----|----------|-------------------|
| @BDD-01-SC-01 | User authenticates with username and password | SSO-only authentication in v3 |
| @BDD-01-SC-02 | User fails authentication with wrong password | Replaced by SSO error handling |
| @BDD-01-SC-05 | Password complexity validation | Removed - SSO handles auth |

## Preserved Scenarios

| Tag | Scenario | Preserved In |
|-----|----------|--------------|
| @BDD-01-SC-03 | User session expires after timeout | BDD-01 v2.0.0 |
| @BDD-01-SC-04 | User can logout from all devices | BDD-01 v2.0.0 |

## Regeneration Trigger

Command to regenerate BDD from updated EARS:

```bash
/doc-bdd-autopilot EARS-01 --version 2.0.0 --preserve-from BDD-01_v1.1.0_archive

---

#### 6.6 Enhanced Drift Cache

After processing drift issues, update `.drift_cache.json`:

```json
{
  "bdd_id": "BDD-01",
  "bdd_version": "1.1.0",
  "bdd_updated": "2026-02-10T16:00:00",
  "drift_reviewed": "2026-02-10T16:00:00",
  "upstream_type": "EARS",
  "downstream_type": "ADR",
  "upstream_hashes": {
    "EARS-01.md": {
      "hash": "a1b2c3d4e5f6...",
      "version": "2.0",
      "last_checked": "2026-02-10T16:00:00"
    },
    "EARS-02.md": {
      "hash": "e5f6g7h8i9j0...",
      "version": "1.5",
      "last_checked": "2026-02-10T16:00:00"
    }
  },
  "merge_history": [
    {
      "date": "2026-02-08T10:00:00",
      "tier": 1,
      "change_percentage": 3.2,
      "version_before": "1.0.0",
      "version_after": "1.0.1",
      "scenarios_added": ["@BDD-01-SC-10"],
      "scenarios_deprecated": [],
      "upstream_trigger": "EARS-01 v1.8"
    },
    {
      "date": "2026-02-10T16:00:00",
      "tier": 2,
      "change_percentage": 8.7,
      "version_before": "1.0.1",
      "version_after": "1.1.0",
      "scenarios_added": ["@BDD-01-SC-13", "@BDD-01-SC-14", "@BDD-01-SC-15"],
      "scenarios_deprecated": [],
      "upstream_trigger": "EARS-01 v2.0, EARS-02 v1.5"
    }
  ],
  "acknowledged_drift": [
    {
      "document": "EARS-03.md",
      "acknowledged_date": "2026-02-09",
      "reason": "Documentation-only change - no BDD impact"
    }
  ],
  "next_scenario_number": 16
}

6.7 Auto-Merge Workflow

flowchart TD
    A[Detect Upstream Drift] --> B[Calculate Change %]
    B --> C{Change < 5%?}

    C -->|Yes| D[Tier 1: Auto-Merge]
    D --> D1[Generate new scenarios]
    D1 --> D2[Add @BDD-NN-SC-SS tags]
    D2 --> D3[Increment patch version]
    D3 --> E[Update drift cache]

    C -->|No| F{Change 5-15%?}

    F -->|Yes| G[Tier 2: Auto-Merge + Changelog]
    G --> G1[Generate new scenarios]
    G1 --> G2[Mark modified for review]
    G2 --> G3[Generate detailed changelog]
    G3 --> G4[Increment minor version]
    G4 --> E

    F -->|No| H[Tier 3: Archive + Regenerate]
    H --> H1[Archive current version]
    H1 --> H2[Create archive manifest]
    H2 --> H3[Mark deprecated scenarios]
    H3 --> H4[Trigger regeneration]
    H4 --> H5[Increment major version]
    H5 --> E

    E --> I[Update .drift_cache.json]
    I --> J[Generate Fix Report]

6.8 Drift Issue Codes

Code Severity Description Tier Auto-Fix
REV-D001 Info EARS modified after BDD (< 5%) 1 Yes (auto-merge)
REV-D002 Warning EARS modified after BDD (5-15%) 2 Yes (auto-merge + changelog)
REV-D003 Info EARS version incremented 1-2 Yes (update version ref)
REV-D004 Info New requirements added to EARS 1-2 Yes (generate scenarios)
REV-D005 Warning Critical EARS modification (> 15%) 3 Partial (archive + trigger regen)
REV-D006 Info Scenario added via auto-merge N/A (informational)
REV-D007 Warning Scenario marked @deprecated 3 Yes (add deprecation marker)

6.9 Drift Acknowledgment Workflow

When drift is flagged but no BDD update is needed:

  1. Run /doc-bdd-fixer BDD-01 --acknowledge-drift
  2. Fixer prompts: “Review drift for EARS-01.md?”
  3. User confirms no BDD changes needed
  4. Fixer adds to acknowledged_drift array
  5. Future reviews skip this drift until upstream changes again

Command Usage

Basic Usage

# Fix BDD based on latest review
/doc-bdd-fixer BDD-01

# Fix with explicit review report (legacy)
/doc-bdd-fixer BDD-01 --review-report BDD-01.R_review_report_v001.md

# Fix with explicit audit report (preferred)
/doc-bdd-fixer BDD-01 --review-report BDD-01.A_audit_report_v001.md

# Fix and re-run review
/doc-bdd-fixer BDD-01 --revalidate

# Fix with iteration limit
/doc-bdd-fixer BDD-01 --revalidate --max-iterations 3

Options

Option Default Description
--review-report latest Specific audit/review report to use (.A_audit_report preferred)
--revalidate false Run reviewer after fixes
--max-iterations 3 Max fix-review cycles
--fix-types all Specific fix types (comma-separated)
--create-missing true Create missing reference files
--backup true Backup BDD before fixing
--dry-run false Preview fixes without applying
--acknowledge-drift false Interactive drift acknowledgment mode
--update-drift-cache true Update .drift_cache.json after fixes
--fix-features true Also fix linked .feature files

Report Selection Precedence:

  1. Select latest report by timestamp.
  2. If timestamps are equal, prefer BDD-NN.A_audit_report_vNNN.md over BDD-NN.R_review_report_vNNN.md.

Fix Types

Type Description
missing_files Create missing glossary, step defs, feature files
broken_links Fix link paths
element_ids Convert invalid/legacy element IDs
content Fix placeholders, dates, names
references Update traceability and cross-references
drift Handle upstream drift detection issues
gherkin Fix Gherkin syntax issues (limited)
all All fix types (default)

Output Artifacts

Fix Report

Nested Folder Rule: ALL BDD suites use nested folders (BDD-NN_{slug}/). Fix reports are stored alongside the BDD feature files in the nested folder.

File Naming: BDD-NN.F_fix_report_vNNN.md

Location: Inside the BDD nested folder: docs/04_BDD/BDD-NN_{slug}/

Structure:

---
title: "BDD-NN.F: Fix Report v001"
tags:
  - bdd
  - fix-report
  - quality-assurance
custom_fields:
  document_type: fix-report
  artifact_type: BDD-FIX
  layer: 4
  parent_doc: BDD-NN
  source_review: BDD-NN.A_audit_report_v001.md
  fix_date: "YYYY-MM-DDTHH:MM:SS"
  fix_tool: doc-bdd-fixer
  fix_version: "1.0"
---

# BDD-NN Fix Report v001

## Summary

| Metric | Value |
|--------|-------|
| Source Review | BDD-NN.A_audit_report_v001.md (or legacy `BDD-NN.R_review_report_v001.md`) |
| Issues in Review | 12 |
| Issues Fixed | 10 |
| Issues Remaining | 2 (manual review required) |
| Files Created | 3 |
| Files Modified | 5 |
| Feature Files Fixed | 2 |

## Files Created

| File | Type | Location |
|------|------|----------|
| BDD-00_GLOSSARY.md | Behavior Glossary | docs/04_BDD/ |
| BDD-01_STEP_DEFS.md | Step Definitions Placeholder | docs/04_BDD/ |
| auth_placeholder.feature | Feature Placeholder | tests/bdd/features/ |

## Fixes Applied

| # | Issue Code | Issue | Fix Applied | File |
|---|------------|-------|-------------|------|
| 1 | REV-L001 | Broken glossary link | Created BDD-00_GLOSSARY.md | BDD-01.3_scenarios.md |
| 2 | REV-L004 | Broken EARS reference | Updated path to ../03_EARS/EARS-01.md | BDD-01.1_core.md |
| 3 | REV-N004 | Element type 01 invalid | Converted to type 35 | BDD-01.1_core.md |
| 4 | REV-L005 | Broken feature file link | Created auth_placeholder.feature | BDD-01.2_features.md |

## Feature File Fixes

| File | Fixes Applied |
|------|---------------|
| auth.feature | Added @trace tag, fixed step reference |
| api.feature | Updated Examples table format |

## Issues Requiring Manual Review

| # | Issue Code | Issue | Location | Reason |
|---|------------|-------|----------|--------|
| 1 | REV-B001 | Missing Gherkin keyword | BDD-01.2:L45 | Scenario syntax needed |
| 2 | REV-B003 | Missing Given/When/Then | auth.feature:L32 | Step structure required |

## Validation After Fix

| Metric | Before | After | Delta |
|--------|--------|-------|-------|
| Review Score | 92 | 97 | +5 |
| Errors | 2 | 0 | -2 |
| Warnings | 4 | 1 | -3 |

## Next Steps

1. Complete BDD-01_STEP_DEFS.md placeholder
2. Complete auth_placeholder.feature with proper scenarios
3. Address missing Gherkin keywords in flagged scenarios
4. Run `/doc-bdd-reviewer BDD-01` to verify fixes

Integration with Autopilot

This skill is invoked by doc-bdd-autopilot in the Review -> Fix cycle:

flowchart LR
    subgraph Phase5["Phase 5: Review & Fix Cycle"]
        A[doc-bdd-reviewer] --> B{Score >= 85?}
        B -->|No| C[doc-bdd-fixer]
        C --> D{Iteration < Max?}
        D -->|Yes| A
        D -->|No| E[Flag for Manual Review]
        B -->|Yes| F[PASS]
    end

Autopilot Integration Points:

Phase Action Skill
Phase 5a Run initial review doc-bdd-reviewer
Phase 5b Apply fixes if issues found doc-bdd-fixer
Phase 5c Re-run review doc-bdd-reviewer
Phase 5d Repeat until pass or max iterations Loop

Error Handling

Recovery Actions

Error Action
Audit/review report not found Prompt to run doc-bdd-audit or doc-bdd-reviewer first
Cannot create file (permissions) Log error, continue with other fixes
Cannot parse audit/review report Abort with clear error message
Max iterations exceeded Generate report, flag for manual review
EARS not found Log warning, skip EARS-dependent fixes
Feature file parse error Log error, skip Gherkin fixes for that file

Backup Strategy

Before applying any fixes:

  1. Create backup in tmp/backup/BDD-NN_YYYYMMDD_HHMMSS/
  2. Copy all BDD files and linked feature files to backup location
  3. Apply fixes to original files
  4. If error during fix, restore from backup

Related Skills

Skill Relationship
doc-bdd-audit Preferred combined audit source (input)
doc-bdd-reviewer Provides review report (input)
doc-bdd-autopilot Orchestrates Review -> Fix cycle
doc-bdd-validator Structural validation
doc-naming Element ID standards
doc-bdd BDD creation rules
doc-ears-reviewer Upstream EARS validation

Version History

Version Date Changes
2.2 2026-02-27 Migrated frontmatter to metadata; added compatibility for BDD-NN.A_audit_report_vNNN.md (preferred) with legacy BDD-NN.R_review_report_vNNN.md; defined deterministic precedence (latest timestamp, then .A_ over .R_ on ties)
2.1 2026-02-11 Structure Compliance: Added Phase 0 for nested folder rule enforcement (REV-STR001-STR003); Runs FIRST before other fix phases
2.0 2026-02-10 Enhanced Phase 6 with tiered auto-merge system; Added Tier 1 (< 5%) auto-merge with patch version; Added Tier 2 (5-15%) auto-merge with detailed changelog and minor version; Added Tier 3 (> 15%) archive and regeneration with major version; Implemented no-deletion policy with @deprecated markers; Added archive manifest creation; Enhanced drift cache with merge history; Added scenario tag pattern @BDD-NN-SC-SS; Defined EARS as upstream, ADR as downstream
1.0 2026-02-10 Initial skill creation; 6-phase fix workflow; Glossary, step definitions, and feature file creation; Element ID conversion for BDD codes (35, 36, 37); Broken link fixes including feature files; EARS drift detection; Gherkin syntax validation; Integration with autopilot Review->Fix cycle