.venv
.env
.git
.mypy_cache
__pycache__
dist
*.egg-info
venv
research/

# Repo-internal material. The image runs `python server.py` (Dockerfile CMD) and
# nothing below is on that path, but `COPY . .` takes the whole build context, so
# each has to be named. .dockerignore is independent of .gitignore: a gitignored
# file still enters the context on a hand-run `fly deploy` from a working tree.
# CI builds from actions/checkout and never sees the untracked ones at all.
.claude/
docs/
tests/
dashboard.json

# Bare patterns match only at the context root, so nested caches need `**/`.
# `.mypy_cache` and `__pycache__` above are root-only and missed tests/.mypy_cache.
**/__pycache__
**/.mypy_cache
**/.pytest_cache
**/.ruff_cache

# Second pass: the rest of the repo-internal surface. Same reasoning — none of
# it is reachable from `python server.py`. Checked before excluding: neither
# fly.toml has a release_command, so nothing runs scripts/ at deploy time, and
# no runtime module reads a repo file (sanctions.py's only open() calls are on
# tempfile.mkstemp downloads).
CLAUDE.md
LAUNCHGUIDE.md
.github/
.mcp.json
scripts/
examples/
.gitignore
.dockerignore

# Deliberately kept: LICENSE and the policy set (PRIVACY.md, TERMS.md,
# SECURITY.md) plus README.md. Small, and a distributed image is the wrong place
# to strip its own licence and policy terms.
