# Release preparation logs and upload-ready artifacts
verify-logs/
release-artifacts/

# Benchmarking runs
benchmark/

# Bootstrapping demo runs
bootstrap/

# Hydra wiki
wiki/

# Old files
old/

# Haskell / Stack / Cabal
.ghcup/
.stack-work
dist-newstyle/
stack.yaml.lock
*.cabal

# Java / Gradle. Path-anchored (not a bare "build") so this can never swallow
# a module-namespace directory literally named "build" (e.g. the
# hydra.build.* family under dist/json/, #416) -- it only matches the
# specific Gradle output roots below.
.gradle
gradle.properties
/packages/hydra-java/build/
/heads/java/json-driver/build/

# IDEs
.bsp/
.idea
*.iml
.vscode

# Python
__pycache__/
*.pyc
.venv/
.venv-*/
.pytest_cache/
.ruff_cache/

# Clojure CLI tools.deps cache
.cpcache/

# Node
node_modules/

# sbt build artifacts
project/target/
/target/
# heads/scala has no build.sbt — these are orphan sbt scratch dirs
heads/scala/target/
heads/scala/project/
# orphan sbt scratch dir at the repo root (no root build.sbt; canonical build is heads/scala)
/project/

# Run logs
runs/

# Analysis notebooks and debug scripts
analysis/
debug_*.py
debug_*.hs
debug_*.clj

# Working documents (local only)
docs/reviews/
docs/work/

# Package distributions.
# dist/json/ is the source of truth (tracked). dist/haskell/ is tracked
# through the 0.15 release to support bootstrapping from a fresh clone.
# All other target-language trees are regenerated from dist/json/ and
# not checked in.
#
# Exception within the tracked dist/haskell/ tree (#418): the hand-written
# distribution-package content that sync-haskell.sh OVERLAYS from its canonical
# home under the top-level overlay/haskell/ tree is NOT committed — it would
# duplicate the canonical source. (Removing dist/haskell/ from SCM entirely is
# deferred; see #376.) The canonical copies under overlay/haskell/ ARE tracked.
#   - hydra umbrella package (entirely copied)
dist/haskell/hydra/
#   - hydra-kernel hand-written runtime (copied from overlay/haskell/hydra-kernel/;
#     relocated to the Hydra.Overlay.Haskell.* namespace in #501)
dist/haskell/hydra-kernel/src/main/haskell/Hydra/Settings.hs
dist/haskell/hydra-kernel/src/main/haskell/Hydra/Kernel.hs
dist/haskell/hydra-kernel/src/main/haskell/Hydra/Overlay/
#   - hydra-kernel hand-written test bridge (overlaid from overlay/haskell/.../src/test/)
dist/haskell/hydra-kernel/src/test/haskell/Hydra/Test/TestEnv.hs
dist/haskell/hydra-kernel/src/test/haskell/Hydra/Test/DefaultImplGraph.hs
#   - hydra-pg / hydra-typescript hand-written DSL helpers (overlaid from
#     overlay/haskell/hydra-{pg,typescript}/; relocated to the
#     Hydra.Overlay.Haskell.* namespace in #501/#556)
dist/haskell/hydra-pg/src/main/haskell/Hydra/Overlay/
dist/haskell/hydra-typescript/src/main/haskell/Hydra/Overlay/

dist/clojure/
dist/common-lisp/
dist/coq/
dist/emacs-lisp/
dist/go/
dist/java/
dist/python/
dist/scala/
dist/scheme/
dist/typescript/
dist/wasm/

# Test-cache artifacts written by Layer 2.5 testers.
dist/haskell/test-cache.json

# Per-package input-hash cache stamps written by assemble-distribution.sh
# to short-circuit redundant work. Local caches, not part of the build.
dist/haskell/*/.main-input-hash.txt
dist/haskell/*/.test-input-hash.txt

# Build-cache directories. Each dist/<lang>/<pkg>/build/ holds local
# cache state (digest.json files for the sync pipeline's freshness
# checks) — derived, regenerated by every sync, and a missing or stale
# file is a cache miss, never a correctness problem. Tracking digests
# previously caused merge conflicts on every cross-branch merge because
# the hashes always diverged. See #379. The matching root-level cache
# directory is dist/json/build/ (universe digest). Depth-anchored
# (rather than dist/**/build/) so it can never swallow a module-namespace
# directory literally named "build" (e.g. the hydra.build.* family, #416).
dist/json/build/
dist/*/*/build/

# Other
*.log
*.swp
# TypeScript incremental-build outputs (heads/typescript)
*.tsbuildinfo
heads/typescript/build/
heads/typescript/node_modules/
# Per-user Claude state (settings, session caches, etc.) is gitignored,
# but the in-repo slash commands live under .claude/commands/ and ARE
# tracked. Pattern: exclude .claude contents but re-include .claude/commands/.
.claude/*
!.claude/commands/
# Hydra branch plan files (see CLAUDE.md). These are per-branch working notes named
# <branch>-plan.md and always live at the WORKTREE ROOT. The leading slash anchors
# the rule to the root so it ignores only those files — an unanchored `*-plan.md`
# matched every `-plan.md` anywhere in the tree (e.g. .claude/commands/compact-plan.md,
# which IS tracked). Keep this anchored. Note: any *other* root-level file ending in
# `-plan.md` will also be ignored by convention; tracked planning docs belong in docs/.
/*-plan.md
# Cross-worktree Claude messages (see CLAUDE.md)
claude-hydra-messages/
# Claude session helper scripts (local-only; CI monitors, log-tailers, ad-hoc
# survey/ff/bootstrap watchers). These are dot-prefixed .sh under claude/;
# the tracked claude/ content is the .md protocol docs, never dot-.sh scripts.
claude/.*.sh
