feat(ibmi-analyst): bake Ghidra, PowerAS, and the recovery toolkit #363
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/ibmi-analyst"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Add
images/ibmi-analyst(VERSION 1): Ghidra 11.1.2 with the PowerAS processor extension and the pinnedsean/rpg-demorecovery toolkit on the digest-pinned AlmaLinux 10 base. It is the fleet's only Java and Python carve-out; every gate in the Dockerfile is bash and jq.Contents (all fetched at image build time)
recovery/ghidra/tools.json: byte count422385730and sha256219ec130…checked before unzip. macOS and Windows native directories removed;linux_x86_64kept. The release zip has nolinux_arm_64natives (the second Build proved it), so the build stage compiles them withsupport/buildNativesand Gradle 8.14.3 (bd711022…, the -bin checksum from gradle.org/release-checksums; Ghidra 11.1.2's native build uses the legacy Gradle software model that Gradle 9 does not carry): decompiler, sleigh, lzfse, and both GNU demanglers land in<module>/os/linux_arm_64/, and only thebuild/and.gradle/directories the native build created are removed. Every binary is asserted.0eca5b101115a16de8594e1c90f78ce001e716c0, built with Gradle 9.5.1 (bafc141b…, the -bin checksum from gradle.org/release-checksums, 2026-09-14) in a--platform=$BUILDPLATFORMstage with--offline; the extension zip is unzipped intoGhidra/Extensions/PowerASandppc_64_as_be.slaspecis compiled once by this Ghidra. Gradle does not reach the runtime.sean/rpg-demoatcd07b7fe67438c9c3e58348e6586b5e937cadefa:recovery/*.py,recovery/*.json(the modules readapplication_contract.jsonandinitial_stage.jsonnext to themselves),recovery/TOOL.md, andrecovery/ghidra/(three exporters,tools.json,README.md). No fixtures, evidence, tests, harness, examples, or reference.zelnetv0.10.17 viaCOPY --from=registry.sean.farm/build/ibmi-builder:v23@sha256:e22d9909…(the manifest-list digest, amd64 and arm64).java-21-openjdk-headlessplusjava-21-openjdk-devel:support/analyzeHeadlesslaunches with thejdkjava type and Ghidra compiles.javascripts at run time, so a JRE is not sufficient. OpenJDK 21, not 17: AlmaLinux 10 AppStream shipsjava-21-openjdkandjava-25-openjdkonly; there is nojava-17-openjdkin EL10 (the first Build failed on it). Ghidra 11.1.2 declaresapplication.java.min=17with no maximum, Gradle 9.5.1 runs on 21, and the PowerAS build targetssourceCompatibility17. The rpg-demotools.jsonrecords Java 17.0.19 from the macOS validation; the image gates prove the toolchain on 21.Build-time gates
java -versionandjavac -versionreport 21;jdk.compileris present.tools.jsonpins (Ghidra URL, sha256, bytes; PowerAS repository and commit; Gradle 9.5.1; processor) agree with the Dockerfile pins.ibmi_recover.py --helpexits 0;verify /nonexistentexits 2 with the toolkit's message.lock-toolsruns offline and writes/opt/ibmi-analyst/tool-lock.json; jq asserts Ghidra 11.1.2, Java 21,Ghidra/Extensions/PowerAS/data/languages/ppc_64_as_be.sla, andbin/javac.recovery/ghidra/README.md: eight bytes3860002a4e800020, exact markerPOWERAS_PROCESSOR_SMOKE_PASSED, noSCRIPT ERROR, andghidra_result.pyaccepts the log.recovery/evidence/deterministic-tool-20260910throughVerifyPowerAS,ExportRecovery, andExportInterpretation(this starts the native decompiler), thenibmi_recover.py ghidraandverify. The exported listing must be byte-identical to the evidence listing (761bd089…)./opt/ghidraorJAVA_HOMEat run time.recover-objecton a non-save-file fails closed with exit 2 andstatus: failed.Notes
conf/,lib/security/, andlib/tzdb.datoutside its tree. The toolkit'stool_lock()refuses links that leave the tree, so the build replaces every link under the JDK with a copy of its target and asserts none remain.scripts/check-pipelines-ci-no-tla.shis scoped toimages/pipelines-ci/Dockerfileonly, so no exemption is needed.scripts/lint-no-runtime-fetch.shinspectsFROMlines only; it accepts the digest-pinnedCOPY --from=<image>.dnf update, per the beam-runtime precedent: the pinned base digest is the contract. Bothdnf installsteps pass--setopt=install_weak_deps=False:java-21-openjdk-develrequires the fulljava-21-openjdk, whose weak dependencies are a desktop stack (pipewire, xdg-desktop-portal, polkit, systemd-udev, fonts); the runtime asserts pipewire and xdg-desktop-portal are absent.https://claude.ai/code/session_01HPdKaFBKQVs8hzfgXMrnwV
b857f4146cc9d37581b6