Skip to content

Update NeoForge 26.3 to stable; remove recompilation workaround - #57

Merged
TimStewartJ merged 4 commits into
mainfrom
maintenance/neoforge-26.3-stable
Oct 12, 2026
Merged

TimStewartJ merged 4 commits into
mainfrom
maintenance/neoforge-26.3-stable

Conversation

@TimStewartJ

@TimStewartJ TimStewartJ commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Pin Minecraft 26.3 to stable NeoForge 26.3.0.76, replacing 26.3.0.6-beta.
  • Update ModDevGradle 2.0.143 -> 2.0.148: this brings NeoForm Runtime 2.0.31 and JavaSourceTransformer 2.0.11, the upstream fix actually needed to remove the workaround.
  • Remove the neoforge_disable_recompilation property and its entire buildscript opt-out.
  • Add a 26.3-only CI check of the real local-development source path: CI=false, fresh NeoForm intermediates, Minecraft source recompilation, and compilation of the mod and both test companions. The check explicitly rejects disabled recompilation.
  • Keep the ordinary full-matrix binary-patched build, dedicated-server checks, and both dev and packaged-jar client lanes.
  • Fix cached HeadlessMc selection to require the exact loader-version name and Minecraft parent, with seven regression cases in CI. A cached older NeoForge is no longer accepted just because its name contains neoforge.

Investigation

NeoForge's authoritative Maven metadata lists 26.3.0.76 as the release, and its Gradle module metadata identifies the artifact as release. The universal jar's SHA-256 matches the published metadata:
02620022710df8f62038839b1743ef32033579762831b8b0bb84caee5b3b99de.

The reference scanner checked the published 2.1.0 NeoForge 26.3 jar against both the old and new loader: 26/26 loader references resolve on both, with no broken references. The actual ModDevGradle 2.0.143 bytecode confirms that CI=true disables source recompilation by default, so an ordinary green build alone would not justify removing the local workaround.

The claim needed a correction: a non-beta loader does not fix source recompilation by itself. Fresh CI reproduces HolderSet$1.contents() attempting to override the now-public HolderSet.Named.contents() with weaker access on both 26.3.0.6-beta and 26.3.0.76 with ModDevGradle 2.0.143. The loader's relevant access transformers are identical. The root cause is JavaSourceTransformer failing to apply access transformers to anonymous class members, fixed in neoforged/JavaSourceTransformer#67. ModDevGradle 2.0.148 supplies that fix through NeoForm Runtime 2.0.31.

Checking the actual runtime caught a second trap: the first green matrix with the updated toolchain recompiled Minecraft successfully and ran the dev client/server on 26.3.0.76, but its packaged client silently reused cached 26.3.0.6-beta. The HeadlessMc initializer previously checked only Minecraft parent plus a loader substring, ignoring the requested loader version when a cache existed. This PR fixes that selection rather than invalidating the cache to hide the bug. The seven regression cases cover stale loaders, exact pins, old/new co-existence, wrong Minecraft parent, Forge versus NeoForge, and an installer that fails to provide the requested version.

Sources:

Validation

All positive results below are on 02f900a:

Check Result Evidence
Full matrix, all 14 Minecraft versions / 27 targets Green, including JUnit, metadata, dedicated servers, dev clients and packaged clients Build 38213547559
Fresh NeoForge 26.3 source recompilation Green, JST 2.0.11; actual recompile completed in 32.77 s, then the mod and both test companions compiled Same build, Verify NeoForge source recompilation
Actual stable NeoForge runtime Dedicated server 17 checks, dev client 55 checks, packaged client 55 checks Downloadable mightyarchitect-runtime-tests-26.3 artifact; both server and packaged client log NeoForge mod loading, version 26.3.0.76, for MC 26.3
Cached loader selection 7 regression cases green, locally and in the required source-check job Same build, Cached production loader matches the pin
Publication dry run 27 publications, 20 release / 7 beta, all live=false Release 38213553526
Recorded real-input journeys, Fabric 1.20.2 and 26.3 Both green Journey 38213553014

Negative controls:

Try it

Branch: maintenance/neoforge-26.3-stable
Local worktree: E:\TMA-neoforge-26.3-stable

Download the mightyarchitect-26.3 artifact from the final build above. Use the NeoForge jar on Minecraft 26.3 / NeoForge 26.3.0.76 / Java 25, replacing the existing Mighty Architectury jar rather than installing both. This is a trial build, not a new published release; its embedded mod version remains 2.1.0.

Trial NeoForge jar SHA-256:
d1a3f4ea1d330f633f46dd25adba796d150499df7c4dfb6acfdef30109a6dc2f.

Scope

This removes all of the beta-loader source-recompilation workaround, not Minecraft 26.3 compatibility code. SDL text input, shader variants, StackShadowPages, and Xvfb/EGL support still address the game's own changes and must remain. Other Minecraft/loader pins, metadata minimums, and release channels are unchanged.

ModDevGradle is shared by NeoForge and legacy Forge, so the full matrix verifies all of those targets too. No merge, mod version bump, tag, upload, or modification of the already-published 2.1.0 jars is part of this PR.

@TimStewartJ
TimStewartJ marked this pull request as ready for review October 12, 2026 06:49
@TimStewartJ
TimStewartJ merged commit 23a4ab7 into main Oct 12, 2026
41 checks passed
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