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

# Frontend toolchain
node_modules/
/mimir/react_app/dist/

# Virtual envs
.venv/
venv/
env/

# Tools
.pytest_cache/
.mypy_cache/
.ruff_cache/
.tool-versions

# IDE
.vscode/
.idea/
*.iml
*.swp
*.swo

# Claude Code per-project settings (operator/host-specific permissions,
# allowlists, and hooks — not part of the package contract).
.claude/

# OS
.DS_Store
Thumbs.db

# Mimir runtime artifacts (only meaningful inside an agent home, never in the
# package source — but the smoke-test harness occasionally drops them here).
home/
*.db
*.db-shm
*.db-wal
*.tar.gz

# v0.5 §3: saga's bench data + LongMemEval source are symlinks/dirs
# pointing at large datasets that don't belong in git (msam2's .gitignore
# had the same exclusions; preserved post-merge).
/saga/data
# saga/external is now vendored (the LongMemEval eval harness lives under
# saga/external/longmemeval/ — see its PROVENANCE.md). Specific subdirs
# that are too big or transient stay ignored.
/saga/external/hindsight
/saga/results
# Integration bench output (per-run hypothesis JSONLs + scratch mimir homes).
/results/
/benchmarks/longmemeval_via_mimir/results/

# Agent home dotenv (in case a smoke run spits one out at workspace root).
.env

# Local scratch / spike / backtest artifacts. Keep WIP scripts and
# one-shot data dumps out of the repo (e.g. commitments-extraction
# backtest results, throwaway profiling output).
/scratch/

# Runtime agent state. ``state/`` is per-deployment and accumulates
# identity bindings, spec results, proposed-change drafts, wiki topics,
# etc. — none of which belongs in source control. A fresh agent home
# generates its own ``state/`` on first run.
/state/
.bench-experiments-backup/

# GEPA pilot run outputs (chainlink #404) — generated, not committed
evals/**/pilot_output/

# feature-factory control plane and run sandboxes (never committed).
# Required, not cosmetic: the factory's own per-merge verify refuses to run
# when the integration worktree is dirty, and an untracked .factory/ is
# exactly what makes it dirty — run 1396 halted at needs-human with
# "the .factory.json verify suite cannot be replayed because the integration
# worktree is not clean (untracked .factory/)". A local .git/info/exclude
# does not propagate to the nested worktrees the factory creates per slice,
# which is where verify actually runs. .factory.json is a tracked
# declaration and is unaffected: the trailing slash matches directories only.
.factory/
.factory-sandboxes/

# Agent-written memory. These mutate while a run works, and a tracked file changing
# mid-run dirties the worktree, which the factory refuses to observe -- that is how
# run 1396 wedged. They stay on disk; they simply are not version-controlled.
.opencode/memory/
