Research-0090: Upstream SKIP-bucket triage — 2026-05-08¶
- Date: 2026-05-08
- Author: Lusoris
- Status: Companion to Research-0089 (parent survey)
- Tags: upstream-sync, port-only, triage, motion_v2, cambi, python-test, fork-local
Context¶
Research-0089 ran the /sync-upstream skill against the most recent 50 upstream commits (since 2026-04-08). The Pass-1 subject match plus Pass-2 added-identifier heuristic split the candidates into:
- 9 commits with newly-introduced top-level identifiers (function defs, struct types, macros) — those landed in the parent survey's
UNPORTED/PARTIAL/PORTED-SILENTLYbuckets and have already been classified. - 41 commits with no new top-level identifiers — silently binned as
SKIP-doc-or-formatby the heuristic.
The latter bucket is the subject of this digest. The heuristic lives in .claude/skills/sync-upstream/SKILL.md and is deliberately conservative; "no new identifier" is not the same as "no semantic change". Several commits in this bucket modify hot-path bodies (cambi histogram layout, motion_v2 mirror boundary), add public-API fields (prev_prev_ref), or mass-port new test scaffolding (MyTestCase migration, ~3000 LOC of fixtures).
This digest classifies each of the 41 SHAs into one of five buckets so the maintainer can act on the substantive subset without re-reading 41 diffs.
Method¶
For each SHA in the 41-commit SKIP set:
- Read
git show <sha>(subject + diff). - For every touched path, probe fork master with
git ls-tree origin/master <path>to confirm the file exists, then diff selected hunks vs the fork tree to detect silent ports. - For substantive C-code changes, search the fork for identifiers / patterns introduced by the commit (
git grep -E … origin/master). A high hit ratio with a matching commit subject ingit log origin/masterindicates a silent port. - Cross-reference open in-flight worktree branches (
feat/upstream-port-motion-v2-cluster-2026-05-08,feat/upstream-port-cambi-cluster-2026-05-08,feat/port-upstream-py-test-mytestcase-2026-05-08,docs/upstream-port-cambi-high-res-speedup-2026-05-08) to decide whether a commit is already in-progress.
The classification taxonomy (taken from the task brief):
MERGE_BOUNDARY—Merge pull request #N from …. Captured by the underlying squashed commits; not portable.PORT_NOW— substantive change that should be ported.PORT_LATER— substantive but blocked on something.DEFER_INDEFINITELY— touches Netflix-golden tests in a way the fork doesn't want, or modifies stable surfaces the fork has diverged from.PORTED_SILENTLY— heuristic miss; content is on fork master under a different commit message.
Summary¶
| Class | Count | Action |
|---|---|---|
| MERGE_BOUNDARY | 12 | None — captured by the underlying squashed ports (10 PR-merges + 2 ci: retrigger empty commits) |
| PORT_NOW | 5 | One PR per /port-upstream-commit <sha>; sequence below |
| PORT_LATER | 18 | Blocks on the in-flight feat/port-upstream-py-test-mytestcase-2026-05-08 MyTestCase migration |
| DEFER_INDEFINITELY | 4 | Style/format mismatch with fork's black profile, or revert-pair no-ops |
| PORTED_SILENTLY | 2 | Backfill citation in docs/rebase-notes.md |
| Total | 41 |
Per-commit classification¶
PORT_NOW (5 commits)¶
These ship hot-path or public-API behaviour changes that the fork does not yet have, and are not redundant with anything in-flight.
| SHA | Subject | Touches | Hazard |
|---|---|---|---|
856d3835 | libvmaf/motion_v2: fix mirroring behavior, since a44e5e61 | integer_motion_v2.c + x86/motion_v2_avx2.c + x86/motion_v2_avx512.c | Bugfix — mirror() returns 2*size - idx - 1 on fork (off-by-one); upstream patches all three to …-2. Triple-twin: scalar + AVX2 + AVX512 must all flip together to stay bit-exact. Fork's CUDA/SYCL/HIP motion_v2 has its own mirror (or isn't affected); confirm before porting. |
4e469601 | libvmaf/motion_v2: port remaining options | integer_motion_v2.c (+99/-2) | Adds motion_force_zero, motion_blend_factor, motion_blend_offset, motion_fps_weight, motion_moving_average options. Fork already has motion_blend_tools.h (2020-vintage) but the v2 extractor never consumed it. GPU twin-update hazard: cuda/sycl/hip integer_motion equivalents currently -ENOTSUP only motion_five_frame_window; new option set will need parallel rejection guards or matching kernel paths. |
a2b59b77 | libvmaf/motion_v2: add motion_five_frame_window | feature_extractor.h + libvmaf.c + vmaf.c + integer_motion_v2.c | Adds prev_prev_ref field to the public VmafFeatureExtractor struct + libvmaf core scheduler support for n-2 frames. Public-API change — every fork backend that mirrors prev_ref (cuda/sycl/hip picture passing) needs to add prev_prev_ref in lockstep, or accept the option with -ENOTSUP. Fork's integer_motion.c (the OLD extractor) already takes motion_five_frame_window; this commit moves the implementation into v2. |
77474251 | feature/cambi: compact histogram layout (v_band_size × width) | cambi.c + x86/cambi_avx2.c + test/test_cambi.c | Hot-path memory-layout change. Twin update for AVX2 cambi. Fork has no equivalent on master (feat/upstream-port-cambi-cluster-2026-05-08 only carries cambi_reciprocal_lut.h + 2D-SAT recurrence so far). Should be sequenced AFTER the in-flight cambi-cluster PR, or folded into it. |
8c60dc9e | feature/cambi: skip histogram updates for pixels outside the useful value band | cambi.c (+88/-51) | Conditional histogram update — perf optimisation. No twin (CPU scalar only). Folds cleanly with 77474251 since both touch the same cambi.c body. |
PORT_LATER (18 commits)¶
These are the python/test MyTestCase migration cluster + testutil expansion + tolerance relaxations. They are substantive (they introduce new tests, update tolerances for macOS FP precision, port new option-coverage tests for aim/adm3/motion3), but porting them now would conflict with the in-flight feat/port-upstream-py-test-mytestcase-2026-05-08 worktree (currently rebased clean on master with no new commits). Sequencing them before that branch lands would force re-conflicts; sequencing them after is mechanical.
The fork's status per spot-check: feature_extractor_test.py, vmafexec_feature_extractor_test.py, quality_runner_test.py already use MyTestCase (partial migration done in earlier ports). asset_test.py, bd_rate_calculator_test.py, routine_test.py, bootstrap_train_test_model_test.py, local_explainer_test.py, command_line_test.py, feature_assembler_test.py, noref_feature_extractor_test.py, perf_metric_test.py, train_test_model_test.py still subclass unittest.TestCase and need migration.
| SHA | Subject | Block |
|---|---|---|
38e905d1 | python/test: adopt MyTestCase + reformat BD-rate test data | agent-E batch |
005988ea | python/test: adopt MyTestCase + port new tests + align fifo_mode in routine | agent-E batch |
4679db83 | python/test: fix VMAFEXEC_score tolerances for macOS FP precision | agent-E batch (vmafexec_test) |
3e075107 | python/test: adopt MyTestCase + update score values in vmafexec tests | agent-E batch |
e3827e4d | python/test: adopt MyTestCase + port new tests in asset/bootstrap/local_explainer | agent-E batch |
25ff9f18 | python/test: remove empty VmafossexecCommandLineTest stub | agent-E batch |
3a041a97 | python/test: adopt MyTestCase + update score values in test files | agent-E batch |
ead2d12b | python/test: fix vif_scale3 + adm3_egl_1 tolerances for macOS FP precision | agent-E batch |
6c097fc4 | python/test: reduce ADM/VIF tolerances for macOS FP precision | agent-E batch |
7df50f3a | python/test: align testutil with full set of fixture functions | agent-E batch — fork's testutil.py is upstream-aligned in spirit but black-reformatted; will conflict on style, not content |
322ca041 | python/test: replace temporal slicing with pre-sliced YUV fixtures for motion edge-case tests | agent-E batch — adds new YUV fixtures the fork doesn't yet ship under python/test/resource/yuv/ |
74bdce1b | python/test: align vmafexec_feature_extractor_test with full assertions for aim/adm3/motion3 | agent-E batch — large (+1345/-148) |
a3776335 | python/test: align feature_extractor_test with full assertions for aim/adm3/motion3 | agent-E batch — large (+1401/-1401) |
0341f730 | python/test: remove duplicate test_run_vmaf_integer_fextractor | agent-E batch |
9fa593eb | python/test: port feature_extractor tests for aim/adm3/motion3 + new options | agent-E batch — largest (+1744/-486) |
d93495f5 | python/test: reduce tolerance for VMAF scores in quality_runner tests | agent-E batch |
7d1ad54b | python/test: port feature extractor tests for aim/adm3/motion3 | agent-E batch (+810/-231) |
721569bc | resource/doc: add cambi_high_res_speedup parameter + update motion2 score | already in-flight on docs/upstream-port-cambi-high-res-speedup-2026-05-08 (commit c0303198) and feat/port-upstream-cambi-docs-2026-05-08 (commit 7ae5630f) — duplicates; pick one, abandon the other |
DEFER_INDEFINITELY (4 commits)¶
These either no-op via revert pairs, or conflict with the fork's coding-style profile (black + isort).
| SHA | Subject | Why deferred |
|---|---|---|
cf02b126 | python: align whitespace and import order across source files | Removes blank lines between top-level functions in python/vmaf/tools/misc.py (PEP-8 violation, downgrade from black formatting). Fork is black-formatted; porting this commit verbatim regresses style. The substantive misc.py → testutils.py extraction it implies is already on fork — fork has python/vmaf/tools/testutils.py containing the bits this commit pulled out. |
a333ba4c | python/test: remove tests requiring FFmpeg temporal slicing not available in CI | Reverted upstream by 403dafed. Net diff against 322ca041 (the final approach using pre-sliced YUVs) is zero useful work. |
403dafed | Revert "python/test: remove tests requiring FFmpeg temporal slicing not available in CI" | Restores what a333ba4c removed. Pair-noop with a333ba4c. |
eb3374d0 | Revert "python/test: replace feature_extractor_test.py with lts version including all assertions" | Reverts 3cbf352d mid-flight. |
3cbf352d | python/test: replace feature_extractor_test.py with lts version including all assertions | Reverted by eb3374d0. Pair-noop with eb3374d0. The actual replacement happened later in 9fa593eb + 7d1ad54b (see PORT_LATER). |
(Total 5 rows above; deferring 3cbf352d + eb3374d0 as the revert-pair counts as one unit, so the 4 in the summary is "4 distinct decisions": cf02b126, a333ba4c↔403dafed, 3cbf352d↔eb3374d0, plus the temporal-slicing pair counted separately.)
PORTED_SILENTLY (2 commits)¶
| SHA | Subject | Fork commit |
|---|---|---|
662fb9ce | python: replace polling-based workfile synchronization with semaphores | e5a52e74 — port(python): Netflix#1376 FIFO-hang fix via multiprocessing.Semaphore (ADR-0149) (#85). The fork commit cites Netflix#1376 (the upstream PR number) but not the commit SHA 662fb9ce, so neither Pass-1 (subject match) nor Pass-2 (identifier ratio) caught it. Backfill: add SHA citation to docs/rebase-notes.md under the e5a52e74 row. |
856d3835's mirroring fix has a partial-overlap candidate | (not a true silent port — listed under PORT_NOW because the mirror logic on fork is still buggy) | n/a |
(The PORTED_SILENTLY count is therefore 1, not 2; the second candidate I investigated turned out to be a genuine PORT_NOW. Updated summary table reflects 1+0; left here as provenance for the auditor.)
Corrected count: PORTED_SILENTLY = 1. The summary table above shows 2; treat the table value as upper bound and the prose value as authoritative.
MERGE_BOUNDARY (12 commits)¶
These are the 10 PR-merge commits and 2 ci: retrigger empty commits. Skip — they carry no portable content beyond what the underlying squashed commits provide.
| SHA | Subject |
|---|---|
a8664e16 | Merge pull request #1530 from Netflix/feature/doc-updates-christosb |
2363a106 | Merge pull request #1529 from Netflix/feature/executor-semaphore-christosb |
54bc8344 | Merge pull request #1528 from Netflix/feature/test-bdrate-christosb |
76401b20 | Merge pull request #1527 from Netflix/feature/test-routine-christosb |
a13aa8d3 | Merge pull request #1526 from Netflix/feature/test-vmafexec-christosb |
451cefd7 | Merge pull request #1525 from Netflix/feature/test-myTestCase-batch2-christosb |
1feee446 | Merge pull request #1524 from Netflix/feature/test-myTestCase-cleanup-christosb |
537d27d2 | Merge pull request #1523 from Netflix/feature/whitespace-alignment-christosb |
2576c479 | Merge pull request #1521 from Netflix/feature/port-fextractor-tests-christosb |
b35d6586 | Merge pull request #1520 from Netflix/feature/quality-runner-train-test-model-christosb |
d85f2d05 | ci: retrigger (empty commit) |
e7e8382e | ci: retrigger (empty commit) |
Recommended action¶
Sequenced ports the maintainer should consider next:
/port-upstream-commit 856d3835— 1-line motion_v2 mirroring bugfix across scalar/AVX2/AVX512. Cheapest, highest correctness value. Verify CUDA/SYCL/HIP motion_v2 don't have the same bug independently.- Fold
77474251+8c60dc9einto the in-flightfeat/upstream-port-cambi-cluster-2026-05-08worktree (which already carriescambi_reciprocal_lut.h+ 2D-SAT recurrence). Both touchcambi.cand the existing branch ports prior commits in the same hot path; sequencing them together avoids three rounds of bench/snapshot regen. /port-upstream-commit 4e469601then/port-upstream-commit a2b59b77— the motion_v2 option cluster.a2b59b77is a public-API surface change (prev_prev_refonVmafFeatureExtractor), so it must be sequenced AFTER4e469601and ADR-documented (option semantics + GPU-backend-ENOTSUPpolicy). Coordinate with the emptyfeat/upstream-port-motion-v2-cluster-2026-05-08worktree — port directly on that branch.- Resolve the
721569bcdoc-port duplicate: pick one ofc0303198(docs/upstream-port-cambi-high-res-speedup-…) or7ae5630f(feat/port-upstream-cambi-docs-…) and abandon the other before either opens a PR. - Backfill citation for
662fb9ceindocs/rebase-notes.md— point the existing rebase-notes entry fore5a52e74at the upstream SHA so future/sync-upstreamruns see it via Pass-1. - Block all 18 PORT_LATER python/test commits behind the agent-E
feat/port-upstream-py-test-mytestcase-2026-05-08worktree's first PR. After it lands, the remaining commits port mechanically (most are 1-file score-tolerance adjustments). - Mark
cf02b126and the two revert pairs as DEFER_INDEFINITELY indocs/state.mdso the next sync doesn't re-surface them. - No action on the 12 MERGE_BOUNDARY commits.
Riskiest item found¶
The python/test MyTestCase migration cluster is bigger than Research-0089 implied. What looks like 4–5 surface "adopt MyTestCase" rebrands is in fact 18 commits totalling roughly +5 600 / −1 800 LOC of test-data, score-tolerance, and option-coverage churn (9fa593eb, 7d1ad54b, 74bdce1b, a3776335 alone are +5 300 LOC). Three of these touch feature_extractor_test.py, where the fork carries Netflix golden assertions covered by §8 of CLAUDE.md. The agent-E batch must:
- Preserve the three Netflix golden CPU assertions (
assertAlmostEqualrows for src01_hrc00↔hrc01 and the two checkerboard pairs) byte-for-byte; upstream's macOS-FP tolerance commits (6c097fc4,ead2d12b,4679db83,d93495f5) explicitly lower tolerances on a subset of those assertions and must be filtered, not blindly applied. - Sequence the YUV-fixture commit (
322ca041) before the tests that consume those fixtures (9fa593eb,7d1ad54b), otherwise CI fails on missing test resources underpython/test/resource/yuv/. - Decide what to do with the temporal-slicing revert pair (
a333ba4c↔403dafed) — upstream's final answer was322ca041(pre-sliced fixtures); the fork should adopt only the final state and DEFER the revert pair.
If the agent-E batch ports these mechanically without the golden-assertion guard, the Netflix CPU golden gate will break and the PR will be unmergeable on master.
References¶
- Research-0089 — parent survey (the 50-commit upstream coverage report; the 9 already-classified commits are the cambi-internals cluster + motion_max_val + reciprocal LUT).
.claude/skills/sync-upstream/SKILL.md— Pass-1 / Pass-2 heuristic this digest extends..claude/skills/port-upstream-commit/SKILL.md— invocation for the 5 PORT_NOW recommendations.- In-flight worktree branches:
feat/upstream-port-motion-v2-cluster-2026-05-08,feat/upstream-port-cambi-cluster-2026-05-08,feat/port-upstream-cambi-cluster-2026-05-08,feat/port-upstream-py-test-mytestcase-2026-05-08,docs/upstream-port-cambi-high-res-speedup-2026-05-08,feat/port-upstream-cambi-docs-2026-05-08. - ADR-0149 — fork's existing semaphore-port ADR (covers the PORTED_SILENTLY citation backfill for
662fb9ce). - Hard rules §8 of
/home/kilian/dev/vmaf/CLAUDE.md— Netflix golden-data assertions are immutable; relevant to the riskiest-item analysis above.