# Private local notes (never for git)
doc/local/

# Folders
ocr_output/
pdf-ocr-markdown/
pdfs_to_process/
pdfs-done/
math/
# Live runtime DBs (restored via `make snapshot-restore` from snapshots/parquet/)
memory/

# Local embedding model artifact (bge-small-en-v1.5 GGUF, ~35MB; fetched via
# the documented download command + sha256 pin in helpers/core/local_embedder.py)
models/
# Local scratch: gzip snapshots + raw *_backup.* copies (NOT for git; the
# tracked, restore-able snapshot lives in snapshots/parquet/)
db-backup/
# Mojo compiled binaries (machine-local build artifacts; `make mojo-build`)
Mojo/bin/
backup/
output/
venv/
Reports/
Telegram/
findata/**/images
findata/**/*.json
# Exception: triage alias overrides are pipeline state (loaded by
# extract_relations at runtime) and must survive fresh clones.
!findata/Misc/relation_aliases.json
# Exception: discard-persistence noise gate is pipeline state
# (loaded by extract_relations at runtime) and must survive fresh
# clones — same survive-fresh-clone doctrine as relation_aliases.
!findata/Misc/relation_noise.json
# Exception: quote-capture watchlist is the S0 tripwire lifecycle state
# (quote_coverage_audit.py) — gitignored triage state is lost on fresh
# clones (proposal S2/S0 amendment doctrine). Home: findata/Misc/ (S4
# follow-up — catch-all note + its state files live together).
!findata/Misc/quote_coverage_watchlist.json
# Exception: S2 resolver worklist (unresolved canonicals + fuzzy
# suggestions) and user-approved quote aliases (read by
# derive_insights._resolve_ladder) — same survive-fresh-clones doctrine.
!findata/Misc/quote_entity_worklist.json
!findata/Misc/quote_aliases.json
!findata/Misc/quote_stub_backlog.json
!findata/Misc/quote_g2_backlog.json
!findata/Misc/quote_g4sec_backlog.md
!findata/Misc/quote_g3_discards.jsonl
!findata/Misc/quote_accepted_losses.jsonl
# triage_pending_quotes run artifacts (regenerated each report run)
findata/Misc/quote_triage_report.md
findata/Misc/quote_triage_decisions.jsonl
findata/Misc/_pending_relations.txt

# AI Config folders
.llxprt/
.gemini/
.kilocode
.qwen
.serena
.agent
.clavix
.commandcode
.opencode
.vibe
.zcode
.zcodeignore
.chrome-profile
.codemachine/
.agents/
.claude/
.playwright-cli/
skills-lock.json

# RipWire config
.ripwire_quality_acks
.ripwire_quality_baseline

# Python cache
__pycache__/
*.pyc
*.jar
.pytest_cache/

# Coverage output (make cover)
htmlcov/
.coverage
.coverage.*

# Environment variables
.env
.venv
.envrc

# Tool settings
coc-settings.json
.vim/
opencode.json

# Frontend: the built bundle (static/findata.bundle.js*) is committed so the
# Python deploy stays Node-free; only the TypeScript deps are git-ignored.
frontend/node_modules/

# Temporary files
uploads/
output/
# Local run-report dir (generated by make qa / perf / maint / validators;
# gitignored like bench_data — all seven *_report.md live here)
outputs/

# OS-specific files
.DS_Store
Thumbs.db
uv.lock

# Generated triage queue from extract_relations.py (repo root)
# (all run reports — gate/perf/maint/validator/enrichment — live under
# outputs/ — see above)
# Visual QA screenshots (web-gui-tester evidence)
gui-test-screenshots/
findata/Misc/_pending_suggestions.txt
findata/Misc/_pending_triage_report.md
findata/Misc/_pending_triage_decisions.jsonl

# Large derived parquet artifacts - rebuilt locally on every db-sync; tracked
# copies burned ~85 MB of repo history per refresh (GH warns 50 MB, blocks 100 MB)
snapshots/parquet/sqlite/note_search_content.parquet
snapshots/parquet/duckdb/v_note_embeddings.parquet

# Hypergraph data benchmark pulls (proposal S20; machine-local, NOT for git;
# original sources on Google Drive per cs.cornell.edu/~arb/data pages)
bench_data/
