Docs cleanup punch list (2026-05-08)¶
Research-0088¶
Scope: docs/{usage,api,metrics,backends,development,ai,mcp,architecture}/, docs/state.md, docs/rebase-notes.md, README.md, CHANGELOG.md, tools/*/README.md. ADRs themselves and docs/research/ excluded.
92 markdown files scanned; 57 broken-internal links + 2 dead ADR slugs detected mechanically; remaining items found by spot-reading.
Broken internal links (57 total)¶
docs/ tree¶
docs/usage/python.md:331—../../resource/images/scatter_training.pngresolves toresource/images/scatter_training.png(does not exist;resource/directory was never added to fork). Likely the upstream Netflix tree had it; either copy the asset underdocs/or strip the embed.docs/usage/python.md:332— same problem with../../resource/images/scatter_testing.png.docs/usage/vmaf-perShot.md:127— links../adr/0220-transnet-v2-shot-detector.md. Real file isdocs/adr/0223-transnet-v2-shot-detector.md. ADR-0220 on disk is0220-sycl-fp64-fallback.md(unrelated). Slug-drift: rewrite to0223-….docs/usage/vmaf-perShot.md:167— same wrong target (0220-transnet-v2-shot-detector.md→0223-…).docs/usage/vmaf-roi.md:5—../metrics/mobilesal.mddoes not exist.docs/metrics/has no per-feature MobileSAL doc; either create it (see Missing surface docs below) or reroute todocs/ai/models/mobilesal.md.docs/api/index.md:95—../adr/0154-score-pooled-eagain.md→ actual slug is0154-score-pooled-eagain-netflix-755.md.docs/api/index.md:191—../adr/0152-monotonic-index-rejection.md→ actual slug is0152-vmaf-read-pictures-monotonic-index.md.docs/api/gpu.md:73—../adr/0157-cuda-state-free-api.md→ actual slug is0157-cuda-preallocation-leak-netflix-1300.md.docs/api/gpu.md:393—../adr/0127-vulkan-backend-decision.md→ actual slug is0127-vulkan-compute-backend.md.docs/metrics/confidence-interval.md:67—../../resource/images/CI.pngdoes not exist (same upstream-asset drift asusage/python.md).docs/metrics/features.md:501—../adr/0153-float-ms-ssim-min-size.md→ actual slug is0153-float-ms-ssim-min-dim-netflix-1414.md.docs/metrics/features.md:67— narrativeADR-0268mention; no ADR with that number exists. Likely wrong number or stale plan reference (the immediately-following text discusses lpips_sq / fastdvdnet so check if the intended ADR is0041-lpips-sq-extractor.mdor0250-tiny-ai-extractor-template.md).docs/backends/cuda/overview.md:125—../../../core/src/cuda/ring_buffer.cdoes not exist (file was renamed/removed; onlycore/src/cuda/common.cetc. ship today).docs/backends/nvtx/profiling.md:22— same deadcore/src/cuda/ring_buffer.creference.docs/backends/vulkan/overview.md:24and:276—../../adr/0127-vulkan-backend-decision.md→ real slug0127-vulkan-compute-backend.md(same drift asapi/gpu.md).docs/development/oneapi-install.md:216—../adr/0127-vif-as-sycl-pathfinder.mddoes not exist; ADR-0127 on disk is the Vulkan-backend ADR. Either the intended ADR has a different number, or the link is to a planning-dossier document that never landed.docs/development/build-flags.md:47—../adr/0270-libfuzzer-y4m-input.md→ real slug is0270-fuzzing-scaffold.md.docs/ai/quantization.md:11—../adr/0129-tinyai-ptq-int8-modes.md→ real slug is0129-tinyai-ptq-quantization.md.docs/ai/bvi-dvc-corpus-ingestion.md:125and:135—../adr/0303-fr-regressor-v2-ensemble-flip.md→ real slug is0303-fr-regressor-v2-ensemble-prod-flip.md.docs/ai/models/fr_regressor_v3.md:28—../../adr/0040-tinyai-loader.md→ real slug is0040-dnn-session-multi-input-api.md.docs/ai/models/fr_regressor_v3.md:29—../../adr/0041-onnx-runtime-dispatch.md→ real slug is0041-lpips-sq-extractor.md. (Both v3-ADR-pointers look like an unfinished rename audit.)docs/rebase-notes.md:531—docs/adr/NNNN-slug.md(literal template placeholder leaked into a tracked doc).docs/rebase-notes.md:2580—../core/test/test_ring_buffer.c#L23— file does not exist (notest_ring_buffer.cundercore/test/).docs/rebase-notes.md:4171—../core/src/cuda/ring_buffer.cdoes not exist.docs/rebase-notes.md:4724— narrativeADR-0049mention; no ADR-0049 exists. Likely a placeholder for the (later renumbered) scaler-sidecar ADR.
CHANGELOG.md (root-anchored — every ../… path is broken)¶
CHANGELOG.md sits at the repo root; relative links must start with docs/… / tools/… / ai/… / scripts/…, not ../…. The following entries leak the path style of an in-docs/ file (almost certainly verbatim-copied from ADR bodies during release-please runs):
CHANGELOG.md:3131,3132,3144,3146,3261,3303,3327,3345,3364,3371,3433,3480,3484,3491,3493,3502,3505,3511,3513,3518— paths begin with../docs/…,../tools/…,../ai/…,../scripts/…. All resolve to/home/kilian/dev/docs/…(one level above the repo).CHANGELOG.md:3555,3556,3557,3566,4148,4149,4299,4332— same pattern with../../docs/…/../../ai/…(two levels up). Likely copy-pasted from adocs/adr/_index_fragments/body where two../were correct.CHANGELOG.md:366,368,1122,2729— baredocs/adr/…/core/test/…paths that resolve fine in source but point at files that no longer exist (e.g.docs/adr/0138-simd-bit-exactness-policy.md,docs/adr/0140-ssimulacra2-simd-bitexact.md,docs/adr/0178-integer-adm-vulkan.md,core/test/test_ring_buffer.c). Slug-drift / file-removed.
Decision the maintainer should take: either rewrite these path-prefix errors in-place, or stop emitting ../ paths from docs/adr/_index_fragments/ bodies via the release-please configuration so future entries land path-correct.
Broken ADR references¶
docs/metrics/features.md:67—ADR-0268not found on disk.docs/rebase-notes.md:4724—ADR-0049not found on disk. (See "Stale content" for the slug-drift cluster — every wrong-slug link above is also effectively a broken ADR reference.)
Broken anchors¶
docs/mcp/embedded.md:165— link target../adr/0209-mcp-embedded-scaffold.md#what-lands-next-t5-2b-roadmap-per-research-0005--next-steps. The heading exists but its slug, when normalised, drops the literal§ "Next steps"punctuation. Re-derive the slug after GitHub's renderer (likely#what-lands-next-t5-2b-roadmap-per-research-0005--next-steps— double dash from the §). Sanity-check by clicking the heading on GitHub.
Stale content¶
tools/vmaf-tune/README.md:1,5,8,29,47— title, scope blurb, and layout comment all still claim "Phase A scaffold / libx264 only". Real state: 17 codec adapters undertools/vmaf-tune/src/vmaftune/codec_adapters/(libaom, svtav1, vvenc, x264, x265, av1/h264/hevc × {nvenc, qsv, amf, videotoolbox}). The "Phase B/C not implemented here" comment is also stale — Phase B (recommend) and ladder/per-shot/saliency subcommands ship today.docs/usage/vmaf-tune.md:10,18,21,27,35,56,92,115,226,228,381,408, 417,436,500,550,582,605,610,675— many "Phase A" framings, the "Codecs wired so far: libx264 / libx265" line at L35, and "extra_params (Phase A: [])" at L436. The doc itself documentscompare,tune-per-shot,recommend-saliency,ladder,fastsubcommands further down, so this is purely a stale top-of-doc framing problem. Recommend a single editing pass that strips the six-phase roadmap framing and replaces it with a current-feature matrix.docs/state.md— file is current (last## Update protocolstep matches CLAUDE.md §12 r13). No stale rows spotted.docs/rebase-notes.mdis 9 055 lines and contains both template leakage (line 531:docs/adr/NNNN-slug.md) and references to two source files that have been removed (core/test/test_ring_buffer.c,core/src/cuda/ring_buffer.c). These look like un-updated entries from before the ring-buffer refactor.
Missing surface docs (per ADR-0100 per-surface bar)¶
CLI / tools¶
- Per-codec adapter pages absent. All 17 adapters share two
docs/usage/vmaf-tune*.mdpages. ADR-0100 expects each user-discoverable surface to have its own page; here the hardware-accelerated adapters (av1_amf,av1_nvenc,av1_qsv,h264_amf,h264_nvenc,h264_qsv,h264_videotoolbox,hevc_amf,hevc_nvenc,hevc_qsv,hevc_videotoolbox) each have only 2–6 mentions indocs/usage/vmaf-tune*.md. At minimum: one summary table mapping<adapter> → <minimum host requirements, CRF range, preset mapping, known caveats>so users picking a codec on hardware they own don't need to read the source. tools/vmaf-roi-score/README.mdexists but nodocs/usage/vmaf-roi-score.md— actually this file does exist (docs/usage/vmaf-roi-score.md). False alarm.
libvmaf C API headers¶
core/include/libvmaf/libvmaf_mcp.hships but is not mentioned in anydocs/api/*.md. ADR-0100 per-surface bar requires a doc. Either fold a section intodocs/api/index.mdor split intodocs/api/mcp.md. (Independent fromdocs/mcp/, which covers the server; this gap is on the embedded C API.)core/include/libvmaf/feature.h,model.h,picture.h,vmaf_assert.hlack dedicateddocs/api/*.mdpages. They are mentioned indocs/api/index.mdso this is a per-surface-bar judgement call rather than an outright omission; flag for triage.
Backends¶
docs/backends/x86/only hasavx512.md. AVX2 paths exist throughoutcore/src/feature/x86/(adm_avx2.c,motion_avx2.c,psnr_hvs_avx2.c,iqa_convolve_avx2.c,ssim_avx2.c, …) — nodocs/backends/x86/avx2.md.docs/backends/arm/overview.mdis the sole ARM/NEON page despite ~14 NEON kernels undercore/src/feature/arm64/. Per-kernel pages aren't required, but a kernel-coverage table onoverview.mdwould close the bar.
Tiny-AI¶
docs/ai/models/has 13 model cards but nodocs/ai/models/saliency_student_v1.md-vs-mobilesal.mddeduping note (both files exist; the user-facing relationship is unclear). Not strictly missing per ADR-0042's 5-point bar — call it a navigation gap.
ADR index drift (TOC)¶
docs/adr/README.md is missing rows for 33 ADRs, including 0217–0223 (cluster), 0235–0252 (cluster), and 0254–0277 (cluster). The _index_fragments/ directory has fragments for some but not all of these (71 ADRs lack a fragment, 2 fragments are orphaned — 0270-saliency-student-fork-trained-on-duts.md and 0287-vmaf-tune-saliency-aware.md have no matching ADR). Per ADR-0221's fragment pattern, this is the regeneration substrate that's gone out of sync with the actual ADR tree. Fixing it is a single rerun of whatever fragment-generator script the project uses, plus reconciling the two orphans (most likely they want matching ADRs renamed 0270-… and 0287-… to land).
External links spot-checked¶
5 external URLs probed; 2 broken:
docs/usage/external-resources.md:21—https://gist.github.com/Audition-CSBlock/bef34e553132efad883c0f128c46d638→ 404 (gist deleted).docs/usage/external-resources.md:22—https://github.com/CrypticSignal/video-quality-metrics/blob/master/CRF%2023.png→ 404 (file removed/renamed in upstream repo). The parent repo link on the same line still works.https://github.com/Netflix/vmaf/blob/master/resource/doc/release.md→ 200 OK.https://github.com/Netflix/vmaf/commit/b949cebf→ 200 OK.https://docs.sigstore.dev/cosign/overview/→ 301 (redirect follows fine; not a problem).
External-link audit was deliberately a sample, not exhaustive. A full sweep would need a link-checker pass on every absolute URL under docs/.
Counts at a glance: 57 broken internal links, 2 broken ADR-NNNN references, 1 broken anchor, 2 broken external links in the sample, 33 ADRs missing from the index, 71 ADRs without index fragments, 2 orphan fragments, multi-page "Phase A only" stale framing in vmaf-tune docs, missing per-surface docs for AVX2 / NEON kernel coverage and libvmaf_mcp.h.