From a84319bb2f5162eb11711354b2890588d2bc1d78 Mon Sep 17 00:00:00 2001 From: Logan Date: Thu, 15 Oct 2026 17:07:52 -0400 Subject: [PATCH] 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). --- .pi/journal.md | 27 +++++++ analysis/state/01-pack-and-environment.md | 73 ++++++++++++++++++ analysis/state/02-timeline.md | 45 ++++++++++++ analysis/state/03-current-state.md | 90 +++++++++++++++++++++++ analysis/state/04-plan.md | 75 +++++++++++++++++++ analysis/state/05-decisions-and-rules.md | 76 +++++++++++++++++++ analysis/state/06-artifact-map.md | 60 +++++++++++++++ analysis/state/README.md | 47 ++++++++++++ index.toml | 5 ++ mods/midnightlib.pw.toml | 13 ++++ pack.toml | 2 +- 11 files changed, 512 insertions(+), 1 deletion(-) create mode 100644 analysis/state/01-pack-and-environment.md create mode 100644 analysis/state/02-timeline.md create mode 100644 analysis/state/03-current-state.md create mode 100644 analysis/state/04-plan.md create mode 100644 analysis/state/05-decisions-and-rules.md create mode 100644 analysis/state/06-artifact-map.md create mode 100644 analysis/state/README.md create mode 100644 mods/midnightlib.pw.toml diff --git a/.pi/journal.md b/.pi/journal.md index ac565d1..31a6236 100644 --- a/.pi/journal.md +++ b/.pi/journal.md @@ -448,3 +448,30 @@ uncapped frametimes, then run B0→B14 per `BENCH-MATRIX.md`. ### Pushed `8e8483d` (owner, CAC keys). This session's analysis/harness commit follows; it touches no 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. diff --git a/analysis/state/01-pack-and-environment.md b/analysis/state/01-pack-and-environment.md new file mode 100644 index 0000000..2cbc928 --- /dev/null +++ b/analysis/state/01-pack-and-environment.md @@ -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 + `` from `proposed-configs/out//` into the game dir and writes + `BENCH_VARIANT.txt`. **Relaunch for every config change.** diff --git a/analysis/state/02-timeline.md b/analysis/state/02-timeline.md new file mode 100644 index 0000000..0afda92 --- /dev/null +++ b/analysis/state/02-timeline.md @@ -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). diff --git a/analysis/state/03-current-state.md b/analysis/state/03-current-state.md new file mode 100644 index 0000000..d2673c7 --- /dev/null +++ b/analysis/state/03-current-state.md @@ -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.` → `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. diff --git a/analysis/state/04-plan.md b/analysis/state/04-plan.md new file mode 100644 index 0000000..c6e618c --- /dev/null +++ b/analysis/state/04-plan.md @@ -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. diff --git a/analysis/state/05-decisions-and-rules.md b/analysis/state/05-decisions-and-rules.md new file mode 100644 index 0000000..83a2bf4 --- /dev/null +++ b/analysis/state/05-decisions-and-rules.md @@ -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. diff --git a/analysis/state/06-artifact-map.md b/analysis/state/06-artifact-map.md new file mode 100644 index 0000000..9eb82f1 --- /dev/null +++ b/analysis/state/06-artifact-map.md @@ -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`. diff --git a/analysis/state/README.md b/analysis/state/README.md new file mode 100644 index 0000000..c418a95 --- /dev/null +++ b/analysis/state/README.md @@ -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. diff --git a/index.toml b/index.toml index 68a8871..b70ee13 100644 --- a/index.toml +++ b/index.toml @@ -844,6 +844,11 @@ file = "mods/mezzconfig.pw.toml" hash = "efad386063cb79013d7522fcc5b5879c5c3cd556e83bd41a56980632827b45b2" metafile = true +[[files]] +file = "mods/midnightlib.pw.toml" +hash = "f7198ef16f4eefbe80ffd1d8ac7c2d323da4e68faf916a8b4b9c3e40f0913b80" +metafile = true + [[files]] file = "mods/miners-delight.pw.toml" hash = "13481133d139f134bd3407983e29f86df835ff66bacb013d9d43e14f155241f4" diff --git a/mods/midnightlib.pw.toml b/mods/midnightlib.pw.toml new file mode 100644 index 0000000..55e92a3 --- /dev/null +++ b/mods/midnightlib.pw.toml @@ -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" diff --git a/pack.toml b/pack.toml index f3fc44e..23d58a2 100644 --- a/pack.toml +++ b/pack.toml @@ -6,7 +6,7 @@ pack-format = "packwiz:1.1.0" [index] file = "index.toml" hash-format = "sha256" -hash = "121d9177b8ca74535005b85160a3e314bc9c95f8c87671b3d6947cb8d52c37e1" +hash = "a541a5c87ef6ab98ce6c87526cc192e19ba9cccdbf197388de1394dfb1124a8b" [versions] minecraft = "1.21.1"