Skip to content

Floor vulnerable transitive dependencies (Dependabot alerts)#12

Merged
wolpert merged 1 commit into
mainfrom
security/transitive-dependency-floors
Jul 19, 2026
Merged

Floor vulnerable transitive dependencies (Dependabot alerts)#12
wolpert merged 1 commit into
mainfrom
security/transitive-dependency-floors

Conversation

@wolpert

@wolpert wolpert commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Problem

The Security tab shows 17 open Dependabot alerts, all against transitive dependencies (they cite settings.gradle.kts, nothing we declare directly):

Package Arrives via Was Patched floor Severity
io.netty:* (handler, resolver-dns, …) Lettuce (redis) 4.2.13.Final 4.2.15.Final high ×5
jackson-databind (2.x) Dropwizard 2.21.4 2.21.5 medium
logback-core Dropwizard 1.5.33 1.5.34 (→1.5.38) low
commons-compress Testcontainers (test) 1.24.0 1.26.0 medium
rhino swagger-parser (test) 1.7.7.2 1.7.14.1 low

A few alerts (commons-lang3 3.20.0, jackson-core 2.x) were already above their patched version and just needed a re-scan.

Fix — floors, not pins

Version-catalog-driven Gradle dependency constraints in velocity.java-conventions (inherited by every module):

  • BOM platforms (platform(netty-bom), platform(jackson2-bom)) keep each ~9–12-artifact family version-aligned — you can't run netty-handler 4.2.15 next to netty-buffer 4.2.13.
  • A constraints { } block floors the standalone libs.
  • Uses platform(...) / plain require semantics — not enforcedPlatform / strictly — so a higher version reached by any other path still wins. Future upgrades are never blocked. Proven live: commons-lang3 floors at 3.18.0 but resolution still selects the higher transitive 3.20.0.
  • All versions live in libs.versions.toml, so the existing weekly Dependabot gradle job bumps these floors forward automatically.

Verification

  • ./gradlew clean build test green, incl. jacocoTestCoverageVerification (re-run fresh with --rerun-tasks, no skipped gates).
  • dependencyInsight confirms every flagged artifact resolves at/above its patched release.
  • No source or velocity-spi / velocity-api contract changes — NFR-17 (frozen SPI, additive-only) unaffected.
  • Independently reviewed by the change-validator sub-agent → APPROVE.

Once merged, the transitive graph GitHub resolves will meet the floors and the alerts close on the next scan.

🤖 Generated with Claude Code

Resolve the 17 open Dependabot security alerts, all of which are transitive
dependencies (they cite settings.gradle.kts): Netty (via Lettuce), Jackson 2.x
and logback (via Dropwizard), commons-compress (via Testcontainers), and rhino
(via swagger-parser).

Rather than pin exact versions, raise each to its first patched release as a
*floor* via version-catalog-driven Gradle dependency constraints in
velocity.java-conventions (inherited by every module):

  - platform(netty-bom) / platform(jackson2-bom) align each multi-artifact
    family so we never split e.g. netty-handler 4.2.15 against netty-buffer
    4.2.13.
  - a constraints { } block floors the standalone coordinates (logback-core,
    logback-classic, commons-compress, commons-lang3, rhino).

Floor (not pin) semantics mean a higher version reached by any other path still
wins, so future upgrades are never blocked — proven live: commons-lang3 floors
at 3.18.0 but still resolves to the higher transitive 3.20.0. All versions live
in libs.versions.toml, so the existing weekly Dependabot gradle job bumps them
forward automatically.

No source or velocity-spi/velocity-api contract changes (NFR-17 unaffected).
Verified: ./gradlew clean build test green incl. jacocoTestCoverageVerification;
dependencyInsight confirms every flagged artifact resolves at/above its patched
release.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@wolpert
wolpert merged commit 41b1a8b into main Jul 19, 2026
3 checks passed
@wolpert
wolpert deleted the security/transitive-dependency-floors branch July 19, 2026 14:56
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