# Python
__pycache__/
*.py[cod]
*.so
.eggs/
*.egg-info/
# setuptools-scm generated
infera/_version.py

# Build / packaging
build/
dist/
# The router the Linux x86_64 wheel bundles; only ever added at release time.
infera/_bin/

# Tooling caches
.pytest_cache/
.ruff_cache/
.mypy_cache/

# Virtualenv / env
.venv/
.env

# Editors / OS
.idea/
.vscode/
*.swp
*.log
.DS_Store

# uv-managed lockfile; regenerate via `uv sync` rather than commit.
uv.lock

# Preflight generated reports / JSON
output/
preflight_result/

# Bench artifacts — keep code, exclude generated CSV/PNG/MD/JSON results
bench/**/results/*.csv
bench/**/results/*.png
bench/**/results/*.svg
bench/**/results/*.md
bench/**/results/*.json
bench/kv_cache_cliff/results/

# Vendored third-party sources (UCX / RIXL) — too large, fetch/build on demand
deploy/docker/third_party/

# Local scratch — not for review.
.review-drafts/
temp/
CLAUDE.md
# A task definition handed to an agent session: local input, never a deliverable.
mission.md
# ...except the shared repo conventions, which are meant for review and for
# everyone's agent sessions. Excluding `.claude/*` rather than `.claude/` is what
# makes the negation possible — git will not descend into an excluded directory,
# so a re-include under `.claude/` would never be reached. Everything else stays
# out: settings.local.json is per-developer, and worktrees/ holds whole nested
# checkouts.
.claude/*
!.claude/CLAUDE.md
.spur_job_*.sh
.spur_ns_*.sh
spur-*.out
