horizon-data.bin (#4267's name) holds the prepared folder's data/ and
assets/ files (sounds aside) in one file, read through one open handle with
positional reads: no file opened per recipe, tag or table, which costs a
Defender scan each on Windows (#1961) and a seek on a hard disk.
- horizon-core::prepared_files: the format, its writer (temporary file
renamed into place) and reader. A file is used only for the root it was
written for (its canonical path) and the preparation it was written from
(its copy of horizon-resources.json), and never through a link; anything
else, a damaged file or HORIZON_NO_DATA_FILE, reads the folders.
- The game writes it for the vanilla root on an idle thread once the start
is done, when there is none it can use: this start read the files already.
- json_folder (the recipes, the loot tables, predicates and modifiers) reads
from it first. Other folders move to it in the next PRs.
- The resource pack and content mod mirrors don't link it, and
check_public_tree rejects the name.
Part of #1961.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Three things kept tools/lan_e2e.py (and agent_control_e2e.py) from running
on Windows:
- The prepared resources were linked into the scratch home with os.symlink,
which needs Developer Mode or an administrator (WinError 1314). The new
lab.link_dir falls back to a directory junction there, which needs
neither; shutil.rmtree removes a junction without touching its target.
- agent_control_e2e.game_env ran `vscreen up`, which doesn't exist on
Windows. Windows has no virtual screen, so it takes plain lab.game_env,
as macOS does.
- `horizon-ctl launch` never returned when its output was captured:
Windows hands a child every inheritable handle of its parent, so the game
kept the caller's stdout pipe open until it quit. horizon-ctl now clears
the inherit flag on its own standard handles before it starts the game
(horizon_threads::keep_stdio_from_children). Linux and macOS are
unchanged.
Fixes#5274
Co-Authored-By: Claude Opus 5.5 <[email protected]>
verify ran the public-tree check, the Python tests, clippy and the Rust tests one
after another (~8 min). They now run as the python, clippy and tests jobs at once,
and verify gathers them (always(), failing unless all three passed), so the
required check keeps its name.
A pull request's public-tree check reads only its own commits
(check_public_tree.py --range base..head) instead of every ref's whole history;
main's pushes still run --history.
Closes#4978
Co-Authored-By: Claude Opus 5.5 <[email protected]>
lab.prepare imported every client library in the version JSON, ignoring
its OS rules, so a Linux install failed on the macOS-only
java-objc-bridge the official launcher never downloads there. The rule
evaluation moves from runtime.py into lab.py and one selector,
client_library_artifacts, now serves preparation, the runtime and the
model baking harness: OS rules as the launcher applies them, and the
natives for this architecture (classifier suffixes, plain natives being
the x64 build only when an ARM variant is listed). Required libraries
are still checksummed and a missing one still errors.
Mojang republished 26.3.json twice (702fe591, then 11f1aefe, the current
one) with only assetIndex changed: non-English translations, same jars
and libraries. The lock pins the current file and accepts both earlier
ones; preparation takes the launcher's copy so it matches the asset
index installed with it, and an unknown republish errors clearly.
Fixes#41
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Horizon no longer fetches anything of Minecraft from Mojang's servers. The
client jar, version JSON, libraries and assets come from the user's official
launcher install, and the server jar is one they downloaded themselves
(--server-jar or HORIZON_SERVER_JAR). Every file is checked against checksums
pinned in research-lock.json, and the prepared .local/ layout is byte-identical
to the old downloads, so the harnesses and the native client are unchanged.
CI keeps the offline checks on GitHub's runners; the vanilla comparisons and
the mod build need the game, so they move to a manual job on a self-hosted
runner that holds the maintainer's own copy.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Add version-bound core, world data, geometry, generation and feature implementations with native client/server comparison tools and scoped evidence reports. Apply Horizon project branding.
Workspace tests, Clippy and 147 Python tests passed. Full 51-family survival and expanded provider comparisons are still running; complete gameplay parity and a playable Rust client remain unfinished. Private game artifacts and the isolated simple-block placement work are excluded.