.mcp.json

# Runtime logs — regenerated by the poller, never version them
logs/*.log
.worktrees/

# Python build byproducts — regenerated by `python -m build`. A stale wheel
# from an old version once got tracked here; if dist/ isn't ignored, every
# future build step's dist/ starts non-empty and the release/publish steps
# ship whatever was left behind alongside the real, current version.
dist/
build/
*.egg-info/

# Local/machine-specific config — never track: direnv exports (could grow a
# literal secret), the Python venv (vendored library bloat, unrelated to the
# ts/ runtime), and personal Claude settings (symlinked to an absolute path
# on the operator's machine — dangling for anyone else who clones the repo,
# and fatal to `python -m build`: tarfile's `filter="data"` safety check
# refuses to package any tar member that is a symlink to an absolute path).
.envrc
.venv/
**/settings.local.json
**/settings.json
**/skills/secret
**/bin/general/rename.sh

# Scratch / local-notes dirs that MUST NOT be published — this is a PUBLIC repo.
# Both names PROMISED exclusion and neither was actually ignored, so the
# pre-stop autosave-rescue (git add -A) committed scratch here, and the
# operator's own instruction to save private notes under ./GITIGNORE/ would have
# published them (card cct-gitignored-dir-is-not-gitignored-name-lies). Ignoring
# both spellings makes the name honest: scratch and any restored
# standing-instructions file stay local. NOTE: already-tracked files under
# GITIGNORED/ stay tracked (gitignore never untracks); untracking those is a
# separate, deliberate call — not a side effect of this rule.
/GITIGNORE/
/GITIGNORED/
