Known Limitations

Documentation for version v0.1.0-beta.3View source on GitHub

This page lists, from the code, everything in OmsiLaunch 0.1.0-beta3 that is UNAVAILABLE, PARTIAL, or an accepted risk, so that users and integrators do not build on behaviour the product does not provide. Each row names the limitation, its stability, why it exists, and where it is documented in detail. The English documentation is normative; localized copies under docs/localized/ are not maintained at the same level and may lag behind (see the last section).

Compatibility#

LimitationStabilityDetail
Only Omsi23004_692EBFBF is supported (692EBFBF...6243); the Steam LAA hash 7DAB063D...D759 is allow-listed; its fingerprint and plan were validated with a controlled copy, but gameplay needs a genuine Steam installation (the image is the DRM-protected Steam executable)PARTIAL for Steam LAAcompatibility
Windows 10+ x64 only; no Windows 7/8, no XP, no ARM64UNAVAILABLEcompatibility
The plugin needs the x86 .NET 6 runtime in addition to the x64 runtime used by the controllercompatibility

World start and launch options#

LimitationStabilityDetail
LAST_MAP_STATE (/last, WorldMode.LastMapState) is not implemented; no timestamp-based .osn fallback is ever substitutedUNAVAILABLE (BI-006)Plan diagnostic OL_E_CAPABILITY_UNAVAILABLE
Explicit or system date, time and year (/date, /time, /year, profile new.date/new.time/new.year, DateSpec/TimeSpec/YearSpec) are carried in the spec but make the plan not runnable; the plugin rejects non-Unset modesUNAVAILABLE (STATICALLY_PARTIAL)session profiles, launchspec
Weather preset, ICAO and real-current at start (/weather*, new.weather)UNAVAILABLE (STATICALLY_PARTIAL, BI-003)as above
Player vehicle model, repaint, HOF, fleet number, registration at start (/vehicle family, PlayerVehicleSpec) are resolved against the content catalogue but not applied; requesting them makes the plan not runnable; deterministic headless PlayerVehicle assignment is a future extensionUNAVAILABLE (BI-007)player.assign-headless in capabilities
Entrypoint by identity (/entrypoint:<identity>) is not correlated with OMSI's presented list; use /entrypoint-indexPARTIAL (BI-001)plan capability world.entrypoint-identity = RUNTIME_PARTIAL
Keyboard and controller document overlays (InputSpec, Environment.Keyboard, Environment.Controllers) are parsed but never applied by a sessionUNAVAILABLE (BI-005)input.* capabilities
LaunchBehaviorSpec.RestoreConfiguration and InstallationSpec.ExpectedExecutableSha256 are declared but never readUNAVAILABLElaunchspec
ShutdownTimeoutSeconds (/shutdown-timeout, profile shutdown-timeout) is accepted and carried but not consumed by the supervisorACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTsession lifecycle
/quiet and /serveACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECTCLI
Diagnostics flags (/log, /logall, /omsi-logall, /verbose, /trace, /trace-process, /trace-plugin, /trace-native) populate DiagnosticsSpec; the visible effect is limited to the host trace under .omsilaunch\diagnosticsPARTIALCLI
/runtime-batch, /runtime-write-batch, /d3d-batch are validation harnessesINTERNALCLI

Session end and process control#

LimitationStabilityDetail
Session stop is a forced termination: session.stop, tray "End session", Ctrl+C and CloseAsync all lead to TerminateProcess. OMSI's shutdown routine does not run, OMSI does not rewrite options.cfg or its logs on exit, and any unsaved OMSI state is lost. This is deliberate: it keeps OMSI from writing over restored files.by designsession lifecycle
Cooperative WM_CLOSE shutdown with a timeout and terminate fallback is not implementedUNAVAILABLE (product decision, S-11; OMSI ignored WM_CLOSE to its main window in the runtime closure round)runtime validation status
On console close or logoff the owner has a 4 s budget to stop and restore; anything left is recovered by the journal on the next startconsole close runtime validated; logoff not exercisedtransactions and recovery

Transaction, recovery and lease#

LimitationStabilityDetail
Installation lease is a Local\ semaphore: one owner per installation per logon session; not enforced across users; not released while another process holds a handle; any same-user process can hold the nameaccepted risk (S-18)transactions and recovery
Recovery is refused (OL_E_INSTALLATION_BUSY) while the journaled OMSI process, or for a journal without PID any Omsi.exe from that root, is runningby designas above
An originally-absent overlay path whose content changed during the session blocks restore (OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH) until inspectedby designas above
Journals from before ownership fingerprints can only be closed by a session with identical planned bytes (OL_E_RECOVERY_ABSENT_OWNERSHIP_UNVERIFIED)PARTIALas above
Only session-owned paths are restored. OMSI's own writes during a session (options.cfg [last_map] when no setting overlays options.cfg, Texture\standard.ipr, caches, laststn.osn, driver profile, logs) persist, as after a direct OMSI startby designtransactions and recovery
Stale closecheck removal before a session is permanent (recorded, not restored) when SuppressStaleClosecheckWarning is trueby designas above

Runtime control#

LimitationStabilityDetail
weather.set is rejected (OL_E_RUNTIME_SETTING_NOT_PERSISTENT): OMSI overwrites both profiled wind candidates on its next weather tickUNAVAILABLEcapabilities
Calendar writes (SetActualDateTime)UNAVAILABLE (BI-002)calendar.set-actual-date-time
String-variable writes, named triggers, sound triggers (Delphi managed-string ownership)UNAVAILABLE (BI-004)scripts.string.read is read-only
No vehicle relocation, no cross-tile spatial rebinding, no ODE-safe transform authority; position fields are read-onlyUNAVAILABLE (BI-008)road-vehicle.read
camera.lock / camera.unlock need a PlayerVehicle; the headless NEW_MAP start has none (a saved situation provides one)by design (BI-007)RV-004
Runtime mutations (time.set, camera.set, camera.lock, vehicle.variable.set, spawn, place-random, D3D textures) are not journaled and not restoredby designruntime control
Handle fingerprint blind spot: an object of the same class and definition recreated at the same address between two list reads is not detected as stale; natural-removal lifetime (RV-002) has no safe runtime producer and stays offlinePARTIALruntime control
Results are bounded by the 64 KiB mailbox: long lists are truncated (truncated=true); pixel payloads are limited to 48 KiB per d3d.texture.updateby designcapabilities
Single-flight channel: one request at a time per session; a busy slot is OL_E_RUNTIME_CHANNEL_BUSY; request ids must not be reusedby designruntime control
Telemetry is a latest-value slot: bursts faster than the host's 100 ms sampling can lose intermediate events (sequence numbers keep identical consecutive events distinct; torn samples are skipped)PARTIALpermanent plugin
D3D device reset was observed at runtime (resetting, restored, generation invalidation); a distinct lost transition was not produced because OMSI's device went straight to DEVICENOTRESETPARTIAL (RV-007)runtime validation status
Bounded list results (the timetable.*.list operations, vehicle.variables.list, vehicle.string-variables.list) return at most the rows that fit the 64 KiB runtime slot; the rest are left out with truncated=true and a smaller returned_count (documentation audit BUG-05). There is no paging in this releaseby designcapabilities
timetable.logs.read, road-vehicles.list, humans.list, vehicle.constants.list and vehicle.curves.list are not bounded: a result larger than the slot fails with OL_E_RUNTIME_RESPONSE_TOO_LARGE (observed for none of them on the tested maps)PARTIALcapabilities
The self-reported evidence strings (PublicCapabilityRegistry RuntimeValidation, GetCapabilitiesAsync EvidenceState) were not updated after the runtime closure round: camera.lock still reads STATICALLY_VALIDATED and runtime.d3d.lifecycle.reset IMPLEMENTED_NOT_RUNTIME_VALIDATED. The runtime validation status page is authoritativedocumentation lag, not a behaviour differencecapabilities
Some advanced map/tile/path/object graph fields are not exposed; runtime readers are profile-gated typed snapshots, never arbitrary memory accessby designcapabilities
In-process memory reads are check-then-use against a live OMSI; a concurrent OMSI mutation between the check and the read can yield an inconsistent snapshot (OL_E_RUNTIME_OPERATION_FAILED)accepted risk (S-33)

Local control plane and trust model#

LimitationStabilityDetail
Same-user trust model: the named pipe (CurrentUserOnly), the handoff/telemetry/runtime memory mappings and the lease semaphore are accessible to any process of the same Windows user. Such a process can read status, stop the session or execute runtime operations once it has read the session_id.accepted risk (S-06, S-30)local control
The control endpoint exists only while the owner is Running; a client sees OL_E_NO_ACTIVE_SESSION (exit 4) during startup and after the session endsby designlocal control
If another process already owns the pipe name, the owner keeps running without an endpoint (ListenFault), and a second launch may misreport OL_E_SESSION_ALREADY_ACTIVEaccepted risklocal control
.omsilaunch\ inherits the ACL of the OMSI root; no explicit access control is appliedaccepted risk (S-31)transactions and recovery

Diagnostics and output#

LimitationStabilityDetail
Diagnostics are local files only (.omsilaunch\diagnostics); nothing is uploaded, and there is no remote reportingby designtransactions and recovery
Retention keeps the 50 newest sessions; older session-prefixed diagnostics are deleted when a new session startsby designas above
JSON output and diagnostics include installation paths (RootPath, asset directories, .itx paths)by design (local data)
The session-failure dialog of OmsiLaunchW.exe shows the plugin's failure payload (for example {"name":"world.failed",...}) as its message rather than a sentence; the Code: line is correctcosmeticwindows tray
A D3D request rejected by the native bridge before any Direct3D call reports native_status correctly but its detail text says HRESULT 0x00000000cosmeticcapabilities
The tray status window is a snapshot of the planned session taken when it opens; it does not refresh and shows no live OMSI valuesby designwindows tray

Documentation#

The English pages under docs/ are the normative documentation for this release. docs/localized/<locale>/ contains translations of the same 0.1.0-beta3 pages (see LOCALIZATION-MANIFEST.md); where a translation differs from the English text, the English text and the code are authoritative. The historical and legacy pages listed there are available in English only.

Related: capabilities, runtime validation status, errors.