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

# Virtual environments
.venv/
venv/
env/

# Testing / tooling caches
.pytest_cache/
.pytest-tmp/
.mypy_cache/
.ruff_cache/
.coverage
htmlcov/
coverage.xml

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

# ===== Ferry-specific: DATA SAFETY =====
# Never commit real conversation data or bundles
*.zip
# A sealed bundle. It is encrypted, but it is still every conversation
# you have had, and the default export destination is the working
# directory -- one already landed in the repo root while testing.
*.ferry
*.tar.gz
*.pb
*.jsonl
*.vscdb
*.vscdb-wal
*.vscdb-shm
*.vscdb.backup
*.sqlite
*.sqlite-wal
*.sqlite-shm
*.db
*.db-wal
*.db-shm
*.pbtxt
rollout-*.jsonl

# Self-checks that run against the real conversation stores on this machine --
# local-only by human decision (2026-09-12). They are development aids, named
# after the private plan's milestones. Only the project's own source ships.
scripts/selfcheck/

# Spike/throwaway probe code — ENTIRE folder is local-only (human decision 2026-08-21).
# These scripts read real conversation directories; they are never committed.
spikes/

# Local config that may contain API keys
.ferry/
config.json
.env

# Planning / progress / spike-report docs — local-only by human decision (2026-08-21).
# PLAN.md, PROGRESS.md, SPIKE-FINDINGS.md and anything else about HOW the project is
# being built stay out of git. Only the project's own source ships.
.private/
PLAN.md
PROGRESS.md
SPIKE-FINDINGS.md

# Acceptance checklists — local-only by human decision (2026-08-21). Same reasoning
# as above: it's the human's own working notes while developing, not shipped docs.
docs/ACCEPTANCE.md

# Explicitly allow curated, audited test fixtures
!tests/fixtures/**/*.jsonl
!tests/fixtures/**/*.pb

# Exported bundles are user data, not source. A bundle written into the
# working directory must never be committed - the repo hooks would rewrite
# its whitespace and silently alter exported conversations.
ferry-bundle-*/
