This is the canonical inventory of what OmsiLaunch 0.1.0-beta3 can do, derived from PublicCapabilityRegistry (src/OmsiLaunch.Api/PublicCapabilityRegistry.cs), the runtime implementation in the plugin (src/OmsiLaunch.Plugin/CurrentRuntimeControl.cs and src/OmsiLaunch.Interop/OmsiRuntimeReaders.cs), and OmsiLaunchService.GetCapabilitiesAsync. For every capability it states the classification, the stability level used throughout this documentation, whether a Running session is required, whether it mutates OMSI, the arguments and result keys, the errors, and the runtime-validation evidence. How to invoke an operation (CLI routes, API envelope, timeouts, handles) is in runtime control; the evidence table is in runtime validation status.
PublicCapabilityClassification has four values. They map to the stability vocabulary as follows, with downgrades where evidence is incomplete:
Classification
Meaning
Stability
PublicStableBeta
Public, in the Beta contract, runtime validated
STABLE_BETA (downgraded to PARTIAL where noted)
PublicExperimental
Public, may change, runtime validated or statically validated
EXPERIMENTAL (downgraded to PARTIAL where noted)
InternalOnly
Research primitive; not reachable through the public API or CLI
INTERNAL
Unsupported
Recognised for diagnostics, rejected or absent
UNAVAILABLE
PublicCapabilityKind distinguishes Read, Write, Action and Event. Every runtime capability requires a Running session and the exact profile Omsi23004_692EBFBF (RequiresSession / RequiresExactProfile in the registry); session capabilities that create a session require the exact profile but no session.
Runtime results are dictionaries of strings. Keys that start with internal_ or end with _address, _pointer or _vmt are removed at the API boundary (ScrubInternalValues) and are not listed here. The result keys in the operation tables below are the exact key sets returned by the product: they were captured by executing every public operation in a real session (runtime closure documentation capture, session f51dcb59-a723-4570-b6c5-b61e628a7993, situations\Linie 5.osn; list rows are written <row>.<n>.<field>).
How an operation failure is reported (CurrentRuntimeControl.Execute):
Failure
ErrorCode
Values
Registry rejection (unknown or internal.* operation, missing required argument)
the specific code (OL_E_RUNTIME_SETTING_NOT_PERSISTENT)
detail (sentence)
A D3D failure
the specific OL_E_D3D_* code
detail, native_status
Any other plugin-side failure (stale handle, unknown name, value out of range, no player vehicle, ...)
OL_E_RUNTIME_OPERATION_FAILED
detail (starts with the specific code, for example OL_E_RUNTIME_OBJECT_HANDLE_STALE or OL_E_RUNTIME_VALUE_OUT_OF_RANGE (Parameter 'minute')), exception (.NET type name)
RUNTIME_PASS; cooperative shutdown not implemented
session.recover
PublicStableBeta
STABLE_BETA
Action
RecoverPendingAsync
/recovery-status, /recover
filesystem (restore)
RUNTIME_PASS: early-exit recovery (RV-008), owner killed plus early recovery at the next start (S05), failed restore then /recover (F01), refusal under the lease, with an orphaned OMSI and in the pre-PID window (S04, S04b)
events.read
PublicExperimental
EXPERIMENTAL
Event
GetStatusAsync().RuntimeEvents, control session.events
events read, events watch
no
RUNTIME_PASS; latest-value telemetry slot can drop bursts
RUNTIME_PASS: revalidated on the corrected map slot (session 9dd62626-94c6-4cd7-bb6f-0288327696f4, Grundorf) and read on Berlin-Spandau in the documentation capture
camera.read
PublicStableBeta
STABLE_BETA
Read
camera.read
RUNTIME_PASS
camera.set
PublicExperimental
EXPERIMENTAL
Write
camera.set
RUNTIME_PASS (FOV write and read-back)
camera.lock
PublicExperimental
EXPERIMENTAL
Action
camera.lock, camera.unlock
RUNTIME_PASS with a PlayerVehicle from a saved situation (runtime closure CAM01, families 0, 2 and 1 with read-back, then unlock). The registry's own RuntimeValidation string still reads STATICALLY_VALIDATED (product self-report, not updated in this release)
vehicles.list
PublicStableBeta
STABLE_BETA
Read
road-vehicles.list
RoadVehicle
RUNTIME_PASS
vehicles.get
PublicStableBeta
STABLE_BETA
Read
road-vehicle.read
RoadVehicle
RUNTIME_PASS; stale detection after natural removal (RV-002) has no safe runtime producer and is offline-validated
RUNTIME_PASS for create/describe/update/release, released and stale handle rejection across re-creation and sessions (H02), and device reset with generation invalidation (RV-007, D01; lost itself was not produced)
internal.make-basic
InternalOnly
INTERNAL
Action
internal.road-vehicles.make-basic
Not public. ExecuteRuntimeAsync rejects it with OL_E_RUNTIME_OPERATION_UNKNOWN before any session lookup; the CLI has no route for it.
calendar.set-actual-date-time
Unsupported
UNAVAILABLE
Write
none
UNSUPPORTED (BI-002)
player.assign-headless
Unsupported
UNAVAILABLE
Action
none
UNSUPPORTED (BI-007)
internal.road-vehicles.make-basic is INTERNAL: it exists in the plugin for research (it returns a native address) and is rejected at the API boundary and by the local control plane, both of which validate the operation name against PublicRuntimeOperationIds first.
This is the exact list of operation ids a public frontend may forward (PublicCapabilityRegistry.PublicRuntimeOperationIds). Every one requires SessionState.Running; none is journaled or restored. Required arguments are enforced by the registry before the mailbox is used (OL_E_RUNTIME_ARGUMENT_REQUIRED); optional arguments are validated by the plugin. Common failure codes for all operations: OL_E_RUNTIME_OPERATION_UNKNOWN (not in this list), OL_E_SESSION_NOT_RUNNING, OL_E_RUNTIME_SESSION_MISMATCH, OL_E_RUNTIME_CHANNEL_BUSY, OL_E_RUNTIME_CHANNEL_CLOSED, OL_E_RUNTIME_REQUEST_TIMEOUT, OL_E_RUNTIME_REQUEST_ID_REUSED, OL_E_RUNTIME_RESPONSE_INVALID, OL_E_RUNTIME_RESPONSE_TOO_LARGE, OL_E_RUNTIME_OPERATION_UNAVAILABLE (plugin has no implementation), OL_E_RUNTIME_OPERATION_FAILED (unexpected in-process exception; detail and exception values).
Always OL_E_RUNTIME_SETTING_NOT_PERSISTENT (empty arguments: OL_E_RUNTIME_ARGUMENT_REQUIRED). OMSI overwrites both profiled wind candidates on its next weather tick.
weather.actual.read
Read
none
active, icao, last_downloaded, invalid_icao, counter, process
OL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_CAMERA_PRESET_FAMILY_UNSUPPORTED, OL_E_RUNTIME_PLAYER_VEHICLE_UNAVAILABLE. The policy is re-applied every 100 ms until camera.unlock; a failing re-application emits the event camera.lock.degraded once per distinct error.
count, ai_collection, player_index (OMSI's raw player-vehicle index, reported as read; use player-vehicle.readpresent to know whether a player vehicle exists)
OL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_BUS_IDENTITY_INVALID, OL_E_MAKEVEHICLE_BUS_NOT_FOUND, OL_E_MAKEVEHICLE_DELTA_ZERO, OL_E_MAKEVEHICLE_DELTA_MULTIPLE, OL_E_MAKEVEHICLE_NATIVE_FAILED, OL_E_RUNTIME_CREATED_OBJECT_INVALID, OL_E_RUNTIME_CREATED_OBJECT_NOT_IN_COLLECTION. Does not assign the PlayerVehicle. Takes several seconds; use the 30 s client timeout.
road-vehicles.place-random
Action
optional ai_type (0..255, default 0), group (0..65535, default 1), type (-1..65535, default -1), scheduled (0..1, default 0), tour (0..65535, default 0), line (0..65535, default 0)
Bounded list results carry count (all records in OMSI), returned_count (rows in this reply) and truncated (true when rows were left out). Rows are always the first returned_count records, numbered from 0. The row limits are 128 for tracks, trips, lines, rv-files, bus stops, station links, tours and profiles, 256 for tour entries and 512 for track entries; when the rows allowed by that limit still exceed the 64 KiB mailbox (for example track and tour entries on Berlin-Spandau), the plugin drops the last rows until the reply fits and reports the smaller returned_count with truncated=true (documentation audit BUG-05; before the fix these two lists failed with OL_E_RUNTIME_RESPONSE_TOO_LARGE). timetable.logs.read is not a bounded list: it returns every log entry, and a log of a few hundred entries exceeds the mailbox and fails with OL_E_RUNTIME_RESPONSE_TOO_LARGE.
Operation
Kind
Arguments
Result keys
Errors
timetable.read
Read
none
invalid (true/false), and the record counts tracks, trips, bus_stops, station_links, lines, rv_files
the 13 d3d.texture.create keys, for the requested level
OL_E_D3D_STALE_RESOURCE_HANDLE, OL_E_D3D_RESOURCE_RELEASED, plus create errors
d3d.texture.update
Action
required handle, width (1..4096), height (1..4096), pixels_base64 (at most 48 KiB decoded); optional level (0..15, default 0), x (0..4095, default 0), y (0..4095, default 0)
the 13 d3d.texture.create keys after the update
OL_E_D3D_INVALID_PIXEL_BUFFER, plus describe errors
d3d.texture.release
Action
required handle
the 13 d3d.texture.create keys with state = RELEASED
OL_E_D3D_RESOURCE_RELEASED on repeated release, OL_E_D3D_STALE_RESOURCE_HANDLE
Failed D3D operations return detail and native_status values. The D3DRuntimeApi extension methods (GetD3DStatusAsync, CreateD3DTextureAsync, DescribeD3DTextureAsync, UpdateD3DTextureAsync, ReleaseD3DTextureAsync) wrap these operations for API consumers.
IOmsiLaunch.GetCapabilitiesAsync(InstallationSpec) returns a static list of Capability(Name, Available, EvidenceState, Reason) records describing the host's view of the installation. These names are a separate, coarser vocabulary from the registry ids above; the registry is the contract for operations, the capability list is a machine-readable summary for integrators. The relation is given in the last column.
RV-007. The list is a fixed, self-reported inventory: this entry was not updated after the runtime closure round observed resetting/restored transitions (D01); see runtime validation status for the evidence
Handles are session-scoped; address reuse is detected by an object fingerprint (VMT plus definition pointer for vehicles, VMT plus human index for humans) and reported as OL_E_RUNTIME_OBJECT_HANDLE_STALE. Residual blind spot: an object of the same class and the same definition recreated at the same address between two list reads is indistinguishable from the original.
Results are bounded to the 64 KiB mailbox; bounded lists are truncated with truncated=true; timetable.logs.read is not bounded and can fail with OL_E_RUNTIME_RESPONSE_TOO_LARGE.
No cross-tile vehicle relocation, no string-variable writes, no calendar writes, no weather writes, no headless PlayerVehicle assignment. See known limitations.