Files
onion-mc/.pi/journal.md
T
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

28 KiB
Raw Blame History

Onion MC — work journal

Session 2026-10-06 — 60-mod expansion, integration review

What this is

Onion MC, a curated Minecraft modpack managed with packwiz.

  • Minecraft 1.21.1, NeoForge 21.1.251
  • 209 mods (was 149 four commits ago)
  • packwiz lives at ~/go/bin/packwiz — not on PATH
  • Remote: ssh://git.ljones.me:2222/logan/onion-mc.git, branch main
  • Commit style: Conventional Commits, imperative subject, body explains why
  • The repo doubles as a server directory (.packwizignore excludes libraries/, world*/, logs/, crash-reports/, *.jar, run.sh). Never blanket-un-ignore anything there — you will index runtime junk.

Environment (checked 2026-10-06)

  • This machine is NixOS: no java on PATH; use nix shell nixpkgs#jdk21 for anything server-side. No server is installed in the repo yet (no libraries/, run.sh, or NeoForge jar).
  • Client = Prism instance ~/.local/share/PrismLauncher/instances/Onion MC/. Its pre-launch hook runs packwiz-installer-bootstrap against https://git.ljones.me/logan/onion-mc/raw/branch/main/pack.toml, so launching it pulls the pushed pack. Last launch (logs/latest.log) is 2026-09-24, i.e. before all five commits below — confirms the expansion has never been booted.
  • .pi/ is in .packwizignore, so this journal never ships.

State

Five commits, all pushed to main, HEAD = e36bff8:

Commit Contents
455e398 14 client-side mods + 12 libraries
b6ebdb8 11 Farmer's Delight addons + 4 decoration + 4 pet/mob
e371e51 15 gameplay/media/social
387ee1e config policy change + PetProtect default
e36bff8 Akashic Tome whitelist config

Verified after each stage: mod set matches intent exactly (nothing auto-added by packwiz, nothing missing, nothing removed), index.toml hash matches pack.toml.

Two configs ship (new capability — see policy in gotchas):

  • config/petprotect.json
  • config/akashictome-common.toml

Goal

A working, well-integrated 209-mod pack:

  1. Boots clean on client and dedicated server — no mixin failures, no missing deps.
  2. No duplicate systems — the pack has a history of removing them (FTB Chunks → Open Parties and Claims; FTB Quests/Teams/XMod Compat deleted). New mods must not reintroduce overlapping mechanics without a reason.
  3. No broken recipe chains — every consumed item stays obtainable.
  4. Performance held — Sodium, Iris, ImmediatelyFast, EntityCulling, ModernFix, FerriteCore, Distant Horizons mandatory, C2ME/Noisium server-side, Dynamic FPS.
  5. Tested, not assumed — nothing has been booted yet.

Decisions made — do not relitigate without cause

Excluded candidates:

  • sable_beyond — every 1.21.1 build is alpha; wide Create/Aeronautics sublevel-mass mixin surface. Owner's call.
  • expanded-delight — beta-only, built against FD 1.2.4 (pack runs 1.3.4); sweet potato / cranberry / peanut / chili / cinnamon / salt duplicate kept mods.
  • hearth-and-harvest — no per-crop config, so corn/peanut/cotton/salt/blueberry dupes couldn't be trimmed. Dropping it also removed two cutting-board collisions (wheat, sunflower).
  • display-delight — zero risk but ~250 plate items incl. dishes from Delight mods we don't run. Could be added any time.

Rustic Delight dedupe declined. Its flags are whole content-family switches:

  • enable_cotton — only dupe partner was hearth-and-harvest (not added).
  • enable_coffee — real dupe vs extradelight, but cascades into coffee-braised beef, Haste potions, cherry-blossom/syrup chains.
  • squids_drop_calamari — also strips calamari from creative tab and villager trades; enable_fried_foods depends on it. Remaining "duplicates" are tag-merged (c:crops/coffee_beans etc.) and benign.

Kept after being flagged:

  • Grassier Grass — reported shader breakage is Rethinking Voxels-specific; issue lists Complementary Reimagined (what we ship) as working. BSL bug is separate.
  • Perception — OctoLib/ShatterLib is a maintained zero-dep lib; trails are particles, shake is camera; jar has no shader/post-process assets.

Open questions for the owner

  1. Potato cutting-board collision → needs a datapack loader. Only real unresolved defect. c:crops/potato + knife matches both extradelight:cutting/sliced_potato (4×) and moredelight:cutting/diced_potatoes (1×). Neither output is obtainable otherwise; they feed 4 and ~10 recipes. The losing chain breaks permanently. Fix: rewrite both recipes to emit the combined output via a datapack loader reading from config/ (Paxi or Global Packs) — a new mod, awaiting approval.
  2. Keep PetProtect? With both protection flags off it only stops pets being provoked into fights. Dropping it + config restores vanilla retaliation; Pet Cemetery works alone.
  3. Keep mystical-oak-tree? Costs Moonlight (2.3 MB) for a 1-in-280-chunk feature — near-zero value on a pre-generated map. Offered to exclude.
  4. Rustic Delight coffee flag — one line, if the second coffee should go.
  5. display-delight — add later, or not.

Known and potential conflicts

Area State
PetProtect ↔ Pet Cemetery Resolved only by the shipped config. isInvulnerableTo gates on prevent_pet_damage alone, so disabling prevent_pet_death alone leaves pets immortal. Both flags false. Delete the config and Pet Cemetery is dead weight.
extradelight recipe overrides 169 files under data/farmersdelight/recipe/, ~25 path-colliding with FD's own. Live, ungated. FD recipe book changes noticeably.
Twilight Forest stripping (16 pairs) farmers-cutting-twilight-forest and twilight-delight both cut TF logs into stripped_X + tree_bark. Identical outputs — harmless. Pre-existing.
Curios slot merging artifacts, too-many-bows, tarotcards-remastered, mermod define player slots, no replace. Should merge — verify in game once.
Sophisticated Core disc handlers Verified clean: first-supports-wins, predicates disjoint.
dungeons_delight 29 vanilla mixins incl. BlockBehaviourMixin/LevelRendererMixin. Broadest surface added. Untested vs ModernFix/Sodium.
fowlplay spawning ~13 bird species via NaturalSpawnerMixin — spawns in already-generated chunks. Watch tick time.
fishermans-haven Lighthouse spacing 9/separation 6 (dense); several biome modifiers use bare un-namespaced biome IDs (may log errors / silently not spawn). Salt lakes in every biome via neoforge:any.
extradelight legacy forge/ biome modifiers Inert on NeoForge (working neoforge/ copies exist). Harmless.
etched ↔ music-disc-maker No code conflict (mixin points re-verified), but duplicate content: two blank discs, two boomboxes, two 9-disc albums, two recording pipelines. Design decision.
Tag merges Several mods write the same c: crop tags (3 garlics, 3 peanuts, 3 salts, 2 corns…). Benign. Bell pepper and citrus NOT merged (crops/bellpepper vs crops/bell_pepper, crops/lemon vs foods/fruits/lemon).

Not verified — nothing has been booted

All findings are static analysis (jars, bytecode, data files, Modrinth API). Untested:

  • Whether the pack boots at all, client and server.
  • dungeons_delight's 29 mixins vs the perf stack.
  • Grassier Grass vs Complementary Reimagined and MakeUp Ultra Fast (MakeUp untested by anyone).
  • Whether Terralith biomes carry #c:is_* / #minecraft:is_overworld tags that wild-crop/tree biome modifiers key off (generation density only).
  • Whether fishermans-haven's bare-ID biome modifiers parse.
  • Whether extradelight's inline-feature neoforge: biome modifiers place.
  • Whether extradelight's cookbook opens (ships patchouli_books/cookbook2/ dirs but no book.json). The item itself is real.
  • room-for-two (beta; compat untested by author) and petprotect (beta).
  • PetProtect edge case: logging out while downed may lose items (upstream #184, 1.19.2, never fixed).
  • Curios slot merge rendering all four mods' slots.

Method notes and gotchas

  • packwiz side quirk: only client-only mods are special-cased; mods with client_side: unsupported still get side = "both". petprotect manually set to side = "server" (as c2me-neoforge and noisium already were). packwiz update rewrites metafiles and resets these.
  • Config policy is opt-in. .packwizignore ignores config/* and defaultconfigs/*; shipping a file needs !config/<file> at the bottom (last match wins), after the blanket *.json rule.
  • Duplicate version_number traps: tarotcards-remastered, room-for-two, too-many-bows reuse version strings across 1.21.1 / 1.21.11 / 26.x. Pin exact filenames by hand.
  • Undeclared deps on Modrinth: perception → shatterbyte-lib (OctoLib), dungeons_delight → runiclib. mystical-oak-tree → moonlight is declared in the jar but not the API.
  • cdn.modrinth.com returns HTTP 501 to Range requests — download whole jars. unzip is not installed; use python3 -c "import zipfile...".
  • lodestonelib is the real slug; lodestone has no 1.21.1 build.
  • FINDINGS.md, MODLIST-GROUPS.md, MODLIST-REVIEW.md are untracked, packwizignored, and ~60 mods stale. They hold the FTB-swap reasoning, OPAC config decisions and the original per-mod compat audit — refresh, don't re-derive.

Next steps, in order

  1. Boot the pack. Client first (launch the Prism instance — it self-updates from the pushed pack.toml), then the dedicated server.
  2. Check logs for: missing deps, mixin apply failures, fishermans-haven biome-modifier parse errors, anything referencing dev/ftb/mods/ftbteams (soft-dep risk from the FTB removal).
  3. Smoke-test: Grassier Grass + Complementary Reimagined, dungeons_delight mixins, curios slots, Pet Cemetery death→collar loop.
  4. Watch tick time and entity counts (fowlplay, fishermans-haven, mooblooms).
  5. Bring open questions to the owner, potato collision first.

Static audit 2026-10-06 (all 209 jars + vanilla + NeoForge data)

Scripts/output: analysis/audit/ (jars cached in /tmp/onion/jars, ephemeral). Deps clean (no missing/out-of-range/incompatible; lambdynlights_runtime is a false positive — nested under META-INF/jars). No item-tag load failures.

Corrections to the handoff:

  • Potato board collision is 3-way: + rusticdelight:potato_slices (81 consuming recipes, board-only source). Vanilla getRecipesFor sorts by result translation key, so extradelight:sliced_potato likely wins; rustic + moredelight lose. moredelight diced potatoes/bread slices still reachable via Create saw.
  • New: bread + knife → extradelight vs moredelight bread slice.
  • rusticdelight tags potato_slices as c:crops/potato (re-cut/dupe loop); veggiesdelight tags sweet potato there too. rustic coffee beans sit in both c:crops/coffee and c:crops/coffee/cooked.
  • extradelight disables 14 FD recipes (relocated to oven/mixing bowl/feast/ chiller — all still obtainable); FD beef_stew is rustic-live vs extradelight-disabled → load order decides.

Crafting-grid collisions (one output uncraftable): dungeonsdelight vs twilightdelight TF knives (×4); dungeonsdelight vs frightsdelight crates (×2); extradelight vs fruitsdelight apple crate, vs hamsterpets cucumber crate; coffee bag/sack/crate; comforts sleeping bag (vertical) vs handcrafted sheet; fishermans worms can → own worm vs aquaculture worm. Pre-existing: handcrafted wood plate vs 17 TF drying racks; create vs TF copper nugget (tag-unified, harmless).

Fix pass 2026-10-06 — pushed as fc649b4 (on top of e7d6691)

  • Added Paxi 5.1.3 (only dep YUNG's API, already present; injects packs at TOP).
  • Datapack config/paxi/datapacks/onion-fixes/ (43 files), generated by analysis/audit/gen_fixes.py — edit the script, not the JSON. Shipped via a dir-by-dir re-include chain at the bottom of .packwizignore (packwiz's matcher needs negations without trailing slashes or it SkipDirs the parent).
  • Re-audit with the pack on top: all real collisions gone. Remaining flags are benign (dough shaping UI, mixing-bowl fluid variants, Aquaculture Delight neptunium tiering, Create/TF copper nugget).
  • Correction: rustic potato_slices has 3 direct consumers, not 81 (81 was via the polluted c:crops/potato tag).
  • c:crops/potato and c:crops/coffee/cooked now use replace: true — any future mod adding to them must be added to gen_fixes.py.
  • Orphaned on purpose (uncraftable, still uncraftable-from): dungeonsdelight TF knives + crates, hamster cucumber crate, fruitsdelight apple crate. Consider hiding them in JEI.
  • Needs in-game check: /datapack list shows onion-fixes (pink), recipes in JEI.
  • Rebased over upstream 0adfb6c (Icy's Better Horses + Modonomicon, 212 mods); re-audit clean. Note: Better Horses' modId is icys_better_horses but it registers under icys-better-horses — the audit's absent-mod check flags it falsely.

Session 2026-10-14 — client performance analysis, Phase 1 (static baseline)

HEAD aa1d273 (212 mods), unchanged. Nothing committed, nothing changed in the pack. All output is in analysis/client-perf/ (untracked; analysis/ is packwizignored).

What exists now

  • analysis/client-perf/LEVERS.md — the deliverable: ranked levers (Tier 1–3), meta-levers, add/remove candidates, Phase 2 test order, corrections to the subagent research. Read this first.
  • analysis/client-perf/README.md — index and method.
  • scripts/jarscan.py + scripts/report.py → data/jarscan.json, data/jarscan-report.md. Parses class-file annotations for real @Mixin targets and injector kinds, per-frame/tick event refs, atlas px (one frame per animated texture), models, shaders, sounds and entities. It skips the Fabric-only nested jars of multi-loader jars (DH, LambDynamicLights). Runs in ~35 s over /tmp/onion/jars (ephemeral; refetch with analysis/audit/fetch.py; resource and shader packs were also dropped there).
  • data/observed-default-configs/: generated configs copied from the Prism instance's last launch (2026-09-24, the older 110-mod pack). They are the real-default reference (DH, Sodium, EMF, ModernFix, Flywheel, Sable, SPR…).
  • research/r1..r9-*.md: nine subagent briefs with confidence tags and URLs.

Key facts established (verified)

  • 951 per-frame mixin classes (121 Overwrite/Redirect); top: Sable 127, Iris 114, Controlify 84 (GUI), Sodium 48, EMF 42.
  • Handcrafted + Chipped + Rechiseled = 58% of the block atlas and 62% of the 69k models.
  • Flywheel 1.0.x disables both GPU backends when any shaderpack is active (checked in Backends.java). The pack has no Iris Flywheel Compat.
  • DH defaults: LOD radius 256, SSAO and AA on, 2 worker threads. EMF animationFrameSkipDuringIrisShadowPass is already true. ModernFix dynamic_resources is off by default. Flywheel lightSmoothness = SMOOTH.
  • Sable renders each sub-level by re-driving Sodium's chunk renderer. sub_level_skylight_shadows=false by default; Iris #3164 (sub-level corruption with shadows) is open.
  • Chipped requires Athena and Rechiseled requires Fusion, so neither CTM engine is removable. Lodestone is required only by Miner's Delight.
  • Puzzles Lib 21.1.64 has an event-dispatch caching fix; the pack pins 21.1.62.
  • Shaders and resource packs are opt-in in practice (the last launch had none enabled). The pack ships no perf config, and JVM/heap is per-player Prism (old instance: 8 GB, stock G1).

Decisions pending (owner)

  1. Delivery mechanism for tuned defaults: Default Options mod (Balm is already present) vs packwiz preserve = true (semantics with packwiz refresh unverified).
  2. Shader policy: default off / opt-in per machine?
  3. Server-side spawn tuning (Alex's Mobs #62, Fowlplay #214, Critters & Companions datapack).
  4. Removal candidates: Miner's Delight (drops Lodestone), Fowlplay, Charta, WATUT, Emojiful.
  5. Add candidates: Default Options, Sodium Extra + Reese's Sodium Options, Particle Core, BadOptimizations; trials: Gnetum, Better Block Entities, Flerovium, Super Resolution (Deck), Ixeris (P1), Iris Flywheel Compat.

Next steps

  • Phase 2 = benchmark per LEVERS.md §6 using the phase0/ harness (P0 Deck, P1 7700K/1060, P2 6700K/1080 Ti with 8 GB RAM free). Capture the atlas size, heap and startup time at baseline.
  • Before benchmarking: the pack has never booted at this mod count (see the 2026-10-06 session), so do a boot/log check first.
  • Free change regardless of benchmarks: bump Puzzles Lib to 21.1.64.

Session 2026-10-14 (b) — client perf Phase 1b: delivery, staged configs, bench matrix

HEAD aa1d273, unchanged. Nothing committed; zero tracked-file changes; no mods added/removed. All output is under analysis/client-perf/ (untracked, packwizignored).

Produced

  • proposed-configs/ — build.py generates player tiers (out/T-default|deck|mid|high) and 32 bench variants (out/C0, C1, dh-*, fw-*, …) from same-version observed defaults or source-verified templates. The build fails if an override names a key that isn't in the base, so key confirmation is enforced. README §1 = M1 decision, §2 = tier table, §3 = key provenance.
  • BENCH-MATRIX.md — replaces LEVERS §6: bench world recipe, scenes S1–S6, JVM sets J0–J3, blocks B0–B13 with decision rules and budget (~25 h machine time).
  • bench/onion-bench/ — datapack (pack_format 48): scene teleports, /fill Create grid (2,304 kinetic BEs), mob pen, a 24-sounds/tick storm, and a 120 s teleport tour. Never run in game: syntax unverified, and the S2 /fill-placed kinetic network may need motors re-placed by hand (checklist in matrix §2).
  • PLAYER-TUNING.md — tiers, heap/GC, shader and RP guidance, Deck env vars.
  • proposed-changes/puzzles-lib-21.1.64.patch — git apply --check passes on HEAD. It touches only puzzles-lib.pw.toml + index/pack hashes. A single-mod packwiz update puzzles-lib does not reset the side fields on petprotect, c2me or noisium; only those three are at risk, from bulk updates. Its only dependent is HeldItemTooltips, range [21.1.1,).

Verified this session (don't re-derive)

  • packwiz preserve (packwiz ef87d96 = the installed binary; installer v0.5.14 = the Prism jar): settable only by hand-editing index.toml. It survives refresh, content change and unrelated update (tested). It is silently dropped if a refresh runs while the file is absent or ignored. The installer writes the file only if it's absent. A skipped file re-logs "invalidated" every launch, and removing a file the installer wrote deletes the player's copy. Index files have no side, so they also land on the server (this repo is the server dir).
  • Default Options 21.1.8: copy-if-absent for config/defaultoptions/options.txt (key_ lines stripped) and config/defaultoptions/extra/**. Runs at GameConfig.<init>: before NeoForge constructs mods (ClientModLoader.begin is inside Minecraft.<init>), but after mixin bootstrap, so too late for modernfix-mixins.properties. Balm [21.0.39,); the pack has 21.0.66.
  • Observed defaults come from the same jar versions as the 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). All 172 DH values match Config.java @ 3.3.2, except DH numberOfThreads: the true default is ceil(nproc/2) = 4 on the fleet (the observed 2 came from this 4-thread box). serverId is per-install random and is stripped from shipped files.
  • SSRD 1.8.7 config = config/ssrd-common.toml (COMMON; the server reads it too). physicsRenderDistance defaults to 128, slider floor 16.
  • LambDynamicLights 4.8.11 = config/lambdynlights.toml; mode is lowercase off/fastest/fast/fancy; [light_sources] entities.
  • SPR merges a partial sound_rates.properties over its generated defaults. Sounds over the cap play without physics; they are not dropped.
  • Puzzles Lib 21.1.64 has no perf change on NeoForge: FabricEventFactory isn't in the NeoForge jar. The 62→64 diff is access transformers plus one class. LEVERS #14 is corrected.
  • r6's -XX:ShenandoahGCMode=iu aborts JDK 21 without UnlockExperimentalVMOptions (tested). GenZGC and the brucethemoose G1 set parse cleanly.

Owner decisions pending (presented 2026-10-14)

  1. Approve Default Options as the delivery mechanism, plus enforced modernfix-mixins.properties. This is a mod add plus 3 .packwizignore lines (drafted in proposed-configs README §1).
  2. Apply the Puzzles Lib patch (bugfix only).
  3. Shader policy (B7 produces the data).
  4. Server spawn tuning (Alex's Mobs / Fowlplay / Critters & Companions).
  5. Removal candidates (Miner's Delight → Lodestone, Fowlplay, Charta, WATUT, Emojiful).
  6. Add candidates (Sodium Extra + RSO, Particle Core, BadOptimizations; trials). These gate B12.

Next steps

  1. Boot check (matrix §0). Nothing else can proceed until the pack boots.
  2. Build the bench world on P2 (matrix §2); fix any datapack parse errors on /reload.
  3. Run B0 → B13; write the winners into build.py; regenerate; then ship via the approved mechanism. Existing players need the file-reset step in PLAYER-TUNING §1.

Session 2026-10-14 (c) — owner decisions applied, pushed for the client machine

The owner answered the pending list; this session acted on it, committed, and pushed. The next agent works on a machine that can run the client. This machine is NixOS with no java, no client and no unzip. Those notes are machine-specific; check what the new machine has.

Owner decisions (2026-10-14), now settled

  1. Delivery = Default Options (+ enforced modernfix-mixins.properties after B6). Done.
  2. Puzzles Lib → 21.1.64. Done (bugfix only).
  3. Shaders: opt-in (already the case: packwiz downloads them, nothing enables them).
  4. Spawn tuning allowed if not detrimental to gameplay. Done, moderate (below).
  5. Remove no mods. LEVERS §5 is reference only.
  6. Add any helpful mods. Added the five "Add" verdicts. Trials are left to bench B12b, and the agent may add trial winners.

Commits (all pushed to main; Prism instances self-update from it)

  • a01bc3b feat(perf): Default Options + config/defaultoptions/ (8 provisional mid-tier files from build.py --ship); Sodium Extra 0.9.4, Reese's Sodium Options 2.2.4, BadOptimizations 2.4.1, Particle Core 0.3.3 (all side = "client"; deps already present); Puzzles Lib 21.1.64. 217 mods.
  • 5919955 chore: stale reviews archived to analysis/archive/ (README maps old paths); intermediates and API dumps deleted; *.tar.gz gitignored.
  • d80f85b feat(config): spawn tuning, enforced partial files config/alexsmobs-common.toml, config/fowlplay.json5, config/crittersandcompanions-common.json5. See analysis/client-perf/SPAWN-TUNING.md.
  • docs commit: analysis/client-perf/ (minus the generated out/), analysis/audit/ (incl. gen_fixes.py, which builds the shipped Paxi datapack and was never tracked before), phase0/, and this journal.

Rules of the road for the iteration

  • Change tuned defaults only through analysis/client-perf/proposed-configs/build.py (DEFAULT / DECK / HIGH), then build.py --ship, then ~/go/bin/packwiz refresh (wherever packwiz lives on that machine), then commit.
  • Shipped defaults are copy-if-absent. Changing them reaches fresh installs only; existing players use PLAYER-TUNING §1.
  • modernfix-mixins.properties ships only after B6 passes. Instructions are in the SHIP comment in build.py.
  • Any new mod: verify its NeoForge 1.21.1 build and its neoforge.mods.toml ranges against the pins, check side, rerun B0. More Culling is unusable: its NeoForge build declares minecraft [1.21,1.21.1).
  • packwiz update (bulk) resets the hand-set side = "server" on petprotect, c2me-neoforge and noisium. A single-mod update is fine.
  • On first boot, the mods re-save the partial spawn files in full. Don't commit those expansions by accident (git diff config/).
  • sp-world.tar.gz (650 MB, untracked, gitignored) is a world save from the map-migration work. Leave it alone.

Next steps

  1. BENCH-MATRIX §0 boot check (now covers Default Options seeding, the RSO/SSRD video screen, YACL spawn-config loading, and the Iris↔Sodium report).
  2. Build the bench world (§2), then run B0 → B14. Write the winners into build.py, ship, refresh, commit.
  3. Report shader-policy data (B7) and any trial-mod verdicts (B12b) to the owner.

Session 2026-10-15 — Phase 2 begins: client boots, bench harness built

Machine: Manjaro, Java 21 (OpenJDK), Prism 11.0.3, RX 7800 XT / Ryzen 9 9900X / 91 GB. Unlike the previous machine this one runs the client. Full brief: analysis/client-perf/HANDOFF.md.

Boot check (client) — essentially PASS

Pack reaches the main menu cleanly (ModernFix "Game took 29.3 s"; atlas 4096x4096x2; Default Options seeds options.txt correctly). No missing deps, no mixin apply failures, no ftbteams, no fishermans-haven errors, no YACL "Failed to deserialize". 22 benign ERRORs. The one real blocker — Critters & Companions spawn keys camelCase vs YACL's snake_case policy, NPE in CACSpawnConfig$SpawnEntry.isTag, broken mod state — was fixed and pushed by the owner as 8e8483d while this session ran. Alex's Mobs / Fowl Play spawn tuning verified applied in-game.

Open: intermittent world-load crash in WATUT (ShaderInstanceBlur → FileNotFoundException: minecraft:shaders/core/particle.json). First load worked, next crashed. Needs repro; owner says remove no mods.

Built this session (all under analysis/client-perf/, packwizignored)

  • harness/rcon.py, harness/run_scene.py — apply variant → launch Prism into the bench world under user-local MangoHud → drive scenes via xdotool → slice p99/1%-low from CSV. Verified end-to-end once (C1/S1, but vsync-locked; vblank_mode=0 added after).
  • User-local MangoHud 0.8.4 (~/.local/mangohud, wrapper ~/.local/bin/mangohud-local).
  • Bench world saves/onionbench generated by temp server ~/onion-bench/server-bench (S2 Create floor, S3 mob pen placed+verified). S4 airships not built.
  • build.py BENCH layer: enableAutoUpdater=false (suppress DH update modal). Tiers unchanged; nothing shipped.

Not done

The matrix blocks B0–B14. Fleet P0/P1/P2 are unreachable → any data here is a high-tier proxy. Only one non-decision-grade run exists. Next agent: kill the WATUT crash, confirm 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.