Skip to content

feat(#547): licence evidence for L-1..L-3, L-4 audit, model-root open item - #552

Merged
raylei50653 merged 9 commits into
mainfrom
feat/547-licence-evidence
Oct 9, 2026
Merged

raylei50653 merged 9 commits into
mainfrom
feat/547-licence-evidence

Conversation

@raylei50653

Copy link
Copy Markdown
Owner

Refs #547 (does not close it). Stacked republish: the chore PR opened next, against this branch.

Do not merge before owner review.

  • Nothing here declares licence compliance.
  • Every open item (L-1, L-2, L-3, L-4, M-1) stays OPEN.
  • distribution.status stays local-only, and owner_confirmation stays null.
  • The checker refuses any other combination while an item is OPEN.

What this does (owner decisions, 2026-10-08)

Item Change Still OPEN because
L-1 nvJitLink, cuFile, nvshmem The wheel License.txt is kept. The version-matched official texts ship too: licenses/terms/cuda_eula_13.0.2.txt and nvshmem_sla_3.4.5.txt, each re-derived from its snapshot. Which text governs a wheel-received object. Shipping the official text does not make it the governing one.
L-2 cuDNN ×5, TensorRT Both texts ship. The TensorRT term is recorded (§12.2: one year, auto-renew, 90-day notice). The SLA §2(iii)(d) "by means of the internet" question is new. A per-clause-scoped downstream draft is in shipping/DOWNSTREAM_TERMS.draft.md. It is not shipped and not in force. Which text governs; what "agreements with your Customers" requires. A README is not an agreement.
L-3 libgomp COPYING3 and COPYING.RUNTIME come from the object's source package, plus SOURCE.txt. The correspondence is verified by comparison, not by debuglink (see below). Corresponding Source for a patchelf-modified object; RLE eligibility; how long to keep the source available. The SRPM is not yet mirrored, because there is no public release.
L-4 NVIDIA common conditions Per-condition audit in three layers. --library-path is not counted as proof. "Only accessed by your application": inward provenance is solid, but nothing technically stops other programs (files are 0644/0755). "Material" is undefined. AGPL (M-1) may subject the SDK to an open-source licence.
M-1 model root (new) Recorded as an open item: the YOLO26s engine has Ultralytics AGPL-3.0 lineage (ADR 023), and the training-data terms were not checked. #549 handles the separation and does not change any licence status. Not audited. Needs a commercial licence, a legal opinion, or a different backbone.

libgomp evidence

  • Same code. The shipped libgomp.so.1 (e28fb289…) and AlmaLinux libgomp-8.5.0-28.el8_10.alma.1.x86_64.rpm:/usr/lib64/libgomp.so.1.0.0 (e985bcbb…) share build ID 2244452c…. 24 code and data sections are byte-identical at the same addresses.
  • What differs is only the patchelf change. .dynamic, .dynstr and .dynsym differ: there is one added DT_RPATH, and .dynsym changes only in section indices.
  • Source package. The RPM header's SOURCERPM is gcc-8.5.0-28.el8_10.alma.1.src.rpm (c94dbbd2…).
  • Package hashes authenticated. Both package sha256 values were checked through signed repomd.xml → primary.xml. The key fingerprint was not checked independently.
  • No rebuild. The SRPM was not rebuilt.
  • Re-checkable. license_audit.py check --gomp-rpm … --srpm … re-runs all of this.

Code

  • license_audit.json moves to schema v2, adding supplied_texts, open_items, corresponding_source and downstream_terms.
  • license_audit.py:
    • deterministic HTML article extraction;
    • RPM, cpio, tar.xz and ELF readers;
    • three new checks (supplied_texts, downstream_basis, corresponding_source);
    • also renders the downstream draft.
  • The install cmake installs the supplied texts and checks their sha256. Bundle and package checks expect them and pin them.
  • README.txt: the files under licenses/ are notices, not an agreement.
  • Docs: resolved config §22 (design, contract, acceptance) and closeout §6.1 progress.
  • No change to the model, tracker, runtime, entrypoint, operator library, third-party set, installer or any benchmark claim.

Tests and evidence

  • Formal run results/547_licence/full_664208d1/ (head = contract + republish): PASS.
    • E1, tree: 64 files; only README.txt and THIRD_PARTY.md changed, plus the 7 texts. static 12/12.
    • E2, audit: 7/7 checks, complete.
    • E3, unsigned package: 7/7.
    • E4, clean-container install: passes.
    • Negative controls N1–N5 fail as required: a changed or removed text, a tampered install source, the wrong SRPM, and a public status while items are OPEN.
  • scripts/pre_push.sh on the combined head: all green (5350 passed).
  • Runtime identity: the implementation axis moves 221cc253 → 8e758b23 (+2 files, 2 changed). The stacked chore PR republishes it. CI on this branch alone is expected to fail the staleness tests until the chore PR is merged in.

Remaining owner items (#547)

  • L-1..L-4 and M-1 conclusions.
  • The release minisign key: commit only shipping/package/minisign.pub, in a separate PR.
  • The publish decision. It also fixes where the libgomp SRPM is mirrored.

🤖 Generated with Claude Code

raylei50653 and others added 7 commits October 8, 2026 21:36
… item

Owner decisions of 2026-10-08. Nothing is declared compliant: every open item
stays OPEN, distribution stays local-only, owner_confirmation stays null.

* license_audit.json schema v2:
  - supplied_texts: the version-matched NVIDIA terms (CUDA 13.0.2 EULA,
    NVSHMEM 3.4.5, cuDNN 9.19.0, TensorRT 10.16.1) under licenses/terms/,
    each re-derived from its snapshot; GNU libgomp's COPYING3 and
    COPYING.RUNTIME taken from its source package, plus SOURCE.txt.
  - open_items L-1..L-4 and M-1 (model root, YOLO26 AGPL lineage). Each
    keeps technical evidence, licence interpretation and legal uncertainty
    apart. While one is OPEN, the checker requires local-only and no owner
    confirmation.
  - corresponding_source: libgomp is AlmaLinux 8
    libgomp-8.5.0-28.el8_10.alma.1 plus a DT_RPATH. Evidence: same build ID,
    24 code/data sections identical, only .dynamic/.dynstr/.dynsym
    rewritten. The SOURCERPM is gcc-8.5.0-28.el8_10.alma.1.src.rpm. Shown by
    comparison, not by a rebuild.
  - downstream_terms: a draft (not shipped, not in force), with clauses
    scoped per object and each quote checked in every cited object's wheel
    text.
  - TensorRT: the term and renewal clause, and the "by means of the
    internet" question.
* license_audit.py:
  - deterministic article-text extraction;
  - RPM/cpio, tar.xz and ELF readers;
  - new checks: supplied_texts, downstream_basis, corresponding_source;
  - also renders DOWNSTREAM_TERMS.draft.md.
* install_third_party.cmake installs the supplied texts and checks their
  sha256. check_shipping_bundle/check_shipping_package expect and pin them.
* README.txt: the files in licenses/ are notices, not an agreement.
* docs: resolved config §22 (design, contract), closeout §6.1 progress, and
  a correction to §20.1 (libgomp's GCC version is recorded).

No change to the model, tracker, runtime, entrypoint, operator library,
third-party set, installer or any benchmark claim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Archive the outgoing canonical (implementation 221cc25330c5422d, the PR-C4
publication) and promote a fresh capture from the controlled host
(build/runtime_identity, Release, --run-probe --require-complete) at the #547
contract head 048034e. The capture is promoted before the #547 formal run
(docs §22.3): the package's MANIFEST records this coordinate, so the
coordinate must describe the package's source commit.

Axes:
* implementation MOVED 221cc25330c5422d -> 8e758b239da93e01; files 288 -> 290.
  - Added (2): shipping/licenses/libgomp/COPYING3 and COPYING.RUNTIME (no
    .txt suffix, so they are not prose).
  - Changed (2): shipping/license_audit.json (schema v2: supplied texts,
    open items, corresponding source, downstream draft) and
    shipping/cmake/install_third_party.cmake (installs the supplied texts).
  - Removed: none. The other new files (*.txt, *.md) are prose and off the
    axis.
* environment, decision_surface, identity_semantics, runtime_inputs:
  unchanged.
* probe: re-run fresh, not reused. Behavior 2dabed0b, equal to the PR-C4
  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>
E1: tree has 64 files; versus #546 only README.txt and THIRD_PARTY.md
changed, plus exactly the 7 supplied texts; static 12/12.
E2: licence audit 7/7 PASS, complete.
E3: unsigned package; tarball 7/7, MANIFEST == tree, licenses.sha256 ==
audit.
E4: clean-container install, trace 5/5, static --manifest 13/13, --verify
exit 0.
N1-N5 fail as required. PASS means the evidence is present and
re-verifiable. It does not mean any licence item is satisfied; every open
item stays OPEN and distribution stays local-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(provenance): republish the runtime coordinate for #547
…ce record

* R-1: check_corresponding compares section sizes as well as bytes. A
  SHT_NOBITS section (.bss, .tbss) has no bytes, so a size change used to
  pass. Negative control: .bss grown by 64 now fails.
* R-2: a supplied text's repo_file must be shipping/<file>, in both the
  checker and install_third_party.cmake. A file name of '.' or '..' is
  refused. Negative controls: an escaping path, a path elsewhere in the
  repo, and '..'.
* R-3: new check_public_gate. Any status other than local-only needs the
  owner's confirmation, every item CLOSED, the corresponding sources
  published and the downstream terms adopted. Closing every item does not by
  itself open distribution. A CLOSED item must carry an owner_conclusion.
  The tarball check fails a package that is not local-only when it is
  checked without --pubkey.
* R-4: docs/reference/native_runtime_licence_evidence_547.json records the
  formal run's full commit and tree (664208d1, not on a pushed branch), its
  relation to the rebased head, the evaluation, artifact and release
  sha256, and how to re-fetch the inputs.
* docs §22.7 (fixes) and §22.8 (replay contract, written before the
  replay).

install_third_party.cmake is on the implementation axis, so a stacked
republish follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ew fix

Archive the outgoing canonical (implementation 8e758b239da93e01, the #553
publication) and promote a fresh capture from the controlled host
(build/runtime_identity, Release, --run-probe --require-complete) at the
review-fix head 16104f4. The capture is promoted before the §22.8 replay.

Axes:
* implementation MOVED 8e758b239da93e01 -> 3d85835ce4814d72; files 290 -> 290.
  - Changed (1): shipping/cmake/install_third_party.cmake. It now refuses a
    supplied text whose repo_file is not shipping/<file> (R-2).
  - Added: none. Removed: none.
* environment, decision_surface, identity_semantics, runtime_inputs:
  unchanged.
* probe: re-run fresh, not reused. Behavior 2dabed0b, equal to the previous
  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>
R1: the tree is byte-identical to the formal run's; static 12/12.
R2: licence audit 7/7.
N6: install_third_party.cmake refuses a repo_file that escapes shipping/.
N7-N9: the unit tests for the .bss size, the public gate and the
public-must-be-signed rule pass. Every open item stays OPEN; local-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@raylei50653

Copy link
Copy Markdown
Owner Author

Response to the pre-merge review

Every finding is fixed in 16104f4e. The replay at cec6af39 passes (docs §22.7–§22.9). The cmake change needed another republish, which is in stacked PR #554.

# Finding Fix Negative control
R-1 (P2) .bss/.tbss size not compared check_corresponding compares (sha256, size) Growing .bss by 64 now fails with section .bss differs. The old code passed it.
R-2 (P2) repo_file unconstrained The checker and install_third_party.cmake require repo_file == "shipping/" + file. A file name of . or .. is refused. ../../outside/…, docs/… and licenses/terms/.. are rejected by coverage. N6: cmake -P exits 1 on an escaping path and writes nothing.
R-3 (P2) All items CLOSED + no owner_confirmation passes New check_public_gate: any status other than local-only needs owner_confirmation, every item CLOSED, the corresponding source published and the downstream terms adopted. A CLOSED item needs an owner_conclusion. tarball fails a package that is not local-only when checked without --pubkey. Closing items does not open distribution. Unit tests: the public gate's three failures, the signature rule, and the local-only package that may be unsigned.
R-4 (P2) 664208d1 unresolvable; evidence only in results/ docs/reference/native_runtime_licence_evidence_547.json records the full commit and tree, the relation to the rebased head (only §22.4–§22.6 docs differ), the evaluation, 50 artifact hashes, the release hashes and how to re-fetch the inputs. #554 is not rebased, so the replay head cec6af39 stays reachable. —
P3 #547 checklist missing M-1 Added to the #547 body (model root section). —

Replay results/547_licence/review_cec6af39/:

  • The installed tree is byte-identical to the formal run's; static 12/12.
  • Audit 7/7.
  • N6 fails as required, and the N7–N9 unit tests pass.

pre_push.sh on the simulated merge of #554 with this branch is all green (5362 passed).

Still the boundary: this is local acceptance on one machine, not an independent replay. Every open item stays OPEN, local-only, and owner_confirmation stays null. Merging #552 must not close #547 or move it to PUBLIC_DISTRIBUTION_READY. Do not merge before owner review: #554 into feat first.

raylei50653 and others added 2 commits October 9, 2026 10:43
chore(provenance): republish the runtime coordinate for the #552 review fix
The formal run commit 664208d1 is not fetchable, so recheck can no longer
say 'git checkout <commit>'. Split it into three anchors: 664208d1 as record
only, 91a7e61 as the fetchable equivalent (differs only in an uninstalled
doc), and cec6af3 as the review-fix replay anchor, whose r1_tree.sha256 is
byte-identical to e1_tree.sha256. Add a review_replay block with its commit,
tree and artifact hashes. No identity class covers this file; no republish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@raylei50653
raylei50653 merged commit 83c9bef into main Oct 9, 2026
8 checks passed
@raylei50653
raylei50653 deleted the feat/547-licence-evidence 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