Skip to content

fix(attribution): correct third-party credit, and assert it stays correct - #73

Merged
StuartCameronCode merged 1 commit into
mainfrom
fix/attribution-audit
Aug 17, 2026
Merged

fix(attribution): correct third-party credit, and assert it stays correct#73
StuartCameronCode merged 1 commit into
mainfrom
fix/attribution-audit

Conversation

@StuartCameronCode

Copy link
Copy Markdown
Owner

Fixes #72.

The reported bug

zsmooth was credited to "Adrian Woracz" in the README, the About dialog and NOTICES.txt. That name does not exist — the author's handle is adworacz and his LICENSE says Austin Dworaczyk Wiltshire. The handle had been expanded into a plausible-sounding human name instead of being looked up, and he found it himself.

Why this touches so much

Rather than patch the one line, I re-derived every attribution from upstream LICENSE files and source headers. The same class of error was throughout:

Wrong licences

Component Listed as Actually
CTMF GPL-2.0 GPL-3.0
DCTFilter GPL-2.0 MIT
AWarpSharp2 GPL-2.0 ISC
RemoveGrain / Repair GPL-2.0 WTFPL (+ MIT for Clense)
FFmpeg LGPL-2.1+ GPL-3.0 — every bundled build is --enable-gpl --enable-version3

Invented year rangesCopyright (c) 2012-2024 … appeared on components whose upstream asserts no such range, including two that assert no copyright at all (havsfunc is Unlicense; FluxSmooth's original author explicitly disclaimed copyright).

Credited something not shipped — ffms2, removed alongside BestSource.

Omitted ~15 plugins that are shipped — Retinex, bifrost, fluxsmooth, DeScratch, VIVTC, TCanny, TTempSmooth, AddGrain, FFT3DFilter, KNLMeansCL, MiscFilters, TemporalMedian, BM3D, zimg, Zstandard, plus the Agner Fog Vector Class Library that eight HolyWu plugins compile in.

mvsfunc has no licence upstream at all — no LICENSE file, no header, nothing in setup.py. It was listed as "Unlicense". It now says so plainly, with an offer to remove it on request.

What else changed

  • Original authors named where a port obscured them: Kevin Stone behind DFTTest/TCanny/TTempSmooth/NNEDI3CL, Simon Perreault behind CTMF, Tom Barry behind AddGrain, Fizick behind FFT3DFilter/DeScratch/Deblock, SEt behind AWarpSharp2, Sergey Stolyarevsky behind CCD, Didée behind QTGMC's ancestor TempGaussMC_beta2, SAPikachu behind neo_f3kdb, Akarin behind akarin.
  • Permissive licence texts reproduced in full — MIT, ISC, WTFPL, BSD-3-Clause, Boost, zlib and the Unlicense all require the notice be included with the distribution, and none of them were.
  • In-app strings — the Windows exe's file properties gave CompanyName and LegalCopyright as literally "com.vapourbox"; both platforms claimed "All rights reserved" on a GPL-3 app.
  • Pre-built binary sources in the README now also credit martin-riedl, BtbN, python-build-standalone and the Homebrew bottle, not just the three macOS ones.

Guard

app/test/attribution_test.dart (4 tests, runs in the push gate — no deps needed) keeps the three places in step:

  • every plugin in deps-expected-plugins.json is credited in NOTICES.txt
  • every About-dialog component appears in NOTICES.txt
  • no removed component (ffms2, BestSource) lingers
  • every Licence text: file referenced actually exists in licenses/

It caught two of my own inconsistencies while I was writing it. What it cannot catch is a name that is simply wrong, so CLAUDE.md records the rule: a handle is not a name, a repo owner is not the copyright holder, and every copyright line comes from upstream at the time of writing.

Note on scope

bifrost, fluxsmooth and Retinex arrive with deps 1.9.0 on feat/advanced-mode-and-filter-curation, not on main — they are credited here anyway, since both branches land before the next release. Nothing else here depends on that branch; the two touch no common files apart from README.md and CLAUDE.md, which merged cleanly in testing.

Verification

  • flutter test test/attribution_test.dart — 4/4
  • flutter analyze — no new issues
  • Every copyright line traced to an upstream LICENSE or source header (gh api repos/<r> for the SPDX id, raw file fetch for the holder)

…rect

zsmooth was credited to "Adrian Woracz" in the README, the About dialog and
NOTICES. That name does not exist — the author's handle is `adworacz` and his
LICENSE says Austin Dworaczyk Wiltshire. The handle had been expanded into a
plausible-sounding human name rather than looked up, and he found it himself
(#72).

Re-derived every attribution from upstream LICENSE files and source headers
rather than patching the one report, because the same class of error was
throughout the file:

- Wrong licences. CTMF is GPL-3.0 (listed 2.0), DCTFilter is MIT (listed
  GPL-2.0), AWarpSharp2 is ISC and RemoveGrain/Repair is WTFPL (both listed
  GPL-2.0). The bundled FFmpeg is built --enable-gpl --enable-version3 on every
  platform, so it is GPL-3.0, not the LGPL 2.1+ claimed.
- Invented year ranges. "Copyright (c) 2012-2024 ..." appeared on components
  whose upstream asserts no such range, including two that assert no copyright
  at all (havsfunc is Unlicense; FluxSmooth's author explicitly disclaimed it).
- Credited ffms2, removed alongside BestSource, and omitted ~15 plugins that
  are bundled: Retinex, bifrost, fluxsmooth, DeScratch, VIVTC, TCanny,
  TTempSmooth, AddGrain, FFT3DFilter, KNLMeansCL, MiscFilters, TemporalMedian,
  BM3D, zimg, Zstandard, plus the Agner Fog VCL that eight HolyWu plugins
  compile in.
- mvsfunc has no licence upstream at all — no LICENSE, no header, nothing in
  setup.py. It was listed as "Unlicense"; it now says so plainly, with an offer
  to remove it on request.

Original authors are now named where a port obscured them (Kevin Stone behind
DFTTest/TCanny/TTempSmooth/NNEDI3CL, Simon Perreault behind CTMF, Tom Barry
behind AddGrain, Fizick behind FFT3DFilter/DeScratch/Deblock, SEt behind
AWarpSharp2, Sergey Stolyarevsky behind CCD, Didee behind QTGMC's ancestor,
SAPikachu behind neo_f3kdb, Akarin behind akarin), and the full text of every
short permissive licence is reproduced — MIT, ISC, WTFPL, BSD-3, Boost, zlib
and the Unlicense all require the notice be included, and it was not.

Two in-app strings were wrong too: the Windows exe's file properties gave
CompanyName and LegalCopyright as "com.vapourbox", and both platforms claimed
"All rights reserved" on a GPL-3 app.

app/test/attribution_test.dart keeps the three places in step: every plugin in
deps-expected-plugins.json must be credited in NOTICES, every About-dialog
component must appear there, no removed component may linger, and every
referenced licence file must exist. It caught two inconsistencies while being
written. What it cannot catch is a name that is simply wrong, so CLAUDE.md
records the rule: a handle is not a name, a repo owner is not the copyright
holder, and every line comes from upstream at the time of writing.

Fixes #72
@StuartCameronCode
StuartCameronCode marked this pull request as ready for review August 17, 2026 01:29
@StuartCameronCode
StuartCameronCode merged commit d803e87 into main Aug 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Name hallucination?

1 participant