Files
onion-mc/analysis/state/01-pack-and-environment.md
logan a84319bb2f fix(mods): add MidnightLib 1.10.0 to fix startup CME crash
Fright's Delight jar-in-jars MidnightLib 1.9.2, whose MidnightConfig.init
races during NeoForge parallel mod construction (ConcurrentModificationException).
The broken mod state left mod_resources unloaded, so WATUT's reloadShaders
mixin crashed on particle.json - WATUT was the victim, not the cause.
1.10.0 synchronizes the entries map (upstream 1fe69729); FML selects it over
the JiJ copy. Verified: 10/10 clean cold launches to world join.

Also adds analysis/state/ (Phase 2 state capture).
2026-10-15 17:07:52 -04:00

74 lines
4.6 KiB
Markdown

# 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
`<ID>` from `proposed-configs/out/<ID>/` into the game dir and writes
`BENCH_VARIANT.txt`. **Relaunch for every config change.**