Skip to content

build.ncl: declare + cross-source audit license_spdx (282 declared, 38 corrected; infra#193 follow-up)#236

Merged
bryan-minimal merged 3 commits into
mainfrom
enrich-license-spdx
Jun 10, 2026
Merged

build.ncl: declare + cross-source audit license_spdx (282 declared, 38 corrected; infra#193 follow-up)#236
bryan-minimal merged 3 commits into
mainfrom
enrich-license-spdx

Conversation

@bryan-minimal

@bryan-minimal bryan-minimal commented Jun 10, 2026

Copy link
Copy Markdown
Member

Declare + audit license_spdx across the package catalog (infra#193 follow-up)

Makes each package's license explicit and authoritative in build.ncl (a declared license_spdx trumps detection in the resolve chain), removes the per-build detection cost, and settles detector disagreements once and for all. What began as a 229-package backfill turned into a full cross-source license audit.

What's in the PR

1. Declared the detectable-but-undeclared set (229). Values came from the resolved license already in pkgsec.pkgs_commit_history.license — the #193 GitHub-wins backfill — so the github-vs-tarball disagreements were already settled the safe way.

2. Deep-dived the manual queue (53 of 56). The "undetectable" packages askalono + the GitHub API miss — custom LICENSE text (sqlite=blessing, postgres=PostgreSQL), prebuilt binaries (chromium-bin=BSD-3-Clause, jdk=GPL-2.0-only WITH Classpath-exception-2.0, pcre2=BSD-3-Clause WITH PCRE2-exception), or no upstream metadata — declared via per-package upstream-LICENSE verification. Version-matched the relicensing traps (terraform=BUSL-1.1, redis=AGPL-3.0-only OR SSPL-1.0, graphviz held at EPL-1.0 since the EPL-2.0 relicense postdates the pinned tag). Caught a provenance mislabel: bc is Gavin Howard's BSD-2 bc, not GNU bc.

3. Audited the auto-detected declarations and fixed three classes of askalono whole-tarball-scan artifact:

  • Compound false positives (13) — the scan folds vendored / test / per-file / data-file license text into AND-joined expressions. py-packaging (BSD-2-Clause AND Pixar)Apache-2.0 OR BSD-2-Clause (the Pixar match was in packaging's own _spdx.py id-lookup table); dbus, tcl, libffi likewise; ANDOR for choose-one duals (cairo, gmp, nettle, less, zstd).
  • Single-license false positives (3) — scanner matched a secondary license, missed the primary: liburcu (Boehm-GCLGPL-2.1-or-later AND …), perl (restored the Artistic arm), stack (LGPL-3.0BSD-3-Clause — the LGPL/GPL text was a LICENSE appendix).
  • Deprecated id forms (22) — bare GPL-2.0/GPL-3.0/AGPL-3.0/LGPL-2.1 → modern -only/-or-later, decided per each upstream's "or later" clause (e.g. linux_headers/virtio-linuxGPL-2.0-only WITH Linux-syscall-note; fio/libseccomp/grafana are genuinely -only).

CodeRabbit's inline comments are folded in — it independently flagged ~12 of the deprecated-form cases (plus autoconfGPL-3.0-or-later WITH Autoconf-exception-3.0 and libpnglibpng-2.0); the isDeprecatedLicenseId check found all 22, and dbus/libidn2 were already corrected by the compound audit.

Validation — five independent sources

Every declared id was checked against: (1) the canonical SPDX list (729 licenses + 85 exceptions — all valid), (2) the SPDX isDeprecatedLicenseId flag (zero deprecated remain), (3) per-package upstream LICENSE files (the audit workflows), (4) the GitHub license API, and (5) Repology distro consensus (235 license-family matches; the 9 disagreements all resolved as Repology project name-collisions or variant-naming where our value is confirmed correct — jdk=OpenJDK/Temurin vs Oracle, mpc=GNU MPC vs music-player client, ut=ksdme/ut vs boost-ext/ut). minimal dump --packages parses all 368.

Coverage — 327/339 declared (96.5%)

The 12 undeclared are intentional, each with cause:

Flagged follow-up (out of scope)

chromium-bin / chromium-headless-shell-bin set source_provenance to microsoft/playwright — the binary's download vehicle, not the Chromium project. The license (BSD-3-Clause, matching the Alpine/plurality tag) is correct, but a vuln scan would match Playwright's advisories and miss Chromium's CVEs. Worth a provenance fix in a separate change.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Added explicit SPDX license identifiers to package metadata across the catalog.
    • Improves license clarity and provenance for individual packages.
    • Enables better compliance reporting, auditing, and tooling that rely on standardized license metadata.

… infra#193 follow-up)

Adds the resolved SPDX license to the 229 build.ncl that detect a license
but did not declare one. Sourced from the DB resolved
pkgs_commit_history.license (the GitHub-wins resolution from the #193
backfill) so disagreements are already settled the safe way; no
re-detection needed. A declared license_spdx is authoritative (trumps
detection), making the license explicit + source-of-truth in build.ncl.

The 66 truly-undetectable packages (sqlite/postgres/X11/prebuilts) stay
the manual queue. Validated: minimal dump --packages parses all 368.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds license_spdx metadata entries to many package build specifications in attrs. The changes are limited to build manifest metadata and do not alter package build steps, outputs, or dependencies.

Changes

Package build license metadata

Layer / File(s) Summary
Permissive identifiers
packages/abseil-cpp/build.ncl, packages/actions-runner/build.ncl, packages/agent-browser/build.ncl, packages/ast-grep/build.ncl, packages/atuin/build.ncl, packages/bat/build.ncl, packages/biff/build.ncl, packages/bottom/build.ncl, packages/c-ares/build.ncl, packages/cabal/build.ncl, packages/cmake/build.ncl, packages/cython/build.ncl, packages/dav1d/build.ncl, packages/delta/build.ncl, packages/difftastic/build.ncl, packages/dust/build.ncl, packages/expat/build.ncl, packages/eza/build.ncl, packages/file/build.ncl, packages/flit-core/build.ncl, packages/gawk/build.ncl, packages/gdbm/build.ncl, packages/gettext/build.ncl, packages/golangci-lint/build.ncl, packages/gopls/build.ncl, packages/govulncheck/build.ncl, packages/grpcurl/build.ncl, packages/grype/build.ncl, packages/helm/build.ncl, packages/hex-patch/build.ncl, packages/hexhog/build.ncl, packages/iana-etc/build.ncl, packages/icu/build.ncl, packages/imgcatr/build.ncl, packages/iproute2/build.ncl, packages/jansson/build.ncl, packages/jaq/build.ncl, packages/jnv/build.ncl, packages/jqfmt/build.ncl, packages/jsongrep/build.ncl, packages/kittyview/build.ncl, packages/lcms2/build.ncl, packages/lean/build.ncl, packages/libaom/build.ncl, packages/libass/build.ncl, packages/liberation-fonts/build.ncl, packages/libffi/build.ncl, packages/libgd/build.ncl, packages/libopus/build.ncl, packages/libpsl/build.ncl, packages/libssh2/build.ncl, packages/libuv/build.ncl, packages/libvips/build.ncl, packages/libvmaf/build.ncl, packages/libvpx/build.ncl, packages/libwebp/build.ncl, packages/libyaml/build.ncl, packages/lief/build.ncl, packages/llvm-bootstrap/build.ncl, packages/llvm/build.ncl, packages/manifold/build.ncl, packages/mermaid-ascii/build.ncl, packages/meson-python/build.ncl, packages/meson/build.ncl, packages/nasm/build.ncl, packages/nats-cli/build.ncl, packages/nats-server/build.ncl, packages/nghttp2/build.ncl, packages/nghttp3/build.ncl, packages/nickel-lsp/build.ncl, packages/nickel/build.ncl, packages/ninja/build.ncl, packages/node-lts/build.ncl, packages/node/build.ncl, packages/nushell/build.ncl, packages/onetbb/build.ncl, packages/oniguruma/build.ncl, packages/openblas/build.ncl, packages/opencode/build.ncl, packages/opencv/build.ncl, packages/openssl/build.ncl, packages/or-tools/build.ncl, packages/otel-collector/build.ncl, packages/pulumi/build.ncl, packages/py-build/build.ncl, packages/railway/build.ncl, packages/rust-arm-embedded/build.ncl, packages/scrt/build.ncl, packages/skopeo/build.ncl, packages/spire/build.ncl, packages/syft/build.ncl, packages/tailscale/build.ncl, packages/tree-sitter/build.ncl, packages/typst/build.ncl, packages/ut/build.ncl, packages/varlock/build.ncl, packages/wget/build.ncl, packages/xcb-proto/build.ncl, packages/yazi/build.ncl, packages/yq/build.ncl, packages/z3/build.ncl, packages/zellij/build.ncl, packages/zig/build.ncl, packages/zizmor/build.ncl
attrs gains license_spdx values for packages licensed under MIT, Apache-2.0, BSD variants, ISC, and other permissive identifiers.
Copyleft identifiers
packages/acl/build.ncl, packages/alsa-lib/build.ncl, packages/at-spi2-core/build.ncl, packages/atk/build.ncl, packages/attr/build.ncl, packages/autoconf/build.ncl, packages/automake/build.ncl, packages/bash-bootstrap/build.ncl, packages/bash/build.ncl, packages/binutils-arm-none-eabi/build.ncl, packages/binutils/build.ncl, packages/bison/build.ncl, packages/bzip3/build.ncl, packages/check/build.ncl, packages/coreutils/build.ncl, packages/dejagnu/build.ncl, packages/diffoscope/build.ncl, packages/diffutils/build.ncl, packages/emacs-config-dev1/build.ncl, packages/emacs/build.ncl, packages/eudev/build.ncl, packages/elfutils/build.ncl, packages/flex/build.ncl, packages/foundationdb/build.ncl, packages/fribidi/build.ncl, packages/gawk-bootstrap/build.ncl, packages/gcc-arm-none-eabi/build.ncl, packages/gcc/build.ncl, packages/ghostscript/build.ncl, packages/glibc/build.ncl, packages/gmp/build.ncl, packages/gnutls/build.ncl, packages/grep/build.ncl, packages/groff/build.ncl, packages/gurk/build.ncl, packages/gzip/build.ncl, packages/gws/build.ncl, packages/libcap-ng/build.ncl, packages/libcap/build.ncl, packages/libidn2/build.ncl, packages/libpipeline/build.ncl, packages/libseccomp/build.ncl, packages/libtool/build.ncl, packages/libunistring/build.ncl, packages/libx264/build.ncl, packages/libx265/build.ncl, packages/m4/build.ncl, packages/make/build.ncl, packages/man-db/build.ncl, packages/mpfr/build.ncl, packages/mtools/build.ncl, packages/nano/build.ncl, packages/nettle/build.ncl, packages/pango/build.ncl, packages/patch/build.ncl, packages/patchelf/build.ncl, packages/pciutils/build.ncl, packages/perl/build.ncl, packages/picocom/build.ncl, packages/procps-ng/build.ncl, packages/screen/build.ncl, packages/sed/build.ncl, packages/setuptools/build.ncl, packages/shadow/build.ncl, packages/shellcheck/build.ncl, packages/stack/build.ncl, packages/teamtype/build.ncl, packages/time/build.ncl, packages/tar/build.ncl, packages/tmux/build.ncl, packages/util-linux/build.ncl, packages/virtio-linux/build.ncl, packages/weathr/build.ncl
attrs gains license_spdx values that are GPL/LGPL/AGPL/MPL-based, including several compound expressions and exception-bearing identifiers.
Composite and package-specific identifiers
packages/bzip2/build.ncl, packages/dfu-util/build.ncl, packages/dnsutils/build.ncl, packages/libpng/build.ncl, packages/liburcu/build.ncl, packages/libxdmcp/build.ncl, packages/libxdamage/build.ncl, packages/libxshmfence/build.ncl, packages/libxcb/build.ncl, packages/libxau/build.ncl, packages/ncurses/build.ncl, packages/nginx/build.ncl, packages/nss/build.ncl, packages/pkgconf/build.ncl, packages/prek/build.ncl, packages/ripgrep/build.ncl, packages/socat/build.ncl, packages/tcl/build.ncl, packages/unzip/build.ncl, packages/xorgproto/build.ncl, packages/zlib/build.ncl, packages/zstd/build.ncl
attrs gains license_spdx values that are composite SPDX expressions or package-specific identifiers such as bzip2-1.0.6, pkgconf, Info-ZIP, Zlib, and multi-license expressions.

Sequence Diagram(s)

None.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hop through manifests, line by line,
SPDX tags bloom in a tidy vine.
MIT, GPL, and Apache too,
Little license carrots, fresh and new.
My whiskers twitch at each build spec glow,
Then off I bounce—review complete, ho!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch enrich-license-spdx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 19

🧹 Nitpick comments (1)
packages/gawk-bootstrap/build.ncl (1)

43-46: 💤 Low value

Missing Attrs type annotation on attrs block.

The attrs block on line 43 is missing the | Attrs type annotation that is present in other files (e.g., file/build.ncl line 86, findutils/build.ncl line 67). While this doesn't affect the license_spdx addition in this PR, consider adding the annotation for consistency.

♻️ Proposed fix to add type annotation
-  attrs = {
+  attrs = {
     upstream_version = version,
     license_spdx = "GPL-3.0-only",
-  },
+  } | Attrs,

Note: You'll also need to import Attrs on line 1:

-let { BuildSpec, Local, OutputBin, OutputData, OutputLib, Source, .. } = import "minimal.ncl" in
+let { Attrs, BuildSpec, Local, OutputBin, OutputData, OutputLib, Source, .. } = import "minimal.ncl" in
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/gawk-bootstrap/build.ncl` around lines 43 - 46, The attrs block in
build.ncl lacks the consistent type annotation; add the union type annotation by
changing the attrs declaration to include "| Attrs" (i.e., use the same typed
attrs pattern as other files) and import the Attrs symbol at the top of the file
so the annotation resolves; update the attrs declaration and add the Attrs
import near the existing imports to match the style used in file/build.ncl and
findutils/build.ncl.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/autoconf/build.ncl`:
- Line 36: Update the SPDX expression stored in the license_spdx variable for
the Autoconf package: replace the incorrect "(GPL-2.0-only AND GPL-3.0-only)"
value with the correct "GPL-3.0-or-later WITH Autoconf-exception-3.0" string so
the license_spdx reflects GPL-3.0-or-later plus the Autoconf Configure Script
Exception (Autoconf-exception-3.0).

In `@packages/bzip3/build.ncl`:
- Line 51: Update the SPDX license identifier by changing the value assigned to
the license_spdx variable from "LGPL-3.0" to "LGPL-3.0-only" in the build.ncl
manifest; locate the license_spdx assignment and replace the string literal to
reflect upstream’s LGPL-3.0-only licensing.

In `@packages/dbus/build.ncl`:
- Line 54: The SPDX expression in build.ncl uses license_spdx =
"(BSD-3-Clause-HP AND FSFULLRWD)"; verify that this reflects dbus’s actual
licensing (i.e., both licenses apply conjunctively to the same content) rather
than an OR/dual-license or file‑scoped split, and update the license_spdx value
accordingly; inspect upstream dbus license headers/COPYING to determine whether
you should use AND, OR, or a combined per‑file expression and then replace the
license_spdx token in the file with the correct canonical SPDX expression (using
the SPDX identifiers BSD-3-Clause-HP and FSFULLRWD as appropriate).

In `@packages/emacs-config-dev1/build.ncl`:
- Line 191: The SPDX identifier used in the build.ncl is deprecated: update the
license_spdx value (the license_spdx symbol) to a current SPDX identifier by
replacing "GPL-3.0" with either "GPL-3.0-only" or "GPL-3.0-or-later" to reflect
the project’s licensing intent; choose the correct one for your project and
ensure any related documentation or metadata is consistent with that choice.

In `@packages/eudev/build.ncl`:
- Line 39: The SPDX identifier in the build.ncl entry uses the deprecated
"GPL-2.0"; update the license_spdx value to a current SPDX identifier by
replacing "GPL-2.0" with either "GPL-2.0-only" if the code is licensed strictly
under v2, or "GPL-2.0-or-later" if the "or later" clause applies; modify the
license_spdx assignment in the file (the license_spdx symbol) accordingly so the
project uses a valid SPDX identifier.

In `@packages/fio/build.ncl`:
- Line 44: Update the SPDX identifier assigned to the license_spdx field: change
the current value "GPL-2.0" to "GPL-2.0-only" in the build.ncl entry where
license_spdx is defined so it accurately reflects fio's GPLv2-only licensing.

In `@packages/fribidi/build.ncl`:
- Line 43: Replace the legacy SPDX string used in the build manifest: update the
license_spdx variable (currently set to "LGPL-2.1") to the explicit SPDX
identifier that matches upstream (either "LGPL-2.1-only" if the project is
licensed strictly under v2.1, or "LGPL-2.1-or-later" if the notice allows later
versions); verify the upstream license text to choose the correct one and then
set license_spdx accordingly.

In `@packages/grafana/build.ncl`:
- Line 54: Update the license_spdx value from "AGPL-3.0" to the canonical
"AGPL-3.0-only": locate the license_spdx assignment (currently set to
"AGPL-3.0") and change the string to "AGPL-3.0-only", preserving surrounding
syntax/commas so the build.ncl remains valid.

In `@packages/gurk/build.ncl`:
- Line 46: The package sets license_spdx = "AGPL-3.0" which is deprecated;
update the value of the license_spdx field in packages/gurk/build.ncl (the
license_spdx variable) to the correct SPDX identifier used by gurk-rs
upstream—either "AGPL-3.0-only" or "AGPL-3.0-or-later" as appropriate—so replace
"AGPL-3.0" with the chosen canonical identifier.

In `@packages/libcap-ng/build.ncl`:
- Line 56: Update the deprecated SPDX value in packages/libcap-ng/build.ncl by
replacing the bare "GPL-2.0" assigned to license_spdx with a correct SPDX
expression covering both licenses used in the repo (the utilities/scripts under
GPL-2.0-or-later and core under LGPL-2.1-or-later); set license_spdx to an
expression such as "LGPL-2.1-or-later OR GPL-2.0-or-later" (or an equivalent
SPDX expression) so the metadata accurately reflects both licenses.

In `@packages/libidn2/build.ncl`:
- Line 39: The SPDX expression assigned to license_spdx in the libidn2 package
is incorrect (uses AND and GPL-3.0-only); replace it with the correct upstream
expression for the library, e.g. "GPL-2.0-or-later OR LGPL-3.0-or-later" by
updating the license_spdx value in build.ncl, and if you're declaring the whole
package (including tools/tests/examples) add "OR GPL-3.0-or-later" to the
expression so the final SPDX matches upstream component scope.

In `@packages/libpng/build.ncl`:
- Line 41: The license_spdx value is outdated for libpng 1.6.58: update the
license_spdx variable (the assignment named license_spdx in the build.ncl for
libpng) from "libpng-1.6.35" to the correct SPDX identifier "libpng-2.0" so it
matches PNG Reference Library License v2 used by version 1.6.58; ensure no other
license fields conflict after the change.

In `@packages/libseccomp/build.ncl`:
- Line 43: Update the SPDX license identifier value to the correct modern
identifier by changing the license_spdx assignment in build.ncl from "LGPL-2.1"
to "LGPL-2.1-only" (i.e., locate the license_spdx = "LGPL-2.1" entry and set it
to "LGPL-2.1-only").

In `@packages/libusb/build.ncl`:
- Line 38: The SPDX identifier used in the build config is deprecated: update
the value of license_spdx (in packages/libusb/build.ncl) from "LGPL-2.1" to the
correct SPDX token that matches project intent—either "LGPL-2.1-only" or
"LGPL-2.1-or-later"—so change the license_spdx assignment accordingly (e.g., set
license_spdx = "LGPL-2.1-only" if the project intends only that version).

In `@packages/libvips/build.ncl`:
- Line 59: The SPDX identifier used in the build manifest is deprecated: update
the license_spdx value (the variable named license_spdx) to an explicit form
such as "LGPL-2.1-only" or "LGPL-2.1-or-later" that matches libvips' actual
licensing terms; replace the current "LGPL-2.1" string with the chosen explicit
identifier so SPDX tooling and compliance checks are correct.

In `@packages/patchelf/build.ncl`:
- Line 36: Update the package metadata to reflect the correct SPDX expression:
change the license_spdx value from "GPL-3.0" to "GPL-3.0-or-later" so it matches
the upstream COPYING wording; locate the license_spdx assignment in the
build.ncl (symbol: license_spdx) and replace the string literal accordingly.

In `@packages/pciutils/build.ncl`:
- Line 40: The license_spdx field currently uses the deprecated value "GPL-2.0";
update the license_spdx entry in the build.ncl (the license_spdx assignment) to
the correct SPDX identifier "GPL-2.0-or-later" so it reflects “GPL version 2, or
any later version”.

In `@packages/shellcheck/build.ncl`:
- Line 41: Update the license_spdx value to the correct SPDX identifier by
changing the variable license_spdx from "GPL-3.0" to "GPL-3.0-or-later"; locate
the declaration named license_spdx in the build.ncl for the ShellCheck package
and replace the string literal accordingly.

In `@packages/teamtype/build.ncl`:
- Line 38: The SPDX identifier is wrong: update the license_spdx assignment in
packages/teamtype/build.ncl from "AGPL-3.0" to "AGPL-3.0-or-later" so it matches
the LICENSE.md wording; locate the license_spdx declaration and replace the
string value accordingly to reflect the "or-later" variant.

---

Nitpick comments:
In `@packages/gawk-bootstrap/build.ncl`:
- Around line 43-46: The attrs block in build.ncl lacks the consistent type
annotation; add the union type annotation by changing the attrs declaration to
include "| Attrs" (i.e., use the same typed attrs pattern as other files) and
import the Attrs symbol at the top of the file so the annotation resolves;
update the attrs declaration and add the Attrs import near the existing imports
to match the style used in file/build.ncl and findutils/build.ncl.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fe8173fe-2a18-47f9-9e98-0c8ba46d0731

📥 Commits

Reviewing files that changed from the base of the PR and between 0a675d1 and ca36303.

📒 Files selected for processing (229)
  • packages/abseil-cpp/build.ncl
  • packages/acl/build.ncl
  • packages/actions-runner/build.ncl
  • packages/age/build.ncl
  • packages/agent-browser/build.ncl
  • packages/alex/build.ncl
  • packages/alsa-lib/build.ncl
  • packages/ast-grep/build.ncl
  • packages/at-spi2-core/build.ncl
  • packages/atk/build.ncl
  • packages/attr/build.ncl
  • packages/atuin/build.ncl
  • packages/autoconf/build.ncl
  • packages/automake/build.ncl
  • packages/bash-bootstrap/build.ncl
  • packages/bash/build.ncl
  • packages/bat/build.ncl
  • packages/biff/build.ncl
  • packages/binutils-arm-none-eabi/build.ncl
  • packages/binutils/build.ncl
  • packages/bison/build.ncl
  • packages/bottom/build.ncl
  • packages/bzip2/build.ncl
  • packages/bzip3/build.ncl
  • packages/c-ares/build.ncl
  • packages/cabal/build.ncl
  • packages/cairo/build.ncl
  • packages/check/build.ncl
  • packages/clipper2/build.ncl
  • packages/cmake/build.ncl
  • packages/coreutils/build.ncl
  • packages/cython/build.ncl
  • packages/dav1d/build.ncl
  • packages/dbus/build.ncl
  • packages/dejagnu/build.ncl
  • packages/delta/build.ncl
  • packages/dfu-util/build.ncl
  • packages/diffoscope/build.ncl
  • packages/difftastic/build.ncl
  • packages/diffutils/build.ncl
  • packages/dnsutils/build.ncl
  • packages/dust/build.ncl
  • packages/elfutils/build.ncl
  • packages/emacs-config-dev1/build.ncl
  • packages/emacs/build.ncl
  • packages/eudev/build.ncl
  • packages/expat/build.ncl
  • packages/eza/build.ncl
  • packages/file/build.ncl
  • packages/findutils/build.ncl
  • packages/fio/build.ncl
  • packages/flex/build.ncl
  • packages/flit-core/build.ncl
  • packages/foundationdb/build.ncl
  • packages/fribidi/build.ncl
  • packages/gawk-bootstrap/build.ncl
  • packages/gawk/build.ncl
  • packages/gcc-arm-none-eabi/build.ncl
  • packages/gcc/build.ncl
  • packages/gdbm/build.ncl
  • packages/gettext/build.ncl
  • packages/ghc/build.ncl
  • packages/ghostscript/build.ncl
  • packages/glibc/build.ncl
  • packages/gmp/build.ncl
  • packages/gnutls/build.ncl
  • packages/golangci-lint/build.ncl
  • packages/gopls/build.ncl
  • packages/govulncheck/build.ncl
  • packages/gperf/build.ncl
  • packages/gradle/build.ncl
  • packages/grafana/build.ncl
  • packages/grep/build.ncl
  • packages/groff/build.ncl
  • packages/grpcurl/build.ncl
  • packages/grype/build.ncl
  • packages/gtest/build.ncl
  • packages/gurk/build.ncl
  • packages/gws/build.ncl
  • packages/gzip/build.ncl
  • packages/happy/build.ncl
  • packages/helm/build.ncl
  • packages/hex-patch/build.ncl
  • packages/hexhog/build.ncl
  • packages/iana-etc/build.ncl
  • packages/icu/build.ncl
  • packages/imgcatr/build.ncl
  • packages/inetutils/build.ncl
  • packages/iproute2/build.ncl
  • packages/jansson/build.ncl
  • packages/jaq/build.ncl
  • packages/jnv/build.ncl
  • packages/jqfmt/build.ncl
  • packages/jsongrep/build.ncl
  • packages/kittyview/build.ncl
  • packages/lcms2/build.ncl
  • packages/lean/build.ncl
  • packages/less/build.ncl
  • packages/libaom/build.ncl
  • packages/libass/build.ncl
  • packages/libcap-ng/build.ncl
  • packages/libcap/build.ncl
  • packages/liberation-fonts/build.ncl
  • packages/libffi/build.ncl
  • packages/libgd/build.ncl
  • packages/libidn2/build.ncl
  • packages/libopus/build.ncl
  • packages/libpipeline/build.ncl
  • packages/libpng/build.ncl
  • packages/libpsl/build.ncl
  • packages/libseccomp/build.ncl
  • packages/libsodium/build.ncl
  • packages/libssh2/build.ncl
  • packages/libsvtav1/build.ncl
  • packages/libtool/build.ncl
  • packages/libunistring/build.ncl
  • packages/liburcu/build.ncl
  • packages/libusb/build.ncl
  • packages/libuv/build.ncl
  • packages/libvips/build.ncl
  • packages/libvmaf/build.ncl
  • packages/libvpx/build.ncl
  • packages/libwebp/build.ncl
  • packages/libx264/build.ncl
  • packages/libx265/build.ncl
  • packages/libxau/build.ncl
  • packages/libxcb/build.ncl
  • packages/libxcrypt/build.ncl
  • packages/libxdamage/build.ncl
  • packages/libxdmcp/build.ncl
  • packages/libxshmfence/build.ncl
  • packages/libyaml/build.ncl
  • packages/lief/build.ncl
  • packages/linux_headers/build.ncl
  • packages/llvm-bootstrap/build.ncl
  • packages/llvm/build.ncl
  • packages/m4/build.ncl
  • packages/make/build.ncl
  • packages/man-db/build.ncl
  • packages/manifold/build.ncl
  • packages/mermaid-ascii/build.ncl
  • packages/mermaid-cli/build.ncl
  • packages/meson-python/build.ncl
  • packages/meson/build.ncl
  • packages/mpfr/build.ncl
  • packages/mtools/build.ncl
  • packages/nano/build.ncl
  • packages/nasm/build.ncl
  • packages/nats-cli/build.ncl
  • packages/nats-server/build.ncl
  • packages/ncurses/build.ncl
  • packages/nettle/build.ncl
  • packages/nghttp2/build.ncl
  • packages/nghttp3/build.ncl
  • packages/nginx/build.ncl
  • packages/nickel-lsp/build.ncl
  • packages/nickel/build.ncl
  • packages/ninja/build.ncl
  • packages/node-lts/build.ncl
  • packages/node/build.ncl
  • packages/nss/build.ncl
  • packages/numpy/build.ncl
  • packages/nushell/build.ncl
  • packages/onetbb/build.ncl
  • packages/oniguruma/build.ncl
  • packages/openblas/build.ncl
  • packages/opencode/build.ncl
  • packages/opencv/build.ncl
  • packages/openssl/build.ncl
  • packages/or-tools/build.ncl
  • packages/otel-collector/build.ncl
  • packages/pango/build.ncl
  • packages/patch/build.ncl
  • packages/patchelf/build.ncl
  • packages/pciutils/build.ncl
  • packages/perl/build.ncl
  • packages/picocom/build.ncl
  • packages/pkgconf/build.ncl
  • packages/prek/build.ncl
  • packages/probe-rs/build.ncl
  • packages/procps-ng/build.ncl
  • packages/procs/build.ncl
  • packages/pulumi/build.ncl
  • packages/py-build/build.ncl
  • packages/py-packaging/build.ncl
  • packages/pyproject-hooks/build.ncl
  • packages/pyproject-metadata/build.ncl
  • packages/railway/build.ncl
  • packages/readline/build.ncl
  • packages/ripgrep/build.ncl
  • packages/rust-arm-embedded/build.ncl
  • packages/screen/build.ncl
  • packages/scrt/build.ncl
  • packages/sed/build.ncl
  • packages/setuptools/build.ncl
  • packages/shadow/build.ncl
  • packages/shellcheck/build.ncl
  • packages/skopeo/build.ncl
  • packages/socat/build.ncl
  • packages/spire/build.ncl
  • packages/stack/build.ncl
  • packages/starship/build.ncl
  • packages/stlink/build.ncl
  • packages/syft/build.ncl
  • packages/tailscale/build.ncl
  • packages/tar/build.ncl
  • packages/tcl/build.ncl
  • packages/teamtype/build.ncl
  • packages/time/build.ncl
  • packages/tmux/build.ncl
  • packages/tree-sitter/build.ncl
  • packages/typst/build.ncl
  • packages/unzip/build.ncl
  • packages/ut/build.ncl
  • packages/util-linux/build.ncl
  • packages/varlock/build.ncl
  • packages/virtio-linux/build.ncl
  • packages/weathr/build.ncl
  • packages/wget/build.ncl
  • packages/xcb-proto/build.ncl
  • packages/xorgproto/build.ncl
  • packages/yazi/build.ncl
  • packages/yq/build.ncl
  • packages/z3/build.ncl
  • packages/zellij/build.ncl
  • packages/zig/build.ncl
  • packages/zizmor/build.ncl
  • packages/zlib/build.ncl
  • packages/zstd/build.ncl

Comment thread packages/autoconf/build.ncl Outdated
Comment thread packages/bzip3/build.ncl Outdated
Comment thread packages/dbus/build.ncl Outdated
Comment thread packages/emacs-config-dev1/build.ncl Outdated
Comment thread packages/eudev/build.ncl Outdated
attrs =
{
upstream_version = version,
license_spdx = "GPL-2.0",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use current SPDX identifier for GPL-2.0.

GPL-2.0 is deprecated in SPDX License List 3.0+. Use GPL-2.0-only (if no "or later" clause) or GPL-2.0-or-later (if "or later" clause applies).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/eudev/build.ncl` at line 39, The SPDX identifier in the build.ncl
entry uses the deprecated "GPL-2.0"; update the license_spdx value to a current
SPDX identifier by replacing "GPL-2.0" with either "GPL-2.0-only" if the code is
licensed strictly under v2, or "GPL-2.0-or-later" if the "or later" clause
applies; modify the license_spdx assignment in the file (the license_spdx
symbol) accordingly so the project uses a valid SPDX identifier.

Comment thread packages/libvips/build.ncl Outdated
Comment thread packages/patchelf/build.ncl Outdated
Comment thread packages/pciutils/build.ncl Outdated
Comment thread packages/shellcheck/build.ncl Outdated
Comment thread packages/teamtype/build.ncl Outdated
bryan-minimal and others added 2 commits June 9, 2026 19:22
Deep dive on the license_spdx coverage gap, two threads:

1. Manual queue — the "undetectable" packages askalono + the GitHub license
   API miss (custom LICENSE text, prebuilt binaries with no scannable source,
   or no upstream metadata). Declared canonical SPDX for 53 via per-package
   upstream-LICENSE verification: sqlite=blessing, postgres=PostgreSQL,
   redis=AGPL-3.0/SSPL (v8 era), terraform=BUSL-1.1, jdk=GPL-2.0 WITH
   Classpath-exception, pcre2=BSD-3 WITH PCRE2-exception, etc. bc corrected to
   BSD-2-Clause (the pinned 7.x is Gavin Howard's bc, not GNU bc). graphviz held
   at EPL-1.0 (the EPL-2.0 relicense postdates the pinned 14.1.1).
   3 stay undeclared with cause: android-sdk + claude-code (proprietary, no SPDX
   id), zsh (custom permissive license, no SPDX id). 7 internal/meta packages
   (base, toolchain, ...) and mono (rides with PR #233) excluded by design.

2. Compound-expression audit — the whole-tarball askalono scan over-matches,
   folding license text from vendored deps / test fixtures / data files /
   per-file headers into AND-joined expressions. Verified all 13 compounds
   against the real upstream LICENSE files:
   - false positives dropped: py-packaging (Pixar — matched packaging's OWN
     _spdx.py id lookup table, not a grant), tcl (SMLNJ), dbus (BSD-3-Clause-HP
     + FSFULLRWD — 0 hits across the source tree), libffi (GPL from build files)
   - AND->OR for choose-one duals: cairo, gmp, nettle, less, zstd
   - restored dropped options: gmp + nettle LGPL
   - precise exceptions: socat (openvpn-openssl-exception), autoconf
     (Autoconf-exception-generic-3.0)
   - dbus kept as (AFL-2.1 OR GPL-2.0-or-later) AND GPL-2.0-or-later: the
     package ships GPL-only dbus-* tools alongside the dual-licensed core.

Coverage 96.5% (327/339 packages). All 368 parse (minimal dump --packages).
Every declared id re-validated against the canonical SPDX list (729 licenses
+ 85 exceptions).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… cross-source audit)

Final-pass corrections after auditing the auto-detected declarations against
five independent sources: the SPDX canonical list, the SPDX isDeprecatedLicenseId
flag, per-package upstream LICENSE files, the GitHub license API, and Repology
distro consensus.

Single-license false positives (rare-id spot check — askalono matched a
secondary/vendored license and missed the primary):
- liburcu  Boehm-GC          -> LGPL-2.1-or-later AND LGPL-2.1-only AND MIT AND Boehm-GC
- perl     GPL-1.0-only      -> Artistic-1.0-Perl OR GPL-1.0-or-later
- stack    LGPL-3.0-only     -> BSD-3-Clause  (the LGPL/GPL-v3 text was a LICENSE appendix)

Deprecated SPDX id forms -> modern -only/-or-later, decided per the upstream
"or later" clause (CodeRabbit flagged ~12; the isDeprecatedLicenseId check found
all 22):
- fio GPL-2.0-only, libseccomp LGPL-2.1-only, grafana/gurk AGPL-3.0-only,
  bzip3 LGPL-3.0-only  (the explicit -only cases, verified against upstream)
- check/eudev/fribidi/libusb/libvips LGPL-2.1-or-later, patchelf/shellcheck/weathr/
  emacs-config-dev1 GPL-3.0-or-later, pciutils/picocom GPL-2.0-or-later,
  teamtype AGPL-3.0-or-later
- linux_headers/virtio-linux GPL-2.0-only WITH Linux-syscall-note (kernel is v2-only)
- compounds: libcap-ng (GPL-2.0-or-later AND LGPL-2.1-or-later), util-linux
  (GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause), libxcrypt
  (LGPL-2.1-or-later AND BSD-3-Clause AND BSD-2-Clause AND 0BSD)
- CR items: autoconf -> GPL-3.0-or-later WITH Autoconf-exception-3.0 (the
  autoconf-specific exception, not the generic one), libpng -> libpng-2.0

All 368 parse (minimal dump --packages). Every declared id re-validated:
canonical SPDX, zero deprecated. Repology cross-check: 235 license-family
matches, 9 disagreements all resolved (X11-variant naming, or Repology
project name-collisions where our value is confirmed correct via the GitHub
API: jdk=OpenJDK/Temurin vs Oracle, mpc=GNU MPC vs music-player client,
ut=ksdme/ut vs boost-ext/ut).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bryan-minimal bryan-minimal changed the title build.ncl: declare license_spdx for 229 packages (license enrichment, infra#193 follow-up) build.ncl: declare + cross-source audit license_spdx (282 declared, 38 corrected; infra#193 follow-up) Jun 10, 2026
@bryan-minimal bryan-minimal added this pull request to the merge queue Jun 10, 2026
Merged via the queue into main with commit 1975757 Jun 10, 2026
4 checks passed
@bryan-minimal bryan-minimal deleted the enrich-license-spdx branch June 10, 2026 03:23
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.

2 participants