OpenMW is an open-source open-world RPG game engine that supports playing Morrowind. Main repo and issue tracker can be found here: https://gitlab.com/OpenMW/openmw/
This report summarizes scanner evidence for OpenMW/openmw, a C++ project with 6,696 GitHub stars. SynthScan examined 572,961 lines of code across 3135 source files, recording 1233 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 2.1 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1228 finding(s).
Are imports declared and package/API names verified? 0 finding(s).
Are wrappers, guards, and repeated structures necessary? 15 finding(s).
Which changes need focused human review? 1233 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1233 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/source/conf.py | 1 | # -*- coding: utf-8 -*- | COMMENT |
| LOW | docs/source/conf.py | 121 | # Else, today_fmt is used as the format for a strftime call. | COMMENT |
| LOW | docs/source/conf.py | 201 | # A shorter title for the navigation bar. Default is the same as html_title. | COMMENT |
| LOW | docs/source/conf.py | 221 | # .htaccess) here, relative to this directory. These files are copied | COMMENT |
| LOW | docs/source/conf.py | 241 | #html_domain_indices = True | COMMENT |
| LOW | docs/source/conf.py | 261 | #html_use_opensearch = '' | COMMENT |
| LOW | docs/source/conf.py | 281 | } | COMMENT |
| LOW | docs/source/conf.py | 341 | COMMENT | |
| LOW | components/doc.hpp | 1 | // Note: This is not a regular source file. | COMMENT |
| LOW | components/doc.hpp | 21 | /// \namespace Compiler | COMMENT |
| LOW | components/misc/scalableicon.cpp | 1 | #include "scalableicon.hpp" | COMMENT |
| LOW | components/misc/timeconvert.hpp | 1 | #ifndef OPENMW_COMPONENTS_MISC_TIMECONVERT_H | COMMENT |
| LOW | components/misc/framestats.hpp | 1 | #ifndef OPENMW_COMPONENTS_MISC_FRAMESTATS_H | COMMENT |
| LOW | components/misc/windows.hpp | 1 | #ifndef OPENMW_COMPONENTS_WINDOWS_H | COMMENT |
| LOW | components/misc/strings/conversion.hpp | 1 | #ifndef COMPONENTS_MISC_STRINGS_CONVERSION_H | COMMENT |
| LOW | components/misc/strings/format.hpp | 1 | #ifndef COMPONENTS_MISC_STRINGS_FORMAT_H | COMMENT |
| LOW | components/settings/shadermanager.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_SHADERMANAGER_H | COMMENT |
| LOW | components/settings/settings.hpp | 1 | #ifndef COMPONENTS_SETTINGS_H | COMMENT |
| LOW | components/settings/values.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_VALUES_H | COMMENT |
| LOW | components/settings/values.hpp | 21 | #include "categories/shadows.hpp" | COMMENT |
| LOW | components/settings/settingvalue.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_SETTINGVALUE_H | COMMENT |
| LOW | components/settings/sanitizerimpl.cpp | 1 | #include "sanitizerimpl.hpp" | COMMENT |
| LOW | components/settings/settings.cpp | 1 | #include "settings.hpp" | COMMENT |
| LOW | components/settings/categories/navigator.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_NAVIGATOR_H | COMMENT |
| LOW | components/settings/categories/game.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_GAME_H | COMMENT |
| LOW | components/settings/categories/map.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_MAP_H | COMMENT |
| LOW | components/settings/categories/video.hpp | 1 | #ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_VIDEO_H | COMMENT |
| LOW | components/l10n/messagebundles.hpp | 1 | #ifndef COMPONENTS_L10N_MESSAGEBUNDLES_H | COMMENT |
| LOW | components/l10n/messagebundles.cpp | 1 | #include "messagebundles.hpp" | COMMENT |
| LOW | components/vfs/bsaarchive.hpp | 1 | #ifndef VFS_BSAARCHIVE_HPP_ | COMMENT |
| LOW | components/vfs/manager.hpp | 1 | #ifndef OPENMW_COMPONENTS_RESOURCEMANAGER_H | COMMENT |
| LOW | components/fontloader/fontloader.cpp | 1 | #include "fontloader.hpp" | COMMENT |
| LOW | components/fontloader/fontloader.cpp | 561 | // « (Left-Pointing Double Angle Quotation Mark, 0xAB) is unavailable, not replaced | COMMENT |
| LOW | components/stereo/stereomanager.cpp | 1 | #include "stereomanager.hpp" | COMMENT |
| LOW | components/stereo/frustum.cpp | 1 | #include "multiview.hpp" | COMMENT |
| LOW | components/stereo/multiview.cpp | 1 | #include "multiview.hpp" | COMMENT |
| LOW | components/stereo/stereomanager.hpp | 1 | #ifndef STEREO_MANAGER_H | COMMENT |
| LOW | components/sdlutil/sdlcursormanager.cpp | 1 | #include "sdlcursormanager.hpp" | COMMENT |
| LOW | components/sdlutil/gl4esinit.h | 1 | #ifndef OPENMW_COMPONENTS_SDLUTIL_GL4ESINIT_H | COMMENT |
| LOW | components/config/launchersettings.cpp | 1 | #include "launchersettings.hpp" | COMMENT |
| LOW | components/config/gamesettings.cpp | 321 | stream.seek(0); | COMMENT |
| LOW | components/esm/records.hpp | 1 | #ifndef OPENMW_ESM_RECORDS_H | COMMENT |
| LOW | components/esm/records.hpp | 21 | #include <components/esm3/loadgmst.hpp> | COMMENT |
| LOW | components/esm/records.hpp | 41 | #include <components/esm3/loadspel.hpp> | COMMENT |
| LOW | components/esm/records.hpp | 61 | #include <components/esm4/loadhdpt.hpp> | COMMENT |
| LOW | components/esm/records.hpp | 81 | #include <components/esm4/loadtree.hpp> | COMMENT |
| LOW | components/esm/esmcommon.hpp | 1 | #ifndef OPENMW_ESM_COMMON_H | COMMENT |
| LOW | components/esm/luascripts.cpp | 1 | #include "luascripts.hpp" | COMMENT |
| LOW | components/esm/refid.hpp | 1 | #ifndef OPENMW_COMPONENTS_ESM_REFID_HPP | COMMENT |
| LOW | components/myguiplatform/myguiloglistener.hpp | 1 | #ifndef OPENMW_COMPONENTS_MYGUIPLATFORM_LOGLISTENER_H | COMMENT |
| LOW | components/myguiplatform/myguirendermanager.cpp | 1 | #include "myguirendermanager.hpp" | COMMENT |
| LOW | components/nifosg/particle.cpp | 1 | #include "particle.hpp" | COMMENT |
| LOW | components/nifosg/controller.hpp | 1 | #ifndef COMPONENTS_NIFOSG_CONTROLLER_H | COMMENT |
| LOW | components/nifosg/nifloader.cpp | 1 | #include "nifloader.hpp" | COMMENT |
| LOW | components/nifosg/nifloader.cpp | 21 | #include <components/misc/strings/algorithm.hpp> | COMMENT |
| LOW | components/nifosg/nifloader.cpp | 41 | #include <osg/Stencil> | COMMENT |
| LOW | components/nifosg/particle.hpp | 1 | #ifndef OPENMW_COMPONENTS_NIFOSG_PARTICLE_H | COMMENT |
| LOW | components/nifosg/controller.cpp | 1 | #include "controller.hpp" | COMMENT |
| LOW | components/esmterrain/storage.cpp | 1 | #include "storage.hpp" | COMMENT |
| LOW | components/esmterrain/storage.hpp | 81 | // Not implemented in this class, because we need different Store implementations for game and editor | COMMENT |
| 1137 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | files/settings-default.cfg | 119 | # Controls how inexpensive an object needs to be to utilize 'min size merge factor'. | COMMENT |
| MEDIUM | files/settings-default.cfg | 1041 | # Indirectly controls where to split the shadow map(s). Positive values move split points away from the camera and negat | COMMENT |
| MEDIUM | files/lua_api/openmw/core.lua | 317 | -- @field #boolean isExterior Whether the cell is an exterior cell. "Exterior" means grid of cells where the player can | CODE |
| MEDIUM | extern/sol3/sol/compatibility/lua_version.hpp | 111 | // Definitely 5.0 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | components/myguiplatform/myguidatamanager.hpp | 18 | class DataManager : public MyGUI::DataManager | CODE |
| LOW | components/myguiplatform/myguiplatform.hpp | 35 | class DataManager; | CODE |
| LOW | components/lua/asyncpackage.cpp | 65 | sol::function getAsyncPackageInitializer( | CODE |
| LOW | components/lua/asyncpackage.hpp | 14 | sol::function getAsyncPackageInitializer( | CODE |
| LOW | scripts/osg_stats.py | 197 | def draw_cumulative_timeseries(sources, keys, add_sum, convolve, begin_frame, end_frame): | CODE |
| LOW | files/data-mw/scripts/omw/playerskillhandlers.lua | 20 | local function getSkillProgressRequirement(skillid) | CODE |
| LOW | files/data-mw/scripts/omw/music/helpers.lua | 17 | local function initMissingPlaylistFields(playlist) | CODE |
| LOW | files/data-mw/scripts/omw/music/helpers.lua | 77 | local function getActivePlaylistByPriority(playlists) | CODE |
| LOW | files/data/scripts/omw/camera/settings.lua | 77 | local function updateViewOverShoulderDisabled() | CODE |
| LOW | files/data/scripts/omw/camera/settings.lua | 90 | local function updateHeadBobbingDisabled() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | components/nifosg/nifloader.cpp | 2652 | // TODO: implement BSEffectShader as a shader | COMMENT |
| LOW | components/nif/nifkey.hpp | 213 | // TODO: implement TCB interpolation for quaternions | COMMENT |
| LOW | apps/openmw/mwmechanics/spellpriority.cpp | 304 | return 0.f; // TODO: implement based on attribute damage | CODE |
| LOW | apps/openmw/mwmechanics/spellpriority.cpp | 306 | return 0.f; // TODO: implement based on skill damage | CODE |
| LOW | apps/openmw/mwmechanics/character.cpp | 2923 | // TODO: implement a dithering shader rather than just change object transparency. | COMMENT |
| LOW | apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 901 | // TODO: implement a better check to check if target is owned bed | COMMENT |
| LOW | apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 1579 | return; // TODO: implement animal rights | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/source/conf.py | 96 | except Exception as ex: | CODE |
| LOW | docs/source/conf.py | 194 | except Exception as e: | STRING |
| MEDIUM | docs/source/conf.py | 191 | def setup(app): | CODE |
| LOW | scripts/preprocessed_file_size_stats.py | 26 | except Exception as e: | CODE |
| MEDIUM | files/data/scripts/omw/skillhandlers.lua | 61 | print('Error: Unknown useType: '..tostring(options.useType)) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/osg_stats.py | 129 | CODE | |
| LOW | scripts/osg_stats.py | 149 | CODE | |
| LOW | scripts/osg_stats.py | 278 | CODE | |
| LOW | scripts/integration_tests.py | 66 | CODE | |
| LOW | scripts/integration_tests.py | 133 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | files/lua_api/openmw/types.lua | 1583 | -- Creates an @{#ArmorRecord} without adding it to the world database, for the armor to appear correctly on the body, ma | CODE |
| LOW | files/lua_api/openmw/types.lua | 1719 | -- Creates a @{#ClothingRecord} without adding it to the world database, for the clothing to appear correctly on the bod | CODE |
| LOW | apps/opencs/model/world/refidadapter.hpp | 13 | * Important point: don't forget to make sure that getData on the nestedColumn returns true (otherwise code will not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/source/conf.py | 6 | # This file is execfile()d with the current directory set to its | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/opencs/view/doc/viewmanager.cpp | 223 | // NOTE: This method assumes that it is called only if the last document | COMMENT |