Skip to content

ci: check dependency licenses - #15

Merged
PHPCraftdream merged 54 commits into
mainfrom
ci/license-compliance
Nov 2, 2026
Merged

PHPCraftdream merged 54 commits into
mainfrom
ci/license-compliance

Conversation

@PHPCraftdream

@PHPCraftdream PHPCraftdream commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Check Cargo/npm dependency licenses and isolated Python build/dev/test graphs across Python 3.9, 3.11 and 3.13 on Linux, macOS and Windows. Reject unrecognized metadata and verify reviewed legacy exceptions by exact version and license-file SHA-256.
  • Package both project licenses in pure wheels and verify exact bytes, uniqueness and metadata, including negative tests.
  • Share locked native notice preparation: source-backed Cargo license texts, additional notices, actual Rust compiler/std report and lock hash. Refuse evidence inside Cargo sources, nonempty staging directories and bundle overwrites. Verify exact bundle bytes and RECORD in actual wheels.
  • Build static PIC LLVM libunwind from source commit 87f0227cb60147a26a1eeb4fb06e3b505e9c7261. Include the complete original LICENSE and source-level notices/hashes for all 31 C/C++/ASM runtime files, including DWARF attribution; reject unreviewed source license headers.
  • Remove GCC unwinder/archive and startup objects from musllinux builds using a small project-owned ELF DSO handle/finalization hook following the Itanium ABI. Verify actual link inputs rather than linker-script wildcard selectors.
  • Verify both architectures' ELF/native payloads, compiler/lock consistency, notices, link maps, Rust TLS destruction, panic conversion and native suites. Test glibc dlclose and musl process-exit finalization separately; musl deliberately does not unload DSOs at dlclose.
  • Reuse the verified musllinux build/runtime workflow in production release configuration. The PR caller passes the pinned 0.8.1 source commit; production passes its own github.sha. Gate publication on that workflow, separate distribution wheel artifacts from audit evidence and download only wheels-* for publication. CI checks the caller/source/publish wiring.

Verified results

All 38 checks passed at 11c07f2c2fd116dd62f6765fbb0f4a53a8b30661, including source-level attribution, no-GCC link inputs, TLS/panic/DSO lifecycle and 3,503 development native tests per musllinux architecture.

All 38 checks passed at b910e6c0098c6d795ccc5bbefbe71fd1f935ba8f after the common preparation helper was introduced. The native evidence job passed 13 CLI tests and verified notices in a real wheel.

All 42 checks passed at 40f9ff9467723457e4893c6c8ba49ddcbb05439f. The isolated release-source pipeline checked out exact Python v0.8.1 commit 566bbfce6c6b48387d7a0a089939a26744013dea, preserved its manifest/binding sources and passed 2,732 release-tag tests per architecture plus lifecycle/ABI/notice gates.

Both actual release-source wheel artifacts were independently inspected: registry core 0.8.1 checksum 7140dfe2fa6c320e74768cd6a637828c2d26f81746254f4fcd805f3993bd3fd5, lock hash and bundled notice bytes matched. Each contained 37 package records and all 31 LLVM source notices. These are newly resolved builds of release source, not reproductions of historical wheels.

All 42 checks passed at 6668fb31bff28f05740d10cee7195cbabf793c4d after connecting the reusable musllinux path to production configuration and separating publishable artifacts.

Current head a9e992f672e1d47bd99e2b483bac2d3f81849597 passed all 48 checks. A second reusable workflow covers the six GNU/Linux, macOS and Windows targets. It verifies the exact notice bundle/RECORD, native format/architecture and actual compiler identity, and retains native headers/imports for the separate runtime audit. Installed-wheel smoke tests run only when the target matches the runner architecture; cross-target execution is not claimed. Production calls the same native workflow, with its own source commit, and publication requires its success. All eight native release targets now have notice packaging and artifact verification.

The six non-musl artifact reports were also independently inspected: each used source 566bbfce6c6b48387d7a0a089939a26744013dea, registry core 0.8.1 with the expected checksum, a matching lock hash, 37 package records and the correct native architecture. No local tests or builds were run.

Boundaries and remaining work

The release configuration changes are in this draft PR only: no merge, release, tag change, PyPI upload or IDE-store publication was performed. The packaging implementation is complete, but the wider non-Cargo CRT/SDK and historical-artifact audit remains separate. GNU wheels still reference external system libgcc_s; macOS references system libSystem/libiconv; Windows references CPython and the system CRT. These are not extra bundled native payload files, and their presence is not a blanket licensing approval for all compiler/SDK components.

The development manifest uses Git core 0.9.0, while the release provenance guard requires registry core 0.8.1. Their evidence is kept separate. No version, framework or core source was changed to bypass the guard.

Cargo graph coverage is conservative, not an exact linked-code inventory. Native runtime evidence is recorded separately. Packaging notices alone does not establish every distribution obligation or resolve the wider historical native-artifact audit.

The pinned upstream libunwind LICENSE references a CREDITS.TXT file absent from its source tree; this is recorded honestly. The complete original LICENSE and actual source-header notices are retained. Ktav's own license has not been changed or presented as replacing third-party conditions.

Historical 0.8.1 musllinux wheels remain unchanged and contain a separate GCC 12.4 libgcc_s without a separate GCC license/source-offer file. Their exact GCC source provenance and applicable obligations remain under review; the new LLVM path does not repair those artifacts.

🤖 Generated with Claude Code

PHPCraftdream and others added 30 commits October 28, 2026 16:06
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Inspect binary signatures as well as native file extensions so an
extensionless runtime library cannot bypass the musllinux inventory.
Cover additional native formats and extensionless binaries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Generate a deterministic bundle of source-backed Cargo license texts,
additional notices and the actual toolchain's Rust copyright report.
Build a wheel with the same lock and check exact bundle bytes and RECORD.
Keep local source paths out of the bundle.

This proves packaging for the conservative CI Cargo graph, not linked
code coverage or licensing of non-Cargo runtimes. Production release
integration remains separate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Avoid loading the native binding conftest before the evidence wheel
is built. Keep full binding tests in the main CI matrix. Fix Ruff
line length and ambiguous docstring characters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Generate the conservative Cargo and Rust std notice bundle from the
locked graph before building each musllinux wheel. Require the container
compiler provenance and lock to match the inputs, then verify exact
bundle bytes and RECORD in the actual wheel. Retain ABI, panic and
native corpus checks.

This does not cover the separate GCC runtime licensing assessment or
change production release configuration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build only static PIC libunwind from LLVM 20.1.8's exact source commit.
Verify the checkout is unchanged and record the original license and
archive hash inside the wheel's notice bundle. Replace Rust's explicit
gcc_s link with that archive, retaining panic unwinding and native tests.
Reject linked GCC runtime archive members in both link maps.

This is a CI-only alternative to the source-unverified GCC unwinder.
Historical packages and production release configuration are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Supply a project-owned ELF DSO handle and finalization hook, linking
without compiler startup files. Verify that Rust TLS destructors run
at thread exit and C++ destructors run once at dlclose in real musl
runtimes. Reject GCC crtbegin/crtend objects as well as archive members.
Retain panic conversion, native corpus, ABI and notice-bundle checks.

The replacement follows the Itanium C++ ABI DSO destruction contract.
This remains CI-only; production release and historical wheels are
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PHPCraftdream and others added 24 commits October 29, 2026 10:43
Print matched GCC objects and upload link maps even when the gate
fails, without relaxing the runtime check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GNU maps contain crtbegin/crtend wildcards in linker-script selectors
even when those objects are absent. Check actual LOAD records for CRT
objects and archive-member records for GCC runtime code. Add positive
and negative regression cases without allowing actual GCC inputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Musl deliberately makes dlclose a no-op and runs DSO destructors at
process exit. Check this in an isolated runner with a static counter
that remains alive through finalization. Check the same project-owned
DSO hook with real glibc unloading as well, and require exactly one
destructor call by exit on both platforms. Retain Rust TLS and panic
probes, native corpus and the fail-closed runtime inventory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Inventory pinned runtime source headers and their hashes in the notice
bundle, including the additional DWARF copyright notice in dwarf2.h.
Reject unreviewed source license headers and preserve the full original
leading notices rather than relying only on SPDX metadata.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Prepare Cargo license texts, notices and the actual Rust std report
from an existing lock without resolving dependencies again. Keep
evidence outside package sources, refuse overwrites and assert the
lock remains unchanged. Use the same helper in native and musllinux
evidence builds ahead of production release integration.

Add staging guard tests; keep exact wheel bundle, ABI and runtime
verification in the existing CI jobs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build both musllinux architectures from the exact published Python
source commit, overlaying only the PR's packaging tools and test-only
fixtures. Leave release manifests and binding sources unchanged and
verify registry core 0.8.1 provenance before generating locked notices.
Run the release tag's native suites, ELF/RECORD/link-map gates and
LLVM/TLS/panic/DSO lifecycle checks without publish permissions.

Validate both evidence workflows in the main CI syntax guard. This is
a new resolved build of release source, not a historical reproduction
or a release workflow execution.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Include the release tag's three README files in the read-only runtime
stage so documentation example tests inspect the real release inputs.
Do not skip tests or change documentation content.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Make the proven source-specific musllinux build and runtime checks a
reusable workflow. PR verification passes the pinned 0.8.1 source SHA;
production passes its own commit instead of silently building another
revision. Keep core provenance, notices, ABI and lifecycle gates.

Gate publication on the reusable workflow. Upload distribution wheels
separately from audit evidence and download only wheels-* artifacts
for publication. Add CI assertions for both callers and publish wiring.
No release or publication is invoked by this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Share native builds for GNU/Linux, macOS and Windows across both
architectures between PR release-source checks and production. Keep
source commits, registry core provenance and locked graph evidence
explicit without changing binding sources or versions.

Bind container compiler records to matching Rust std source evidence,
verify wheel ABI/native format/architecture/RECORD and exact notice
bytes, and retain native headers/imports separately for runtime audit.
Smoke-check installed wheels only on matching runner architectures.

Gate publication on the reusable native job; keep audit artifacts out
of distribution downloads. Add regression tests and matrix/caller
wiring assertions. Non-Cargo CRT/SDK licensing remains a separate audit.
No release or publication is invoked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apply dead_strip_dylibs only to the shared macOS release wheel path,
preserving existing Rust flags and all other platform behavior.
The observed candidate libraries load libiconv without importing any
iconv or charset symbol.

Require actual wheel dependency reports to contain only libSystem,
and reject iconv/charset undefined symbols or missing evidence.
Retain CPU, archive, notice and matching-host smoke checks.
Add regression cases without changing binding sources or versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Distinguish the dylib install name reported by otool -D from actual
dependencies shown by otool -L. Exclude only the exact first identity
entry; retain only-libSystem and no-iconv/charset guards, and reject
missing, mismatched or duplicate self identities.

Review nodeenv 1.11.1 from its digest-verified PyPI wheel. Its full
BSD license matches the already reviewed 1.11.0 bytes. Add only that
exact version/hash identity and retain unknown-version, changed-text
and incompatible-SPDX failures. No dependency versions are changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the verified pinned Rust compiler-builtins, LLVM compiler-rt
and libm original materials to native wheel notice preparation.
Preserve Cargo/std notices, exact compiler rebinding and the
existing musl LLVM augmentation without runtime dependencies.

Stage all materials in both reusable release producers. Pin the
license-evidence compiler to the already reviewed Rust 1.99.1
source and reject unknown compiler revisions or changed grants.
Add regression coverage for full original delivery and container
compiler rebinding that preserves the complete source collection.

The collection is conservative, not a linked-code inventory.
No binding source, first-party license, API or version changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ubuntu-latest rollout now selects Ubuntu 26.04, which has no
setup-python 3.9 artifact. Use Ubuntu 24.04 for the two Python 3.9
benchmarks and only the affected Python 3.9 Linux matrix entries.

Keep all interpreter versions, matrix cardinalities, benchmarks,
assertions and other runner choices unchanged. Do not spoof the
platform, skip jobs or upgrade project dependencies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Verify the immutable PyPI wheel and sdist as data. Both carry the
complete original BSD grant matching the installed license hash
606faf42d48b54d539dae99db6fecd48544535587e27275b319a3f36113cb6fa.
Retain the full original text, archive identities and provenance.

Add only the exact nodeenv 1.12.0 case. Keep unknown versions,
modified grants and stronger metadata expressions rejected, with
positive and negative regression checks. Do not alter dependency
versions or approve BSD metadata generically.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build original Python 0.8.1 source and its reviewed registry-core lock
for actual x64 and ARM64 gnullvm targets on matching native runners.
Use the exact reviewed LLVM MinGW SDK and real installed CPython
stable-ABI import libraries with recorded bytes and actual COFF CPU.
Do not spoof targets, patch dependencies, fabricate DLL/import libraries
or change any project or dependency version.

Inspect actual built wheel tags, PyInit export, Python/system imports,
linker input fingerprints and the installed extension identity. Execute
unchanged original Python tests and native conformance against the
installed local wheel without Rust/SDK paths. Keep original-source
and locked-dependency assertions strict.

This is a compatibility investigation only: upload inert JSON/text/map/
lock/XML diagnostics, never the wheel, extension or linker reproduction.
Do not replace the production native producer or claim full runtime
notice/grant acceptance, publication or historical asset repair.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub evaluates job-level env before runner context is available.
Move the actual runner architecture binding into the SDK execution step,
where runner.arch is supported. Preserve all original source, lock,
real CPython import-library, target and native consumer assertions.
No version, library, parser, production or publication change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The genuine GNU compatibility probe retained the reviewed SDK inputs,
one additional MinGW atexit object and real CPython python3.lib. Its
headers contain 902 compact import records and three ordinary COFF
members. Record their actual sections, symbols and relocations to
establish the native input/code boundary before assigning grants.

Capture inert text only. Preserve source, lock, real import-library,
CPU, wheel, native consumer and diagnostic-only upload gates. Do not
infer absence of static runtime code from a library filename or from
VCRUNTIME import absence. No dependency/version or production change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Extend the genuine matching-CPU Windows GNU path with complete existing
Cargo/compiler notices and source-bound MinGW/libunwind/CPython original
materials. Pin the actual SDK, native import libraries, stable-ABI source
commits, exact retained runtime objects and unchanged 0.8.1 Cargo lock.
Preserve all existing Cargo/std/compiler notice fields and validators.

Include 59 runtime source originals, six full runtime documents and the
selected original CPython licence/stable-ABI definition source in the
wheel-owned NOTICE.json resource. Verify actual wheel bytes and RECORD,
PE target/imports, complete native consumers and exact native-input
boundary before any success-bound wheel/evidence candidate upload.

Keep the interpreter and its own runtime DLLs external, not bundled.
The original package/binding sources, APIs and dependency versions stay
unchanged. Production release integration is not performed in this step.
No local build/test/generator, contract acceptance, publication, tag,
release, merge, deployment or historical asset repair.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace only the shared native release workflow's two MSVC Windows
jobs with the proven genuine GNU producer. Preserve four non-Windows
roles, original-source forwarding, package/dependency versions and
all original musllinux/native/publication/download gates.

Upload the same fully accepted wheels under existing windows-x86_64
and windows-aarch64 native release roles only after source/grant,
RECORD/native input and genuine installed-wheel consumer gates.
Validate exact combined six targets and add seven negative mutations
for omitted source/CPU/library/resource/consumer/upload contracts.

Generate an EN/RU/ZH installation-unit proposal only in CI. Explain
actual targets and unchanged tags, no consumer build tools, complete
package-owned notices, external CPython/runtime and historical limits.
No generator/build/test runs locally; no actual registry/store/release
publication, tag, merge, deployment or historical overwrite occurs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub expanded an inline Ruby comparison's inputs expression before
shell execution, turning the expected literal into an empty string.
Construct the literal from two Ruby string fragments instead; retain
the exact original-source forwarding assertion and all negative gates.

Keep the existing multipart install unit completely unchanged. Place
new Windows native-runtime documentation in a dedicated canonical
single-part EN/RU/ZH unit after install, generated from the reviewed
proposal in CI. Preserve exact changed-file/source/per-language hash
validation and include all proposed source files in the artifact.
No polydoc validator, boundary mandate or assertion is weakened.

The new unit and manifest are still only a CI proposal until generated
Markdown and source artifacts are independently verified. Native build,
resource/input/consumer and release-role code remain unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Commit the canonical single-part Windows native runtime unit, manifest
entry and exact CI-generated EN/RU/ZH README bytes. Preserve all original
install multipart source chunks and existing generated content.

Document actual GNU targets and unchanged wheel tags, normal CPython
installation/runtime boundary, no consumer Rust/LLVM/C build tools and
complete package-owned original licence/source resources. Keep the
prepared-candidate versus historical-publication distinction explicit.

Verify source and generated-file SHA256/tooling parent before committing.
Remove only the own temporary fixture and docs-proposal generation job;
retain actual native producers, all resource/input/consumer/release-role
gates and original publication contracts. No local docs generator,
build/test, version bump, release, registry publication, merge or deploy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The final macOS ARM native job failed before compiling a wheel because
maturin-action's implicit pyproject range lookup hit getaddrinfo
ENOTFOUND api.github.com. The same-head successful macOS x64 job
resolved and used maturin 1.16.0.

Pin that already-used tool version in both owning native producers.
The exact reviewed action implementation skips manifest/API release
lookup for an explicit version and downloads its tagged asset directly.
Keep all wheel build arguments, Rust targets, source/dependency versions,
resource/input/consumer assertions and release gates unchanged.

This is not a tool/project/library version upgrade, DNS bypass or a
blind CI rerun. No local build/test or publication occurs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PHPCraftdream
PHPCraftdream marked this pull request as ready for review November 2, 2026 12:33
@PHPCraftdream
PHPCraftdream merged commit e59e36d into main Nov 2, 2026
48 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.

1 participant