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.
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:
verifyruns 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.parityruns 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.