Aetheria/docs/stats-power-cut1-migration.md
Meta Vens 7204259ac3 Fix a mutation accidentally captured in the previous commit
f4d5659d landed with StatValidation's OptimalTemperature-bounds check replaced by
`if (false)`: the mutation harness was running concurrently against this same file
and a `git add`/`git commit` caught it mid-mutation. Restores the real check. Caught
because the harness's own "not yet reached" scars in doctrine are what prompted a
by-hand recheck of the just-committed diff rather than trusting the terminal output
that said 80/80 green a moment earlier.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 18:45:10 +02:00

24 KiB

Cut 1 migration table: R-heat fit and term counts

Date: 2026-09-18. Cut 1 of docs/stats-and-power-cut.md. Generated by a scratch migration console (two phases, neither kept) against GameData/Aetheria.cc at pre-migration sha1 d65c2aede2ee637fdb77fb83e6d7acd4d6c37cb3 (12,682,424 bytes). The committed file's sha1 is 13a13a675064f971dfff3a3d83998220da42dd49 (12,682,737 bytes, +313 for 51 authored OptimalTemperature/PlateauWidth float pairs).

The pre-migration catalog does not open under the post-Cut-1 code. Opening the unmigrated bytes with the new AetheriaStores.Open throws immediately: ClearPath: OptimalTemperature 0 lies outside its bounds [223.15, 473.15] -- StatValidation refusing the unauthored-default 0 for the very first design it checks. This is why the schema change and the catalog rewrite are one commit, not two: there is no working intermediate state. Keys 2-5 (the retired HeatExponentMultiplier/DurabilityExponentMultiplier/ QualityExponent/FromRole) are simply absent from the new PerformanceStat type, so CultCache's normal slot-compatibility path (an unrecognized stored key is skipped, not an error) is what makes the stat fields safe to drop silently -- it is OptimalTemperature/PlateauWidth on EquippableItemData, freshly required by the new validation, that make a bare code swap without the catalog rewrite unusable.

AetherDb invariants (census, factions, dangling, station-fit, hardpoint-fit, loadout 1) are byte-identical before and after -- captured with the pre-Cut-1 binary against the unmigrated copy and the post-Cut-1 binary against the migrated copy, since neither binary can open the other's catalog shape. None of these commands reads a stat value, so identical output is the expected proof that nothing but the stat/heat shape moved.

  • EquippableItemData records before: 51, after: 51 (must match -- the migration adds no records)
  • Stats migrated into declared terms: 348 of 348 dumped
  • Items fitted from an authored curve: 37; items with no curve (full-range plateau): 14
  • Stat values at quality .5 / full durability / the item's own optimum: 281 of 348 unchanged, 67 diverge -- every divergence moves toward Max (the plateau's full-performance value), which is a move away from Min for an inverted stat (Max < Min) and reads as a negative delta below; max |delta| 72.8125

Stats whose at-optimum value changed (the intended R-heat balance change)

Item key Path Min-Max Old value New value Delta
42d1ffaa-f764-4a65-ba03-43cc4e6fd2bc Behaviors[0].Torque 750000-1750000 999927.2000 1000000.0000 +72.8125
04255796-db68-48d2-81e5-8cfdab150706 Behaviors[0].Thrust 250000-1000000 437472.7000 437500.0000 +27.3125
480d6cc4-cd8a-49b6-9c89-211033e7c1d5 Behaviors[0].PingVisibility 5000-1000 4001.1640 4000.0000 -1.1643
0d499d62-3b92-454b-9498-37d12616167f Behaviors[0].Visibility 5000-1000 4000.5820 4000.0000 -0.5823
20e9f41a-6bd2-4f6c-9740-7b707614509c Behaviors[1].PumpedHeat 1000-5000 1999.4180 2000.0000 +0.5823
499f7891-c5df-4cbe-8431-9db7108102ec Behaviors[0].Visibility 5000-1000 4000.5820 4000.0000 -0.5823
03a842b2-295e-4cf7-9faa-ecc4bc54eb76 Behaviors[0].Range 1000-3000 1499.4180 1500.0000 +0.5822
2935b4d4-2ad5-4b90-8416-a85bbb38171b Behaviors[1].PumpedHeat 750-4000 1562.0270 1562.5000 +0.4731
542169f2-363c-41f7-8d6d-60a5bd7578bd Behaviors[1].PumpedHeat 1000-4000 1749.5630 1750.0000 +0.4368
2933c4ce-bf41-459c-b0d6-9583466b393d Behaviors[0].Range 750-2250 1124.5630 1125.0000 +0.4366
8ac84e31-f0cf-43b2-8611-3316adfa4010 Behaviors[0].Visibility 1000-250 812.9364 812.5000 -0.4364
679fb6a1-cefb-4adc-a49c-71942602196b Behaviors[0].Range 1000-2000 1353.1420 1353.5530 +0.4116
679fb6a1-cefb-4adc-a49c-71942602196b Behaviors[0].Visibility 1000-500 703.0444 702.6982 -0.3462
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].MinRange 500-50 366.5256 366.2142 -0.3114
480d6cc4-cd8a-49b6-9c89-211033e7c1d5 Behaviors[0].PingRange 1000-5000 1999.7090 2000.0000 +0.2913
2e5193aa-3703-4ecc-911d-4d8394ce4c2f Behaviors[0].Visibility 1250-250 896.6525 896.4467 -0.2058
0271bb97-4ce8-4d64-97c3-8bfd3f76b2c6 Behaviors[0].Visibility 500-100 358.7433 358.5786 -0.1647
457ac901-aa54-4ba7-9df6-fbacdfb40b3f Behaviors[0].Visibility 500-100 358.7433 358.5786 -0.1647
457ac901-aa54-4ba7-9df6-fbacdfb40b3f Behaviors[0].Velocity 400-900 524.8544 525.0000 +0.1456
03a842b2-295e-4cf7-9faa-ecc4bc54eb76 Behaviors[0].Damage 100-600 224.8545 225.0000 +0.1455
0d499d62-3b92-454b-9498-37d12616167f Behaviors[0].ChargeHeat 2500-2000 2250.1460 2250.0000 -0.1455
499f7891-c5df-4cbe-8431-9db7108102ec Behaviors[0].ChargeHeat 2500-2000 2250.1460 2250.0000 -0.1455
4a41dec8-6b65-46ee-b578-ba805f112c0c Behaviors[0].Range 800-1750 1037.3620 1037.5000 +0.1383
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Visibility 1000-250 777.1535 777.0237 -0.1298
542169f2-363c-41f7-8d6d-60a5bd7578bd Behaviors[1].WasteHeat 500-100 358.6610 358.5786 -0.0824
499f7891-c5df-4cbe-8431-9db7108102ec Behaviors[0].Range 800-1900 1074.9200 1075.0000 +0.0801
3aa1ac05-6d55-4569-8a4b-e1c3c6e07c61 Behaviors[0].Visibility 1750-600 1508.3130 1508.2420 -0.0704
04255796-db68-48d2-81e5-8cfdab150706 Behaviors[0].Visibility 100-400 206.0042 206.0660 +0.0618
4a41dec8-6b65-46ee-b578-ba805f112c0c Behaviors[0].Visibility 550-150 450.0582 450.0000 -0.0582
3aa1ac05-6d55-4569-8a4b-e1c3c6e07c61 Behaviors[0].Range 500-1250 687.4454 687.5000 +0.0546
457ac901-aa54-4ba7-9df6-fbacdfb40b3f Behaviors[0].Range 500-1250 687.4454 687.5000 +0.0546
679fb6a1-cefb-4adc-a49c-71942602196b Behaviors[0].Velocity 500-1250 687.4454 687.5000 +0.0546
8ac84e31-f0cf-43b2-8611-3316adfa4010 Behaviors[0].Velocity 750-1500 937.4454 937.5000 +0.0546
2933c4ce-bf41-459c-b0d6-9583466b393d Behaviors[0].Heat 500-0 323.2748 323.2233 -0.0515
3aa1ac05-6d55-4569-8a4b-e1c3c6e07c61 Behaviors[0].Heat 500-1000 676.7252 676.7767 +0.0515
0271bb97-4ce8-4d64-97c3-8bfd3f76b2c6 Behaviors[0].Velocity 700-1250 863.4684 863.5160 +0.0476
20e9f41a-6bd2-4f6c-9740-7b707614509c Behaviors[1].WasteHeat 100-300 170.6695 170.7107 +0.0412
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Range 1650-3500 2199.9680 2200.0080 +0.0400
0d499d62-3b92-454b-9498-37d12616167f Behaviors[0].Velocity 250-750 374.9636 375.0000 +0.0364
499f7891-c5df-4cbe-8431-9db7108102ec Behaviors[0].Velocity 250-750 374.9636 375.0000 +0.0364
0d499d62-3b92-454b-9498-37d12616167f Behaviors[0].Range 450-950 574.9636 575.0000 +0.0364
8ac84e31-f0cf-43b2-8611-3316adfa4010 Behaviors[0].Range 500-1000 624.9636 625.0000 +0.0364
0271bb97-4ce8-4d64-97c3-8bfd3f76b2c6 Behaviors[0].Range 250-600 337.4745 337.5000 +0.0255
2933c4ce-bf41-459c-b0d6-9583466b393d Behaviors[0].Visibility 300-0 225.0219 225.0000 -0.0219
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Velocity 100-175 137.4782 137.5000 +0.0218
8ac84e31-f0cf-43b2-8611-3316adfa4010 Behaviors[0].Damage 100-250 137.4782 137.5000 +0.0218
72859489-677a-47a4-ae04-550e582ba29e Behaviors[0].PingBoost 10000-20000 12500.0200 12500.0000 -0.0205
205efba0-16af-477b-80e9-c9597cead5b4 Behaviors[0].Charge 50-200 103.0176 103.0330 +0.0154
372d23cc-5ef0-42b5-9d96-807f2e412b0d Behaviors[0].Charge 25-125 60.3450 60.3553 +0.0103
4a41dec8-6b65-46ee-b578-ba805f112c0c Behaviors[0].Damage 20-85 36.2405 36.2500 +0.0095
0d499d62-3b92-454b-9498-37d12616167f Behaviors[0].Damage 50-175 81.2409 81.2500 +0.0091
2933c4ce-bf41-459c-b0d6-9583466b393d Behaviors[0].Damage 40-160 69.9913 70.0000 +0.0087
34b15c33-c01f-4712-ac75-5fcf779f0685 Behaviors[0].Capacity 50-150 74.9927 75.0000 +0.0073
480d6cc4-cd8a-49b6-9c89-211033e7c1d5 Behaviors[0].PingEnergy 150-100 137.5073 137.5000 -0.0073
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Thrust 135-325 182.4931 182.5000 +0.0069
499f7891-c5df-4cbe-8431-9db7108102ec Behaviors[0].Damage 25-110 46.2438 46.2500 +0.0062
2935b4d4-2ad5-4b90-8416-a85bbb38171b Behaviors[1].WasteHeat 75-50 66.1663 66.1612 -0.0051
457ac901-aa54-4ba7-9df6-fbacdfb40b3f Behaviors[0].Damage 20-80 34.9956 35.0000 +0.0044
3aa1ac05-6d55-4569-8a4b-e1c3c6e07c61 Behaviors[0].Energy 25-50 33.8363 33.8388 +0.0026
72859489-677a-47a4-ae04-550e582ba29e Behaviors[0].PingRange 1000-2000 1250.0020 1250.0000 -0.0021
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].LockAngle 15-35 19.9985 20.0000 +0.0015
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Cooldown 15-8 12.5266 12.5251 -0.0014
480d6cc4-cd8a-49b6-9c89-211033e7c1d5 Behaviors[0].PingCooldown 20-5 16.2511 16.2500 -0.0011
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Energy 5-1 3.5866 3.5858 -0.0008
542169f2-363c-41f7-8d6d-60a5bd7578bd Behaviors[1].Emissivity 4-8 5.1885 5.1892 +0.0007
5ee2ff03-0ac4-4cdd-89bc-81e29223900b Behaviors[0].Damage 14-48 22.4994 22.5000 +0.0006
542169f2-363c-41f7-8d6d-60a5bd7578bd Behaviors[1].EnergyUsage 6-3 5.1086 5.1081 -0.0005

Corrections to this table (Soul S3/S4; Hands, 2026-09-18)

  • S3, wrong old-value columns. Soul found the Old optimum/Old value @ optimum columns below wrong for 15 of 51 rows. The pre-Cut-1 Performance() was saturate(HeatPerformanceCurve?.Evaluate(...) ?? 1): a design with no authored curve evaluated to exactly 1 at every temperature, so its correct old optimum is simply its MinimumTemperature (the whole range was equally "optimal") and its correct old value is 1.0000 -- not whatever this table originally printed. That is 14 rows: Assembly Line, Autocannon, Deep Ore Extractor, Industrial Thermostatic Heater, LRMM72, Large Drive, Refinery, SRMM72, Shipyard, Surface Ore Extractor, Tractor Beam, plight, pswarm, and Earp (Earp's real reclassification is below). The 15th wrong row is Core Power: its curve was non-null but authored with zero keys, so its old getter threw IndexOutOfRangeException -- there is no old baseline for it, and the table says so instead of printing a number.
  • S4, at-optimum understates the change ~80x. At-optimum is the one point a trapezoid and the curve it replaces are made to agree (both are fitted to the same peak), so it is the smallest possible reading of the shape change, not a representative one. The real size is the largest deviation anywhere inside the item's own band -- added below as Max |Δ| in band, sampled at 2001 points across [MinimumTemperature, MaximumTemperature], old code (pre-Cut-1 catalog and curve-reading Performance()) against new (current code, current catalog). 35 of the 37 originally-fitted designs share the exact same +0.1923 -- one Bezier template reused catalog-wide, evaluated identically regardless of hardpoint or behaviour -- and The Bat moves by a different amount for a reason of its own (below). Earp does not belong in the "fitted, small delta" group at all.

Earp and The Bat: found while closing S5/S6, not part of the operator's 15

Enforcing the plateau-clamp rule this cut's validation now carries (StatValidation.ValidateHeatResponse, ItemData.cs; enforced on every catalog write through CultRecordRefs.Upsert, AetheriaStores.cs) breaks the catalog for exactly two already-fitted designs outside the operator's named 15: their authored plateau, built from the real curve's peak and near-peak width, pokes past a bound.

  • Earp's real 2-key curve peaks at parameter 0 -- exactly at its own MinimumTemperature (175). That is the same failure class as S1/S2: Performance() returns 0 at MinimumTemperature, not just below it, so a peak sitting exactly on the boundary is dead at every temperature the design will ever reach. Soul's original "Earp down" framing (+0.0023 -> ~0 at-optimum) undersold this badly: the at-optimum sample landed exactly on the one point where the old fit and the new trapezoid both happen to read close to 1, by construction of the old curve peaking there too. Earp is re-authored the same way as the 14 (house-style fraction over its own bounds -- see the table below); its Max |Δ| in band is now -1.0000, the same "went from immune to fatal" shape as the unauthored designs, which is what it always was underneath the misleading at-optimum reading.
  • The Bat is different: its optimum (209) is a genuinely distinct fitted value, not a placeholder or an edge artifact, and stays untouched. Only its PlateauWidth moves, from 33 (whose low edge, 192.5, poked 7.5 past MinimumTemperature 200) to 18, the largest width whose plateau still clamps to the bounds with the optimum held fixed. This moves The Bat's own Max |Δ| in band from Soul's originally-measured +0.876 to +0.968 -- both computed the same way against the pre-Cut-1 curve; the difference is entirely the narrower plateau, which now reaches full performance immediately above MinimumTemperature instead of only within the old, poking width.
Item Type Bounds Old optimum New optimum New plateau width Old value @ old optimum Max |Δ| in band @ temp (old→new)
6k Shooter WeaponItemData 173.15-473.15 249.5 249.65 36 0.9977 +0.1923 @ 356.15 (0.3770->0.5693)
Arctica GearData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Assembly Line GearData 273.15-373.15 273.15 298.65 12 1.0000 -1.0000 @ 273.15 (1.0000->0.0000)
Autocannon WeaponItemData 173.15-473.15 173.15 249.65 36 1.0000 -1.0000 @ 173.15 (1.0000->0.0000)
CShot RainbowLite Lazer WeaponItemData 250-400 288.175 288.25 18 0.9977 +0.1923 @ 341.5 (0.3770->0.5693)
ChargeBlast SG WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
ChargeBlast+- WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
ClearPath WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Cockpit 2x2 GearData 223.15-398.15 267.688 267.775 21 0.9977 +0.1923 @ 329.9 (0.3770->0.5693)
ColdFire WeaponItemData 263.15-398.15 297.508 297.575 16.2 0.9977 +0.1923 @ 345.5 (0.3770->0.5693)
Core Power GearData 200-450 N/A 263.75 30 N/A (threw IndexOutOfRangeException) N/A
DeathCluster WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Deep Ore Extractor GearData 273.15-373.15 273.15 298.65 12 1.0000 -1.0000 @ 273.15 (1.0000->0.0000)
Earp WeaponItemData 175-475 175 251.5 36 1.0000 -1.0000 @ 175 (1.0000->0.0000)
FastBlast+- WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
GT 3K WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Iapyx GearData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Industrial Thermostatic Heater GearData 150-400 150 213.75 30 1.0000 -1.0000 @ 150 (1.0000->0.0000)
LRMM72 WeaponItemData 223.15-473.15 223.15 286.9 30 1.0000 -1.0000 @ 223.15 (1.0000->0.0000)
Large Drive GearData 200-400 200 251 24 1.0000 -1.0000 @ 200 (1.0000->0.0000)
LonginusX HullData 173.15-573.15 274.95 275.15 48 0.9977 +0.1923 @ 417.15 (0.3770->0.5693)
Manhattan GearData 200-450 263.625 263.75 30 0.9977 +0.1923 @ 352.5 (0.3770->0.5693)
Medium Docking Bay DockingBayData -0-673.15 171.317 171.653 80.778 0.9977 +0.1923 @ 410.622 (0.3770->0.5693)
MoveOnPro GearData 200-500 276.35 276.5 36 0.9977 +0.1923 @ 383 (0.3770->0.5693)
Notorious GearData 250-450 300.9 301 24 0.9977 +0.1923 @ 372 (0.3770->0.5693)
OK Disperser GearData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
PotaT+- GearData 200-500 276.35 276.5 36 0.9977 +0.1923 @ 383 (0.3770->0.5693)
Refinery GearData 273.15-373.15 273.15 298.65 12 1.0000 -1.0000 @ 273.15 (1.0000->0.0000)
SRMM72 WeaponItemData 223.15-473.15 223.15 286.9 30 1.0000 -1.0000 @ 223.15 (1.0000->0.0000)
SafeStuff II CargoBayData 175-600 283.163 283.375 51 0.9977 +0.1923 @ 434.25 (0.3770->0.5693)
Shipyard GearData 273.15-373.15 273.15 298.65 12 1.0000 -1.0000 @ 273.15 (1.0000->0.0000)
Skiron GearData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
Spectra WeaponItemData 263.15-398.15 297.508 297.575 16.2 0.9977 +0.1923 @ 345.5 (0.3770->0.5693)
Store-All Enterprise Edition CargoBayData 175-600 283.163 283.375 51 0.9977 +0.1923 @ 434.25 (0.3770->0.5693)
Store-All Plus CargoBayData 175-600 283.163 283.375 51 0.9977 +0.1923 @ 434.25 (0.3770->0.5693)
Store-All Plus Mini CargoBayData 175-600 283.163 283.375 51 0.9977 +0.1923 @ 434.25 (0.3770->0.5693)
Surface Ore Extractor GearData 273.15-373.15 273.15 298.65 12 1.0000 -1.0000 @ 273.15 (1.0000->0.0000)
The Bat GearData 200-400 208.8 209 18 1.0000 +0.9680 @ 200.1 (0.0320->1.0000)
Traction GearData 200-450 263.625 263.75 30 0.9977 +0.1923 @ 352.5 (0.3770->0.5693)
Tractor Beam GearData -0--0 -> 200-400 -0 251 24 1.0000 -1.0000 @ -0 (1.0000->0.0000)
Turret HullData 123.15-773.15 288.575 288.9 78 0.9977 +0.1923 @ 519.65 (0.3770->0.5693)
Turret Control Module GearData 173.15-523.15 262.225 262.4 42 0.9977 +0.1923 @ 386.65 (0.3770->0.5693)
Vulcan GearData 200-500 276.35 276.5 36 0.9977 +0.1923 @ 383 (0.3770->0.5693)
Zenith HullData 123.15-773.15 288.575 288.9 78 0.9977 +0.1923 @ 519.65 (0.3770->0.5693)
cold like my heart GearData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
deep space burnout GearData 200-400 250.9 251 24 0.9977 +0.1923 @ 322 (0.3770->0.5693)
not if i see you first GearData 200-400 250.9 251 24 0.9977 +0.1923 @ 322 (0.3770->0.5693)
plight WeaponItemData 263.15-398.15 263.15 297.575 16.2 1.0000 -1.0000 @ 263.15 (1.0000->0.0000)
pretty pretty bang bang WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)
pswarm WeaponItemData 223.15-473.15 223.15 286.9 30 1.0000 -1.0000 @ 223.15 (1.0000->0.0000)
scorched void policy WeaponItemData 223.15-473.15 286.775 286.9 30 0.9977 +0.1923 @ 375.65 (0.3770->0.5693)

Re-authoring: Tractor Beam, 13 curve-less designs, and Earp/The Bat (operator ruling: "reauthor those items")

Written through the catalog's own types, in a scratch console over Aetheria.Shared (not committed; the committed GameData/Aetheria.cc diff is the artifact). Every already-fitted design in the catalog shares the exact same normalized curve shape -- optimum at 25.5% of the range above MinimumTemperature, plateau 12% of the range wide -- regardless of hardpoint or behaviour, matching five distinct bound ranges to 5+ significant figures. That is not rounding coincidence; it is one Bezier template authored once and reused catalog-wide, and the 14 unauthored designs are simply the ones nobody assigned it to. Each row below applies that same fraction to the design's own (unchanged, except Tractor Beam's) bounds, or points at the specific sibling design that carries the identical bounds and therefore the identical fitted curve. All 16 records were validated (StatValidation.ValidateHeatResponse) before any write reached disk; a failing record would have written nothing.

Item What it is Old bounds Proposed (landed) Why
Assembly Line Tool-hardpoint facility gear, no active Behavior (a station production module) 273.15-373.15, degenerate full-range plateau Opt 298.65, PW 12 (bounds unchanged) House-style fraction (25.5%/12%) over its own band; shares its exact bounds and prior placeholder shape with 4 sibling facility items below
Deep Ore Extractor Same Tool/no-Behavior facility family 273.15-373.15, degenerate Opt 298.65, PW 12 Same as Assembly Line -- identical bounds, identical fraction
Refinery Same Tool/no-Behavior facility family 273.15-373.15, degenerate Opt 298.65, PW 12 Same as Assembly Line
Shipyard Same Tool/no-Behavior facility family 273.15-373.15, degenerate Opt 298.65, PW 12 Same as Assembly Line
Surface Ore Extractor Same Tool/no-Behavior facility family 273.15-373.15, degenerate Opt 298.65, PW 12 Same as Assembly Line
Autocannon Ballistic weapon, AutoWeaponData 173.15-473.15, degenerate Opt 249.65, PW 36 Matches 6k Shooter, the only other design sharing this exact 173.15-473.15 band
Core Power Reactor gear, ReactorData+WearData 200-450, degenerate (old curve authored with 0 keys, old getter threw) Opt 263.75, PW 30 Matches Manhattan, the only other design sharing this exact 200-450 band
Industrial Thermostatic Heater Tool-hardpoint heater, ThermotoggleData+EnergyDrawData+HeatData (it generates heat) 150-400, degenerate Opt 213.75, PW 30 House-style fraction skewed toward the cold end, matching a device meant to run best where it is needed (cold) and degrade once its own output overheats it
LRMM72 Launcher weapon, LauncherData 223.15-473.15, degenerate Opt 286.9, PW 30 Matches GT 3K (LauncherData) and scorched void policy (GuidedWeaponData), both sharing this exact band with identical fitted curves
SRMM72 Launcher weapon, GuidedWeaponData 223.15-473.15, degenerate Opt 286.9, PW 30 Matches scorched void policy, same hardpoint/behaviour/band
pswarm Launcher weapon, GuidedWeaponData 223.15-473.15, degenerate Opt 286.9, PW 30 Matches scorched void policy, same hardpoint/behaviour/band
Large Drive Thruster gear, ThrusterData+WearData 200-400, degenerate Opt 251, PW 24 Matches deep space burnout, the only other design sharing this exact 200-400 Thruster band
plight Energy weapon, ChargedWeaponData 263.15-398.15, degenerate Opt 297.575, PW 16.2 Matches ColdFire and Spectra, both sharing this exact band with identical fitted curves (AutoWeaponData, but bounds -- not behaviour -- is what the shared template keys on)
Tractor Beam Sensors-hardpoint gear, no active Behavior -0 to -0, min==max==optimum, width 0 (S1: dead at every temperature) Bounds 200-400 (newly authored), Opt 251, PW 24 Never had real bounds authored at all; 200-400 matches the other small Sensors/gear family already using that exact range (not if i see you first, The Bat, Large Drive, deep space burnout), and the fraction gives it not-if-i-see-you-first's exact curve
Earp Ballistic weapon, InstantWeaponData 175-475, real 2-key curve peaking exactly at Minimum (dead at every temperature -- same bug class as S1, found while enforcing S5/S6's plateau-clamp rule) Opt 251.5, PW 36 House-style fraction over its own unique 175-475 band (no exact-bounds sibling exists); moves its peak off the lethal boundary the same way the 14 do
The Bat Sensors-hardpoint gear, SensorData 200-400, real fitted optimum 209, PlateauWidth 33 (pokes 7.5 past Minimum -- found while enforcing S5/S6) PlateauWidth 18 only; optimum 209 unchanged Minimal fix: shrink only the plateau to the largest width that clamps to the bounds with the authored optimum held fixed, preserving the one genuinely distinct fitted curve in this list

Zero consumables in the catalog

Cut 0 flagged that ItemManager.CreateInstance has no ConsumableItemData branch, so a ConsumableItem is apparently never minted by the normal path, and asked whether Cut 1 should look before touching consumables. (probe) The catalog holds zero ConsumableItemData records (cache.GetAll<ConsumableItemData>().Count() == 0 against GameData/Aetheria.cc). There is nothing to touch: no consumable design exists to migrate, to break, or to validate.