# Personal stack profiles are private — never commit a real one.
# Only the example template is tracked; the router loads profiles/*.md, and the
# template's .template suffix keeps it from being auto-loaded.
profiles/*
!profiles/example.md.template

# Private internal-name denylist (check-invariants.sh check 3) — a tracked
# copy would disclose the names it exists to suppress. CI uses the
# SOTA_DENYLIST repository secret instead.
.denylist.local

# Local-only working notes — field reports, handoff briefs, scratch analyses.
# These routinely name private repos, internal hosts and customer detail, and this
# repository is PUBLIC. Added 2026-08-26 after FIELD-REPORT-*.local.md sat untracked
# but NOT ignored while `git add -A` ran several times in the same session; it escaped
# only because it was created afterwards. The convention is a `.local.` infix.
*.local.md
*.local.txt
*.local.json

# OS / editor cruft
.DS_Store
*.swp
*~

# Python bytecode (evals harness is run, not imported, but tests may import it)
__pycache__/
*.pyc

# Local secrets (OPENROUTER_API_KEY etc.) — never commit
.env

# Eval duration ledger — machine-local by design (a duration is only
# comparable on the same machine/network); see evals/_elapsed.py.
evals/results/durations.tsv

# draw.io desktop writes a .$<name>.bkp beside a file while exporting it.
# Generating the skill map renders every page, so these appear in docs/ on any run.
.$*.bkp

# Offline copies of external sources and analysis outputs (large, often licence-restricted:
# e.g. CC BY-SA text that must not enter this CC BY repo). Kept locally for lookup, never committed.
/offline/

# local embedding cache for scripts/semantic-dup-scan.py (RELEASING.md §2d); hundreds of MB
.cache/
