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

# Virtual environments
.venv/
venv/
ENV/
env/
env.bak/
venv.bak/
.site-packages/

# Tools
.ruff_cache/
.mypy_cache/
.pytest_cache/
.ipynb_checkpoints/
.hypothesis/
.coverage
htmlcov/
.virtual_documents/

# Editors
.idea/
.vscode/
*~
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Logs
*.log

# Secrets
.env

# Databases
*.sqlite3
*.db

# Datasets and embeddings: large, regenerable, never in the repo
data/

# Experiment results: the TABLES are versioned, the figures are not.
# A run's numbers are a few KB and expensive to reproduce, so cross-dataset
# tables can be assembled later without reruns; figures are derived from
# those numbers and cost megabytes.
# Note the `results/**` form - with `results/` git never descends into the
# directory and the negations below would silently do nothing.
results/**
!results/**/
!results/**/*.csv
!results/**/*.json
notebooks/**/checkpoints/
notebooks/**/output.txt

# Notebook helpers (output tee, metrics). They will be versioned when the
# notebooks land; until then the folder exists only in the working copy and
# a `git add .` would otherwise commit it into a library-only release.
# Delete these two lines together with the notebooks commit.
utils/

# Session artifacts (working notes, drafts, migration staging)
tmp/

# Agent and assistant tooling. A local setup is fine; none of it belongs in
# the repository. AGENTS.md is the deliberate exception - it defines how an
# agent must behave here and most tools read it. Which assistant a
# contributor runs is their own business.
.claude/
CLAUDE.md
.cursor/
.cursorrules
.cursorignore
.aider*
.windsurf/
.windsurfrules
.clinerules
.roo/
.roomodes
.continue/
.codeium/
.gemini/
GEMINI.md
.junie/
.amazonq/
.kiro/
.opencode/
.qodo/
.tabnine*
.mcp.json
.github/copilot-instructions.md
AGENT.md
.agent/
