chore(v0.4.0): foundation — deps, ArchUnit fix, LICENSE, pom metadata#59
Merged
Conversation
…adata Closes audit BLOCKERs B1, B2, B3, B4 and HIGH H4. Mechanical changes only; no behavioural change in production code. Build / packaging - Bump archunit 1.3.0 → 1.4.1 (Java 25 / class file v69 support; pre-1.4 silently dropped every production class on import, so all five no-delete rules trivially passed against an empty class set — the advertised no-delete invariant was unenforced for the entire v0.3.x line). - Bump logback 1.5.12 → 1.5.13 (CVE-2024-12798). - Bump javalin 6.4.0 → 6.7.0 (latest 6.x; Javalin 7 / Jetty 12 not yet released, so we stay on Jetty 11.0.25 — its latest patch line, security backports through 2025). ArchUnit hardening - New sanity assert archUnitImportedProductionClasses: fails the build if fewer than 50 production classes are imported. Catches future bytecode-version-vs-archunit drift before the rules silently no-op again. - Whitelist FileSidecarStore.setLength (sparse pre-allocation only — never shrinks; flagged by audit B2 once B1 was fixed). - New rule: ban FileChannel.truncate outside the whitelist (NIO twin of RandomAccessFile.setLength, identical hazard, previously uncovered). - New rule: ban access to StandardOpenOption.TRUNCATE_EXISTING outside the whitelist (zeroes the target file before writing — only legitimate user is JsonJobStore.writeAtomic on its tmp file). License / metadata - Apache-2.0 LICENSE and NOTICE files at repo root. Without them v0.3.x was technically all-rights-reserved by default copyright and could not be legally redistributed despite "open" framing. - pom.xml gains <licenses>, <scm>, <url>, <developers>, <inceptionYear>; description drops the "Debian" remnant. - Container image labels switched from licenses="NOASSERTION" to "Apache-2.0" (Dockerfile + release.yml). Version drift fix - pom.xml version 0.1.0-SNAPSHOT → 0.4.0-SNAPSHOT. Latest tag is v0.3.3, so --version on a locally-built jar was reporting 0.1.0-SNAPSHOT. CI - ci.yml: concurrency group cancels superseded runs on the same ref. Saves runner minutes on PR pushes. Misc - .dockerignore: stops local `docker build` from shipping .git, target/, .worktrees/, src/, etc. into the image's build context (multi-hundred MB was being copied unnecessarily). - README: list full ArchUnit whitelist (3 → 4 classes after this commit) and the new banned APIs; drop the "one whitelisted code path" claim that was incorrect even before this change. - CHANGELOG.md seeded with the v0.4.0 entry plus brief history of the 0.3.x line. Local mvn test: 361 unit tests, 0 failures, 56 errors all in the known Jetty-loopback Windows-env category (server-tier tests). Linux CI is green. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This was referenced Apr 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First of ~5 PRs that close the v1.0.0 audit blockers/highs/mediums. This one is mechanical: dep bumps, ArchUnit fix, LICENSE, pom metadata, version bump. No behaviour change in production code.
Closes audit BLOCKERs B1, B2, B3, B4 and HIGH H4.
Why this matters
ArchUnit 1.3.0 + JDK 25 class-file v69 = ArchUnit drops every production class at import time and the no-delete invariant is unenforced. I confirmed this by running
mvn test -Dtest=ArchitectureTestlocally: 117Couldn't import class from ...warnings, all 5 rules trivially pass against an empty set. The headline safety guarantee of the project was a no-op for the entire v0.3.x line. Bump fixes it.Plus: Logback 1.5.12 has CVE-2024-12798 (HIGH). LICENSE was missing → all-rights-reserved by default. pom said
0.1.0-SNAPSHOTwhile latest tag isv0.3.3. Etc.Changes
Build / packaging
archunit1.3.0 → 1.4.1 (Java 25 support).logback1.5.12 → 1.5.13 (CVE-2024-12798).javalin6.4.0 → 6.7.0 (latest 6.x — Javalin 7 / Jetty 12 unreleased; staying on Jetty 11.0.25, its latest patch).ArchUnit hardening
archUnitImportedProductionClassesfails the build if fewer than 50 classes were imported — catches future bytecode-vs-archunit drift before rules silently no-op again.FileSidecarStore(sparse pre-allocation viasetLength, never shrinks; would now fail B2 since B1 unblocked the import).FileChannel.truncateoutside the whitelist (NIO twin ofRandomAccessFile.setLength).StandardOpenOption.TRUNCATE_EXISTINGoutside the whitelist.License / metadata
LICENSE(Apache-2.0) andNOTICElisting bundled third-party deps at repo root.pom.xmlgains<licenses>,<scm>,<url>,<developers>,<inceptionYear>; description drops the "Debian" remnant.licenses="NOASSERTION"→"Apache-2.0"(Dockerfile + release.yml).Version + misc
pom.xmlversion0.1.0-SNAPSHOT→0.4.0-SNAPSHOT..dockerignoreso localdocker builddoesn't ship the entire worktree (.git, target/, .worktrees/, src/, …).ci.yml: concurrency group cancels superseded runs on the same ref.README.md: full ArchUnit whitelist (now 4 classes, not "one path"); list new banned APIs.CHANGELOG.mdseeded with the v0.4.0 entry.Test plan
mvn test -Dtest=ArchitectureTest→ 8 tests pass (5 original + sanity + 2 new bans). Pre-bump: silent no-op.mvn test→ 361 tests, 0 failures, 56 errors — all in the known Windows-env Jetty-loopback category, none new../mvnw verifyproducestarget/netcopy.jarwhose--versionprintsnetcopy 0.4.0-SNAPSHOT.Follow-ups (separate PRs in this v0.4.0 train)
🤖 Generated with Claude Code