The port is done; keep what consumer migration and Scala removal need.
- Remove the port plan Q&A; keep its one real constraint (ProjectRed's
external Scala trait needs registerScalaTrait) in the retention rules
- Remove the superseded +700 installed revision table
- Remove the pre-conversion test gates; move the two still unmet ones
(builder/editor round trip, UtilitiesInExcess fixture) to MANUAL_CHECKS
- Reword progress notes as current facts, fix stale JPartialOcclusion and
IDWriter notes and the Scala-typed descriptor count
AE2 casts the tile to the raw scalatraits TIInventoryTile to call
rebuildSlotMap after its cable bus inventory size changes. Give it a
supported entry point on TileMultipart instead.
- refreshInventorySlots is a no-op on base tiles; the generated inventory
trait rebuilds its flattened slot mapping without rebinding parts
- rebuildSlotMap stays supported for released AE2 jars
- Functional tests cover resize, tiles without inventories, and a
slotted plus inventory tile; smoke test freezes the new trait method
- Document it in the tile trait guide, API index and adoption ledger
GT5U 5.09.54.205 casts reduceMOP(hit)._1() to Integer to find the struck
ProjectRed wire. Give Java callers the same index without Scala types.
- hitPartIndex returns the jPartList index recorded by rayTraceAll, or -1
when the hit carries no part index
- reduceMOP and its companion are unchanged and not deprecated; tests now
pin the boxed Integer index and the rebased hit
- Add HitPartExample and the HIT_PART guide, link it from the API index
- Record the replacement in the compatibility ledger
Rescan 240 jars of the 2.9.0-RC-2 instance and freeze the result as a new
ABI baseline next to the +678 one. All baseline rows are still present and
every scanned type and member resolves against the port.
- 28 consumer jars: ThaumicEnergistics is new (Class.forName on
TileMultipart for Waila providers)
- GT5U now calls BlockMultipart.reduceMOP (Scala Tuple2) for ProjectRed
wire recoloring; no Java replacement yet, recorded in the ledger
- GuideNH 1.3.41 replaced its reflection with direct links
- AE2 links JCuboidPart.bind from its host refresh fix
- Source heads refreshed to 2026-10-16; only GT5U, ProjectRed and
ProjectBlue changed FMP-referencing files
- Add manual checks for GT5U spray cans and ThaumicEnergistics Waila
- drop per-guide Validation sections; manual gates stay in MANUAL_CHECKS
- drop audit/provenance lines (reference checkouts, dated refreshes, commit pins)
- state version status and Scala-free compile check once in API.md
- replace API.md status prose with link to migration status
- fix RELEASE_NOTES dangling sentence
- rewrite README for GTNH fork and Java port
loadIcons runs in TextureStitchEvent.Post and could cache icons before
other mods finished theirs in the same event (Chisel CTMLib -v4 submaps),
leaving microblocks with missing or previous-stitch textures.
loadIcons now marks icons stale; the first icont() read after a stitch
rebuilds them once. Icons set through icont_$eq are kept. Addon materials
reading icont() get the fix without API changes.
Fixes GTNH issue 27183 without relying on handler priority (upstream #63).
Keep the existing Java recipe fix for PR #61. Port PR #62 so client additions reuse multipart tiles without converting stale blocks, preserving server-side conversion. Add a regression for stale client torches and subsequent additions.
Validation: full build, formatting, checkstyleTest and Scala-free API examples passed; 588 unit tests and 300 Forge functional tests passed without skips. The new Forge regression failed before the fix by retaining an extra converted torch.
The convention plugin's jvmDowngrader mode forces a project wide Java 25
toolchain and Scala 2.11.5 cannot run above Java 8, so compileScala fails
outright. forceToolchainVersion cannot bridge it because the mode refuses a
toolchain below its multi release maximum and that list refuses entries below
9. Also note why the modern helpers cannot simply move to src/main/java.
Upload functional test reports, JUnit XML and server logs on every run so a
CI failure has something to read beyond aggregate counts. Print unit and
functional test summaries, naming each failed functional test.
Repackage the JUnit stack into the test mod jar without module descriptors so
FML stops logging a LoaderException per jar while scanning the classpath, and
silence the two ERROR lines that passing tests drive on purpose.
Refresh the handoff counts and record which migration documents are deleted
when the port closes.
The notes told consumers what breaks on rebuild but not whether the
migration they are being asked to make is final. Without that, the
reasonable reading is that adopting the Java surface now buys a second
migration when the Scala runtime is removed later.
State the guarantee: the removal release drops the Scala-shaped entry
points and keeps their Java siblings, so one migration to the documented
surface is the whole cost. Name the one way to pay it twice, which is
aiming at a raw dev-jar class such as scalatraits.TRedstoneTile instead
of the stable IRedstoneTile capability interface. That is the mistake a
failing rebuild invites, and it fails at runtime in between.
Record two limits honestly: the guarantee covers the documented and
audited surface, which is why removal waits on adoption evidence rather
than source patches, and the source-layout move out of src/main/scala
changes no class, package or descriptor and so is invisible.