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).
This commit is contained in:
logan committed 2026-10-15 17:07:52 -04:00
1 parent e5e369a693
commit a84319bb2f
11 files changed
+512 -1

No files matched your search

+27
View File
@@ -448,3 +448,30 @@ uncapped frametimes, then run B0→B14 per `BENCH-MATRIX.md`.
### Pushed ### Pushed
`8e8483d` (owner, CAC keys). This session's analysis/harness commit follows; it touches no `8e8483d` (owner, CAC keys). This session's analysis/harness commit follows; it touches no
shipped file. shipped file.
## Session 2026-10-14 (d) — state capture for handoff (orchestrator)
No pack changes; HEAD stayed `e5e369a`. Three read-only scouts inventoried the
interrupted session's artifacts; findings folded into the new **`analysis/state/`**
directory (6 markdown files: README, pack+environment, timeline, current-state, plan,
artifact-map) — that directory is now the canonical onboarding point for a new agent.
Facts established this session (all evidence-backed):
- The 20:34 FML crash report is the **CAC spawn-key NPE** (fixed by `8e8483d`) — *not*
the WATUT crash. No crash report exists for WATUT yet; it remains open and blocking.
- The dedicated server from the boot check is **still running** (tmux `onion-mc`,
PID 1699563, since 21:01) with an unidentified RCON keepalive polling every 30 s.
Left alone per rules.
- Working-tree diffs (`akashictome`, `alexsmobs` configs) are benign boot re-saves:
whitelist intact; tuned spawn values retained. Per rule, restore before staging —
not committed.
- Bench instance `~/onion-bench/prism/instances/OnionBench` is fully provisioned
(`.minecraft`, `saves/onionbench` 26 MB, Default Options seeded, bench pins,
`BENCH_VARIANT.txt = C1`). One earlier scout misread it as unprovisioned — verified
false by direct `ls`.
- Jar cache `/tmp/onion/jars` is gone (ephemeral; `analysis/audit/fetch.py` rebuilds).
State of the effort at capture: **Phase 2 begun, zero matrix blocks run.** Next agent:
follow `analysis/state/04-plan.md` §"Next actions" (WATUT → verify uncapped frametimes
→ finish S4 → B0→B14 → ship → report). `analysis/state/` itself is uncommitted — fold
it into the next commit.
+73
View File
@@ -0,0 +1,73 @@
# 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.**
+45
View File
@@ -0,0 +1,45 @@
# Timeline of the optimization effort
Condensed from `.pi/journal.md` (the authoritative running log — read it for detail).
Commit hashes are on `main`.
## Background (pre-effort)
- 2026-09: pack curation era — FTB Chunks → Open Parties & Claims + Xaero's swap,
FTB Quests/Teams removed, map migration tooling (`analysis/FTB-XAERO-MAP-MIGRATION.md`).
- 2026-10-06: 60-mod expansion to 209/212 mods + full static audit of all jars
(`analysis/audit/`), then the **Paxi `onion-fixes` datapack** (`fc649b4`) generated by
`analysis/audit/gen_fixes.py` to resolve cross-mod recipe collisions. Rules: edit the
generator, not the JSON.
## Client-performance initiative
| Date | Phase | What happened |
| --- | --- | --- |
| 2026-10-14 | **Phase 1 — static baseline** | `analysis/client-perf/` created: jarscan (951 per-frame mixin classes; Handcrafted+Chipped+Rechiseled = 58% of block atlas), 9 research briefs, **LEVERS.md** (ranked levers), observed-default configs. Nothing changed in the pack. |
| 2026-10-14 | **Phase 1b — delivery + bench design** | `proposed-configs/` generator (`build.py`; tiers T-default/deck/mid/high + 32 bench variants C0…spr-strict), **BENCH-MATRIX.md** (run sheet), bench datapack `bench/onion-bench/`, PLAYER-TUNING.md. Verified packwiz `preserve` semantics and Default Options 21.1.8 behavior. Puzzles Lib 21.1.64 patch prepared. |
| 2026-10-14 | **Owner decisions applied, shipped** | Owner settled the pending list (see `05-decisions-and-rules.md`). Commits: `a01bc3b` (Default Options + 8 provisional mid-tier files + Sodium Extra, Reese's Sodium Options, BadOptimizations, Particle Core + Puzzles Lib 64 → **217 mods**), `d80f85b` (spawn tuning: alexsmobs/fowlplay/critters partial files), `5919955` (archive cleanup), docs commit (client-perf, audit, phase0, journal). |
| 2026-10-14/15 | **Phase 2 begins — boot + harness** | Machine moved to Manjaro (client-capable). Client boot check **essentially PASS** (main menu clean, 29.3 s, atlas 4096×4096×2, Default Options seeded). The one real blocker — **Critters & Companions camelCase spawn keys** NPE — fixed by owner as `8e8483d`. A 20:34 FML crash report is that same CAC bug (not WATUT). Harness built (`harness/run_scene.py`, `rcon.py`), user-local MangoHud 0.8.4, bench world generated via temp server `~/onion-bench/server-bench` (S2 Create floor + S3 mob pen placed and verified; **S4 airships not built**). One end-to-end harness run (C1/S1) — **vsync-locked, non-decision-grade**; `vblank_mode=0` added to the wrapper afterwards, never re-verified. Dedicated server booted clean from the repo at 21:01 (idle, RCON-keepalive). Committed as `e5e369a`. |
| 2026-10-14 late | **Session interrupted** | After `e5e369a` (23:16): server kept running in tmux `onion-mc`, mods re-saved two config files (benign), RCON poller pinging every 30 s until ~23:58. **No matrix block was ever run.** State captured into `analysis/state/` (this directory). |
## HEAD ancestry (optimization-relevant commits)
```
e5e369a chore(bench): add client bench harness and Phase 2 handoff ← HEAD, pushed
8e8483d fix(config): correct Critters and Companions spawn keys ← owner, unblocks boot
611a1a5 docs: client-perf analysis, bench harness and work journal
d80f85b feat(config): moderate spawn tuning (Alex's Mobs, Fowl Play, Critters)
5919955 chore(analysis): archive finished reviews
a01bc3b feat(perf): Default Options + 4 perf mods + Puzzles Lib 64 ← 217 mods
aa1d273 ... (Phase 1 baseline was taken here)
fc649b4 feat(pack): Paxi onion-fixes datapack (recipe collisions)
```
## What has NOT happened yet
- Matrix blocks **B0–B14: zero runs**.
- Any config value shipped in `a01bc3b` is still **unmeasured** (provisional mid-tier).
- WATUT world-load crash unresolved.
- S4 bench scene unbuilt; S5 tour only partially exercised.
- Nothing has been reported back to the owner from Phase 2 data (B7 shader data, B12b
trial verdicts are owed).
+90
View File
@@ -0,0 +1,90 @@
# Current state — exact position
As of capture (2026-10-14 ~23:45 EDT, HEAD `e5e369a` pushed).
## Multi-step plan position
The initiative's plan (from the journal + BENCH-MATRIX) is:
**boot check → fix blockers → build bench world → confirm uncapped frametimes →
run B0→B14 → write winners into build.py → ship → report to owner.**
| Step | Status |
| --- | --- |
| 1. Boot check, client | ✅ **essentially PASS** (2026-10-14/15 session; HANDOFF.md). 22 benign ERRORs. |
| 1b. Boot check, dedicated server | ✅ **PASS** — booted from repo at 21:01, `Done (3.004s)`, no missing deps / mixin failures / `ftbteams` / fishermans-haven / YACL errors (see `notes-serverlog-triage.md`). |
| 2. Fix boot blockers | ✅ CAC spawn-key NPE fixed by owner (`8e8483d`). The 20:34 crash report is this bug — **do not** confuse it with the WATUT crash. |
| 3. WATUT intermittent world-load crash | ❌ **OPEN — first task.** Details below. |
| 4. Confirm uncapped frametimes | ❌ Not verified after `vblank_mode=0` fix. |
| 5. Bench world complete | ⚠️ **PARTIAL** — S1–S3 built & verified; **S4 airships not built**; S5 tour only partially exercised; S2 `/fill` motors may need manual re-placement (BENCH-MATRIX §2). |
| 6. Run matrix B0→B14 | ❌ **Zero blocks run.** |
| 7. Winners → `build.py` → ship → commit | ❌ Not started. |
| 8. Report to owner (B7 shader data, B12b trial verdicts, B14) | ❌ Not started. |
## Open defect: WATUT world-load crash (blocking bench runs)
- Symptom: intermittent crash on world load —
`corosus.watut.ShaderInstanceBlur.<init>` → `FileNotFoundException:
minecraft:shaders/core/particle.json`, during "Rendering overlay".
- First world load works, a later load crashed (2026-10-14/15 session).
- **The 20:34 crash report in `crash-reports/` is NOT this** — it is the already-fixed
CAC spawn-key NPE. No crash report exists for the WATUT crash yet.
- Owner constraint: **remove no mods** → find a WATUT config/patch/reliable-retry, or
reproduce and characterize it first.
- It must be resolved (or made reliably recoverable) before trusting long bench runs.
## Live processes / environment left by the interrupted session
- **The dedicated server is still running**: java PID 1699563 in tmux session
`onion-mc`, started 21:01:35 from the repo root (port 25565, RCON :25575).
Idle boot-check run; zero players joined. **Never kill it; never touch `world/`.**
- An RCON client from 127.0.0.1 connects/disconnects **every 30 s** (through #353 by
23:57). The poller process was not identified (candidates: a keepalive loop or
`tools/rcon.py` under some wrapper). Investigate before assuming it's yours to kill.
- Uncommitted working-tree changes are **benign mod re-saves**, expected on boot:
- `config/alexsmobs-common.toml`: 13-line tuned partial expanded to 913 full lines
(all tuned values retained — e.g. `gazelleSpawnWeight = 20`).
- `config/akashictome-common.toml`: re-serialized; curated whitelist **intact**,
comments stripped, arrays collapsed.
- Rule (`05-decisions-and-rules.md`): `git checkout -- config/` before staging;
do not commit these.
- `config/*.toml.bak` files + `config/spark/tmp-client/*.jfr.tmp` (spark's live
background-profiler buffer, still growing while the server runs) = runtime junk.
- `context.md` in the repo root was scout scratch from this capture session — safe to
delete (content folded into this directory).
## Measurements so far (all of it)
Exactly **one** harness run, **not decision-grade** (vsync-locked):
```
~/onion-bench/harness-results.csv:
C1,s1,n=1889, p50=16.7ms p95=17.0ms p99=17.2ms peak=17.6ms avg_fps=59.8 1%low=57.5
```
Supporting MangoHud CSVs in `~/onion-bench/mangologs/`:
`java_2026-10-14_22-13-53.csv` (2353 rows), `java_2026-10-14_22-14-54.csv` (3762),
`java_2026-10-14_22-21-46.csv` (178, truncated), plus two `glxgears` sanity runs.
The vsync fix (`fps_limit=0`, vblank off in `~/.local/bin/mangohud-local`) has been
applied but **not re-verified** — first task after WATUT: one C1/S1 run must show
well above 60 fps.
## Bench instance state (ready to use)
`~/onion-bench/prism/instances/OnionBench/.minecraft`: provisioned, mods installed,
`saves/onionbench` present (26 MB, from 21:54 worldgen), `config/defaultoptions/`
seeded, `options.txt` carries the bench pins (`maxFps:260`, `enableVsync:false`,
`renderDistance:8`, `simulationDistance:8`), `BENCH_VARIANT.txt` = `C1` (last applied).
PreLaunchCommand empty by design. MaxMemAlloc 8192. Launched offline as user `Tester`
via `~/onion-bench/launch-bench.sh` (DISPLAY=:1).
## Known open questions
1. WATUT crash root cause + fix path (top priority).
2. Identity of the 30 s RCON poller.
3. Whether uncommitted config re-saves should simply be checked out (recommended) —
and whether AkashicTome stripping comments matters for future edits (edit the
shipped source-of-truth, then expect the mod to re-serialize locally).
4. S2 Create floor: `/fill`-placed kinetic network may need motors re-placed by hand
(checklist in BENCH-MATRIX §2 step 2) — verify during S4 build.
5. B5 (SSRD/Sable airship decay) is scoped to fleet P0/P1 — needs a documented proxy
adaptation or a "deferred, fleet-only" note in results.
+75
View File
@@ -0,0 +1,75 @@
# Remaining plan (with current status)
The authoritative run sheet is `analysis/client-perf/BENCH-MATRIX.md` — read it fully
before benching. This file summarizes it, marks what's done, and adds proxy-machine
notes. **Win** = median p99 improves by more than the machine's B0 noise spread AND
1%-low does not worsen by more than the spread; ties keep upstream defaults.
Floors (fleet): P0 1%-low ≥ 30, P1/P2 ≥ 60 — on this proxy, floors don't map; use
relative wins only.
## Next actions, in order
1. **WATUT crash** (open): reproduce (repeated world loads in the OnionBench
instance), capture a crash report, then fix via config/patch/retry. Owner says
remove no mods. If unfixable, document a reliable workaround for bench runs.
2. **Verify uncapped frametimes**: one `run_scene.py --variant C1 --scene s1` run;
expect p99 well under 16.7 ms (vsync previously locked it). Do not proceed to B0
until FPS is visibly uncapped.
3. **Finish the bench world** (BENCH-MATRIX §2): build S4 — ONE Aeronautics ship
(~5×7×15, planks+glass+1 propeller) hovering y≈170, copied via Create schematic to
4 ships at z = 32/96/192/384; produce `bench-world-v1-s4-0/1/4.zip` copies.
Verify S2 shafts rotate (re-place motors by hand if the `/fill` network didn't
initialise) and S3 villager count. DH pregenerate per §2 step 5 (radius 256, tour,
`generatorPlan=DISABLED` afterwards). Leave world at S1, save, zip as
`bench-world-v1.zip` (record sha256).
4. **Run the matrix** B0 → B1 → B2 → B3 → B4 → B6 → B7 → B8 → B9 → B10 → B11 →
B12a → B12b → B13 → B14 (B5 deferred, fleet-only). Budget ≈25 h machine time.
Apply variants with `apply_variant.py`; relaunch per config change; scenes in
S1→S6 order per session; record with `--record`.
5. **Ship**: write winners into `proposed-configs/build.py` (DEFAULT/DECK/HIGH layers),
`build.py --ship`, `packwiz refresh`, commit (after `git checkout -- config/`).
Ship `config/modernfix-mixins.properties` **only if B6 passes** (see the `SHIP`
comment in `build.py`). New mod adds (B12b winners) ⇒ re-run B0 first.
6. **Report to owner**: B7 shader-policy data, B12b trial verdicts, B14 spawn-tuning
measurement, and any proxy-vs-fleet caveats.
## Matrix blocks (one line each; decision rules verbatim from BENCH-MATRIX §4)
| Block | Tests | Decision rule |
| --- | --- | --- |
| B0 | noise floor: C0 ×3 on S1 | defines each machine's win threshold; watch MemAvailable drift |
| B1 | baseline: C0 on S1–S6 | reference numbers only (startup, atlas, heap summary, VRAM) |
| B2 | composite: C1 / C1-deck / C1-high, all scenes | if C1 isn't a win on ≥2 machines, STOP and bisect via B3–B11 before shipping anything |
| B3 | DH: radius ladder + SSAO/quality/threads | per tier: largest radius meeting the floor on S1+S5; SSAO-off on a win; threads stay 2 unless 4 wins S5 w/o losing S1 |
| B4 | heap & GC: C1 × J0–J3, then heap 4/5/6 G | GC = best S5 1%-low; heap = smallest within winner's spread |
| B5 | Sable/SSRD sub-levels + decay (**fleet P0/P1 only**) | SSRD = largest meeting floor with 4 ships; sable-noshade only on win + acceptable looks; decay beyond spread = report, no config fix |
| B6 | ModernFix `dynamic_resources` | ship only if heap −300 MB or faster startup beyond spread AND zero missing textures AND 3 clean cold launches |
| B7 | shaders ×4 profiles on S2/S1/S4 | **data for owner, no auto-decision**; verify Flywheel backends drop under shaders; watch Iris #3164 corruption |
| B8 | entities: FA/Extensions, EMF LOD 20/8, LDL modes on S3 | smallest winning EMF LOD; cheapest winning LDL mode per tier |
| B9 | Flywheel lightSmoothness flat/C1/smooth on S2 | smoothest value meeting the floor, per tier |
| B10 | Sound Physics: spr-up/strict/nocap on S2s | adopt each winning change; listen for audio breakage |
| B11 | vanilla/Sodium: threads 3, blend 0/2, mip 4 | adopt only wins (S5 + not losing S1; mip4 needs VRAM ≤ 5.5 GB on P1) |
| B12a | added-mod ablation (BadOptimizations / Particle Core / Sodium Extra out) | keep unless removal wins or mod breaks something; Sodium Extra + RSO stay regardless |
| B12b | trial mods (Gnetum, Better Block Entities, Flerovium, Super Resolution, Ixeris, Iris Flywheel Compat, Cull Leaves) | add only on win w/o breakage via `packwiz modrinth add`; **new mod set ⇒ re-run B0**; not More Culling (excludes 1.21.1) |
| B13 | spark profile of worst B2 scene under C1 | flag any mod >5% of render-thread time that isn't Sodium/Iris/DH/Flywheel |
| B14 | spawn tuning: defaults vs shipped, river/jungle/warm ocean ×10 min | keep if totals drop and every species still appears; back off if one effectively disappears (SPAWN-TUNING §B14) |
## Scenes and JVM sets (fixed inputs)
- **S1** vista (terrain + DH) · **S2** Create floor, 2304 kinetic BEs · **S2s** = S2 +
24-sounds/tick storm · **S3** mob pen (30 villagers, allays w/ torches = moving LDL
sources) · **S4** 0/1/4 Sable airship sub-levels · **S5** 24-teleport tour, 120 s,
no warm-up discard · **S6** GUI/JEI overlay at S1.
- **J0** phase0 G1 baseline · **J1** brucethemoose G1 · **J2** generational ZGC ·
**J3** Shenandoah (plain; NOT `ShenandoahGCMode=iu` — aborts JDK 21). All parse-
checked on OpenJDK 21.0.12. Default heap here: 8 G (instance), matrix suggests 6 G
for P2 / 5 G for P0.
## Proxy-machine adaptations to document as you go
- B2's "≥2 machines" gate: run C1 vs C0 here; treat as single-machine evidence and
mark fleet confirmation as pending.
- B5 has no Sable-decay proxy path as specified — either adapt (4-ship scene exists
once S4 is built) or record as deferred.
- B4 heap ladder should use the instance's 8 G as the top rung.
- Absolute floors (30/60 fps) are fleet values; use relative wins on this box.
+76
View File
@@ -0,0 +1,76 @@
# Settled decisions, rules of the road, traps
## Owner decisions (2026-10-14) — settled, do not relitigate
1. **Delivery mechanism = Default Options** (+ enforced `config/modernfix-mixins.properties`
**after B6 passes**). Done in `a01bc3b`.
2. **Puzzles Lib 21.1.64** — done (bugfix only; no NeoForge perf change, LEVERS #14 corrected).
3. **Shaders: opt-in** (packwiz downloads them; nothing enables them). B7 produces the
policy data; owner decision still pending that data.
4. **Spawn tuning allowed if not detrimental to gameplay** — done, moderate
(`d80f85b`: alexsmobs/fowlplay/crittersandcompanions partial files). B14 measures it.
5. **Remove no mods.** LEVERS §5 removal candidates are reference only.
(This includes WATUT — so the WATUT crash must be fixed, not removed away.)
6. **Add any helpful mods** — the five Add-verdict mods went in `a01bc3b` (Sodium Extra,
Reese's Sodium Options, BadOptimizations, Particle Core, + Default Options).
Trial mods are B12b's call; the agent may add trial winners.
## Rules of the road (iteration rules from the journal)
- Change tuned defaults **only** via `analysis/client-perf/proposed-configs/build.py`
(DEFAULT / DECK / HIGH layers) → `build.py --ship` → `packwiz refresh` → commit.
Never hand-edit `proposed-configs/out/*` or shipped files.
- Shipped defaults are **copy-if-absent**: changes reach fresh installs only. Existing
players follow PLAYER-TUNING §1 (delete 7 re-seeding config files; do NOT delete
`options.txt`; set tier video values by hand).
- **`git checkout -- config/` before staging** — the server's mods re-save partial
spawn files in full on boot; committing those expansions is the known mistake.
- `packwiz update` in bulk resets hand-set `side = "server"` on **petprotect,
c2me-neoforge, noisium**. Single-mod updates are safe.
- Any new mod: verify NeoForge 1.21.1 build + `neoforge.mods.toml` ranges against pins,
check `side`, then **re-run B0** (new mod set invalidates the noise floor).
- One recorded commit per matrix row; label all data as **proxy-machine** data.
- Never kill the dedicated server (tmux `onion-mc`, repo root, port 25565) and never
touch `world/`. `sp-world.tar.gz` (650 MB, untracked) — leave alone.
- `.pi/journal.md` is the running log — append a session entry when you finish.
## Verified facts / traps (don't re-derive, don't re-trip)
- **packwiz `preserve`**: settable only by hand-editing `index.toml`; survives refresh
and unrelated updates; silently dropped if the file is absent/ignored at refresh
time; installer writes the file only if absent. Index files have no `side`, so
shipped configs land on the server too (this repo IS the server).
- **Default Options 21.1.8**: copy-if-absent for `config/defaultoptions/options.txt`
(key_ lines stripped) and `config/defaultoptions/extra/**`; runs before NeoForge
constructs mods — too late for `modernfix-mixins.properties` (hence B6 gating).
- Observed defaults were generated from the **same jar versions as current pins**
(DH 3.3.2, Sodium 0.8.13, EMF 3.3.9, Create 6.0.10/Flywheel 1.0.6, Sable 2.0.5,
SPR 1.5.1). DH `numberOfThreads` true default = ceil(nproc/2) = 4 here (observed 2
came from a 4-thread box).
- Flywheel 1.0.x **disables both GPU backends when any shaderpack is active**
(verified in `Backends.java`). No Iris Flywheel Compat in the pack (B12b trial).
- SSRD 1.8.7 → `config/ssrd-common.toml` (COMMON; server reads it too; slider floor 16).
LambDynamicLights 4.8.11 → `config/lambdynlights.toml` (lowercase modes).
SPR merges partial `sound_rates.properties` over generated defaults.
- **More Culling is unusable**: its NeoForge build declares `minecraft [1.21,1.21.1)`.
- `-XX:ShenandoahGCMode=iu` aborts JDK 21 without UnlockExperimentalVMOptions — J3 uses
plain `-XX:+UseShenandoahGC`.
- Prism 11 `--offline` fails a fresh instance ("Required libraries are missing");
launch online once, then offline works.
- `xdotool windowactivate --sync` hangs under kwin — use `windowactivate` +
`windowfocus`.
- MangoHud needs `MANGOHUD_CONFIG` explicit + LD_PRELOAD exported — use the wrapper
`~/.local/bin/mangohud-local`; system mangohud is not installed.
- cdn.modrinth.com 501s Range requests — download whole jars. No `unzip`; use python
zipfile. `lodestonelib` is the real slug (`lodestone` has no 1.21.1 build).
- Duplicate `version_number` traps: tarotcards-remastered, room-for-two, too-many-bows
reuse version strings across MC versions — pin exact filenames by hand.
- Iris 1.8.14-beta.1 ↔ Sodium 0.8.13 mixin incompatibility reported on NeoForge
(r5) — check when testing shaders (B7).
## Open owner-facing deliverables (owed from Phase 2)
- B7 shader-policy data → owner decision on default-off vs opt-in messaging.
- B12b trial-mod verdicts (which trials earned a permanent add).
- B14 spawn-tuning measurement (keep/back-off call).
- Any B13 "mod >5% of render thread" findings.
+60
View File
@@ -0,0 +1,60 @@
# Artifact map
Everything that exists because of this effort, with status. Paths relative to
`/home/logan/onion-mc` unless marked `~/` (= `/home/logan`).
## Repo — analysis/ (packwizignored; committed to git)
| Path | What | Status |
| --- | --- | --- |
| `analysis/state/` | **This capture.** Uncommitted yet — commit alongside next work. | current |
| `analysis/client-perf/HANDOFF.md` | Prior session's self-contained brief (2026-10-15). | committed `e5e369a` |
| `analysis/client-perf/BENCH-MATRIX.md` | **The run sheet**: §0 boot check, §1 fixed inputs, §2 bench world recipe, §3 config IDs, §4 B0–B14 + decision rules, §5 CSV format. | committed |
| `analysis/client-perf/LEVERS.md` | Ranked levers (meta M1–M3, tier 1–3), add/remove candidates, research corrections. §6 superseded by BENCH-MATRIX. | committed |
| `analysis/client-perf/PLAYER-TUNING.md` | Tier table (Deck/Mid/High), §1 file-reset for existing players, heap/GC, shader/RP guidance, Deck env vars. Values provisional until Phase 2. | committed |
| `analysis/client-perf/SPAWN-TUNING.md` | The shipped spawn tuning + B14 measurement plan. Header: "Unmeasured: bench block B14". | committed |
| `analysis/client-perf/README.md` | Phase 1 index + method/caveats. Minor staleness: says B0–B13, matrix has B14. | committed |
| `analysis/client-perf/notes-phase0-distill.md` | Distilled capture protocol from phase0 (uncapped, p99+1%low, warm-up discard, 3 runs, one variable; per-machine prep). | committed |
| `analysis/client-perf/notes-serverlog-triage.md` | Server-log triage: no missing-dep/mixin/ftbteams/YACL findings; 8 benign recipe-book ERRORs. | committed |
| `analysis/client-perf/proposed-configs/` | `build.py` (**single source of truth** for shipped defaults; BENCH variant layer; `--ship`), `apply_variant.py`, `README.md` (§1 M1 decision, §2 tiers, §3 key provenance), `templates/`, and `out/` (generated: tiers T-* and variants C0, C1, C1-deck, C1-high, dh-*, emf-*, fw-*, ldl-*, mf-*, opt-*, sable-*, sod-*, spr-*, ssrd-* + MANIFEST.md). | committed (out/ excluded) |
| `analysis/client-perf/harness/` | `run_scene.py` (variant→launch→scene→p99 pipeline; verified once), `rcon.py`. | committed `e5e369a` |
| `analysis/client-perf/bench/onion-bench/` | Bench datapack (pack_format 48): scene functions s1–s4 (+setups, storm, tour steps). S2/S3 exercised in game; S4 content unbuilt; full syntax never wholly verified. | committed |
| `analysis/client-perf/data/` | `jarscan.json`, `jarscan-report.md` (static mixin/atlas/model counts), `observed-default-configs/` (real defaults from same-version jars; reference for build.py). | committed |
| `analysis/client-perf/research/r1…r9-*.md` | Nine research briefs with confidence tags. | committed |
| `analysis/client-perf/proposed-changes/puzzles-lib-21.1.64.patch` | Applied already (in `a01bc3b`); kept as record. | committed |
| `analysis/audit/` | Static audit scripts: `fetch.py` (rebuild /tmp/onion/jars), `jarscan` inputs, `gen_fixes.py` (**generates the shipped Paxi onion-fixes datapack — edit this, not the JSON**), deps/collision/recipe chain tools. | committed |
| `analysis/archive/` | Finished 2026-09 reviews (README maps old paths). | committed |
| `analysis/FTB-XAERO-MAP-MIGRATION.md` | Pre-effort map migration doc. | committed |
## Repo — pack-facing (shipped to players)
| Path | What |
| --- | --- |
| `pack.toml`, `index.toml`, `packwiz.json`, `mods/*.pw.toml` (217) | packwiz manifest. |
| `config/defaultoptions/` | Default Options seeds (8 provisional mid-tier files, T-mid equivalent). |
| `config/alexsmobs-common.toml`, `config/fowlplay.json5`, `config/crittersandcompanions-common.json5` | Enforced partial spawn tuning (`d80f85b`). **Local copies currently re-saved-in-full by mods — do not commit.** |
| `config/paxi/datapacks/onion-fixes/` | Recipe-collision fixes, generated by `analysis/audit/gen_fixes.py`. |
| `config/akashictome-common.toml` | Curated guidebook whitelist. Local copy re-serialized by mod (whitelist intact). |
| `phase0/P0-steamdeck.md`, `P1-windows-7700k-1060.md`, `P2-linux-6700k-1080ti.md` | Per-fleet-machine measurement plans. **Machines unreachable** — status: plan only. |
| `tools/` | Map-migration/UUID/RCON utilities (pre-effort). `tools/rcon.py` is a candidate for the mystery 30 s poller. |
| `.pi/journal.md` | The running work log — the richest source; read the last three sessions. |
## Outside the repo — bench machine
| Path | What | Status |
| --- | --- | --- |
| `~/onion-bench/prism/` | Bench Prism data dir (`-d`). Instance `OnionBench`: `.minecraft` provisioned, `saves/onionbench` (26 MB), Default Options seeded, bench pins in options.txt, `BENCH_VARIANT.txt = C1`. MaxMemAlloc 8192. | ready |
| `~/onion-bench/server-bench/` | Temp NeoForge server that generated the bench world; `benchworld/` = world source (S1–S3 built; S4 missing). | ready, incomplete |
| `~/onion-bench/mangologs/` | MangoHud frametime CSVs (2 glxgears sanity, 3 java runs incl. one truncated). | data |
| `~/onion-bench/harness-results.csv` | The single C1/S1 result row (vsync-locked, non-decision-grade). | data |
| `~/onion-bench/launch-*.sh` | Launch wrappers (DISPLAY=:1, XAUTHORITY, DRI_PRIME=1, offline `Tester`). | ready |
| `~/.local/mangohud` + `~/.local/bin/mangohud-local` | User-local MangoHud 0.8.4 + wrapper (vblank off, fps_limit=0, CSVs to mangologs). | ready |
| `~/onion-bench/*.out`, `mc-menu-*.png`, `/tmp/mangohud.pkg.tar.zst`, `/tmp/cac-*.json5` | Session debug scraps. | ignorable |
| `/tmp/onion/jars` | Static-analysis jar cache. | **gone** (ephemeral; `analysis/audit/fetch.py` rebuilds — only needed for jarscan re-runs) |
| tmux session `onion-mc` | The live dedicated server (java PID 1699563). | **running — leave alone** |
## Repo — runtime (never commit / never touch)
`world/`, `libraries/`, `logs/` (latest.log + debug.log = the 21:01 server run),
`crash-reports/` (2026-10-14 crash = fixed CAC bug), `server.log`, `cache/`,
`config/*.toml.bak`, `config/spark/tmp-client/*`, `sp-world.tar.gz`, `usercache.json`.
+47
View File
@@ -0,0 +1,47 @@
# Onion MC — optimization effort: state capture
Captured **2026-10-14 ~23:45 EDT** (Manjaro bench machine), at git **HEAD `e5e369a`**
(`chore(bench): add client bench harness and Phase 2 handoff`), branch `main`, pushed.
Pack: **217 mods**, MC **1.21.1**, NeoForge **21.1.251**.
## Where we are (one paragraph)
The client-performance initiative is in **Phase 2 (benchmarking)**, which has just
begun and was interrupted mid-setup. Static analysis (Phase 1), the tuned-config
generator, the owner's decisions, and the first wave of perf-mod adds are **done and
shipped** (`a01bc3b`, `d80f85b`). The client **boots clean**; the dedicated server
**boots clean** (a live idle instance from the boot check is still running in tmux —
leave it alone). The bench harness works end-to-end but has produced exactly **one
non-decision-grade measurement** (C1/S1, vsync-locked ~60 fps). The bench world has
scenes S1–S3 built; **S4 (airships) is not built**. **Matrix blocks B0–B14 have not
run at all.** The one known open defect is an **intermittent WATUT world-load crash**.
Immediate next actions: resolve/work around WATUT → confirm uncapped frametimes →
finish S4 → run B0→B14 → write winners into `build.py` → ship → report to owner.
## Reading order
| File | Contents |
| --- | --- |
| [`01-pack-and-environment.md`](01-pack-and-environment.md) | What the pack is, repo conventions, this machine's inventory, tool paths |
| [`02-timeline.md`](02-timeline.md) | How the effort got here: phases, commits, decisions |
| [`03-current-state.md`](03-current-state.md) | Exact current step, done/open/blocked, interrupted-session artifacts and evidence |
| [`04-plan.md`](04-plan.md) | The remaining plan with per-step status, B0–B14 run sheet summary, ship procedure |
| [`05-decisions-and-rules.md`](05-decisions-and-rules.md) | Settled owner decisions, rules of the road, traps and gotchas |
| [`06-artifact-map.md`](06-artifact-map.md) | Every artifact, where it lives, what it is, current status |
## Authoritative sources this capture distills
- `.pi/journal.md` — the running work log (read the last three sessions first).
- `analysis/client-perf/HANDOFF.md` — prior session's own handoff brief.
- `analysis/client-perf/BENCH-MATRIX.md` — **the run sheet**; when this capture and
the matrix disagree, the matrix wins.
- `analysis/client-perf/LEVERS.md` — ranked levers with verification notes.
- `phase0/P0|P1|P2-*.md` — per-fleet-machine measurement plans (machines unreachable).
## For the incoming agent
Start at `03-current-state.md`, then `04-plan.md`. Do the next actions in
`04-plan.md` §"Next actions" **in order**. Before touching anything, read
`05-decisions-and-rules.md` — several rules exist because a previous session already
made the mistake once (config re-save commits, packwiz `side` resets, vsync-locked
data). Append your session to `.pi/journal.md` when you finish.
+5
View File
@@ -844,6 +844,11 @@ file = "mods/mezzconfig.pw.toml"
hash = "efad386063cb79013d7522fcc5b5879c5c3cd556e83bd41a56980632827b45b2" hash = "efad386063cb79013d7522fcc5b5879c5c3cd556e83bd41a56980632827b45b2"
metafile = true metafile = true
[[files]]
file = "mods/midnightlib.pw.toml"
hash = "f7198ef16f4eefbe80ffd1d8ac7c2d323da4e68faf916a8b4b9c3e40f0913b80"
metafile = true
[[files]] [[files]]
file = "mods/miners-delight.pw.toml" file = "mods/miners-delight.pw.toml"
hash = "13481133d139f134bd3407983e29f86df835ff66bacb013d9d43e14f155241f4" hash = "13481133d139f134bd3407983e29f86df835ff66bacb013d9d43e14f155241f4"
+13
View File
@@ -0,0 +1,13 @@
name = "MidnightLib"
filename = "midnightlib-neoforge-1.10.0+1.21.1.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/codAaoxh/versions/vcVnfiCM/midnightlib-neoforge-1.10.0%2B1.21.1.jar"
hash-format = "sha512"
hash = "9586940ec144452577455b61fd7c9f7ee123044a47255f9425be1bfcd4e842d5902b66c7f5546540281cad8c12e30d38fc29e8fb3aa3cb592ed13ff430316e68"
[update]
[update.modrinth]
mod-id = "codAaoxh"
version = "vcVnfiCM"
+1 -1
View File
@@ -6,7 +6,7 @@ pack-format = "packwiz:1.1.0"
[index] [index]
file = "index.toml" file = "index.toml"
hash-format = "sha256" hash-format = "sha256"
hash = "121d9177b8ca74535005b85160a3e314bc9c95f8c87671b3d6947cb8d52c37e1" hash = "a541a5c87ef6ab98ce6c87526cc192e19ba9cccdbf197388de1394dfb1124a8b"
[versions] [versions]
minecraft = "1.21.1" minecraft = "1.21.1"