feat: reviewed libvips 1.3.4 supplement, and the native proof on sharp 0.35.5
CI / verify (pull_request) Successful in 1m4s
CI / infrastructure-smoke (pull_request) Successful in 36s
CI / migration-smoke (pull_request) Successful in 1m53s
CI / package-release (pull_request) Successful in 34s
CI / image-build (pull_request) Successful in 30s
CI / deploy-smoke (same-origin) (pull_request) Successful in 47s
CI / deploy-smoke (split) (pull_request) Successful in 1m28s
CI / package-publication (pull_request) Successful in 50s

sharp 0.35.4 carries a production-relevant librsvg advisory (GHSA-wq5f-xc86-pv6w). Its fix, sharp
0.35.5, loads @img/sharp-libvips-linux-x64 1.3.4, which ships no licence material either. This adds
the reviewed supplement for that exact package (ADR 0052) and moves the packager's native proof to
sharp 0.35.5, so a later 0.2.1 release can package it on linux-x64-glibc. Nothing in module-pack's
code changes: supplement selection is already by exact name, version, and content digest.

- Supplement: license-supplements/@img/sharp-libvips-linux-x64/1.3.4/
  - content digest ekklesia-content-v1:sha256:2927fe11493461fa34847191d0b9b1c6441007c3e99f306e5708cb07fb0a5e59;
  - 190 components and 146 hashed texts;
  - assembled with the same method as 1.3.3's, from sharp-libvips v1.3.4's own inputs. That method
    reproduces the 1.3.3 supplement byte for byte.
  - PROVENANCE.md records:
    - the 27 upstream archives and five build-time patches, by sha256;
    - the librsvg 2.63.2 crate reproduction (cargo 1.99.0; Cargo.lock 5723e14c…);
    - rustc 75a75c3e…;
    - every change from 1.3.3.
  - Notable: sharp-libvips v1.3.4 now states cairo is used under MPL 1.1, not MPL 2.0. cairo ships
    that text itself, so the standard MPL 2.0 text is no longer added for cairo; selectors still
    carries it.
  - No legal conclusion: the LGPL and MPL source-availability determination stays open, as for 1.3.3.
- The 1.3.3 supplement is unchanged, and still proven: module-pack keeps sharp 0.35.4 as a test-only
  devDependency alias (`sharp-0.35.4`). Each supplement is pinned against its real installed
  libvips, and each matches only its own.
- Native proof fixture: sharp 0.35.4 → 0.35.5. The closure has the same shape: sharp, @img/colour,
  detect-libc, semver, and @img/sharp-linux-x64 0.35.5 with @img/sharp-libvips-linux-x64 1.3.4.
  The runtime read from the binaries is unchanged: Node-API 9, glibc >= 2.28, x86-64.
- Docs: the module guide's note on available supplements.

No version bump, no publication, no tag.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
ekklesia
2026-10-08 21:34:35 -05:00
co-authored by Claude Opus 5.5
parent 1788d17f0a
commit afaf3a853c
155 changed files with 18580 additions and 30 deletions
@@ -0,0 +1,220 @@
# Provenance: license supplement for `@img/[email protected]`
This is the human-readable record of how the reviewed material in `supplement.json` was assembled
(ADR 0052). The packager does not read this file. It reads only `supplement.json` and the texts that
file lists, each one named by its SHA-256.
Review of this supplement is project and code review of a build input. It checks that the material
matches the sources named below. **It is not legal review.** It does not establish that every
redistribution obligation for this binary is met. In particular, it does not decide whether or how
the source-availability obligations of its LGPL and MPL components are met, which remains open.
The supplement for 1.3.3 beside this one is unchanged and still applies to that version. This one
was assembled the same way, from 1.3.4's own inputs; [Changes from 1.3.3](#changes-from-133) lists
every difference.
## The package
| Field | Value |
| --- | --- |
| Package | `@img/sharp-libvips-linux-x64` 1.3.4, from the npm registry |
| npm integrity | `sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==` |
| Declared licence | `LGPL-3.0-or-later` |
| Content digest | `ekklesia-content-v1:sha256:2927fe11493461fa34847191d0b9b1c6441007c3e99f306e5708cb07fb0a5e59` |
It is the libvips package `sharp` 0.35.5 loads on Linux x64 with glibc, through
`@img/sharp-linux-x64` 0.35.5.
The content digest is over the six files the packager copies: `README.md`, `package.json`,
`versions.json`, `lib/index.js`, `lib/glib-2.0/include/glibconfig.h`, and
`lib/libvips-cpp.so.8.18.7`. It was computed twice and gave the same result both times: once from
the copy pnpm installed, and once from the registry tarball extracted directly.
The package ships no licence text and no notices. Its README lists 29 libraries and the licence each
is used under, mostly as links. `lib/libvips-cpp.so.8.18.7` is one shared object with those
libraries built into it. Like 1.3.3's, it dynamically links only the host's `libstdc++.so.6`,
`libgcc_s.so.1`, and glibc libraries, and needs no glibc symbol version newer than `GLIBC_2.28`.
## What was built into the binary
The build is sharp-libvips v1.3.4:
- source: `https://github.com/lovell/sharp-libvips/archive/refs/tags/v1.3.4.tar.gz`;
- sha256: `a8e96acb479c9bc1a5b7950f8f25aa6c8e1ef3a19755b45cf2f00d506aeaccc0`.
The build is defined by `build/posix.sh`, `platforms/linux-x64/Dockerfile`, and
`versions.properties`. Its `versions.properties` matches the package's own `versions.json`.
- **C and C++ libraries.** 27 libraries are built from the upstream archives below, at exactly the
URLs `build/posix.sh` fetches.
- `proxy-libintl` is listed in `versions.json` but is built only for musl and macOS, not for
linux-x64 (glibc). It is therefore not a component of this binary.
- Highway is built, because `WITHOUT_HIGHWAY` is unset for linux-x64.
- **Build-time patches.** `build/posix.sh` applies five patches it downloads while building, listed
under [Build-time patches](#build-time-patches) with the SHA-256 of each as downloaded for this
record. GitHub generates `.patch` responses on request, so a later download is not guaranteed to be
byte-identical. None of them changes a licence, a licence file, or a Cargo manifest or lockfile.
The librsvg patch is new in v1.3.4 (see below); the other four were applied by v1.3.3 too.
- **gvdb.** glib is configured with `--force-fallback-for=gvdb`, so the gvdb subproject shipped
inside glib's archive is built in. Its LGPL-2.1-or-later files are taken from that archive.
- **librsvg's Rust crates.**
- **What the build does.** It edits `rsvg/Cargo.toml` and `librsvg-c/Cargo.toml`, dropping the
`gif` and `webp` image features and the `pdf` and `ps` cairo features. It runs
`cargo update --workspace`, then applies GNOME/librsvg commit
`9106011db93d701728ac2c9da50c9ab2c1bb5dc6` ("Ensure embedded image memory limits are enforced"),
which changes `include/librsvg/rsvg.h`, `rsvg-convert.rst`, `rsvg/src/api.rs`, and
`rsvg/src/document.rs` only. It then builds `librsvg-c` with
`cargo cbuild --locked --release --target x86_64-unknown-linux-gnu`, with neither the AVIF nor
the pixbuf feature (no dav1d, pixbuf disabled).
- **How it was reproduced.** In `rust:1-slim` (cargo 1.99.0), with the same edits, librsvg
2.63.2's shipped `Cargo.lock` (sha256
`e79e2a2735a0b5b151bb4133becd3008223fabedd34a8b787a872edab9854941`) was updated with
`cargo update --workspace`, and the patch was then applied; it applied cleanly.
- That removed only the crates the edits drop (color_quant, gif, image-webp, and weezl). It
changed no other version, so the compiled set follows from the shipped lockfile.
- The resulting `Cargo.lock` has sha256
`5723e14ce316e9058c76257848e18ab52624c98d16f758b5f8a73b5007b2ab8b`.
- **The crate set.** `cargo tree -p librsvg-c --features capi --target x86_64-unknown-linux-gnu -e
normal` lists the crates. Procedural-macro crates are included, which is conservative.
- **Where the files come from.** Each crate's licence files are taken from its published `.crate`
file. The crate's sha256 is the `checksum` from that `Cargo.lock`.
- **Exceptions.**
- `selectors` 0.40.0 (MPL-2.0) ships no licence file, so it carries the standard MPL-2.0 text.
- `mutants` 0.0.4 (MIT) ships no licence file. It is a no-op attribute macro that runs only at
compile time and contributes no code to the binary, so it is not a component.
- **The Rust standard library.**
- The binary records `/rustc/75a75c3e0a67d3fa3d03982775f5bb0356e7b510/…` paths. That is a nightly
rustc commit, merged on 2026-09-26, the day before the sharp-libvips v1.3.4 sources are dated.
- Its std lockfile (`library/Cargo.lock`) pins the five crate versions that are visible in the
binary's strings: addr2line 0.27.1, gimli 0.34.0, hashbrown 0.17.1, miniz_oxide 0.9.1, and
rustc-demangle 0.1.28.
- **Where the files come from.** `COPYRIGHT`, `LICENSE-APACHE`, `LICENSE-MIT`, and
`library/compiler-builtins/LICENSE.txt` are taken from that commit.
- **The crates covered.** These are std's crates.io dependencies for x86_64-unknown-linux-gnu, read
from `library/std/Cargo.toml`'s target sections at that commit:
- addr2line, adler2, cfg-if, foldhash, gimli, hashbrown, libc, memchr, miniz_oxide, object, and
rustc-demangle;
- each with its `.crate` file's licence files, at the versions and checksums `library/Cargo.lock`
records.
- **Not covered**, because it is not linked into this target:
- build-only: cc, shlex, find-msvc-tools;
- test-only: rand, rand_core, rand_xorshift, and getopts (used only by the `test` crate);
- compiler-only: rustc-literal-escaper (used only by the `proc_macro` crate);
- other platforms: dlmalloc, fortanix-sgx-abi, hermit-abi, moto-rt, r-efi, r-efi-alloc, unwinding,
vex-sdk, wasip1, wasip2, wasip3, wit-bindgen.
- **Not redistributed here.** The binary dynamically links the host's `libstdc++.so.6`,
`libgcc_s.so.1`, and glibc libraries. They come from the system that loads the package, so they
are not part of this package.
## Standard texts added
| Text | Source | sha256 |
| --- | --- | --- |
| GNU LGPL 3.0, for the package's declared `LGPL-3.0-or-later` | https://www.gnu.org/licenses/lgpl-3.0.txt | `e3a994d82e644b03a792a930f574002658412f62407f5fee083f2555c5f23118` |
| GNU GPL 3.0, which the LGPL 3.0 incorporates | https://www.gnu.org/licenses/gpl-3.0.txt | `3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986` |
| MPL 2.0 | https://www.mozilla.org/MPL/2.0/ (text file `index.f75d2927d3c1.txt`) | `3f3d9e0024b1921b067d6f7f88deb4a60cbe7a78e76c64e3f1d7fc3b779b9d04` |
The MPL 2.0 text is carried for `selectors` only, which ships no licence file.
**cairo.** sharp-libvips v1.3.4's `THIRD-PARTY-NOTICES.md` and the package README state that cairo is
used under the Mozilla Public License 1.1. (v1.3.3 stated MPL 2.0, and its supplement therefore added
the standard MPL 2.0 text for cairo.) cairo ships the MPL 1.1 text itself, as `COPYING-MPL-1.1`, so
this supplement carries cairo's own `COPYING`, `COPYING-LGPL-2.1`, and `COPYING-MPL-1.1` and adds no
standard text for it.
Licence names in `supplement.json` are as sharp-libvips's `THIRD-PARTY-NOTICES.md` states them for
each library, and as each crate's `Cargo.toml` declares it. They are recorded, not determined.
## Upstream archives (C and C++ libraries)
Each archive was downloaded from exactly the URL `build/posix.sh` uses for the versions in
`versions.properties`:
| Archive | sha256 |
| --- | --- |
| `cairo-1.18.6.tar.xz` | `1c767308174337a74694da0f3ec069c271452163a1ef4540964c50c301f157d4` |
| `cgif-0.5.4.tar.gz` | `83a70a15bc2da41f081a44ebc58ee48e2e1d524a6d3fdb4a24064afa08d5ad4d` |
| `expat-2.8.5.tar.xz` | `1e727b8933ec51a77a9a9d9afcf8e688bce45d907c13e36ab7393fe36e703182` |
| `fontconfig-2.18.3.tar.gz` | `9ae01e1d53acdef56010c5451cd34aa41d325b2faccd8606448d8fa01b2496b3` |
| `freetype-2.14.3.tar.gz` | `dc49de6b01a266eef4876a4dd34d9842c475d3e28ff2eff63bd2fb760ab56261` |
| `fribidi-1.0.17.tar.xz` | `6949dcde27d41cebad1fd741fcafc36d55a1020d2d872d4a6eb3914caabbada2` |
| `glib-2.90.0.tar.xz` | `17d15cac2af80a33271127408e0abc2748eb297c595c2a26409e81e14e7d1b8f` |
| `harfbuzz-14.5.0.tar.gz` | `97ec7488a46b974e18e08ee774af93173e7e1dbf738424796eb315ebcb735ec5` |
| `highway-1.4.0.tar.gz` | `e72241ac9524bb653ae52ced768b508045d4438726a303f10181a38f764a453c` |
| `lcms2-2.19.1.tar.gz` | `bfc54f7bab59fbc921012014a8032e4cba4abd46db47d46b76416a8c0b2815c8` |
| `libaom-3.15.1.tar.gz` | `8ca0c52746174603500f0adb6f2a215d69c9ca2aab2acb3caa06fb791d8d01bf` |
| `libarchive-3.8.9.tar.xz` | `888c934f9d95648ecb9163dc8e23ab80a476ecb81a8f1154704a227b5b676dde` |
| `libexif-0.6.26.tar.xz` | `4a055ed6575e61ca46c3172be3c753cc16c9becd0f99ec71d58dd0e471476c0c` |
| `libffi-3.8.0.tar.gz` | `7da3e2d9a171eb0a038f592ecad3ff2bb2550f3496d87b3b29ad0cf4430c0db4` |
| `libheif-1.23.5.tar.gz` | `fd9036064c4432f0550d15072ddf34956a248279ee9aeaff0fba3fa0f77d8f1a` |
| `libimagequant-2.4.1.tar.gz` | `47d2a84b7b1052975c9d50a3d4e3cacbf57b43d84a4c3131210848ead9964dfb` |
| `libpng-1.6.58.tar.gz` | `a9d4df463d36a6e5f9c29bd6f4967312d17e996c1854f3511f833924eb1993cf` |
| `librsvg-2.63.2.tar.xz` | `852b18e1a00b8605528825a27dc7748bff2a5dd254028f59dc22a34ea57e81b6` |
| `libtiff-v4.7.2.tar.gz` | `62b15f44c10106065211efa22a2dc77937bd97ee1f6e3afd2c9659010de112eb` |
| `libultrahdr-2.0.2.tar.gz` | `aa8d193bb887c348c419780511dd03b374f4e07af8812b6d3f80c8537cf1ef2c` |
| `libwebp-1.6.0.tar.gz` | `e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564` |
| `libxml2-2.15.4.tar.xz` | `98087fd181d9070724f3fbc65c7377db03038eb92bd882374daff44940138821` |
| `mozjpeg-0826579.tar.gz` | `b680167bd5d9afebdd576a12f8c49d2c9066a3b92ef96a2b2c5f7829b8600fe5` |
| `pango-1.58.2.tar.xz` | `342385b6ca3b7c73455d7c80a13b7dbe4489e00bc3bd4c5bd6ed4dce421e374a` |
| `pixman-0.46.4.tar.gz` | `d09c44ebc3bd5bee7021c79f922fe8fb2fb57f7320f55e97ff9914d2346a591c` |
| `vips-8.18.7.tar.xz` | `5baaead3b0bb20ffdb9e9ff09aa9fda08620923df77b63b436654cb5e0b3bf94` |
| `zlib-ng-2.3.3.tar.gz` | `f9c65aa9c852eb8255b636fd9f07ce1c406f061ec19a2e7d508b318ca0c907d1` |
## Build-time patches
| Patch, as `build/posix.sh` downloads it | sha256 as downloaded on 2026-10-09 |
| --- | --- |
| https://gist.github.com/kleisauke/284d685efa00908da99ea6afbaaf39ae/raw/bdad5489a61c217850631571caf57f5db6ea8b2c/glib-without-gregex.patch | `b1f2930a11292e529de137c7eb723850e0cc0969b1a2b0358196389312acd272` |
| https://github.com/mozilla/mozjpeg/commit/f90668e0e4fb79c81e1f24a0ccc0e2090af761bf.patch | `a65f87cadf3a6052e44d6314c906f6e2891352f82646b8a6f0b8fcf2c1891e7c` |
| https://github.com/GNOME/librsvg/commit/9106011db93d701728ac2c9da50c9ab2c1bb5dc6.patch | `8b841d2ec8feb964fa76859075e0e0c41b69136ba143cf0d26469d9bebc19231` |
| https://patch-diff.githubusercontent.com/raw/google/libultrahdr/pull/383.patch | `57658db2a11ae964755e513b01db21bcfa408c350b11b3a6ef9bc8576fb749ba` |
| https://gist.githubusercontent.com/lovell/313a6901e9db1bf285f2a1f1180499e4/raw/3988223c7dfa4d22745d9392034b0117abef1446/libvips-cpp-soversion.patch | `256b7d6f8c973bb53b20cff5171c7117d6b35d3aa4e72d22cb906f4fe1e2c890` |
## Rust standard library sources
| File at rustc `75a75c3e0a67d3fa3d03982775f5bb0356e7b510` | sha256 |
| --- | --- |
| `COPYRIGHT` | `172020dbfd5b53a226dfde77616190a48dcff519b0bc0e6deb91a8450782c4af` |
| `LICENSE-APACHE` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a` |
| `LICENSE-MIT` | `b71bd43a069ca0641a9ecfe585ca7b3c53b5cc1608f8b68321168698e28b5ea1` |
| `library/compiler-builtins/LICENSE.txt` | `ab6eec6caf0fa5775e411c7a8bc6a45c4ef2956b0980b157ab74fc5cd62a928b` |
| `library/Cargo.lock` | `45e36114b9fbeb1a778c470ea4e3a6e31b9ac2029de0d9a7077abac757ec0b29` |
Each crate's `.crate` source and sha256 are recorded in that crate's `source` in `supplement.json`.
## Changes from 1.3.3
Computed by comparing the two supplements, not by editing 1.3.3's.
- **Libraries.** Eleven of the 27 moved: aom 3.15.0 → 3.15.1, cairo 1.18.4 → 1.18.6, cgif 0.5.3 →
0.5.4, expat 2.8.3 → 2.8.5, fribidi 1.0.16 → 1.0.17, glib 2.89.4 → 2.90.0 (and its gvdb),
harfbuzz 14.3.1 → 14.5.0, libheif 1.23.2 → 1.23.5, librsvg 2.62.91 → 2.63.2, libvips 8.18.6 →
8.18.7, libxml2 2.15.3 → 2.15.4. The other sixteen archives are byte-identical to 1.3.3's.
- **Licence files.** In the eleven moved archives, no licence file was added, removed, or renamed.
One changed: fribidi's `COPYING`, still the GNU LGPL 2.1, with re-indented text and the FSF's
postal address replaced by its web address. The new file is carried as shipped.
- **cairo's stated licence.** MPL 2.0 → MPL 1.1, as above; the standard MPL 2.0 text is no longer
carried for cairo.
- **librsvg's crates.** 141 → 147:
- added: core_detect 1.0.0, multiversion 0.9.0, multiversion-macros 0.9.0, multiversion_no_op
1.0.0, rustversion 1.0.23, simdutf8 0.1.5, and miniz_oxide 0.9.1 beside 0.8.9;
- removed: tinyvec_macros 0.1.1;
- 48 crates moved to another version.
- **The Rust standard library.** The rustc commit moved, to `75a75c3e…`. Its licence files are
byte-identical to the ones taken at `787af2b8…`, and the eleven linked std crates have the same
versions and checksums.
- **sharp-libvips's own files.** `THIRD-PARTY-NOTICES.md` changed only in cairo's line; `LICENSE` is
unchanged.
- **Totals.** 184 → 190 components, 143 → 146 texts: 8 texts added (fribidi's `COPYING`, v1.3.4's
`THIRD-PARTY-NOTICES.md`, and the new crates' licence files) and 5 no longer needed (fribidi
1.0.16's `COPYING`, v1.3.3's `THIRD-PARTY-NOTICES.md`, and tinyvec_macros's three licence files).
## Open questions this supplement does not answer
- **Source availability.** The LGPL components (libvips, glib, gvdb, pango, fribidi, libexif,
libheif, librsvg, cairo under the LGPL alternative) and the MPL components (cairo and the MPL Rust
crates) carry source-availability obligations. Whether and how those are met when this binary is
redistributed has not been determined. Recording the upstream source locations and patches above
does not determine it.
- **Upstream accuracy.** The licence each library is used under is sharp-libvips's statement. For
example, it states that the LGPL libraries are used under LGPLv3 through the "any later version"
clause, and that cairo is used under MPL 1.1. These statements are recorded, not verified.