diff --git a/GFramework.Cqrs.Tests/Logging/TestLogger.cs b/GFramework.Cqrs.Tests/Logging/TestLogger.cs index c0432bc7..1b857438 100644 --- a/GFramework.Cqrs.Tests/Logging/TestLogger.cs +++ b/GFramework.Cqrs.Tests/Logging/TestLogger.cs @@ -21,6 +21,8 @@ namespace GFramework.Cqrs.Tests.Logging; /// public sealed class TestLogger : AbstractLogger { + private readonly List _logs = []; + /// /// 初始化测试日志记录器。 /// @@ -33,7 +35,7 @@ public sealed class TestLogger : AbstractLogger /// /// 获取当前测试期间捕获到的日志条目。 /// - public List Logs { get; } = []; + public IReadOnlyList Logs => _logs; /// /// 将日志写入内存,供断言使用。 @@ -43,7 +45,7 @@ public sealed class TestLogger : AbstractLogger /// 关联异常。 protected override void Write(LogLevel level, string message, Exception? exception) { - Logs.Add(new LogEntry(level, message, exception)); + _logs.Add(new LogEntry(level, message, exception)); } /// diff --git a/GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs b/GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs index fe8f4413..410691eb 100644 --- a/GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs +++ b/GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs @@ -368,7 +368,10 @@ public sealed class TestBehaviorRequestHandler : IRequestHandler LoggedMessages { get; set; } = new(); + /// + /// 记录测试行为写入的日志消息,同时避免向调用方暴露具体集合实现。 + /// + public static IList LoggedMessages { get; set; } = new List(); } public sealed record TestValidatedRequest : IRequest @@ -467,8 +470,19 @@ public sealed record TestCircuitBreakerRequest : IRequest // 复杂场景相关类 public class SagaData { - public List CompletedSteps { get; } = new(); - public List CompensatedSteps { get; } = new(); + /// + /// 获取 Saga 已成功执行的步骤集合。 + /// + public IList CompletedSteps { get; } = new List(); + + /// + /// 获取 Saga 失败后已执行补偿的步骤集合。 + /// + public IList CompensatedSteps { get; } = new List(); + + /// + /// 获取或设置 Saga 是否已经完整结束。 + /// public bool IsCompleted { get; set; } } @@ -489,7 +503,11 @@ public sealed record TestExternalServiceRequest : IRequest public sealed record TestDatabaseRequest : IRequest { public string Data { get; init; } = string.Empty; - public List Storage { get; init; } = new(); + + /// + /// 获取或初始化用于模拟数据库写入的可变存储集合,同时避免泄漏具体集合实现。 + /// + public IList Storage { get; init; } = new List(); } #endregion 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 2d1d182f..ce1813ea 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,14 +6,14 @@ ## 当前恢复点 -- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-068` -- 当前阶段:`Phase 68` +- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-069` +- 当前阶段:`Phase 69` - 当前焦点: - - `2026-04-25` 主线程已提交 `1b85b53` `refactor(game): 收敛版本化迁移运行器长方法 warning` - - 并行 subagent 批次已提交 `a7fa70e` `fix(core-tests): 清理 LogContextTests 异步等待 warning` 与 `9f6204d` `fix(core-tests): 收口 LoggerTests 日志集合抽象` - - 当前主线程单文件批次聚焦 `GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs`,通过拆分缓存元数据测试的装配、断言与 verify helper 收敛根构建直接确认的 `MA0051` - - 提权后的直接仓库根基线已从 `649 Warning(s)` 降至 `645 Warning(s)`,说明本轮 3 文件并行批次继续有效 - - `GFramework.Cqrs.Tests` 与 `GFramework.Core.Tests` 的直接受影响 `Release` build 当前均已通过,branch diff 仍显著低于 `$gframework-batch-boot 50` 阈值 + - `2026-04-25` 主线程已提交 `58ba6c0` `test(cqrs-tests): 收敛处理器注册缓存测试 warning` + - 当前并行双文件批次聚焦 `GFramework.Cqrs.Tests/Logging/TestLogger.cs` 与 `GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs` + - 主线程收敛 `TestLogger.Logs` 的集合抽象暴露问题,worker 则在 `MediatorAdvancedFeaturesTests.cs` 内收敛一组低风险 `MA0016` + - 提权后的直接仓库根基线已从 `645 Warning(s)` 降至 `640 Warning(s)`,说明本轮双文件 `Cqrs.Tests` 批次继续有效 + - `GFramework.Cqrs.Tests` 的直接受影响 `Release` build 当前为 `0 Warning(s)`、`0 Error(s)`,branch diff 仍显著低于 `$gframework-batch-boot 50` 阈值 ## 当前活跃事实 @@ -22,12 +22,14 @@ - `dotnet clean` - 结果:成功;此前沙箱内 “Build FAILED but 0 errors” 的 clean 结果不是仓库真值 - `dotnet build` - - 最新结果:成功;`645 Warning(s)`、`0 Error(s)` + - 最新结果:成功;`640 Warning(s)`、`0 Error(s)` - 已提交的低风险批次文件: - `AGENTS.md` - `GFramework.Core.Tests/Logging/LogContextTests.cs` - `GFramework.Core.Tests/Logging/LoggerTests.cs` - `GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs` + - `GFramework.Cqrs.Tests/Logging/TestLogger.cs` + - `GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs` - `GFramework.Ecs.Arch.Tests/Ecs/EcsAdvancedTests.cs` - `GFramework.Game.Tests/Config/GameConfigBootstrapTests.cs` - `GFramework.Game.Tests/Config/GeneratedConfigConsumerIntegrationTests.cs` @@ -38,11 +40,9 @@ - `ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md` - 当前批次验证结果: - `dotnet build GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release` - - 最新主线程结果:成功;`155 Warning(s)`、`0 Error(s)` - - `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --no-build --filter "FullyQualifiedName~CqrsHandlerRegistrarTests.RegisterHandlers_Should_Cache_Assembly_Metadata_Across_Containers"` - - 最新主线程结果:成功;`Passed 1/1` - - `dotnet build GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release` - 最新主线程结果:成功;`0 Warning(s)`、`0 Error(s)` + - `dotnet build GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release` + - 上一轮主线程结果:成功;`0 Warning(s)`、`0 Error(s)` ## 当前风险 @@ -70,16 +70,14 @@ - `dotnet clean` - 当前结果:成功;在提权后的直接 shell 中可正常完成仓库根 clean - `dotnet build` - - 当前结果:成功;`645 Warning(s)`、`0 Error(s)` + - 当前结果:成功;`640 Warning(s)`、`0 Error(s)` - `dotnet build GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release` - - 当前结果:成功;`155 Warning(s)`、`0 Error(s)` -- `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --no-build --filter "FullyQualifiedName~CqrsHandlerRegistrarTests.RegisterHandlers_Should_Cache_Assembly_Metadata_Across_Containers"` - - 当前结果:成功;`Passed 1/1` + - 当前结果:成功;`0 Warning(s)`、`0 Error(s)` - `dotnet build GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release` - 当前结果:成功;`0 Warning(s)`、`0 Error(s)` ## 下一步建议 -1. 以当前 `645 Warning(s)` 根基线为新恢复点,继续按 `$gframework-batch-boot 50` 规则重算 branch diff,并挑选下一个 1-3 文件的低风险热点。 +1. 以当前 `640 Warning(s)` 根基线为新恢复点,继续按 `$gframework-batch-boot 50` 规则重算 branch diff,并挑选下一个 1-3 文件的低风险热点。 2. 下一轮优先从 `GFramework.Cqrs.Tests`、`GFramework.Core.Tests` 或 `GFramework.Game` 中继续选择单文件 `MA0051`、`MA0016` 或测试噪音切片,避免过早推高 review 范围。 3. 后续凡是沙箱内 `.NET` 验证再次出现无诊断失败、pipe/socket 权限问题或与普通 shell 不一致的结果,直接申请沙箱外重跑同一命令,不再扩散 workaround 型命令噪音。 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 6316d76e..1dc87ea8 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,33 @@ # Analyzer Warning Reduction 追踪 +## 2026-04-25 — RP-069 + +### 阶段:继续收口 Cqrs.Tests 双文件集合抽象 warning,并刷新新的仓库根基线 + +- 触发背景: + - `RP-068` 收尾后,当前分支的仓库根基线已降到 `645 Warning(s)`,branch diff 仍远低于 `$gframework-batch-boot 50` + - 为保持批次小而连续,主线程继续留在 `GFramework.Cqrs.Tests` 项目内,选取两个不涉及跨文件重构的 `MA0016` 切片 +- 接受的委派范围: + - worker `Chandrasekhar` + - 文件:`GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs` + - 目标:在同一文件内收敛 `TestLoggingBehavior.LoggedMessages`、`SagaData`、`TestDatabaseRequest` 的集合抽象暴露问题 + - 结果:未自行提交;主线程接受其工作树改动并纳入本轮批次 +- 主线程实施: + - 本地修改 `GFramework.Cqrs.Tests/Logging/TestLogger.cs` + - 将 `Logs` 从 `List` 收口为 `IReadOnlyList`,保留私有 `_logs` 作为内部存储 + - 与 worker 的 `MediatorAdvancedFeaturesTests.cs` 改动合并后,重新执行 `GFramework.Cqrs.Tests` 与仓库根验证,确认双文件批次的净效果 +- 验证里程碑: + - `dotnet build GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release` + - 结果:成功;`0 Warning(s)`、`0 Error(s)` + - `dotnet clean` + - 结果:成功 + - `dotnet build` + - 结果:成功;`640 Warning(s)`、`0 Error(s)`,相较 `RP-068` 的 `645` 再下降 `5` +- 当前结论: + - `Cqrs.Tests` 双文件批次已确认有效,并继续压低仓库根 warning 基线 + - 当前分支距离 `$gframework-batch-boot 50` 的停止阈值仍有很大空间,可以继续按“主线程小切片 + subagent 并行单文件”推进 + - 下一轮可优先回到 `GFramework.Core.Tests` 或继续选择新的 `GFramework.Cqrs.Tests` 单文件热点 + ## 2026-04-25 — RP-068 ### 阶段:吸收并行 subagent 小批次,并继续压低仓库根 warning 基线