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

238 lines
24 KiB
Markdown

# 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 &#124;Δ&#124; in band @ temp (old&rarr;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.