Skip to content

fix(ci): list SPONSORS.md among the CI impact planner's known top-level files - #2619

Closed
lusoris wants to merge 1 commit into
masterfrom
fix/ci-impact-sponsors
Closed

lusoris wants to merge 1 commit into
masterfrom
fix/ci-impact-sponsors

Conversation

@lusoris

@lusoris lusoris commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Summary

scripts/ci/tests/test_ci_impact.py passes on master again: .github/ci-impact.json lists the top-level SPONSORS.md that #2613 added.

test_every_top_level_repo_entry_is_known requires every top-level entry of the tree to be a known file or under a known prefix of the CI impact planner, so that no change falls outside its rules. #2613 (8bfb1d4c3) added SPONSORS.md without an entry, and the test fails on cfdcfb51f (found by the tooling suite of a local landing gate; the merge train had not selected that suite for the docs-only #2613). SPONSORS.md joins known_files next to SECURITY.md and SUPPORT.md; like them it selects no suite of its own.

Type

  • fix — bug fix
  • build / ci — tooling / infra

Checklist

  • Commits follow Conventional Commits (the commit-msg hook enforces this).
  • Every commit is signed off (git commit -s; fix a branch with git rebase --signoff origin/master). See DCO sign-off.
  • make format && make lint is green locally. — commit hooks pass; the JSON loads with a duplicate-refusing reader.
  • Unit tests pass: python3 scripts/ci/run_meson_test.py -- -C build. — no C change; pytest scripts/ci/tests/test_ci_impact.py: 45 passed (1 failed before the change).
  • If I touched any SIMD/GPU code path, I ran /cross-backend-diff and the worst ULP is ≤ 2. — not applicable.
  • If I touched a feature extractor with SIMD/GPU twins, I either updated every twin or listed the gap under "Known follow-ups" below. — not applicable.
  • If I added a new .c / .cpp / .cu / .h / .hpp, it has the appropriate license header (see CONTRIBUTING.md). — no new file.
  • If this is a breaking change, the commit message uses ! or BREAKING CHANGE: and the migration path is documented below. — not breaking.
  • If this PR adds an ADR, the ADR row lives in docs/adr/_index_fragments/<NNNN-slug>.md and nothing else is touched for the index. — no ADR.

Bug-status hygiene (ADR-0165)

  • docs/state.md updated in this PR — T-CI-IMPACT-SPONSORS-UNKNOWN-2026-10-08 under Recently closed.

Netflix golden-data gate (ADR-0024)

  • I did not modify any assertAlmostEqual(...) score in the Netflix golden Python tests, except by porting Netflix's own updated assertion verbatim from upstream (value and places as upstream has them, measured against the fork's CPU build first; ADR-1828).
  • If I believe a golden value must change, I have explained why below AND pinged @lusoris for a CODEOWNERS exception. — not applicable.

No C code changed; the golden gate is unaffected.

Cross-backend numerical results

Not applicable.

Deep-dive deliverables (ADR-0108)

  • Research digest — no digest needed: trivial.
  • Decision matrix — no alternatives: only-one-way fix.
  • AGENTS.md invariant note — no rebase-sensitive invariants.
  • Reproducer / smoke-test command — below.
  • CHANGELOG fragment — no CHANGELOG fragment: not user-visible (CI configuration).
  • Rebase note — no rebase impact: one configuration entry.

Reproducer

python3 -m pytest -q scripts/ci/tests/test_ci_impact.py   # 45 passed; without the entry 1 failed

Known follow-ups

None.

…el files (#2619)

* fix(ci): list SPONSORS.md among the CI impact planner's known top-level files

#2613 added the top-level SPONSORS.md. .github/ci-impact.json names every
top-level entry the planner may see, and test_ci_impact.py
test_every_top_level_repo_entry_is_known fails on master since then
(SPONSORS.md is neither a known file nor under a known prefix). The file
joins known_files next to SECURITY.md and SUPPORT.md; it selects no suite
of its own, as those do not.

State row T-CI-IMPACT-SPONSORS-UNKNOWN-2026-10-08.

Signed-off-by: Lusoris <lusoris@proton.me>
@lusoris
lusoris force-pushed the fix/ci-impact-sponsors branch from 39685be to 552fec5 Compare October 8, 2026 15:32
@lusoris

lusoris commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #2626, which landed the same .github/ci-impact.json entry (SPONSORS.md in known_files) and its own state row first; this PR would only add a second row for the same defect.

@lusoris lusoris closed this Oct 8, 2026
lusoris added a commit that referenced this pull request Oct 8, 2026
…re-commit hook (#2615)

* fix(ci): list SPONSORS.md among the CI impact planner's known top-level files (#2619)

* fix(ci): list SPONSORS.md among the CI impact planner's known top-level files

top-level entry the planner may see, and test_ci_impact.py
test_every_top_level_repo_entry_is_known fails on master since then
(SPONSORS.md is neither a known file nor under a known prefix). The file
joins known_files next to SECURITY.md and SUPPORT.md; it selects no suite
of its own, as those do not.

State row T-CI-IMPACT-SPONSORS-UNKNOWN-2026-10-08.

* feat(motion): derive motion2 and motion3 frame by frame so VMAF windows complete before the flush (ADR-2090) (#2290)

* feat(motion): derive motion2 and motion3 frame by frame so VMAF windows complete before the flush (ADR-2090)

The integer motion extractors and their GPU twins derived motion2 and
motion3 of every frame in flush(), so a VMAFx window over a VMAF model,
a per-frame model score and vmaf_score_pooled() over the frames read so
far waited for the end of the stream (state row
T-VMAFX-WINDOW-MOTION-AT-FLUSH-2026-10-06). The maintainer put live VMAF
windows in the 1.0 scope (Q-038, #2138, #2238).

Frame i is now final once the SAD scores of frames 0 to max(i + 1,
min_idx) are in the collector. vmaf_motion_window_advance() derives every
complete frame with upstream's per-frame statements in index order and
carries the stamp and the moving-average value in a VmafMotionWindowState;
vmaf_motion_window_flush() derives the rest. The engine calls a new
optional VmafFeatureExtractor.advance() after every accepted frame and
read fence, and the VMAFx completion thread calls it through
vmaf_engine_advance() under the engine lock before each pass, so a window
completes as soon as a worker's SAD is in, also while the feeder stalls.
motion, motion_v2 and every twin that derived at the flush (CUDA, SYCL,
HIP, Metal) register it. A synchronous read of a fed frame without a
collector slot now fences instead of answering -EINVAL
(T-ENGINE-READ-FED-FRAME-EINVAL-2026-10-06).

Every value is the flush-time value: 32 988 per-frame motion values
against master (golden pair, both checkerboards, sparks 10-bit, BBB 4K;
default, AVX2 and scalar dispatch; 0 and 4 threads) and 10 878 per GPU
backend against the CPU, 0 different; parity gate motion cells exact on
CUDA, SYCL and HIP; Netflix golden gate 280 passed, 3 skipped.

* fix(api): name the extractor as producer of the scores advance() writes

advance_extractors() called VmafFeatureExtractor.advance() (ADR-2090)
without installing the extractor as the thread's feature producer
(ADR-2073), so the integer_motion2 vector advance() creates first carried
source unknown and the provenance record named no extractor for it. The
threaded flush installs the producer around flush(); advance() now gets the
same. test_vmafx_provenance test_features_in_name_order failed on the merged
tip and passes. State row T-RC4-MOTION-ADVANCE-NO-PRODUCER-2026-10-06.

* fix(api): answer pending for a fed frame whose motion3 is not derived yet

With incremental motion (ADR-2090) motion3 of frame i is written when frame
i + 1 is scored. vmafx_score_frame() of the frame just submitted returned
VMAFX_E_INVALID at frames 8, 16 and 32, where the frame index reached the
end of the motion3 vector's storage and the collector answered -EINVAL.
engine_score_at_index() now checks the inputs of a fed frame before it
predicts and answers -EAGAIN while one is unwritten; a frame never fed keeps
its error. State row T-RC4-SCORE-FRAME-INVALID-AT-VECTOR-END-2026-10-06.

* docs(motion): move the rebase note to a fragment and leave the rendered files to the landing render (ADR-2197)

* docs(agents): write the incremental motion page in the internal register (praetor caveman lint)

* ci(tidy): measure the translation units of the incremental motion window in the cpu lane

The clang-tidy coverage rule on master requires every tracked translation
unit to be read by a lane. The new and touched units of this pull request
were measured in the dev container (scripts/dev/tidy-lane.sh --write
--only ... cpu, clang-tidy 22.1.8): 0 findings, 0 uncited NOLINT; they join
the cpu lane's measured sources.

* feat(rust): give Rust twins their own advance callback (ADR-2090, MI-1)

The shim copies the C extractor's descriptor whole (add_twin()), so after
incremental motion (ADR-2090) a Rust twin inherited the C advance(): for
motion_rust it derived motion2 / motion3 from the Rust SAD scores into the
C-layout priv while frames came in, and the Rust flush then appended every
frame again, -EINVAL at the flush; with worker threads the inherited advance
also marked the registered context initialised, so the Rust flush found no
instance. Maintainer answer Q-093: Rust implements advance.

VmafxRsTwin gains advance as its last field. VMAFX_RS_ABI_VERSION stays 1:
no release has shipped the Rust ABI, so the layout changes in place. The
header is regenerated verbatim with cbindgen 0.29.4
(scripts/dev/rust-abi-header.sh, --check up to date). vmafx_fex::Extractor
gains advance(&mut self, host), default nothing, with its trampoline. The
shim sets advance to twin_advance() when the C extractor has one and refuses
a twin without the entry point. advance_one_extractor() in libvmaf.c runs
init_shared_rust_twin() before a pooled Rust twin's first advance, as the
threaded flush does before its flush. test_rust_abi_layout checks the new
offset and the entry point.

* feat(rust): derive motion_rust's motion2 and motion3 frame by frame (ADR-2090, MI-1)

motion_rust now implements Extractor::advance with the statements of
integer_motion.c's window: frame i is derived once the SAD scores of frames
0 to max(i + 1, min_idx) are in, the stamp and the moving-average value are
carried in a State as in VmafMotionWindowState, and the flush continues where
the last advance stopped (motion_window_stamp(), motion_window_count_sads(),
motion_window_derive(), vmaf_motion_window_advance(),
vmaf_motion_window_flush(), ported in window.rs). A VMAF window over
motion_rust completes before the flush, as over the C motion.

test_rust_motion_window_incremental (suite rust): motion_rust on a context,
both windows, 0, 2 and 3 worker threads; frame i final after frame i + 1 and
before the flush, values unchanged after they became final, every SAD,
motion2 and motion3 equal to the C motion bit for bit. It failed on the
merged tree (flush -22: the inherited C advance and the Rust flush appended
frame 0 twice), failed with scoring -22 at 2 threads before the engine
initialised the pooled twin, and fails on a planted off-by-one in the Rust
advance ("final too early"). Cargo tests cover advance + flush against the C
derivation with the SAD scores in order, swapped in pairs and reversed, and
short streams of 0 to 4 frames. rust_twin_diff.py --feature motion on
netflix, checker1, checker10, sparks10 and bbb4k at --threads 0,1,4: 45
EQUAL. State row T-RUST-TWIN-INHERITS-C-ADVANCE-2026-10-07.

Carried onto the 2290 landing: the rebase note joins the
motion-window-incremental fragment (ADR-2197), which also names
read_pictures_owned(), the read helper's name since the WP6 split, as does
the picture-ownership page. The Rust framework page is rewritten for the
caveman lint and names the engine library (libvmafx) as the archive's only
target.

* docs(agents): restore the Metal motion twins' advance note on the AGENTS.d pages

The incremental motion window registers .advance on integer_motion_metal
and motion_v2_metal (ADR-2090). The rebase across the conversion of
core/src/feature/metal/AGENTS.md into AGENTS.d pages took master's
generated index and lost this pull request's two hunks of the old single
file. The motion-fps-weight and motion3-v2 pages now name
vmaf_motion_window_advance() next to the flush, the advance contract test,
and integer_motion_v2_metal.mm as a path the motion3-v2 page covers; the
index is regenerated.

* docs(community): link the live Patreon page and its euro tiers (#2620)

* docs(community): link the live Patreon page and its euro tiers

* fix(ci): skip docs/rebase-notes.d in the Markdown Lint job like the pre-commit hook (#2615)

* fix(ci): skip docs/rebase-notes.d in the Markdown Lint job like the pre-commit hook

Signed-off-by: Lusoris <lusoris@proton.me>
lusoris added a commit that referenced this pull request Oct 8, 2026
7a3a7d0 so #2290 lands as its own commit

The merge train's batch push of 17:41 failed after it had pushed the
stacked squashes of the batch to their pull request branches. The fixer of
skip docs/rebase-notes.d in the Markdown Lint job", #2615) also carries the
whole change of #2290 (incremental motion2 / motion3, ADR-2090) and the
CI-impact entry of #2619. #2290 never landed as its own commit, and its
code, tests, docs, changelog fragments and state rows sit under #2615's
title.

This reverts #2290's own diff (its gated head d5f18fd against its base
cfdcfb5), reverse-applied on master 0bf2996: 66 of its 68 files return
to their content before #2290; docs/state.md keeps the rows of the commits
that landed since. ADR-2090 and its index fragment stay: the ADR indexes
are written only by the landing render and link to it, so deleting it
fails the ADR link gate; #2290 re-lands without them. #2615's own change
(the Markdown Lint fragment scope) and the SPONSORS.md entry of
.github/ci-impact.json (#2626, also #2619's) stay. #2290 re-lands next as
its own squash.

docs/state.md also folds the duplicate row of the SPONSORS.md defect:
T-CI-IMPACT-SPONSORS-MD-UNKNOWN-2026-10-08 (#2626) stays and names
T-CI-IMPACT-SPONSORS-UNKNOWN-2026-10-08 (#2619, closed as a duplicate) as
its alias.

Signed-off-by: Lusoris <lusoris@proton.me>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type:bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant