Cut 7: author roles into the catalog, and the operator review table
roles-migrate apply, run once: 32 of 51 designs now declare roles (183 stats pointed at the role that governs them; the other 19 designs' kinds either carry no quality-bearing behaviour at all, or every candidate stat is authored flat with no observable role-vs-workmanship difference). 28 of 37 products authored matching ProductRole quality; the rest sell an unrolled design or a design no product sells (Core Power, Industrial Thermostatic Heater, pswarm, plight -- all already flagged unsold in the Cut 1 census). docs/stats-power-cut7-roles.md is the legible review table the map's O7 calls for: every design's roles and which stat took each, grouped by item kind, plus every product's authored mean/deviation and its basis (one real brand identity -- Arctica/Alakrita on heat efficiency, from item-provenance-target.md -- the rest generic placeholders flagged for operator review). Verified before/after: AetherDb dangling/station-fit/hardpoint-fit output is byte-identical; `loadout 1` output is byte-identical (no generation behaviour moved); census reports 0 designs with roles and no matching product spread; 144 Aetheria.Shared.Tests pass (was 141); the six-mutation harness in mutation_tests_stats_power_cut8.py all behave as declared. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
6d2b6e939d
commit
c4f6029e5d
2 changed files with 204 additions and 2 deletions
BIN
GameData/Aetheria.cc
(Stored with Git LFS)
BIN
GameData/Aetheria.cc
(Stored with Git LFS)
Binary file not shown.
202
docs/stats-power-cut7-roles.md
Normal file
202
docs/stats-power-cut7-roles.md
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
# Cut 7 (Roles Authored): Operator Review
|
||||
|
||||
Generated by `dotnet run --project tools/AetherDb -- roles-migrate` (dry run captures this exact table; `apply`
|
||||
landed it in `GameData/Aetheria.cc`). Regenerate with `roles-migrate` any time the catalog changes — this file is
|
||||
a snapshot for review, not a second source of truth.
|
||||
|
||||
Role vocabulary is small and shared within a kind: the same handful of part names cover every design of that
|
||||
kind, not one bespoke name per item. A stat is only pointed at a role when it both carries a `Quality` term and
|
||||
actually varies with quality (`Min != Max`) — Cut 1's flat placeholder stats (`Min == Max`, a harmless leftover
|
||||
`Heat^1` term) have no observable role-vs-workmanship difference, so pointing a role at one would be authoring
|
||||
fiction, not content.
|
||||
|
||||
Product role means below are almost all **generic placeholders** (deterministic per product+role, not hand-tuned)
|
||||
flagged "needs operator review" — the one exception is Arctica/Alakrita, where `docs/item-provenance-target.md`
|
||||
already states a brand identity ("optimizing for heat efficiency"). Every other product is waiting on the
|
||||
operator to decide who is actually good at what; right now they only differ from each other by an arbitrary seed,
|
||||
not by authored intent.
|
||||
|
||||
## Designs and their roles, by item kind
|
||||
|
||||
### AetherDrive
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| Traction | coupling, rotor | `AetherDriveData.MaximumRpm` → rotor · `AetherDriveData.Torque` → rotor · `AetherDriveData.CouplingEfficiency` → coupling · `AetherDriveData.EnergyDraw` → coupling · `AetherDriveData.PassiveCoupling` → coupling |
|
||||
|
||||
**Role meanings:** *rotor* — the spinning core that produces RPM and torque. *coupling* — how efficiently that
|
||||
output couples into drive and how much bleeds off passively.
|
||||
|
||||
### CargoBay, ControlModule, DockingBay, Hull/Station, Hull/Turret — no roles
|
||||
|
||||
SafeStuff II, Store-All Enterprise Edition, Store-All Plus, Store-All Plus Mini (CargoBay); Cockpit 2x2, Turret
|
||||
Control Module (ControlModule); Medium Docking Bay (DockingBay); Zenith (Hull/Station); Turret (Hull/Turret).
|
||||
|
||||
**Why:** none of these kinds' behaviours read `StatSource.Quality` at all today (cargo capacity, docking, cockpit
|
||||
draw and hull cross-section on these particular designs are flat or non-quality stats) — there is no per-part
|
||||
distinction for a role to express yet. Generic quality stays. Turret's own `ReflectorData.CrossSection` is present
|
||||
but authored flat (`Heat^1`, no `Quality` term), unlike LonginusX's.
|
||||
|
||||
### Hull/Ship
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| LonginusX | plating | `ReflectorData.CrossSection` → plating |
|
||||
|
||||
**Role meaning:** *plating* — the hull's armor/stealth coating, which is what actually governs radar cross-section.
|
||||
|
||||
### Radiator
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| Arctica | fins, pump, reservoir | `Emissivity`→fins · `WasteHeat`→fins · `PumpedHeat`→pump · `EnergyUsage`→pump · `ThermalMass`→reservoir |
|
||||
| cold like my heart | fins, pump, reservoir | same five fields, same roles |
|
||||
| OK Disperser | fins, pump, reservoir | same five fields, same roles |
|
||||
| Iapyx | reservoir | `ThermalMass`→reservoir only (Emissivity/PumpedHeat/WasteHeat/EnergyUsage are authored flat, `Heat^1`, no Quality term) |
|
||||
| Skiron | reservoir | same as Iapyx |
|
||||
|
||||
**Role meanings:** *fins* — the radiating surface (emissivity, waste heat). *pump* — the coolant pump (heat moved,
|
||||
its own energy cost). *reservoir* — the thermal mass of the coolant loop itself.
|
||||
|
||||
### Reactor
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| Core Power | core, regulator | `Efficiency`→core · `OverloadEfficiency`→regulator · `ThrottlingFactor`→regulator (Charge authored flat here) |
|
||||
| Manhattan | core, regulator | `Charge`→core · `Efficiency`→core · `OverloadEfficiency`→regulator · `ThrottlingFactor`→regulator |
|
||||
| MoveOnPro | core, regulator | same four |
|
||||
| Notorious | core, regulator | same four |
|
||||
| Vulcan | core, regulator | same four |
|
||||
|
||||
**Role meanings:** *core* — the primary reaction chamber (raw charge and efficiency). *regulator* — the safety and
|
||||
throttling electronics (overload behaviour, throttling).
|
||||
|
||||
MoveOnPro also carries a `StatModifierData.Modifier` (Quality-termed) — left at generic quality: it modifies an
|
||||
external stat rather than the reactor's own part, so no reactor role fits it.
|
||||
|
||||
### Sensors
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| not if i see you first | emitter, receiver | `Sensitivity`→receiver · `PingBoost`,`PingEnergy`,`PingVisibility`,`PingRange`,`PingCooldown`→emitter |
|
||||
| The Bat | emitter, receiver | `Sensitivity`→receiver · `PingBoost`,`PingVisibility`,`PingRange`,`PingCooldown`→emitter (`PingEnergy` authored flat here) |
|
||||
| Tractor Beam | *(none)* | dead design (S1, Cut 1 findings): every field is flat, nothing to point |
|
||||
|
||||
**Role meanings:** *receiver* — passive sensitivity. *emitter* — the active ping subsystem (boost, cost,
|
||||
visibility, range, cooldown).
|
||||
|
||||
### Thruster
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| deep space burnout | injector, nozzle | `Thrust`→nozzle · `Visibility`→nozzle · `Heat`→injector (`EnergyUsage` authored flat 0/0, no terms) |
|
||||
| Large Drive | *(none)* | every field authored flat (`Heat^1`/`Quality^1` but `Min == Max` throughout) |
|
||||
|
||||
**Role meanings:** *nozzle* — exhaust output and plume (thrust, visibility). *injector* — fuel/power feed, whose
|
||||
byproduct is heat.
|
||||
|
||||
### Tool
|
||||
|
||||
Tool is not a shared kind the way a laser or radiator is — each design is its own bespoke gadget, so roles are
|
||||
authored per design rather than from one shared field map.
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| Industrial Thermostatic Heater | heating element | `EnergyDrawData.EnergyDraw`→heating element · `HeatData.Heat`→heating element |
|
||||
| PotaT+- | converter, storage cell | `CapacitorData.Capacity`→storage cell · `CapacitorData.Efficiency`→converter |
|
||||
| Assembly Line, Deep Ore Extractor, Refinery, Shipyard, Surface Ore Extractor | *(none)* | carry no `PerformanceStat` behaviour at all in the current catalog |
|
||||
|
||||
### Weapon/Ballistic
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| 6k Shooter | barrel, feed mechanism | `Damage`,`Range`,`Velocity`→barrel · `Heat`,`Visibility`,`Spread`→feed mechanism |
|
||||
| Earp | barrel, feed mechanism | same shape as 6k Shooter |
|
||||
| ClearPath | barrel, feed mechanism | `Damage`,`Range`,`Velocity`→barrel · `Cooldown`,`Energy`,`Heat`,`Visibility`,`Spread`→feed mechanism |
|
||||
| DeathCluster | barrel, feed mechanism | same shape as ClearPath |
|
||||
| pretty pretty bang bang | barrel, feed mechanism | same shape as ClearPath (charged weapon, same field names) |
|
||||
| Autocannon | *(none)* | dead design (S1, Cut 1 findings): every field flat |
|
||||
|
||||
**Role meanings:** *barrel* — the part that decides damage, range and muzzle velocity. *feed mechanism* — cycling:
|
||||
rate of fire, spread, heat and signature it generates, and (where authored) its energy cost.
|
||||
|
||||
### Weapon/Energy
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| CShot RainbowLite Lazer | focusing array, power coupling | `Damage`,`Range`→focusing array · `Cooldown`,`Energy`,`Heat`,`Visibility`,`Spread`→power coupling |
|
||||
| ColdFire | focusing array, power coupling | same shape |
|
||||
| Spectra | focusing array, power coupling | same shape |
|
||||
| FastBlast+- | focusing array, power coupling | `Damage`,`Range`,`Velocity`→focusing array · `Cooldown`,`Heat`,`Visibility`,`Spread`→power coupling |
|
||||
| ChargeBlast SG | focusing array, power coupling | `Damage`,`Range`,`Velocity`→focusing array · `ChargeTime`,`ChargeHeat`,`Cooldown`,`Visibility`,`Spread`→power coupling |
|
||||
| ChargeBlast+- | focusing array, power coupling | same shape as ChargeBlast SG |
|
||||
| plight | focusing array, power coupling | `Damage`,`Range`→focusing array · `ChargeTime`,`ChargeEnergy`,`ChargeHeat`,`Cooldown`,`Heat`,`Visibility`→power coupling |
|
||||
|
||||
**Role meanings:** *focusing array* — the beam optics that decide damage, range and velocity. *power coupling* —
|
||||
everything about how the weapon draws, stores and discharges energy (including charge-up on charged lasers) and
|
||||
the heat/signature that produces.
|
||||
|
||||
### Weapon/Launcher
|
||||
|
||||
| Design | Roles | Stat → role |
|
||||
|---|---|---|
|
||||
| GT 3K | guidance system, thruster, warhead | `Damage`,`DamageSpread`→warhead · `LockSpeed`,`SensorImpact`,`LockAngle`,`DirectionImpact`,`Decay`,`Range`,`Cooldown`,`Energy`,`Heat`,`Visibility`→guidance system · `Thrust`,`MissileVelocity`,`Velocity`→thruster |
|
||||
| pswarm | guidance system, thruster, warhead | `Damage`,`DamageSpread`→warhead · `Cooldown`,`Range`,`Energy`,`Heat`,`Visibility`→guidance system · `Thrust`,`MissileVelocity`,`Velocity`→thruster |
|
||||
| scorched void policy | guidance system, thruster, warhead | same shape as pswarm |
|
||||
| LRMM72, SRMM72 | *(none)* | dumbfire volleys authored fully flat: every field `Heat^1`, nothing varies |
|
||||
|
||||
**Role meanings:** *warhead* — payload (damage, damage spread, penetration). *guidance system* — the seeker
|
||||
(lock speed/angle, sensor and direction sensitivity, decay, targeting range, cooldown, its own energy/heat/
|
||||
signature). *thruster* — the missile's own motor (thrust, flight/missile velocity).
|
||||
|
||||
## Product role quality authored
|
||||
|
||||
37 products exist; 28 got role-quality entries this pass (the rest sell a design that authored no role, or are
|
||||
one of the two-missile launchers left flat). All means/deviations are **generic placeholders** except Arctica's
|
||||
`fins`, and every row below needs an operator pass to become real brand identity rather than an arbitrary seed.
|
||||
|
||||
| Product (= design; content pass to split brand vs. design names is separate scope) | Role | Mean | Dev | Basis |
|
||||
|---|---|---|---|---|
|
||||
| Arctica | fins | 0.78 | 0.07 | **lore**: Alakrita brands on heat efficiency (`item-provenance-target.md`) |
|
||||
| Arctica | pump | 0.47 | 0.11 | generic — needs review |
|
||||
| Arctica | reservoir | 0.53 | 0.14 | generic — needs review |
|
||||
| cold like my heart | fins, pump, reservoir | 0.54 / 0.74 / 0.73 | 0.17 / 0.17 / 0.09 | generic — needs review |
|
||||
| OK Disperser | fins, pump, reservoir | 0.61 / 0.57 / 0.59 | 0.14 / 0.10 / 0.18 | generic — needs review |
|
||||
| Iapyx | reservoir | 0.61 | 0.17 | generic — needs review |
|
||||
| Skiron | reservoir | 0.64 | 0.16 | generic — needs review |
|
||||
| Manhattan | core, regulator | 0.48 / 0.63 | 0.08 / 0.12 | generic — needs review |
|
||||
| MoveOnPro | core, regulator | 0.62 / 0.46 | 0.15 / 0.15 | generic — needs review |
|
||||
| Notorious | core, regulator | 0.65 / 0.46 | 0.15 / 0.17 | generic — needs review |
|
||||
| Vulcan | core, regulator | 0.75 / 0.58 | 0.12 / 0.16 | generic — needs review |
|
||||
| not if i see you first | emitter, receiver | 0.71 / 0.75 | 0.09 / 0.18 | generic — needs review |
|
||||
| The Bat | emitter, receiver | 0.45 / 0.57 | 0.09 / 0.16 | generic — needs review |
|
||||
| deep space burnout | injector, nozzle | 0.64 / 0.67 | 0.12 / 0.14 | generic — needs review |
|
||||
| Traction | coupling, rotor | 0.69 / 0.65 | 0.10 / 0.10 | generic — needs review |
|
||||
| LonginusX | plating | 0.48 | 0.13 | generic — needs review |
|
||||
| PotaT+- | converter, storage cell | 0.67 / 0.53 | 0.17 / 0.11 | generic — needs review |
|
||||
| 6k Shooter | barrel, feed mechanism | 0.59 / 0.46 | 0.14 / 0.14 | generic — needs review |
|
||||
| ClearPath | barrel, feed mechanism | 0.71 / 0.57 | 0.10 / 0.10 | generic — needs review |
|
||||
| DeathCluster | barrel, feed mechanism | 0.65 / 0.68 | 0.17 / 0.11 | generic — needs review |
|
||||
| Earp | barrel, feed mechanism | 0.73 / 0.68 | 0.13 / 0.10 | generic — needs review |
|
||||
| pretty pretty bang bang | barrel, feed mechanism | 0.51 / 0.63 | 0.10 / 0.09 | generic — needs review |
|
||||
| CShot RainbowLite Lazer | focusing array, power coupling | 0.71 / 0.54 | 0.16 / 0.11 | generic — needs review |
|
||||
| ChargeBlast SG | focusing array, power coupling | 0.51 / 0.54 | 0.09 / 0.10 | generic — needs review |
|
||||
| ChargeBlast+- | focusing array, power coupling | 0.45 / 0.51 | 0.17 / 0.18 | generic — needs review |
|
||||
| ColdFire | focusing array, power coupling | 0.68 / 0.58 | 0.10 / 0.13 | generic — needs review |
|
||||
| FastBlast+- | focusing array, power coupling | 0.74 / 0.61 | 0.11 / 0.13 | generic — needs review |
|
||||
| Spectra | focusing array, power coupling | 0.75 / 0.63 | 0.09 / 0.13 | generic — needs review |
|
||||
| GT 3K | guidance system, thruster, warhead | 0.69 / 0.63 / 0.58 | 0.15 / 0.17 / 0.16 | generic — needs review |
|
||||
| scorched void policy | guidance system, thruster, warhead | 0.61 / 0.61 / 0.68 | 0.08 / 0.12 / 0.15 | generic — needs review |
|
||||
|
||||
**Not authored (no product sells the design, so nothing to author):** Core Power, Industrial Thermostatic Heater,
|
||||
pswarm, plight (all previously flagged "no product sells" in the Cut 1 census; still true here).
|
||||
|
||||
## O7 — what the operator should actually do with this
|
||||
|
||||
Everything above the "generic — needs review" line is mechanically correct (verified: `census`'s new
|
||||
"(product, role) pairs where a sold, role-bearing design authors no matching spread" check reports 0, and two
|
||||
products of one design with different means resolve a role-termed stat to different, deterministic values —
|
||||
`RoleAuthoringTests.TwoProductsOfOneDesignWithDifferentRoleMeansResolveDifferentValues`). What it is *not* is
|
||||
real market segmentation: every design still has exactly one product, so nothing yet demonstrates "a second
|
||||
product with a role pumped up." That is next scope, and it needs the operator's judgment on which manufacturer
|
||||
is good at what — this table is the jumping-off point, not the destination.
|
||||
Loading…
Reference in a new issue