__pycache__/
*.py[cod]
*$py.class
*.egg-info/
dist/
build/
.eggs/
*.egg
.venv/
.venv-sidecar/
venv/
env/
.env
*.wav
*.mp3
*.mp4
*.mov
*.avi
*.mkv
output/
.mypy_cache/
.pytest_cache/
.ruff_cache/
.coverage
coverage.xml
htmlcov/
.DS_Store
.claude/scheduled_tasks.lock
.claude/agents/*.bak-*
# Private UXR trial data stays ignored. FOSSDA is explicitly open-source
# material (fossda.org) used as a public perf-baseline dataset, so its
# perf-baselines/ subdir is whitelisted for tracking.
trial-runs/*
!trial-runs/fossda-opensource/
trial-runs/fossda-opensource/*
!trial-runs/fossda-opensource/perf-baselines/
!trial-runs/fossda-opensource/perf-baselines/**
.nova/
plan.md
git-cheatsheet.md
docs/private/
_comparison/

# Personal mail-ops / triage notes — developer's own workflow, not for the public repo
docs/design-inbox-triage.md

# Bristlenose log files (created by pipeline runs and serve mode)
bristlenose.log
bristlenose.log.*

# Per-run pipeline state dir (db, llm-calls.jsonl, log, intermediate JSON).
# Created wherever the tool is run from (e.g. repo root via `serve`/`run`).
# Carries re-identification keys — never commit. The committed smoke-test
# fixture is re-included surgically below (events + intermediate JSON only;
# logs and db stay ignored even inside the fixture).
.bristlenose/
!tests/fixtures/**/.bristlenose/
!tests/fixtures/**/.bristlenose/pipeline-events.jsonl
!tests/fixtures/**/.bristlenose/intermediate/
!tests/fixtures/**/.bristlenose/intermediate/**

# Local font files for typography mockups (proprietary/large, not committed)
docs/mockups/fonts/*.ttf
docs/mockups/fonts/*.woff2
docs/mockups/fonts/*.otf

# Frontend build artifacts (regenerated by npm run build)
node_modules/
bristlenose/server/static/
*.tsbuildinfo

# Stress-test runtime snapshot (written by the Playwright spec when run
# directly, without the orchestrator setting $STRESS_RESULTS_PATH).
e2e/stress-results.json

# Desktop app — bundled binaries and Xcode build artifacts
desktop/Bristlenose/Resources/bristlenose-sidecar/
desktop/Bristlenose/Resources/ffmpeg
desktop/Bristlenose/Resources/ffprobe
desktop/Bristlenose/Resources/models/
desktop/build/
desktop/DerivedData/
desktop/testtest/
# Xcode user data (per-developer state, not shared)
**/xcuserdata/
**/*.xcuserstate
.playwright-mcp/

# Thematic-analysis spike output (private corpus data derived from gitignored trial-runs)
experiments/thematic-spike/output/
experiments/thematic-spike/**/__pycache__/

# Stray worktree dirs from spawned background sessions
.claude/worktrees/

# Stray frontend trial-run output (should never live here)
frontend/trial-runs/

# Per-worktree branch handoff symlink (points into .claude/plans/<branch>.md)
HANDOFF.md

# Session-handoff sentinels (per-worktree state, not for the repo)
.claude/setup-incomplete
.claude/last-end-session.json

# End-session Durable-artefact audit telemetry (per-worktree, gitignored)
.claude/audit-log.jsonl

# Local backups of agent prompts (e.g. .bak-pre-hig-corpus-YYYY-MM-DD)
.claude/agents/*.bak-*

# hookify rule files (local convention; per-machine, not committed)
.claude/hookify.*.local.md

# Generated build provenance (baked into the sidecar bundle at build time)
bristlenose/_build_info.py
# Regenerated every Xcode build by the "Generate Build Info" run-script phase
# (generate-build-info.sh) before Compile Sources — never commit (churns -dirty).
desktop/Bristlenose/Bristlenose/GeneratedBuildInfo.swift
