From 80e6318223698cf8a19a12b01e26b48baae00cb2 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 May 2026 13:44:31 -0700 Subject: [PATCH] Add packaged client launch QA gate --- AGRARIAN_DEVELOPMENT_ROADMAP.md | 2 +- Docs/QA/MvpQaGates.md | 25 ++++++++ Scripts/verify_packaged_client_launch_gate.py | 60 +++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 Docs/QA/MvpQaGates.md create mode 100644 Scripts/verify_packaged_client_launch_gate.py diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index bdd37e4..3e32b7c 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -854,7 +854,7 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe ## 0.1.Q MVP QA Gates -- [ ] Can launch packaged client. +- [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. - [ ] Can connect two clients. - [ ] Can gather resources. diff --git a/Docs/QA/MvpQaGates.md b/Docs/QA/MvpQaGates.md new file mode 100644 index 0000000..20bcf4f --- /dev/null +++ b/Docs/QA/MvpQaGates.md @@ -0,0 +1,25 @@ +# MVP QA Gates + +Version `0.1.Q` turns the current survival MVP into a repeatable test target. +Each gate must have either automation, a documented manual test, or build +evidence before it is marked complete. + +## Packaged Client Launch + +The packaged client launch gate proves the Windows investor/demo package can be +created, opened through a known launcher, and checked through the real-GPU +visual QA path. + +Required evidence: + +- `Scripts/PackageWindowsDevelopment.bat` completes successfully. +- `Builds/WindowsDevelopment/AgrarianGame.exe` exists. +- `Scripts/InstallWindowsDemoLaunchers.bat` installs: + - `Start Agrarian Demo.cmd` + - `Start Agrarian Demo - DX12.cmd` + - `Start Agrarian Demo - Compatibility DX11.cmd` +- `Scripts/RunWindowsInvestorVisualQACheck.bat --check-tools` reports the + packaged demo exists and `SunshineService` is running. +- Any full visual pass stores notes under `Saved\VisualQA\InvestorDemo`. + +This gate is client-only. It does not require multiplayer server deployment. diff --git a/Scripts/verify_packaged_client_launch_gate.py b/Scripts/verify_packaged_client_launch_gate.py new file mode 100644 index 0000000..84ac62d --- /dev/null +++ b/Scripts/verify_packaged_client_launch_gate.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Verify the MVP packaged-client 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" +PACKAGE_BAT = ROOT / "Scripts" / "PackageWindowsDevelopment.bat" +LAUNCHERS_BAT = ROOT / "Scripts" / "InstallWindowsDemoLaunchers.bat" +VISUAL_QA_BAT = ROOT / "Scripts" / "RunWindowsInvestorVisualQACheck.bat" + +REQUIRED = { + QA_DOC: [ + "## Packaged Client Launch", + "Scripts/PackageWindowsDevelopment.bat", + "Builds/WindowsDevelopment/AgrarianGame.exe", + "Start Agrarian Demo.cmd", + "Start Agrarian Demo - DX12.cmd", + "Start Agrarian Demo - Compatibility DX11.cmd", + "Scripts/RunWindowsInvestorVisualQACheck.bat --check-tools", + "client-only", + ], + PACKAGE_BAT: [ + "Builds\\WindowsDevelopment", + "InstallWindowsDemoLaunchers.bat", + "BuildCookRun", + ], + LAUNCHERS_BAT: [ + "Start Agrarian Demo.cmd", + "Start Agrarian Demo - DX12.cmd", + "Start Agrarian Demo - Compatibility DX11.cmd", + ], + VISUAL_QA_BAT: [ + "AgrarianGame.exe", + "SunshineService", + "--check-tools", + "READY: packaged demo exists and SunshineService is running.", + ], + ROADMAP: [ + "[x] Can launch packaged client.", + ], +} + + +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: packaged-client launch QA gate is documented and scripted.") + + +if __name__ == "__main__": + main()