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 } |] let forProject (projectId: string) : DesignStep array = if projectId.StartsWith("probe-") then probeSteps else steps