Bug Discovery & Feedback Loops
Automated bug discovery through fuzzing, chaos engineering, property-based testing, and browser discovery with complete feedback loop integration.
Overview
Atom's bug discovery system automatically finds bugs through multiple discovery methods and closes the feedback loop with:
- Automated Discovery: Fuzzing, chaos, property tests, browser exploration
- Unified Pipeline: DiscoveryCoordinator orchestrates all methods
- Automated Filing: BugFilingService creates GitHub Issues
- Regression Tests: RegressionTestGenerator converts bugs to pytest tests
- Fix Verification: BugFixVerifier re-runs tests and auto-closes issues
- ROI Tracking: ROITracker demonstrates value of automation
Quick Start
Run Full Discovery
from tests.bug_discovery.core import run_discovery
import os
result = run_discovery(
github_token=os.getenv("GITHUB_TOKEN"),
github_repository=os.getenv("GITHUB_REPOSITORY"),
duration_seconds=3600 # 1 hour
)
print(f"Bugs found: {result['bugs_found']}")
print(f"Unique bugs: {result['unique_bugs']}")
print(f"ROI: {result['roi_data']['roi_ratio']:.1f}x")
Generate Regression Tests
from tests.bug_discovery.feedback_loops import RegressionTestGenerator
from tests.bug_discovery.models.bug_report import BugReport, DiscoveryMethod, Severity
from datetime import datetime
generator = RegressionTestGenerator()
# Generate test from bug report
bug = BugReport(
discovery_method=DiscoveryMethod.FUZZING,
test_name="test_api_fuzzing",
error_message="SQL injection in agent_id",
error_signature="abc123def4567890",
severity=Severity.CRITICAL
)
test_path = generator.generate_test_from_bug(bug)
print(f"Generated: {test_path}")
Verify Bug Fixes
from tests.bug_discovery.feedback_loops import BugFixVerifier
import os
verifier = BugFixVerifier(
github_token=os.getenv("GITHUB_TOKEN"),
github_repository=os.getenv("GITHUB_REPOSITORY")
)
results = verifier.verify_fixes(label="fix", hours_ago=24)
for r in results:
if r["test_passed"]:
print(f"Issue #{r['issue_number']}: VERIFIED ✅")
else:
print(f"Issue #{r['issue_number']}: FAILED ❌")
Track ROI
from tests.bug_discovery.feedback_loops import ROITracker
tracker = ROITracker()
# Record discovery run
tracker.record_discovery_run(
bugs_found=42,
unique_bugs=35,
filed_bugs=30,
duration_seconds=3600,
by_method={"fuzzing": 20, "chaos": 10, "property": 8, "browser": 4},
by_severity={"critical": 2, "high": 10, "medium": 15, "low": 15}
)
# Generate ROI report
roi_report = tracker.generate_roi_report(weeks=4)
print(f"Hours Saved: {roi_report['hours_saved']:.0f}h")
print(f"Cost Saved: ${roi_report['cost_saved']:,.0f}")
print(f"ROI: {roi_report['roi_ratio']:.1f}x")
Architecture
Discovery Pipeline
DiscoveryCoordinator
↓
1. Fuzzing Discovery (FuzzingOrchestrator)
→ BugReport objects
↓
2. Chaos Discovery (ChaosCoordinator)
→ BugReport objects
↓
3. Property Discovery (pytest)
→ BugReport objects
↓
4. Browser Discovery (Playwright)
→ BugReport objects
↓
5. Aggregation (ResultAggregator)
→ Normalized BugReport list
↓
6. Deduplication (BugDeduplicator)
→ Unique BugReport list
↓
7. Severity Classification (SeverityClassifier)
→ BugReport with severity
↓
8. Bug Filing (BugFilingService)
→ GitHub Issues
↓
9. Regression Tests (RegressionTestGenerator)
→ pytest test files
↓
10. ROI Tracking (ROITracker)
→ Metrics database
↓
11. Report Generation (DashboardGenerator)
→ HTML/JSON reports
Feedback Loops
Discovered Bug
↓
RegressionTestGenerator → test_regression_{method}_{bug_id}.py
↓
Developer fixes bug, labels issue "fix"
↓
BugFixVerifier detects label, re-runs test
↓
Test passes 2x consecutively? → Close issue ✅
Test fails? → Add failure comment, keep open ❌
ROI Calculation
Manual QA Cost:
= bugs_found × manual_qa_hours_per_bug × manual_qa_hourly_rate
= 50 × 2 × $75 = $7,500
Automation Cost:
= duration_seconds / 3600 × developer_hourly_rate
= 3600 / 3600 × $100 = $100
Cost Saved:
= Manual QA Cost - Automation Cost
= $7,500 - $100 = $7,400
Bugs Prevented:
= bugs_found × 10% × bug_production_cost
= 50 × 0.1 × $10,000 = $50,000
Total Savings:
= Cost Saved + Bugs Prevented
= $7,400 + $50,000 = $57,400
ROI Ratio:
= Total Savings / Automation Cost
= $57,400 / $100 = 574x
Directory Structure
backend/tests/bug_discovery/
├── bug_filing_service.py # GitHub Issues automation
├── feedback_loops/ # Feedback loop services
│ ├── __init__.py
│ ├── regression_test_generator.py
│ ├── bug_fix_verifier.py
│ ├── roi_tracker.py
│ ├── tests/
│ │ ├── test_regression_test_generator.py
│ │ ├── test_bug_fix_verifier.py
│ │ ├── test_roi_tracker.py
│ │ └── test_dashboard_enhancements.py
│ └── README.md # Feedback loops documentation
├── core/ # Core orchestration
│ ├── __init__.py
│ ├── discovery_coordinator.py # Main orchestrator
│ ├── result_aggregator.py
│ ├── bug_deduplicator.py
│ ├── severity_classifier.py
│ └── dashboard_generator.py # Report generation
├── models/
│ ├── __init__.py
│ └── bug_report.py # Unified bug model
├── storage/ # Data storage
│ ├── reports/ # Weekly HTML/JSON reports
│ ├── regression_tests/ # Generated regression tests
│ │ ├── archived/ # Verified fixes (archived)
│ │ └── .gitkeep
│ ├── metrics.db # ROI metrics database
│ └── bug_reports.db # Bug database
├── fuzzing/ # Fuzzing tests
├── chaos/ # Chaos engineering tests
├── property_tests/ # Property-based tests
├── browser_discovery/ # Browser discovery tests
└── README.md # This file
Discovery Methods
Fuzzing (FUZZING)
Coverage-guided fuzzing for FastAPI endpoints using Atheris.
What it finds: SQL injection, XSS, CSRF, buffer overflows, parsing errors
Example:
from tests.fuzzing.campaigns.fuzzing_orchestrator import FuzzingOrchestrator
orchestrator = FuzzingOrchestrator(github_token, github_repository)
result = orchestrator.run_campaign_with_bug_filing(
target_endpoint="/api/v1/agents",
test_file="tests/fuzzing/test_agent_api_fuzzing.py",
duration_seconds=900
)
Chaos Engineering (CHAOS)
Controlled failure injection testing resilience.
What it finds: Connection timeouts, memory exhaustion, cascading failures
Example:
from tests.chaos.core.chaos_coordinator import ChaosCoordinator
coordinator = ChaosCoordinator(db_session=test_db, bug_filing_service=filing_service)
result = coordinator.run_experiment(
experiment_name="network_latency_3g",
failure_injection=LatencyInjection,
verify_graceful_degradation=lambda: True,
blast_radius_checks=[assert_blast_radius]
)
Property-Based Testing (PROPERTY)
Hypothesis-based invariant testing.
What it finds: State machine violations, contract violations, edge cases
Example:
pytest tests/property_tests/ -v
Browser Discovery (BROWSER)
Headless browser automation for UI bug detection.
What it finds: Console errors, accessibility violations, broken links
Example:
from tests.browser_discovery.conftest import authenticated_page
page.goto("http://localhost:3000/dashboard")
errors = page.evaluate("() => window.__consoleErrors || []")
assert len(errors) == 0
Configuration
Environment Variables
# GitHub Integration
GITHUB_TOKEN=ghp_xxx # GitHub Personal Access Token
GITHUB_REPOSITORY=owner/repo # Repository for issue filing
# Discovery Configuration
DISCOVERY_DURATION_SECONDS=3600 # Duration per discovery method
ENABLE_REGRESSION_TESTS=true # Generate regression tests
ENABLE_ROI_TRACKING=true # Track ROI metrics
# ROI Cost Assumptions (optional, uses defaults if not set)
MANUAL_QA_HOURLY_RATE=75 # Cost per hour for manual QA
DEVELOPER_HOURLY_RATE=100 # Cost per hour for developer
BUG_PRODUCTION_COST=10000 # Average cost of production bug
MANUAL_QA_HOURS_PER_BUG=2 # Hours to manually find a bug
Pytest Configuration
# pytest.ini
[pytest]
markers =
regression: Marks tests as regression tests
fuzzing: Marks tests as fuzzing tests
chaos: Marks tests as chaos engineering tests
property: Marks tests as property-based tests
browser: Marks tests as browser discovery tests
slow: Marks tests as slow (run in weekly pipeline only)
CI/CD Integration
Weekly Bug Discovery Pipeline
Runs every Sunday at 2 AM UTC:
# .github/workflows/bug-discovery-weekly.yml
on:
schedule:
- cron: '0 2 * * 0' # Sunday 2 AM UTC
jobs:
bug-discovery:
steps:
- uses: actions/checkout@v4
- run: |
python -c "
from tests.bug_discovery.core import run_discovery
run_discovery(
github_token=os.getenv('GITHUB_TOKEN'),
github_repository=os.getenv('GITHUB_REPOSITORY'),
duration_seconds=3600
)
"
Bug Fix Verification Pipeline
Runs every 6 hours to verify fixes:
# .github/workflows/bug-fix-verification.yml
on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours
jobs:
verify-fixes:
steps:
- run: |
python -c "
from tests.bug_discovery.feedback_loops import BugFixVerifier
verifier = BugFixVerifier(...)
verifier.verify_fixes()
"
Best Practices
Writing Regression Tests
Generated regression tests should be reviewed and enhanced:
# Auto-generated (minimal)
def test_regression_fuzzing_abc123de(api_client):
# TODO: Implement test logic
assert True # Placeholder
# Enhanced (manual review)
def test_regression_fuzzing_abc123de(api_client):
"""Regression test for SQL injection in agent_id parameter."""
# Test with malicious input
response = api_client.post("/api/v1/agents", json={
"agent_id": "1 OR 1=1--"
})
# Should reject malicious input
assert response.status_code in [400, 422]
# Test with valid input
response = api_client.post("/api/v1/agents", json={
"agent_id": "valid-uuid"
})
# Should accept valid input
assert response.status_code == 200
Archival Strategy
Regression tests are archived when:
- Bug fix is verified (test passes 2x consecutively)
- GitHub issue is closed
- Test moved to
regression_tests/archived/
Restoration:
If a bug recurs (same error_signature detected):
- Test moved back from
archived/ - Re-run to confirm bug exists
- Re-open GitHub issue if confirmed
Metrics & Effectiveness
Key Metrics
| Metric | Description | Target |
|---|---|---|
| Bugs found per hour | Discovery throughput | > 10/hour |
| Unique bug rate | Deduplication effectiveness | > 70% |
| False positive rate | Bugs not confirmed | < 5% |
| Fix verification rate | Bugs with verified fixes | > 80% |
| ROI ratio | Cost savings vs automation cost | > 10x |
Weekly Report Sections
- Bug Discovery Summary: Bugs found, unique, filed
- ROI Metrics: Hours saved, cost saved, bugs prevented, ROI ratio
- Fix Verification: Fixed, verified, pending counts
- By Method: Breakdown by discovery method
- By Severity: Breakdown by severity
- Top Bugs: Highest priority bugs
Troubleshooting
Regression Test Generation Fails
# Check templates exist
ls backend/tests/bug_discovery/templates/*.j2
# Verify BugReport has required fields
python -c "from tests.bug_discovery.models import BugReport; print(BugReport.__fields__)"
Bug Fix Verification Not Running
# Check GitHub token has repo scope
# Check workflow is enabled in GitHub Actions
# Verify "fix" label exists in repository
ROI Metrics Not Appearing
# Check metrics.db exists
ls backend/tests/bug_discovery/storage/metrics.db
# Verify ROI tracking enabled
python -c "from tests.bug_discovery.core import DiscoveryCoordinator; c = DiscoveryCoordinator(...); print(c.enable_roi_tracking)"
Further Reading
- Bug Discovery Infrastructure
- Feedback Loops Documentation
- Property-Based Testing
- Chaos Engineering
- Fuzzing Guide
Contributing
When adding new discovery methods:
- Create BugReport objects with required fields
- Add method to DiscoveryMethod enum
- Implement aggregation in ResultAggregator
- Update DashboardGenerator templates
- Add regression test template