Commit Graph

620 Commits

Author SHA1 Message Date
Ludovic Marie 9e50fd8df2 Merge pull request #1028 from ludovic111/fix/carry-enter-block-advancements
🤖 Agent: merged after verify and CI parity passed (modpacks-11).
2026-10-19 17:23:05 +02:00
Ludovic Marie 8b53bd8a47 Merge pull request #1022 from ludovic111/fix/carry-rs-structure-void
🤖 Agent: merged after verify and CI parity passed (modpacks-11).
2026-10-19 17:23:00 +02:00
Ludovic Marie f441acf2f8 Merge pull request #1019 from ludovic111/fix/carry-untyped-loot-numbers
🤖 Agent: merged after verify and CI parity passed (modpacks-11).
2026-10-19 17:22:55 +02:00
Ludovic Marie 2ff8f5277d Merge pull request #1012 from ludovic111/feat/release-channels
🤖 Agent: merged after verify passed, security-1's dry runs on the branch, and an independent review whose findings were all fixed. Every release goes out as a beta and is promoted to stable after 6 hours if its smoke test passed and no release-blocker issue is open; launcher-v0.14.0 (stable by default) is already out.
2026-10-19 16:29:16 +02:00
Ludovic Marie 19898a0d77 Merge pull request #1018 from ludovic111/docs/security
🤖 Agent: merged after verify passed, security-1's dry runs on the branch, and an independent review whose findings were all fixed. docs/security.md: the security model in plain words, with what is live and what still waits.
2026-10-19 16:29:07 +02:00
Ludovic Marie c94b6a0972 Merge pull request #1009 from ludovic111/feat/server-config-command
🤖 Agent: merged after verify and CI parity passed (40 server tests; the whole create → start → join → whitelist → backup → restore → update → stop flow ran on the Mac mini and the ThinkPad). Adds `horizon-server config`, `backups --json`, `update --check --json`; fixes whitelisting on offline servers and updates as root in containers.
2026-10-19 16:21:56 +02:00
Ludovic Marie 399178174d port-pack: Repurposed's structure voids keep the world's block
repurposed_structures:structure_void_processor returns null for a
template's structure_void blocks, which is what vanilla's block_ignore
does with blocks: [structure_void]. Carry writes it that way, so the
82 lists that use it (its mineshafts, ocean village and temples, the
jungle pyramid's hidden room, swamp village) no longer place structure
voids over the terrain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:19:24 +02:00
Ludovic Marie 8011d274eb port-pack: enter_block criteria name their block as blocks
26.3's EnterBlockTrigger reads a block list from 'blocks' and skips
1.21.1's 'block', so a carried criterion matched any block the player
entered: Regions Unexplored's Downer, From the Tree Tops and Light as a
Frog were granted on the first dive into the sea. Carry renames the
field (20 advancements in Regions Unexplored, with its boat recipes'
in-water criteria).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:16:54 +02:00
Ludovic Marie 59a8aa2cd5 Merge pull request #984 from ludovic111/feat/carry-sea-level-processors
🤖 Agent: merged after verify passed and a local check on main + #983 + #984 (clippy clean; chunk_generation and locator_bar, the two harnesses that failed in CI on the old head, both pass; modpacks-10's integration ran 301/301). Structures built under the sea are flooded and waterlogged; Better Ocean Monuments' processors carried.
2026-10-19 16:02:52 +02:00
Ludovic Marie 1ea04a2b10 docs/security.md: where things stand today, and the Mac mini runs forks' code too once labelled
- A table of what is live, waiting to merge, or waiting for Ludovic, so the page doesn't read as if it all were.
- Forks: their checks need a maintainer's approval, and run-parity runs them on the Mac mini; the Mac mini
  section no longer says forks don't run there, and says what a clean release checkout does and doesn't fix.
- Blockers hold every beta while open; releases from before signing stay installable with pinned files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:45:24 +02:00
Ludovic Marie c05a00092e docs/security.md: the security model in plain words
What an attacker could do before (instructions hidden in reports, a skipped check that counted as
passed, releases straight to every player, downloads trusting GitHub alone, pipeline files changed
like any other), what stops it now (untrusted text, verify always running, beta then stable,
signed updates, code owners, the agents' own GitHub App), what still needs Ludovic, and what it
doesn't solve. Written for the website's Contributing page; CONTRIBUTING.md links it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:44:29 +02:00
Ludovic Marie a307bd2e3d Release channels: blockers hold every beta, latest only moves forward, a stalled promotion opens an issue
- A release-blocker issue's text is never read: its author can edit it after a maintainer labels it, so an
  open blocker holds every beta, and one closed as completed still holds the betas published before it closed.
- Even --force never promotes a beta that isn't newer than the stable release: horizon-server update and
  install.sh download GitHub's latest.
- When the oldest beta newer than the stable release has waited 24 hours, promote.yml opens a "Promotion to
  stable has stalled" issue with the last reason; the next promotion closes it.
- promote.yml: persist-credentials: false; issues: write for the stall issue.
- Website: the newest 100 releases, plus GitHub's latest (the stable one) when a day of betas pushes it out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:38:05 +02:00
Ludovic Marie 2a7303f76f Releases: beta and stable channels, promoted after 6 hours
Game releases go out as betas (GitHub pre-releases, never "latest") with the Mac mini's smoke
report attached. promote.yml (every 30 minutes, or by hand from a phone) runs
tools/release_channels.py, which makes the newest beta stable and latest once it has been out 6
hours, passed its smoke test and no release-blocker issue covers it, with notes rewritten to cover
everything since the last stable release. release_train.py counts merges from the newest release of
either channel, and a beta's notes say it is one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:34:03 +02:00
Ludovic Marie 0a1d03b4b7 Merge pull request #1011 from ludovic111/feat/signed-release-checksums
🤖 Agent: merged after verify passed, with security-1's dry runs on the branch and an independent review (no regression: parity still runs on every PR from this repo; releases go out unsigned with a warning until the signing key is set).
2026-10-19 15:32:09 +02:00
Ludovic Marie e17e8b9d36 Merge pull request #1010 from ludovic111/ci/verify-always-runs
🤖 Agent: merged after verify passed, with security-1's dry runs on the branch and an independent review (no regression: parity still runs on every PR from this repo; releases go out unsigned with a warning until the signing key is set).
2026-10-19 15:32:04 +02:00
Ludovic Marie d468e1e78d Merge pull request #974 from ludovic111/feat/carry-extra-namespaces
🤖 Agent: merged after verify and CI parity passed, plus modpacks-10's local integration (parity 301/301, structure-start oracle 150/150 and 134/134). Towns and Towers' namespaces carried in its manifest.
2026-10-19 15:20:55 +02:00
Ludovic Marie 9a0077794c Merge pull request #969 from ludovic111/feat/mod-extra-namespaces
🤖 Agent: merged after verify and CI parity passed, plus modpacks-10's local integration (all nine branches on main: parity 301/301, structure-start oracle 150/150 and 134/134). Content mods may own namespaces besides their id; two mods may not share one.
2026-10-19 15:20:30 +02:00
Ludovic Marie 418e22a4b5 Merge pull request #975 from ludovic111/fix/mod-loot-tables
🤖 Agent: merged after verify and CI parity passed, plus modpacks-10's local integration (all nine branches on main: parity 301/301, structure-start oracle 150/150 and 134/134). Mod loot tables from every namespace, so modded structure chests are filled.
2026-10-19 15:20:26 +02:00
Ludovic Marie 621cea18ca docs/modpacks.md: carry types bare number ranges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:04:18 +02:00
Ludovic Marie 43287c18c2 horizon-server whitelist add: the offline UUID on a running offline server
The game resolves names as vanilla does, Mojang first, so on an offline server a name someone owns got that
account's UUID and the player, who joins under the offline UUID, was refused. horizon-server now writes the
offline entry and has the game reload the whitelist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:24:15 +02:00
Ludovic Marie d38c07c2fa Releases: sign in a job of its own that runs only sha256sum and OpenSSL
Any repository code running earlier in the job that holds the key could reach it (a build patched
through Cargo.toml, or a step writing $GITHUB_ENV or $GITHUB_PATH for the next one). The `sign`
job checks out only tools/ci/sign_release.sh, which signs with the runner's OpenSSL; the publish
job, without the key, checks the result with horizon-release-sign as launchers will.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:18:54 +02:00
Ludovic Marie f32a91d793 Releases: signed checksums (SHA256SUMS, SHA256SUMS.sig) for game and launcher releases
crates/horizon-release-sign signs a release's checksums with an Ed25519 key that exists only as a
secret of the `release` environment, and checks them as launchers will, against the public keys
built in from release-keys.txt. Dry runs sign with a throwaway key. Until release-keys.txt lists a
key, releases keep going out with SHA256SUMS alone and a warning; once it does, a missing or
unknown key fails the release before anything is published. tools/ci/new_release_key.sh pipes a
new key straight into the secret and prints only the public key. ring and base64 are already in
the lockfile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:03:03 +02:00
Ludovic Marie cef652d026 checks: verify always runs, so a skipped job can never satisfy main's required check
Labels started `checks` runs whose verify job was skipped, and GitHub counts a skipped required
check as passed: auto-merge merged #823 and #837 before the real verify finished. Labels no longer
start `checks` (the fork-only run-parity label has its own workflow), and verify has no condition.
The parity job moves into a reusable workflow both call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:58:27 +02:00
Ludovic Marie 42bb310df9 horizon-server config: read and change server.toml's settings, live where vanilla can
`config [--json]` prints the settings; `config set KEY=VALUE...` writes them through
toml_edit, checked as server.toml is checked (nothing is written if one is wrong). A
running server takes the difficulty, the default game mode and the whitelist at once
through its console, and the backup settings because the supervisor reads them each
time; the rest waits for the next start, and the command says which.

Also `backups --json` and `update --check --json`, for the launcher's Servers page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:29:51 +02:00
Ludovic Marie ddc5aaed0e Merge pull request #1008 from ludovic111/fix/java-pack-fullscreen-inputs
🤖 Agent: merged after verify passed; cloud_render, environment_render, weather_render and 923 client tests pass, with before/after screenshots of Complementary Unbound. Java shader packs get real eye brightness, custom uniforms, Iris's sun path and tilt, and clouds=off/sun/moon flags. Part of #944 (reported by brabus_); shadows and gbuffers still to come.
2026-10-19 13:24:02 +02:00
Ludovic Marie 79f0ddee2c Merge pull request #990 from ludovic111/feat/server-prune-releases
🤖 Agent: merged after the verify rerun passed (the first run's failure was a flake; horizon-server tests pass 39/39 locally) and CI parity passed. Old releases are pruned automatically after an update.
2026-10-19 13:20:54 +02:00
Ludovic Marie adb1476582 Merge pull request #989 from ludovic111/feat/carry-formations
🤖 Agent: merged after verify and CI parity passed (modpacks-10, reviewed with local harness proof in the agent's report). Carries Formations' structures.
2026-10-19 13:20:30 +02:00
Ludovic Marie f910be28c8 Merge pull request #982 from ludovic111/feat/carry-pillar-processors
🤖 Agent: merged after verify and CI parity passed (modpacks-10, reviewed with local harness proof in the agent's report). Carries the mods' pillar and fluid-fix processors in ported packs.
2026-10-19 13:20:14 +02:00
Ludovic Marie 0431f12a6f Give Java packs' full-screen passes Iris's sky, eye light and custom uniforms
Complementary Unbound drew clouds and light shafts inside terrain and a
second sun because the full-screen passes got wrong inputs:

- eyeBrightness was a constant (0, 240), so packs saw open sky
  underground. It is now the block and sky light of the camera entity's
  eye block (CommonUniforms.getEyeBrightness), and eyeBrightnessSmooth
  follows it with the pack's eyeBrightnessHalflife (SmoothedFloat).
- Custom uniforms (uniform.* / variable.* in shaders.properties) were all
  0: Complementary's eyeBrightnessM, isEyeInCave, starter, framemod8 and
  the rest. horizon-shaderpack's uniforms.rs parses and evaluates them
  each frame like Iris (stareval priorities, IrisFunctions, SmoothFloat).
- sunPosition, moonPosition, shadowLightPosition, sunAngle and
  shadowAngle now follow CelestialUniforms: the sky's sun and moon angles
  turned by Y -90, the pack's sunPathRotation about Z, then the angle. The
  old sun vector pointed north-south instead of east-west.
- While a Java pack runs, sunPathRotation tilts Horizon's sun, moon and
  stars as Iris tilts vanilla's, and clouds = off | fast | fancy, sun and
  moon = false apply. Complementary and Sildur's set clouds = off; the
  vanilla clouds Horizon drew anyway wrote depth the packs' light shafts
  and fog took for terrain.

Fixes #944

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:14:48 +02:00
Ludovic Marie a480d10157 docs/server.md: what remote players get right on a dedicated server now (#484)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:12:42 +02:00
Ludovic Marie ee3e874eb8 horizon-server: delete old releases after an update
An install kept every release it ever unpacked in releases/. Once the game is up on the
new release (or a stopped server is switched), the update now deletes the old ones,
keeping the release in use, the one `previous` names (rollback's target), the one the
running horizon-server came from, and the `updates.keep` newest of the others (1 by
default, a new server.toml setting). A release that can't be deleted is reported and
left for the next update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:50:27 +02:00
Ludovic Marie 8beeea55ff Carry Formations' structures
Its formations:simple becomes the game's horizon:formations (its pool and
placement), and its single pool element vanilla's with its ground_level
under horizon:ground_level. Its pieced structure (one) stays out; its
processors are still dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:35:08 +02:00
Ludovic Marie 6af77dfbe4 Merge remote-tracking branch 'origin/main' into feat/server-bench-paper-fabric
# Conflicts:
#	docs/server.md
2026-10-19 08:33:52 +02:00
Ludovic Marie 56fcc91e4b Merge pull request #967 from ludovic111/feat/site-host-a-server
🤖 Agent: merged after verify passed. The site's nav links Host a server; README gains a hosting paragraph; tools/server.py and docs/server-quickstart.txt retired.
2026-10-19 08:33:15 +02:00
Ludovic Marie aac0dc7f60 Merge pull request #966 from ludovic111/feat/server-update
🤖 Agent: merged after verify and CI parity passed. horizon-server update (SHA-256 check, world backup, switch, health wait, automatic rollback) and rollback; 6-hourly update notice in log, status and panel. Proven end to end on the Mac mini and the ThinkPad (healthy update, crash rollback, timeout rollback, manual rollback, real GitHub download); 37 unit tests.
2026-10-19 08:33:03 +02:00
Ludovic Marie adb07c96ff Carry Better Ocean Monuments' processors and YUNG's legs
Better Ocean Monuments' ten processors (no fields; their behaviour is in
its Java) become vanilla's rule, the game's horizon:pick (one new
nextFloat per chance), horizon:flood_air, horizon:waterlog,
horizon:keep_world_block and horizon:yung_pillar; Better Witch Huts' log
and fence legs become horizon:yung_pillar. Its monuments are no longer
dry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:29:23 +02:00
Ludovic Marie d983b47db6 Carry the mods' pillar and fluid fix processors
Repurposed Structures' and Moog's pillar_processor, Repurposed's
bottom_pillar_processor and close_off_fluid_sources_processor, YUNG's
pillar_processor (Better Fortresses, Better Jungle Temples) and Better
Fortresses' stair_pillar_processor become the game's horizon:pillar,
horizon:bottom_pillar, horizon:close_off_fluid_sources,
horizon:yung_pillar and horizon:stair_pillar. A pillar's own processor
list is written in, with the Java processors in it dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:29:09 +02:00
Ludovic Marie 0a733cec55 Carry: the namespaces a mod's own files name, as its manifest's namespaces
Towns and Towers ships its 60 structures under kaisyn and towns_and_towers,
not its mod id t_and_t, so carry left them outside. A namespace is now the
mod's when its own files (its id's, its tag additions, the namespaces
already claimed) name ids in it and no mod of the pack has it as its id.
Compat files for other mods and pack mods' configs stay outside; of ATM10's
42 jars only T&T claims any. A replacing tag of its own is an addition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:29:00 +02:00
Ludovic Marie df8bc603ff Content mods: namespaces besides the mod id, with no namespace shared by two mods
A content mod's manifest may list namespaces its files use besides its id
(Towns and Towers ships kaisyn and towns_and_towers under mod id t_and_t).
They are the mod's as its id is: files load, loaders read them. minecraft,
c and horizon cannot be listed. Two mods that are on owning one namespace
is an error naming both; the game keeps the first and leaves the other's
content out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:28:42 +02:00
Ludovic Marie 6008be0a68 Loot: tables, modifiers, predicates, tags and recipes of every namespace
The loot loader read data/minecraft/ only, so every chest in a carried
mod's structure that names its mod's loot table opened empty. It now reads
every namespace (a vanilla root has only minecraft). Integers written as
floats (rolls 3.0, as Towns and Towers writes them) read as vanilla's int
codecs read them. 534 of the 675 non-block tables in ATM10's carried mods
now fill a chest; vanilla's chest fills are byte-identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:28:42 +02:00
Ludovic Marie aec5c20698 hosting.md: rewrap the tick bullet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:25:15 +02:00
Ludovic Marie a64877f1a1 Server benchmark: Horizon against vanilla, Paper and Fabric + Lithium, equal work (2026-10-19)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:25:07 +02:00
Ludovic Marie 0af3dd3900 Merge pull request #959 from ludovic111/feat/carry-yung-modifiers
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:10:05 +02:00
Ludovic Marie 0def8931cb Merge pull request #956 from ludovic111/feat/carry-terrain-adaptation
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:09:53 +02:00
Ludovic Marie 39b74fb468 Merge pull request #955 from ludovic111/feat/enhanced-terrain-adaptation
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:09:41 +02:00
Ludovic Marie 99b07dc810 Merge remote-tracking branch 'origin/main' into pr/796
# Conflicts:
#	crates/horizon-core/src/density/tests.rs
2026-10-19 07:58:32 +02:00
Ludovic Marie d2e8e5fe28 Merge pull request #771 from Online5277/feat/terrain-lod
🤖 Agent: merged, thanks Online5277! Terrain LOD lands off by default. With LODs off it matches main (0 differing pixels in 6 RD16 views, same FPS/GPU ms on the HD 620, same time to full render distance); CI verify and parity pass. We merged main in three times and adapted it to #905/#939 and the packed texture coordinates. The follow-ups from the review (edge band, integrated-GPU cost, lighter far meshes) we're taking on ourselves.
2026-10-19 07:49:12 +02:00
Ludovic Marie 0bc6c689da Site: link the host-a-server page from the nav and the README; retire the Fabric server starter
tools/server.py and docs/server-quickstart.txt are gone (horizon-server replaces them);
build_release.py builds only the client starter, and the docs point to docs/hosting.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 05:34:34 +02:00
Ludovic Marie bf2c5e7946 horizon-server update: wait for the old game after a rollback; document updates
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 05:30:21 +02:00
Ludovic Marie 4b28390f72 docs/modpacks.md: Lithostitched's processors carried, and what they change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 04:42:29 +02:00