Skip to content

#465 PR-C4: release readiness — minisign signature, per-object licence audit, README - #544

Merged
raylei50653 merged 10 commits into
mainfrom
feat/465-pr-c4-release
Oct 8, 2026
Merged

raylei50653 merged 10 commits into
mainfrom
feat/465-pr-c4-release

Conversation

@raylei50653

@raylei50653 raylei50653 commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Summary

Phase C PR-C4 (scope §6), release readiness. Contract, results and limits: docs/reference/native_runtime_resolved_config.md §20.

Not a distributable release. The licence status is local-only and the release key does not exist yet. Both are owner items, listed below.

  • Licence re-audit, per object (owner instruction 10-08): shipping/license_audit.json, checked and rendered into THIRD_PARTY.md by scripts/native/license_audit.py.

    • Every claim is checked against the object's own wheel's licence file. Equal file sha256 is never taken as equal terms.
    • Official terms are version-matched: docs version switcher, release-notes component table, or the URL tag. The snapshots' sha256 and the clauses are quoted verbatim.
    status objects
    granted in shipped + official text (17) cudart, cufft, cublas, cublasLt, curand, cusparse, nvrtc, nvjpeg, cupti, cusparseLt, NCCL, torch ×6
    both grant, texts differ (6) cuDNN ×5 (wheel ".so and .h, cudnn64_7.dll" vs 9.19.0 docs ".so and .dll"); libnvinfer (wheel = NVIDIA SLA + TRT Supplement §12.1, one-year auto-renew term, downstream ≥ as restrictive; 10.16.1 docs = SDK agreement "runtime .so")
    official text only (3) libnvJitLink, libcufile: absent from the wheels' 2018 CUDA EULA, listed in CUDA 13.0 Update 2 EULA Attachment A (that release's component table names exactly these wheel versions). libnvshmem_host: the wheel carries the CUDA EULA; the NVSHMEM 3.4.5 SLA says "any portion of the SDK"
    no licence text shipped (1) libgomp: GNU libgomp (GPL-3.0+ WITH GCC-exception-3.1); torch's LICENSE/NOTICE don't cover it; no GPL text and no source offer in the package

    The MANIFEST now records the audit sha256 and distribution: local-only.

  • minisign signature: <name>.sha256.minisig signs the package digest, which covers the tarball and the installer.

    • The trusted comment is package=<name> commit=<sha> manifest_sha256=<sha>, so the installed MANIFEST.json can be checked against a signed value.
    • The user verifies before installing (minisign -V, then sha256sum -c). install.sh is byte-identical to PR-C3 (afa5d06a…).
    • check_shipping_package.py tarball --pubkey adds the fourth file and a signature check: minisign -V, an independent Ed25519 reader, and the trusted comment compared against the MANIFEST.
    • run_package_container.sh verify runs the user's check in Ubuntu 24.04.
  • README.txt in the tree: sm_120; driver ≥ 580.95.05 (CUDA 13.0 U2 table; verified only on WSL2 616.92); glibc ≥ 2.39; verify → install → run; named limits; licences.

  • Unchanged: stage computation, entrypoint pin, operator library, the 27 vendor objects and third_party_set.json, launcher, auditor, installer.

Formal run

  • r1 bfd086c7 → FAIL, on one clause only. The original gate 4 required all four release files to be byte-identical across two builds, but host minisign 0.12 (libsodium 1.0.22) signs non-deterministically; container minisign 0.11 does not. Everything else passed.
  • §20.4a amendment (f2ff5700, committed before r2): the three package files must be byte-identical, and the second signature must verify with the same trusted comment.
  • r2 bc75dcab → PASS, re-run from scratch. Results in results/465_prc4_release/full_bc75dcab/ (not versioned), evaluation.json daa17f1c….
Gate Result
1–2 build/install exit 0; static 12/12 (README included)
3 licence audit coverage / bundled_texts / official_terms / notice 4/4, complete
4 package + signature tree_clean, identity_current; tarball --pubkey 8/8; tarball c753496a…, installer and digest identical across builds; second signature verifies with the same trusted comment; MANIFEST = tree, licenses key correct
5 user verification (Ubuntu 24.04, minisign 0.11) Signature and comment signature verified + 2× OK
6 install from tarball install-trace 5/5 (one RENAME_NOREPLACE, 277 mutations in staging); static --manifest 13/13; --verify 0; installed MANIFEST.json sha256 = signed manifest_sha256
7 installed tree, clean container EXACT: detector 5316/5316, MOT 7/7, graph 7/7; identical to the PR-C3 formal run
8 G2-2/G2-4 runtime 3/3; EXACT, 7/7 identical

Negative controls all gave their required result:

  • Signature: refused (S1–S5, S7). Changed digest (S1), PR-C3's P3 repack with the digest recomputed (S2), changed installer (S3), edited trusted comment (S4), another key (S5), and no signature file (S7). In S1–S5, both the container verify and the host signature check fail. In S7 the container verify fails and the host check fails release_set and signature.
  • Corrupt tarball, signature valid (S6). The signature verifies but sha256sum -c fails. Both steps are needed.
  • Wrong content in a valid signature (S8). A wrong manifest_sha256 in a validly signed comment passes minisign; only the trusted-comment comparison catches it.
  • Tampered installed tree (S9). --verify passes a consistently tampered installed tree; the MANIFEST sha256 no longer matches the signed value.
  • Audit (L1–L3). Replaced cuFile licence file, altered snapshot, and a false claim for nvJitLink each fail the right check.

Review fixes (review of 59de3f28; fix 96bb41c0, docs §20.8)

Four P2, all checker coverage gaps, fixed in checker code only. Identity, audit, THIRD_PARTY.md, README and package are unchanged, so r2 still describes the source.

  1. Release-notes matching now uses the object's own component row. cudart 13.0.88 no longer borrows NVRTC's 13.0.88.
  2. Every granting official claim must be bound to the object's validated release (same source, same archive version, or matching switcher/tag). The context-only current CUDA EULA no longer counts.
  3. A grant_* status requires a granting official claim. A shipped-text grant cannot be grant_in_official_only.
  4. Pre-C4 source commits keep the PR-C3 MANIFEST reading, so PR-C3's MANIFEST derives exactly again.

Replay on r2's artifacts (results/465_prc4_release/review_fix_96bb41c0/):

  • Gate 3 stays 4/4.
  • L1–L3 still fail as required.
  • The review's three false-PASS cases now fail (R1 official_terms, R2 official_terms, R3 coverage).
  • PR-C3 and r2 MANIFESTs derive exactly, and r2 tarball --pubkey stays 8/8.

For owner review / decision

  1. §4 licence items (THIRD_PARTY.md → Open items):

    • which text governs the three official-only objects;
    • TRT and cuDNN differing texts, including TRT's term and its downstream-restriction condition;
    • libgomp: ship the GPL-3.0 and RLE texts plus a source offer, or something else;
    • whether the general NVIDIA conditions are met.

    Stays local-only until you close these.

  2. Release key: generate it yourself (minisign -G, with a password) and add shipping/package/minisign.pub in a separate PR. Key management is in §20.1. No key was committed here; the runs used throwaway test keys.

  3. Design points (§20.1):

    • Sign the digest, not each file.
    • The trusted comment carries the MANIFEST sha256.
    • Users verify before installing; the installer stays minisign-free.
    • README.txt is inside the tree.
    • THIRD_PARTY.md is generated from the audit; the exporter's --notice is removed.
  4. The §20.4a amendment after r1: disclosed in §20.4a / §20.5; r1's FAIL is kept.

Merge order

Review and merge the stacked republish PR into this branch first. That merge is required: test_runtime_identity_staleness fails without it.

CI on this branch alone fails 4 tests, all in the stale-identity group (test_runtime_identity_staleness ×2, test_research_lock ×2: implementation moved, not republished). These are expected until #545 is merged in. All other CI jobs pass.

scripts/pre_push.sh passed on the combined head with #545 (5323 passed).

🤖 Generated with Claude Code

raylei50653 and others added 7 commits October 8, 2026 17:05
shipping/license_audit.json records, for each of the 27 bundled objects,
the licence text its wheel ships, the version-matched official terms
(URL, fetch time, snapshot sha256), whether each grants distribution of
that object, the conditions, a status and the open risks.
license_audit.py checks every claim against the object's own wheel's
files (identical file bytes are not taken as identical terms) and renders
THIRD_PARTY.md, which export_third_party_set.py no longer writes.

Result of the audit: nvJitLink and cuFile are not in the wheels' 2018
CUDA EULA text but are in the CUDA 13.0 Update 2 EULA's Attachment A;
nvshmem is covered by the NVSHMEM 3.4.5 SLA; cuDNN and TensorRT ship texts
that differ from the version-matched docs; libgomp ships with no licence
text. Distribution status: local-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Requirements (sm_120, the CUDA 13.0 Update 2 driver floor, glibc 2.39),
the verify-then-install steps, the run usage, named limits and where the
licences are. Installed at <prefix>/README.txt; the static layout and
licenses checks and the package's pinned_tree compare it byte for byte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
<name>.sha256.minisig signs the digest (tarball + installer) with the
trusted comment package=<name> commit=<commit> manifest_sha256=<sha>, so
the signature also vouches for the installed MANIFEST.json. The user
verifies before installing; install.sh is unchanged.
check_shipping_package.py tarball --pubkey adds the fourth release file
and a signature check (minisign -V and an independent Ed25519 reader,
plus the trusted comment against the tarball's MANIFEST); the MANIFEST
records the licence audit and its distribution status.
run_package_container.sh verify runs the user's check in Ubuntu 24.04.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gates 1-8, S1-S9, L1-L3

Owner instructions (per-object licence re-audit, test key, user-side
verification), the design (what is signed and why, the trusted comment,
key management, README), the audit's results and the items left for the
owner, the dev trial, and the formal-run contract written before any
formal measurement: build + static, licence audit, package + signature
(determinism of all four files), the user's verification in Ubuntu
24.04, install from the tarball, the installed tree's EXACT run against
PR-C3, G2-2/G2-4, signature controls S1-S9 and audit controls L1-L3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s need not be byte-identical)

Formal run r1 at bfd086c7 failed only gate 4's "all four files
byte-identical": the tarball, installer and digest were identical, but two
minisign signatures of the same digest with the same key differed. The
contract's premise (Ed25519 signatures are deterministic) does not hold for
the host's minisign 0.12 / libsodium 1.0.22 (container minisign 0.11 is
deterministic). Both signatures verify with the same trusted comment.

Gate 4 now requires the three package files byte-identical and the second
signature to verify under the same key with the same trusted comment. The
whole formal run is re-run from scratch (r2); r1 and its FAIL are kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Archive the outgoing canonical (implementation 1927e740d4267aec, the PR-C3
publication) and promote a fresh controlled-host capture (build/runtime_identity,
Release, --run-probe --require-complete) at the PR-C4 contract head 992213e.
Promoted before the PR-C4 formal run (docs §20.4): the package's MANIFEST
records this coordinate, so it must describe the package's source commit.

Axes:
* implementation MOVED 1927e740d4267aec -> 221cc25330c5422d; files 287 -> 288.
  Added (1): shipping/license_audit.json (the per-object licence audit).
  Changed (2): shipping/cmake/install_third_party.cmake (installs README.txt),
  shipping/CMakeLists.txt (comment only). Removed: none.
* environment, decision_surface, identity_semantics, runtime_inputs: unchanged.
* probe: re-run fresh (not reused); behavior 2dabed0b, equal to the PR-C3
  publication. Probe equality is not an equivalence claim; equivalence stays
  unproven.

check_runtime_identity_staleness.py --mode attested: exit 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-8, S1-S9, L1-L3)

r1 (bfd086c7) failed only the original gate-4 four-file determinism
(non-deterministic minisign 0.12 signatures; §20.4a). r2, re-run from
scratch at bc75dca under the amended contract, PASSES gates 1-8.

* Licence audit 4/4: 17 granted in both texts, 6 texts differ,
  3 official-only, 1 without shipped text. Status: local-only.
* tarball --pubkey 8/8.
* The user's verification passes in Ubuntu 24.04 (minisign 0.11).
* Install from the tarball: one RENAME_NOREPLACE; the installed MANIFEST
  sha256 equals the signed one.
* The installed tree is EXACT (5316/5316, 7/7, 7/7) and byte-identical to
  PR-C3.
* G2-2/G2-4 pass.
* S1-S9 and L1-L3 all as required.

Limits: no release key yet, not distributable, the trusted comment must
be compared by the user, and --verify still trusts the tree's MANIFEST.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
raylei50653 and others added 3 commits October 8, 2026 18:12
…re-C4 MANIFEST reading

Review of 59de3f2, four P2:
* A release-notes release is matched on the object's own component row
  (RELNOTES_COMPONENT), not on any version on the page:
  nvidia_cuda_runtime-13.0.88 no longer passes against 13.0 Update 2
  (cudart row 13.0.96).
* Every official claim that grants distribution must come from a source
  bound to the object's validated release: the same source, the same
  archive version, or a matching switcher or tag. Context-only terms (the
  current CUDA EULA) fail; unversioned sources are accepted only as the
  object's own release source with a risk recorded.
* A grant_* status needs at least one granting official claim, and an
  object whose shipped text grants cannot be grant_in_official_only.
* manifest_head keeps the PR-C3 "reading" for a source commit without the
  licence audit, so the PR-C3 MANIFEST at 9217ed9 derives exactly again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…§20.1 matching rules

The four P2 from the review of 59de3f2: release-notes row matching,
official terms bound to the validated release, grant statuses requiring
granting official evidence, and the pre-C4 MANIFEST reading. Replayed on
r2's artifacts (no new package):
* gate 3 still 4/4;
* L1-L3 still fail as required;
* the review's three false-PASS cases now fail (R1-R3);
* the PR-C3 and r2 MANIFESTs derive exactly (R4).
The identity is unchanged, so r2 still describes the source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(provenance): republish the runtime coordinate for #465 PR-C4
@raylei50653
raylei50653 merged commit 24dab81 into main Oct 8, 2026
8 checks passed
@raylei50653
raylei50653 deleted the feat/465-pr-c4-release branch November 13, 2026 11:10
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