# 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.