# Python cache / bytecode
__pycache__/
*.py[cod]

# Environments
.venv/
venv/
env/

# Packaging
dist/
build/
*.egg-info/

# uv auto-generates this on `uv run`/`uv pip` if absent — project's
# dependency source of truth is requirements.txt/requirements-dev.txt
# (CLAUDE.md, Dev environment), not a uv-managed project lockfile.
uv.lock

# Env files — .env.example (if any) stays tracked
.env
.env.local
.env.test

# Dev-tool caches
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
.coverage.*
coverage.json
htmlcov/

# Editor / OS — .vscode/extensions.json is shared, rest is personal
.vscode/*
!.vscode/extensions.json
.idea/
.DS_Store
Thumbs.db

# Claude CLI — sessions/memory local; commands/settings versioned explicitly
.claude/*
!.claude/commands/
!.claude/commands/*.md
!.claude/settings.json
CLAUDE.local.md

# Project docs/memory — local-only as of 2026-08-19 (reversed from the
# earlier "docs/ is deliberately tracked, not scratch space" decision).
# docs/assets/ is the one exception: those files are real published
# assets the public README embeds directly (demo hero SVGs + the
# shields.io coverage-badge endpoint the coverage CI job commits to), not
# documentation, so they stay tracked.
docs/*
!docs/assets/
CLAUDE.md

# Real-document integration test fixtures (2026-08-05): 26/27 are checked
# in — clean, well-documented redistribution licenses (see ATTRIBUTION.md
# + tests/integration/fixtures/manifest.yaml). Exactly one stays
# gitignored: authorship risk (not license risk), explicitly accepted
# 2026-08-04, see that file's manifest.yaml note.
tests/integration/fixtures/docx/iot-report-2022-national-strategies-excerpt.docx
