Auto Storage (auto_storage) is a NeoForge 1.21.1 storage + crafting mod. It provides a server-authoritative storage network, storage/crafting terminals, crafting energy, import/export buses, and an in-game Patchouli guide.
Addon authors can extend stations, exact deterministic recipe families, typed resources, transfers, transforms, and station variants through the public Addon Development SDK. Maintainers and addon authors can use the Compat Kit to turn one reproducible target audit into an explicit contract, RED scaffold, and verification report.
0.3.0 breaking identity change: the technical mod ID and registry namespace are
auto_storage, the Java package iscom.swear.autostorage, and the release artifact isauto_storage-0.3.0.jar. Auto Storage 0.3.0 intentionally does not migrate or alias 0.2.xmagic_storageworlds, registries, configs, commands, addon IDs, or saved data. Start a new world and treat 0.3.0 as a distinct mod identity.
- Repository: https://github.com/swear01/Auto_Storage
- Issues: https://github.com/swear01/Auto_Storage/issues
- Wiki: https://github.com/swear01/Auto_Storage/wiki
- Modrinth: https://modrinth.com/mod/auto-storage
- CurseForge project: https://www.curseforge.com/minecraft/mc-mods/auto-storage
- JDK 21
- Gradle wrapper from this repository
- EMI
1.1.24or any later compatible1.xbuild for Minecraft 1.21.1 is required on clients; dedicated servers do not require EMI - Fusion
1.2.12for NeoForge 1.21.1 is optional: it automatically enables connected casing when installed; clients without it use ordinary casing and can play normally
On the local Mac dev machine, set:
export JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home./gradlew build
./gradlew runGameTestServer
./gradlew runRecipeAddonGameTestServer
./gradlew runCompatFixtureGameTestServers
./gradlew runPneumaticCraftGameTestServer
./gradlew runCompatibilityMatrixGameTestServer
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover scripts./gradlew compatKitArchive creates the reproducible developer artifact at
build/distributions/auto-storage-compat-kit-<mod_version>.zip.
The current verified SelfTest, GameTest, and Python totals are recorded in docs/plan.md; CI treats any failure or skipped gate as a release blocker. The compatibility matrix structurally validates coexistence/claims, records actual coexistence and unclaimed recipe-inventory digests in build/reports/terminal-scale-*.json, then benchmarks 10,000 exact component-bearing stored types; ./gradlew runCompatibilityMatrixGameTestServer -PterminalScaleTypes=30000 is the stress gate. Bundled modules are indexed by regenerating build/reports/compatibility-modules.md during CI/release (./gradlew generateCompatibilitySummary); routine module PRs update only their descriptor and module-owned doc and must not edit shared README/overview tables or committed global digests. Cold default-Name Storage opening, first Craftable construction, and shared Craftable page switches are each gated below 50 ms; one-time alternate sort/search construction is below 250 ms, per-menu retained heap below 128 KiB, and the shared index below 9 MiB. Reports are written to build/reports/terminal-scale-10000.json or terminal-scale-30000.json and include load/save, preparation, sort/search/scroll/mutation, packet, heap, and exact segmented persistence measurements. Addon authors can register server-owned station descriptors through docs/machine-descriptor-api.md and bounded exact recipe families through docs/recipe-family-api.md.
Current main keeps explicit Storage, Craftable, Transform, and Stations pages. Transform converts explicit inputs into typed resources; Stations has independently paged Processing and Instant sections. A public NeoForge auto_storage:machine_descriptor registry lets addons register process or instant descriptors during mod loading. The server freezes, caches, and sends the exact ordered descriptor snapshot with each Crafting/Remote Terminal menu, and the physical Core/menu bank remains fixed at 256 slots. The Core persists installed stacks and processing work by stable descriptor ID rather than ordinal; missing, incompatible, over-limit, or temporarily unavailable addon entries remain raw in the server-owned record and are retried on later loads instead of being moved or deleted. Built-in accepted axes are consumed atomically, finite value is remaining durability × (Unbreaking level + 1), and Unbreakable supplies non-decrementing infinite energy. The current early-development repository format deliberately does not migrate legacy machine-slot or axe payloads. Current main also uses one capability-based terminal profile/layout platform: Storage is the reduced profile, Crafting extends the shared shell, all rail controls use uniform 18×18 buttons with 16×16 semantic-item/atlas icons, every cyclic value selector supports left/right/wheel plus middle-click reset, and every network amount uses one screen-wide slot-bounded scale. Following RS2's grid-preference model, Auto Focus plus sort/order/search synchronization/resource view and Crafting-only page/source/output/Transform Target choices are one physical-client profile shared by every terminal and persisted in auto_storage-client.toml; each opening still sends those choices to the authoritative server menu, while search text, scroll, recipe selection, and adaptive row count remain session state. All four search fields share one focused key/character router and query parser; only their candidate scope differs. They parse ordinary names plus @mod and #tag prefixes directly; @mod is a namespace substring match, so @creat finds Create. A bare @, #, or $ behaves like an empty query and shows all entries; clicking outside the active search field releases focus while preserving its text and filter. Auto Focus is an independent client-persisted on/off control that gives Search keyboard focus only when a terminal opens; Search Sync separately selects Off, terminal-to-EMI, or EMI two-way. Search packets use a two-tick trailing debounce, while the server compiles each query once, reuses Core-owned normalized item metadata, and filters craftable outputs before computing expensive previews. Transform uses a persistent descriptor-driven target sidebar with representative items, bounded scrolling, search, explicit input/use selection, EMI exclusion, and non-click-through controls. Transform and Stations reuse the same Sort Method, Sort Order, and comparator as Storage. Storage, Craftable, Transform, and Stations share the same top search geometry and align their wide content bottom with the player inventory. Stations presents independently paged Processing and Instant descriptors: Processing shows compact installed count, rational rate, and stored work; Instant is a binary unlock and shows no installed count or work. Its Show control switches between all registered descriptors and installed descriptors; a non-empty Stations query combines both sections within the selected scope, and incomplete Processing rows keep the same fixed left/top column rhythm. The inventory-side status panel always shows type capacity and never duplicates card/station information on hover. Station item hitboxes retain the exact item's normal tooltip; Processing value hitboxes show the descriptor's localized logical family name and current aggregate rate, without repeating installed or stored totals or falling back to the generic internal station_work key. Storage/Craftable expose provider-backed resource groups plus an All aggregate whose tooltip is Show: All; Mekanism chemicals keep their exact translated names and render the same colored chemical glyph as EMI rather than a Chemical Tank. The internal carrier item is never the player-facing icon. The shared framed scrollbar uses enabled/pressed/disabled states: thumb press preserves its exact grab offset, track press pages and repeats while held, and wheel input immediately moves one clamped server row; there is no easing, queue, bounce, or client-owned storage snapshot. Storage and Craftable derive every complete visible row from the available height within an 18-row fixed menu slot bank. Stored types over total type capacity appears in an independent information panel immediately to the right of the player inventory, so Instant Stations keeps its full category width. Fuel plus Brew Energy are the only fuel reserves; retired bottle_fuel NBT is not migrated by the current repository format. Directional Import/Export front automation now transfers both items and bounded typed resources, discovering a generic addon endpoint and every matching native fluid, NeoForge Energy, or optional chemical endpoint on the same block. Import exposes configured side/null insert-only capabilities; Export exposes configured side/null filtered extraction only in Directionless mode, with a safe one-slot normal-stack item view and generic typed paths that reject Item keys. A server-owned Bus screen configures mode, sides, unsided access, automation, Allow/Deny, and nine ordered item or exact typed filters. Owner/operator, stale revision, loaded topology, current block identity, and Wrench actions are revalidated server-side. Cached wrappers become inert while disconnected or while persistent typed rollback escrow is pending. Active item and typed plans revalidate the exact endpoint after external callbacks; detached-target reclaim deficits use the exact recovery path. Creative/no-drop/explosion/replacement removal must recover or preserve escrow, with per-Bus recovery identities and highest-priority drop-event protection preventing cancellation, listener interception, or false same-position deduplication. Active and passive missing-Core searches share a 10-tick negative cache. All model-referenced block/item textures form one native 16×16 dark-stone/cyan/amethyst family with explicit Core/Storage/Crafting motifs; T1–T6 gain copper, iron, gold/lapis, diamond/quartz, prismarine/ender, and netherite/amethyst ornaments instead of a taller fill meter. World casing uses ordinary 16×16 vanilla models by default; when optional Fusion 1.2.12 is installed, an automatically enabled built-in overlay replaces only world casing with five-tile connected sheets. Item models remain ordinary 16×16 and Import/Export keep directional fronts. The project Wrench and compatible c:tools/wrench items rotate directional buses or safely dismantle network blocks through their normal lossless loot path. The server synchronizes an exact immutable recipe presentation—identity, positioned inputs, exact result components/count, station, and typed resource ledger with an explicit infinity bit—so the client diagram never scans Core state or RecipeManager. Empty and valid presentations use a borderless workspace containing one vanilla-style raised diagram/ledger panel with a 4-pixel top and side inset and a separate action footer. Recipes for one exact output sort craftable variants first, then adapter priority and full recipe ID, while preserving the selected exact ID across reranks including the zero-craftable state. The global top-right header is n / craftable (total). The ledger scrolls up to three 18-pixel rows; required resources use at most four readable columns. Short values such as 1/1 remain on one line, and only values that would overflow their cell wrap into full-size available/required lines. Every valid recipe gets one dim station badge in the diagram's lower-right corner. Required client-side EMI first resolves the exact server recipe; when a public bridge such as TMRV uses a synthetic ID without backing metadata, Auto Storage accepts only the unique public recipe whose component-exact output and complete component-exact item-input multiset match the server presentation. It renders that public widget at native size when possible or uniformly scales the complete widget to fit; ambiguous matches fail closed, and unsupported internal axe recipes use the explicit native renderer. The ledger and vanilla-style craft buttons remain Auto Storage-owned. Development compiles and runs against the minimum 1.1.24+1.21.1 baseline, while released metadata accepts compatible EMI 1.x versions through [1.1.24,2); EMI is not bundled and dedicated servers do not require it. Recipes remain server-gated by their installed station or Axe Uses; exact crafting/cooking/stonecutting, component-exact smithing transforms, and deterministic vanilla default-state axe actions are supported. Direct terminal crafting defaults to Player delivery but has an independent server-synchronized rail control whose icon follows Player (player head) or Storage (Storage Core): Player fills the 36-slot inventory first and sends only overflow to Core, while Storage keeps primary results and crafting remainders in Core. A complete batch is rejected before mutation if its selected destination cannot accept it, and Max searches for the largest fully deliverable amount across ItemStack and Integer.MAX_VALUE boundaries, then commits each Core key through one long-count mutation instead of an unbounded chunk loop. EMI Cursor/Inventory requests remain authoritative and do not consult this direct-terminal toggle. EMI crafting remains exact, one-level, and server-authoritative. Recipes using supported exact vanilla class/type families work from any namespace without addon code; custom exact class/type families may register once through the public opaque auto_storage:recipe_family registry and use singleItemToItem, cached deterministic N-input/N-output deterministicResources, or config-reloaded dynamicDeterministicResources plans spanning item/fluid/power/chemical/addon keys, retained catalysts/tools, and remainders; dynamic families must also publish a complete server-state token so shared Craftable results invalidate when their plan or cost changes. The multi-step direction is documented in docs/superpowers/plans/2026-07-14-modded-recipes-multistep-crafting.md, with EMI tree used only as client planning/reference UI rather than server authority. The bilingual Patchouli Recipe Catalog renders every mod recipe exactly once. The guide itself is the registered auto_storage:guide_book item, appears in the Auto Storage creative tab, and is craftable from a Book, Black Dye, and Copper Ingot. The starter Core, Terminal, and two T1 Units use black concrete powder, obsidian, copper, redstone, glass, wood, and one Diamond total; T1 no longer requires amethyst. Runtime UI translation keys have exact en_us/zh_tw parity. The current layout and server-owned registry are ready to page dozens of addon descriptors. Storage Core contents are permanently owned by overworld data/auto_storage_core_storages.dat; each Core chunk stores only a storage UUID and schema, while inventory entries are persisted in arbitrary 63-type segments. Survival, creative, explosion, and Wrench dismantling produce a compact one-time token that points to the same storage/network record without copying its payload. Placing the token atomically reattaches that record; /auto_storage recover_core is player-public but can only reissue that player's latest unclaimed capability, while operators may use /auto_storage recover_core ownerless for the latest recovery without a player owner. Missing, corrupt, packed, or duplicate attachments fail closed, and old inline/snapshot formats are intentionally not migrated. Core persistence contract: docs/superpowers/plans/2026-07-17-core-storage-repository.md.
Optional recipe compatibility is source-audited and loaded only when the target mod is present. AE2 Inscriber support is the first committed Compat Kit contract: middle inputs are consumed, presses are retained or consumed according to the exact mode, and work plus configured AE-to-FE cost commit atomically; see docs/ae2-compatibility.md. One Furnace slot accepts vanilla plus supported Iron Furnaces variants and derives each exact rate from the live cook-time config; the installed variant is shown first and each newly selected recipe starts its real-time preview cycle from it. Third-party recipe-viewer metadata stays owned by the third-party mod: Iron Furnaces registers its JEI catalysts, the GUI test pack uses TMRV to expose those plugins to EMI without installing JEI, and Auto Storage does not register third-party EMI workstations. Farmer's Delight Cooking Pot recipes consume all exact ingredients, serving containers, remainders, cook time, and Fuel atomically. When Use Player Inventory is enabled, typed item inputs participate in the same exact 36-slot simulate-then-commit plan as ordinary recipe inputs; non-item typed inputs remain Core-only. Mekanism supports every factory-backed family—Smelting, Enriching, Crushing, Compressing, Combining, Purifying, Injecting, Infusing, and Sawing—with each basic machine plus Basic/Advanced/Elite/Ultimate Factory at 1/3/5/7/9 parallel work per tick. Osmium Compressor, Purification Chamber, Chemical Injection Chamber, Metallurgic Infuser, and deterministic Precision Sawmill recipes use exact item/chemical inputs; Pressurized Reactions retain sized item/fluid/chemical inputs, duration-derived station work, total recipe-specific FE (energyRequired × duration), item or chemical primary output, and optional chemical co-output. Twelve more deterministic single-block fluid/chemical machines are supported, giving exact coverage for 22 of Mekanism's 26 registered recipe types; the complete machine inventory and fail-closed boundaries are in docs/mekanism-compatibility.md. When Botania is loaded, Mana joins the Energy resource group and local finite Mana Tablets transfer atomically; installed Mana Pool, Runic Altar, Terrestrial Agglomeration Plate, Petal Apothecary, and Elven Gateway stations enable their exact deterministic recipe families. Detailed boundaries are in docs/botania-compatibility.md. Modern Industrialization adds 14 direct machine families with provider-derived Bronze/Steel/Electric rates and exact item/fluid/EU/catalyst/multi-output transactions; its supported tiers and explicit proxy/RNG boundaries are in docs/modern-industrialization-compatibility.md. Ars Nouveau adds Source storage plus Imbuement Chamber and Enchanting Apparatus recipes with exact Source, catalysts, remainders, and reagent components; its boundaries are in docs/ars-nouveau-compatibility.md. EvilCraft adds exact Blood Infuser recipes; Powah adds Energizing recipes that consume Core FE while installed rod tiers derive throughput from loaded config. Industrial Foregoing adds exact Dissolution Chamber, Material Stonework Factory, and Crusher transactions with live FE/work costs. Their boundaries are in docs/evilcraft-compatibility.md, docs/powah-compatibility.md, and docs/industrial-foregoing-compatibility.md. Create supports deterministic Milling, Crushing, Cutting, Filling, and Emptying with exact item/fluid outputs and station work; its RPM/chance/multi-station boundaries are in docs/create-compatibility.md. Extended Crafting adds exact 3×3 through 9×9 shaped table recipes and the real component-bearing Ultimate Singularity recipe behind one installed Ultimate Crafting Table. Plans preserve up to 81 exact input groups, remainders, and atomic destination rollback; custom transformers still fail closed. Its boundary is in docs/extended-crafting-compatibility.md. Theurgy supports deterministic Calcination, Distillation, and Liquefaction with exact sized item and solvent fluid costs under installed Processing stations; heat/brazier state is not simulated. See docs/theurgy-compatibility.md. Advanced AE 1.6.11 is an evidence-backed outcome C: its live-network Reaction Chamber remains fail closed and the present-mod module registers no station or recipe family; see Advanced AE compatibility. Create Aquatic Ambitions 2.0.4 is present-mod CI-tested but intentionally registers no station, resource kind, or recipe family: Channeling depends on live fan/world catalysts, Conduit side effects, and chance outputs, so it cannot satisfy atomic deterministic planning; see docs/create-aquatic-ambitions-compatibility.md. Create Enchantment Industry 2.5.0-preview-alpha1 is likewise present-mod CI-tested with zero custom families because Grindstone kinetics/tank/disenchant paths, Printer template behaviours, and Blaze Enchanter/Forger randomness cannot satisfy atomic simulation; see docs/create-enchantment-industry-compatibility.md. Draconic Evolution 3.1.4.632 is likewise present-mod CI-tested and intentionally registers no Fusion Crafting family because its live multiblock injectors, tiered charging, and config-timed state machine cannot be represented as a deterministic storage transaction; see docs/draconicevolution-compatibility.md. Productive Metalworks is present-mod CI-tested but intentionally registers no custom Foundry/casting stations or families until a multiblock simulate-then-commit contract exists; see docs/productivemetalworks-compatibility.md. Productive Bees 1.21.1-13.13.5 is an evidence-backed outcome C after all 16 actual recipe classes were re-reviewed and rejected for chance, live bee/entity/world, dynamic component, or machine-state semantics; see docs/productivebees-compatibility.md. Railcraft Reborn 1.2.10 is likewise present-mod CI-tested with zero production families after its audited concrete recipes were rejected for chance, live multiblock/machine state, or special-crafting semantics; see docs/railcraft-compatibility.md. Probabilistic/dynamic recipes, laser/extractor world-state families, and external-machine send-and-wait remain unsupported. PneumaticCraft 8.2.22 is present-mod CI-tested but intentionally registers no Air kind or recipe family because its pressure, heat, multiblock, and void addAir contracts cannot satisfy atomic simulation; see docs/pneumaticcraft-compatibility.md.
Storage and Craftable views in both terminal types have one server-synchronized resource selector with stable Items, Fluids, Energy, Gases, Processing, Other, and All groups. Energy is the broad player-facing group for FE, Fuel/Brew reserves, Botania Mana, and Ars Nouveau Source; Processing contains only accumulated station work; Other contains Axe Uses and independently registered values without a better shared category. Both persisted Mekanism chemical IDs belong to Gases. Fluid cells use a teal frame, Energy violet, Gas/Other blue, and Processing amber. Player-facing representatives identify the resource, not its transfer container: Mana Powder/Mana, Source Gem/Source, and any exact representative registered by an addon. A provider-specific resource placeholder is preferred when available; generic crafting placeholders, containers, and workstations are not substituted. The selector resets to Items and is hidden on Transform and Stations. Storage never extracts a non-item representative as an item; Craftable may select an exact typed-output recipe. Non-item primary results preserve their exact key and long per-craft amount, always return to Storage, and reject Cursor/Player/EMI-inventory destinations instead of silently rerouting. Non-item representatives are never exposed to EMI as item ingredients.
Machine work-rate tooltips use fixed two-decimal values (1.25/tick, never 5/4); a positive value below 0.01 is shown as <0.01 rather than zero. Recipe resource cells reserve at least 56 pixels and render full-size available and required values on separate lines, so values such as 121K and /200 are not truncated or shrunk.
Typed-resource storage now uses one live server-owned ledger for exact items, fluids, NeoForge Energy, optional Mekanism chemicals, and registered addon kinds. Public kind/key/transaction/capability plus block/container strategy APIs, typed Terminal representatives and held-container transfers, generic/native active and passive Bus surfaces with immutable item/typed transfer plans and exact recovery, Creative unlimited type capacity, and deterministic mixed-resource recipe families are implemented under GitHub #9. Addon handlers must simulate without mutation, return only 0..requested, mutate exactly the reported execute amount, honor exact sides/kinds, and fail explicitly on optional-mod binary incompatibility. Legacy segmented item NBT remains only as a persistence compatibility encoding. See docs/typed-resource-storage.md and docs/recipe-family-api.md.
GitHub Actions runs on pushes to main, pull requests, and manual dispatch:
.github/workflows/ci.ymlbuilds the mod and Compat Kit archive, compiles against both the minimum and newest compatible EMI 1.21.1 releases from exact Modrinth version IDs, runs the earlystageAe2CompatAuditAncestryexact-evidence gate, the base and recipe-addon GameTests, the descriptor-derivedrunCompatFixtureGameTestServersaggregate, the PneumaticCraft reject-only companion, then the three-test compatibility-matrix run (descriptor/companion coexistence plus the Craftable speed/heap benchmark that writesbuild/reports/terminal-scale-10000.json) before Python tests and the./gradlew runDatadrift check. The ancestry gate resolves and SHA-verifies the exact non-transitive compile APIs persisted by the scanner-format-17 AE2 audit. Root and generated-addon builds explicitly select ModDev's non-recompiling binary pipeline so local and CI platform evidence is identical. Each optional-mod job deliberately uses one representative artifact rather than a multi-version matrix: it is CI evidence, not an exact player dependency, and incompatibilities in other versions are fixed from user reports. Botania's official mutable snapshot is additionally guarded by an expected jar SHA-256 and excludes JEI from its fixture runtime. Compile-only and client/data EMI jars all come from exact Modrinth version IDs;scripts/stage_emi_runtime.shstages the latter, after a transient failure the script retries the same Gradle command once and then fails explicitly..github/workflows/client-smoke.ymlis manual-only (workflow_dispatch); it stages required Patchouli, pinned Fusion, and the exact NeoForge 1.21.1 Modrinth runtime matching the newest compatible EMI release before launching HeadlessMC / MC-Runtime-Test. The client step is capped at 10 minutes; it catches client boot/resource crashes but is not GUI layout approval..github/workflows/release.ymlruns when a tagv<mod_version>is pushed, verifies the tag matchesgradle.properties, repeats every CI gate including exact AE2 ancestry staging, the descriptor-derived fixture aggregate, and the compatibility matrix, generates release notes, publishes the player alpha jar to GitHub/Modrinth/CurseForge, and attaches the compile-only API/sources/Javadocs plus the Compat Kit archive to the GitHub Release. Thepublishingenvironment must provide secretsMODRINTH_TOKENandCURSEFORGE_TOKEN, plus variablesMODRINTH_PROJECT_IDandCURSEFORGE_PROJECT_ID; missing configuration fails closed before publication.
Maintainer setup, publication, hash verification, retry, rollback, and secret
rotation are documented in docs/releasing.md.
Release example:
version="$(sed -n 's/^mod_version=//p' gradle.properties)"
git tag "v${version}"
git push origin main "v${version}"Automated tests and client smoke do not verify Minecraft GUI layout. MacFix 0.1.0 is an active macOS-only Prism GUI support artifact, not an Auto Storage player dependency. While its Modrinth project remains under review, staging uses the sibling ../macfix/build/libs/macfix-0.1.0.jar and requires SHA-256 79904d59892c4c5384811a384f3ce88aa5b3d6e8224dbde1b78dc2f80020080c; the source will move to an immutable Modrinth version ID after approval. python3 scripts/deploy_prism_dev.py automatically increments the patch version, builds the jar, and transactionally installs that exact build, pinned Fusion, and the 18-jar representative GUI support pack, including Extended Crafting, Cucumber, and shared Curios, GuideME, GeckoLib, Cloth Config, and Titanium dependencies into Prism dev after hash verification; it removes JEI because TMRV and JEI are mutually exclusive. EvilCraft and Cyclops Core are deliberately absent from this combined client pack because TMRV 0.9.0's JEI stub causes EvilCraft 1.2.91 to process its Spirit Furnace packet before the JEI registrar exists; EvilCraft remains covered by its isolated ten-test server fixture. For non-visual client boot/resource checks, run python3 scripts/run_prism_gui_session.py --scenario boot-smoke. For terminal/Patchouli/visual changes, run the relevant scenario (bus-configuration covers Import/Export Bus configuration and direction models; crafting-fuel-page covers the Transform/Stations/recipe/mod-integration pages); before launch the runner requires Prism Launcher 11.0.3 or newer, rejects stale or duplicate test jars, precisely removes only a stale process from the same dev instance, rebuilds a scenario-scoped true-void lab with only the current blocks/functions, and requires the normal-root Prism Launcher to already be open with account initialization finished. Visual scenarios preload every repeatable setup state before handoff: crafting-fuel-page creates one server-owned Core repository record containing its stored ingredients, installed vanilla and optional stations including the Ultimate Crafting Table, Fuel/process reserves, Axe Uses, fluids, FE, chemicals, Source, Mana, and all 19 exact component-bearing Singularity inputs for the real Ultimate Singularity recipe, while the player inventory contains only its navigation items and the one Transform input. The user only opens pages/recipes and judges layout; behavior mutation stays in automated tests. The runner invokes Prism's documented CLI against the configured dev instance: "/Applications/Prism Launcher.app/Contents/MacOS/prismlauncher" -l dev -w AutoStorageGuiTest -o AutoStorageBot. It fails before launch rather than cold-starting Prism, because every cold start reloads the owning account as refreshable and can perform Microsoft/Xbox ownership refresh even with -o. It never creates or edits a launcher account file. A fabricated Offline-only -d root is forbidden because Prism still needs an owning account to authorize full-game offline launch and otherwise falls into demo/account-selection flow. Before handoff the runner scans only the current normal-root PrismLauncher-0.log segment and fails on real Microsoft/Xbox/XSTS/Minecraft-services auth steps or endpoints; generic local Offline-task and refresh-scheduler bookkeeping is allowed. The detached launcher receives a minimal environment, and its saved log artifact removes environment dumps. The runner also clears the optional Computer Use wrapper, disables Prism's error-console pop-up, writes Minecraft built-in fullscreen, waits for AS_GUI_TEST_READY, and verifies that the macOS desktop display mode did not change. Visual verification owner: user. Confirm the complete frame and then follow the generated checklist under docs/notes.md “Prism dev / manual handoff” or docs/macos-fullscreen-guide.md. Never use the macOS green fullscreen button or Control-Command-F and never combine macOS native fullscreen with Minecraft fullscreen. To quit, first press F11, wait until the normal bordered window is visible, and only then press Command-Q; direct Command-Q from F11 fullscreen is forbidden. A detached watchdog bound to that run's exact Java PID and command terminates only the test client if Stopping! is followed by a five-second GLFW shutdown stall, and records the outcome in the run directory. Vanilla authlib can still write a harmless offline profile-properties 401 to latest.log; the runner also allows only the exact Botania snapshot README path line and Industrial Foregoing Curios example/feet lines, and still fails on every other current-run error.
MIT License.