Check this receipt without trusting this site

gh attestation verify run-record-M-007.tar.gz --repo northset-oss/verification-pilot --signer-workflow northset-oss/verification-pilot/.github/workflows/attest-bundle.yml

Expected output includes Verification succeeded!

NORTHSET

Proof-of-Pass Receipt

Receipt ID M-007

ISSUE / WORK`BytecodeClasses.toString()` and `root()` throw `NullPointerException` when `input` is null while `classes()` provides a descriptive error · PR #1573

CONTRIBUTOR SELF-RUN — NOT MAINTAINER VERIFICATION

RUN5m 55s

01 / TECHNICAL RESULT

Technical result

2/2

declared commands passed

2/2 declared commands returned exit 0 in the recorded environment

Upstream
MERGEDmutable external state
Environment
maven:3.9-eclipse-temurin-11network phaseA:bridge,phaseB:none
Signature
verified Northset signing workflow provenance

02 / DECLARED CHECKS

Command evidence

Execution summary
2/2 declared commands returned exit 0 in the recorded environment

  1. mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTest

    exit 0 · 7s

  2. mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-mode

    exit 0 · 34.9s

unclassified executor time (derived residual) 5m14s

run wall (derived from recorded timestamps) 5m55s

Every command listed returned exit 0 in the declared environment. Only the listed commands are in scope. Unlisted test, lint, typecheck, build, coverage, compiler, full-suite, and CI gates are not implied or recorded.

03 / RECORDED IDENTITIES

Compact hashes

Patch diff SHA-256
sha256:166dfd…b8e70a2
Container image digest
maven@sha256:1fee93…424186c
Bundle contents digest
sha256:2b9d2c…0fce4d1
Signed asset SHA-256
sha256:eba4d0…948f522

04 / PUBLIC SCOPE INTERPRETATION

Public scope interpretation

Declared network-off checks cover this change's regression tests plus the repository's full Qulice static-quality gate on JDK 11; the repository's complete canonical gate (mvn clean install -Pqulice) cannot run offline because its test suite downloads an XSD from eolang.org at test time, so it ran online on the same patched tree as the disclosed phase-A install commands; upstream CI additionally tests JDK 23 and more platforms.

05 / CLAIMS BOUNDARY

NOT INCLUDED

  • Does not prove code quality
  • Does not prove security
  • Contributor self-run record of Northset's own contribution; not the maintainer's verification.
06 / Evidence annexTechnical · provenance · full recorded values
01

Technical evidence

Code, full environment, patch, and redacted outputs

Project

objectionary/jeo-maven-plugin

Work

`BytecodeClasses.toString()` and `root()` throw `NullPointerException` when `input` is null while `classes()` provides a descriptive error · PR #1573

Verification execution

runtime: northset-oss executor v0
human operator: aeziz

Code

base
5e770723809effb4db5fba8b8e1f372da5318b62
recorded patch commit
c8f904b93482c66ecab3cc7954be87d9cd170979
declared metadata; not execution-bound
patch diff SHA-256
sha256:166dfd…b8e70a2
bound to executed patch bytes

Environment

image reference
maven:3.9-eclipse-temurin-11
repository digest
maven@sha256:1fee93…424186c
network
phaseA:bridge,phaseB:none
Committed patch.diff
diff --git a/src/main/java/org/eolang/jeo/BytecodeClasses.java b/src/main/java/org/eolang/jeo/BytecodeClasses.java
index 435b708d1d9ac5ff03dfbd4df2352b6b769f652d..7c1dde6db3957c958860e0c4b3e4c281c3682215 100644
--- a/src/main/java/org/eolang/jeo/BytecodeClasses.java
+++ b/src/main/java/org/eolang/jeo/BytecodeClasses.java
@@ -40,7 +40,7 @@ final class BytecodeClasses implements Classes {
 
     @Override
     public String toString() {
-        return this.input.toString();
+        return this.checked().toString();
     }
 
     @Override
@@ -50,7 +50,7 @@ final class BytecodeClasses implements Classes {
 
     @Override
     public Path root() {
-        return this.input;
+        return this.checked();
     }
 
     @Override
@@ -76,19 +76,28 @@ final class BytecodeClasses implements Classes {
     }
 
     /**
-     * Find all bytecode files.
-     * @return Collection of bytecode files
-     * @throws IOException If some I/O problem arises
+     * Check that the classes directory is set.
+     * @return Classes directory
      */
-    private Collection<Path> classes() throws IOException {
+    private Path checked() {
         if (Objects.isNull(this.input)) {
             throw new IllegalStateException(
                 "The classes directory is not set, jeo-maven-plugin does not know where to look for classes."
             );
         }
+        return this.input;
+    }
+
+    /**
+     * Find all bytecode files.
+     * @return Collection of bytecode files
+     * @throws IOException If some I/O problem arises
+     */
+    private Collection<Path> classes() throws IOException {
+        final Path directory = this.checked();
         final Collection<Path> result;
-        if (Files.exists(this.input)) {
-            try (Stream<Path> walk = Files.walk(this.input)) {
+        if (Files.exists(directory)) {
+            try (Stream<Path> walk = Files.walk(directory)) {
                 result = walk
                     .filter(Files::isRegularFile)
                     .filter(path -> path.toString().endsWith(".class"))
@@ -99,7 +108,7 @@ final class BytecodeClasses implements Classes {
                 this,
                 String.format(
                     "The classes directory '%s' does not exist, jeo-maven-plugin does not know where to look for classes.",
-                    this.input
+                    directory
                 )
             );
             result = Collections.emptyList();
diff --git a/src/test/java/org/eolang/jeo/BytecodeClassesTest.java b/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
index 73621ac576b2f8eabe702ed8e59bb859eb64f925..ce84e8603743a9268810249cca6cfb5d64ff401e 100644
--- a/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
+++ b/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
@@ -8,6 +8,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -26,6 +27,32 @@ final class BytecodeClassesTest {
         );
     }
 
+    @Test
+    void throwsDescriptiveExceptionWhenConvertingNullInputToString() {
+        final IllegalStateException exception = Assertions.assertThrows(
+            IllegalStateException.class,
+            () -> new BytecodeClasses(null).toString()
+        );
+        MatcherAssert.assertThat(
+            "BytecodeClasses toString() should describe the missing classes directory",
+            exception.getMessage(),
+            Matchers.containsString("The classes directory is not set")
+        );
+    }
+
+    @Test
+    void throwsDescriptiveExceptionWhenGettingRootFromNullInput() {
+        final IllegalStateException exception = Assertions.assertThrows(
+            IllegalStateException.class,
+            () -> new BytecodeClasses(null).root()
+        );
+        MatcherAssert.assertThat(
+            "BytecodeClasses root() should describe the missing classes directory",
+            exception.getMessage(),
+            Matchers.containsString("The classes directory is not set")
+        );
+    }
+
     @Test
     void doesNotThrowExceptionOnAbsentDirectory() {
         final Path path = Paths.get("/dev/null/absent");
Redacted stdout
=== cmd 1: mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTest ===
Can not write to /root/.m2/copy_reference_file.log. Wrong volume permissions? Carrying on ...
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< org.eolang:jeo-maven-plugin >---------------------
[INFO] Building jeo 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO] 
[INFO] --- enforcer:3.6.1:enforce (enforce-maven) @ jeo-maven-plugin ---
[INFO] Rule 0: org.apache.maven.enforcer.rules.version.RequireMavenVersion passed
[INFO] 
[INFO] --- buildnumber:3.2.1:create (jcabi-build-number) @ jeo-maven-plugin ---
[INFO] maven is executed in offline mode, Updating project files from SCM: skipped.
[INFO] ShortRevision tag detected. The value is '7'.
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'log' '-1' '--no-merges' '--format=format:%H %aI %aE %aN'
[INFO] Working directory: /workspace
[INFO] Storing buildNumber: 4d033aa at timestamp: 2026-07-11T23:13:08
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'symbolic-ref' 'HEAD'
[INFO] Working directory: /workspace
[WARNING] Cannot get the branch information from the git repository: 
Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref

[INFO] ShortRevision tag detected. The value is '7'.
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'log' '-1' '--no-merges' '--format=format:%H %aI %aE %aN'
[INFO] Working directory: /workspace
[INFO] Storing scmBranch: UNKNOWN
[INFO] 
[INFO] --- buildnumber:3.2.1:create-timestamp (jcabi-build-number) @ jeo-maven-plugin ---
[INFO] Skipping because we are not in root module.
[INFO] 
[INFO] --- plugin:3.15.1:helpmojo (default) @ jeo-maven-plugin ---
[INFO] 
[INFO] --- resources:3.5.0:resources (default-resources) @ jeo-maven-plugin ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO] 
[INFO] --- resources:3.5.0:copy-resources (copy-resources) @ jeo-maven-plugin ---
[INFO] Copying 1 resource from . to target/classes
[INFO] 
[INFO] --- compiler:3.14.0:compile (java-compile) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO] 
[INFO] --- compiler:3.14.0:compile (compile-helpmojo) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO] 
[INFO] --- plugin:3.15.1:descriptor (default-descriptor) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO] 
[INFO] --- plugin:3.15.1:descriptor (default) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO] 
[INFO] --- plugin:3.15.1:descriptor (mojo-descriptor) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO] 
[INFO] --- resources:3.5.0:testResources (default-testResources) @ jeo-maven-plugin ---
[INFO] Copying 22 resources from src/test/resources to target/test-classes
[INFO] 
[INFO] --- compiler:3.14.0:testCompile (java-test-compile) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO] 
[INFO] --- surefire:3.5.4:test (default-test) @ jeo-maven-plugin ---
[INFO] Tests will run in random order. To reproduce ordering use flag -Dsurefire.runOrder.random.seed=409379750479709
[INFO] Surefire report directory: /workspace/target/surefire-reports
[INFO] Using auto detected provider org.apache.maven.[REDACTED:jwt]
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.eolang.jeo.BytecodeClassesTest
23:13:13 [WARN] org.eolang.jeo.BytecodeClasses: The classes directory '/dev/null/absent' does not exist, jeo-maven-plugin does not know where to look for classes.
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.105 s -- in org.eolang.jeo.BytecodeClassesTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.196 s
[INFO] Finished at: 2026-07-11T23:13:13Z
[INFO] ------------------------------------------------------------------------
=== cmd 2: mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-mode ===
Can not write to /root/.m2/copy_reference_file.log. Wrong volume permissions? Carrying on ...
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< org.eolang:jeo-maven-plugin >---------------------
[INFO] Building jeo 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO] 
[INFO] --- qulice:0.24.0:check (default-cli) @ jeo-maven-plugin ---
[INFO] Calling org.apache.maven.plugins:maven-enforcer-plugin:3.1.0:enforce...
[INFO] This is not an SVN project
[INFO] Dependency analysis suppressed in the project via pom.xml
[INFO] Qulice quality check completed in 33s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  33.984 s
[INFO] Finished at: 2026-07-11T23:13:48Z
[INFO] ------------------------------------------------------------------------
Redacted stderr
=== cmd 1: mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTest ===
mkdir: cannot create directory ‘/root’: Permission denied
Failed to load native library:jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so. The native library file at /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so is not executable, make sure that the directory is mounted on a partition without the noexec flag, or set the jansi.tmpdir system property to point to a proper location.  osinfo: Linux/arm64
java.lang.UnsatisfiedLinkError: /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so: /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so: failed to map segment from shared object
SLF4J(W): Class path contains multiple SLF4J providers.
SLF4J(W): Found provider [org.slf4j.reload4j.Reload4jServiceProvider@6c130c45]
SLF4J(W): Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@50ad3bc1]
SLF4J(W): Found provider [org.slf4j.simple.SimpleServiceProvider@223aa2f7]
SLF4J(W): See https://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J(I): Actual provider is of type [org.slf4j.reload4j.Reload4jServiceProvider@6c130c45]
=== cmd 2: mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-mode ===
mkdir: cannot create directory ‘/root’: Permission denied
Failed to load native library:jansi-2.4.3-8331c5d90999722e-libjansi.so. The native library file at /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so is not executable, make sure that the directory is mounted on a partition without the noexec flag, or set the jansi.tmpdir system property to point to a proper location.  osinfo: Linux/arm64
java.lang.UnsatisfiedLinkError: /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so: /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so: failed to map segment from shared object
02

Provenance & record

Full hashes, bundle identity, attestation, and record details

Record details

payment
none · not merge-contingent
redactions
1 jwt
Bundle contents digest
sha256:2b9d2c…0fce4d1
Signed asset SHA-256
sha256:eba4d0…948f522
Signed provenance recorded
verified

Full cryptographic values

Full recorded values. The compact receipt above shortens these for legibility only.

Patch diff SHA-256
sha256:166dfda67801f85169b655791fc9b7590e1ac880887252aad3ef55488b8e70a2
Container image digest
maven@sha256:1fee93ca227db7e8b8c7c72752ada0f03da6ebab40addd6fe48ac6293424186c
Bundle contents digest
sha256:2b9d2cce359df63c089cb5f0b0b4ac8b5d71cf2980b486141f313f16b0fce4d1
Signed asset SHA-256
sha256:eba4d0fc7e3b20e39a0cd272c6c44b05ba71dff174a30ee39d64330aa948f522

Signed bundle

Download signed bundle

Verify this receipt

gh attestation verify run-record-M-007.tar.gz --repo northset-oss/verification-pilot --signer-workflow northset-oss/verification-pilot/.github/workflows/attest-bundle.yml

Attestation confirms that Northset's signing workflow produced this exact bundle. The signer does not witness the recorded run, and verification does not turn it into maintainer verification.

QR → receipt page
Northset contributed this fix and ran its declared checks. Contributor self-run. Not maintainer verification.

Evidence of what ran — not a verdict that the code is good.

SELF-FUNDED FIELD-TESTING.

- - - detach here - - -

External status

Mutable upstream observation; unattested and separate from the signed run record.

PR state
MERGED
GitHub review decision
NONE
Upstream updated
Observed
MERGED

Recorded upstream outcome · open linked record

All Northset work in objectionary/jeo-maven-plugin →

FOR MAINTAINERS

Maintain objectionary/jeo-maven-plugin?

Get this same run for any PR in your queue — private, free during the pilot, nothing published without your approval.

The issue form is public. Do not include secrets or private repository details there; use email instead.

Already onboarded? Add northset-verify to a PR to request a run on that PR.

Claims boundary

This page reports scoped proof-of-pass receipt evidence. It does not prove code quality, security, full CI coverage, production readiness, or maintainer approval. An attestation confirms bundle provenance; it does not broaden the receipt's claim.

Read the full Claims Boundary policy.