# --- Secrets: structurally un-committable. Force-allow only *.example templates. ---
.env
.env.*
!*.example
*.tfvars
!*.tfvars.example
*.tfstate
*.tfstate.*
*.pem
*.key
*.p12
id_rsa
id_ed25519
credentials.json
service-account*.json

# --- OS / editor cruft ---
.DS_Store
Thumbs.db

# --- Python venv created by ./bootstrap.sh ---
.venv/

# --- Dependency / build output (add your stack's — see github.com/github/gitignore) ---
node_modules/
dist/
build/
# mkdocs build --strict output (mkdocs.yml)
site/

# --- Python bytecode and caches ---
__pycache__/
*.py[cod]
.pytest_cache/
.ruff_cache/
.mypy_cache/

# --- Coverage output ---
.coverage
.coverage.*
coverage.xml
htmlcov/

# --- Environment-research probes: disposable experiment code; the kept records
# (README, decisions.jsonl, Lessons.md) beside it stay committed ---
docs/experiments/*/scratch/

# --- AI-assistant working state ---
# Scratch state written by whatever assistant a contributor happens to use. It is
# machine-local and must never become a dependency of the project: nothing in the
# code, the docs or the build may reference it, and deleting it must change
# nothing. Ignored so it cannot be committed by accident.
# One exception: .claude/settings.json is project configuration, not scratch —
# its SessionStart hook runs scripts/cloud-session-start.sh, which brings a
# Claude Code cloud session up to a working Docker daemon and dev environment
# (and exits at once everywhere else).
.superpowers/
.claude/*
!.claude/settings.json

# --- Local-model study: the runner's single-instance lock (scripts/experiment/local_run.py) ---
scripts/experiment/runs/local/.lock
