BLOG · 2026-06-20 10:56

SlimeJava & SlimePython update — version-scoped certificate, deterministic dynamic lift

The gist: SlimeJava makes its "behavior-invariance certificate" JDK-version-aware. SlimePython deterministically lifts dynamic syntax too.

We've advanced the modern-language side of the SlimeNENC family — SlimeJava and SlimePython. Both keep the same design ("don't understand meaning; project structure into Rust") while making bit-exactness (1-bit-identical output for the same input) even more honest.

SlimeJava — the certificate now knows the JDK version

When you claim byte-identical output, there's an easily overlooked trap: exception message text varies by JDK version. An array out-of-bounds is 9 (just the index) on JDK 8, but Index 9 out of bounds for length 3 on JDK 11+. Helpful NullPointerException messages arrived in JDK 14/15, and StringIndexOutOfBounds changed again in JDK 21.

Hard-coding "JDK 21 wording" means the bytes diverge the moment you run on JDK 8. SlimeJava now reproduces each wording per JDK version and stamps the target JDK major (8 / 17 / 21) into the certificate. On real OpenJDK 8 / 17 / 21, byte-identical output matching each JDK's wording is confirmed.

"byte-diff 0" is no longer an unconditional claim — it's an honest, version-scoped guarantee.

SlimePython — lift dynamic syntax, never silently translate

Python's dynamism (getattr, attribute hooks, function replacement) drifts if translated naively to Rust. SlimePython conditionally static-lifts only the dynamic patterns that can be made bit-exact, and explicitly rejects the rest rather than translating them silently.

Extended this round:

  • Attribute dispatch — finite-enumerable getattr (== chains / in (...) tuples), incl. self- and __init__-dependent returns, lifted as per-key methods
  • Function replacement — rebinding functions that take arguments; blessed patches swapping time / random / uuid for deterministic versions
  • Soundness — type conflicts that can't fit one Rust type (e.g. int and str mixed across call sites) are statically detected and rejected; wrappers that observe the (non-deterministic) original are rejected too

Everything is verified with a three-way SHA-256 match: Python = native Rust = WASI Rust.

Why "rejecting" is a feature

If you chase bit-exactness seriously, "honestly not translating what you can't" becomes the quality itself. Instead of emitting code that's "probably close," we make explicit the range we can prove 1-bit-identical, and surface the rest as a boundary. It's the SlimeNENC family's shared stance: make the desk honest.

For detailed verification data, see the product pages (SlimeJava / SlimePython) and the resource / PoC deep-dive.

Posted: 2026-06-20 10:56

← Back to blog