__pycache__/
*.py[cod]
.pytest_cache/
.hypothesis/
.mypy_cache/
.ruff_cache/
.coverage*
htmlcov/
*.egg-info/
.venv/
dist/
build/
site/

# Private agent working area (dotagents link is a symlink; a directory-only
# `.agents/` pattern would not match it, so this must stay slashless).
.agents
CLAUDE*
.claude

# Unshared per-machine overrides. `AGENTS.local.md` is the dangerous one: it
# sits beside an `AGENTS.md` that is *supposed* to ship, under a nearly
# identical name and with the opposite destination, and it carries local
# paths, hostnames and sometimes credentials. The manifest excludes the same
# pattern; both teeth are needed, and neither is automatic.
*.local.*

# Root dotfiles only. Unanchored, `.*` also matched every nested dotfile and
# dot-directory -- a `tests/.golden/` fixture or a vendored `.config` would
# have been ignored with nothing to say so. The slashless `.agents`,
# `CLAUDE*` and `.claude` rules above are deliberately NOT anchored, because
# a nested copy of those is exactly what must not be committed.
/.*
!/.gitignore
!/.gitattributes
# Directory form: git cannot re-include a file below an excluded directory,
# so `.github/` itself has to be un-ignored, not just the files under it.
!/.github/

# Run logs. `summarize_run.py` writes `run.log` into the working directory,
# and the sdist target excludes only dotfiles -- so a test run from the repo
# root followed by `python -m build` published that log once already.
run.log
*.log

# OS and editor droppings.
.DS_Store
Thumbs.db
*.swp
*~

