namespace SomhairlesDream.Modeling open SomhairlesDream.Shared [] type DesignStep = { StepId: string Index: int ObjectIds: string array Changes: ArtifactChange array } module Design = let steps : DesignStep array = [| { StepId = "01-foundation"; Index = 0 ObjectIds = [| "heritage.foundation"; "heritage.deck" |] Changes = [| { ObjectId = "heritage.foundation"; Kind = "add"; Summary = "Add foundation slab" } { ObjectId = "heritage.deck"; Kind = "add"; Summary = "Add raised deck" } |] } { StepId = "02-frame"; Index = 1 ObjectIds = [| "heritage.foundation"; "heritage.deck"; "heritage.frame.left"; "heritage.frame.right"; "heritage.spine" |] Changes = [| { ObjectId = "heritage.frame.left"; Kind = "add"; Summary = "Add primary left frame" } { ObjectId = "heritage.frame.right"; Kind = "add"; Summary = "Add primary right frame" } { ObjectId = "heritage.spine"; Kind = "add"; Summary = "Add central spine" } |] } { StepId = "03-cabin"; Index = 2 ObjectIds = [| "heritage.foundation"; "heritage.deck"; "heritage.frame.left"; "heritage.frame.right"; "heritage.spine"; "heritage.cabin"; "heritage.crossbeam" |] Changes = [| { ObjectId = "heritage.cabin"; Kind = "add"; Summary = "Add cabin volume" } { ObjectId = "heritage.crossbeam"; Kind = "add"; Summary = "Add cabin crossbeam" } |] } |] // YJ-01 Voyager-class current-tech probe (source: interstellar-dual-track/current-tech-probe // scripts/build_probe.py, line ranges cited per step). Object ids map the legacy // UPPER_SNAKE names onto lowercase dotted ids via documented rule // (probe.bus.bay.panel.00 <- BUS_BAY_PANEL_00, probe.rtg.01.fin.00 <- RTG_01_FIN_0). // Display plinth, information card and MODEL_LABEL are intentionally excluded. let probeSteps : DesignStep array = let bus = [| "probe.bus.electronics.decagon"; "probe.bus.ring.front"; "probe.bus.ring.rear" "probe.bus.bay.panel.00"; "probe.bus.bay.panel.01"; "probe.bus.bay.panel.02" "probe.bus.bay.panel.03"; "probe.bus.bay.panel.04"; "probe.bus.bay.panel.05" "probe.bus.bay.panel.06"; "probe.bus.bay.panel.07"; "probe.bus.bay.panel.08" "probe.bus.bay.panel.09" "probe.bus.mli.top"; "probe.bus.mli.bottom" "probe.bus.radiator.port"; "probe.bus.radiator.starboard" "probe.aacs" "probe.thruster.01"; "probe.thruster.02"; "probe.thruster.03"; "probe.thruster.04" |] let booms = [| "probe.rtg.boom" "probe.mag.boom"; "probe.mag.head"; "probe.mag.sensor.a"; "probe.mag.sensor.b" "probe.pws.antenna.left"; "probe.pws.antenna.right" "probe.pws.tip.left"; "probe.pws.tip.right" |] let rtgs = [| "probe.rtg.01"; "probe.rtg.01.fin.00"; "probe.rtg.01.fin.01"; "probe.rtg.01.fin.02" "probe.rtg.02"; "probe.rtg.02.fin.00"; "probe.rtg.02.fin.01"; "probe.rtg.02.fin.02" "probe.rtg.03"; "probe.rtg.03.fin.00"; "probe.rtg.03.fin.01"; "probe.rtg.03.fin.02" |] let hga = [| "probe.hga.reflector"; "probe.hga.feed" "probe.hga.strut.00"; "probe.hga.strut.01"; "probe.hga.strut.02"; "probe.hga.strut.03" |] let instruments = [| "probe.scan.pivot"; "probe.scan.platform" "probe.crs"; "probe.plasma"; "probe.optical"; "probe.optical.aperture" |] let mast = [| "probe.science.boom" |] let prior (prefix: string array) (current: string array) = Array.append prefix current let busChanges = bus |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add ten-sided bus with bay panels, MLI and radiators" }) let boomChanges = booms |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add fields-and-particles and RTG support booms" }) let rtgChanges = rtgs |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add three RTGs with heat-rejection fins" }) let hgaChanges = hga |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add high-gain antenna, feed and struts" }) let instrumentChanges = instruments |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add articulated scan platform with science instruments" }) let mastChanges = mast |> Array.map (fun id -> { ObjectId = id; Kind = "add"; Summary = "Add deployable science mast" }) let liveryChanges = [| { ObjectId = "probe.hga.reflector"; Kind = "update"; Summary = "Livery pass: reflector white finish" } { ObjectId = "probe.bus.mli.top"; Kind = "update"; Summary = "Livery pass: MLI gold foil finish" } { ObjectId = "probe.bus.bay.panel.01"; Kind = "update"; Summary = "Livery pass: restrained red accents on bay panels" } { ObjectId = "probe.pws.tip.left"; Kind = "update"; Summary = "Livery pass: red antenna tip markers" } { ObjectId = "probe.bus.electronics.decagon"; Kind = "update"; Summary = "Livery pass: body blue basecoat" } { ObjectId = "probe.rtg.01"; Kind = "update"; Summary = "Livery pass: graphite RTG housings" } |] [| { StepId = "probe-01-bus"; Index = 0; ObjectIds = bus; Changes = busChanges } { StepId = "probe-02-boom"; Index = 1; ObjectIds = prior bus booms; Changes = boomChanges } { StepId = "probe-03-rtg"; Index = 2; ObjectIds = prior (prior bus booms) rtgs; Changes = rtgChanges } { StepId = "probe-04-hga"; Index = 3; ObjectIds = prior (prior (prior bus booms) rtgs) hga; Changes = hgaChanges } { StepId = "probe-05-instruments"; Index = 4 ObjectIds = prior (prior (prior (prior bus booms) rtgs) hga) instruments; Changes = instrumentChanges } { StepId = "probe-06-mast"; Index = 5 ObjectIds = prior (prior (prior (prior (prior bus booms) rtgs) hga) instruments) mast Changes = mastChanges } { StepId = "probe-07-livery"; Index = 6 ObjectIds = prior (prior (prior (prior (prior (prior bus booms) rtgs) hga) instruments) mast) [||] Changes = liveryChanges } |] // HNX-01 crewed interstellar starship (Concept A "Keel"): fusion-torch // study with a spin-gravity habitat torus, water-shadow radiation // shield and an axial keel separating crew from the reactor section. // Display-scale visual research; no mass/thrust/shielding closure is // claimed — the ship.py module header lists the deliberately open // engineering problems. let shipSteps : DesignStep array = let keel = [| "starship.keel.spine"; "starship.nose.cone"; "starship.dock.ring" |] let hab = [| "starship.hab.torus"; "starship.hub.core" "starship.spoke.00"; "starship.spoke.01"; "starship.spoke.02" "starship.spoke.03"; "starship.spoke.04"; "starship.spoke.05" |] let radiation = [| "starship.shadow.collar"; "starship.storm.cellar" |] let reactor = [| "starship.core.pressure"; "starship.core.shield.plug" "starship.nozzle.magnetic" "starship.radiator.00"; "starship.radiator.01"; "starship.radiator.02" "starship.radiator.03"; "starship.radiator.04"; "starship.radiator.05" |] let power = [| "starship.power.truss"; "starship.capacitor.ring" "starship.comm.dish"; "starship.comm.feed" |] let cabin = [| "starship.window.00"; "starship.window.01"; "starship.window.02" "starship.window.03" "starship.airlock.ring"; "starship.airlock.tunnel" "starship.cargo.pod.00"; "starship.cargo.pod.01" |] let prior (prefix: string array) (current: string array) = Array.append prefix current let keelChanges = [| { ObjectId = "starship.keel.spine"; Kind = "add"; Summary = "Add axial keel spine from bow to nozzle bay" } { ObjectId = "starship.nose.cone"; Kind = "add"; Summary = "Add forward nose cone" } { ObjectId = "starship.dock.ring"; Kind = "add"; Summary = "Add forward docking ring" } |] let habChanges = Array.append [| { ObjectId = "starship.hab.torus"; Kind = "add"; Summary = "Add rotating spin-gravity habitat torus" } { ObjectId = "starship.hub.core"; Kind = "add"; Summary = "Add zero-g hub with bearing core" } |] (Array.init 6 (fun index -> { ObjectId = sprintf "starship.spoke.%02d" index; Kind = "add"; Summary = "Add pressurized transfer spoke" })) let radiationChanges = [| { ObjectId = "starship.shadow.collar"; Kind = "add"; Summary = "Add water-shadow radiation collar" } { ObjectId = "starship.storm.cellar"; Kind = "add"; Summary = "Add storm cellar shelter volume" } |] let reactorChanges = Array.append [| { ObjectId = "starship.core.pressure"; Kind = "add"; Summary = "Add fusion core pressure vessel" } { ObjectId = "starship.core.shield.plug"; Kind = "add"; Summary = "Add reactor shield plug" } { ObjectId = "starship.nozzle.magnetic"; Kind = "add"; Summary = "Add magnetic exhaust nozzle" } |] (Array.init 6 (fun index -> { ObjectId = sprintf "starship.radiator.%02d" index; Kind = "add"; Summary = "Add waste-heat radiator panel" })) let powerChanges = [| { ObjectId = "starship.power.truss"; Kind = "add"; Summary = "Add power conditioning truss" } { ObjectId = "starship.capacitor.ring"; Kind = "add"; Summary = "Add pulsed-power capacitor hoop" } { ObjectId = "starship.comm.dish"; Kind = "add"; Summary = "Add high-gain communication dish" } { ObjectId = "starship.comm.feed"; Kind = "add"; Summary = "Add communication feed horn" } |] let cabinChanges = Array.append (Array.init 4 (fun index -> { ObjectId = sprintf "starship.window.%02d" index; Kind = "add"; Summary = "Add habitat observation window" })) [| { ObjectId = "starship.airlock.ring"; Kind = "add"; Summary = "Add forward airlock ring" } { ObjectId = "starship.airlock.tunnel"; Kind = "add"; Summary = "Add pressurized airlock tunnel" } { ObjectId = "starship.cargo.pod.00"; Kind = "add"; Summary = "Add port cargo pod" } { ObjectId = "starship.cargo.pod.01"; Kind = "add"; Summary = "Add starboard cargo pod" } |] let liveryChanges = [| { ObjectId = "starship.keel.spine"; Kind = "update"; Summary = "Livery pass: bone-white hull structure" } { ObjectId = "starship.hab.torus"; Kind = "update"; Summary = "Livery pass: habitat ring bone finish" } { ObjectId = "starship.shadow.collar"; Kind = "update"; Summary = "Livery pass: ceramic shield darkening" } { ObjectId = "starship.storm.cellar"; Kind = "update"; Summary = "Livery pass: ceramic cellar finish" } { ObjectId = "starship.dock.ring"; Kind = "update"; Summary = "Livery pass: amber accent on dock ring" } { ObjectId = "starship.capacitor.ring"; Kind = "update"; Summary = "Livery pass: amber capacitor hoop" } { ObjectId = "starship.window.00"; Kind = "update"; Summary = "Livery pass: glass glazing" } { ObjectId = "starship.nozzle.magnetic"; Kind = "update"; Summary = "Livery pass: nozzle coil graphite" } |] [| { StepId = "ship-01-keel"; Index = 0; ObjectIds = keel; Changes = keelChanges } { StepId = "ship-02-hab"; Index = 1; ObjectIds = Array.append keel hab; Changes = habChanges } { StepId = "ship-03-radiation"; Index = 2; ObjectIds = Array.append (Array.append keel hab) radiation; Changes = radiationChanges } { StepId = "ship-04-reactor"; Index = 3; ObjectIds = Array.append (Array.append (Array.append keel hab) radiation) reactor; Changes = reactorChanges } { StepId = "ship-05-power"; Index = 4; ObjectIds = Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power; Changes = powerChanges } { StepId = "ship-06-cabin"; Index = 5; ObjectIds = Array.append (Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power) cabin; Changes = cabinChanges } { StepId = "ship-07-livery"; Index = 6; ObjectIds = Array.append (Array.append (Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power) cabin) [||]; Changes = liveryChanges } |] let forProject (projectId: string) : DesignStep array = if projectId.StartsWith("probe-") then probeSteps elif projectId.StartsWith("ship-") then shipSteps else steps