# Byte-compiled / packaging artifacts
__pycache__/
*.py[cod]
*.egg-info/
.eggs/
build/
dist/

# Virtual environments
.venv/
venv/
env/

# Test / lint caches
.pytest_cache/
.ruff_cache/
.mypy_cache/

# OS / editor
.DS_Store
Thumbs.db
.idea/
.vscode/
*.swp
*.swo
*Zone.Identifier*

# Local secrets — never commit
.env
.env.*
.mcp.json

# Per-machine tool state. `.claude/agents/` and `.claude/commands/` ARE tracked —
# they define the shared agent fleet. Only the local permission cache is not.
.claude/settings.local.json

# Cached LLM responses. Keyed by prompt hash, regenerated on demand, and specific
# to whichever model that machine happens to have pulled.
apps/*/data/cache/

# Security audit output. THIS REPOSITORY IS PUBLIC. Audit reports name unpatched
# vulnerabilities and include working reproduction steps; publishing them is
# publishing an attack guide against anyone already running this software.
# Findings are tracked publicly in IMPLEMENTATION_PLAN.md in non-exploitable form.
# Keep full detail here, local and mode 0600, until the finding is fixed.
.security/

# Sub-agent task briefs. Working instructions for a single dispatch, superseded
# as soon as the work lands; the durable record is the commit and
# IMPLEMENTATION_PLAN.md, not the brief that prompted it.
.briefs/

# Pipeline output. Regenerated by any real run, so tracking it means every run
# dirties the tree and every review carries a large generated JSON diff.
# `artifice-graph demo` repopulates both from scratch with no LLM required, and
# FileStore creates its own directories, so a fresh clone is fine without them.
# Inputs stay tracked: data/input_ocr/ is source text and data/aliases.yaml is
# configuration, not output.
apps/*/data/output/
apps/*/data/obsidian_vault/

# Runtime state. artifice-transcribe defaults its SQLite DB to ./data/
# (config.py:12), so starting a server from the repo root creates this.
/data/

# artifice-ocr's PDF-export tests write into a CWD-relative ./output/, so
# running the suite from the repo root drops artefacts here. Ignored so they
# cannot be committed by accident. The tests should use tmp_path instead —
# recorded in IMPLEMENTATION_PLAN.md rather than fixed alongside unrelated work.
/output/

# Orchestrator scratch scripts — never committed
scratch-*.sh
