How Horizon checks itself against vanilla Minecraft

A differential harness feeds the same inputs to Horizon and vanilla 26.3 and compares outputs. What the harnesses cover, how they run, what they cannot prove.

By: MC Horizon editors · Published · Updated

Horizon checks itself against vanilla with differential harnesses: automated tests that feed exactly the same inputs to Horizon and to the real Minecraft: Java Edition 26.3 (client and server), then compare the outputs. If world generation, a command, a menu click or a lighting update comes out differently, the harness fails. The project’s repository described 281 of them when it started; the docs counted 326 on 25 October 2026. They are the reason Horizon can claim “same inputs, identical outputs” for the parts they cover, and only for those.

The idea in one paragraph

Testing a rewrite is hard because “correct” is defined by another program. You can’t write down every rule of Minecraft by hand. So instead of asserting what the answer should be, a differential test asks the original. Pick an input (a seed and a chunk position, a click sequence in a crafting table, a command string), run it through vanilla, run it through Horizon, and diff the results. The project’s Hub describes it as a Java oracle and a Rust probe on the same inputs.

Same inputVanilla 26.3HorizonComparePassFail seed, clicks, commandJava oracleRust probefix, run again
A differential harness doesn't need to know the right answer in advance. Vanilla provides it.

What the harnesses covered at the start

The playhorizon.dev home page publishes the project’s first audit of each subsystem, dated 13 October 2026, with what its harnesses compared. Some of the numbers give a feel for the scale:

Subsystem What was compared with vanilla
World generation 2,352 whole chunks over 225 structure sites, in all three dimensions
Assets Item models over 196,290 item stacks
Section meshing 112 scenes and over a million quads
Chunk storage Paletted containers over 266 scenarios
Commands 758 commands over 39,685 parsed inputs; scoreboards and teams over 81,000 operations
Entities Natural spawning in 15,500 cases; finalizeSpawn in 24,000; 92 mob AI scenarios
Inventory Menu clicks over 8,000 click sequences; recipe book placement in 6,000 cases
Networking LAN discovery over 462 cases; a client built from vanilla’s packet code joins Horizon’s server
Blocks Dispensers in 6,000 cases, crafters in 4,000 crafts, 435 sculk scenarios

Each subsystem was scored on a scale from 0 (absent) through 0.25 (started), 0.5 (playable, major features missing) and 0.75 (mostly complete) to 1 (its harnesses cover it and pass). All fourteen were listed as having passed their harnesses. The page adds the important caveat itself: “It is not a parity claim.” Parity work on 26.3 continues, redstone first.

How they run day to day

Harnesses are part of the gate every change goes through. The project’s “How Horizon is built” page describes two checks, and the Hub adds a third tool:

  • verify runs on GitHub’s machines for every pull request: formatting, lints with warnings as errors, unit tests, and a check that no Minecraft files are committed.
  • parity runs the harnesses a change can affect, on a machine that holds a copy of Minecraft. For a pull request from a fork, it runs once a maintainer has read the change.
  • A port ledger gives every method of the 26.3 game a verdict and links the harnesses that cover it, so gaps are visible as lists rather than hunches.

Other docs lean on the same idea. Horizon’s table of what resource packs can change cites a harness as proof for most rows, for example test_resource_pack_parity or test_sound_event_parity. The server docs mention a harness that checks players crossing dimensions against vanilla with two players. That’s the culture: a claim should name the test that backs it.

Why not just copy vanilla’s code?

Because Horizon can’t contain any. It ships no Minecraft code, assets or data, and since 24 October 2026 its rules say code may only be written from Minecraft 26.3 itself and public documentation, never from another mod, loader or renderer. Vanilla is used as the specification to match, not as source to paste. Harnesses are what make that workable: they check that independently written Rust behaves like the original.

What harnesses can’t do

  • They only cover what they compare. A feature nobody wrote a harness for can still differ.
  • They can’t judge feel. Frame pacing, input latency or how a menu feels aren’t diffable outputs; those are measured with benchmarks instead (see Rust vs Java).
  • Passing isn’t proof. The docs repeat this in several places, and players keep finding differences.

That’s where you come in. The troubleshooting docs call “vanilla does X and Horizon does Y” the best bug report there is, and a good report often turns into the next harness. How to collect logs and file one is in Horizon launch errors.

Why it matters to players

Harnesses are why your old worlds open, why seeds generate the same terrain, and why a vanilla client can join a Horizon server. They’re also why “Horizon” can call itself a rewrite rather than a lookalike. For the broader picture, read what Horizon is or the project timeline in Horizon’s history so far. Resource pack support, with the harness behind each row, is summarized in resource packs in Horizon.

Sources

FAQ

Does passing the harnesses mean Horizon is identical to vanilla?

No. The project says so directly: passing them is not proof that nothing else differs, and players still find differences. A harness only covers what it compares.

Where do the harnesses get vanilla's answers?

From the real Minecraft 26.3 client and server, run on a machine that holds a copy of the game. No Minecraft files are committed to the public repository; a check on every pull request keeps them out.

How can I help with parity?

Report differences. The troubleshooting docs call 'vanilla does X and Horizon does Y' the best bug report there is.

Comments

Comments load when you scroll down to them.