agentleFS
marcusgollmarcusgoll/Spec-Flow/.claude/skills/regression-test-generator/SKILL.md

regression-test-generator

Skill94 starsChanged 6 months agoMITView on GitHub

Generate regression tests when bugs are discovered during /debug or continuous checks. Auto-detects test framework, creates Arrange-Act-Assert tests, and links to error-log.md entries. (project)

We split this skill into the rules it gives an agent

35 rules. About 0 are common, 30 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈30

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Verify correct behavior (passes after fix)

    line 9
  2. Distinctive:

    Before generating regression test:

    line 26
  3. Distinctive:

    Check error-log.md to avoid duplicate tests for same error.

    line 32
  4. Distinctive:

    Check project configuration (in priority order):

    line 65
  5. Distinctive:

    Document assumption in test file comment

    line 95
  6. Very specific:

    Check if tests/regression/ exists → use it

    line 105
  7. Distinctive:

    Check project test structure:

    line 106
  8. Very specific:

    Create tests/regression/ if no pattern found

    line 110
  9. Very specific:

    Use framework-appropriate template from references/framework-templates.md.

    line 123
  10. Distinctive:

    A (Save): Write file, run test, update error-log.md

    line 176
  11. Distinctive:

    If bug not yet fixed: Test should FAIL (proves bug exists)

    line 188
  12. Distinctive:

    If bug already fixed: Test should PASS (validates fix)

    line 189
  13. Distinctive:

    Validation: Test file exists, runs without syntax errors, linked in error-log.md.

    line 201
  14. Distinctive:

    After generating regression test, verify:

    line 206
  15. Distinctive:

    Test file created in correct location

    line 208
  16. Distinctive:

    Test follows project naming conventions

    line 209
  17. Distinctive:

    Test uses Arrange-Act-Assert pattern

    line 210
  18. Distinctive:

    Test has clear name describing expected behavior

    line 211
  19. Distinctive:

    Test runs without syntax errors

    line 214
  20. Distinctive:

    Test behavior matches expectations (fails before fix OR passes after) </validation>

    line 215
  21. Distinctive:

    Don't: Test implementation details

    line 220
  22. Distinctive:

    Do: Test observable behavior

    line 229
  23. Distinctive:

    Don't: Use fragile DOM selectors

    line 243
  24. Distinctive:

    Do: Use accessible selectors

    line 250
  25. Distinctive:

    Don't: Create test without linking to error

    line 261
  26. Distinctive:

    Don't: Write E2E test for unit-level bug

    line 282
  27. Distinctive:

    Write test names that describe expected behavior:

    line 295
  28. Distinctive:

    No error reference (no traceability)

    line 384
  29. Very specific:

    Solution: Check package.json, pyproject.toml manually.

    line 393
  30. Distinctive:

    Issue: No existing test directory

    line 395
  31. Very specific:

    Solution: Create tests/regression/ and document in test file comment

    line 396
  32. Distinctive:

    Issue: Test passes before fix applied

    line 398
  33. Distinctive:

    Solution: Test may not be reproducing bug correctly.

    line 399
  34. Distinctive:

    Issue: Test fails after fix applied

    line 401
  35. Distinctive:

    Test location strategies (monorepo, co-located, centralized)

    line 411

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md
<objective> Automatically generate regression tests that capture bugs to prevent recurrence. Creates complete, framework-appropriate tests that: 1. Reproduce the bug scenario (fails before fix) 2. Verify correct behavior (passes after fix) 3. Link back to error-log.md for traceability </objective>

<quick_start> Generate regression test for a bug:

  1. Collect bug details: error ID, symptoms, root cause, affected component
  2. Detect test framework from project (Jest, Vitest, pytest, Playwright)
  3. Generate test file following project patterns
  4. Present to user for review: [A] Save [B] Edit [C] Skip
  5. Save test to tests/regression/ and update error-log.md

Key principle: Tests should FAIL before the fix is applied (proves bug exists). </quick_start>

<prerequisites> Before generating regression test: - Bug has been identified with symptoms and reproduction steps - Root cause determined (from 5 Whys or debugging) - Component/file affected is known - Error ID assigned (ERR-XXXX) or will be assigned

Check error-log.md to avoid duplicate tests for same error. </prerequisites>

<workflow> <step number="1"> **Collect bug details**

Extract from debug context:

  • Error ID: ERR-XXXX from error-log.md (or generate new)
  • Title: Brief description (e.g., "Dashboard timeout due to missing pagination")
  • Symptoms: Observable behavior (error message, incorrect output)
  • Root cause: Why the bug occurred (from 5 Whys analysis)
  • Component: Affected file/function (e.g., StudentProgressService.fetchExternalData)
  • Reproduction steps: How to trigger the bug

Example:

error_id: ERR-0042
title: Dashboard timeout due to missing pagination
symptoms: Dashboard fails to load, timeout after 30s
root_cause: Missing pagination parameter causes over-fetching
component: src/services/StudentProgressService.ts:fetchExternalData
reproduction:
  - Navigate to /dashboard/student/123
  - Click "Load Data" button
  - Observe timeout error
</step><step number="2"> **Detect test framework**

Check project configuration (in priority order):

  1. docs/project/tech-stack.md (if exists):
    grep -i "test\|jest\|vitest\|pytest\|playwright" docs/project/tech-stack.md
  2. package.json (JavaScript/TypeScript):
    # Check devDependencies
    grep -E '"(jest|vitest|@playwright/test|mocha)"' package.json
  3. pyproject.toml / requirements.txt (Python):
    grep -E "(pytest|unittest|nose)" pyproject.toml requirements.txt
  4. Existing test file patterns:
    # JavaScript patterns
    find . -name "*.test.ts" -o -name "*.spec.ts" | head -1
    
    # Python patterns
    find . -name "*_test.py" -o -name "test_*.py" | head -1
  5. Defaults:
    • JavaScript/TypeScript: Jest
    • Python: pytest
    • Document assumption in test file comment

Output: Framework name and test file extension (e.g., Jest → .test.ts) </step>

<step number="3"> **Determine test file location**

Find appropriate location:

  1. Check if tests/regression/ exists → use it
  2. Check project test structure:
    • tests/ directory → tests/regression/
    • __tests__/ directory → __tests__/regression/
    • Co-located tests (same dir as source) → src/__tests__/regression/
  3. Create tests/regression/ if no pattern found

File naming:

  • Format: regression-ERR-{ID}-{slug}.{ext}
  • Slug: lowercase kebab-case from title
  • Examples:
    • regression-ERR-0042-dashboard-timeout.test.ts
    • test_regression_err_0042_dashboard_timeout.py</step>
<step number="4"> **Generate test code**

Use framework-appropriate template from references/framework-templates.md.

Structure (Arrange-Act-Assert):

Header: Error ID, title, description, root cause, link to error-log

describe/class: "Regression: ERR-XXXX - {title_short}"
  test: "should {expected} when {condition}"
    ARRANGE: Set up bug scenario (data, mocks, state)
    ACT: Execute action that caused bug
    ASSERT: Verify correct behavior (would have failed before fix)

Required elements:

  • Error ID reference in comment header
  • Link to error-log.md entry
  • Clear test name describing expected behavior
  • Setup code matching reproduction steps
  • Assertion that validates the fix

See references/framework-templates.md for complete templates. </step>

<step number="5"> **Present to user for review**

Display generated test:

=== Regression Test Generated ===

Error: ERR-0042 - Dashboard Timeout Due to Missing Pagination

File: tests/regression/regression-ERR-0042-dashboard-timeout.test.ts

--- Generated Test Code ---
[Full test code here]
---

This test will:
- {describe what test validates}
- {explain why test would have failed before fix}

What would you like to do?
  [A] Save test and continue
  [B] Edit test before saving
  [C] Skip generation (add to debt tracker)

>

If user chooses:

  • A (Save): Write file, run test, update error-log.md
  • B (Edit): Show edit instructions, wait for confirmation
  • C (Skip): Log skip reason in NOTES.md as technical debt</step>
<step number="6"> **Save and verify**

After user approval:

  1. Write test file to determined location
  2. Run test to verify:
    • If bug not yet fixed: Test should FAIL (proves bug exists)
    • If bug already fixed: Test should PASS (validates fix)
  3. Update error-log.md with regression test reference:
**Regression Test**:
- **File**: `tests/regression/regression-ERR-0042-dashboard-timeout.test.ts`
- **Status**: Generated
- **Validates**: Pagination parameter prevents timeout
  1. Stage file for commit (do not auto-commit)

Validation: Test file exists, runs without syntax errors, linked in error-log.md. </step> </workflow>

<validation> After generating regression test, verify:
  • Test file created in correct location
  • Test follows project naming conventions
  • Test uses Arrange-Act-Assert pattern
  • Test has clear name describing expected behavior
  • Error ID referenced in test header comment
  • error-log.md updated with test reference
  • Test runs without syntax errors
  • Test behavior matches expectations (fails before fix OR passes after)</validation>

<anti_patterns> <pitfall name="implementation_testing"> Don't: Test implementation details

// BAD: Tests internal method name
test('calls _fetchWithPagination', () => {
  expect(service._fetchWithPagination).toHaveBeenCalled();
});

Do: Test observable behavior

// GOOD: Tests behavior user expects
test('should return paginated results within 5 seconds', async () => {
  const result = await service.fetchData(studentId);
  expect(result.length).toBeLessThanOrEqual(10);
});

Why: Implementation can change; behavior should remain stable. </pitfall>

<pitfall name="brittle_selectors"> **Don't**: Use fragile DOM selectors
// BAD: Breaks if CSS class changes
await page.locator('.btn-primary-xl-dashboard').click();

Do: Use accessible selectors

// GOOD: Stable, user-focused
await page.getByRole('button', { name: 'Load Data' }).click();

Why: Regression tests should be stable across refactors. </pitfall>

<pitfall name="no_error_link"> **Don't**: Create test without linking to error
// BAD: No reference to error-log.md
test('dashboard loads', () => { /* ... */ });

Do: Include error ID and link

/**
 * Regression Test for ERR-0042
 * @see specs/my-feature/error-log.md#ERR-0042
 */
test('should load dashboard within 5s (ERR-0042)', () => { /* ... */ });

Why: Traceability enables understanding why test exists. </pitfall>

<pitfall name="testing_wrong_layer"> **Don't**: Write E2E test for unit-level bug

Do: Match test type to bug scope:

  • Logic error in function → Unit test
  • Integration failure → Integration test
  • User flow broken → E2E test

Why: Faster feedback, more stable tests, easier maintenance. </pitfall> </anti_patterns>

<best_practices> <practice name="behavior_focused_names"> Write test names that describe expected behavior:

  • Format: should {expected} when {condition}
  • Examples:
    • should return paginated results when dataset exceeds 100 records
    • should complete within 5 seconds when loading dashboard
    • should show error message when API returns 500

Result: Test serves as documentation, failures are self-explanatory. </practice>

<practice name="minimal_reproduction"> Include only setup necessary to reproduce bug:
// Include: State that triggers bug
const service = new StudentProgressService();
const result = await service.fetchData(studentWithLargeDataset);

// Exclude: Unrelated setup
// const userPrefs = loadPreferences(); // Not needed for this test

Result: Faster tests, clearer intent, easier maintenance. </practice>

<practice name="assert_specific"> Make assertions specific to the bug:
// BAD: Vague assertion
expect(result).toBeTruthy();

// GOOD: Specific to bug being prevented
expect(result.length).toBeLessThanOrEqual(10); // Pagination limit
expect(response.time).toBeLessThan(5000); // No timeout

Result: Test catches regressions, not false positives. </practice>

<practice name="document_context"> Include context in test file header:
/**
 * Regression Test for ERR-0042: Dashboard Timeout
 *
 * Bug: Dashboard failed to load due to missing pagination
 * Root Cause: API call fetched all records (1000+) instead of paginated (10)
 * Fixed: Added page_size parameter to API call
 *
 * @see specs/001-dashboard/error-log.md#ERR-0042
 */

Result: Future developers understand why test exists. </practice> </best_practices>

<success_criteria> Regression test generation complete when:

  • Bug details collected (error ID, symptoms, root cause, component)
  • Test framework detected from project
  • Test file location determined (follows project patterns)
  • Test code generated with Arrange-Act-Assert structure
  • Test presented to user for review
  • User approved (A) or edited (B) test
  • Test file written to correct location
  • Test runs without syntax errors
  • error-log.md updated with regression test reference
  • Test file staged for commit </success_criteria>

<quality_standards> Good regression test:

  • Clear name describing expected behavior
  • Error ID in test name or comment
  • Link to error-log.md entry
  • Minimal setup (only what's needed to reproduce)
  • Specific assertion (fails if bug reoccurs)
  • Uses accessible selectors (E2E tests)
  • Follows project test patterns

Bad regression test:

  • Generic name (test1, dashboard test)
  • No error reference (no traceability)
  • Tests implementation details
  • Brittle selectors or timing-dependent
  • Vague assertions (toBeTruthy)
  • Doesn't actually catch the bug if reintroduced </quality_standards>
<troubleshooting> **Issue**: Can't detect test framework **Solution**: Check package.json, pyproject.toml manually; ask user to specify

Issue: No existing test directory Solution: Create tests/regression/ and document in test file comment

Issue: Test passes before fix applied Solution: Test may not be reproducing bug correctly; review reproduction steps

Issue: Test fails after fix applied Solution: Assertion may be testing wrong behavior; adjust to match expected post-fix state

Issue: User skips too many regression tests Solution: Track in NOTES.md as tech debt; surface during /optimize phase </troubleshooting>

<references> See references/ for: - Framework templates (Jest, Vitest, pytest, Playwright) - Test location strategies (monorepo, co-located, centralized) - Example regression tests (good vs bad patterns) - Integration with error-log.md </references>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.