The client now boots cleanly on the bench machine (the CAC spawn-key
crash was fixed in 8e8483d). Add the harness used to drive bench scenes
and capture frametimes, the bench-world generation workflow, and a
self-contained handoff brief. All files live under analysis/ (packwizignored),
so nothing player-facing changes.
- harness/rcon.py: minimal RCON client for the temp worldgen server
- harness/run_scene.py: apply variant -> launch Prism under MangoHud ->
xdotool scene commands -> p50/p95/p99/1%-low from the CSV
- HANDOFF.md: state, gotchas, next steps
- build.py: disable DH autoUpdater for bench variants (suppress modal)
6.5 KiB
Onion MC client-perf — handoff (2026-10-15)
Self-contained brief for the next agent. Read .pi/journal.md (last sections) and
BENCH-MATRIX.md too, but this file is the live state on this machine.
Goal
Finish the Phase 2 client-performance loop: measure the staged configs, decide by
BENCH-MATRIX.md's rules, write winners into proposed-configs/build.py
(DEFAULT / DECK / HIGH), build.py --ship, packwiz refresh, commit (Conventional
Commits) and push. Pushes go live to players on their next Prism launch.
Repo / pack state
- Pack: 217 mods, MC 1.21.1, NeoForge 21.1.251. Git
HEAD == origin/main == 8e8483d. 8e8483dfixed the one real boot blocker: the Critters & Companions partial spawn config used camelCase keys (biomeSpec) but YACL serialises withFieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES; every entry loadedbiomeSpec = nullandCACSpawnConfig$SpawnEntry.isTag()NPE'd inFMLCommonSetupEvent, leaving the client in a "broken mod state" (119 refused events). Fixed to snake_case; already pushed.- The Alex's Mobs (TOML) and Fowl Play (YACL camelCase) spawn files are correct and were
verified applied in-game. Do not commit the mod/server full re-saves of
config/*(the running server rewrites them): alwaysgit checkout -- config/before staging. - Nothing was shipped this session. Shipped
config/defaultoptions/**is unchanged froma01bc3b.build.pywas only patched in the BENCH layer (below); the tiers are untouched.
Boot check (client, this machine) — essentially PASS
Reached main menu cleanly. Sound engine started 01:26:53; ModernFix "Game took 29.3 s to
start"; blocks atlas 4096x4096x2; Default Options correctly seeded options.txt
(renderDistance 8, maxFps 120, vsync true). No missing deps, no mixin apply failures, no
ftbteams refs, no fishermans-haven biome errors, no YACL "Failed to deserialize". 22 ERROR
lines, all benign (pride access-transformer, Controlify @Shadow, FTB Library legacy
textures, 4 GeckoLib molang parses, icys-better-horses pack path, Xaero version expiry,
Veil failing to recompile 2 lodestone nineslice shaders).
Open boot-adjacent issue (not yet fixed): an intermittent crash on world load:
java.io.FileNotFoundException: minecraft:shaders/core/particle.json
at com.corosus.watut.ShaderInstanceBlur.<init>(ShaderInstanceBlur.java:27)
at GameRenderer.handler$jhl000$watut$onLoadShaders(...)
First world load succeeded and measured; the next crashed during "Rendering overlay". WATUT is a LEVERS §5 removal candidate but the owner says remove no mods — look for a WATUT config/patch or a reliable retry. Confirm whether real players hit it before shipping.
Tooling installed on this machine (all user-local, no root)
- Prism Launcher 11.0.3 (
/usr/bin/prismlauncher). Data root~/onion-bench/prism, instance idOnionBench, game dir~/onion-bench/prism/instances/OnionBench/.minecraft(214 jars). A valid Microsoft account is in~/onion-bench/prism/accounts.json(device-code login, owner-approved). - MangoHud 0.8.4 extracted to
~/.local/mangohud; wrapper~/.local/bin/mangohud-local(exportsMANGOHUD_CONFIG,LD_PRELOADshim,vblank_mode=0). CSVs land in~/onion-bench/mangologs/. The instance hasWrapperCommand=mangohud-local. - Bench world:
~/onion-bench/prism/instances/OnionBench/.minecraft/saves/onionbench(seedonionbench, creative, cheats). S2 Create floor (2304 kinetic BEs) and S3 mob pen (30 villagers/15 cows/15 sheep/10 allays) were placed via RCON and verified. S4 airships NOT built. Datapack lives in the world'sdatapacks/onion-bench. - Temp server for worldgen:
~/onion-bench/server-bench(symlinks repomods/libraries, copiesconfig), port 25566 / RCON 25576, currently stopped. - Harness (this is new, untracked, packwizignored):
analysis/client-perf/harness/rcon.py— minimal RCON client.run_scene.py— applies a variant, launches Prism into the bench world under MangoHud, drives scenes with xdotool chat, slices the CSV into p50/p95/p99/1%-low. Verified working end-to-end once (C1/S1).
Measurements so far — NOT decision-grade
One run: C1 / S1 p50 16.72 ms, p99 17.24 ms, peak 17.60 ms, avg 59.8 FPS, 1% low 57.5,
n=1889. It was vsync-locked at ~60 FPS (tight 16.7 ms floor). vblank_mode=0 was added
afterwards but the next launch crashed on world load, so uncapped data is not collected yet.
Treat all of this as pipeline validation only.
Next steps (in order)
- Resolve the WATUT world-load crash; re-run one C1/S1 and confirm FPS > 60 (vblank off).
- Run the matrix in order, per
BENCH-MATRIX.md: B0 noise floor (C0/S1 ×3) → B1 baseline (C0, S1–S6) → B2 composite (C1, and C1-deck/C1-high) → B3 DH radius (dh-r256,dh-r192,C1,dh-r64,dh-offon S1/S5) → B4 heap/GC (usejcmd/jstat, or spark, at 5/6 G and J0–J3) → B6 ModernFix → B7 shaders → B8 entities → B9 Flywheel → B10 SPR → B11 Sodium/blend → B12a/b ablation and trials → B13 spark profile → B14 spawn counts. - Write winners into
build.py,python3 build.py --ship,~/go/bin/packwiz refresh, commit. Shipconfig/modernfix-mixins.propertiesonly if B6 passes (see SHIP comment). - Update
PLAYER-TUNING.md(tiers, heap/GC, shader profiles),LEVERS.md,BENCH-MATRIX.md, and append a journal section.
Fleet note
P0 (Steam Deck), P1 (7700K/1060) and P2 (6700K/1080 Ti) are not reachable from this box (no routes / no SSH targets). Everything measured here is a high-tier proxy on a Ryzen 9 9900X + RX 7800 XT, 91 GB RAM. Label results as proxies; absolute FPS floors do not map to tier decisions.
Gotchas learned this session
- Prism 11
--offlinefails a fresh instance with "Required libraries are missing" (EnsureOfflineLibraries). Launch online once to download libs/assets; after that offline works. xdotool windowactivate --synchangs under kwin; usewindowactivate+windowfocus.- MangoHud needs
MANGOHUD_CONFIGset explicitly andLD_PRELOADexported. - The owner's dedicated server runs from the repo root (
java @user_jvm_args.txt @libraries/.../unix_args.txt, port 25565). Never kill it; never touchworld/. The temp bench server used separate ports/paths and is stopped. analysis/is packwizignored (safe to commit);config/is server-rewritten (restore before staging).