📦BetterGI · 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪 | 桌面分身 - UI Automation Testing Tools For Genshin Impact
This report summarizes scanner evidence for babalae/better-genshin-impact, a C# project with 17,483 GitHub stars. SynthScan examined 404,774 lines of code across 2732 source files, recording 913 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 2.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.
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? 887 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 9 finding(s).
Which changes need focused human review? 913 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 913 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/BetterGenshinImpact.Test/Dataset/AvatarClassifyGen.cs | 21 | COMMENT | |
| LOW | Test/BetterGenshinImpact.Test/Simple/FeatureMatcher.cs | 121 | return _matcherFactory[type]; | COMMENT |
| LOW | …BetterGenshinImpact.Test/Simple/TeyvatMapCoordinate.cs | 61 | /// <summary> | COMMENT |
| LOW | …t/BetterGenshinImpact.Test/Simple/Track/MapPathTest.cs | 21 | // var pointsRect = Cv2.BoundingRect(points); | COMMENT |
| LOW | …hinImpact.Test/Simple/MiniMap/CameraOrientationTest.cs | 41 | var left2 = left.Zip(right, (x, y) => Math.Max(x - y, 0)).ToArray(); | COMMENT |
| LOW | …hinImpact.Test/Simple/MiniMap/CameraOrientationTest.cs | 81 | return (left2, rightAfterShift, result); | COMMENT |
| LOW | …terGenshinImpact.Test/Simple/AllMap/FeatureTransfer.cs | 21 | // string kpPath = Path.Combine(rootPath, $"mainMap2048Block_SIFT.kp"); | COMMENT |
| LOW | …rGenshinImpact.Test/Simple/AllMap/KeyPointMatchTest.cs | 201 | objCorners[2] = new Point2f(matSrc.Cols, matSrc.Rows); | COMMENT |
| LOW | …GenshinImpact.Test/Simple/AllMap/LargeSIFTExtractor.cs | 21 | private const int MAX_PARALLELISM = 24; | COMMENT |
| LOW | …GenshinImpact.Test/Simple/AllMap/LargeSIFTExtractor.cs | 201 | } | COMMENT |
| LOW | …tterGenshinImpact.Test/Simple/AllMap/MapPuzzleOther.cs | 41 | // if (imagePath.Contains("UI_Map_Volcano_800_01.png") || imagePath.Contains("UI_Map_Volcano_01.png")) | COMMENT |
| LOW | …nImpact.UnitTest/Pulonia/PuloniaSoloTestDefinitions.cs | 21 | internal static class PuloniaSoloTestDefinitions | COMMENT |
| LOW | …nImpact.UnitTest/Pulonia/PuloniaSoloTestDefinitions.cs | 61 | /// <summary> | COMMENT |
| LOW | …enshinImpact.UnitTest/GameTaskTests/TestGameRuntime.cs | 41 | COMMENT | |
| LOW | …enshinImpact.UnitTest/GameTaskTests/TestGameRuntime.cs | 61 | COMMENT | |
| LOW | …enshinImpact.UnitTest/GameTaskTests/TestGameRuntime.cs | 101 | /// <summary> | COMMENT |
| LOW | …t/GameTaskTests/AutoFightTests/PartyAvatarInitTests.cs | 81 | // { | COMMENT |
| LOW | Fischless.WindowsInput/InputBuilder.cs | 361 | /// <summary> | COMMENT |
| LOW | BetterGenshinImpact/App.xaml.cs | 321 | services.AddView<KeyBindingsSettingsPage, KeyBindingsSettingsPageViewModel>(); | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/MaskWindowViewModel.cs | 61 | public AllConfig Config { get; } | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/MaskWindowViewModel.cs | 201 | /// 用户是否已开启游戏帧率采样(勾选后保持开启,随截图器启停切换进程) | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/MainWindowViewModel.cs | 61 | /// 提供在线子实例快照、状态变化通知与窗口激活能力。 | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/MainWindowViewModel.cs | 101 | /// <summary> | COMMENT |
| LOW | …tterGenshinImpact/ViewModel/DownloadCenterViewModel.cs | 21 | public partial class DownloadCenterViewModel : ObservableObject | COMMENT |
| LOW | …tterGenshinImpact/ViewModel/DownloadCenterViewModel.cs | 81 | /// 本次运行是否有下载任务;没有时不显示标题栏按钮 | COMMENT |
| LOW | …terGenshinImpact/ViewModel/SoloTaskButtonController.cs | 21 | public sealed class SoloTaskButtonController | COMMENT |
| LOW | …terGenshinImpact/ViewModel/SoloTaskButtonController.cs | 41 | private readonly IReadOnlyList<SoloTaskButtonState> _states; | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/DownloadItemViewModel.cs | 21 | COMMENT | |
| LOW | BetterGenshinImpact/ViewModel/DownloadItemViewModel.cs | 61 | /// <summary> | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/MapIconImageCache.cs | 21 | /// 远程图片服务,每次从容器取得,避免类型初始化早于容器创建时永久为空 | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/NotifyIconViewModel.cs | 41 | /// 退出前确认是否有下载正在进行。 | COMMENT |
| LOW | BetterGenshinImpact/ViewModel/NotifyIconViewModel.cs | 61 | private bool _isInstanceIdentityVisible; | COMMENT |
| LOW | …iewModel/SoloTaskSettings/SoloTaskSettingsViewModel.cs | 121 | /// 把参数里的战斗策略名或路径转换为选择器使用的规范值: | COMMENT |
| LOW | …Impact/ViewModel/Windows/StorageManagementViewModel.cs | 21 | COMMENT | |
| LOW | …Impact/ViewModel/Windows/StorageManagementViewModel.cs | 81 | public IReadOnlyList<KeyValuePair<int, string>> CacheLimitOptions { get; } | COMMENT |
| LOW | …inImpact/ViewModel/Windows/StorageAreaItemViewModel.cs | 21 | FolderPath = FindFolder(area); | COMMENT |
| LOW | …inImpact/ViewModel/Windows/StorageAreaItemViewModel.cs | 41 | /// </summary> | COMMENT |
| LOW | …inImpact/ViewModel/Windows/StorageAreaItemViewModel.cs | 61 | /// 清理按钮文字;会丢失用户数据的操作带省略号,表示会先确认 | COMMENT |
| LOW | …nshinImpact/ViewModel/Windows/StorageGroupViewModel.cs | 41 | /// 分组在占用比例条中的颜色(#RRGGBB) | COMMENT |
| LOW | …pact/ViewModel/Windows/GuideSubtitleWindowViewModel.cs | 41 | /// </summary> | COMMENT |
| LOW | …pact/ViewModel/Windows/SoloTaskInstanceRowViewModel.cs | 21 | /// </summary> | COMMENT |
| LOW | …enshinImpact/ViewModel/Windows/GuideWindowViewModel.cs | 121 | /// 窗口栏是否显示交互模式、鼠标穿透按钮 | COMMENT |
| LOW | …enshinImpact/ViewModel/Windows/GuideWindowViewModel.cs | 161 | COMMENT | |
| LOW | …enshinImpact/ViewModel/Windows/GuideWindowViewModel.cs | 181 | COMMENT | |
| LOW | …enshinImpact/ViewModel/Windows/GuideWindowViewModel.cs | 221 | public string HideToolTip => WithHotkey("隐藏小窗(保留网页)", _hotKeyConfig.GuideToggleHotkey); | COMMENT |
| LOW | …t/ViewModel/Windows/SoloTaskInstanceWindowViewModel.cs | 21 | /// <summary> | COMMENT |
| LOW | …t/ViewModel/Windows/SoloTaskInstanceWindowViewModel.cs | 41 | /// <summary> | COMMENT |
| LOW | …t/ViewModel/Windows/SoloTaskInstanceWindowViewModel.cs | 61 | COMMENT | |
| LOW | …indows/Pulonia/PuloniaJsScriptSettingFieldViewModel.cs | 21 | public string Name { get; } | COMMENT |
| LOW | …indows/Pulonia/PuloniaJsScriptSettingFieldViewModel.cs | 41 | public Dictionary<string, List<string>>? CascadeOptions { get; } | COMMENT |
| LOW | …indows/Pulonia/PuloniaJsScriptSettingFieldViewModel.cs | 61 | public bool IsSelect => Type == "select"; | COMMENT |
| LOW | …indows/Pulonia/PuloniaJsScriptSettingFieldViewModel.cs | 101 | COMMENT | |
| LOW | …ows/Pulonia/PuloniaSettingsProfileListItemViewModel.cs | 1 | namespace BetterGenshinImpact.ViewModel.Windows.Pulonia; | COMMENT |
| LOW | …del/Windows/Pulonia/PuloniaGenshinAccountsViewModel.cs | 21 | /// <summary>复用原子账号存储。</summary> | COMMENT |
| LOW | …ewModel/Windows/Pulonia/PuloniaSharedSettingsTarget.cs | 21 | COMMENT | |
| LOW | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 21 | /// </summary> | COMMENT |
| LOW | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 41 | /// </summary> | COMMENT |
| LOW | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 61 | /// </summary> | COMMENT |
| LOW | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 101 | COMMENT | |
| LOW | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 141 | public bool HasParameters => ParameterFields.Count > 0 || JavaScriptSettingFields.Count > 0; | COMMENT |
| 796 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …skTests/QuestVoiceTests/ContinuousFrameSessionTests.cs | 289 | var session = new BetterGenshinImpact.GameTask.QuestVoice.Features.Continuous.ContinuousFrameSession(ContinuousF | CODE |
| CRITICAL | …skTests/QuestVoiceTests/ContinuousFrameSessionTests.cs | 298 | var session = new BetterGenshinImpact.GameTask.QuestVoice.Features.Continuous.ContinuousFrameSession(ContinuousF | CODE |
| CRITICAL | …ts/QuestVoiceTests/ContinuousVoiceCancellationTests.cs | 34 | var failure = new BetterGenshinImpact.GameTask.QuestVoice.Core.Tts.VoiceException(BetterGenshinImpact.GameTask.Q | CODE |
| CRITICAL | BetterGenshinImpact/ViewModel/MainWindowViewModel.cs | 613 | Wpf.Ui.Violeta.Appearance.SystemMenuThemeManager.Apply( | CODE |
| CRITICAL | …nia/PuloniaTaskCreationDialogViewModel.Repositories.cs | 150 | _repositoryToSelect = BetterGenshinImpact.View.Windows.Pulonia.PuloniaRepositoryManagerWindow.Show( | CODE |
| CRITICAL | …/Windows/Pulonia/PuloniaTaskCreationDialogViewModel.cs | 458 | ? BetterGenshinImpact.ViewModel.Pages.Pulonia.PuloniaOneDragonSettingChoices.Decorate(property.N | CODE |
| CRITICAL | …/Windows/Pulonia/PuloniaTaskParameterFieldViewModel.cs | 198 | var isCombatStrategy = System.Text.Json.JsonNamingPolicy.SnakeCaseLower.ConvertName(name) is "strategy_name" or | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 155 | System.Windows.Application.Current.Dispatcher.Invoke(() => WechatClawbotStatus = hint); | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 722 | System.Windows.Application.Current.Dispatcher.Invoke(() => | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 780 | System.Windows.Application.Current.Dispatcher.Invoke(() => | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 804 | System.Windows.Application.Current.Dispatcher.Invoke(() => | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 887 | System.Windows.Application.Current.Dispatcher.Invoke(() => | CODE |
| CRITICAL | …t/ViewModel/Pages/NotificationSettingsPageViewModel.cs | 894 | System.Windows.Application.Current.Dispatcher.Invoke(() => | CODE |
| CRITICAL | …wModel/Pages/Pulonia/PuloniaOneDragonSettingChoices.cs | 36 | var key = System.Text.Json.JsonNamingPolicy.SnakeCaseLower.ConvertName(name); | CODE |
| CRITICAL | …ges/Pulonia/PuloniaOneDragonParameterFieldViewModel.cs | 168 | var displayKey = System.Text.Json.JsonNamingPolicy.SnakeCaseLower.ConvertName(name); | CODE |
| CRITICAL | BetterGenshinImpact/GameTask/SystemControl.cs | 506 | System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => System.Windows.Application.Curren | CODE |
| CRITICAL | …mpact/GameTask/Common/Reward/RewardResultRecognizer.cs | 109 | BetterGenshinImpact.GameTask.AutoDomain.TrainingGuide.TrainingGuideRewardDiagnostics.Record( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | BetterGenshinImpact/Core/Script/ScriptRepoUpdater.cs | 927 | // Step 1: 克隆到临时文件夹 | COMMENT |
| LOW | BetterGenshinImpact/Core/Script/ScriptRepoUpdater.cs | 941 | // Step 2: 基于目录结构重合度决定存放位置 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 642 | // Step 1: 状态同步 — 每次进入 reconcile FlyingState 与实际游戏状态 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 658 | // Step 2: 小于停止距离 → 主动下车 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 680 | // Step 3: 大于启用距离且未上车 → 尝试上车 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 713 | // Step 4: 已上车:体力 < 120 时纯飘(桑多涅技能代步),否则正常步行/冲刺 | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 111 | // Step 1: Get all teleport positions from current screenshot | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 170 | // Step 2: find a diagonal determined by two of the teleports, let's call these two teleports reference points | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 209 | // Step 3: For all diagonals determined by pairs of teleports on this map. | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 223 | // Step 4: Assuming this pair corresponds to the reference points | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 236 | // Step 5: Check how close the fit is | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | BetterGenshinImpact/Core/Script/ScriptRepoUpdater.cs | 927 | // Step 1: 克隆到临时文件夹 | COMMENT |
| LOW | BetterGenshinImpact/Core/Script/ScriptRepoUpdater.cs | 941 | // Step 2: 基于目录结构重合度决定存放位置 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 642 | // Step 1: 状态同步 — 每次进入 reconcile FlyingState 与实际游戏状态 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 658 | // Step 2: 小于停止距离 → 主动下车 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 680 | // Step 3: 大于启用距离且未上车 → 尝试上车 | COMMENT |
| LOW | …GenshinImpact/GameTask/AutoPathing/SkillBoostHelper.cs | 713 | // Step 4: 已上车:体力 < 120 时纯飘(桑多涅技能代步),否则正常步行/冲刺 | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 111 | // Step 1: Get all teleport positions from current screenshot | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 170 | // Step 2: find a diagonal determined by two of the teleports, let's call these two teleports reference points | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 209 | // Step 3: For all diagonals determined by pairs of teleports on this map. | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 223 | // Step 4: Assuming this pair corresponds to the reference points | COMMENT |
| LOW | …nImpact/GameTask/Common/Map/Maps/SeaOfBygoneErasMap.cs | 236 | // Step 5: Check how close the fit is | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/github_download_and_cnb_upload.py | 213 | except Exception as e: | CODE |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 493 | except Exception as e: | CODE |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 505 | except Exception as e: | CODE |
| LOW | .github/workflows/cnb_release.py | 331 | except Exception as e: | CODE |
| LOW | .github/workflows/cnb_release.py | 445 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/github_download_and_cnb_upload.py | 282 | CODE | |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 132 | CODE | |
| LOW | .github/workflows/cnb_release.py | 306 | CODE | |
| LOW | .github/workflows/cnb_release.py | 361 | CODE | |
| LOW | .github/workflows/cnb_release.py | 120 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Docs/design/js-script-html-settings.md | 408 | class ScriptSettingsRequestHandler { | CODE |
| LOW | …t/Core/Script/Settings/ScriptSettingsRequestHandler.cs | 21 | public sealed class ScriptSettingsRequestHandler( | CODE |
| LOW | …ice/Instance/MessageHandlers/InstanceRequestHandler.cs | 18 | internal sealed class InstanceRequestHandler | CODE |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 218 | def extract_version_from_filename(filename: str) -> Optional[str]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/github_download_and_cnb_upload.py | 31 | CODE | |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 32 | CODE | |
| LOW | .github/workflows/github_download_and_cnb_upload.py | 34 | CODE | |
| LOW | .github/workflows/cnb_release.py | 21 | CODE |