Skip to content

Research 0905 — .gitignore + .github/workflows/ staleness audit (2026-05-30)

Question

After the ADR-0700 directory rename (libvmaf/core/, python/vmaf/compat/python-vmaf/) and the post-rebrand workflow additions, which .gitignore rules now match no real artefact and which workflow files have never fired? Remove the genuinely dead entries without overlapping the in-flight .gitignore PRs (#321,

330).

Method

  1. Enumerated every .gitignore in the worktree (find . -name .gitignore) — 12 files. For each rule, ran a direct existence probe in the current tree (ls / find / git check-ignore).
  2. Diffed PR #321 (libvmaf → core rename) and PR #330 (Go binary anchoring) to identify lines other agents are already rewriting, so this PR leaves them alone.
  3. Enumerated every workflow in .github/workflows/ (24 files) and queried the last run for each via gh run list -R VMAFx/vmafx -w <name> --limit 1. For the ones that returned no runs, read the workflow's on: triggers to distinguish "dead" from "dormant by design" (release / cron schedule not yet hit / newly added).
  4. For each candidate-stale gitignore path, cross-checked any referencing build script or documentation (testdata/generate.sh, mkdocs.yml, setup.py) to ensure the rule is not a forward-looking gate against a generated artefact.

Findings

.gitignore (root)

Rule Status Action
.gradle/ Stale — no Gradle in repo, no build.gradle*, never created. Remove.
.idea/ Standard JetBrains pattern; conservative keep. Keep.
.tox/ python/tox.ini exists — actively used. Keep.
.pypirc No PyPI publishing path in repo; ad-hoc dev concern only. Remove.
vmaf_output.xml CLI output file, may regenerate on user invocation. Keep.
compile_commands.json Generated by meson — actively used by IDE. Keep.
ai/data/* (with re-allowlist) Per ADR-0203, ADR-0325, ADR-0335 — load-bearing tracked files in the allowlist. Keep.
testdata/*_{1280x720,1920x1080,3840x2160}_*.yuv Output of testdata/generate.sh. Keep.
testdata/bbb/*.yuv, testdata/bbb/results/, testdata/bbb/{ref,dis}_3840x2160_30f.yuv Forward-looking — used by scripts/perf/bench-multi-resolution.sh, testdata/bench_all.sh, docs/benchmarks.md, etc. Dir is intentionally created at bench time. Keep.
*.mp4, *.mkv Standard large-binary guard. Keep.
python/vmaf/matlab/**/*.mex* family (11 rules) Stale path — after ADR-0700, matlab lives at compat/python-vmaf/matlab/. Rewire to new path.
.corpus/ Per CLAUDE.md §12: large fixtures. Keep.
.workingdir/, .workingdir2/ Per CLAUDE.md. Keep.
corpus.jsonl, tools/vmaf-tune/{build,dist,*.egg-info}/ Per ADR-0237 (vmaf-tune Phase A). Keep.
tools/external-bench/** patterns Per ADR-0332. Keep.
.zed/local/, .claude/settings.local.json, .claude/scheduled_tasks.lock, .claude/worktrees/ Per-user / per-machine. Keep.
preprints202604.0035.v1.pdf Ad-hoc download; never committed; no docs reference. Keep (defensive; tiny rule, removing it adds zero clarity).
build-docs/ mkdocs.yml has site_dir: build-docs/site — actively used. Keep.
libvmaf/subprojects/... (4 rules) PR #321 owns these — leave untouched. Skip.
model/tiny/training_runs/, model/u2netp_mirror.* Per ADR-0325. Keep.
vmafx-server, vmafx-mcp, vmafx-tune (Go binaries) PR #330 owns these — leave untouched. Skip.
/target/, **/*.rs.bk, bindings/rust/**/Cargo.lock Per ADR-0702 (Rust workspace). Keep.
*.ncu-rep Standard Nsight Compute report. Keep.
Upscaled perf fixtures testdata/ref_1920x1080_48f.yuv etc. Generated by testdata/generate.sh. Keep.

python/.gitignore

Rule Status Action
vmaf/externals.py Stale — file lives at compat/python-vmaf/resource/example/externals.py, not under python/vmaf/. Remove.
test/resource/{icpf,mp4,test_image_yuv,test_images,yuv,tiff,y4m} Stale — none of these subdirs exist in python/test/resource/. Remove.
adm_dwt2_cy.c* Stale at python scope — Cython source is at compat/python-vmaf/core/adm_dwt2_cy.pyx; generated .c would land next to it, not under python/. Replace with explicit root-level rule.

Resolution: rewrite python/.gitignore as a brief documentation stub; add compat/python-vmaf/core/adm_dwt2_cy.{c,cpp} rules to the root .gitignore adjacent to the matlab block.

Workspace .gitignore files (10 files)

compat/python-vmaf/matlab/.gitignore (*~) and the nine compat/python-vmaf/workspace/*/.gitignore (* + !.gitignore) all follow the standard "keep dir tracked, ignore contents" pattern. Keep as-is.

.github/workflows/

24 workflow files total. Last-run conclusions:

  • Active (success / failure / skipped — recent runs): 19 workflows have at least one run in the last 24 h. Skipped runs are paths-filter exclusions (e.g. build.yml skips when no C source touched), not staleness.
  • No-runs-yet: 5 workflows (supply-chain.yml, upstream-watcher.yml, upstream-ffmpeg-hip-hwdec-watcher.yml, upstream-netflix-645-hdr-model-watcher.yml, upstream-netflix-955-watcher.yml). Investigation:
  • supply-chain.yml — trigger is release: published + workflow_dispatch. Dormant until the first signed release; not dead.
  • Four upstream-*-watcher.yml — cron 0 6 * * 0 / 15 6 * * 0 / 30 6 * * 0 / 0 8 * * 1, all weekly. Files added 2026-05-30 (today, via PR #242). The first cron tick hasn't landed yet; workflow_dispatch is wired in. Not dead.

Result: zero workflow removals.

Decision

  • Remove .gradle/, .pypirc from root .gitignore.
  • Rewire 11 matlab MEX patterns from python/vmaf/matlab/** to compat/python-vmaf/matlab/**.
  • Rewrite python/.gitignore as a 6-line documentation stub (explaining the post-ADR-0700 layout).
  • Add compat/python-vmaf/core/adm_dwt2_cy.{c,cpp} to root .gitignore to cover the Cython-generated C in its new home.
  • Leave PR #321 (libvmaf/subprojects/ rewire) and PR #330 (Go binary anchoring) lines untouched — no merge conflicts.
  • No workflow files removed.

Per-category removal count

Category Removed Rewired Added
Root .gitignore rules 2 (.gradle/, .pypirc) 11 (matlab paths) 2 (Cython output)
python/.gitignore rules 9 (stale legacy paths) 0 6-line doc stub
Workflow files 0 0 0
Workspace gitignores (10) 0 0 0

References

  • ADR-0700 (directory rename libvmaf/core/, python/vmaf/compat/python-vmaf/).
  • ADR-0203 / ADR-0325 / ADR-0335 (ai/data/ allowlist invariants).
  • ADR-0237 (vmaf-tune Phase A scratch outputs).
  • ADR-0332 (external-bench harness scratch).
  • ADR-0702 (Go + Rust workspace artefacts).
  • PR #321 (in-flight: IDE / lint paths post-ADR-0700; rewires libvmaf/subprojects/...).
  • PR #330 (in-flight: Go binary roots /vmafx-*).
  • PR #242 (added the five no-runs-yet workflows on 2026-05-30).
  • Source: agent task brief 2026-05-30.