# Pack and environment ## The pack - **Onion MC** — curated NeoForge modpack managed with **packwiz**; MC **1.21.1**, NeoForge **21.1.251**, **217 mods** at HEAD `e5e369a`. - The repo **doubles as the dedicated-server directory** (`/home/logan/onion-mc`). The live server runs from here (see `03-current-state.md`). `world/`, `libraries/`, `logs/`, `crash-reports/`, `*.jar` are `.packwizignore`d — never blanket-un-ignore. - Remote: `ssh://git@git.ljones.me:2222/logan/onion-mc.git`, branch `main`. - **Conventional Commits**, imperative subject, body explains *why*. Don't commit or push unless asked / plan calls for it. - packwiz lives at `~/go/bin/packwiz` (build `ef87d96`). On this machine it is on PATH. - Config shipping is **opt-in**: `.packwizignore` ignores `config/*`; shipping a file needs a negation at the **bottom** of `.packwizignore` (last match wins; negations must not end in `/` or packwiz SkipDirs the parent). - Hand-set `side = "server"` on **petprotect, c2me-neoforge, noisium** is silently reset by bulk `packwiz update` (single-mod update is safe). - Tuned defaults ship via the **Default Options** mod (`config/defaultoptions/`), copy-if-absent → reaches fresh installs only. Change values **only** through `analysis/client-perf/proposed-configs/build.py`, never by hand-editing outputs. - `.pi/` and `analysis/` are packwizignored — safe to commit to git, never shipped to players. ## This machine — the Phase 2 "proxy" bench box (Manjaro) The three fleet machines (Steam Deck, 7700K/1060, 6700K/1080 Ti — see `phase0/`) are **unreachable**; all Phase 2 data so far is from this **high-tier proxy**. Label all results as proxy data: absolute FPS floors do not map to tier decisions. | Item | Value | | --- | --- | | OS | Manjaro Linux, kernel 7.1.8 | | CPU | AMD Ryzen 9 9900X, 12C/24T | | GPU | AMD RX 7800 XT (DRI_PRIME=1 used in launch scripts) + Granite Ridge iGPU | | RAM | 91 GB, **no swap** (good for p99 validity) | | Disk | `/` 84% used, 140 GB free | | Java | OpenJDK **21.0.12** at `/usr/lib/jvm/java-21-openjdk` | | Display | Harness hardcodes `DISPLAY=:1`, `XAUTHORITY=/run/user/1000/xauth_HvvPAq`; runs must happen on the desktop session owning :1. X sockets X0/X1/X99 exist. | | git / python | git 2.55.0, python 3.14.6 | ## Tool and data paths on this machine | What | Path | | --- | --- | | packwiz | `~/go/bin/packwiz` | | Prism data dir (bench, launched with `-d`) | `~/onion-bench/prism` | | Bench Prism instance | `~/onion-bench/prism/instances/OnionBench` | | Instance game dir | `.../OnionBench/.minecraft` (provisioned; `saves/onionbench` 26 MB; Default Options seeded; `BENCH_VARIANT.txt` = `C1` = last applied variant; MaxMemAlloc 8192) | | Instance PreLaunchCommand | **empty** (intentional — no packwiz self-update mid-matrix, per BENCH-MATRIX §1) | | Bench worldgen server | `~/onion-bench/server-bench` (full NeoForge server; `benchworld/` = the generated world source, 26 MB) | | MangoHud | user-local build: `~/.local/mangohud`, wrapper `~/.local/bin/mangohud-local` (sets LD_PRELOAD shim, `output_folder=~/onion-bench/mangologs`, autostart, 1800 s cap, fps_limit=0, vblank off). **System `mangohud` NOT in PATH.** | | MangoHud frametime CSVs | `~/onion-bench/mangologs/` | | Harness results CSV | `~/onion-bench/harness-results.csv` (append via `run_scene.py --record`) | | Bench launch scripts | `~/onion-bench/launch-{bench,gui,online,xvfb,...}.sh` (`launch-bench.sh` exports DISPLAY/XAUTHORITY/DRI_PRIME and launches OnionBench offline as user `Tester`) | | Jar cache for jarscan | `/tmp/onion/jars` — **currently absent** (ephemeral). Refetch with `analysis/audit/fetch.py` only if re-running jarscan. | | xdotool | `/usr/bin/xdotool` (present) | ## Harness wiring (quick reference) - `analysis/client-perf/harness/run_scene.py` — apply variant → launch Prism into world `onionbench` under MangoHud → drive scenes via xdotool → slice p50/p95/p99/ peak/1%-low from the MangoHud CSV. Constants: `ROOT=~/onion-bench/prism`, `INSTANCE=OnionBench`, `GAME=$ROOT/instances/OnionBench/.minecraft`, `MANGOLOGS=~/onion-bench/mangologs`, `WORLD=onionbench`. CLI: `python3 run_scene.py --variant C1 --scene s1 [--warmup 15] [--capture 30] [--runs 1] [--record FILE] [--pre storm_on]`. Scenes: `s1 s2 s2s s3 s4 s5`. Waits for "Sound engine started" in the instance log. `--record` appends one CSV row. - `analysis/client-perf/harness/rcon.py` — stdlib RCON client; args are `host port password command`. No config file. - `analysis/client-perf/proposed-configs/apply_variant.py` — applies variant `` from `proposed-configs/out//` into the game dir and writes `BENCH_VARIANT.txt`. **Relaunch for every config change.**