# 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

# 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

# Scaffold harness — local-only
.claude/commands/
.claude/hooks/
.claude/skills/
.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/
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/

# 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

# autoresearch outer-loop runtime artifact (results.tsv, failure_log)
autoresearch/state/*
!autoresearch/state/.gitkeep
# G5b.fix1 (2026-05-20) — mutation audit ledger is the git-as-optimiser SoT;
# every applied wrapper-prompt mutation is committed via _git_commit_audit_log.
# The trailing negation lets `git add autoresearch/state/mutations.jsonl` succeed.
!autoresearch/state/mutations.jsonl
# PR-BASELINE-REGISTRY (2026-05-30) — baseline registry ledger (one
# ``kind="baseline"`` row per promote, the hub's baseline index reads it).
# Same git-tracked invariant as mutations.jsonl — silent-ignored writer 회피
# (PR-G5b #1350 precedent). (Originally added for the dropped pareto archive;
# now the lossless baseline-history registry — _append_baseline_registry_row.)
!autoresearch/state/baseline_archive.jsonl
# PR-BASELINE-EPOCH (2026-05-30) — epoch_hash → be-NNN label map (the hub groups
# baselines by epoch via these labels). git-tracked alongside the registry so the
# label assignment is stable + shared, not a silent-ignored local writer.
!autoresearch/state/baseline_epochs.json
# PR-VAR-ADAPTIVE (2026-05-27) — historical group-std samples for the
# percentile-based variance gate. Same git-tracked invariant as
# mutations.jsonl / baseline_archive.jsonl. Without this negation the
# percentile threshold would silently lose history under the broad
# ``autoresearch/state/*`` ignore — exactly the PR-G5b #1350 incident.
!autoresearch/state/group_variance_history.jsonl
# PR-RATCHET-1 (2026-05-21) — 5 mutation-target JSONs (wrapper-sections /
# tool-policy / decomposition / retrieval / reflection) moved in-repo
# from ~/.geode/self-improving-loop/ so `git diff` shows the current
# mutation state and `git revert` discards a hypothesis. The directory
# name matches the existing module/function/constant naming
# (policies.py / load_policy / GLOBAL_*_POLICY_SOT). The trailing
# negation re-includes the whole policies/ subtree under git tracking.
!autoresearch/state/policies/
!autoresearch/state/policies/**
.claude/scratch/

# CSP-7 (2026-05-22) — seed-generation cross-run state. The directory
# layout is part of the project (committed via .gitkeep + README) so
# a fresh clone has the expected paths, but runtime artefacts
# (per-run subdirs, latest_pointer.json, sessions.jsonl) stay
# git-ignored — they're machine-local execution traces, not source.
state/*
!state/.gitkeep
!state/README.md
