AI Slop Code Risk Monitor

nasa/openmct

SlopCodeMonitor badge for nasa/openmct Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A web based mission control framework.

1.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for nasa/openmct, a JavaScript project with 13,197 GitHub stars. SynthScan examined 223,107 lines of code across 1237 source files, recording 211 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 1.2 (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.

1.2
Adjusted Signal
1.2
Raw Pattern Score
100%
Time Factor
2026-10-15
Last Push
13.2K
Stars
JavaScript
Language
223.1K
Lines of Code
1.2K
Files
211
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 4.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 198 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.9/100 · LOW

Are imports declared and package/API names verified? 13 finding(s).

Agent Over-Engineering Ratio 3.6/100 · LOW

Are wrappers, guards, and repeated structures necessary? 160 finding(s).

PR Review Velocity Impact 5.2/100 · LOW

Which changes need focused human review? 211 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 3HIGH 0MEDIUM 1LOW 207

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 211 distinct pattern matches across 8 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.

Hyper-Verbose Identifiers160 hits · 162 pts
SeverityFileLineSnippetContext
LOW…lization/ExampleDataVisualizationSourceViewProvider.js27export default function ExampleDataVisualizationSourceViewProvider(openmct) {CODE
LOWexample/imagery/plugin.js181function getImageUrlListFromConfig(configuration) {CODE
LOWexample/generator/GeneratorMetadataProvider.js140export default function GeneratorMetadataProvider() {}CODE
LOWe2e/appActions.js71async function createDomainObjectWithDefaults(CODE
LOWe2e/appActions.js226async function createExampleTelemetryObject(page, parent = 'mine') {CODE
LOWe2e/appActions.js269async function createStableStateTelemetry(page, parent = 'mine') {CODE
LOWe2e/appActions.js300async function createOutOfOrderStateTelemetry(page, parent = 'mine', duration = 0.25) {CODE
LOWe2e/appActions.js332async function navigateToObjectWithFixedTimeBounds(page, url, start, end) {CODE
LOWe2e/appActions.js347async function navigateToObjectWithRealTime(page, url, start = '1800000', end = '30000') {CODE
LOWe2e/appActions.js609async function setFixedIndependentTimeConductorBounds(page, { start, end }) {CODE
LOWe2e/appActions.js753async function renameCurrentObjectFromBrowseBar(page, newName) {CODE
LOWe2e/appActions.js830function waitForFormattedTelemetryValue({ page, identifier, expectedValue }) {CODE
LOWe2e/appActions.js868 function checkForMatchingTelemetry(telemetryDatum) {CODE
LOWe2e/pluginFixtures.js56// async function getOrCreateDomainObject(page, options) {COMMENT
LOWe2e/tests/visual-a11y/imagery.visual.spec.js109async function scrollLastThumbnailIntoView(page) {CODE
LOW…ests/performance/memory/navigation.memory.perf.spec.js286 async function navigateToObjectAndDetectMemoryLeak(page, objectName) {CODE
LOWe2e/tests/functional/recentObjects.e2e.spec.js346 function assertInitialRecentObjectsListState() {CODE
LOWe2e/tests/functional/tree.e2e.spec.js347async function getAndAssertTreeItems(page, expected) {CODE
LOWe2e/tests/functional/tree.e2e.spec.js359async function renameObjectFromContextMenu(page, url, newName) {CODE
LOWe2e/tests/functional/tree.e2e.spec.js374async function openObjectTreeContextMenu(page, url) {CODE
LOWe2e/tests/functional/renaming.e2e.spec.js83async function renameObjectFromContextMenu(page, url, newName) {CODE
LOWe2e/tests/functional/renaming.e2e.spec.js99async function openObjectTreeContextMenu(page, url) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js733async function performImageryViewOperationsAndAssert(page, layoutObject) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js811async function dragBrightnessSliderAndAssertFilterValues(page) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js832async function dragContrastSliderAndAssertFilterValues(page) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js855async function assertBackgroundImageBrightness(page, expected) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js868async function panZoomAndAssertImageProperties(page) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js918async function mouseZoomOnImageAndAssert(page, factor = 2) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js949async function buttonZoomOnImageAndAssert(page) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js1018async function assertBackgroundImageContrast(page, expected) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js1074async function waitForZoomAndPanTransitions(page) {CODE
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js1083// async function addMaliciousTypeAndProvider(page) {COMMENT
LOW…gins/imagery/exampleImageryControlledClock.e2e.spec.js476async function assertBackgroundImageUrlFromBackgroundCss(page) {CODE
LOW…/tests/functional/plugins/plot/overlayPlot.e2e.spec.js386async function assertLimitLinesExistAndAreVisible(page) {CODE
LOWe2e/tests/functional/plugins/plot/timeTicks.e2e.spec.js213async function testMinutesTimeSeriesTicks(page) {CODE
LOWe2e/tests/functional/plugins/plot/timeTicks.e2e.spec.js229async function testSecondsTimeSeriesTicks(page) {CODE
LOW…/tests/functional/plugins/plot/stackedPlot.e2e.spec.js362async function assertAggregateLegendIsVisible(page) {CODE
LOW…ests/functional/plugins/plot/plotRendering.e2e.spec.js280async function editSineWaveToUseInfinityOption(page, sineWaveGeneratorObject) {CODE
LOWe2e/tests/functional/plugins/lad/lad.e2e.spec.js318async function openObjectTreeContextMenu(page, url) {CODE
LOWe2e/tests/functional/plugins/timer/timer.e2e.spec.js139async function triggerTimerContextMenuAction(page, timerUrl, action) {CODE
LOWe2e/tests/functional/plugins/timer/timer.e2e.spec.js200async function assertTimerStateAfterAction(page, action) {CODE
LOWe2e/tests/functional/plugins/timer/timer.e2e.spec.js228async function openObjectTreeContextMenu(page, url) {CODE
LOW…functional/plugins/charts/chartAxisScaling.e2e.spec.js760async function createScatterPlotWithUnderlay(page, ranges) {CODE
LOW…tional/plugins/displayLayout/displayLayout.e2e.spec.js638async function addAndRemoveDrawingObjectAndAssert(page, layoutObject, DISPLAY_LAYOUT_NAME) {CODE
LOW…plugins/importAndExportAsJSON/exportAsJson.e2e.spec.js199function getFirstKeyFromOpenMctJson(jsonData) {CODE
LOW…tional/plugins/notebook/restrictedNotebook.e2e.spec.js195async function openObjectTreeContextMenu(page, url) {CODE
LOW…al/plugins/faultManagement/faultManagement.e2e.spec.js311async function getFirstAndLastUnacknowledgedAndAcknowledgedFaults(allFaults) {CODE
LOW…unctional/planning/timelistControlledClock.e2e.spec.js215async function getTimeListCellTextByName(page, rowName, columnName) {CODE
LOW…unctional/planning/timelistControlledClock.e2e.spec.js227async function getAndAssertCountdownOrUpObject(page, rowName) {CODE
LOW…unctional/planning/timelistControlledClock.e2e.spec.js227async function getAndAssertCountdownOrUpObject(page, rowName) {CODE
LOWe2e/helper/faultUtils.js30export async function navigateToFaultManagementWithExample(page) {CODE
LOWe2e/helper/faultUtils.js42export async function navigateToFaultManagementWithStaticExample(page) {CODE
LOWe2e/helper/faultUtils.js54export async function navigateToFaultManagementWithoutExample(page) {CODE
LOWe2e/helper/faultUtils.js66async function navigateToFaultItemInTree(page) {CODE
LOWe2e/helper/faultUtils.js113export async function acknowledgeMultipleFaults(page, ...nums) {CODE
LOWe2e/helper/notebookUtils.js82async function startAndAddRestrictedNotebookObject(page) {CODE
LOWe2e/helper/notebookUtils.js125async function createNotebookEntryAndTags(page, iterations = 1) {CODE
LOWe2e/helper/planningUtils.js75function activitiesWithinTimeBounds(start1, end1, start2, end2) {CODE
LOWe2e/helper/planningUtils.js91export async function assertPlanOrderedSwimLanes(page, plan, objectUrl) {CODE
LOWe2e/helper/planningUtils.js115export async function setBoundsToSpanAllActivities(page, planJson, planObjectUrl) {CODE
100 more matches not shown…
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippetContext
CRITICALsrc/plugins/plot/configuration/PlotSeries.js97 const foundYAxis = options.collection.plot.model.additionalYAxes.find(CODE
CRITICALsrc/plugins/condition/pluginSpec.js277 styleViewComponentObject.domainObject.configuration.objectStyles.styles.every((style) => {CODE
CRITICALsrc/plugins/condition/pluginSpec.js295 const outputs = styleViewComponentObject.domainObject.configuration.objectStyles.styles.map(CODE
Over-Commented Block18 hits · 18 pts
SeverityFileLineSnippetContext
LOWbuild-docs.sh1#!/bin/bashCOMMENT
LOWe2e/tests/framework/pluginFixtures.e2e.spec.js41 // const { uuid } = domainObject;COMMENT
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js1081}COMMENT
LOW…/functional/plugins/imagery/exampleImagery.e2e.spec.js1101// supportsRequest: (domainObject) => domainObject.type === 'malicious.imagery',COMMENT
LOWe2e/tests/functional/plugins/plot/logPlot.e2e.spec.js301COMMENT
LOW…ctional/plugins/notebook/notebookSnapshots.e2e.spec.js41 'When default notebook is updated selected, Snapshot Menu dropdown should list it as the newest option',COMMENT
LOW…ctional/plugins/notebook/notebookSnapshots.e2e.spec.js181 //Drag and Drop onto droppable area for new entryCOMMENT
LOW…tests/functional/plugins/notebook/notebook.e2e.spec.js141 //Delete 4th sectionCOMMENT
LOW…tests/functional/plugins/notebook/notebook.e2e.spec.js201 await page.locator('button[title="Open context menu"]').nth(1).click();COMMENT
LOW…tests/functional/plugins/notebook/notebook.e2e.spec.js221 });COMMENT
LOWsrc/plugins/condition/utils/evaluatorSpec.js21 *****************************************************************************/COMMENT
LOWsrc/plugins/condition/utils/evaluatorSpec.js181 // const result = computeConditionByLimit(results, 0);COMMENT
LOWsrc/plugins/condition/utils/evaluatorSpec.js201 // const result = computeConditionByLimit(results, 1);COMMENT
LOWsrc/plugins/autoflow/AutoflowTabularPluginSpec.js201 // const child = {COMMENT
LOWsrc/plugins/comps/CompsManager.js1import { EventEmitter } from 'eventemitter3';COMMENT
LOWsrc/utils/testing.js141 }COMMENT
LOWsrc/api/user/UserStatusAPISpec.js61 return openmct.user.status.setPollQuestion('This is a poll question').then(() => {COMMENT
LOWsrc/api/telemetry/WebSocketWorker.js241 #buffer;COMMENT
Verbosity Indicators7 hits · 14 pts
SeverityFileLineSnippetContext
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js287 // Step 1: Evaluate all conditions for this timestampCOMMENT
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js293 // Step 2: Determine which condition should be activeCOMMENT
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js296 // Step 3: Process the output for the current conditionCOMMENT
LOWsrc/plugins/comps/CompsManager.js248 // Step 1: Collect all unique timestamps from all telemetry collectionsCOMMENT
LOW⚡src/plugins/comps/CompsManager.js261 // Step 2: Initialize the result objectCOMMENT
LOW⚡src/plugins/comps/CompsManager.js264 // Step 3: Iterate through each telemetry collection to align dataCOMMENT
LOWsrc/api/telemetry/TelemetryCollection.js342 // if latest strategy is requested, we need to check if the value is the latest unemitted valueCOMMENT
Structural Annotation Overuse6 hits · 13 pts
SeverityFileLineSnippetContext
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js287 // Step 1: Evaluate all conditions for this timestampCOMMENT
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js293 // Step 2: Determine which condition should be activeCOMMENT
LOW⚡src/plugins/condition/HistoricalTelemetryProvider.js296 // Step 3: Process the output for the current conditionCOMMENT
LOWsrc/plugins/comps/CompsManager.js248 // Step 1: Collect all unique timestamps from all telemetry collectionsCOMMENT
LOW⚡src/plugins/comps/CompsManager.js261 // Step 2: Initialize the result objectCOMMENT
LOW⚡src/plugins/comps/CompsManager.js264 // Step 3: Iterate through each telemetry collection to align dataCOMMENT
Redundant / Tautological Comments6 hits · 12 pts
SeverityFileLineSnippetContext
LOWsrc/plugins/persistence/couch/setup-couchdb.sh3# Check if required environment variables have values, exit if not.COMMENT
LOW⚡src/plugins/persistence/couch/setup-couchdb.sh227# Check if the admin user exists; if not, create it.COMMENT
LOW⚡src/plugins/persistence/couch/setup-couchdb.sh235# Check if the _users table exists; if not, create it.COMMENT
LOW⚡src/plugins/persistence/couch/setup-couchdb.sh243# Check if the _replicator database exists; if not, create it.COMMENT
LOW⚡src/plugins/persistence/couch/setup-couchdb.sh251# Check if the database exists; if not, create it.COMMENT
LOWsrc/plugins/persistence/couch/setup-couchdb.sh267# Check if CORS is enabled; if not, enable it.COMMENT
Fake / Example Data10 hits · 10 pts
SeverityFileLineSnippetContext
LOWe2e/test-data/examplePlans/ExamplePlan_Large.json5 "name": "Lorem ipsum dolor 2023-03-15 21:00",CODE
LOWe2e/tests/functional/ui/inspector.e2e.spec.js29const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore CODE
LOWe2e/tests/functional/ui/inspector.e2e.spec.js29const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore CODE
LOW…onal/plugins/telemetryTable/telemetryTable.e2e.spec.js47 'user@example.com',CODE
LOWsrc/plugins/timelist/pluginSpec.js61 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore eCODE
LOWsrc/plugins/timelist/pluginSpec.js61 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore eCODE
LOWsrc/plugins/timelist/pluginSpec.js201 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut laboCODE
LOWsrc/plugins/timelist/pluginSpec.js201 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut laboCODE
LOWsrc/plugins/timeline/pluginSpec.js49 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore eCODE
LOWsrc/plugins/timeline/pluginSpec.js49 name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore eCODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/styles/_global.scss231// Used with elements that utilize an SVG background element where specific coloring is neededCOMMENT