mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
- 修复 SchemaConfigGenerator 的归一化字段名冲突诊断,并补充对应 generator 回归测试 - 修复 CqrsHandlerRegistryGenerator 对 dynamic 的运行时类型引用,避免生成非法 typeof(dynamic) - 更新 AGENTS 与 analyzer-warning-reduction 跟踪,明确受影响模块必须独立 build 并处理或显式报告 warning
34 KiB
34 KiB
Analyzer Warning Reduction 跟踪
目标
继续以“优先低风险、保持行为兼容”为原则收敛当前仓库的 Meziantou analyzer warnings,并在首轮大规模清理完成后, 判断剩余结构性 warning 是否值得在下一轮继续推进。
当前恢复点
- 恢复点编号:
ANALYZER-WARNING-REDUCTION-RP-025 - 当前阶段:
Phase 25 - 当前焦点:
- 已完成
GFramework.Core当前MA0016/MA0002/MA0015/MA0077低风险收口批次 - 已复核
net10.0下的MA0158基线:GFramework.Core/GFramework.Cqrs当前共有16个 object lock 建议点,属于跨 target 兼容性风险,不在本轮直接批量替换 - 已完成
GFramework.Core.SourceGenerators/Rule/ContextAwareGenerator.cs的剩余MA0051结构拆分,生成输出保持不变 - 已完成
GFramework.Cqrs.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs的MA0051结构拆分,生成输出保持不变 - 已完成
GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.cs的MA0006低风险收口,schema 关键字比较显式使用StringComparison.Ordinal - 已完成
SchemaConfigGenerator.cs的第一批MA0051结构拆分:schema 入口解析、属性解析、schema 遍历、数组属性解析、 约束文档生成与若干生成代码发射 helper 已拆出语义阶段 - 已完成当前 PR #269 review follow-up:
CqrsHandlerRegistryGenerator按职责拆分为 partial 生成器文件,ContextAwareGenerator已补上字段名去冲突与锁内读取修正,Option<T>补齐<remarks>契约说明 - 已完成当前 PR #269 第二轮 follow-up:恢复
EasyEvents、CollectionExtensions、LoggingConfiguration与FilterConfiguration的公共 API 兼容形状,并将 analyzer 兼容性处理收敛到局部 pragma - 已完成当前 PR #269 第三轮 follow-up:继续收口
SchemaConfigGenerator的根类型标识符校验与 XML 文档转义, 并补齐LoggingConfigurationTests、CollectionExtensionsTests、Cqrshelper 抽取与ai-plan命令文本修正 - 已完成当前 PR #269 第四轮 follow-up:将
CqrsHandlerRegistryGenerator的 Roslyn error type 直接引用改为 运行时精确查找路径,并为SchemaConfigGenerator补上根type非字符串时的防御与回归测试 - 已完成当前 PR #269 第五轮 follow-up:
SchemaConfigGenerator补上归一化后属性名冲突诊断并新增GF_ConfigSchema_014,CqrsHandlerRegistryGenerator将dynamic归一化为global::System.Object, 同时收紧相关 generator regression tests - 已更新
AGENTS.md:变更模块必须运行对应dotnet build -c Release,并处理或显式报告模块构建 warning, 不再默认留给长期 warning 清理分支 CoroutineScheduler的 tag/group 字典已显式使用StringComparer.Ordinal,保持既有区分大小写语义EasyEvents.AddEvent<T>()的重复注册路径已恢复为ArgumentException,以保持既有异常契约Option<T>已声明IEquatable<Option<T>>,与已有强类型Equals(Option<T>)契约对齐- 当前
GFramework.Corenet8.0warnings-only 基线已降到0条 - 当前
GFramework.Core.SourceGeneratorswarnings-only 基线已降到0条 - 当前
GFramework.Cqrs.SourceGeneratorswarnings-only 基线已降到0条 - 当前
GFramework.Game.SourceGeneratorswarnings-only 基线已从46条降到9条,剩余均为SchemaConfigGenerator.cs的MA0051 GFramework.Godot的Timing.cs已同步适配新事件签名,但当前 worktree 的 Godot restore 资产仍受 Windows fallback package folder 干扰,独立 build 需在修复资产后补跑- 后续继续按 warning 类型和数量批处理,而不是回退到按单文件切片推进
- 下一轮默认继续拆分
GFramework.Game.SourceGenerators的MA0051热点,或评估跨 target 的MA0158锁替换风险 - 单次
boot的工作树改动上限控制在约100个文件以内,避免 recovery context 与 review 面同时失控 - 若任务边界互不冲突,允许使用不同模型的 subagent 并行处理不同 warning 类型或不同目录,但必须遵守显式 ownership
- 已完成
当前状态摘要
- 已完成
GFramework.Core、GFramework.Cqrs、GFramework.Godot与部分 source generator 的低风险 warning 清理 - 已完成多轮 CodeRabbit follow-up 修复,并用定向测试与项目/解决方案构建验证了关键回归风险
- 已完成当前 PR #265 review follow-up:修复
CoroutineScheduler的零容量扩容边界,并补上Storedispatch 作用域的异常安全回滚 - 已继续完成当前 PR #265 review follow-up:修复
Event<T>与Event<T, TK>监听器计数的 off-by-one,并补充回归测试 - 已增强
gframework-pr-review脚本与 skill 文档,降低超长 JSON 直出导致的 review 信号漏看风险 - 已完成
GFramework.Core当前MA0046批次:将阶段、协程与异步日志事件统一迁移到EventHandler<TEventArgs>形状, 并同步更新GFramework.Godot订阅点、定向测试与docs/zh-CN示例 - 已完成当前 PR #267 review follow-up:修复
AsyncLogAppender的ILogAppender.Flush()双重完成通知,并补齐PhaseChanged/CoroutineExceptionEventArgsXML 文档、PhaseChanged迁移说明和ai-plan基线注释 - 已完成当前 PR #267 failed-test follow-up:修复
AsyncLogAppender.Flush()在队列已被后台线程提前清空时仍可能 等待满默认超时并返回false的竞态,并通过整包GFramework.Core.Tests重新验证 - 已完成当前
GFramework.Corenet8.0剩余低风险 analyzer warning 批次;warnings-only 基线已降到0条 - 已完成
GFramework.Core.SourceGenerators中ContextAwareGenerator的剩余MA0051收口;warnings-only 基线已降到0条 - 已完成
GFramework.Cqrs.SourceGenerators中CqrsHandlerRegistryGenerator的剩余MA0051收口;warnings-only 基线已降到0条 - 已完成当前 PR #269 的 review follow-up:收口
ContextAwareGenerator的字段命名冲突 / 锁内读取契约、CqrsHandlerRegistryGenerator的运行时类型 null 防御与超大文件拆分、SchemaConfigGenerator的取消语义, 并恢复EasyEvents/CollectionExtensions/ logging 配置模型的公共 API 兼容形状 - 已完成当前 PR #269 的第四轮 review follow-up:确认 5 个 latest-head 未解决线程中仅剩 2 个本地仍成立,
已分别在
CqrsHandlerRegistryGenerator与SchemaConfigGenerator中收口,并补齐定向 generator regression tests - 已完成当前 PR #269 的第五轮 review follow-up:收口
SchemaConfigGenerator的归一化字段名冲突诊断、CqrsHandlerRegistryGenerator的dynamic类型引用风险,并同步更新AGENTS.md的模块 build / warning 治理规范 - 已完成
GFramework.Game.SourceGenerators中SchemaConfigGenerator的第一批MA0051收口;warnings-only 基线剩余9条MA0051
当前活跃事实
- 当前主题仍是 active topic,因为剩余结构性 warning 是否继续推进尚未决策
RP-001的详细实现历史、测试记录和 warning 热点清单已归档到主题内archive/RP-002已在不改公共契约的前提下完成CqrsHandlerRegistrar结构拆分,并通过定向 build/test 验证RP-003已在不改生命周期契约的前提下完成ArchitectureLifecycle初始化主流程拆分,并通过定向 build/test 验证RP-004已完成当前 PR review follow-up:修复TryCreateGeneratedRegistry的可空out契约并清理 trace 文档重复标题RP-005已在不改公共 API 的前提下完成PauseStackManager两个MA0051的结构拆分,并补充销毁通知回归测试RP-006已在不改公共 API 的前提下完成Store两个MA0051的结构拆分,并通过定向 build/test 验证 dispatch、 多态 reducer 匹配与历史语义未回归RP-007已在不改公共 API 的前提下完成CoroutineScheduler两个MA0051的结构拆分,并通过定向 build/test 验证 调度、取消与完成状态语义未回归RP-008将后续策略从“单文件 warning 切片”切换为“按类型批处理 + 文件数上限控制”,并允许在非冲突前提下使用 不同模型的 subagent 并行处理RP-009在不改公共 API 的前提下,将同名泛型家族收拢到与类型名一致的单文件中,清空当前GFramework.Corenet8.0基线中的MA0048,并通过定向 build/test 验证Command、Query、Event路径未回归RP-010使用gframework-pr-review复核当前分支 PR #265 后,修复了仍在本地成立的两个 follow-up 风险:CoroutineScheduler的initialCapacity: 0扩容越界,以及Store在 dispatch 快照阶段抛异常时可能残留_isDispatching = true的锁死问题RP-011根据补充复核继续收口 PR #265 的 outside-diff comment,修复Event<T>/Event<T, TK>默认 no-op 委托导致的GetListenerCount()off-by-one,并以定向事件测试验证注册、注销和计数语义RP-012为gframework-pr-review增加--json-output、--section、--path与文本截断能力,并更新 skill 推荐用法, 让“先落盘、再定向抽取”成为默认可操作路径RP-013已完成GFramework.Core当前MA0046批次,并以新的事件参数类型替换阶段、协程和异步日志事件的 非标准签名;GFramework.Corenet8.0warnings-only 基线由15降至9RP-014使用gframework-pr-review复核当前分支 PR #267 的 latest head review threads、outside-diff comment 与 nitpick comment 后,确认 8 条高信号项中仍成立的是 1 个行为 bug 与 7 个文档/测试/跟踪缺口,并按最小改动收口RP-015使用$gframework-pr-review复核 PR #267 的 CTRF 失败测试评论后,确认AsyncLogAppender仍存在 “队列已空但 Flush 仍超时失败”的竞态;该问题在本地整包GFramework.Core.Tests中可复现,现已修复并补上稳定回归测试RP-016将GFramework.Core当前剩余MA0016/MA0002/MA0015/MA0077低风险批次清零,并用 warnings-only build 与 focused tests 验证配置反序列化、集合扩展、事件重复注册、Option<T>相等性和协程 tag/group 语义RP-017复核MA0158当前仍是跨 target 锁类型迁移问题,因此先收口单点ContextAwareGeneratorMA0051, 并通过 source generator 项目 build 与ContextAwareGeneratorSnapshotTests验证生成输出未回归RP-018暂缓跨 targetMA0158,转入GFramework.Cqrs.SourceGenerators的单文件结构性 warning; 通过拆分 handler 分析、运行时类型引用构造、注册器源码发射与精确反射注册输出阶段,清空该项目当前MA0051RP-019转入GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.cs,先完成低风险MA0006批次; 通过 schema 类型比较 helper 与显式StringComparison.Ordinal清空当前项目的MA0006RP-020继续拆分SchemaConfigGenerator.cs的MA0051热点,将当前项目 warnings-only 基线从19条降到9条, 并用 focused schema generator tests 验证 50 个用例通过RP-021使用$gframework-pr-review复核当前分支 PR #269 后,修复仍在本地成立的 4 个项:将CqrsHandlerRegistryGenerator拆分为职责清晰的 partial 文件、为ContextAwareGenerator生成字段增加稳定前缀并补上SetContextProvider的运行时 null 校验、为Option<T>补齐<remarks>,并新增字段重名场景的生成器快照测试RP-022继续复核 PR #269 的 latest-head review threads 与 nitpick,确认仍成立的项包括公共 API 兼容回退、ContextAwareGenerator字段名真正去冲突与锁内读取、SchemaConfigGenerator取消传播、Cqrs运行时类型 null 防御; 已补齐对应回归测试与 focused build/test 验证RP-023继续复核 PR #269 剩余 nitpick/outside-diff 项,确认仍成立的项集中在SchemaConfigGenerator根类型名校验、 aggregate registration comparer XML 文档转义、logging / collection 反射测试补强,以及跟踪文档中的RestoreFallbackFolders=""可复制性问题RP-024使用$gframework-pr-review继续复核 PR #269 latest-head unresolved threads,确认EasyEvents异常契约、SchemaConfigGenerator取消传播与ContextAwareGenerator快照冲突线程均已在本地收口,仅剩Cqrserror type 直接引用与根 schematype非字符串防御仍成立;现已补齐实现与回归测试RP-025继续复核 PR #269 剩余 outside-diff / nitpick 信号后,确认本地仍成立的是SchemaConfigGenerator的归一化字段名冲突与Cqrs对dynamic的直接类型引用;已分别补上诊断、运行时类型归一化与回归测试, 并把“变更模块必须运行对应 build 且处理 warning”的治理规则写回AGENTS.md- 当前工作树分支
fix/analyzer-warning-reduction-batch已在ai-plan/public/README.md建立 topic 映射
当前风险
- analyzer 收口回退风险:后续若继续压
MA0015/MA0016,容易再次把公共 API 收窄成与既有契约不兼容的形状- 缓解措施:优先保留既有公共 API,并将兼容性例外收敛到局部 pragma;继续用反射断言覆盖返回类型、属性类型与异常类型
- 测试宿主稳定性风险:部分 Godot 失败路径在当前 .NET 测试宿主下仍不稳定
- 缓解措施:继续优先使用稳定的 targeted test、项目构建和相邻 smoke test 组合验证
- 多目标框架 warning 解释风险:同一源位置会在多个 target framework 下重复计数
- 缓解措施:继续以唯一源位置和 warning 家族为主要决策依据,而不是只看原始 warning 总数
- net10 专属 warning 风险:
MA0158建议使用System.Threading.Lock,但项目多 target 时需要确认兼容边界- 缓解措施:下一轮先按 target framework 与 API 可用性评估,不直接批量替换共享源码中的
objectlock
- 缓解措施:下一轮先按 target framework 与 API 可用性评估,不直接批量替换共享源码中的
- source generator warning 外溢风险:运行
GFramework.SourceGenerators.Tests会构建相邻 generator/test 项目并显示既有GFramework.Game.SourceGenerators与测试项目 warning- 缓解措施:继续以被修改 generator 项目的独立 warnings-only build 作为主验收,并用 focused generator test 验证行为
- source generator test warning 治理风险:
GFramework.SourceGenerators.Tests当前仍有既有MA0051/MA0004/MA0048warning,本轮 focused test 已通过,但测试项目整包 warning 尚未进入本轮写集- 缓解措施:后续若继续修改该测试项目,应按新增
AGENTS.md规则先跑其独立 build,并在进入下一轮实现前明确 warning 收口范围
- 缓解措施:后续若继续修改该测试项目,应按新增
- Godot 资产文件环境风险:当前 worktree 的
GFramework.Godotrestore/build 仍会命中 Windows fallback package folder- 缓解措施:后续若继续触达 Godot 模块,先用 Linux 侧 restore 资产或 Windows-hosted 构建链刷新该项目,再补跑定向 build
- 并行实现风险:批量收敛时若 subagent 写入边界不清晰,容易引入命名冲突或重复重构
- 缓解措施:只在 warning 类型或目录边界清晰时并行;每个 subagent 必须有独占文件 ownership,主代理负责合并验证
活跃文档
- 历史跟踪归档:analyzer-warning-reduction-history-rp001.md
- 历史 trace 归档:analyzer-warning-reduction-history-rp001.md
验证说明
RP-001的详细 warning 清理、回归修复与定向验证命令均已迁入主题内历史归档RP-002的定向验证结果:dotnet build GFramework.Cqrs/GFramework.Cqrs.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:UseSharedCompilation=false -p:RestoreFallbackFolders=dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter FullyQualifiedName~CqrsHandlerRegistrarTests -p:RestoreFallbackFolders=
RP-003的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders= -nologo -clp:Summary;WarningsOnlydotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter FullyQualifiedName~ArchitectureLifecycleBehaviorTests -p:RestoreFallbackFolders=
RP-004的定向验证结果:dotnet build GFramework.Cqrs/GFramework.Cqrs.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:UseSharedCompilation=false -p:RestoreFallbackFolders=- 结果:
0 Warning(s),0 Error(s)
- 结果:
RP-005的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
27 Warning(s),0 Error(s);PauseStackManager.cs已不再出现在MA0051列表中
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter FullyQualifiedName~PauseStackManagerTests -p:RestoreFallbackFolders=- 结果:
25 Passed,0 Failed
- 结果:
RP-006的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -p:RestorePackagesPath=<linux-nuget-cache> -nologo -clp:"Summary;WarningsOnly"- 结果:
25 Warning(s),0 Error(s);Store.cs已不再出现在MA0051列表中
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter FullyQualifiedName~StoreTests -p:RestoreFallbackFolders="" -p:RestorePackagesPath=<linux-nuget-cache> -nologo- 结果:
30 Passed,0 Failed
- 结果:
RP-007的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -p:RestorePackagesPath=<linux-nuget-cache> -nologo -clp:"Summary;WarningsOnly"- 结果:
23 Warning(s),0 Error(s);CoroutineScheduler.cs已不再出现在MA0051列表中
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter FullyQualifiedName~CoroutineScheduler -p:RestoreFallbackFolders="" -p:RestorePackagesPath=<linux-nuget-cache> -nologo- 结果:
34 Passed,0 Failed
- 结果:
RP-008的策略基线:- 当前
GFramework.Core剩余 warning 分布:MA0048=8、MA0046=6、MA0016=5、MA0002=2、MA0015=1、MA0077=1 - 后续批处理规则:优先按类型推进;若当轮主类型数量不足,可顺手吸收其他低冲突类型,不限定于
MA0015与MA0077
- 当前
RP-009的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"- 结果:
15 Warning(s),0 Error(s);当前GFramework.Corenet8.0warnings-only 输出中已不再出现MA0048
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~CommandExecutorTests|FullyQualifiedName~AbstractAsyncCommandTests|FullyQualifiedName~QueryExecutorTests|FullyQualifiedName~AbstractAsyncQueryTests|FullyQualifiedName~EventTests" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
83 Passed,0 Failed
- 结果:
RP-010的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo- 结果:
15 Warning(s),0 Error(s);新增修复未引入新的GFramework.Corenet8.0构建错误
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~CoroutineSchedulerTests.Run_Should_Grow_From_Zero_Initial_Capacity|FullyQualifiedName~StoreTests.Dispatch_Should_Reset_Dispatching_Flag_When_Snapshot_Creation_Throws" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
2 Passed,0 Failed
- 结果:
RP-011的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo- 结果:
15 Warning(s),0 Error(s);Event.cs的 listener count 修复未引入新的GFramework.Corenet8.0构建错误
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~EventTests.EventT_GetListenerCount_Should_Exclude_Placeholder_Handler|FullyQualifiedName~EventTests.EventTTK_GetListenerCount_Should_Exclude_Placeholder_Handler" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
2 Passed,0 Failed
- 结果:
RP-012的定向验证结果:python3 -m py_compile .codex/skills/gframework-pr-review/scripts/fetch_current_pr_review.py- 结果:通过;使用
PYTHONPYCACHEPREFIX=/tmp/codex-pycache规避技能目录只读导致的__pycache__写入限制
- 结果:通过;使用
python3 .codex/skills/gframework-pr-review/scripts/fetch_current_pr_review.py --help- 结果:通过;
--json-output、--section、--path、--max-description-length已出现在 CLI 帮助中
- 结果:通过;
dotnet build GFramework.Core/GFramework.Core.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo- 结果:
0 Warning(s),0 Error(s)
- 结果:
RP-013的定向验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"- 结果:
9 Warning(s),0 Error(s);相对RP-009/RP-011的 warnings-only 基线15 Warning(s)已降到9 Warning(s), 当前GFramework.Corenet8.0输出中已不再出现MA0046
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~ArchitectureLifecycleBehaviorTests|FullyQualifiedName~CoroutineSchedulerTests|FullyQualifiedName~AsyncLogAppenderTests" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
50 Passed,0 Failed
- 结果:
dotnet build GFramework.Godot/GFramework.Godot.csproj -c Release --no-restore -p:RestoreFallbackFolders="" -nologo- 结果:失败;当前 worktree 的 Godot restore 资产仍引用 Windows fallback package folder,尚未完成独立项目编译验证
RP-014的定向验证结果:dotnet restore GFramework.Core.Tests/GFramework.Core.Tests.csproj -p:RestoreFallbackFolders="" -nologo- 结果:通过;host Windows
dotnet首次验证前补齐了缺失的Meziantou.Analyzer 3.0.48包
- 结果:通过;host Windows
dotnet build GFramework.Core/GFramework.Core.csproj -c Release --no-restore -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo- 结果:
9 Warning(s),0 Error(s);AsyncLogAppender行为修复与 XML / 文档补充未引入新的GFramework.Corenet8.0构建错误
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~CoroutineSchedulerTests.Scheduler_Should_Raise_OnCoroutineException_With_EventArgs|FullyQualifiedName~AsyncLogAppenderTests.Flush_Should_Raise_OnFlushCompleted_With_Sender_And_Result|FullyQualifiedName~AsyncLogAppenderTests.ILogAppender_Flush_Should_Raise_OnFlushCompleted_Only_Once|FullyQualifiedName~ArchitectureLifecycleBehaviorTests.InitializeAsync_Should_Raise_PhaseChanged_With_Sender_And_EventArgs" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
4 Passed,0 Failed
- 结果:
RP-015的验证结果:dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --disable-build-servers --filter "FullyQualifiedName~AsyncLogAppenderTests"- 结果:
15 Passed,0 Failed
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --disable-build-servers- 结果:
1607 Passed,0 Failed
- 结果:
RP-016的验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -nologo -clp:"Summary;WarningsOnly"- 结果:
0 Warning(s),0 Error(s);当前GFramework.Corenet8.0analyzer baseline 已清零
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~LoggingConfigurationTests|FullyQualifiedName~ConfigurableLoggerFactoryTests|FullyQualifiedName~CollectionExtensionsTests|FullyQualifiedName~EasyEventsTests|FullyQualifiedName~OptionTests|FullyQualifiedName~CoroutineGroupTests|FullyQualifiedName~CoroutineSchedulerTests" -m:1 -nologo- 结果:
112 Passed,0 Failed;测试构建仍会显示既有net10.0MA0158与 source generatorMA0051warning
- 结果:
RP-017的验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net10.0 -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"- 结果:
16 Warning(s),0 Error(s);当前MA0158跨GFramework.Core/GFramework.Cqrs,本轮只记录基线不批量改锁
- 结果:
dotnet build GFramework.Core.SourceGenerators/GFramework.Core.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"- 结果:
0 Warning(s),0 Error(s);ContextAwareGenerator.cs已不再出现MA0051
- 结果:
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~ContextAwareGeneratorSnapshotTests" -m:1 -p:RestoreFallbackFolders="" -nologo- 结果:
1 Passed,0 Failed;测试构建仍显示相邻 source generator 和测试项目的既有 analyzer warning
- 结果:
RP-018的验证结果:dotnet build GFramework.Cqrs.SourceGenerators/GFramework.Cqrs.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
0 Warning(s),0 Error(s);CqrsHandlerRegistryGenerator.cs当前MA0051已清零
- 结果:
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~CqrsHandlerRegistryGeneratorTests -m:1 -p:RestoreFallbackFolders= -nologo- 结果:
14 Passed,0 Failed - 说明:该 test project 构建仍显示
GFramework.Game.SourceGenerators与测试项目中的既有 analyzer warning;本轮关注的GFramework.Cqrs.SourceGenerators独立 build 已清零
- 结果:
RP-019的验证结果:dotnet restore GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -p:RestoreFallbackFolders= -nologo- 结果:通过;刷新 Linux 侧资产以清除 stale Windows fallback package folder
dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
19 Warning(s),0 Error(s);当前项目输出已不再出现MA0006,剩余均为SchemaConfigGenerator.cs的MA0051
- 结果:
dotnet restore GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -p:RestoreFallbackFolders= -nologo- 结果:通过;刷新 test project 资产以清除 stale Windows fallback package folder
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~SchemaConfigGenerator -m:1 -p:RestoreFallbackFolders= -nologo- 结果:
50 Passed,0 Failed - 说明:测试项目构建仍显示既有 source generator test analyzer warning;不属于本轮写集
- 结果:
RP-020的验证结果:dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
9 Warning(s),0 Error(s);当前项目剩余 warning 均为SchemaConfigGenerator.cs的MA0051
- 结果:
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~SchemaConfigGenerator -m:1 -p:RestoreFallbackFolders= -nologo- 结果:
50 Passed,0 Failed - 说明:测试项目构建仍显示既有 source generator test analyzer warning;不属于本轮写集
- 结果:
RP-021的验证结果:dotnet build GFramework.Cqrs.SourceGenerators/GFramework.Cqrs.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
0 Warning(s),0 Error(s);拆分后最大单文件已降到851行,满足仓库 800-1000 行上限
- 结果:
dotnet build GFramework.Core.SourceGenerators/GFramework.Core.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders= -nologo -clp:"Summary;WarningsOnly"- 结果:
0 Warning(s),0 Error(s);ContextAwareGenerator的字段命名与 provider 契约修复未引入新的 generator warning
- 结果:
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~ContextAwareGeneratorSnapshotTests|FullyQualifiedName~CqrsHandlerRegistryGeneratorTests" -m:1 -p:RestoreFallbackFolders= -nologo- 结果:先并行运行两条
dotnet test时触发共享输出文件锁冲突;改为串行重跑后ContextAwareGeneratorSnapshotTests=2 Passed、CqrsHandlerRegistryGeneratorTests=14 Passed - 说明:失败来自测试宿主并行写入同一 build 输出,不是代码回归;串行重跑后快照新增的字段重名场景和 CQRS 快照均通过
- 结果:先并行运行两条
RP-022的验证结果:dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -v minimal- 结果:通过;
EasyEvents、CollectionExtensions与 logging 配置模型的兼容性回退未引入新的net8.0构建错误
- 结果:通过;
dotnet build GFramework.Cqrs.SourceGenerators/GFramework.Cqrs.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -v minimal- 结果:通过;
ContainingAssemblynull 防御与发射 helper 精简未引入新的构建错误
- 结果:通过;
dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -v minimal- 结果:通过;仍保留既有
9条SchemaConfigGenerator.csMA0051warning,非本轮新增
- 结果:通过;仍保留既有
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~SchemaConfigGeneratorTests|FullyQualifiedName~ContextAwareGeneratorSnapshotTests|FullyQualifiedName~CqrsHandlerRegistryGeneratorTests" -m:1 -p:RestoreFallbackFolders="" -v minimal- 结果:
63 Passed,0 Failed
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~EasyEventsTests|FullyQualifiedName~CollectionExtensionsTests|FullyQualifiedName~LoggingConfigurationTests|FullyQualifiedName~ConfigurableLoggerFactoryTests" -m:1 -p:RestoreFallbackFolders="" -v minimal- 结果:
38 Passed,0 Failed
- 结果:
RP-023的验证结果:dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release --no-restore -p:RestoreFallbackFolders="" -v minimal- 结果:通过;仍保留既有
9条SchemaConfigGenerator.csMA0051warning,未新增新的 generator warning
- 结果:通过;仍保留既有
dotnet build GFramework.Cqrs.SourceGenerators/GFramework.Cqrs.SourceGenerators.csproj -c Release --no-restore -p:RestoreFallbackFolders="" -v minimal- 结果:通过;并行构建时
GFramework.SourceGenerators.Common.dll复制阶段出现一次MSB3026重试,随后成功完成
- 结果:通过;并行构建时
dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~SchemaConfigGeneratorTests|FullyQualifiedName~SchemaConfigGeneratorSnapshotTests|FullyQualifiedName~CqrsHandlerRegistryGeneratorTests" -m:1 -p:RestoreFallbackFolders="" -v minimal- 结果:
63 Passed,0 Failed - 说明:测试项目构建仍会显示既有
GFramework.SourceGenerators.Testsanalyzer warning;不属于本轮写集
- 结果:
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --filter "FullyQualifiedName~CollectionExtensionsTests|FullyQualifiedName~LoggingConfigurationTests" -m:1 -p:RestoreFallbackFolders="" -v minimal- 结果:
27 Passed,0 Failed
- 结果:
- active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史
下一步
- 若要继续该主题,先读 active tracking,再按需展开历史归档中的 warning 热点与验证记录
- 下一轮优先继续拆分
GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.cs的剩余MA0051;建议先从GenerateBindingsClass、AppendGeneratedConfigCatalogType或对象/条件 schema target 验证方法切入 - 若改回推进
MA0158,先设计net8.0/net9.0/net10.0多 target 条件编译方案,不直接批量替换共享源码中的objectlock - 若后续继续改动
GFramework.Godot,先修复该项目的 Linux 侧 restore 资产,再补跑独立 build - 若本主题确认暂缓,可保持当前归档状态,不需要再恢复
local-plan/