# Build artifacts
dist/
*.egg-info/
build/truemend.build/
build/truemend.dist/
# setuptools' own staging dir, created by `pip wheel .` / `python -m build`.
# build/ itself is NOT ignored: build/nuitka_build.py and build/build.sh are
# tracked tooling.
build/lib/
server/.next/
server/tsconfig.tsbuildinfo

# Local agent/session tooling (ZCode plans, agent state — not project content)
.zcode/

# TrueMend state files (user-specific, regenerated per run — never commit)
.truemend-cache.json
.truemend-cache/
.truemend-profile.json
.truemend-review.json
.truemend-workflow.json
.truemend-progression.jsonl
.truemend-learning.json
.truemend-zones.json
.truemend-definitions.json
.truemend-definitions-manifest.json
.truemend-license
*.truemend-license
.truemend/*
.truemend/findings-ledger.jsonl
# but the self-healing repair-task drop-zone IS tracked — bot PRs commit manifests here
!.truemend/heal/

# Desloppify state
.desloppify/

# Python
__pycache__/
*.pyc
*.pyo

# Coverage artifacts
.coverage
.coverage.*
coverage.xml
htmlcov/

# IDE
.vscode/
.idea/
*.swp

# OS
.DS_Store
Thumbs.db

# Keys (never commit)
keys/
*.pem
*.key
.agents/
.cursor/

# Pytest temp dirs
pytest-of-*/
tmp*/
.pytest_cache/

# Build artifacts (generated)
truemend-workspace/
tasks/
.agent/

# Validation baselines (large JSON, regenerated per Phase 0)
tests/fixtures/validation/baseline-*.json
.playground-tmp/
benchmarks/validation/
nul
.venv/
# FP-campaign worker artifacts
fp_campaign/logs/
fp_campaign/*.json
# precision_baseline.json is a CI-required input (tests/test_precision_gate.py reads it
# at collection time) — committed, unlike the other transient fp_campaign/*.json scratch
# files. It was gitignored by the blanket rule above and never committed until 2026-07-20,
# which meant every CI Test/Precision-Gate job failed at collection on a clean checkout —
# undetected for 6+ weeks because GitHub Actions was independently disabled at the repo
# level over the same window. See CLAUDE.md's CI-hygiene note.
!fp_campaign/precision_baseline.json
# orphan_baseline.json records the per-language orphan counts that make
# orphan_scale_check.py's DROP verdict possible. Without it the check has no
# over-suppression signal at all -- which is the state it shipped in until
# 2026-08-23, when ANCHOR_LOW = 0.0 made its LOW branch unreachable and
# main() returned None so even a HIGH verdict exited 0. Committed, not scratch.
!fp_campaign/orphan_baseline.json
# dispatch_baseline.json is the CI-required input for the ci.yml "Dispatch gate"
# step (dispatch_oracle.py --check). Without it the gate cannot ratchet and exits
# 1 on every run, so a clean checkout would fail CI outright -- the identical
# failure the precision_baseline.json note above records. Committed, not scratch.
!fp_campaign/dispatch_baseline.json
# example_parse_baseline.json is the CI-required input for the ci.yml
# "Example-parse gate" step (example_parse_gate.py --check). Without it the
# ratchet has no grandfathered set, so a clean checkout fails on every
# currently-unparseable example -- the identical failure the
# precision_baseline.json note above records. Committed, not scratch.
!fp_campaign/example_parse_baseline.json
# transient per-vendor dogfood-trim reports (reproducible from fp_campaign tooling)
WORKER_REPORT_*.md
# generated baselines (reproducible from the campaign tooling)
fp_campaign/*.log
fp_campaign/baseline_failures.txt
# mypy_baseline.txt is a CI-required ratchet input (fp_campaign/mypy_gate.py reads it) —
# committed for the same reason as precision_baseline.json above, not gitignored.

# precision-gate output cache (worktree-safe scratch)
fp_campaign/.gate_cache/

# generated campaign state (reproducible from fp_campaign/campaign.py)
fp_campaign/campaigns/

# TrueMend SARIF analysis artifacts (generated in CI)
*.sarif

# Claude Code harness transient state
.claude/scheduled_tasks.lock

# Claude Code agent worktrees (transient)
.claude/worktrees/

# fp-campaign parallel worktrees (transient, per-target)
.worktree/
.worktrees/

# Generated run/build artifacts (never commit)
*-audit-report.html
audit_check.json
nuitka-crash-report.xml

# fleet tooling + cloned bench corpora (not source)
.fleet/
.fleet_misses/
benchmarks/corpus/repos/
# React Native benchmark corpus clones — same rationale as corpus/repos/ above.
# These were accidentally committed as dangling gitlinks (no .gitmodules entry)
# in 81c0b4b1, which is what breaks `actions/checkout` with "fatal: no submodule
# mapping found" (exit 128) on any workflow that checks out this repo.
benchmarks/rn-test/
# standalone competitor-tool installs for the bench harness (not source)
benchmarks/corpus/harness/tools/
# generated benchmark run output (reproducible from benchmarks/corpus/harness/)
benchmarks/corpus/harness/runs/
# generated benchmark build/test logs (reproducible; result JSONs stay tracked)
benchmarks/results/**/*.log
# Sovereign Forge per-run state/evidence (forge.yaml itself is committed)
.forge/
test-repo/

# The skills CLI symlinks newly-installed skills from the ignored .agents/
# tree into .claude/skills/. Committing the link would dangle on clone --
# skills-lock.json is what records the install.
.claude/skills/advise-project-approach

# This repo's own .truemend.json is machine-local: it enables local-model
# rewriting against a llama-server on 127.0.0.1 and a GGUF that exists on one
# box. Committing it would switch that on for everyone who clones, pointed at
# a server they do not run. (Users of TrueMend do commit theirs -- this rule
# is about TrueMend's own checkout.)
.truemend.json

# Learning-ledger and progression state written by any `truemend` run inside the
# repo (scripts/gate.py --full, the dogfood gate, a manual audit). Per-machine
# run history, not source: committing it made a 28,923-line diff out of one
# local verification pass.
.truemend/findings-ledger.jsonl
.truemend/findings-ledger-runs.jsonl
.truemend/progression.jsonl
**/.truemend/findings-ledger.jsonl
**/.truemend/findings-ledger-runs.jsonl
**/.truemend/progression.jsonl
.gate-venvs/
