# Caches, build artifacts
.DS_Store
.cache/
# Rust build artifacts
target/
# Editor / refactor scratch backups — never in tree (ADR-0546 audit cleanup
# bundle surfaced a 142 KB `tools/vmaf-tune/src/vmaftune/cli.py.bak` that
# had been polluting greps for weeks).
*.bak
*.orig
*.egg*
.idea/
*.py[cod]
.tox/
.*version
# Virtual environments. No trailing slash on the second pattern: `.venv*/`
# matches only DIRECTORIES, so a symlink named `.venv` sailed past it and was
# committed by #1231. That symlink pointed at the maintainer's own absolute
# venv path, so every fresh checkout materialised a self-referential loop and
# `git pull` replaced anyone's real (ignored, hence disposable) venv with it.
.venv*/
.venv*
__pycache__/
build/
build-golden/
core/build-golden/
dist/
vmaf_output.xml
compile_commands.json

# tiny-AI training artifacts (re-generated by ai/scripts/train_konvid.py).
# The contents of ai/data/ are gitignored EXCEPT the ADR-0203 Python
# modules. We use the "ignore everything inside the dir, then re-allow
# .py" pattern so the dir itself stays tracked for the modules below.
ai/data/*
!ai/data/__init__.py
!ai/data/netflix_loader.py
!ai/data/feature_extractor.py
!ai/data/scores.py
# Phase F.5 calibrated recipe overrides (ADR-0325).
# Tracked as a tiny JSON snapshot — regenerated by
# ai/scripts/calibrate_phase_f_recipes.py against a real corpus.
!ai/data/phase_f_recipes_calibrated.json
# ADR-0335 — hardware-capability prior table is small, hand-curated,
# and committed in-tree (not a generated artifact).
!ai/data/hardware_caps.csv
runs/

# Large test data (generated via testdata/generate.sh)
testdata/*_1280x720_*.yuv
testdata/*_1920x1080_*.yuv
testdata/*_3840x2160_*.yuv
testdata/bbb/*.yuv

# Large binary files
*.mp4
*.mkv

# Upstream MATLAB MEX compiled artefacts (platform-specific binaries).
# Rebuild locally via `mex file.c` if you need the MATLAB reference path.
# Paths follow ADR-0700 rename (python/vmaf/ → compat/python-vmaf/).
# See Scorecard Binary-Artifacts / D38.
compat/python-vmaf/matlab/**/*.mex
compat/python-vmaf/matlab/**/*.mex[0-9]*
compat/python-vmaf/matlab/**/*.mexa64
compat/python-vmaf/matlab/**/*.mexglx
compat/python-vmaf/matlab/**/*.mexlx
compat/python-vmaf/matlab/**/*.mexmac
compat/python-vmaf/matlab/**/*.mexmaci64
compat/python-vmaf/matlab/**/*.mexsol
compat/python-vmaf/matlab/**/*.mexw32
compat/python-vmaf/matlab/**/*.mexw64
compat/python-vmaf/matlab/**/*.dll
compat/python-vmaf/matlab/**/*.exp
compat/python-vmaf/matlab/**/*.lib
compat/python-vmaf/matlab/**/*.o

# Cython-generated C from compat/python-vmaf/core/adm_dwt2_cy.pyx
# (produced by `python setup.py build_ext`; never tracked).
compat/python-vmaf/core/adm_dwt2_cy.c
compat/python-vmaf/core/adm_dwt2_cy.cpp

# Local corpus data — large YUV/MP4 fixtures, never committed.
# Was only in .git/info/exclude; now visible to all contributors.
.corpus/

# Working/scratch directories
.workingdir/
# Also match it as a symlink. A trailing slash only matches a real
# directory, so an agent worktree that symlinks this shared state dir
# in (the praetor flavor audit wants them present) leaves an untracked
# entry that `git add -A` happily commits -- an absolute path to one
# machine, landing in a PR. Caught exactly that way; see bug ledger L-78.
.workingdir

# vmaf-tune Phase A scratch outputs (ADR-0237)
corpus.jsonl
# ...but never a committed test fixture. The bare pattern above matches at any
# depth, which silently excluded pkg/benchmark/testdata/corpus.jsonl from its
# own PR and left the package's tests failing on a missing file.
!**/testdata/corpus.jsonl
tools/vmaf-tune/build/
tools/vmaf-tune/dist/
tools/vmaf-tune/*.egg-info/

# external-bench harness scratch / binary downloads (ADR-0332)
tools/external-bench/**/build/
tools/external-bench/**/dist/
tools/external-bench/**/*.bin
tools/external-bench/**/output*.json
tools/external-bench/**/__pycache__/

# Zed per-user local settings (auth tokens, window state — machine-specific).
# .zed/ itself IS tracked (shared project config); only the local/ subdir is not.
.zed/local/

# Claude Code local (machine-specific) settings
.claude/settings.local.json
.claude/scheduled_tasks.lock
# Agent isolation worktrees (created by parallel-agent harness; machine-local).
.claude/worktrees/
# Local merge-train nudger + its log (machine-local operator tooling).
.claude/mergetrain/

# Generated benchmark results
testdata/bbb/results/
build-docs/
preprints202604.0035.v1.pdf

# Meson wrap-fetched subprojects (downloaded at meson setup time).
# Only the .wrap files + packagefiles/ are tracked; the unpacked
# upstream trees are gitignored.
core/subprojects/*/
!core/subprojects/packagefiles/
core/subprojects/packagecache/
core/subprojects/.wraplock

# Per-run training output (per-epoch ONNX checkpoints)
model/tiny/training_runs/

# u2netp fork-local mirror (ADR-0325). Binary lives only in GitHub
# Releases; the scaffold (license, model card, operator doc, release
# workflow guard) is tracked, the binary itself is not.
model/u2netp_mirror.onnx
model/u2netp_mirror.pth

# Go build artifacts (ADR-0702)
# Compiled binaries at the repo root (from `go build ./cmd/...`).
# Anchored with a leading "/" so the patterns match only files at the repo
# root, not directories named "vmafx-tune" anywhere in the tree (e.g.
# cmd/vmafx-tune/). Leading slash also prevents hiding new test files.
/vmafx-server
/vmafx-mcp
/vmafx-tune
/vmafx-controller
/vmafx-node
/vmafx-operator
/vmafx-ort-runner
# Per-package test binaries
*.test
# Go build cache is stored in $GOPATH/pkg, not the repo; go.sum is tracked.
# Dist directories from per-cmd Makefile targets
/cmd/*/dist/

# Rust build artifacts (ADR-0702)
# Workspace target directory (cargo output)
/target/
# Rust source backup files (rustfmt temp)
**/*.rs.bk
# Cargo.lock: kept for workspace binaries (this workspace's root Cargo.lock
# is tracked); per-crate library Cargo.lock files are gitignored below.
# Library crates inside bindings/ produce their own Cargo.lock which we
# do NOT track (libraries let consumers pin).
bindings/rust/**/Cargo.lock

# Nsight Compute profiling artifacts
*.ncu-rep

# Generated upscaled perf benchmark fixtures (reproducible from 576x324 native)
testdata/ref_1920x1080_48f.yuv
testdata/dis_1920x1080_48f.yuv
testdata/ref_2560x1440_48f.yuv
testdata/dis_2560x1440_48f.yuv
testdata/bbb/ref_3840x2160_30f.yuv
testdata/bbb/dis_3840x2160_30f.yuv

# Geometry-bearing wrappers generated from committed Kubernetes E2E raw clips.
test/e2e/fixtures/ref.y4m
test/e2e/fixtures/dist.y4m
# kuttl may materialize a credential-bearing kubeconfig in its working
# directory; the harness uses only the dedicated file below RUNNER_TEMP.
/kubeconfig

# Pyright strict-audit config (ADR-0888). Intentionally local-only —
# shipping it would surface ~1,600 stub-cascade errors as a CI gate
# before the long-tail cleanup is done. Operators re-run with
# `pyright -p pyrightconfig.audit.json --outputjson <pkg>/`.
pyrightconfig.audit.json

# Fuzzer-generated corpus growth (seed entries are not tracked)
core/test/fuzz/*_corpus/

# Netflix golden-data YUV fixtures (CLAUDE.md section 8). Downloaded by
# scripts/test/fetch-test-yuvs.sh, deliberately untracked because of their size
# -- but they are the numerical ground truth, so they must never be reachable by
# `git clean -xfd`. Ignoring them makes clean skip them and keeps them out of
# `git status` noise.
python/test/resource/yuv/
python/test/resource/test_image_yuv/

# Cython extension built in-place by compat/python-vmaf (setup.py build_ext).
compat/python-vmaf/core/*.so

# Per-host sidecar identity cache, written at runtime by vmafx-tune sidecar.
# Machine-local state, never a build input (ADR-0237-style scratch).
relcache/

# Test artifact: vmaftune.encode probes ffmpeg with `[ffmpeg_bin, "-version"]`,
# and a stubbed binary in the test suite leaves a file literally named
# `-version` behind. A leading dash also makes `pre-commit run --files` parse
# the path as an option, so the large-file hook never sees it.
/tools/vmaf-tune/-version
build-upstream-ab/

# local-only agent scratch (bench fixtures, fan-out logs, tmp scratch)
.claude/bench-data/
.claude/fanout/
.claude/tmpsp/

# Vendor skill mirrors. `.claude/skills/` is canonical and tracked; the
# per-vendor copies drift and are regenerated from it.
.agents/skills/
/.standards/worktrees/
