# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Virtual environments
venv/
ENV/
env/
.venv

# uv
.uv/
# uv.lock is deliberately TRACKED (#191): CI syncs with --locked, so a run is a
# function of the commit alone. Changing a dependency means committing the
# regenerated lock — see CONTRIBUTING.md.

# Testing
.pytest_cache/
.coverage
coverage.json
htmlcov/
.tox/
.hypothesis/

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

# OS
.DS_Store
Thumbs.db

# Project specific
db/generated/
db/schema_history/*.sql
*.db
*.sqlite
*.sql.bak

# Rust
target/
# Cargo.lock is deliberately TRACKED (#191). The convention "libraries ignore
# their lock" applies to crates other Rust crates depend on; confiture-core is
# `crate-type = ["cdylib"]` — a final artefact bundled into the published wheel
# — so Cargo's own guidance is to commit it. `cargo clippy -- -D warnings` is
# otherwise the same trap as the Python tree: a new upstream crate release can
# turn an unrelated PR red.

# Documentation
docs/_build/
site/

# Development artifacts (archived, not part of production)
.development/
.phases/

# Claude development artifacts
.claude/*.md

# Internal development notes (do not commit)
*ANALYSIS*.md
*_ANALYSIS.md
RUST_BINDINGS.md
SEED_DATA_ANALYSIS.md
*SUMMARY*.txt
*SUMMARY*.md
*_COMPLETE.md
*_IMPACT.md
*_ASSESSMENT.md
ISSUE_*_FIX*.md
.plan.md
.phase*.md
TRINITY_*.md
DOCUMENTATION_DELIVERABLES.txt
