# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
.Python
*.egg-info/
dist/
build/
.eggs/
*.egg

# Virtual environments
.venv/
venv/
env/

# Testing
.pytest_cache/
.coverage
htmlcov/
coverage.xml

# Databases (dev artifacts)
*.db
*.sqlite

# evalgrid runtime
.evalgrid/
.agenteval/
sdr-demo-result.json
sdr-real-result.json
*-results.json
*-result.json
CLAUDE.md
.claude/
.private/

# Node / dashboard
dashboard/node_modules/
dashboard/dist/
dashboard/test-results/
dashboard/integration-results/
dashboard/playwright-report/
dashboard/Scenario

# IDE
.vscode/
.idea/
*.swp
*.swo

# Environment / secrets
.env
.env.local
.env.*.local

# Node (general)
node_modules/

# OS
.DS_Store
Thumbs.db

# Build artifacts
*.whl
*.tar.gz

# mypy cache
.mypy_cache/

# ruff cache
.ruff_cache/
templates/

# Demo artifacts
demo/

# Local research artifacts (private competitive analysis, etc.)
research/

# Living PRD (internal — never publish)
PRD.md

# evalgrid
.evalgrid/results/
.evalgrid/results.db

# Audit / Playwright artifacts (run-local, don't ship)
audit-results/
audit-runs-log.json
dashboard/tests/e2e-audit/test-results/
dashboard/tests/e2e-audit/playwright-report/

# Next.js build output
dashboard/.next/
dashboard/out/
dashboard/next-env.d.ts

# Server runtime logs from background processes
backend.log
dev.log
app.log

# Smoke harness output (Playwright screenshots + findings JSON written by
# scripts/webapp_smoke.py). CI uploads its own copy from smoke-workdir/.
smoke-results/

# NOTE: do NOT gitignore evalgrid/static/**/_index/. Those are the dynamic
# route shells Next.js generates from `generateStaticParams() -> [{id:"_index"}]`
# and the SPA fallback in evalgrid/api/app.py serves them for /runs/<id>.
# Hatchling respects .gitignore for wheel inclusion, so excluding the dirs
# here silently strips them from the wheel — the bug that broke /runs/<id>
# hard refresh in v0.1.3 RC1.
