# Python
__pycache__/
*.py[cod]
*.egg-info/
dist/
build/
release-notes.md
SHA256SUMS
hf-release/

# Virtual environment
.venv/
.release-venv/

# Manim render outputs — `scripts/visualizations/geode_hero.py` renders
# to `media/videos/`. The storyboard MD + scene source are the only
# versioned artifacts; rendered MP4s (1080p60 EN/KO + smoke 480p60) are
# distribution assets, not source. The thumbnail PNG under
# `docs/visualizations/` is exempted from the global `*.png` rule a few
# lines below.
media/

# Cache
.mypy_cache/
.pytest_cache/
.ruff_cache/

# Environment
.env
.mcp_env
.mcp_env.local

# inspect_ai eval logs from `geode audit --live` runs (raw transcripts).
# SOT 는 docs/audits/<date>-petri-*.md 보고서. logs 자체는 너무 크고 PII /
# transcript 가 있을 수 있어 git 제외.
logs/
# Exception: docs/petri-bundle/logs/ is the Pages-published audit bundle.
# bundle_sync (plugins/petri_audit/bundle_sync.py) auto-copies finished
# .eval archives here from ~/.geode/petri/logs/, and the validator
# (scripts/validate_petri_bundle.py) treats the path as part of the
# publishable surface. The blanket `logs/` rule above would silently
# drop every newly-synced .eval — the same anti-pattern as PR-G5b
# #1350 (MUTATION_AUDIT_LOG_PATH). Keep this exception colocated with
# the rule it negates.
!docs/petri-bundle/logs/
!docs/petri-bundle/logs/**
!docs/self-improving/petri-bundle/logs/
!docs/self-improving/petri-bundle/logs/**
# Exception: seed-generation inspect bundle ("별도 뎁스"). The seedgen phase
# .eval logs live in their OWN bundle (separate from the audit petri-bundle)
# so the audit viewer stays scoped to alignment audits. Same publish/track
# rationale as the petri-bundle logs above.
!docs/self-improving/seed-generation/bundle/logs/
!docs/self-improving/seed-generation/bundle/logs/**
# Exception: self-improving hub E2E fixture. The hub builder
# (scripts/build_self_improving_hub.py) reads listing.json from
# this path during tests/test_self_improving_hub_e2e.py; without
# this negation CI clones the repo without the fixture and the
# audit-row assertions fail (same anti-pattern as PR-G5b #1350).
!tests/fixtures/self_improving_hub/petri-bundle/logs/
!tests/fixtures/self_improving_hub/petri-bundle/logs/**
# CSP-14 (2026-05-23) — Pages-published seed-generation bundle. Same
# bundle_sync pattern as the audit logs above: ``plugins/seed_generation/
# bundle_sync.py`` auto-copies finished run artefacts (state.json,
# survivors.json, meta_review.json, candidates/*.md) from
# ``state/seed_generation/<run_id>/`` here. Without this exception
# the gitignored ``state/*`` rule below would silently drop the
# synced files (same anti-pattern as PR-G5b #1350).
!docs/petri-bundle/seeds/
!docs/petri-bundle/seeds/**
!docs/self-improving/petri-bundle/seeds/
!docs/self-improving/petri-bundle/seeds/**
# CSP-14 (2026-05-23) — Pages-published literature snapshots.
# ``core/tools/literature_snapshot.py:FreezePaperSnapshotTool`` writes
# directly to this directory; if the literature dir is ever moved
# under a gitignored path the writer thinks it persisted but git
# won't track it.
!docs/petri-bundle/literature/
!docs/petri-bundle/literature/**
!docs/self-improving/petri-bundle/literature/
!docs/self-improving/petri-bundle/literature/**
optimized_prompts/

# OS
.DS_Store

# IDE
.idea/
.vscode/

# SQLite checkpoints
*.db
*.db-shm
*.db-wal
*.db-journal

# Checkpoint DB
geode_checkpoints.db
geode_checkpoints.db-shm
geode_checkpoints.db-wal

# Coverage
.coverage

# Runtime data (except tracked config)
.geode/*
!.geode/rules/
!.geode/memory/
!.geode/config.toml.example
!.geode/skills/

# Personal skills — never commit (use .geode/skills/TEMPLATE.md as guide)
# These belong in ~/.geode/skills/ (personal tier), not .geode/skills/ (project tier)
.geode/skills/job-hunter/
.geode/skills/expense-tracker/
.geode/skills/youtube-planner/
.geode/skills/daily-briefing/
.geode/skills/weekly-retro/
.geode/skills/slack-digest/
.geode/skills/anthropic-philosophy/
.geode/skills/coverletter-patterns/
.geode/skills/eco2-context/
.geode/skills/engineer-profile/
.geode/skills/resume-tailoring/
.geode/skills/resume-writer/

# Personal memory — never commit
.geode/memory/PROJECT.md
.geode/memory/*.md
.geode/memory/_archive/
.geode/memory/_proposals/

# Scaffold harness — local-only except tracked project workflow skills.
.claude/commands/
.claude/hooks/
.claude/skills/*
!.claude/skills/geode-workflow/
!.claude/skills/geode-workflow/**
!.claude/skills/geode-distribution/
!.claude/skills/geode-distribution/**
.claude/workflow-state.json
.claude/worktrees/
.claude/MEMORY.md

# Worktree ownership metadata (CLAUDE.md §0 convention writes to worktree checkout root)
/.owner

# Temporary artifacts
tmp/
pilot_stderr.log
/node_modules/
# Root npm scratch — node tooling (site/scripts/*.mjs) run from the repo root
# auto-creates a stray root package.json/lock (name=<dir basename>); ignore so
# `git add -A` never commits it. The real Next.js manifests live at site/.
/package.json
/package-lock.json
reports/
# Allow the source package at core/skills/reports/ (split from reports.py in v0.71.0).
# Only un-ignore source files + templates — let __pycache__/*.pyc stay ignored
# via Python's standard glob below.
!core/skills/reports/
!core/skills/reports/*.py
!core/skills/reports/templates/
!core/skills/reports/templates/*
*.png
*.html
!docs/**/*.html
!docs/visualizations/*.png

# Pixel-ratchet baselines (Step 3 — tests/test_hero_frame_ratchet.py)
# must ship with the repo so the test has something to diff against.
!tests/visualizations/baselines/*.png

# v0.63.0 — agent-generated personal reports (subject names + date suffixes).
# Pattern guard so trend/stock/etc. reports the user generates via /report
# don't accidentally leak into git. Add specific files via `git add -f` if
# you want one tracked.
/*_trend_report_*.md
/*_stock_report_*.md
/*_report_2*.md

# Personal progress dashboard — generated by ad-hoc tooling, not part of the
# scaffold docs set. Re-suppress after the docs/**/*.html un-ignore.
docs/progress-report.html

# CI trigger
/.audit/

# Playwright MCP browser captures (console logs + screenshots from
# transient debugging sessions). Never part of the tracked tree.
.playwright-mcp/
.playwright-cli/

# Ad-hoc artifact dumps from local audit/benchmark runs.
artifacts/

# Scheduler lock file written by `geode serve` cron worker.
.claude/scheduled_tasks.lock

# Layout migration v1→v2 archive — vestigial dir archival output.
# Reversible (user can `mv` back or `rm -rf`). Never tracked.
.geode/_archive/

# Next.js site (site/) build + install artifacts. The site/ tree itself is
# tracked; only generated contents are excluded.
site/node_modules/
site/.next/
site/out/
site/tsconfig.tsbuildinfo

# Un-ignore PNG/HTML inside site/public/ — the root .gitignore blanket
# rejects *.png and *.html, but the site needs its mascot art + static
# assets shipped to GitHub Pages.
!site/public/**/*.png
!site/public/**/*.html
!site/public/**/*.svg
!site/public/**/*.ico

.claude/scratch/

# PR-STATE-SOT-RUNTIME-SPLIT (2026-06-14) — the repo-root ``state/`` is gone.
# TRACKED SoT (mutations.jsonl / baseline_archive.jsonl / baseline_epochs.json /
# policies/ / results.{tsv,jsonl} / seed_pools/) lives IN-REPO at
# ``core/self_improving/state/`` (naturally git-tracked, no negation dance).
# RUNTIME scratch (per-run seed_generation/, handoff/, baseline.json, run.log,
# campaign-progress.log, wrapper-override.json, prepare-report.txt) lives
# OUT-OF-REPO under ``~/.geode/self-improving`` (GEODE_STATE_ROOT) — not in git.
.next/
