# Python
__pycache__/
*.py[cod]
.venv/
venv/
*.egg-info/
build/
dist/

# Engine runtime data (PHI may live here — never commit)
*.db
*.db-wal
*.db-shm
*.pid
out/
harness_io/
*.log

# One-time bootstrap admin credential written next to the store (consumed + deleted by the operator) — never commit
bootstrap-admin.txt

# Secrets / credentials — never commit (no such files exist today; these are foot-gun guards)
.env
.env.*
*.key
*.pem
*.pfx
secrets/

# Container deployment secrets + TLS material — never commit (the *.example templates ARE tracked)
/docker/secrets.env
/docker/tls/

# are never committed. Ignore every samples/ subdirectory by DEFAULT rather than naming the partner
# here — fail-closed, so a new unlisted staging dir cannot reach a public repo just because nobody
# remembered to add a rule. The shipped example dirs are re-included explicitly.
/samples/*/
!/samples/config/
!/samples/consistency/
!/samples/dicom/
!/samples/ech-sidecar/
!/samples/generators/
!/samples/messages/
!/samples/results_relay/
# Generated, regenerable test corpus (build with: python -m messagefoundry.generators.adt). MUST come
# after the un-ignores above, or the re-included parent would drag it back in.
/samples/messages/adt/
# Workflow agent self-verification temp dirs (an isolated copy of a ported migration module + codesets
# + fixture for a check/dryrun). Customer-estate-derived — never commit. Delete after a porting batch.
/_verify_*/
# exports). Customer data — NEVER commit. `git archive` (the publish path) excludes it by
# construction; this is the local-only working area.
/migration-local/

# Tooling
.mypy_cache/
.ruff_cache/
.pytest_cache/
.vscode/
.idea/

# CI-only quality artifacts (generated by .github/workflows/quality-advisory.yml, and by anyone
# reproducing those jobs locally). None of these were ignored before, which mattered: the C901 delta
# inputs are ruff JSON carrying ABSOLUTE local paths, so a local `git add -A` would stage a home
# directory path straight into a commit -- exactly what scripts/security/scan_forbidden.py fires on.
coverage.xml
.coverage
diff-cover.md
jscpd-report/
.mutmut-cache
mutants/
mutmut-run.txt
mutmut-results.txt
c901-head.json
c901-base.json
base-tree/

# Claude Code: settings.json is shared/tracked; settings.local.json is machine-local (never commit)
.claude/settings.local.json

# Local reference notes pointing at machine-specific Claude Code transcript paths — never commit
TRANSCRIPTS.md

# Local planning/marketing/security working docs — keep out of the repo
# (docs/DUAL_LICENSING_PLAN.md is now a committed artifact — see ADR 0017 / #13 licensing)
/docs/marketing/
/docs/security/CISO-REVIEW.md
/docs/security/DEPENDENCY-POSTURE-REVIEW.md
/docs/security/DEPENDENCY-RESPONSE-PLAN.md
/docs/security/DEPENDENCY-CUSTOMER-OFFERINGS.md
/docs/security/DEPENDENCY-RESPONSE-HANDOFF.md
/docs/security/DEPENDENCY-RESPONSE-A3-HANDOFF.md
/docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
# vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
/docs/security/metrics/

# Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
# OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
# Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
/harness/load/profiles/hospital-baseline.toml
/harness/load/profiles/soak-12h.toml
# Deep-research survey of alternative OSS DB backends for the shared-DB commit-wall — local working
# note, not a committed artifact (the conclusion is carried in the throughput ADRs / AI memory).
/docs/research/db-commit-wall-backend-survey.md

# --- MessageFoundry ---
.mefor/
*.db*
.DS_Store
Thumbs.db

# Agent/web-fetch debris dropped in the repo ROOT (e.g. blog.html, contest.txt, free.html) — never
# commit. Anchored to root (leading /) so tracked *.html/*.txt UNDER subdirs (docs/, samples/,
# scripts/, packaging/, messagefoundry/auth/data/…) are unaffected; no *.html/*.txt is legitimately
# tracked at the repo root, so an anchored catch-all is safe. Force-add (git add -f) if one ever is.
/*.html
/*.txt
/*.yml

# The real customer/vendor token list consumed by scripts/security/scan_forbidden.py at
# commit time. Only the SYNTHETIC scan-tokens.local.txt.example is ever committed.
#
# Deliberately unconditional, and listed ahead of the scanner it serves: an operator creates
# this file before the tooling that references it exists, so ignoring the path up front
# removes any window in which a real token list sits un-ignored in a working tree.
scripts/security/scan-tokens.local.txt

# --- Private-only paths (formerly enforced by scripts/publish/publish-denylist.txt) ---------------
# The cutover RETIRES the publish deny-list. On the private repo these were TRACKED and stripped from
# the mirror at publish time; with the deny-list gone and development happening directly on the public
# repo, a gitignore rule is now the ONLY thing keeping them out of a commit -- and the cutover runbook
# runs `git add -A`. Same failure shape as the leak-scanner token file, different files.
#
# DELIBERATELY NOT LISTED: tests/test_scan_forbidden.py, tests/test_anon_core.py and
# .github/dependabot.yml. Those were deny-listed too, but this change set publishes synthetic/public
# versions of them -- ignoring them here would silently drop content that is meant to ship.
# PUBLISHED by this change (removed from the list above): CLAUDE.md, docs/BACKLOG.md and
# docs/WORKTREES.md. All three were scanned and carry no customer/estate tokens (BACKLOG.md needed a
# two-line redaction). CLAUDE.md in particular MUST be tracked: it is gitignored-by-default's worst
# case here, because `git worktree add` cannot deliver an untracked file, so every worktree silently
# came up with ZERO project conventions loaded.
/.claude/
/TRANSCRIPTS.md
/docs/security/
/docs/reviews/
/docs/marketing/
# Deliberately still private, each for a different reason:
#   docs/security/      — 32 files of posture/risk-register detail; an attacker roadmap.
#   docs/reviews/       — review findings, same reason.
#   docs/CI-TOPOLOGY.md — STALE: it documents the retired private-repo/public-mirror split and
#                         scripts/publish/, which the cutover deleted. Publishing it would actively
#                         mislead. Rewrite for the post-cutover topology or delete it.
#   docs/Secure_Development_Standards.md — scans clean, but it was deliberately pulled from the public
#                         PyPI sdist (#1020); reversing that is an owner call, not a side effect.
/docs/CI-TOPOLOGY.md
/docs/Secure_Development_Standards.md
