From 69946e62f142a62942996f5ce7564d364a00c71d Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 11 Sep 2026 00:02:55 +0300 Subject: [PATCH] Verify live admission mod recovery and document direct multiplayer join --- AGENTS.md | 15 +++++++++++++++ docs/launcher-architecture.md | 15 +++++++++++++++ src-tauri/src/profile.rs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 3fc1805..2e985f5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -202,3 +202,18 @@ server. Windows installers have no Authenticode signature; macOS is not Apple notarized. Native CI tests and packaging do not certify full Minecraft installs or desktop updater/restart behavior on Windows/macOS. Older unsupported clients need a manual installation of the current release. Previous releases immutable. + + +## Admission client menu 0.1.1 (2026-09-11) + +The signed Aeronautics payload now contains admission mod 0.1.1 at the existing +managed path `mods/shacraft-admission-0.1.0.jar` to prevent duplicate mod IDs on +upgrade. SHA-256: `faa9ae13cb0f2d93c03dae26ab36ae20d3fb6b66c89c09254b16808d6b183f89`. +From the title screen (and vanilla safety acknowledgement), Multiplayer connects +to fixed `135.106.154.86:25567`. Cancel/errors return to TitleScreen; transitions +from other screens do not auto-connect. Client-only registration, protocol 1 and +one-use admission remain unchanged. Running game server was not restarted. +Linux Java 21 build and 8 mod tests pass. An opt-in native live test verifies +signed-manifest retrieval and download/repair/restoration of the admission jar +only in a temporary directory. Mac 0.1.5 connection failure remains unclassified +pending exact error/log; this is not a verified macOS fix or desktop UI test. diff --git a/docs/launcher-architecture.md b/docs/launcher-architecture.md index f48efdb..b3be442 100644 --- a/docs/launcher-architecture.md +++ b/docs/launcher-architecture.md @@ -305,3 +305,18 @@ or desktop updater/restart behavior on Windows/macOS. Older unsupported clients need a manual installation of the current release. Previous releases immutable. The live native updater test passed against the published 0.1.5 feed: verified download, corrupted-byte rejection and replacement of only a temporary AppImage copy. The user-installed launcher was not modified. + + +## Admission client menu 0.1.1 (2026-09-11) + +The signed Aeronautics payload now contains admission mod 0.1.1 at the existing +managed path `mods/shacraft-admission-0.1.0.jar` to prevent duplicate mod IDs on +upgrade. SHA-256: `faa9ae13cb0f2d93c03dae26ab36ae20d3fb6b66c89c09254b16808d6b183f89`. +From the title screen (and vanilla safety acknowledgement), Multiplayer connects +to fixed `135.106.154.86:25567`. Cancel/errors return to TitleScreen; transitions +from other screens do not auto-connect. Client-only registration, protocol 1 and +one-use admission remain unchanged. Running game server was not restarted. +Linux Java 21 build and 8 mod tests pass. An opt-in native live test verifies +signed-manifest retrieval and download/repair/restoration of the admission jar +only in a temporary directory. Mac 0.1.5 connection failure remains unclassified +pending exact error/log; this is not a verified macOS fix or desktop UI test. diff --git a/src-tauri/src/profile.rs b/src-tauri/src/profile.rs index 59e91ae..b0a1520 100644 --- a/src-tauri/src/profile.rs +++ b/src-tauri/src/profile.rs @@ -185,6 +185,41 @@ mod tests { time::{SystemTime, UNIX_EPOCH}, }; + #[test] + #[ignore = "downloads the public signed admission mod into a temporary directory"] + fn live_admission_mod_is_restored_when_missing_or_corrupt() { + let mut manifest = crate::remote::fetch_manifest("aeronautics").unwrap(); + manifest.files.retain(|file| { + file.path.starts_with("mods/shacraft-admission") && file.path.ends_with(".jar") + }); + assert_eq!( + manifest.files.len(), + 1, + "exactly one admission mod is required" + ); + assert!(matches!(manifest.files[0].policy, FilePolicy::Managed)); + let root = std::env::temp_dir().join(format!( + "shacraft-live-admission-{}-{}", + process::id(), + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + assert_eq!(inspect(&root, &manifest).unwrap().missing_files, 1); + super::sync(&root, &manifest).unwrap(); + assert!(inspect(&root, &manifest).unwrap().up_to_date); + let target = root.join(&manifest.files[0].path); + fs::write(&target, b"corrupt fixture").unwrap(); + assert!(!inspect(&root, &manifest).unwrap().up_to_date); + super::sync(&root, &manifest).unwrap(); + assert!(inspect(&root, &manifest).unwrap().up_to_date); + fs::remove_file(&target).unwrap(); + super::sync(&root, &manifest).unwrap(); + assert!(inspect(&root, &manifest).unwrap().up_to_date); + fs::remove_dir_all(root).unwrap(); + } + fn manifest(hash: String, size: u64) -> Manifest { Manifest { schema_version: 1,