From 946cdbb9d20de2a1f381ec2cddff674a779d9820 Mon Sep 17 00:00:00 2001 From: gewuyou <95328647+GeWuYou@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:06:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(analyzer):=20=E6=94=B6=E5=8F=A3=E7=AC=AC?= =?UTF-8?q?=E4=BA=8C=E8=BD=AE=E6=B8=B8=E6=88=8F=E4=BE=A7=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 SettingsModel 与 GameConfigBootstrap 的残留 MA0158 专用锁警告 - 更新 analyzer-warning-reduction 恢复点与第二轮构建验证结果 --- GFramework.Game/Config/GameConfigBootstrap.cs | 4 ++ GFramework.Game/Setting/SettingsModel.cs | 6 ++ .../analyzer-warning-reduction-tracking.md | 44 +++++++------- .../analyzer-warning-reduction-trace.md | 58 +++++++++++++++++++ 4 files changed, 92 insertions(+), 20 deletions(-) diff --git a/GFramework.Game/Config/GameConfigBootstrap.cs b/GFramework.Game/Config/GameConfigBootstrap.cs index 9842d23b..84122fd6 100644 --- a/GFramework.Game/Config/GameConfigBootstrap.cs +++ b/GFramework.Game/Config/GameConfigBootstrap.cs @@ -20,7 +20,11 @@ public sealed class GameConfigBootstrap : IDisposable // All lifecycle transitions share one gate so initialization, hot-reload startup, // stop, and disposal never publish half-finished state to concurrent callers. +#if NET9_0_OR_GREATER + private readonly Lock _stateGate = new(); +#else private readonly object _stateGate = new(); +#endif private readonly GameConfigBootstrapOptions _options; private IUnRegister? _hotReload; private YamlConfigLoader? _loader; diff --git a/GFramework.Game/Setting/SettingsModel.cs b/GFramework.Game/Setting/SettingsModel.cs index 335cd562..8d741389 100644 --- a/GFramework.Game/Setting/SettingsModel.cs +++ b/GFramework.Game/Setting/SettingsModel.cs @@ -29,7 +29,13 @@ public class SettingsModel(IDataLocationProvider? locationProvider, private readonly ConcurrentDictionary _data = new(); private readonly ConcurrentDictionary> _migrationCache = new(); +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _migrationMapLock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _migrationMapLock = new(); +#endif private readonly ConcurrentDictionary<(Type type, int from), ISettingsMigration> _migrations = new(); private volatile bool _initialized; diff --git a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md index 5e21abeb..863d2966 100644 --- a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md +++ b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md @@ -6,12 +6,12 @@ ## 当前恢复点 -- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-075` -- 当前阶段:`Phase 75` +- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-077` +- 当前阶段:`Phase 77` - 当前焦点: - - `2026-04-27` 按 `$gframework-batch-boot 50` 完成第一轮并行 warning 清理集成,当前先收口已验证改动,再进入下一轮低风险 slice - - 当前轮次已重新确认 `origin/main` 基线与 `HEAD` 同为 `617e0bf`,已提交 branch diff 现为 `12 / 50` files、`192` changed lines - - 当前主线程已整合 4 个 subagent 的首轮结果,并补修 `SaveRepository.cs` / `SceneRouterBase.cs` 的 touched-file 残留 warning;下一轮继续优先处理单文件、低耦合 warning + - `2026-04-27` 第二轮 `GFramework.Game` 低风险 slice 已完成验证,当前待收口提交 `SettingsModel.cs` / `GameConfigBootstrap.cs` 的专用锁补修与 `ai-plan` 同步 + - 当前轮次已重新确认 `origin/main` 基线与 `HEAD` 同为 `617e0bf`,已提交 branch diff 现为 `26 / 50` files、`483` changed lines + - 当前 `GFramework.Game` 的低风险单文件 warning 已基本耗尽;若继续逼近 `$gframework-batch-boot 50`,下一轮更适合切到 `Core.Tests` 等测试项目中的单文件 warning ## 当前活跃事实 @@ -20,28 +20,32 @@ - `dotnet clean` - 结果:成功;此前沙箱内缺失 Windows fallback package folder 的 clean 失败属于环境噪音,不是仓库真值 - `dotnet build` - - 最新结果:成功;`430 Warning(s)`、`0 Error(s)` - - `dotnet build GFramework.sln -c Release` - - 最新结果:成功;`147 Warning(s)`、`0 Error(s)` -- 当前分支 stop-condition 指标(已提交 `HEAD`): + - 最新结果:成功;`405 Warning(s)`、`0 Error(s)` + - `dotnet build GFramework.Game/GFramework.Game.csproj -c Release` + - 最新结果:成功;`122 Warning(s)`、`0 Error(s)` +- 当前分支 stop-condition 指标: - `git diff --name-only refs/remotes/origin/main...HEAD | wc -l` - - 最新结果:`12` + - 最新结果:`26` - `git diff --numstat refs/remotes/origin/main...HEAD` - - 最新结果:`192` changed lines + - 最新结果:`483` changed lines - 当前批次已完成的 warning slice: - `GFramework.Core` 事件 / 状态 / 属性 / 协程统计中的 `MA0158` 专用锁迁移 - `GFramework.Game/Data` 中 `DataRepository`、`UnifiedSettingsDataRepository`、`SaveRepository` 的 `ConfigureAwait` / 比较器 / 专用锁修正 - `GFramework.Game/Scene/SceneRouterBase.cs` 与 `GFramework.Game/UI/UiRouterBase.cs` 中的显式上下文 / 参数名 / 比较器修正 -- 当前批次待提交的集成改动: - - `GFramework.Core` / `GFramework.Cqrs` 第二组 `MA0158` 专用锁迁移 - - `ai-plan/public/analyzer-warning-reduction/**` 的恢复点同步 +- 当前批次已完成并提交的收口: + - `fb0a55f` `fix(analyzer): 收口首轮并行警告清理` +- 当前批次已接受、待进入实现的下一轮 slice: + - `GFramework.Core.Tests/Concurrency/AsyncKeyLockManagerTests.cs` 的 `MA0004` + - `GFramework.Core.Tests/Pause/PauseStackManagerTests.cs` 的 `MA0158` + - `GFramework.Core.Tests/Extensions/AsyncExtensionsTests.cs` 的 `MA0015` + - `GFramework.Core.Tests/Architectures/ArchitectureModulesBehaviorTests.cs` 的 `MA0004` - 当前批次验证结果: - `dotnet clean` - 最新主线程结果:提权直接执行成功,确认为当前权威 clean 基线 - `dotnet build` - - 最新主线程结果:提权直接构建成功;`430 Warning(s)`、`0 Error(s)` - - `dotnet build GFramework.sln -c Release` - - 最新主线程结果:提权直接构建成功;`147 Warning(s)`、`0 Error(s)` + - 最新主线程结果:提权直接构建成功;`405 Warning(s)`、`0 Error(s)` + - `dotnet build GFramework.Game/GFramework.Game.csproj -c Release` + - 最新主线程结果:提权直接构建成功;`122 Warning(s)`、`0 Error(s)` ## 当前风险 @@ -72,6 +76,6 @@ ## 下一步建议 -1. 提交当前工作树里第二组锁迁移、`SaveRepository` / `SceneRouterBase` 补修与 `ai-plan` 同步,避免把两个批次混在同一组未提交改动里。 -2. 提交后重新计算 branch diff;若仍明显低于 `$gframework-batch-boot 50`,继续下发 2-3 个 `worker` subagent,优先处理 `SettingsModel.cs`、`RouterBase.cs`、`UiInteractionProfiles.cs` 等低风险单文件 warning。 -3. 若后续 branch diff 接近阈值,或剩余候选 slice 只剩 `YamlConfigSchemaValidator*` 这类高耦合热点,则在新的恢复点收口并等待下一轮。 +1. 下发 2-3 个 `worker` subagent,按文件边界拆分 `SettingsModel.cs`、`RouterBase.cs`+`UiInteractionProfiles.cs`,并视 `GameConfigBootstrap.cs` 的提取复杂度决定是否并行吸收。 +2. 若继续逼近 `$gframework-batch-boot 50`,优先把下一轮切到 `Core.Tests` 等测试项目的单文件 warning,避免被 `YamlConfigSchemaValidator*` / `YamlConfigLoader.cs` 等热点拖入高耦合重构。 +3. 若 branch diff 接近阈值,或剩余候选只剩高耦合热点与会明显放大文件数的 `MA0048` 批量拆分,则在新的恢复点收口并等待下一轮。 diff --git a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md index b22a466f..841acee3 100644 --- a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md +++ b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md @@ -1,5 +1,63 @@ # Analyzer Warning Reduction 追踪 +## 2026-04-27 — RP-077 + +### 阶段:完成第二轮 Game 侧低风险 slice 验证并转向测试项目候选 + +- 触发背景: + - 第二轮 worker 已分别完成 `SettingsModel.cs`、`RouterBase.cs`+`UiInteractionProfiles.cs`、`GameConfigBootstrap.cs` + - 主线程在复验时发现 `SettingsModel.cs` 与 `GameConfigBootstrap.cs` 又各暴露一个 touched-file `MA0158`,已在主线程补齐 +- 已接受的 delegated scope 与结果: + - worker-A:`GFramework.Game/Setting/SettingsModel.cs` + - 结果:提交 `c106e53`,修复 `MA0004`;主线程随后补齐同文件 `MA0158` + - worker-B:`GFramework.Game/Routing/RouterBase.cs`、`GFramework.Game/UI/UiInteractionProfiles.cs` + - 结果:提交 `9deafac`,修复 `MA0006` / `MA0099` + - worker-C:`GFramework.Game/Config/GameConfigBootstrap.cs` + - 结果:提交 `9ce634e`,拆分热重载启动流程以修复 `MA0051`;主线程随后补齐同文件 `MA0158` + - explorer:重新审视 `GFramework.Game` 排除热点后的剩余候选 + - 结果:确认 `Game` 侧低风险单文件 warning 基本耗尽,继续推进应转向其他项目 +- 主线程验证里程碑: + - 提权 `dotnet clean` + - 结果:成功 + - 提权 `dotnet build` + - 结果:成功;warning 从上一轮的 `430` 继续降到 `405` + - 提权 `dotnet build GFramework.Game/GFramework.Game.csproj -c Release` + - 结果:成功;warning 从上一轮的 `147` 降到 `122` + - `git diff --name-only refs/remotes/origin/main...HEAD | wc -l` + - 结果:`26` + - `git diff --numstat refs/remotes/origin/main...HEAD` + - 结果:`483` changed lines +- 当前结论: + - 第二轮 Game 侧 warning 清理已完成验证,且 warning 数继续实质下降 + - 当前分支距离 `$gframework-batch-boot 50` 仍有空间,但继续推进不应再硬碰 `YamlConfigSchemaValidator*` / `YamlConfigLoader.cs` + - 若继续下一轮,优先切向 `Core.Tests` 等测试项目里的单文件 `MA0004` / `MA0015` / `MA0158` + +## 2026-04-27 — RP-076 + +### 阶段:首轮收口提交后进入第二轮低风险 Game warning slice + +- 触发背景: + - 首轮并行清理已经以 `fb0a55f` 收口,当前分支相对 `origin/main` 的累计改动文件数来到 `22 / 50` + - 用户要求继续采用“先拿构建 warning,再分批交给 subagent”模式,因此当前仍有继续推进的 branch 预算 +- 主线程当前真值: + - 当前基线:`refs/remotes/origin/main` = `617e0bf` + - 当前 `HEAD` stop metric: + - files:`22` + - changed lines:`378` + - 最近权威验证仍为: + - `dotnet build`:`430 Warning(s)`、`0 Error(s)` + - `dotnet build GFramework.sln -c Release`:`147 Warning(s)`、`0 Error(s)` +- 本轮拟下发的 delegated scope: + - worker-A:`GFramework.Game/Setting/SettingsModel.cs` + - 目标:修复 `MA0004`,仅在不改变设置模型生命周期语义的前提下补全 `ConfigureAwait(false)` + - worker-B:`GFramework.Game/Routing/RouterBase.cs` 与 `GFramework.Game/UI/UiInteractionProfiles.cs` + - 目标:修复 `MA0006` / `MA0099`,保持现有路由比较语义与 UI 动作位掩码语义不变 + - worker-C:`GFramework.Game/Config/GameConfigBootstrap.cs` + - 目标:评估并尽量修复 `MA0051`;若单文件安全提取不可低风险完成,应明确放弃并说明阻塞点 +- 当前结论: + - 第二轮继续严格限制在低风险单文件 slice,避免直接进入 `YamlConfigSchemaValidator*` 与 `YamlConfigLoader.cs` 这种高耦合热点 + - 本轮完成后应重新评估 branch diff 是否仍适合继续在同一分支上批量推进 + ## 2026-04-27 — RP-075 ### 阶段:完成 `$gframework-batch-boot 50` 第一轮并行 warning 清理集成