AutoHotkey - macro-creation and automation-oriented scripting utility for Windows.
This report presents the forensic synthetic code analysis of AutoHotkey/AutoHotkey, a C++ project with 12,728 GitHub stars. SynthScan v2.0 examined 149,886 lines of code across 150 source files, recording 813 pattern matches distributed across 2 syntactic categories. The overall adjusted score of 4.6 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 813 distinct pattern matches across 2 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/TextIO.h | 1 | #pragma once | COMMENT |
| LOW | source/util.cpp | 141 | // of the YYYYMMDDHH24MISS format is present. | COMMENT |
| LOW | source/util.cpp | 321 | return (__int64)((__int64)(uiEnd.QuadPart - uiStart.QuadPart) / 10000000); // Convert from tenths-of-microsecond. | COMMENT |
| LOW | source/util.cpp | 461 | } | COMMENT |
| LOW | source/util.cpp | 521 | } | COMMENT |
| LOW | source/util.cpp | 541 | COMMENT | |
| LOW | source/util.cpp | 661 | } // while() find next match | COMMENT |
| LOW | source/util.cpp | 681 | // version 2.1 of the License, or (at your option) any later version. | COMMENT |
| LOW | source/util.cpp | 1081 | // - aLimit: Specify UINT_MAX to have no restriction on the number of replacements. Otherwise, specify a number >=0. | COMMENT |
| LOW | source/util.cpp | 1101 | // two other/related StrReplace() functions obsolete. Also, the code has been simplified to avoid doing | COMMENT |
| LOW | source/util.cpp | 1161 | if (!length_delta // old_len==new_len, so use in-place method because it's just as fast in this case but it avoids the | COMMENT |
| LOW | source/util.cpp | 1261 | } | COMMENT |
| LOW | source/util.cpp | 1301 | } | COMMENT |
| LOW | source/util.cpp | 1361 | { // A limit is currently in effect and it's less than expected replacements, so cap the expected. | COMMENT |
| LOW | source/util.cpp | 1381 | double quality = 1 + 2*(1-( | COMMENT |
| LOW | source/util.cpp | 1861 | // Caller has ensured that aBuf is large enough (though anything >=32767 is always large enough). | COMMENT |
| LOW | source/util.cpp | 1961 | // Since above didn't return, an error occurred. MSDN isn't clear about what conditions can | COMMENT |
| LOW | source/util.cpp | 2061 | // This differs from GetDpiForSystem, as it appears the "system DPI" is fixed at initial login | COMMENT |
| LOW | source/util.cpp | 2121 | return NULL; | COMMENT |
| LOW | source/util.cpp | 2141 | // said that an ICL is an "ICon Library... a renamed 16-bit Windows .DLL (an NE format executable) which | COMMENT |
| LOW | source/util.cpp | 2201 | // It is also not documented to support resource IDs, unlike ExtractIcon and ExtractIconEx. | COMMENT |
| LOW | source/util.cpp | 2261 | // LR_CREATEDIBSECTION applies only when aImageType == IMAGE_BITMAP, but seems appropriate in that case. | COMMENT |
| LOW | source/util.cpp | 2281 | // Gui, Show | COMMENT |
| LOW | source/util.cpp | 2501 | // The following will also handle HICON/HCURSOR correctly if aImageType == IMAGE_ICON/CURSOR. | COMMENT |
| LOW | source/util.cpp | 2521 | // Therefore, it seems best to call the right function even though DeleteObject might work on | COMMENT |
| LOW | source/MdType.h | 121 | #define md_arg_decl_type_Out(type) md_outtype<MdType::type>::t | COMMENT |
| LOW | source/TextIO.cpp | 121 | { | COMMENT |
| LOW | source/debug.h | 1 | #pragma once | COMMENT |
| LOW | source/debug.h | 21 | // #define _CRTDBG_MAP_ALLOC | COMMENT |
| LOW | source/debug.h | 41 | #ifndef VERIFY | COMMENT |
| LOW | source/AutoHotkey.cpp | 41 | // that has no media (and possibly other errors) won't cause the system to display an error | COMMENT |
| LOW | source/AutoHotkey.cpp | 101 | COMMENT | |
| LOW | source/AutoHotkey.cpp | 301 | // top part (the auto-execute part) of the script so that they will be in effect even if the | COMMENT |
| LOW | source/stdafx.h | 21 | COMMENT | |
| LOW | source/stdafx.h | 41 | #include <stdlib.h> | COMMENT |
| LOW | source/stdafx.h | 61 | // dependencies sneaking in, or subtle naming conflicts: | COMMENT |
| LOW | source/script.h | 21 | #include "defines.h" | COMMENT |
| LOW | source/script.h | 41 | // Explanation: If/when AutoExec() finishes, although it no longer needs g_array[0] (not even | COMMENT |
| LOW | source/script.h | 121 | #define ERR_ABORT_DELETE _T("__Delete will now return.") | COMMENT |
| LOW | source/script.h | 141 | #define ERR_PARAM4_INVALID _T("Parameter #4 invalid.") | COMMENT |
| LOW | source/script.h | 161 | #define ERR_MISSING_PARAM_NAME _T("Missing parameter name.") | COMMENT |
| LOW | source/script.h | 181 | #define ERR_INVALID_LINE_IN_CLASS_DEF _T("Not a valid method, class or property definition.") | COMMENT |
| LOW | source/script.h | 201 | #define ERR_NO_WINDOW _T("Target window not found.") | COMMENT |
| LOW | source/script.h | 381 | COMMENT | |
| LOW | source/script.h | 401 | // returning if there's any chance _f_throw() will be used, since in that case the caller | COMMENT |
| LOW | source/script.h | 421 | #define _o_throw _f_throw | COMMENT |
| LOW | source/script.h | 441 | // performs marginally better, but file system performance has a much bigger impact. | COMMENT |
| LOW | source/script.h | 701 | Line *mRelatedLine; // e.g. the "else" that belongs to this "if" | COMMENT |
| LOW | source/script.h | 721 | #define RAW_ARG3 (mArgc > 2 ? mArg[2].text : _T("")) | COMMENT |
| LOW | source/script.h | 741 | #define NEW_RAW_ARG4 (aArgc > 3 ? new_arg[3].text : _T("")) | COMMENT |
| LOW | source/script.h | 761 | #define ARG8 sArgDeref[7] | COMMENT |
| LOW | source/script.h | 781 | // Uses arg number (i.e. the first arg is 1, not 0). Caller must ensure that ArgNum >= 1 and that | COMMENT |
| LOW | source/script.h | 801 | COMMENT | |
| LOW | source/script.h | 1561 | // 2) The fact that any return encountered after the Goto cannot provide a return value for | COMMENT |
| LOW | source/script.h | 1581 | if (result == EARLY_RETURN) | COMMENT |
| LOW | source/script_gui.h | 21 | COMMENT | |
| LOW | source/script_gui.h | 101 | // Keep any fields that are smaller than 4 bytes adjacent to each other. This conserves memory | COMMENT |
| LOW | source/script_gui.h | 161 | return TypeHasAttrib(TYPE_SUPPORTS_BGTRANS); | COMMENT |
| LOW | source/script_gui.h | 361 | class GuiType : public Object | COMMENT |
| LOW | source/keyboard_mouse.cpp | 61 | // For v1.0.25, the following situation is fixed by the code below: If LWin or LAlt | COMMENT |
| 743 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/script_object.h | 21 | // Used by Object, but defined here on (x64 builds only) to utilize the space | COMMENT |
| LOW | source/script_com.cpp | 1827 | // - foo.bar() and foo.bar[] in C#. There's no way to differentiate, so we just use METHOD | COMMENT |
| MEDIUM | source/defines.h | 189 | #define YIELDS_AN_OPERAND(symbol) ((symbol) < SYM_OPAREN) // CPAREN also covers the tail end of a function call. Post-i | COMMENT |
| MEDIUM | source/defines.h | 189 | #define YIELDS_AN_OPERAND(symbol) ((symbol) < SYM_OPAREN) // CPAREN also covers the tail end of a function call. Post-i | COMMENT |
| MEDIUM | source/script_gui.cpp | 1025 | // script is unable to alternate between tab controls and still utilize autosizing. | COMMENT |
| MEDIUM | source/script_gui.cpp | 3646 | // control types won't utilize the extra space (they are apparently clipped according | COMMENT |
| MEDIUM | source/script_gui.cpp | 10997 | // maintainable/robust (plus LV_GeneralSort() relies on us to do this check). | COMMENT |
| MEDIUM | source/script_object.cpp | 2500 | if (si->nested_object_size < sizeof(Object)) // Definitely no constructible properties defined by aBase. | CODE |
| MEDIUM | source/script_autoit.cpp | 524 | // utilize the notification in that case (e.g. Notepad's Save As dialog). | COMMENT |
| MEDIUM | source/lib/drive.cpp | 40 | // support within the OS is improved in future, callers can utilize it. | COMMENT |