NORTHSET

Proof-of-Pass Receipt — M-007

CONTRIBUTOR SELF-RUN — NOT MAINTAINER VERIFICATION

Receipt ID
M-007
Run start
2026-07-11T23:07:52.808Z
Run finish
2026-07-11T23:13:48.745Z

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:166dfda67801f85169b655791fc9b7590e1ac880887252aad3ef55488b8e70a2
bound to executed patch bytes

Environment

image reference
maven:3.9-eclipse-temurin-11
repository digest
maven@sha256:1fee93ca227db7e8b8c7c72752ada0f03da6ebab40addd6fe48ac6293424186c
network
phaseA:bridge,phaseB:none

Declared checks

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

PASS — 2/2 declared commands

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.

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.

Record details

payment
none · not merge-contingent
redactions
1 jwt
Bundle contents digest
sha256:2b9d2cce359df63c089cb5f0b0b4ac8b5d71cf2980b486141f313f16b0fce4d1
Signed asset SHA-256
sha256:eba4d0fc7e3b20e39a0cd272c6c44b05ba71dff174a30ee39d64330aa948f522
Signed provenance recorded
verified 2026-07-14T14:21:48Z

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.
  • 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.

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.

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

- - - detach here - - -

External status

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

PR state
OPEN
Review signal
NONE
CI state
SUCCESS
Upstream updated at
2026-07-16T19:45:26Z
Observed at
2026-07-16T19:46:55.000Z
OPEN

Live upstream pull request · open linked record

FOR MAINTAINERS

Request a private run

Maintain an open-source project? Send Northset a PR already in your queue. We run its repository-declared checks in an isolated container and return the run record privately. We do not modify the PR. Nothing is published without your approval. Free during the pilot.

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.