From 05e849e8d865824aa5c44a144dee487e0ef9e4c2 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 12 Nov 2026 16:27:16 +0000 Subject: [PATCH 1/3] Port Steam to Minecraft 26.2 --- .github/verify-published-pins.sh | 10 +- .github/workflows/ci.yml | 22 ++-- .github/workflows/codeql-analysis.yml | 10 +- .github/workflows/release-on-tag.yml | 6 +- .github/workflows/validate-gradle-build.yml | 4 +- CHANGELOG.txt | 6 + README.md | 120 ++++++------------ build.gradle | 58 ++++----- docs/PORT262-STATUS.md | 42 ++++++ gradle.properties | 57 +++++---- gradle/forge64-mavenizer.gradle | 34 ++--- .../gametest/NativeVillagerTradeProof.java | 2 +- .../gametest/SteamNativeGameTests.java | 2 +- .../moddev/mc/basesteam/SteamAdvantage.java | 4 +- .../moddev/mc/basesteam/gui/GUIHelper.java | 2 +- src/main/resources/META-INF/mods.toml | 2 +- src/main/resources/pack.mcmeta | 4 +- .../mc/basesteam/gui/GUIHelperTest.java | 8 +- .../resources/BuildWorkflowContractTest.java | 10 +- .../Native2612ToolchainContractTest.java | 20 +-- .../NativeBlockEntityContractTest.java | 2 +- .../resources/NativeLootContractTest.java | 6 +- .../NativePackFormatContractTest.java | 8 +- .../NativePackRangeContractTest.java | 10 +- .../NativeRequiredDependencyContractTest.java | 12 +- .../resources/RecipeUnlockContractTest.java | 2 +- .../testing/NativePackResourceProof.java | 4 +- tools/run-packaged-server-smoke.ps1 | 10 +- tools/verify-eclipse-ecj.ps1 | 5 +- tools/verify-native-port.js | 4 +- tools/verify-villager-trades.js | 2 +- 31 files changed, 251 insertions(+), 237 deletions(-) create mode 100644 docs/PORT262-STATUS.md diff --git a/.github/verify-published-pins.sh b/.github/verify-published-pins.sh index d2b5090..13c3044 100644 --- a/.github/verify-published-pins.sh +++ b/.github/verify-published-pins.sh @@ -9,10 +9,10 @@ require_merged() { echo "::error::$repo needs an exact source pin. A pending local candidate is not a public dependency." exit 1 fi - status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-26.1.2" --jq '.status')" + status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-26.2" --jq '.status')" case "$status" in identical|ahead) ;; - *) echo "::error::$repo $ref is not on upstream master-26.1.2 ($status)."; exit 1 ;; + *) echo "::error::$repo $ref is not on upstream master-26.2 ($status)."; exit 1 ;; esac } @@ -39,7 +39,7 @@ require_merged basePower "$power_ref" require_merged BaseMetals "$(value basemetals_source_commit)" require_merged OreSpawn "$orespawn_ref" -inputs="${RUNNER_TEMP:?}/forge64-release-dependencies" +inputs="${RUNNER_TEMP:?}/forge65-release-dependencies" mkdir -p "$inputs" power="$inputs/basePower-$(value poweradvantage_version).jar" metals="$inputs/BaseMetals-$(value basemetals_version).jar" @@ -48,8 +48,8 @@ public_jar basePower 1780140 "$(value poweradvantage_public_file_id)" "$(value p public_jar BaseMetals 240967 "$(value basemetals_public_file_id)" "$(value basemetals_deobf_sha256)" "$metals" public_jar OreSpawn 245586 "$(value orespawn_public_file_id)" "$(value orespawn_deobf_sha256)" "$orespawn" -installer="$inputs/forge-26.1.2-64.1.5-installer.jar" -download 'https://maven.minecraftforge.net/net/minecraftforge/forge/26.1.2-64.1.5/forge-26.1.2-64.1.5-installer.jar' \ +installer="$inputs/forge-26.2-65.1.0-installer.jar" +download 'https://maven.minecraftforge.net/net/minecraftforge/forge/26.2-65.1.0/forge-26.2-65.1.0-installer.jar' \ "$(value forge_installer_sha256)" "$installer" { printf 'power_ref=%s\n' "$power_ref" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a292070..78dbdda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,16 +1,16 @@ -name: baseSteam 26.1.2 CI +name: baseSteam 26.2 CI on: push: - branches: [master-26.1.2, 'feature/**'] + branches: [master-26.2, 'feature/**'] pull_request: - branches: [master-26.1.2] + branches: [master-26.2] permissions: contents: read concurrency: - group: basesteam-26.1.2-${{ github.workflow }}-${{ github.ref }} + group: basesteam-26.2-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: @@ -52,7 +52,7 @@ jobs: -Porg.gradle.java.installations.auto-download=false" >> "$GITHUB_ENV" - name: Set up Gradle uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6 - - name: Verify the Forge 64 build inputs + - name: Verify the Forge 65 build inputs shell: bash env: ORESPAWN_REF: ${{ steps.public-pins.outputs.orespawn_ref }} @@ -64,7 +64,7 @@ jobs: test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_REF" test "$(git -C "$power" rev-parse HEAD)" = "$POWER_REF" mavenizer="$orespawn/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar" - printf '%s %s\n' 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' "$mavenizer" | sha256sum -c - + printf '%s %s\n' '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B' "$mavenizer" | sha256sum -c - echo "MAVENIZER=$mavenizer" >> "$GITHUB_ENV" - name: Build the released basePower test bootstrap shell: bash @@ -89,20 +89,20 @@ jobs: - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: baseSteam-26.1.2-${{ github.sha }} + name: baseSteam-26.2-${{ github.sha }} if-no-files-found: error retention-days: 30 path: | - build/libs/baseSteam-2.2.17.2601021.jar - build/libs/baseSteam-2.2.17.2601021-sources.jar - build/libs/baseSteam-2.2.17.2601021-javadoc.jar + build/libs/baseSteam-2.2.18.2602001.jar + build/libs/baseSteam-2.2.18.2602001-sources.jar + build/libs/baseSteam-2.2.18.2602001-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt - name: Upload diagnostics on failure if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: baseSteam-26.1.2-diagnostics-${{ github.sha }} + name: baseSteam-26.2-diagnostics-${{ github.sha }} if-no-files-found: ignore retention-days: 14 path: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index da6ede7..9a05b35 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,9 +2,9 @@ name: CodeQL on: push: - branches: [master-26.1.2, 'feature/**'] + branches: [master-26.2, 'feature/**'] pull_request: - branches: [master-26.1.2] + branches: [master-26.2] permissions: contents: read @@ -12,7 +12,7 @@ permissions: security-events: write concurrency: - group: basesteam-26.1.2-${{ github.workflow }}-${{ github.ref }} + group: basesteam-26.2-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: @@ -54,7 +54,7 @@ jobs: -Porg.gradle.java.installations.auto-download=false" >> "$GITHUB_ENV" - name: Set up Gradle uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6 - - name: Verify the Forge 64 build inputs + - name: Verify the Forge 65 build inputs shell: bash env: ORESPAWN_REF: ${{ steps.public-pins.outputs.orespawn_ref }} @@ -66,7 +66,7 @@ jobs: test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_REF" test "$(git -C "$power" rev-parse HEAD)" = "$POWER_REF" mavenizer="$orespawn/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar" - printf '%s %s\n' 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' "$mavenizer" | sha256sum -c - + printf '%s %s\n' '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B' "$mavenizer" | sha256sum -c - echo "MAVENIZER=$mavenizer" >> "$GITHUB_ENV" - name: Initialize CodeQL uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4 diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml index 863ab62..bd21282 100644 --- a/.github/workflows/release-on-tag.yml +++ b/.github/workflows/release-on-tag.yml @@ -37,9 +37,9 @@ jobs: minecraft_version="$(value minecraft_version)" loader_name="$(value loader_name)" loader_code="$(value loader_code)" - if [[ "$minecraft_version" != '26.1.2' || "$(value forge_version)" != '64.1.5' || - "$(value mapping_version)" != '26.1.2' || "$(value mcp_version)" != '20260409.101008' ]]; then - echo 'Expected the exact Minecraft 26.1.2 Forge 64.1.5 release target' >&2 + if [[ "$minecraft_version" != '26.2' || "$(value forge_version)" != '65.1.0' || + "$(value mapping_version)" != '26.2' || "$(value mcp_version)" != '20260616.103818' ]]; then + echo 'Expected the exact Minecraft 26.2 Forge 65.1.0 release target' >&2 exit 1 fi diff --git a/.github/workflows/validate-gradle-build.yml b/.github/workflows/validate-gradle-build.yml index 531f53f..d8bacce 100644 --- a/.github/workflows/validate-gradle-build.yml +++ b/.github/workflows/validate-gradle-build.yml @@ -3,11 +3,11 @@ name: Validate Gradle Wrapper on: push: branches: - - master-26.1.2 + - master-26.2 - 'feature/**' pull_request: branches: - - master-26.1.2 + - master-26.2 permissions: contents: read diff --git a/CHANGELOG.txt b/CHANGELOG.txt index cedbbf4..9ba6a32 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,9 @@ +baseSteam 2.2.18.2602001 - local candidate + +- Target Minecraft 26.2 and Forge 65 with Java 25. +- Keep the shared Base Metals migration hook and existing machine, item and saved-data identities. +- Retain exact dependency, native pack, artifact and classpath guards while the new candidate is qualified. + baseSteam 2.2.17.2601021 (Minecraft 26.1.2 / Forge) - Bring baseSteam to Minecraft 26.1.2 with Forge 64.1.5 and Java 25. diff --git a/README.md b/README.md index b6c880c..c87e32a 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,54 @@ # baseSteam -**Minecraft 26.1.2 (Forge), baseSteam 2.2.17.2601021. Accepted for release.** +**Minecraft 26.2 Forge, version 2.2.18.2602001. Local build candidate.** -The frozen profile12 family has completed automated qualification and manual -testing. See the -[family qualification record](../../PowerAdvantage/docs/26.1.2/QUALIFICATION.md) -for the exact tested jars, completed checks and scope limits. Manual acceptance -is complete. Publication is being prepared; this version is not public yet. +baseSteam continues DrCyano's Steam Advantage and uses basePower's shared +API, machines and creative tab. Existing `basesteam` registry and saved-data +identities are retained. -baseSteam adds boilers, steam-powered machines, pumps, storage, elevators -and a blackpowder musket to basePower. Items and blocks share the basePower -creative tab. The mod ID and resource namespace remain `basesteam`. +This port targets Forge **65.1.0**, official Minecraft **26.2** names, +MCP **20260616.103818**, Java **25.0.3+9**, ForgeGradle **7.0.34** and the +checksum-pinned Gradle **9.6.1** wrapper. Native pack formats are data +**107.1** and client **88.0**. ## Build -Target: Forge 64.1.5, official Minecraft 26.1.2 names and MCP -20260409.101008, with reobf=false. ForgeGradle 7.0.34 and the checksum-pinned -Gradle 9.6.1 wrapper use Temurin 25.0.3+9. The compiler, Minecraft, -Mavenizer and Slime launcher also use that Java 25 toolchain. - -This port requires the coordinated local basePower 2.4.16.2601021 and -Base Metals 3.1.2.2601021 hook, plus released OreSpawn 4.1.1.2601021. -They remain separate Forge jars on both client and server, not bundled copies. +The coordinated local dependency versions are basePower **2.4.17.2602001** +and Base Metals **3.1.2.2602001**. The Base Metals hook source is +`523335a59ecff399e40a7c66eb121a3aabdc45ba`, player SHA-256 +`15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1`. Base Metals is REQUIRED on both client and server, not an optional integration. -The default build paths use the coordinated 26.1.2 checkouts. The current local -inputs are Power source d0bd0bdb/player 23ABCC1F, Base Metals source 331fa469/player -678623 and OreSpawn 810284EC (CurseForge 9572926). Exact source, jar and fixture08 bootstrap pins are in -gradle.properties. The coordinated Advantage and Base Metals builds remain -local inputs, not published releases. No 1.21.11 dependency is substituted. - -The accepted qualification uses the exact local Power and Base Metals pins. -They will be replaced with verified public source and file pins after those -dependencies are released. Publication follows Power, then Steam, then Electric; -local acceptance does not stand in for merged-source CI or public downloads. -The new clean release suite and fresh ECJ each pass 276 tests; independent -warm and empty-cache builds in paths with spaces reproduce all three archives. -These are child build gates, not combined-family or manual acceptance. - -The released 1.21.11 baseline and its receipts remain separate historical -evidence. Native 26.1.2 -metadata declares server data format 101.1 and client format 84.0; the hidden -client resource aggregate remains Forge's responsibility. The current kit's -native reader, machine, migration, side-loading and GUI results are recorded in -the family qualification record. Its original automated and manual-only scope -labels remain historical; manual acceptance was confirmed afterward. - -The sealed BB0D Mavenizer fixture comes from OreSpawn's OS2612 checkout. Another -layout can use `-Pforge64MavenizerJar=`. The `*DeobfJar` and `*PlayerJar` -properties select separate development and packaged inputs; both must -satisfy the committed checksums. - -After the coordinated native dependency pins are available locally: - -```powershell -$env:JAVA_HOME = "$env:USERPROFILE/.jdks/jdk-25.0.3+9" -$env:GRADLE_USER_HOME = 'D:/GradleCaches/basesteam-2612-port' -$toolchains = @("-Porg.gradle.java.installations.paths=$env:JAVA_HOME", - '-Porg.gradle.java.installations.auto-detect=false', - '-Porg.gradle.java.installations.auto-download=false') -./gradlew.bat @toolchains check build deobfJar verifyReleaseArtifacts writeReleaseChecksums -./gradlew.bat @toolchains verifyEclipseProductionClasspath -./gradlew.bat @toolchains -PsteamGameTestRunId=candidate verifyPlayerDependencies runGameTestServer -./tools/run-packaged-server-smoke.ps1 -ForgeInstall $env:FORGE_2612_SERVER_INSTALL -RunId candidate-with-metals -UseNioTransport -Reopen -``` - -For a checkout outside the sibling-folder layout, unit tests also need the -verified Power test bootstrap and its three source files. Build Power first, -then supply these paths as well as the dependency-jar overrides: +The approved local Power262 handoff is source +`f84b2362449e39eff5e76696dd64ce4cb144da4f`, player SHA-256 +`7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1`. + +OreSpawn **4.1.1.2602001** is the approved local retained-settings repair, +source `dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c`, SHA-256 +`BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F`. +It is not published; the public file-ID pin is deliberately empty. The older +4.1.0 public download is not substituted for these bytes. + +The Mavenizer fixture and its source-rule, patch, licence and provenance files +are checksum-sealed from the existing OS262 checkout. The established +`-Pforge64MavenizerJar` property remains a path alias; it selects the Forge65 +fixture here. Dependencies stay separate mods and must match the source and +artifact pins in `gradle.properties`. + +Use Temurin 25 and clear `JAVA_TOOL_OPTIONS`, `JDK_JAVA_OPTIONS` and +`_JAVA_OPTIONS` before qualification. The prepared sibling layout is the +default; explicit `*DeobfJar` and `*PlayerJar` flags change +paths, not the required bytes. With these exact coordinated inputs: ```text --PforgeCapabilityBootstrapJar=/build/unit-bootstrap/forge-native-unit-bootstrap.jar --PforgeCapabilityBootstrapSource=/test-rig/unit-bootstrap/ForgeCapabilityBootstrap.java --PforgeUnitRegistriesSource=/test-rig/unit-support/zone/moddev/mc/advantageworks/unit/ForgeUnitRegistries.java --Pforge64UnitLoaderSource=/test-rig/unit-support/zone/moddev/mc/advantageworks/unit/Forge64UnitLoader.java +./gradlew clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts writeReleaseChecksums --no-build-cache --no-daemon +./gradlew verifyEclipseProductionClasspath --no-daemon +node tools/verify-native-port.js +node tools/generate-recipe-unlocks.js --check ``` -The atlas test uses the same verified Power jar selected for compilation; -it does not look for a second copy in a fixed local folder. Missing or -changed inputs fail the checks. The previous candidate09 passed 276 unit -tests and a fresh independent ECJ run of the same complete inventory. The -scoped runtime and reproducibility results are in the port status below; -they do not imply family or manual acceptance. Native resource tests disable interactive terminal setup in their -child process, while keeping warnings and errors fatal. -Keep Java option environment variables unset -when running the packaged family rig; it records its own runtime arguments. - -Independent source checks: `node tools/verify-native-port.js` and -`node tools/generate-recipe-unlocks.js --check`. -Hosted CI and CodeQL verify merged dependency sources and checksum-matching -public downloads before compiling. +See [26.2 port status](docs/PORT262-STATUS.md). The accepted 26.1.2 family +qualification remains historical proof of those original bytes, not this port. +There is no 26.2 manual acceptance, hosted qualification or publication yet. ## Old Worlds @@ -105,7 +65,7 @@ check machines, restarts, redstone, all drill directions, elevators, GUI captions, whole fluid gauges, track transparency and musket effects in-game. Release acceptance does not turn the remaining manual checks into automated passes or qualify every modpack. -See the [26.1.2 port status](docs/PORT2612-STATUS.md). The +The [26.1.2 port status](docs/PORT2612-STATUS.md) is historical. The [1.21.11 notes](docs/PORT12111-STATUS.md) and the [1.21.1 notes](docs/PORT1211-STATUS.md) describe the accepted source baseline, not qualification of this port. diff --git a/build.gradle b/build.gradle index 0bda469..3f4737d 100644 --- a/build.gradle +++ b/build.gradle @@ -165,7 +165,7 @@ sourceSets.main.resources { def forgeRunModClassesDirectory = layout.buildDirectory.dir('forge-run-mod-classes/main') def prepareForgeRunModClasses = tasks.register('prepareForgeRunModClasses', Sync) { group = 'ide' - description = 'Merges classes and processed resources for Forge 64 launches.' + description = 'Merges classes and processed resources for Forge 65 launches.' dependsOn tasks.named('classes') from sourceSets.main.output into forgeRunModClassesDirectory @@ -278,12 +278,12 @@ repositories { // Only code and launch tasks require the exact jars; source/resource checks can run independently. def explicitJar = { String property -> providers.gradleProperty(property).map { file(it) }.getOrNull() } def powerRoot = '../../PowerAdvantage' -def baseMetalsRoot = '../../../../BaseMetals/BaseMetals 2612/BaseMetals' +def baseMetalsRoot = '../../../../BaseMetals/BaseMetals 262/BaseMetals' def powerNativeJar = file("${powerRoot}/build/libs/basePower-${project.poweradvantage_version}.jar") def powerAdvantageDeobfJar = explicitJar('powerAdvantageDeobfJar') ?: powerNativeJar def baseMetalsDeobfJar = explicitJar('baseMetalsDeobfJar') ?: file( "${baseMetalsRoot}/build/libs/BaseMetals-${project.basemetals_version}.jar") -def oreSpawnRoot = '../../../../MinecraftMineralogy/OS2612/OreSpawn' +def oreSpawnRoot = '../../../../MinecraftMineralogy/OS262/OreSpawn' def oreSpawnJar = { String variant -> explicitJar("oreSpawn${variant}Jar") ?: file( "${oreSpawnRoot}/build/libs/OreSpawn-${project.orespawn_version}.jar") @@ -434,7 +434,7 @@ tasks.named('jar', Jar) { } } -// Forge 64 runs official names. The player jar needs no SRG remapping. +// Forge 65 runs official names. The player jar needs no SRG remapping. def releaseJar = tasks.register('releaseJar', Jar) { dependsOn tasks.named('classes'), 'verifyReleaseDependencies' archiveClassifier = null @@ -511,18 +511,18 @@ def expectedReleaseFiles = providers.provider { def preparedReleaseDir = providers.gradleProperty('preparedReleaseDir') def verifyPackFormats = { pack -> - if (pack.min_format != [101, 1] || pack.max_format != [101, 1] + if (pack.min_format != [107, 1] || pack.max_format != [107, 1] || pack.containsKey('pack_format') || pack.containsKey('supported_formats')) { - throw new GradleException('The mod root requires data format 101.1; Forge supplies hidden client pack metadata') + throw new GradleException('The mod root requires data format 107.1; Forge supplies hidden client pack metadata') } } def verifyRequiredBaseMetalsMetadata = { String metadata -> String normalized = metadata.replace('\r\n', '\n') - String declaration = 'modId="basemetals"\nmandatory=true\nversionRange="[3.1.2.2601021,4.0.0)"\nordering="AFTER"\nside="BOTH"' + String declaration = 'modId="basemetals"\nmandatory=true\nversionRange="[3.1.2.2602001,4.0.0)"\nordering="AFTER"\nside="BOTH"' if (!normalized.contains(declaration) || normalized.readLines().count { it.trim() == 'modId="basemetals"' } != 1) { - throw new GradleException('Base Metals must be declared exactly once as REQUIRED on BOTH sides, ordered AFTER, in [3.1.2.2601021,4.0.0)') + throw new GradleException('Base Metals must be declared exactly once as REQUIRED on BOTH sides, ordered AFTER, in [3.1.2.2602001,4.0.0)') } } @@ -538,15 +538,15 @@ tasks.register('verifyReleaseConfiguration') { '9c0f7faeeb306cb14e4279a3e084ca6b596894089a0638e68a07c945a32c9e14') { throw new GradleException('Use the checksum-pinned Gradle 9.6.1 wrapper') } - if (project.mod_version != '2.2.17.2601021') { + if (project.mod_version != '2.2.18.2602001') { throw new GradleException("Unexpected baseSteam release version: ${project.mod_version}") } - if (project.minecraft_version != '26.1.2' || project.minecraft_version_range != '[26.1.2]' - || project.forge_version != '64.1.5' || project.forge_version_range != '[64.1.5,65)' - || project.loader_version_range != '[64,65)' + if (project.minecraft_version != '26.2' || project.minecraft_version_range != '[26.2]' + || project.forge_version != '65.1.0' || project.forge_version_range != '[65.1.0,66)' + || project.loader_version_range != '[65,66)' || project.mapping_channel != 'official' - || project.mapping_version != '26.1.2' - || project.mcp_version != '20260409.101008' || project.reobf != 'false') { + || project.mapping_version != '26.2' + || project.mcp_version != '20260616.103818' || project.reobf != 'false') { throw new GradleException('Unexpected Minecraft, Forge, or mappings target') } if (project.loader_name != 'forge' || project.loader_code != '1' @@ -566,11 +566,11 @@ tasks.register('verifyReleaseConfiguration') { } if (project.cf_requirements != 'basepower,base-metals' || project.cf_optionals != '' - || project.cf_versions != '26.1.2') { + || project.cf_versions != '26.2') { throw new GradleException('Unexpected CurseForge dependency or game-version metadata') } - if (project.basemetals_version != '3.1.2.2601021' - || project.orespawn_version != '4.1.1.2601021') { + if (project.basemetals_version != '3.1.2.2602001' + || project.orespawn_version != '4.1.1.2602001') { throw new GradleException('Unexpected development API versions') } if (project.poweradvantage_source_repository != 'MinecraftModDevelopmentMods/basePower') { @@ -579,7 +579,7 @@ tasks.register('verifyReleaseConfiguration') { String mainSource = file( 'src/main/java/zone/moddev/mc/basesteam/SteamAdvantage.java').getText('UTF-8') if (!mainSource.contains('MODID = "basesteam"') - || !mainSource.contains('VERSION = "2.2.17.2601021"')) { + || !mainSource.contains('VERSION = "2.2.18.2602001"')) { throw new GradleException('baseSteam source identity changed') } String metadata = file('src/main/resources/META-INF/mods.toml').getText('UTF-8').replace('\r\n', '\n') @@ -612,7 +612,7 @@ def auditJar = { File jarFile, String property, String hashPin, String modId, St } def manifest = new Manifest(zip.getInputStream(zip.getEntry('META-INF/MANIFEST.MF'))).mainAttributes String expectedBuild = modId in ['basemetals', 'orespawn'] - ? '26.1.2-64.0.9' : "${project.minecraft_version}-${project.forge_version}" + ? '26.2-65.1.0' : "${project.minecraft_version}-${project.forge_version}" if (manifest.getValue('Implementation-Version') != expectedVersion || manifest.getValue('Built-On') != expectedBuild || manifest.getValue('Built-On-Java') != '25') { @@ -673,7 +673,7 @@ tasks.register('verifyPlayerDependencies') { dependsOn tasks.named('verifyCompanionPlayerDependencies') doLast { committedPin('poweradvantage_source_ref', /[a-f0-9]{40}/) - committedPin('poweradvantage_version', /\d+\.\d+\.\d+\.2601021/) + committedPin('poweradvantage_version', /\d+\.\d+\.\d+\.2602001/) auditJar(explicitJar('powerAdvantagePlayerJar') ?: powerNativeJar, 'powerAdvantagePlayerJar', 'poweradvantage_player_sha256', 'basepower', project.poweradvantage_version, powerApi) } @@ -684,7 +684,7 @@ tasks.register('verifyNativeDevelopmentDependencies') { description = 'Resolves Forge and audits the exact development JARs.' dependsOn tasks.named('verifyCompanionDevelopmentDependencies') doLast { - committedPin('poweradvantage_version', /\d+\.\d+\.\d+\.2601021/) + committedPin('poweradvantage_version', /\d+\.\d+\.\d+\.2602001/) committedPin('poweradvantage_source_ref', /[a-f0-9]{40}/) auditJar(powerAdvantageDeobfJar, 'powerAdvantageDeobfJar', 'poweradvantage_deobf_sha256', 'basepower', project.poweradvantage_version, powerApi) @@ -1286,7 +1286,7 @@ tasks.register('isolateEclipseProductionRuns') { } String program = programAttribute.@value if (program.contains('--to-srg') || program.contains('--to-obf')) { - throw new GradleException("${name} must not remap the official Forge 64 runtime") + throw new GradleException("${name} must not remap the official Forge 65 runtime") } if (name == 'runClient.launch') { File nativeJar = productionRuntime.find { @@ -1300,9 +1300,9 @@ tasks.register('isolateEclipseProductionRuns') { assetIndex = new groovy.json.JsonSlurper().parse(zip.getInputStream( zip.getEntry('minecraft/version.json'))).assetIndex } - if (assetIndex.id.toString() != '30' - || assetIndex.sha1 != '49107cf4e5f961b086ac4f06f3c2c56142b023dc') { - throw new GradleException('Unexpected Minecraft 26.1.2 native asset index') + if (assetIndex.id.toString() != '32' + || assetIndex.sha1 != '941b1ea6afb4a472d164c0d12e3e3272bf3435f8') { + throw new GradleException('Unexpected Minecraft 26.2 native asset index') } File assets = file(providers.gradleProperty('minecraftAssetsDir').getOrElse( new File(System.getenv('APPDATA') ?: System.getProperty('user.home'), @@ -1425,8 +1425,8 @@ tasks.register('verifyEclipseProductionClasspath') { throw new GradleException("${name} is missing Slime Launcher argument ${option}") } } - if (name == 'runClient.launch' && !arguments.contains('--assetIndex 30 ')) { - throw new GradleException('Eclipse client must use the actual Minecraft 26.1.2 asset index') + if (name == 'runClient.launch' && !arguments.contains('--assetIndex 32 ')) { + throw new GradleException('Eclipse client must use the actual Minecraft 26.2 asset index') } def legacyFile = vmArguments =~ /(?:^|\s)"-DlegacyClassPath\.file=([^"]+)"(?=\s|$)/ if (vmArguments.contains('-DlegacyClassPath.file=') @@ -1437,7 +1437,7 @@ tasks.register('verifyEclipseProductionClasspath') { || (name == 'runClient.launch' && !arguments.startsWith('--launcher-side client ')) || !vmArguments.contains('--add-opens java.base/java.lang.invoke=ALL-UNNAMED') || contents.contains('net.minecraftforge.userdev.LaunchTesting')) { - throw new GradleException("${name} must retain the native Forge 64 bootstrap and Java 25 module access") + throw new GradleException("${name} must retain the native Forge 65 bootstrap and Java 25 module access") } if (launch.booleanAttribute.find { it.@key.text() == 'org.eclipse.jdt.launching.ATTR_EXCLUDE_TEST_CODE' @@ -1497,7 +1497,7 @@ tasks.register('verifyEclipseProductionClasspath') { String target = name == 'runClient.launch' ? 'forge_userdev_client' : 'forge_userdev_server' if (!arguments.contains("--launchTarget ${target}") || !arguments.contains("forge-${project.minecraft_version}-${project.forge_version}-metadata.zip")) { - throw new GradleException("${name} does not target the exact Forge 64 development runtime") + throw new GradleException("${name} does not target the exact Forge 65 development runtime") } } } diff --git a/docs/PORT262-STATUS.md b/docs/PORT262-STATUS.md new file mode 100644 index 0000000..bbb07d8 --- /dev/null +++ b/docs/PORT262-STATUS.md @@ -0,0 +1,42 @@ +# Minecraft 26.2 local build candidate + +Version 2.2.18.2602001 targets Forge65.1.0, MCP20260616.103818, Java25 and +native pack formats107.1/88.0. This candidate is local-only. Child build gates +do not establish combined-family runtime qualification or manual acceptance. + +## Exact inputs + +- Power source f84b2362449e39eff5e76696dd64ce4cb144da4f; player/development + 7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1. +- Base Metals source 523335a59ecff399e40a7c66eb121a3aabdc45ba; player/development + 15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1. +- OreSpawn4.1.1.2602001 local retained-settings repair, source + dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c; player/development + BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F. + No public file ID is assigned to this local candidate. +- Power's checksum-pinned unit agent and committed support sources are used + separately from player bytes. No helper or test classes ship in the mod. + +## Passed child gates + +- Clean check/build/Javadoc: 47 tasks / 276 unit tests, with no failures or skips. +- Exact source/artifact pins, release archives/checksums, GameTest source + compilation and Eclipse production-classpath isolation. +- Fresh ECJ main/test/GameTest compilation and the same complete unit inventory, + including strict inventory-rejection controls. +- All 24 recipe-unlock checks. Static source audits remain separate from runtime proof. +- Native screen lookup uses Minecraft.gui.screen(); existing needle delegation + and no-immediate-GPU contracts remain asserted. +- Failed setup, compiler and test attempts are preserved separately. The + provisional old-Power/public-OreSpawn runs are not relabelled as this candidate. + +## Remaining qualification + +Independent archive reproductions and fresh-cache/offline gates remain pending. +Packaged combined-family gameplay, machine/migration/actor/dimension/order, +retained-generation and GPU/client campaigns are parent-owned and are not +claimed here. Manual acceptance is also pending. Historical 26.1.2 evidence +remains bound to its original source, profile and artifact bytes. + +Hosted CI still requires merged, public dependency inputs; local candidate +pins do not waive that gate. No 26.2 push, tag, publisher dispatch or upload. diff --git a/gradle.properties b/gradle.properties index b1f218d..bb91af3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,19 +6,19 @@ org.gradle.caching=true org.gradle.parallel=false net.minecraftforge.gradle.merge-source-sets=false -minecraft_version=26.1.2 -minecraft_version_range=[26.1.2] -forge_version=64.1.5 -# Verified against the authentic, installed Forge 64.1.5 runtime. -forge_installer_sha256=6E01323837051176762BD466340A601DA122F179FE6A00AC616E05429AE07648 -forge_server_shim_sha256=0C74CB2A8E7A71AEB7055396C1E25864584A2D837D7DD42136A06D0B41ADD545 -forge_server_sha256=C6B85C178B037519464D436A75B7C68408CBE591576270BA0E826542B50BF41B -forge_universal_sha256=687C2698ECC1906CA2AD398A445C2498CF8BC09F1CBE6C2A6E24BFC9F90736C7 -forge_version_range=[64.1.5,65) -loader_version_range=[64,65) +minecraft_version=26.2 +minecraft_version_range=[26.2] +forge_version=65.1.0 +# Verified against the authentic, installed Forge 65.1.0 runtime. +forge_installer_sha256=813FBBFECC3086A492783B9F5023AE15007737B42E17AAB75F48BA77403314DF +forge_server_shim_sha256=8D113D3DFFF0F0978A1989E22A8040FAD0FE5E332EF766B3702EB29687C9F4D2 +forge_server_sha256=2DDA94C321F928934AE7E3B8DB45AAE0FD994A9FA7BBDCDDC0AF1F9170A581DA +forge_universal_sha256=3C8816B687BA6F7404E35ED11397F6ABFB00A8C800286E43E038DBBD8FA5525F +forge_version_range=[65.1.0,66) +loader_version_range=[65,66) mapping_channel=official -mapping_version=26.1.2 -mcp_version=20260409.101008 +mapping_version=26.2 +mcp_version=20260616.103818 reobf=false loader_name=forge @@ -32,35 +32,36 @@ curseforge_project_id=1781373 mod_id=basesteam mod_name=baseSteam mod_license=GPL-3.0-only -mod_version=2.2.17.2601021 +mod_version=2.2.18.2602001 mod_group=zone.moddev.mc.basesteam mod_authors=DrCyano mod_description=Steam-powered machines and infrastructure for basePower. cf_requirements=basepower,base-metals cf_optionals= -cf_versions=26.1.2 +cf_versions=26.2 -poweradvantage_version=2.4.16.2601021 +poweradvantage_version=2.4.17.2602001 poweradvantage_source_repository=MinecraftModDevelopmentMods/basePower -# LOCAL SOURCE inputs, not public releases or family qualification. -poweradvantage_source_ref=d0bd0bdbde6c499e800e5a5b4ecc7f9ac63d2055 +# Owner-approved local Power262 compile/test handoff; not a public release. +poweradvantage_source_ref=f84b2362449e39eff5e76696dd64ce4cb144da4f poweradvantage_public_file_id= -poweradvantage_deobf_sha256=23ABCC1FEFDAA6988BF709437EB165C8948C757E773ADAB738092EB93CA8D2B0 -poweradvantage_player_sha256=23ABCC1FEFDAA6988BF709437EB165C8948C757E773ADAB738092EB93CA8D2B0 +poweradvantage_deobf_sha256=7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1 +poweradvantage_player_sha256=7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1 poweradvantage_test_bootstrap_sha256=088FC137BEBB9B2E75C596DE868499E6099CF228BECFCF07EAE36791245FD1B6 poweradvantage_test_bootstrap_source_sha256=D4B72FD65D9F8549B142507C6446E3B1E047B637784AF9FA74E8F28413E14A51 poweradvantage_test_registry_source_sha256=01DDE50C9874C2DC501BE2F699CD8D16D6974FACFAAC1B803434CA8C64227ABF poweradvantage_test_loader_source_sha256=455CA9403D9CBEA72E7D055966D6CDC822E634418C14B3CAD0500588DEE35E5B -basemetals_version=3.1.2.2601021 -basemetals_source_commit=331fa46914f854db71a8c33500cc559a8878b7d3 +basemetals_version=3.1.2.2602001 +basemetals_source_commit=523335a59ecff399e40a7c66eb121a3aabdc45ba basemetals_public_file_id= -basemetals_deobf_sha256=6786238835D4D8A653C769F3B0E61D226959146300E17523799CFDF17540FD19 -basemetals_player_sha256=6786238835D4D8A653C769F3B0E61D226959146300E17523799CFDF17540FD19 +basemetals_deobf_sha256=15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1 +basemetals_player_sha256=15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1 -orespawn_version=4.1.1.2601021 -orespawn_source_commit=101fd12b598934c353e417c57edc5c2bbefd5f53 -orespawn_public_file_id=9572926 -orespawn_deobf_sha256=810284ECB32D5249381F246498CEFA57E70FFF7CCC40110F799FC276CBC42BF7 -orespawn_player_sha256=810284ECB32D5249381F246498CEFA57E70FFF7CCC40110F799FC276CBC42BF7 +orespawn_version=4.1.1.2602001 +orespawn_source_commit=dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c +# Approved LOCAL source candidate; not CurseForge file 9332183. +orespawn_public_file_id= +orespawn_deobf_sha256=BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F +orespawn_player_sha256=BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F diff --git a/gradle/forge64-mavenizer.gradle b/gradle/forge64-mavenizer.gradle index 16440b4..f40f1f8 100644 --- a/gradle/forge64-mavenizer.gradle +++ b/gradle/forge64-mavenizer.gradle @@ -1,24 +1,26 @@ import java.security.MessageDigest import org.gradle.jvm.toolchain.JvmVendorSpec -// Use OreSpawn's checksum-verified fixture; Forge 64 needs no source repair rules. +// Keep the preparation tool and its source-rule/license evidence together. +// A different checkout layout can override the jar path without editing this file. def tool = 'ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar' -def defaultJar = "../../../../MinecraftMineralogy/OS2612/OreSpawn/${tool}" +def defaultJar = project.extensions.extraProperties.has('forge64MavenizerDefault') + ? project.forge64MavenizerDefault + : "../../../../MinecraftMineralogy/OS262/OreSpawn/${tool}" def fixture = file(providers.gradleProperty('forge64MavenizerJar').getOrElse(defaultJar)) -def expected = 'BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085' -if (!fixture.isFile()) { - throw new GradleException("Forge 64 requires OreSpawn's Mavenizer fixture: ${fixture}. " - + "Use -Pforge64MavenizerJar= for another checkout layout.") -} -def actual = MessageDigest.getInstance('SHA-256').digest(fixture.bytes).encodeHex().toString().toUpperCase(Locale.ROOT) -if (actual != expected) { - throw new GradleException("Forge 64 Mavenizer fixture SHA-256 mismatch: expected ${expected}, got ${actual}") -} -def rules = new File(fixture.parentFile, 'minecraft-source-compatibility.json') -def rulesHash = '21D1F5984E735BCEA1B1EFB9F965655796B39538FC91AAED1C3474004710423D' -if (!rules.isFile() || MessageDigest.getInstance('SHA-256').digest(rules.bytes) - .encodeHex().toString().toUpperCase(Locale.ROOT) != rulesHash) { - throw new GradleException("Forge 64 Mavenizer source rules mismatch: ${rules}") +def checksums = [ + (fixture.name): '5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B', + 'minecraft-source-compatibility.json': '9437E03FC5E1CB5D605D72F0538C4DF4417B64DB0A57D0AABDC5184781517AC1', + 'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '2DA8DD0FD5F112F5B7591113AED06D9A58C584A25F8705E26445A6D2E9D5C78E', + 'LICENSE-MAVENIZER.txt': '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331', + 'README.md': 'EAD1477F393897C491A10FB86178213A99C360571A8063D551DA0579DF65BA6F' +] +checksums.each { name, expected -> + File input = new File(fixture.parentFile, name) + if (!input.isFile() || MessageDigest.getInstance('SHA-256').digest(input.bytes) + .encodeHex().toString().toUpperCase(Locale.ROOT) != expected) { + throw new GradleException("Missing or altered Forge 65 Mavenizer fixture: ${input}") + } } fgtools.configure('mavenizer') { diff --git a/src/gametest/java/zone/moddev/mc/basesteam/gametest/NativeVillagerTradeProof.java b/src/gametest/java/zone/moddev/mc/basesteam/gametest/NativeVillagerTradeProof.java index d3156bf..9770205 100644 --- a/src/gametest/java/zone/moddev/mc/basesteam/gametest/NativeVillagerTradeProof.java +++ b/src/gametest/java/zone/moddev/mc/basesteam/gametest/NativeVillagerTradeProof.java @@ -54,7 +54,7 @@ static void verify(GameTestHelper helper) { placementCount += own.size(); } helper.assertTrue(placementCount == 10, "Missing a legacy trade placement"); - var trader = helper.spawnWithNoFreeWill(EntityType.VILLAGER, new BlockPos(1, 1, 1)); + var trader = helper.spawnWithNoFreeWill(net.minecraft.world.entity.EntityTypes.VILLAGER, new BlockPos(1, 1, 1)); var params = new LootParams.Builder(level) .withParameter(LootContextParams.ORIGIN, trader.position()) .withParameter(LootContextParams.THIS_ENTITY, trader) diff --git a/src/gametest/java/zone/moddev/mc/basesteam/gametest/SteamNativeGameTests.java b/src/gametest/java/zone/moddev/mc/basesteam/gametest/SteamNativeGameTests.java index 0f2c3ec..0207216 100644 --- a/src/gametest/java/zone/moddev/mc/basesteam/gametest/SteamNativeGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basesteam/gametest/SteamNativeGameTests.java @@ -3,7 +3,7 @@ import com.mojang.serialization.Dynamic; import io.netty.buffer.Unpooled; import net.minecraft.SharedConstants; -import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.advancements.triggers.InventoryChangeTrigger; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponents; diff --git a/src/main/java/zone/moddev/mc/basesteam/SteamAdvantage.java b/src/main/java/zone/moddev/mc/basesteam/SteamAdvantage.java index bac08a7..aa068c0 100644 --- a/src/main/java/zone/moddev/mc/basesteam/SteamAdvantage.java +++ b/src/main/java/zone/moddev/mc/basesteam/SteamAdvantage.java @@ -25,12 +25,12 @@ import zone.moddev.mc.basesteam.migration.SteamConfigMigration; import zone.moddev.mc.basesteam.recipe.RecipeConditions; -/** Forge 26.1.2 entry point for baseSteam. */ +/** Forge 26.2 entry point for baseSteam. */ @Mod(SteamAdvantage.MODID) public final class SteamAdvantage { public static final String MODID = "basesteam"; public static final String NAME = "baseSteam"; - public static final String VERSION = "2.2.17.2601021"; + public static final String VERSION = "2.2.18.2602001"; public static final Logger LOGGER = LogManager.getLogger(MODID); public static float MUSKET_DAMAGE = 20.0F; diff --git a/src/main/java/zone/moddev/mc/basesteam/gui/GUIHelper.java b/src/main/java/zone/moddev/mc/basesteam/gui/GUIHelper.java index da6d7cf..2c9c2d2 100644 --- a/src/main/java/zone/moddev/mc/basesteam/gui/GUIHelper.java +++ b/src/main/java/zone/moddev/mc/basesteam/gui/GUIHelper.java @@ -44,7 +44,7 @@ private static float needleRotation(float value) { @Deprecated public static void drawNeedle(float pivotX, float pivotY, float zLevel, float value) { - drawNeedle(drawingContainer(net.minecraft.client.Minecraft.getInstance().screen), pivotX, pivotY, zLevel, value); + drawNeedle(drawingContainer(net.minecraft.client.Minecraft.getInstance().gui.screen()), pivotX, pivotY, zLevel, value); } static GUIContainer drawingContainer(net.minecraft.client.gui.screens.Screen screen) { diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index c86cfca..a85bd35 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -22,7 +22,7 @@ side="BOTH" [[dependencies.basesteam]] modId="basemetals" mandatory=true -versionRange="[3.1.2.2601021,4.0.0)" +versionRange="[3.1.2.2602001,4.0.0)" ordering="AFTER" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index e14cd39..c59f83c 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack":{ - "min_format":[101,1], - "max_format":[101,1], + "min_format":[107,1], + "max_format":[107,1], "description":"baseSteam" } } diff --git a/src/test/java/zone/moddev/mc/basesteam/gui/GUIHelperTest.java b/src/test/java/zone/moddev/mc/basesteam/gui/GUIHelperTest.java index d270462..b6cb98f 100644 --- a/src/test/java/zone/moddev/mc/basesteam/gui/GUIHelperTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/gui/GUIHelperTest.java @@ -69,18 +69,20 @@ public class GUIHelperTest { } var method = node.methods.stream().filter(value -> value.name.equals("drawNeedle") && value.desc.equals("(FFFF)V")).findFirst().orElseThrow(); - boolean currentScreen = false, delegate = false; + boolean gui = false, currentScreen = false, delegate = false; for (var instruction : method.instructions) { if (instruction instanceof org.objectweb.asm.tree.FieldInsnNode field) { - if (field.owner.equals("net/minecraft/client/Minecraft") && field.name.equals("screen")) currentScreen = true; + if (field.owner.equals("net/minecraft/client/Minecraft") && field.name.equals("gui")) gui = true; } if (instruction instanceof org.objectweb.asm.tree.MethodInsnNode call) { assertFalse(call.owner, call.owner.startsWith("com/mojang/blaze3d/")); + if (call.owner.equals("net/minecraft/client/gui/Gui") && call.name.equals("screen") + && call.desc.equals("()Lnet/minecraft/client/gui/screens/Screen;")) currentScreen = true; if (call.owner.equals(node.name) && call.name.equals("drawNeedle") && call.desc.equals("(Lcyano/poweradvantage/api/simple/SimpleMachineGUI$GUIContainer;FFFF)V")) delegate = true; } } - assertTrue(currentScreen && delegate); + assertTrue(gui && currentScreen && delegate); } private static final class DrawingContainer extends GUIContainer { diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/BuildWorkflowContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/BuildWorkflowContractTest.java index 729f8bc..555cfb2 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/BuildWorkflowContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/BuildWorkflowContractTest.java @@ -12,12 +12,12 @@ public class BuildWorkflowContractTest { try (var reader = Files.newBufferedReader(Path.of("gradle.properties"))) { pins.load(reader); } - assertEquals("26.1.2", pins.getProperty("minecraft_version")); - assertEquals("64.1.5", pins.getProperty("forge_version")); + assertEquals("26.2", pins.getProperty("minecraft_version")); + assertEquals("65.1.0", pins.getProperty("forge_version")); assertEquals("25", pins.getProperty("java_version")); assertEquals("official", pins.getProperty("mapping_channel")); - assertEquals("26.1.2", pins.getProperty("mapping_version")); - assertEquals("2.4.16.2601021", pins.getProperty("poweradvantage_version")); + assertEquals("26.2", pins.getProperty("mapping_version")); + assertEquals("2.4.17.2602001", pins.getProperty("poweradvantage_version")); for (String key : new String[] {"poweradvantage_source_ref", "poweradvantage_deobf_sha256", "poweradvantage_player_sha256", "poweradvantage_test_bootstrap_sha256", "poweradvantage_test_bootstrap_source_sha256", "poweradvantage_test_registry_source_sha256", @@ -41,7 +41,7 @@ public class BuildWorkflowContractTest { String source = Files.readString(Path.of(".github/workflows", name)); int pinCheck = source.indexOf("bash .github/verify-published-pins.sh"); assertTrue(name, pinCheck > 0 && pinCheck < source.indexOf("Check out released basePower source")); - assertTrue(name, source.contains("branches: [master-26.1.2")); + assertTrue(name, source.contains("branches: [master-26.2")); assertTrue(name, source.contains("java-version: '25.0.3+9.0.LTS'")); assertFalse(name, source.contains("JAVA_HOME_8_X64")); assertFalse(name, source.contains("java-version: '21")); diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/Native2612ToolchainContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/Native2612ToolchainContractTest.java index 09cee6c..05e5aa1 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/Native2612ToolchainContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/Native2612ToolchainContractTest.java @@ -7,18 +7,18 @@ import static org.junit.Assert.*; public class Native2612ToolchainContractTest { - @Test public void targetUsesExactJava25AndRecommendedForge64() throws Exception { + @Test public void targetUsesExactJava25AndForge65() throws Exception { Properties pins = new Properties(); try (var reader = Files.newBufferedReader(Path.of("gradle.properties"))) { pins.load(reader); } - assertEquals("26.1.2", pins.getProperty("minecraft_version")); - assertEquals("[26.1.2]", pins.getProperty("minecraft_version_range")); - assertEquals("64.1.5", pins.getProperty("forge_version")); - assertEquals("[64.1.5,65)", pins.getProperty("forge_version_range")); - assertEquals("[64,65)", pins.getProperty("loader_version_range")); - assertEquals("20260409.101008", pins.getProperty("mcp_version")); - assertEquals("2.2.17.2601021", pins.getProperty("mod_version")); + assertEquals("26.2", pins.getProperty("minecraft_version")); + assertEquals("[26.2]", pins.getProperty("minecraft_version_range")); + assertEquals("65.1.0", pins.getProperty("forge_version")); + assertEquals("[65.1.0,66)", pins.getProperty("forge_version_range")); + assertEquals("[65,66)", pins.getProperty("loader_version_range")); + assertEquals("20260616.103818", pins.getProperty("mcp_version")); + assertEquals("2.2.18.2602001", pins.getProperty("mod_version")); assertEquals("25", pins.getProperty("java_version")); assertEquals("25", pins.getProperty("gradle_java_version")); assertEquals("25.0.3+9", pins.getProperty("java_toolchain_version")); @@ -34,8 +34,8 @@ public class Native2612ToolchainContractTest { String build = Files.readString(Path.of("build.gradle")); assertTrue(build.contains("apply from: 'gradle/forge64-mavenizer.gradle'")); String tool = Files.readString(Path.of("gradle/forge64-mavenizer.gradle")); - assertTrue(tool.contains("BB0DACB3DEB2A711CA67DD402D5FDAB5A9847C37C7B9B596DEC7CF37378FA085")); - assertTrue(tool.contains("21D1F5984E735BCEA1B1EFB9F965655796B39538FC91AAED1C3474004710423D")); + assertTrue(tool.contains("5ABAB52A3F1BE115381C3CE80D5FD38DBE6C9F4C0B9ECF70A957700EC90FB88B")); + assertTrue(tool.contains("9437E03FC5E1CB5D605D72F0538C4DF4417B64DB0A57D0AABDC5184781517AC1")); assertTrue(tool.contains("JavaLanguageVersion.of(25)")); assertFalse(tool.contains("B36CA046")); assertFalse(tool.contains("88F2EE4C")); diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/NativeBlockEntityContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/NativeBlockEntityContractTest.java index 06c39bf..66e50b3 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/NativeBlockEntityContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/NativeBlockEntityContractTest.java @@ -59,7 +59,7 @@ public class NativeBlockEntityContractTest { try { Entities.DRILLBIT = new BlockEntityType<>(DrillBitTileEntity::new, java.util.Set.of(block)); assertNotNull(block.getTicker(null, block.defaultBlockState(), Entities.DRILLBIT)); - assertNull(block.getTicker(null, block.defaultBlockState(), BlockEntityType.FURNACE)); + assertNull(block.getTicker(null, block.defaultBlockState(), net.minecraft.world.level.block.entity.BlockEntityTypes.FURNACE)); DrillBitTileEntity tile = new DrillBitTileEntity(new BlockPos(17, 80, 31), block.defaultBlockState()); block.getTicker(null, block.defaultBlockState(), Entities.DRILLBIT) .tick(null, tile.getBlockPos(), tile.getBlockState(), tile); diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/NativeLootContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/NativeLootContractTest.java index eba012f..d5c0857 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/NativeLootContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/NativeLootContractTest.java @@ -39,10 +39,10 @@ public class NativeLootContractTest { } } - @Test public void packUsesNative2612DataFormatAndForgeClientMetadata() throws Exception { + @Test public void packUsesNative262DataFormatAndForgeClientMetadata() throws Exception { JsonObject pack = read(ROOT.resolve("pack.mcmeta")).getAsJsonObject("pack"); - assertEquals("[101,1]", pack.getAsJsonArray("min_format").toString()); - assertEquals("[101,1]", pack.getAsJsonArray("max_format").toString()); + assertEquals("[107,1]", pack.getAsJsonArray("min_format").toString()); + assertEquals("[107,1]", pack.getAsJsonArray("max_format").toString()); assertFalse(pack.has("pack_format")); assertFalse(pack.has("supported_formats")); assertFalse(pack.has("forge:server_data_pack_format")); diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/NativePackFormatContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/NativePackFormatContractTest.java index 22974ca..c5bac4f 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/NativePackFormatContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/NativePackFormatContractTest.java @@ -41,13 +41,13 @@ public class NativePackFormatContractTest { assertEquals(server, PackMetadataSection.forPackType(PackType.SERVER_DATA).codec() .parse(JsonOps.INSTANCE, pack).getOrThrow()); var version = SharedConstants.getCurrentVersion(); - assertEquals(PackFormat.of(84, 0), version.packVersion(PackType.CLIENT_RESOURCES)); - assertEquals(PackFormat.of(101, 1), version.packVersion(PackType.SERVER_DATA)); + assertEquals(PackFormat.of(88, 0), version.packVersion(PackType.CLIENT_RESOURCES)); + assertEquals(PackFormat.of(107, 1), version.packVersion(PackType.SERVER_DATA)); assertTrue(client.supportedFormats().isValueInRange(version.packVersion(PackType.CLIENT_RESOURCES))); assertTrue(server.supportedFormats().isValueInRange(version.packVersion(PackType.SERVER_DATA))); assertFalse(client.supportedFormats().isValueInRange(PackFormat.of(83))); assertFalse(server.supportedFormats().isValueInRange(PackFormat.of(102))); - assertFalse(client.supportedFormats().isValueInRange(PackFormat.of(101, 1))); - assertFalse(server.supportedFormats().isValueInRange(PackFormat.of(84, 0))); + assertFalse(client.supportedFormats().isValueInRange(PackFormat.of(107, 1))); + assertFalse(server.supportedFormats().isValueInRange(PackFormat.of(88, 0))); } } diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/NativePackRangeContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/NativePackRangeContractTest.java index a30fff0..f69a69b 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/NativePackRangeContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/NativePackRangeContractTest.java @@ -20,9 +20,9 @@ public class NativePackRangeContractTest { JsonObject pack = side.getAsJsonObject("nativeMetadata"); var range = PackFormat.packCodec(type).codec().parse(JsonOps.INSTANCE, pack).getOrThrow(); assertEquals(type.toString(), type == PackType.CLIENT_RESOURCES, - range.isValueInRange(PackFormat.of(84, 0))); + range.isValueInRange(PackFormat.of(88, 0))); assertEquals(type.toString(), type == PackType.SERVER_DATA, - range.isValueInRange(PackFormat.of(101, 1))); + range.isValueInRange(PackFormat.of(107, 1))); assertFalse(range.isValueInRange(PackFormat.of(83))); assertFalse(range.isValueInRange(PackFormat.of(102))); } @@ -46,11 +46,11 @@ public class NativePackRangeContractTest { } @Test public void dataOnlyRangeDoesNotQualifyClientResources() { - JsonObject dataOnly = JsonParser.parseString("{\"min_format\":[101,1],\"max_format\":[101,1]}") + JsonObject dataOnly = JsonParser.parseString("{\"min_format\":[107,1],\"max_format\":[107,1]}") .getAsJsonObject(); var range = PackFormat.packCodec(PackType.CLIENT_RESOURCES).codec() .parse(JsonOps.INSTANCE, dataOnly).getOrThrow(); - assertFalse(range.isValueInRange(PackFormat.of(84, 0))); - assertTrue(range.isValueInRange(PackFormat.of(101, 1))); + assertFalse(range.isValueInRange(PackFormat.of(88, 0))); + assertTrue(range.isValueInRange(PackFormat.of(107, 1))); } } diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/NativeRequiredDependencyContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/NativeRequiredDependencyContractTest.java index f7968c2..f09aa16 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/NativeRequiredDependencyContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/NativeRequiredDependencyContractTest.java @@ -46,9 +46,9 @@ private static void requireBaseMetals(ModInfo info) { assertTrue("Base Metals is REQUIRED, not an optional installation scope", dependency.isMandatory()); assertEquals(IModInfo.Ordering.AFTER, dependency.getOrdering()); assertEquals(IModInfo.DependencySide.BOTH, dependency.getSide()); - assertEquals("[3.1.2.2601021,4.0.0)", dependency.getVersionRange().toString()); - assertTrue(dependency.getVersionRange().containsVersion(new DefaultArtifactVersion("3.1.2.2601021"))); - assertFalse(dependency.getVersionRange().containsVersion(new DefaultArtifactVersion("3.1.1.2601021"))); + assertEquals("[3.1.2.2602001,4.0.0)", dependency.getVersionRange().toString()); + assertTrue(dependency.getVersionRange().containsVersion(new DefaultArtifactVersion("3.1.2.2602001"))); + assertFalse(dependency.getVersionRange().containsVersion(new DefaultArtifactVersion("3.1.1.2602001"))); assertFalse(dependency.getVersionRange().containsVersion(new DefaultArtifactVersion("4.0.0"))); } @@ -83,11 +83,11 @@ private static ModInfo parseJar(Path jar) { private static String fixture(String dependency) { return """ modLoader="javafml" - loaderVersion="[64,65)" + loaderVersion="[65,66)" license="GPL-3.0-only" [[mods]] modId="basesteam" - version="2.2.17.2601021" + version="2.2.18.2602001" displayName="baseSteam" """ + dependency; } @@ -97,7 +97,7 @@ private static String dependency(boolean required) { [[dependencies.basesteam]] modId="basemetals" mandatory=%s - versionRange="[3.1.2.2601021,4.0.0)" + versionRange="[3.1.2.2602001,4.0.0)" ordering="AFTER" side="BOTH" """.formatted(required); diff --git a/src/test/java/zone/moddev/mc/basesteam/resources/RecipeUnlockContractTest.java b/src/test/java/zone/moddev/mc/basesteam/resources/RecipeUnlockContractTest.java index 7781808..cf1465d 100644 --- a/src/test/java/zone/moddev/mc/basesteam/resources/RecipeUnlockContractTest.java +++ b/src/test/java/zone/moddev/mc/basesteam/resources/RecipeUnlockContractTest.java @@ -19,7 +19,7 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.world.item.Items; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/zone/moddev/mc/basesteam/testing/NativePackResourceProof.java b/src/test/java/zone/moddev/mc/basesteam/testing/NativePackResourceProof.java index ac3d450..24d3a89 100644 --- a/src/test/java/zone/moddev/mc/basesteam/testing/NativePackResourceProof.java +++ b/src/test/java/zone/moddev/mc/basesteam/testing/NativePackResourceProof.java @@ -210,7 +210,7 @@ public static void requireCleanJvmEnvironment() { } private static void installResourceFixture(ModFile mod) throws ReflectiveOperationException { - // Isolated reader fixture, not a dependency/startup test. Forge 64 removed ModList.of. + // Isolated reader fixture, not a dependency/startup test. Forge 65 removed ModList.of. Class state = Class.forName("net.minecraftforge.fml.loading.ModSorter$State"); var constructor = state.getDeclaredConstructor(List.class, List.class); constructor.setAccessible(true); @@ -223,7 +223,7 @@ private static void installResourceFixture(ModFile mod) throws ReflectiveOperati ModList.init(); if (ModList.getModFiles().size() != 1 || ModList.getModFiles().getFirst() != mod.getModFileInfo() || !net.minecraftforge.fml.loading.LoadingModList.getErrors().isEmpty()) { - throw new AssertionError("The native Forge 64 resource fixture changed"); + throw new AssertionError("The native Forge 65 resource fixture changed"); } } } diff --git a/tools/run-packaged-server-smoke.ps1 b/tools/run-packaged-server-smoke.ps1 index 127a37d..b8232d1 100644 --- a/tools/run-packaged-server-smoke.ps1 +++ b/tools/run-packaged-server-smoke.ps1 @@ -23,9 +23,9 @@ if ($WithoutBaseMetals) { $project = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot '..')).Path $forge = (Resolve-Path -LiteralPath $ForgeInstall).Path $pins = Get-Content -Raw -LiteralPath (Join-Path $project 'gradle.properties') | ConvertFrom-StringData -if ($pins.minecraft_version -ne '26.1.2' -or $pins.forge_version -ne '64.1.5' -or +if ($pins.minecraft_version -ne '26.2' -or $pins.forge_version -ne '65.1.0' -or $pins.poweradvantage_source_ref -cnotmatch '^[0-9a-f]{40}$') { - throw 'An exact Forge 64.1.5 candidate and committed Power source pin are required.' + throw 'An exact Forge 65.1.0 candidate and committed Power source pin are required.' } $java = (Resolve-Path -LiteralPath $JavaExe).Path $javaVersion = (& $java -version 2>&1 | Out-String).Trim() @@ -44,10 +44,10 @@ if (!$PowerJar) { $PowerJar = Join-Path $project "../../PowerAdvantage/build/libs/basePower-$($pins.poweradvantage_version).jar" } if (!$BaseMetalsJar) { - $BaseMetalsJar = Join-Path $project "../../../../BaseMetals/BaseMetals 2612/BaseMetals/build/libs/BaseMetals-$($pins.basemetals_version).jar" + $BaseMetalsJar = Join-Path $project "../../../../BaseMetals/BaseMetals 262/BaseMetals/build/libs/BaseMetals-$($pins.basemetals_version).jar" } if (!$OreSpawnJar) { - $OreSpawnJar = Join-Path $project "../../../../MinecraftMineralogy/OS2612/OreSpawn/build/libs/OreSpawn-$($pins.orespawn_version).jar" + $OreSpawnJar = Join-Path $project "../../../../MinecraftMineralogy/OS262/OreSpawn/build/libs/OreSpawn-$($pins.orespawn_version).jar" } $mods = [ordered]@{ $steamName = @{ Path = (Join-Path $project "build/libs/$steamName"); Sha256 = $steamSha } @@ -65,7 +65,7 @@ $forgeJars = [ordered]@{ } foreach ($file in $forgeJars.Keys) { if ($forgeJars[$file] -cnotmatch '^[A-F0-9]{64}$') { - throw "Supply the coordinated Forge 64.1.5 runtime hash in gradle.properties: $file" + throw "Supply the coordinated Forge 65.1.0 runtime hash in gradle.properties: $file" } if ((Get-FileHash -LiteralPath (Join-Path $forge $file)).Hash -cne $forgeJars[$file]) { throw "Installed Forge runtime hash mismatch: $file" diff --git a/tools/verify-eclipse-ecj.ps1 b/tools/verify-eclipse-ecj.ps1 index 35ce578..df58ec2 100644 --- a/tools/verify-eclipse-ecj.ps1 +++ b/tools/verify-eclipse-ecj.ps1 @@ -2,7 +2,8 @@ param( [Parameter(Mandatory)][ValidatePattern('^[a-zA-Z0-9_-]+$')][string]$RunId, [string]$JavaExe = "$env:USERPROFILE/.jdks/jdk-25.0.3+9/bin/java.exe", - [string]$CompilerJar = "$env:USERPROFILE/.p2/pool/plugins/org.eclipse.jdt.core.compiler.batch_3.46.0.v20260528-0407.jar" + [string]$CompilerJar = "$env:USERPROFILE/.p2/pool/plugins/org.eclipse.jdt.core.compiler.batch_3.46.0.v20260528-0407.jar", + [string]$BootstrapJar = '../../PowerAdvantage/build/unit-bootstrap/forge-native-unit-bootstrap.jar' ) $ErrorActionPreference = 'Stop' @@ -87,7 +88,7 @@ try { $receipt.scopes[$scope].exitCode = $LASTEXITCODE if ($LASTEXITCODE -ne 0) { throw "ECJ $scope failed; see $run/$scope.log" } } - $bootstrap = ProjectPath '../../PowerAdvantage/build/unit-bootstrap/forge-native-unit-bootstrap.jar' + $bootstrap = ProjectPath $BootstrapJar if ((Get-FileHash -LiteralPath $bootstrap -Algorithm SHA256).Hash -cne $pins.poweradvantage_test_bootstrap_sha256) { throw 'Pinned native unit bootstrap changed' } diff --git a/tools/verify-native-port.js b/tools/verify-native-port.js index 1ec04ef..bb1b510 100644 --- a/tools/verify-native-port.js +++ b/tools/verify-native-port.js @@ -25,7 +25,7 @@ for (const name of files(resources).filter(name => /\.(json|mcmeta)$/.test(name) json.set(name, JSON.parse(text)); } assert.deepEqual(json.get(`${resources}/pack.mcmeta`).pack, { - min_format: [101, 1], max_format: [101, 1], description: 'baseSteam' + min_format: [107, 1], max_format: [107, 1], description: 'baseSteam' }); const metadata = read(`${resources}/META-INF/mods.toml`); assert.match(metadata, /^showAsResourcePack=false$/m); @@ -113,7 +113,7 @@ for (const id of [...pickaxe.values.map(value => value.split(':')[1]), for (const name of source) { assert(!/ResourceLocation|net\.minecraftforge\.eventbus\.api\.(?:IEventBus|SubscribeEvent)/.test(read(name)), name); } -console.log(`BASESTEAM_NATIVE2612_SOURCE_PASS json=${json.size} java=${source.length} factories=${ids.length} harvest=${pickaxe.values.length} testMethods=${testCount}`); +console.log(`BASESTEAM_NATIVE262_SOURCE_PASS json=${json.size} java=${source.length} factories=${ids.length} harvest=${pickaxe.values.length} testMethods=${testCount}`); console.log('Source checks only. Compilation, executed tests, packaged runtime and manual acceptance are separate.'); require('./verify-enchantment-data'); require('./verify-villager-trades'); diff --git a/tools/verify-villager-trades.js b/tools/verify-villager-trades.js index 57ea3cf..ff8725a 100644 --- a/tools/verify-villager-trades.js +++ b/tools/verify-villager-trades.js @@ -61,5 +61,5 @@ for (const mutate of controls) { mutate(data); assert.throws(() => validate(data.trades, data.tags), assert.AssertionError); } -console.log(`BASESTEAM_NATIVE2612_TRADE_DATA_PASS definitions=5 placements=10 negativeControls=${controls.length}`); +console.log(`BASESTEAM_NATIVE262_TRADE_DATA_PASS definitions=5 placements=10 negativeControls=${controls.length}`); console.log('Exact data contract only; native codec and generated-offer runtime checks remain separate.'); From de4dcf6ed84461843a241bbaf93cf03e43e83eb2 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 12 Nov 2026 17:51:15 +0000 Subject: [PATCH 2/3] Record the 26.2 combined checks and remaining root gate --- CHANGELOG.txt | 4 +++- README.md | 18 +++++++++++++---- docs/PORT262-STATUS.md | 45 ++++++++++++++++++++++++++++++++---------- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a74a0a2..563df5e 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -2,7 +2,9 @@ baseSteam 2.2.18.2602001 - local candidate - Target Minecraft 26.2 and Forge 65 with Java 25. - Keep the shared Base Metals migration hook and existing machine, item and saved-data identities. -- Retain exact dependency, native pack, artifact and classpath guards while the new candidate is qualified. +- Retain exact dependency, native pack, artifact and classpath guards. +- Pass the combined profile03 machine, migration, actor/order, client and two-world endurance checks, including independent 66-checkpoint replay. +- Prepare for manual testing once the final root cold-cache gate is confirmed; manual acceptance and publication remain pending. baseSteam 2.2.17.2601021 (Minecraft 26.1.2 / Forge) diff --git a/README.md b/README.md index c87e32a..b92e89a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # baseSteam -**Minecraft 26.2 Forge, version 2.2.18.2602001. Local build candidate.** +**Minecraft 26.2 Forge, version 2.2.18.2602001. Combined checks passed; final root build pending.** baseSteam continues DrCyano's Steam Advantage and uses basePower's shared API, machines and creative tab. Existing `basesteam` registry and saved-data @@ -46,9 +46,19 @@ node tools/verify-native-port.js node tools/generate-recipe-unlocks.js --check ``` -See [26.2 port status](docs/PORT262-STATUS.md). The accepted 26.1.2 family -qualification remains historical proof of those original bytes, not this port. -There is no 26.2 manual acceptance, hosted qualification or publication yet. +## Qualification + +Combined profile03 passed the machine, migration, actor/dimension, actual +transformer-order and real-client checks, plus two 30-minute worlds, restart +and independent 66-checkpoint replay. See [26.2 port status](docs/PORT262-STATUS.md) +for the counts and exact inputs. The [family qualification record](../../PowerAdvantage/docs/26.2/QUALIFICATION.md) +is being finalized in the sibling Power checkout. + +Ready for manual testing once the final root cold-cache gate is confirmed. +Overall sign-off and user manual acceptance are not claimed here. Base Metals +and OreSpawn are unpublished local 26.2 inputs; these changes remain local, +with no 26.2 push or publication. The accepted 26.1.2 records remain historical +proof of their original bytes, not qualification of this port. ## Old Worlds diff --git a/docs/PORT262-STATUS.md b/docs/PORT262-STATUS.md index bbb07d8..d4d2490 100644 --- a/docs/PORT262-STATUS.md +++ b/docs/PORT262-STATUS.md @@ -1,11 +1,15 @@ -# Minecraft 26.2 local build candidate +# Minecraft 26.2 combined checks passed Version 2.2.18.2602001 targets Forge65.1.0, MCP20260616.103818, Java25 and -native pack formats107.1/88.0. This candidate is local-only. Child build gates -do not establish combined-family runtime qualification or manual acceptance. +native pack formats107.1/88.0. This candidate is local-only. The combined +checks below passed; the final root cold-cache gate is still pending. +Ready for manual testing once that gate is confirmed. Overall sign-off, +manual acceptance and publication are not claimed. ## Exact inputs +- Steam player/development SHA-256: + EDD10D6ED4A623F6EAA364D21480FDA3B777FB15C2195D437882DB09C0F415AB. - Power source f84b2362449e39eff5e76696dd64ce4cb144da4f; player/development 7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1. - Base Metals source 523335a59ecff399e40a7c66eb121a3aabdc45ba; player/development @@ -24,19 +28,40 @@ do not establish combined-family runtime qualification or manual acceptance. compilation and Eclipse production-classpath isolation. - Fresh ECJ main/test/GameTest compilation and the same complete unit inventory, including strict inventory-rejection controls. +- Committed-source offline and fresh unseeded-cache builds with paths containing + spaces reproduce all three release archives. Both regenerated Forge SDK jars + also match. No rebuild was needed for the later docs-only ancestry merges. - All 24 recipe-unlock checks. Static source audits remain separate from runtime proof. - Native screen lookup uses Minecraft.gui.screen(); existing needle delegation and no-immediate-GPU contracts remain asserted. - Failed setup, compiler and test attempts are preserved separately. The provisional old-Power/public-OreSpawn runs are not relabelled as this candidate. -## Remaining qualification +## Passed combined checks -Independent archive reproductions and fresh-cache/offline gates remain pending. -Packaged combined-family gameplay, machine/migration/actor/dimension/order, -retained-generation and GPU/client campaigns are parent-owned and are not -claimed here. Manual acceptance is also pending. Historical 26.1.2 evidence -remains bound to its original source, profile and artifact bytes. +These results use frozen profile03, SHA-256 +A98D4F9B54A0AE47392D9A3CF81335F5E228F718C7D322DF9838A94AD27D9736, +and basePower's combined-family rig: + +- All eight machine campaigns, including moving, partial and bridge networks. +- All eight machine migration routes and the additional 26.1.2 route. +- Oil, resource and all three retained-generation routes. +- Nine actor/dimension routes. Six dimension routes retain raw wolf differences + backed by independent native controls; no other semantic difference is waived. +- Both actual transformer orders for machines and actors, with the instrumented + sidecars kept separate from ordinary production qualification. All 39 owned + game JVMs closed; 117 strict closed logs were audited. +- Real client07: 39 GUIs, 351 text checks, 26 tank gauges and 1,247 frames. +- Two genuine worlds ran for 1,800 seconds each, passed restart and passed + independent 66-checkpoint replay. The family verification root's + `endurance-independent-replay-03.json` records `PASS`. + +The [family qualification record](../../../PowerAdvantage/docs/26.2/QUALIFICATION.md) +is being finalized. Its remaining root cold-cache gate must be confirmed before +manual testing. Hydroturbine orientation/spin geometry in a fresh client world +remains an explicit manual gap. Historical records and failed receipts remain +unchanged and bound to their original inputs. Hosted CI still requires merged, public dependency inputs; local candidate -pins do not waive that gate. No 26.2 push, tag, publisher dispatch or upload. +pins do not waive that gate. Base Metals and OreSpawn 26.2 remain unpublished +local inputs. No 26.2 push, tag, publisher dispatch or upload. From 6d05f094468fccce16515b05097083cde14dedd2 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Thu, 12 Nov 2026 23:59:56 +0000 Subject: [PATCH 3/3] Pin the public Forge 26.2 dependency releases --- README.md | 34 +++++++++++++++++++--------------- gradle.properties | 12 ++++++------ 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a835121..9d2fbe1 100644 --- a/README.md +++ b/README.md @@ -18,20 +18,24 @@ checksum-pinned Gradle **9.6.1** wrapper. Native pack formats are data ## Build -The coordinated local dependency versions are basePower **2.4.17.2602001** +The coordinated published dependency versions are basePower **2.4.17.2602001** and Base Metals **3.1.2.2602001**. The Base Metals hook source is `523335a59ecff399e40a7c66eb121a3aabdc45ba`, player SHA-256 `15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1`. Base Metals is REQUIRED on both client and server, not an optional integration. -The approved local Power262 handoff is source -`f84b2362449e39eff5e76696dd64ce4cb144da4f`, player SHA-256 +The released Power262 source is +`98863570ae84c5658a6b8ec2f8878e1f10009192`, player SHA-256 `7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1`. +Its public CurseForge file is [9583433](https://www.curseforge.com/minecraft/mc-mods/basepower/files/9583433); +Base Metals is [9583122](https://www.curseforge.com/minecraft/mc-mods/base-metals/files/9583122). -OreSpawn **4.1.1.2602001** is the approved local retained-settings repair, -source `dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c`, SHA-256 +OreSpawn **4.1.1.2602001** is the published retained-settings repair, +qualified source `dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c`, SHA-256 `BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F`. -It is not published; the public file-ID pin is deliberately empty. The older -4.1.0 public download is not substituted for these bytes. +Its public CurseForge file is [9582731](https://www.curseforge.com/minecraft/mc-mods/orespawn/files/9582731). +The qualified Base Metals and OreSpawn source pins are ancestors of their +released `master-26.2` merges. Their public CurseForge, Maven and GitHub +downloads have been verified against these exact hashes. The Mavenizer fixture and its source-rule, patch, licence and provenance files are checksum-sealed from the existing OS262 checkout. The established @@ -56,14 +60,14 @@ node tools/generate-recipe-unlocks.js --check Combined profile03 passed the machine, migration, actor/dimension, actual transformer-order and real-client checks, plus two 30-minute worlds, restart and independent 66-checkpoint replay. See [26.2 port status](docs/PORT262-STATUS.md) -for the counts and exact inputs. The [family qualification record](../../PowerAdvantage/docs/26.2/QUALIFICATION.md) -is being finalized in the sibling Power checkout. - -Ready for manual testing once the final root cold-cache gate is confirmed. -Overall sign-off and user manual acceptance are not claimed here. Base Metals -and OreSpawn are unpublished local 26.2 inputs; these changes remain local, -with no 26.2 push or publication. The accepted 26.1.2 records remain historical -proof of their original bytes, not qualification of this port. +for the counts and exact inputs. The [family qualification record](https://github.com/MinecraftModDevelopmentMods/basePower/blob/master-26.2/docs/26.2/QUALIFICATION.md) +keeps the completed checks and their scope limits together. + +The final root build and cold-cache checks passed, and manual testing was +accepted on 12 November 2026. Publication follows the dependency order: +OreSpawn and Base Metals, then basePower, then this expansion. The accepted +26.1.2 records remain historical proof of their original bytes, not a +substitute for the 26.2 results. ## Old Worlds diff --git a/gradle.properties b/gradle.properties index bb91af3..799cca3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -43,9 +43,9 @@ cf_versions=26.2 poweradvantage_version=2.4.17.2602001 poweradvantage_source_repository=MinecraftModDevelopmentMods/basePower -# Owner-approved local Power262 compile/test handoff; not a public release. -poweradvantage_source_ref=f84b2362449e39eff5e76696dd64ce4cb144da4f -poweradvantage_public_file_id= +# Exact merged source and public player/compile artifact. +poweradvantage_source_ref=98863570ae84c5658a6b8ec2f8878e1f10009192 +poweradvantage_public_file_id=9583433 poweradvantage_deobf_sha256=7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1 poweradvantage_player_sha256=7E456DE1A45140E86415A701D186FEDE08C4AB63D53C6B7848935DB70CBC68B1 poweradvantage_test_bootstrap_sha256=088FC137BEBB9B2E75C596DE868499E6099CF228BECFCF07EAE36791245FD1B6 @@ -55,13 +55,13 @@ poweradvantage_test_loader_source_sha256=455CA9403D9CBEA72E7D055966D6CDC822E6344 basemetals_version=3.1.2.2602001 basemetals_source_commit=523335a59ecff399e40a7c66eb121a3aabdc45ba -basemetals_public_file_id= +basemetals_public_file_id=9583122 basemetals_deobf_sha256=15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1 basemetals_player_sha256=15CBD0C8DD95BBA846969929B8767887BA4B8152DFB10C9C58FB314AD39FB9E1 orespawn_version=4.1.1.2602001 orespawn_source_commit=dcaaa933299dd8b1ebc73e31c9e5acd36dd7957c -# Approved LOCAL source candidate; not CurseForge file 9332183. -orespawn_public_file_id= +# Public retained-settings repair; qualified source pin is a release ancestor. +orespawn_public_file_id=9582731 orespawn_deobf_sha256=BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F orespawn_player_sha256=BC0658DF2E149CC23E65E5771F3FF62E2BB13FFDA4E316AB632EB92EF7FA5A1F