AI Slop Code RIsk Monitor

AutoHotkey/AutoHotkey

AutoHotkey - macro-creation and automation-oriented scripting utility for Windows.

4.6 Low pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for AutoHotkey/AutoHotkey, a C++ project with 13,270 GitHub stars. SynthScan examined 150,118 lines of code across 152 source files, recording 812 pattern matches distributed across 2 syntactic categories. The legacy adjusted pattern signal is 4.6 (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.

4.6
Adjusted Signal
4.6
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
13.3K
Stars
C++
Language
150.1K
Lines of Code
152
Files
812
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 20.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 0.0/100 · LOW

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

PR Review Velocity Impact 24.2/100 · LOW

Which changes need focused human review? 812 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 0HIGH 0MEDIUM 10LOW 802

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 812 distinct pattern matches across 2 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.

Over-Commented Block801 hits · 656 pts
SeverityFileLineSnippetContext
LOWsource/TextIO.h1#pragma onceCOMMENT
LOWsource/util.cpp141// of the YYYYMMDDHH24MISS format is present.COMMENT
LOWsource/util.cpp321 return (__int64)((__int64)(uiEnd.QuadPart - uiStart.QuadPart) / 10000000); // Convert from tenths-of-microsecond.COMMENT
LOWsource/util.cpp461}COMMENT
LOWsource/util.cpp521}COMMENT
LOWsource/util.cpp541COMMENT
LOWsource/util.cpp661 } // while() find next matchCOMMENT
LOWsource/util.cpp681 // version 2.1 of the License, or (at your option) any later version.COMMENT
LOWsource/util.cpp1081// - aLimit: Specify UINT_MAX to have no restriction on the number of replacements. Otherwise, specify a number >=0.COMMENT
LOWsource/util.cpp1101// two other/related StrReplace() functions obsolete. Also, the code has been simplified to avoid doingCOMMENT
LOWsource/util.cpp1161 if (!length_delta // old_len==new_len, so use in-place method because it's just as fast in this case but it avoids theCOMMENT
LOWsource/util.cpp1261 }COMMENT
LOWsource/util.cpp1301}COMMENT
LOWsource/util.cpp1361 { // A limit is currently in effect and it's less than expected replacements, so cap the expected.COMMENT
LOWsource/util.cpp1381 double quality = 1 + 2*(1-(COMMENT
LOWsource/util.cpp1861// Caller has ensured that aBuf is large enough (though anything >=32767 is always large enough).COMMENT
LOWsource/util.cpp1961 // Since above didn't return, an error occurred. MSDN isn't clear about what conditions canCOMMENT
LOWsource/util.cpp2061 // This differs from GetDpiForSystem, as it appears the "system DPI" is fixed at initial loginCOMMENT
LOWsource/util.cpp2121 return NULL;COMMENT
LOWsource/util.cpp2141 // said that an ICL is an "ICon Library... a renamed 16-bit Windows .DLL (an NE format executable) whichCOMMENT
LOWsource/util.cpp2201 // It is also not documented to support resource IDs, unlike ExtractIcon and ExtractIconEx.COMMENT
LOWsource/util.cpp2261 // LR_CREATEDIBSECTION applies only when aImageType == IMAGE_BITMAP, but seems appropriate in that case.COMMENT
LOWsource/util.cpp2281 // Gui, ShowCOMMENT
LOWsource/util.cpp2501 // The following will also handle HICON/HCURSOR correctly if aImageType == IMAGE_ICON/CURSOR.COMMENT
LOWsource/util.cpp2521 // Therefore, it seems best to call the right function even though DeleteObject might work onCOMMENT
LOWsource/MdType.h121#define md_cat(a, ...) a ## __VA_ARGS__COMMENT
LOWsource/TextIO.cpp121 {COMMENT
LOWsource/debug.h1#pragma onceCOMMENT
LOWsource/debug.h21// #define _CRTDBG_MAP_ALLOCCOMMENT
LOWsource/debug.h41#ifndef VERIFYCOMMENT
LOWsource/AutoHotkey.cpp41 // that has no media (and possibly other errors) won't cause the system to display an errorCOMMENT
LOWsource/AutoHotkey.cpp101COMMENT
LOWsource/AutoHotkey.cpp301 // top part (the auto-execute part) of the script so that they will be in effect even if theCOMMENT
LOWsource/stdafx.h21COMMENT
LOWsource/stdafx.h41 #include <stdlib.h>COMMENT
LOWsource/stdafx.h61 // dependencies sneaking in, or subtle naming conflicts:COMMENT
LOWsource/script.h21#include "defines.h"COMMENT
LOWsource/script.h41// Explanation: If/when AutoExec() finishes, although it no longer needs g_array[0] (not evenCOMMENT
LOWsource/script.h121#define ERR_ABORT_DELETE _T("__Delete will now return.")COMMENT
LOWsource/script.h141#define ERR_PARAM4_INVALID _T("Parameter #4 invalid.")COMMENT
LOWsource/script.h161#define ERR_MISSING_PARAM_NAME _T("Missing parameter name.")COMMENT
LOWsource/script.h181#define ERR_INVALID_LINE_IN_CLASS_DEF _T("Not a valid method, class or property definition.")COMMENT
LOWsource/script.h201#define ERR_NO_PROCESS _T("Target process not found.")COMMENT
LOWsource/script.h381};COMMENT
LOWsource/script.h401// It is also best for maintainability to avoid setting mem_to_free or an object withoutCOMMENT
LOWsource/script.h421#define _o__ret _f__retCOMMENT
LOWsource/script.h441 // or probably any other method of dynamically allocating/expanding the buffers. It alsoCOMMENT
LOWsource/script.h701COMMENT
LOWsource/script.h721 // want to review if any of the API calls used expect a string whose contents areCOMMENT
LOWsource/script.h741 COMMENT
LOWsource/script.h761 #define ARG4 sArgDeref[3]COMMENT
LOWsource/script.h781 // If the arg's text is non-blank, it means the variable is a dynamic name such as array%i%COMMENT
LOWsource/script.h801 static LPTSTR *sSourceFile; // Will hold an array of strings.COMMENT
LOWsource/script.h821 #define EXPR_SYMBOLS_AFTER_MAYBE _T("),]}:?") // Excludes '.', which needs more complicated logic.COMMENT
LOWsource/script.h1561 // in case it calls any functions that have side-effects, e.g. "return LogThisError()".COMMENT
LOWsource/script.h1581 // ToolTip, O, ((cos(A_Index) * 500) + 500), A_IndexCOMMENT
LOWsource/script_gui.h21COMMENT
LOWsource/script_gui.h101 // Keep any fields that are smaller than 4 bytes adjacent to each other. This conserves memoryCOMMENT
LOWsource/script_gui.h161 return TypeHasAttrib(TYPE_SUPPORTS_BGTRANS);COMMENT
LOWsource/script_gui.h361class GuiType : public ObjectCOMMENT
741 more matches not shown…
AI Slop Vocabulary11 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMsource/script_object.h21 // Used by Object, but defined here on (x64 builds only) to utilize the spaceCOMMENT
LOWsource/script_com.cpp1828 // - foo.bar() and foo.bar[] in C#. There's no way to differentiate, so we just use METHODCOMMENT
MEDIUMsource/defines.h189#define YIELDS_AN_OPERAND(symbol) ((symbol) < SYM_OPAREN) // CPAREN also covers the tail end of a function call. Post-iCOMMENT
MEDIUMsource/defines.h189#define YIELDS_AN_OPERAND(symbol) ((symbol) < SYM_OPAREN) // CPAREN also covers the tail end of a function call. Post-iCOMMENT
MEDIUMsource/script_gui.cpp1033 // script is unable to alternate between tab controls and still utilize autosizing.COMMENT
MEDIUMsource/script_gui.cpp3654 // control types won't utilize the extra space (they are apparently clipped accordingCOMMENT
MEDIUMsource/script_gui.cpp11012 // maintainable/robust (plus LV_GeneralSort() relies on us to do this check).COMMENT
MEDIUMsource/script_object.cpp2551 if (si->nested_object_size < sizeof(Object)) // Definitely no constructible properties defined by aBase.CODE
MEDIUMsource/script_object.cpp3379 // this PropEnum. Other callers must utilize aMemToFree for strings (which wouldCOMMENT
MEDIUMsource/script_autoit.cpp524 // utilize the notification in that case (e.g. Notepad's Save As dialog).COMMENT
MEDIUMsource/lib/drive.cpp40 // support within the OS is improved in future, callers can utilize it.COMMENT