---------------------------------------------------------------------------------------------------
Version: 8.8.9
Date: 2026-09-24
  Fixes:
    - Load crash "Recipe product 'thermal-oil-cool' has invalid temperature: 25. Outside fluid temperature
      range: 60-100" (temper-water-with-waste-heat). thermal-oil-cool's range is now 25-100C. The two
      recipes that make it as a reject stream (thermal-oil-heat-exchange, thermal-oil-superheating) now set
      the temperature explicitly (90C / 95C) so the cascade's >=55C intake still works.
    - MegaTopia156 bridge recipe migrated to the 2.1 `categories` array (see 8.8.8 note).
  Features:
    - Asteroid crushing now yields a random amount of stone. Applies to every recipe in the "crushing"
      category that consumes an asteroid chunk (vanilla basic/advanced/promethium and other mods' recipes),
      not a hard-coded name list. Per crush: metallic 2-6, carbonic 1-4, oxide 3-8, promethium 2-5, unknown
      chunk types 1-4. Startup settings: on/off switch and a yield multiplier (0.25-5).
      (prototypes/asteroid-stone.lua, run from data-final-fixes.lua)
    - Orbital Regolith Vitrification (space-thermal-scrubber): 10 stone -> 3 crushed-slag, a sink for the new
      asteroid stone on late-game platforms.
    - Early-game stone beneficiation (tier-0): Stone Comminution -> Crushed Stone -> Dry Screening or Jigging
      -> Trace Mineral Concentrate -> Trace Mineral Refining -> random iron ore, copper ore, and rare nickel
      ore. Tailings return as stone. New items: crushed-stone, trace-mineral-concentrate.
Version: 8.8.8
Date: 2026-09-19
  Factorio 2.1 Compatibility:
    - Migrated every recipe from the removed RecipePrototype::category/additional_categories
      fields to the new RecipePrototype::categories array. Centralized in the DSE.recipe() helper
      (prototypes/util-helpers.lua), so all ~160 recipe definitions across prototypes/recipes/
      needed no individual changes.
    - Migrated all direct .fluidbox table access (removed entirely in 2.1) to the new
      LuaEntity::get_fluid()/set_fluid()/fluids_count API, across pipe corrosion, temperature
      gating, wetland irrigation, and biogas ash production.
    - Migrated all direct LuaEntity::active writes (removed in 2.1) to LuaEntity::disabled_by_script,
      across orbital stationary-lab gating, temperature gating, and wetland irrigation.
    - Renamed every recipe/mined-result ItemProductPrototype::probability field to
      independent_probability (hard rename in 2.1, confirmed by an actual load-time error on
      copper-plate/iron-plate/steel-plate after the first pass missed this one -- the 2.1 docs
      still listing "probability" was misleading; it's real prototype text describing the new
      field's inherited behavior, not evidence the old field name still works). Fixed at the
      source in prototypes/util-helpers.lua's build_io() helper (covers every short-form recipe
      result across ~160 recipes), plus the two other direct call sites: the Gleba water-cane
      mined-result byproduct in prototypes/entities.lua, and the vanilla smelting-ash/crushed-slag
      byproduct injection in data-updates.lua.
    - Verified no custom recipe or machine references any of the built-in recipe categories
      removed in 2.1 (basic-crafting, electronics, chemistry-or-cryogenics, etc.) -- every
      category this mod uses is either its own custom category or one of the small set of
      built-in categories (crafting, crafting-with-fluid, smelting) that 2.1 kept.
    - Confirmed via dev-tools/audit_recipe_categories.py that no recipe crafting-category
      assignment regressed.
  Reality-Audit Expansion Pass (Sections 22-27, 21-ext, 29 + MegaTopia156 bridge):
    - Section 29 (Recycling Fatigue & Down-cycling): crushed-slag-reclamation and
      tool-steel-retempering now have a real, probabilistic chance of returning a
      contaminated/fatigued grade instead of a clean one, matching real scrap-recycling
      tramp-element accumulation. New items contaminated-iron-ore, contaminated-steel-billet,
      fatigued-tool-steel, each with a genuine low-precision-only downstream sink
      (recipes/recycling-fatigue.lua) -- deliberately never routed back into cnc-machining or
      spring-tempering, matching real down-cycling economics.
    - Section 22 (Statistical Process Control & Metrology): new quality-inspection-station
      machine + populated-circuit-board-inspection (92% real-world-representative pass rate)
      + pcb-rework-line (partial, realistic component recovery). recipes/quality-control.lua.
    - Section 23 (Tribology & Preventive Maintenance): new machine-lubricant/spent-lubricant
      fluids. cnc-machining now genuinely requires cutting fluid (mostly recirculated, small
      real loss fraction becomes spent-lubricant, closed via spent-lubricant-reclamation).
      recipes/tribology.lua.
    - Section 24 (Joining Technologies): real welding (flux-core-welding-wire), brazing
      (tin-bronze-braze-alloy, brazed-heat-exchanger-core), and structural adhesive bonding
      (epoxy-structural-adhesive, structural-adhesive-bond) chains. recipes/joining-technologies.lua.
    - Section 25 (Cleanroom & Contamination Control): hepa-filter-cartridge (real
      ceramic/glass-microfiber media, spoils/clogs like this mod's existing organic-decay
      items) + spent-filter-media-reclamation. recipes/cleanroom-control.lua.
    - Section 26 (Exergy Cascade & Combined Heat and Power): new temper-water-with-waste-heat
      recipe -- an alternate route to temper-water-bioreactor-band's exact same setpoint, using
      recovered thermal-oil-cool waste heat (genuinely cooled further by the exchange) instead
      of fresh energy_required. Real cogeneration economics, not flavor text.
      recipes/exergy-cascade.lua.
    - Section 27 (Effluent Treatment): new ultrapure-water fluid + reverse-osmosis-polishing
      (real ~20% brine-reject fraction routed into the EXISTING raffinate-waste treatment loop).
      wafer-cmp-polishing now requires an ultrapure-water rinse, matching the real semiconductor
      industry spec this step is named after. recipes/effluent-treatment.lua.
    - Section 21 extension (Sunflowers): full grow -> cold-press -> winterize chain. Three real
      products: refined-sunflower-oil, compost nutrients (sunflower-meal, an alternate input to
      the existing permaculture-compost-production recipe), and sunflower-wax (a real
      winterization byproduct, itself a real bio-based additive feeding a new
      machine-lubricant-blending-biobased alt recipe -- a genuine Section 21/23 cross-tie-in).
      Appended to recipes/permaculture.lua.
    - Genetics realism fix: genetic-sample, sequenced-genome-data, and crispr-guide-rna
      previously had no spoilage at all. Now spoil on a real, ordered timescale (guide RNA
      fastest -- single-stranded, RNase-vulnerable -- purified sequencing-library data slowest),
      decaying into the existing pollutant-ash sink.
    - New optional integration: if MegaTopia156 is also installed, a guarded, existence-checked
      bridge recipe (slop-to-compost-reclamation) lets its "slop" byproduct feed this mod's
      compost loop. One-directional, fully optional, no dependency declared either way (avoids
      a dependency cycle with MegaTopia156's own reciprocal bridge). data-final-fixes.lua.
    - Polish: the 5 new fluids from this pass added to the dedicated Entropic Sprawl barrelling
      tab list in data-final-fixes.lua (same fix class as the original crushed-slag-reclamation
      tab-placement bug, applied proactively this time instead of reactively).
    - All ~40 new items/fluids/recipes verified against the full existing dev-tools/ audit suite
      (reachability, tier-ordering, recipe-category machine-support, locale completeness, icon
      fallbacks) plus a full luac -p syntax pass across every .lua file in the mod. All clean.
    - Deliberately NOT implemented this pass: Section 28 (Cryogenic Boil-off & Insulation) from
      the reality-audit proposal. It's the one proposal that needs new runtime (control.lua-style)
      logic rather than pure data-stage content, and per HANDOFF.md's own standing caution, this
      mod has never been loaded in a real, running copy of Factorio -- shipping untested runtime
      code that touches machine fluid state is a meaningfully different risk than the data-only
      content in this pass. Left for a session where it can actually be playtested.
  UI Fixes:
    - Fixed acidic-waste-neutralization, raffinate-waste-treatment, dirty-condensate-polishing, and
      thermal-oil-heat-exchange rendering in the base game's Fluids tab instead of this mod's own
      Entropic Sprawl tab. Root cause: DSE.recipe() only derives a default subgroup from
      main_product's own subgroup when none is given explicitly (see util-helpers.lua); all four of
      these recipes have a vanilla fluid (water or steam) as main_product, so they silently inherited
      vanilla's subgroup instead of one of this mod's own dse-fluids-* subgroups. Each now sets an
      explicit subgroup matching the fluids it actually works with: dse-fluids-acid for the two waste-
      neutralization recipes (matching acidic-waste/raffinate-waste/sodium-hydroxide), dse-fluids-petro
      for dirty-condensate-polishing (matching dirty-condensate), and dse-fluids-cryo for
      thermal-oil-heat-exchange (matching its thermal-oil-priming/thermal-oil-reheating siblings, which
      already landed there automatically since their main_product is the DSE-only thermal-oil-hot fluid).
  Info:
    - factorio_version and dependencies bumped to 2.1.0.
---------------------------------------------------------------------------------------------------
Version: 2.2.2
Date: 2026-09-17
  Major Features:
    - Added Chemical-Grade Pipe and Chemical-Grade Underground Pipe, researchable directly off
      vanilla Sulfur Processing. Acid-brick-lined steel with copper fittings; resists sulfuric
      acid, hydrogen sulfide, acidic waste and raffinate waste.
    - Added Hastelloy Underground Pipe, unlocked alongside the existing Hastelloy Pipe at
      Process Complexity Tier 2.
  Balancing:
    - Pipe corrosion is now tiered. Mild corrosives (sulfuric acid, hydrogen sulfide, acidic and
      raffinate waste) are resisted by chemical-grade pipe; severe corrosives (hydrofluoric acid,
      chlorine, titanium tetrachloride, chlorosilane) still require Hastelloy.
    - Mild-class corrosion causes no damage at all until Corrosion-Resistant Piping has been
      researched, so sulfuric acid can never destroy pipework the player had no means to protect.
    - Processing Unit (blue circuit) now requires Ceramic Capacitor x2 instead of Diode x2, so it
      no longer shares its added ingredient with Advanced Circuit.
    - Bio-Engineered Solar Array output raised from 900 kW to 3.3 MW.
  Optimizations:
    - Large UPS pass on all runtime mechanics. Previously six scripts each ran a full-surface
      entity search once per second, including one for "pipe"; that cost grew without bound as the
      map was explored and all six spikes landed on the same tick. Entities are now found once
      (when built, or in a single scan on install/update) and kept in a registry, so per-tick cost
      scales with the number of this mod's machines rather than with map size.
    - Each mechanic now runs on its own interval (121/239/307/401 ticks) with per-check amounts
      scaled to match, so total effect per second is unchanged but the work interleaves instead of
      stacking on one tick.
    - Pipe corrosion is walked in bounded slices with a persistent cursor, giving the mechanic a
      flat cost regardless of factory size.
    - Build events are prototype-name filtered at the engine level, so placing an unrelated entity
      never enters this mod's Lua at all.
    - Removed two tables that leaked entries for the life of a save: per-pipe corrosion exposure
      (gone entirely) and biogas ash counters (now rebuilt each pass from live turbines).
  Graphics:
    - Added a mod thumbnail.
    - Nursery Dome now actually renders as a green-tinted lab. The previous version copied the
      lab's graphics under field names an assembling-machine never reads, so it silently kept the
      assembling machine look; its inventory, crafting-menu and tech-tree icon now also come from
      the lab item instead of the assembling machine.
    - The three pipe tiers are individually tinted on the ground and in the inventory.
  Bugfixes:
    - This mod's ores now show their icon next to their name in the map generation screen. The map
      generator takes that icon from the autoplace control's localised_name rich text, not from the
      resource prototype's icon field, which is why modded ores appeared as bare labels.
    - Cloned ore resources no longer keep an inherited icons array that overrode their own icon.
  Modding:
    - Added runtime-global settings to disable pipe corrosion entirely and to tune the corrosion
      scan budget.
    - dev-tools/audit_locale.py no longer hardcodes a "dse-tier-N" pattern for technologies, which
      had made any non-tier technology invisible to the audit.
