# Python
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
*.egg
dist/
build/
*.whl
.eggs/

# Virtual environments
.venv/
venv/
env/
.conda/

# Testing
.pytest_cache/
.coverage
htmlcov/
.mypy_cache/
.ruff_cache/
.import_linter_cache/

# Local architecture sensor binary
sentrux.exe

# Generated QA facts (regenerate locally with scripts/audit/generate_facts.py)
docs/facts/generated.yaml
docs/audit/latest/facts-summary.md

# Generated QA audit outputs (local evidence; regenerate with full_audit)
docs/audit/full-audit-latest.json
docs/audit/*.local.json
docs/audit/*.tmp.json

# Per-run semantic-duplication scan output (ADR-042 Addendum 2). Only the
# committed baseline is durable; the current snapshot is ephemeral evidence
# emitted by every scan and uploaded as a CI artifact.
docs/audit/baselines/semantic-dup-current.json

# IDE
.idea/
.vscode/
*.swp
*.swo
*~
.project
.classpath
.settings/

# OS
.DS_Store
Thumbs.db
Desktop.ini

# Environment and auth (keys must be in GitHub Secrets, never committed)
.env
*.env.local
.codex/
auth.json

.claude/

# Data (local working data, not tracked)
data/local/
data/cache/
data/artifacts/
data/previews/

# Jupyter
.ipynb_checkpoints/

# Node (frontend)
node_modules/
# `node_modules/` matches directories only. Running the desktop app from a
# worktree wants a symlink of that name pointing at the main checkout's
# install, and a symlink is not a directory — so it slipped past the rule
# above and got committed once (#2057).
node_modules
.next/
desktop/.cache/
# TypeScript incremental build artifact — regenerated by `npm run build`.
# Phase 3.5 integration: previously tracked, caused noisy diffs on every
# rebuild and a hard-to-resolve merge conflict between the two cascade
# tracking branches. Now ignored so each developer / CI run regenerates.
frontend/tsconfig.tsbuildinfo

# Built frontend served by Python backend (not committed, created by CI)
src/scistudio/api/static/

# Playwright e2e run outputs (transient; specs are committed, artifacts are not)
frontend/test-results/
frontend/playwright-report/
frontend/e2e/artifacts/


# Workflow gate state files (local per-developer)
.workflow/active/

# Per-project runtime state surfaced into the workspace's .scistudio/
# directory (MCP port file, ADR-040 Addendum 5 active_workflow.json).
# Defensive: only created if SciStudio's own repo is ever opened as a
# workspace project for testing — user projects ignore .scistudio/
# themselves via their own .gitignore.
.scistudio/

# Workflow gate scratch files. Canonical gate records under
# .workflow/records/*.json are intentionally not ignored.
.workflow/local/
.workflow/scratch/
.workflow/tmp/
.workflow/*.local.json
.workflow/records/*.local.json
.workflow/records/*-scratch.json
.workflow/full-audit-*.json

# Linked git worktrees created inside the checkout for parallel agent work.
# Untracked and unignored, they were visible to the repository-scoped check
# commands: the `ruff check .` fallback linted another agent's worktree and
# failed a commit on files that commit never touched (#2143). Ruff respects
# .gitignore, so ignoring the directory is what keeps a repo-scoped check
# inside this checkout.
.worktrees/

# Scratch audit output (CI writes .audit/full-audit.json; never committed)
.audit/

# Local build counter (#1742): the build number is local-only and resets per
# channel; it must never be committed (would pollute history on every build).
.build-counter.json
