# Operator artifacts (must NOT land in the public tree — see v4.0.1 scrub)
.mcp.json
.ledatic/
.fleet/
*.pre-*
*.bak[0-9]*

# Build / tool artifacts
target/
.claude/
.wrangler/
.vscode/
node_modules/
runtime/
# Whitelist exception: tools/runtime/ holds the v0 concurrency bridge
# (libconcurrent.dylib is platform-specific, kept untracked below).
!tools/runtime/
!tools/runtime/*.c
!tools/runtime/*.rail
!tools/runtime/*.sh
tools/runtime/libconcurrent.dylib
archive/
# Whitelist exception: docs/archive/ holds dated retros / handoffs /
# closed bug write-ups that we want browsable in git history.
!docs/archive/
!docs/archive/**

# OS + editor
*.DS_Store
*.bak

# Python
__pycache__/
*.pyc
*.pyo

# Rail local artifacts
rail_native_llm
rail_native.new
*.o
*.log
doubled.txt
numbers.txt
# JIT trampoline dylib (built via jit/build_trampoline.sh; platform-specific).
jit/libjit_call.dylib

# Models + weights live in Ledatic-Empire/rail-training or on disk —
# the compiler repo tracks none of them, cards included.
models/
best.weights
*.safetensors
*.jsonl
!tools/dnra/sets/*.jsonl
!tools/dnra/sets/**/*.jsonl

# Private subtree — nested repo at Ledatic-Empire/zemog
tools/uav/

# Training data / pipeline working dirs — Ledatic-Empire/rail-training
# owns all of it, published bundles included.
training/
*-resume.tar.gz
flywheel/

# Site publish output (Ledatic-Empire/ledatic-site is the source of truth)
# (nothing at this level — site2030 extraction removed the local copy)

# Working dirs not part of the shipped tree
tools/autoresearch_results/
tools/rail_lora/
tools/agent_memory/
tools/agent_tools/
tools/agent_goal.txt
tools/conductor/
tools/train/*.sh
tools/train/*.py
!tools/train/rail_native_loop.sh
!tools/train/metal_pool_stress.sh
!tools/train/parallel_rerank.sh
!tools/train/parity_check.sh
!tools/train/grammar_walk_probe.sh
!tools/train/spec_in_context_probe.py
!tools/train/spec_in_context_probe_full.py

# Attestation evidence — the tree keeps the *attestations*, not the
# artifacts they sign.  selfhost binaries are byte-identical to the seed
# `rail_native` when the fixed point holds; release binary + source are
# recoverable from the git tag (`git show vX.Y.Z:tools/compile.rail`).
# So HEAD carries only the .attestation.json + index.json under each
# release; the signed bytes themselves stay out of the tree.
selfhost/*/rail_self_1
selfhost/*/rail_self_2
releases/**/rail_native
releases/**/compile.rail

# Compiled Metal host binaries (rebuilt by the tools themselves)
tools/metal/tensor_gpu
tools/plasma/mhd_live
tools/metal/libtensor_gpu.dylib
tools/metal/libtensor_gpu_stub.dylib
tools/metal/test_dylib
tools/metal/bench_matmul
tools/metal/smoke_test
tools/metal/tensor_daemond
tools/metal/tensor_daemond_smoke
tools/desk/libquartz_bridge.dylib
flywheel-local/

# Backup binaries (canonical rail_native is tracked; backups are scratch)
rail_native.*
rail_native_*
# But DO track release attestation JSONs under releases/.
!releases/**/rail_native.attestation.json

# .bak with version suffix (extends *.bak to catch .bak2, .bak3, etc.)
*.bak[0-9]*

# Metal dylib backups (canonical libtensor_gpu.dylib is tracked above)
tools/metal/*.dylib.broken-*
tools/metal/*.dylib.pre-*
tools/metal/*.dylib.with-*
tools/metal/*.dylib.mini-reference
tools/metal/.no_gpu*

# Transient run outputs and comparison scratch
runs/
compare/

# Audit scratch (experimental diagnostics)
docs/audits/

# Misc scratch
tools/metal/bench_matmul_xl
tools/metal/probes/
tools/metal/sequential_bug_probe.rail
tools/metal/fp16_drafts/
tools/plasma/recordings/

# rail trace sidecars (emitted by tools/trace/rail_trace.rail)
*.trace.json

# Garmin scratch — Python helpers + FIT/GPX/TCX exports (gen-1 Instinct dumps)
tools/garmin/*.py
tools/garmin/*.fit
tools/garmin/*.gpx
tools/garmin/*.tcx

# Bisect dump dirs (notes/bisect_*/ accumulate; tracked notes/ entries still fine)
notes/bisect_*/

# internal ops/strategy/client audits — keep private
/docs/plans/
