From 388ae363928e68384f96776ca386e8d67b9ba01c Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 May 2026 13:46:24 -0700 Subject: [PATCH] Add server launch QA gate --- AGRARIAN_DEVELOPMENT_ROADMAP.md | 2 +- Docs/QA/MvpQaGates.md | 26 ++++++++++++ Scripts/verify_server_launch_gate.py | 59 ++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 Scripts/verify_server_launch_gate.py diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 3e32b7c..e304fe9 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -855,7 +855,7 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe ## 0.1.Q MVP QA Gates - [x] Can launch packaged client. Added an MVP QA gate that requires the Windows package script, packaged executable, installed investor launchers, and the real-GPU visual QA readiness check before the client launch gate qualifies. -- [ ] Can launch server. +- [x] Can launch server. Added an MVP QA gate for the Linux gameplay host requiring the true dedicated build path or current binary-engine fallback, deployment to `/opt/agrarian/server`, `agrarian-game-server.service` active state, UDP `7777` listener evidence, and Ground Zero map browse evidence. - [ ] Can connect two clients. - [ ] Can gather resources. - [ ] Can craft a fire. diff --git a/Docs/QA/MvpQaGates.md b/Docs/QA/MvpQaGates.md index 20bcf4f..2af623e 100644 --- a/Docs/QA/MvpQaGates.md +++ b/Docs/QA/MvpQaGates.md @@ -23,3 +23,29 @@ Required evidence: - Any full visual pass stores notes under `Saved\VisualQA\InvestorDemo`. This gate is client-only. It does not require multiplayer server deployment. + +## Server Launch + +The server launch gate proves the MVP gameplay host can start the current +server-compatible package and expose the Unreal gameplay port. + +Current MVP launch path: + +- Prefer the true Linux dedicated-server target when a server-capable Unreal + engine is available: + `Scripts/BuildLinuxDedicatedServer-Windows.bat` +- Until then, use the binary-engine fallback: + `Scripts/PackageLinuxGameServerFallback-Windows.bat` +- Deploy the produced package to `/opt/agrarian/server`. +- Launch through `/opt/agrarian/server/AgrarianGameServer.sh`. +- Manage the host with `agrarian-game-server.service`. + +Required evidence: + +- `systemctl is-active agrarian-game-server.service` reports `active`. +- `ss -lunp` shows `AgrarianGame` listening on `0.0.0.0:7777/udp`. +- The journal shows the Ground Zero map browse started. +- The runbook explains the true dedicated target and fallback path. + +This gate is server-relevant and requires multiplayer server verification when +server launch tooling or deployed package contents change. diff --git a/Scripts/verify_server_launch_gate.py b/Scripts/verify_server_launch_gate.py new file mode 100644 index 0000000..13f74f4 --- /dev/null +++ b/Scripts/verify_server_launch_gate.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Verify the MVP server launch QA gate is documented and scripted.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ROADMAP = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md" +QA_DOC = ROOT / "Docs" / "QA" / "MvpQaGates.md" +RUNBOOK = ROOT / "Docs" / "Ops" / "DedicatedServerBuildRunbook.md" +DEDICATED_BAT = ROOT / "Scripts" / "BuildLinuxDedicatedServer-Windows.bat" +FALLBACK_BAT = ROOT / "Scripts" / "PackageLinuxGameServerFallback-Windows.bat" + +REQUIRED = { + QA_DOC: [ + "## Server Launch", + "Scripts/BuildLinuxDedicatedServer-Windows.bat", + "Scripts/PackageLinuxGameServerFallback-Windows.bat", + "/opt/agrarian/server/AgrarianGameServer.sh", + "agrarian-game-server.service", + "0.0.0.0:7777/udp", + "Ground Zero map browse started", + ], + RUNBOOK: [ + "Scripts\\BuildLinuxDedicatedServer-Windows.bat", + "Scripts\\PackageLinuxGameServerFallback-Windows.bat", + "Deploy the fallback package to `/opt/agrarian/server`", + "-server -port=7777 -NullRHI -nosound", + ], + DEDICATED_BAT: [ + "AgrarianGameServer Linux Development", + "LINUX_MULTIARCH_ROOT", + "Builds\\LinuxServerDevelopment", + ], + FALLBACK_BAT: [ + "Builds\\LinuxGameDevelopment", + "-platform=Linux", + "BuildCookRun", + ], + ROADMAP: [ + "[x] Can launch server.", + ], +} + + +def main() -> None: + missing: list[str] = [] + for path, snippets in REQUIRED.items(): + text = path.read_text(encoding="utf-8") + for snippet in snippets: + if snippet not in text: + missing.append(f"{path.relative_to(ROOT)} missing {snippet!r}") + if missing: + raise SystemExit("FAILED: " + "; ".join(missing)) + print("OK: server launch QA gate is documented and tied to build scripts.") + + +if __name__ == "__main__": + main()