node_modules/
dist/
.env
.env.local
bun.lock
!scripts/db/backup/bun.lock
coverage/
# Python coverage writes a SQLite database next to the package. It is a build
# artifact that changes on every test run, and it was tracked — so any
# `git add -A` after running the suite committed 750KB of churn.
.coverage
.coverage.*
htmlcov/
.pytest_cache/
# Same class as .coverage above, and it arrived the same way: 117 compiled
# modules were committed by a `git add -A` after a test run. Bytecode rebuilds
# on every run, so it churns a diff it contributes nothing to — and pytest keys
# its rewrite cache on (mtime, size), which is what lets a stale .pyc shadow an
# edited source file.
__pycache__/
*.py[cod]
# Where that bytecode goes now. `packages/sdk-py/scripts/py-tool.sh` sets
# PYTHONPYCACHEPREFIX so compiled modules land here instead of inside
# `src/`/`tests/`, where they are both ignored and inside a source tree — the
# combination `no-ignored-sources` fails on. Sits at the package root, outside
# any source tree, so relocating them satisfies that lint rather than dodging
# it. Clear THIS directory when falsifying a guard.
.pycache/
# The pinned Python toolchain that `bun run init` provisions via
# packages/sdk-py/scripts/ensure-venv.sh. Anchored: only this venv is a
# script-owned build artifact; a stray `.venv` elsewhere should stay visible.
/packages/sdk-py/.venv/
# The e2e harness's uv environment, provisioned by `uv sync` in scripts/e2e-py.
# Anchored for the same reason as the line above. uv also writes a `*`
# .gitignore inside the venv it creates, but relying on that would make the
# ignore a property of the tool rather than of this repository.
/scripts/e2e-py/.venv/
.board-cache/
.DS_Store
.claude/settings.local.json
.claude/mcp.json
specs/shared
.wh
.claude/worktrees/
# Council infrastructure lives in the warmhub-autoresearch component;
# users may symlink it into .claude/ locally.
.claude/commands/autoresearch-council.md
.claude/skills/council-*
.claude/skills/audit-council-run
.claude/skills/autoresearch-council
.agents/skills/council-*
.agents/skills/audit-council-run
.agents/skills/autoresearch-council
skills-lock.json
__azurite_db_blob__.json
__azurite_db_blob_extent__.json
.worktrees/
review-feedback/
# Root-level scratch dir. Anchored: an unanchored `jobs/` matches ANY directory
# named `jobs` at any depth, which silently ignored
# packages/backend/src/admin/repair/jobs/ source files.
/jobs/
demos/**/output/
demos/**/output.old/
demos/**/output-narrated/
demos/**/build.log
demos/**/.superseded/

# Local code review
.pr/
.codex-diff-status.txt
.codex-file-tree.txt
.codex-pr.diff
.codex-review-context.md
.codex-review-turn.diff
.codex-package-graph-audit.md
.codex-static-invariant-audit.md
.codex-code-review-prompt.txt

tasks/friction-diary.md
# NightShift artifacts (auto-added)
.nightshift/raw-events-*
.nightshift/bridge-executions/
.nightshift/triage-output.json
.nightshift/triage-corpus.json
.nightshift/decomposition-output.json
# Per-run state — large, binary, only meaningful to the operator that fired it.
# Hooks + skills (under .nightshift/{hooks,skills}/) ARE tracked because
# they're shared repo policy. Per-run state under .nightshift/{worktrees,runs}/
# and the dogfood SQLite databases is per-operator scratch.
.nightshift/worktrees/
.nightshift/runs/
.nightshift/subtrees/
.nightshift/classifier/
.nightshift/dogfood-*.sqlite3*
.nightshift/*.sqlite3*
# Canonical run DB (+ WAL/SHM sidecars) and rolled-over run history. Stopgap
# until NightShift moves its state out of the working tree (jschilli/nightshift-rs#286);
# the default DB path is currently cwd-relative .nightshift/nightshift.sqlite3.
.nightshift/nightshift.sqlite3*
.nightshift/runs-history/
# Per-run validator log artifacts emitted by .nightshift/skills/run-validation.md.
# In a NightShift worktree the cwd IS the worktree root, so `validations/lint.log`
# etc. show up as repo-root-relative paths in `git status`; ignore globally so a
# validation pass never dirties the tree.
validations/
.playwright-mcp/
.scratch/
screenshots/
apps/web/reports/
preview-env.json

# Transient probe written by @warmhub/pr-reviews CJS resolution test
# (tests/integration/gh-script-runtime.test.ts) — lives in `.github/scripts/`
# because that's the exact lookup path the risk-review shims use in
# production (the package is a workspace dep of @warmhub/ci-scripts).
# Cleaned up via afterEach.
.github/scripts/.pr-reviews-cjs-probe.cjs

# Riptide artifacts (cloud-synced)
.humanlayer/tasks/

# Turborepo
.turbo

# Per-workspace agent scratch files. These are session-local work logs,
# investigation diaries, trace CSVs, and todo lists that should never be
# shared through version control. They accumulate freely during agent
# sessions and previously kept leaking into commits via `git add -A` or
# `git commit -am`. Ignored repo-wide to stop the leak at the source.
_tasks/

# Generated by scripts/test-audit/analyze.ts.
scripts/test-audit/opportunities.json

.claude/scheduled_tasks.lock

# Generated demo assets — narration audio and rendered HTML output
*.mp3
demos/show-n-tell/**/commit-flows.html

# https://github.com/openai/codex/issues/16088
.codex/*
!.codex/prompts/
!.codex/prompts/gc-file-length-remediation.md
# pr-reviews council subagent configs (T33) — checked in so codex's
# project-scoped agent lookup finds them at the repo root in CI.
!.codex/agents/
!.codex/agents/*.toml


apps/veritas-worker/.wrangler/
# Council reviewer (issue #3002) — transient outputs
_runs/council/
_scratch-checkouts/
.codex-feedback--*

# Mutation testing (Stryker) — regenerable reports + temp dirs.
# Stryker's json reporter writes packages/backend/reports/; mutation-runner.ts's
# default report path is packages/backend/stryker/reports/ — ignore both roots.
packages/backend/reports/
packages/backend/stryker/reports/
packages/warmhub-cli/reports/
**/.stryker-tmp/
.stryker-tmp/
# mutation-gate.ts transient stryker/vitest configs (cleaned per run; ignored in case of a crash)
packages/backend/.mutation-gate.*
packages/warmhub-cli/.mutation-gate.*
demos/**/frame-assets/*.png
demos/**/build*.log
