__pycache__/
*.pyc
*.pyo
.venv/
/dist/
/build/
*.egg-info/
.env
.env.local

# KAOS sqlite (vendored at packages/kaos/ post-P4; stray dbs atticed in P1)
*.db
*.db-shm
*.db-wal

# BENE landing dev-tooling — bene-main → agentdex-cli site/ syncs pull these
# in, but they're build-time/dev-only tools that have no business shipping with
# the /bene/ deploy. The Dockerfile RUN rm already strips them from the image;
# this keeps the working-copy tree consistent + prevents future bulk-syncs
# from re-tracking them. See bene-main commit 1718297 for the wrong-tree
# sentinel that fail-fasts if build-docs.py is still invoked here.
# (2026-06-15: dropped site/check-i18n-parity.mjs — removed from bene-main
# in commit f58f9ae; obsolete after the 2026-06-14 URL-based i18n migration.)
site/build-docs.py
site/test-harness.html

# KAOS docs/demos/blog culled from vendored subtree (per A8)
demo_*/
blog/
# ...but the bene-site blog (BENE-DOC-10) is first-class deploy content, not KAOS
# cull: the bare `blog/` above also matched `site/blog/` and silently excluded it
# from the arena Docker build. Re-include it explicitly — EN and the localized
# `site/zh/blog/` (BENE-DOC-01 ships EN+zh), which the bare `blog/` also caught.
!site/blog/
!site/blog/**
!site/zh/blog/
!site/zh/blog/**
# ...and keep the source markdown that reproduces those generated pages.
!blog/
!blog/**/*.md
# ...but keep the repo-wide secret/cache/db excludes ACTIVE under the re-included
# blog dirs — a blog build must never commit .pyc caches, sqlite files, or .env
# secrets just because the dir itself is tracked (the `!...**` above would otherwise
# re-include them, last-match-wins). PR #235 review.
site/blog/**/*.pyc
site/blog/**/*.db
site/blog/**/*.db-shm
site/blog/**/*.db-wal
site/blog/**/.env
site/blog/**/.env.*
site/zh/blog/**/*.pyc
site/zh/blog/**/*.db
site/zh/blog/**/*.db-shm
site/zh/blog/**/*.db-wal
site/zh/blog/**/.env
site/zh/blog/**/.env.*
# ...and the Python BUILD artifacts the `!...**` re-include also deactivated —
# running tooling from a blog dir must not let a virtualenv / build cache become
# addable just because the dir is tracked (PR #242 review). `.venv/` is the
# reviewer's repro: `git check-ignore --no-index site/zh/blog/.venv/pyvenv.cfg`.
site/blog/**/__pycache__/
site/blog/**/*.pyo
site/blog/**/.venv/
site/blog/**/*.egg-info/
site/zh/blog/**/__pycache__/
site/zh/blog/**/*.pyo
site/zh/blog/**/.venv/
site/zh/blog/**/*.egg-info/

# supergoal harness artifacts (skill state, not source)
.supergoal/

# Claude Code session settings (user-specific)
.claude/

# skill outputs (.agents/ tree is committed but cache files aren't)
.agents/*.lock
.agents/cache/

# Expedition trace artifacts are large per-run jsonl; commit yaml summaries only.
expeditions/*/trace/

# D2 (harness-praxis tracer follow-up): test-smoke-exp-001/ is the
# write-target for test_expedition_smoke.py — regenerated on every
# pytest invocation, polluting `git status` with timestamp + ranking
# churn that has no signal. Read-references are write-only inside the
# test (no golden cross-check on these files; see tests/golden/).
expeditions/test-smoke-exp-001/

# PR-X follow-up: sweeps/<date>-dream-consolidate.md +
# sweeps/_kaos-digests/ are auto-regenerated by cron/dream_consolidate.sh
# every run; their content has the same churn shape (timestamps + per-
# expedition surface) and they don't satisfy doc-lint anyway (no
# author-blessed frontmatter, generated payload). Audit + manual sweeps
# (weekly-harness-audit.md) stay tracked because they encode policy
# decisions a human reviews.
sweeps/*-dream-consolidate.md
# Kanban Markdown renders are a DERIVED view of sweeps/adx-cli-fleet-kanban.json
# (the source of truth). Tracking them caused dual-state drift + a blast-radius
# collision (the .md sat in ADX-ONLINE-002's radius), recurring on every JSON-only
# board PR. fleet_kanban.py still writes a LOCAL render here for humans; git just
# never tracks it. Render on demand with `fleet_kanban.py render`.
sweeps/*-fleet-kanban.md
sweeps/_kaos-digests/

# pytest / lint / type-check caches
.pytest_cache/
.ruff_cache/
.mypy_cache/

# extra dotenv variants
.env.*

# editor / IDE / language server caches
.serena/
.cursor/
.cursorindexingignore
.vscode/
.idea/
*.swp
*~

# local agent scratch/session artifacts
.scratch/
.specstory/
sweeps/*.lock

# Tooling debris that clean_state.py --mode precommit would otherwise treat as an
# unclean tree, blocking EVERY commit. Each is created by a documented workflow:
#   node_modules/ — worktree setup symlinks it;  htmlcov/ — pytest --cov-report=html
# A gate a routine command can trip is a gate that gets bypassed.
node_modules/
htmlcov/

# ROOT-LEVEL images. THE repo-stopper, found by adversarial review after the first
# version of the clean-state gate had already shipped:
#
# This is a browser-driven UI-redesign branch. Its verification loop SCREENSHOTS
# the arena and drops the PNGs at the repo root — 11 of them were sitting untracked
# when this session opened. They were git-mv'd into .fleet-goal/evidence/, which
# tracked the 10 INSTANCES but never ignored the CLASS. With clean-state armed, the
# very next screenshot blocks EVERY commit — across all 30 worktrees that share
# $GIT_COMMON_DIR/hooks. The gate would have strangled the loop that feeds it.
#
# ANCHORED to the root (leading /) on purpose: site/, web/ and packages/ ship real
# image assets and must stay trackable. Only the root is a scratch surface.
/*.png
/*.jpg
/*.jpeg
/*.gif
/*.webp

# browser-automation page dumps (transient). NEVER track: these are verbatim
# snapshots of live pages and carry session material — the 2026-07-12 dumps
# contained Showdown `challstr` login nonces from battling.pokeagentchallenge.com.
.playwright-mcp/

# machine-local agent settings (absolute paths, per-host trust config).
# The shared, reviewable agent configs (.codex/, .devin/, .factory/mcp.json,
# .cursorrules) ARE tracked — only the *.local.* overlays are not.
.factory/settings.local.json
**/settings.local.json

# Python build artifacts (anchored — already covered above with /dist /build)
*.whl

# Build-time copy of the arena2d viewer: hatch_build.py stages the repo-root web/arena2d
# (single source of truth) here at build time; never commit the generated copy.
/packages/agentdex_cli/_arena2d/

# Git worktrees
.worktrees/
worktrees/

# Session-memory digest regenerated by ~/.claude/scripts/distill_highlights.py.
# Machine-local and self-declared "DO NOT EDIT" — it is never a repo artifact.
# Ignored fleet-wide (arc-kb, eddie-agi-kb, edith, fabricator, harness-engineering).
LATEST_HIGHLIGHTS.md

# Adapter scratch run-logs (transient; measured evidence lives in .fleet-goal/evidence/M2/measured/)
**/.adx/runs/

# model_route.sh dispatch telemetry (transient status files, created by harness dispatches)
/data/_meta/state/model_route_runs/

# pytest coverage data (transient)
.coverage

# per-machine agentdex runtime config (adx interview / openbox / seeds) — local-only
.agentdex/
