ModelingEvolution.RocketWelder.StationManagement 0.1.0-preview.7093278

ModelingEvolution.RocketWelder.StationManagement

rw2 as one piece of a station environment (epic-107, docs/epics/epic-107-station-twin/). Built on ModelingEvolution.StationManagement — the foundation that knows containers, networks and waits, and no domain nouns.

This package is a client of rw2: of its container image and of its published REST language. It references no rw2 application project, and no vendor or simulator package.

await using var host = await StationHost.Start("pamet-01");          // one station = one network, fixed IPs
var store = await host.EventStore("rw2-store", reachableFromHost: true);
var rw    = await host.RocketWelder("2.21.34", store, simulatorTrack: true, sinkPorts: [17002]);
//          ↑ always a container; add build: "../rocket-welder2/bin/Debug" to mount the branch under test over /app

var fr20 = await rw.Devices.Ensure(real.Robot("FR20").SimulatedBy(Simulator.Robot, sim));
await rw.Devices.Ensure(real.Track("7th Axis").SimulatedBy(Simulator.Track, sim)
                                              .Keeping(x => x.Travel, x => x.Speed, x => x.Tolerance));
await rw.Cameras.Ensure(real.Camera("41943012").SimulatedBy(Mjpeg.Camera, sim.Preview,
                            pipeline: "pipelines/sim-camera.gpipe", sinkPort: 17002, boundTo: fr20));

var run = await rw.Programs.Run("AxisThenArm");
await run.ShouldFinishWithin(2.Minutes());

Console.WriteLine(host.Differences.Render());
Rule Where
rw2 is ALWAYS a container; a branch under test is a bin/Debug mounted over /app RocketWelderHosting
A mounted build's machine state never leaks in: plugin path, recordings, FsRoot, repositories are always set RocketWelderHosting.Spec
A sink a human is meant to see is published on the SAME number — rw2 tells the browser to open it directly RocketWelderHosting.Spec, RocketWelder.Sink
Commands are not queries: every Ensure posts, then waits for the READ MODEL RwDevices, RwPipelines
The proof of a camera is a JPEG off its tcpserversink, never rw2's own status RwPipelines.WaitServing
A value rw2 refuses becomes a stated difference, never a silent default Substitutions.Keeping, RwDevices.Ensure
A run is asserted on ProgramExecution-<programId> in the station's own store RunHandle
Anything this package does not wrap is reached through rw2's own typed client RocketWelder.Api

How it matches the station

Real() · EmulatedBy(endpoint) · SimulatedBy(deviceType, endpoint) · .Keeping(x => …) produce both the rw2 registration and a Match, so a twin always says how alike it is:

FR20      simulated  Simulator                not: the Fairino driver
7th Axis  simulated  SimulatorTrack           not: the FairinoTrack driver, travel, speed, tolerance (rw2 refused: 400 …)
Megmeet   simulated  SimulatorWeldingMachine  not: the MegmeetWeldingMachine_ArtsenPlusPro driver
Plasma    simulated  SimulatorWeldingMachine  not: the FairinoDoWeldingMachine driver
41943012  simulated  MjpegCamera              calibration kept · not: the Camera driver

The travel, speed, tolerance (rw2 refused: …) line is RW-1: POST /api/peripheral-devices validates against the registered property types rather than the device type's own schema, so SimulatorTrack's declared TravelMinMm, MaxSpeedMmPerSecond and ToleranceMm are answered with 400. The device is registered without them and the twin says so. When RW-1 lands, those three move to kept with no change to a station script.

Only rw2's OWN device types live here (Simulator, SimulatorTrack, SimulatorWeldingMachine, SimulatorDistanceSensor, MjpegCamera). A vendor's device type is a string in the station's description — this package never references a vendor package.

Test

dotnet test src/ModelingEvolution.RocketWelder.StationManagement.Tests --filter "Category!=Docker"   # pure logic
dotnet test src/ModelingEvolution.RocketWelder.StationManagement.Tests --filter "Category=Docker"    # a real station

The Docker suite brings a whole twin up on a developer machine — it needs the rw2 image (20 GB) and modelingevolution/simulator:local, so it never runs in CI.

Which rw2 it works against

Minimum: rw2 2.21.18. That is the first release carrying the headless POST /api/repositories/{repoId}/programs this package creates its own programs with (git tag --contains 3a2d6395). It also needs PATCH /api/pipeline/{id}/autostart, POST /api/pipeline/import, and — for Cameras.Ensure to bind a calibration — POST /api/cameras/calibration/seed-handeye, which rw2 serves only in the Development environment (the host sets ASPNETCORE_ENVIRONMENT=Development for exactly that reason).

Proven against 2.21.34, the version the integration suite runs. Anything between 2.21.18 and that is untested.

Published

Internal feed only (nuget.modelingevolution.com) — never nuget.org.

A release tag station-management-v1.2.3 → .github/workflows/publish-station-management-nuget.yml
A feature branch X.Y.Z-preview.<sha> → .github/workflows/preview-station-management-nuget.yml

The package carries its own version, not rw2's image version: its surface moves when rw2's REST language moves, which is much rarer than an image build. What ties it to rw2 is the minimum version stated above.

No packages depend on ModelingEvolution.RocketWelder.StationManagement.

Version Downloads Last updated
0.3.1-preview.f72598b12 4 10/11/2026
0.3.1-preview.becb30244 43 10/07/2026
0.3.1-preview.ab52494fc 0 10/07/2026
0.3.1-preview.aa0b72dc8 0 10/11/2026
0.3.1-preview.7933f6e4b 0 10/07/2026
0.3.1-preview.52c3c4d2a 22 10/07/2026
0.3.1-preview.388e4a9ab 46 10/11/2026
0.3.1-preview.332633ffd 0 10/07/2026
0.3.0 6 09/28/2026
0.2.2-preview.f8d5e697f 0 09/28/2026
0.2.2-preview.f13421609 0 09/28/2026
0.2.2-preview.c7d3e39d3 0 09/28/2026
0.2.1 2 09/25/2026
0.2.1-preview.8952a5eb 0 09/25/2026
0.2.1-preview.7da5ea94 0 09/25/2026
0.2.1-preview.4ada13b8 0 09/25/2026
0.2.1-preview.66486488 0 09/25/2026
0.2.0 1 09/25/2026
0.1.0-preview.e705254e 0 09/25/2026
0.1.0-preview.e32fdfa2 2 09/18/2026
0.1.0-preview.bcbf4393 0 09/25/2026
0.1.0-preview.ae609c75 1 09/18/2026
0.1.0-preview.887555e 0 09/18/2026
0.1.0-preview.81feef9 0 09/18/2026
0.1.0-preview.7fcc18f4 0 09/18/2026
0.1.0-preview.5f287869 1 09/18/2026
0.1.0-preview.2c875b27 1 09/18/2026
0.1.0-preview.7093278 0 09/18/2026