GFramework/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md
gewuyou ba3a4d4a37 fix(core-source-generators): 修复ContextAware继承成员命名冲突
- 修复 ContextAwareGenerator 的保留名收集逻辑,使 _gFrameworkContextAware* 字段分配覆盖完整基类链

- 新增 inherited collision 快照回归测试与快照文件,锁定基类占用字段名时的后缀回退行为

- 更新 analyzer-warning-reduction 跟踪与 trace,记录本轮 Greptile follow-up 与验证结果
2026-04-23 09:58:34 +08:00

35 KiB
Raw Blame History

Analyzer Warning Reduction 跟踪

目标

继续以“优先低风险、保持行为兼容”为原则收敛当前仓库的 Meziantou analyzer warnings并在首轮大规模清理完成后 判断剩余结构性 warning 是否值得在下一轮继续推进。

当前恢复点

  • 恢复点编号:ANALYZER-WARNING-REDUCTION-RP-027
  • 当前阶段:Phase 27
  • 当前焦点:
    • 已完成 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.csMA0051 结构拆分,生成输出保持不变
    • 已完成 GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.csMA0006 低风险收口schema 关键字比较显式使用 StringComparison.Ordinal
    • 已完成 SchemaConfigGenerator.cs 的第一批 MA0051 结构拆分schema 入口解析、属性解析、schema 遍历、数组属性解析、 约束文档生成与若干生成代码发射 helper 已拆出语义阶段
    • 已完成当前 PR #269 review follow-upCqrsHandlerRegistryGenerator 按职责拆分为 partial 生成器文件, ContextAwareGenerator 已补上字段名去冲突与锁内读取修正,Option<T> 补齐 <remarks> 契约说明
    • 已完成当前 PR #269 第二轮 follow-up恢复 EasyEventsCollectionExtensionsLoggingConfigurationFilterConfiguration 的公共 API 兼容形状,并将 analyzer 兼容性处理收敛到局部 pragma
    • 已完成当前 PR #269 第三轮 follow-up继续收口 SchemaConfigGenerator 的根类型标识符校验与 XML 文档转义, 并补齐 LoggingConfigurationTestsCollectionExtensionsTestsCqrs helper 抽取与 ai-plan 命令文本修正
    • 已完成当前 PR #269 第四轮 follow-upCqrsHandlerRegistryGenerator 的 Roslyn error type 直接引用改为 运行时精确查找路径,并为 SchemaConfigGenerator 补上根 type 非字符串时的防御与回归测试
    • 已完成当前 PR #269 第五轮 follow-upSchemaConfigGenerator 补上归一化后属性名冲突诊断并新增 GF_ConfigSchema_014CqrsHandlerRegistryGeneratordynamic 归一化为 global::System.Object 同时收紧相关 generator regression tests
    • 已完成当前 PR #269 failed-test follow-up修正 SchemaConfigGeneratorTests Run_Should_Assign_Globally_Unique_Reference_Metadata_Member_Names 的测试输入,使其继续覆盖 reference metadata 成员名全局去冲突,但不再依赖现已被 GF_ConfigSchema_014 拦截的非法同层 schema key 冲突
    • 已完成当前 PR #269 Greptile follow-upContextAwareGenerator 现在会把基类链显式成员名也纳入 _gFrameworkContextAware* 字段分配冲突检测,并新增 inherited-field collision 快照回归测试
    • 已更新 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.Core net8.0 warnings-only 基线已降到 0
    • 当前 GFramework.Core.SourceGenerators warnings-only 基线已降到 0
    • 当前 GFramework.Cqrs.SourceGenerators warnings-only 基线已降到 0
    • 当前 GFramework.Game.SourceGenerators warnings-only 基线已从 46 条降到 9 条,剩余均为 SchemaConfigGenerator.csMA0051
    • GFramework.GodotTiming.cs 已同步适配新事件签名,但当前 worktree 的 Godot restore 资产仍受 Windows fallback package folder 干扰,独立 build 需在修复资产后补跑
    • 后续继续按 warning 类型和数量批处理,而不是回退到按单文件切片推进
    • 下一轮默认继续拆分 GFramework.Game.SourceGeneratorsMA0051 热点,或评估跨 target 的 MA0158 锁替换风险
    • 单次 boot 的工作树改动上限控制在约 100 个文件以内,避免 recovery context 与 review 面同时失控
    • 若任务边界互不冲突,允许使用不同模型的 subagent 并行处理不同 warning 类型或不同目录,但必须遵守显式 ownership

当前状态摘要

  • 已完成 GFramework.CoreGFramework.CqrsGFramework.Godot 与部分 source generator 的低风险 warning 清理
  • 已完成多轮 CodeRabbit follow-up 修复,并用定向测试与项目/解决方案构建验证了关键回归风险
  • 已完成当前 PR #265 review follow-up修复 CoroutineScheduler 的零容量扩容边界,并补上 Store dispatch 作用域的异常安全回滚
  • 已继续完成当前 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修复 AsyncLogAppenderILogAppender.Flush() 双重完成通知,并补齐 PhaseChanged / CoroutineExceptionEventArgs XML 文档、PhaseChanged 迁移说明和 ai-plan 基线注释
  • 已完成当前 PR #267 failed-test follow-up修复 AsyncLogAppender.Flush() 在队列已被后台线程提前清空时仍可能 等待满默认超时并返回 false 的竞态,并通过整包 GFramework.Core.Tests 重新验证
  • 已完成当前 GFramework.Core net8.0 剩余低风险 analyzer warning 批次warnings-only 基线已降到 0
  • 已完成 GFramework.Core.SourceGeneratorsContextAwareGenerator 的剩余 MA0051 收口warnings-only 基线已降到 0
  • 已完成 GFramework.Cqrs.SourceGeneratorsCqrsHandlerRegistryGenerator 的剩余 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 个本地仍成立, 已分别在 CqrsHandlerRegistryGeneratorSchemaConfigGenerator 中收口,并补齐定向 generator regression tests
  • 已完成当前 PR #269 的第五轮 review follow-up收口 SchemaConfigGenerator 的归一化字段名冲突诊断、 CqrsHandlerRegistryGeneratordynamic 类型引用风险,并同步更新 AGENTS.md 的模块 build / warning 治理规范
  • 已完成当前 PR #269 的 failed-test follow-up将 reference metadata 成员名唯一性回归测试改为合法 schema 路径组合, 并重新通过定向 generator test
  • 已完成当前 PR #269 的 Greptile follow-up修复 ContextAwareGenerator 未覆盖基类成员名冲突的问题,并补齐 inherited-collision 快照测试
  • 已完成 GFramework.Game.SourceGeneratorsSchemaConfigGenerator 的第一批 MA0051 收口warnings-only 基线剩余 9MA0051

当前活跃事实

  • 当前主题仍是 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.Core net8.0 基线中的 MA0048,并通过定向 build/test 验证 CommandQueryEvent 路径未回归
  • RP-010 使用 gframework-pr-review 复核当前分支 PR #265 后,修复了仍在本地成立的两个 follow-up 风险: CoroutineSchedulerinitialCapacity: 0 扩容越界,以及 Store 在 dispatch 快照阶段抛异常时可能残留 _isDispatching = true 的锁死问题
  • RP-011 根据补充复核继续收口 PR #265 的 outside-diff comment修复 Event<T> / Event<T, TK> 默认 no-op 委托导致的 GetListenerCount() off-by-one并以定向事件测试验证注册、注销和计数语义
  • RP-012gframework-pr-review 增加 --json-output--section--path 与文本截断能力,并更新 skill 推荐用法, 让“先落盘、再定向抽取”成为默认可操作路径
  • RP-013 已完成 GFramework.Core 当前 MA0046 批次,并以新的事件参数类型替换阶段、协程和异步日志事件的 非标准签名;GFramework.Core net8.0 warnings-only 基线由 15 降至 9
  • RP-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-016GFramework.Core 当前剩余 MA0016 / MA0002 / MA0015 / MA0077 低风险批次清零,并用 warnings-only build 与 focused tests 验证配置反序列化、集合扩展、事件重复注册、Option<T> 相等性和协程 tag/group 语义
  • RP-017 复核 MA0158 当前仍是跨 target 锁类型迁移问题,因此先收口单点 ContextAwareGenerator MA0051 并通过 source generator 项目 build 与 ContextAwareGeneratorSnapshotTests 验证生成输出未回归
  • RP-018 暂缓跨 target MA0158,转入 GFramework.Cqrs.SourceGenerators 的单文件结构性 warning 通过拆分 handler 分析、运行时类型引用构造、注册器源码发射与精确反射注册输出阶段,清空该项目当前 MA0051
  • RP-019 转入 GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.cs,先完成低风险 MA0006 批次; 通过 schema 类型比较 helper 与显式 StringComparison.Ordinal 清空当前项目的 MA0006
  • RP-020 继续拆分 SchemaConfigGenerator.csMA0051 热点,将当前项目 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 快照冲突线程均已在本地收口,仅剩 Cqrs error type 直接引用与根 schema type 非字符串防御仍成立;现已补齐实现与回归测试
  • RP-025 继续复核 PR #269 剩余 outside-diff / nitpick 信号后,确认本地仍成立的是 SchemaConfigGenerator 的归一化字段名冲突与 Cqrsdynamic 的直接类型引用;已分别补上诊断、运行时类型归一化与回归测试, 并把“变更模块必须运行对应 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 可用性评估,不直接批量替换共享源码中的 object lock
  • 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 / MA0048 warning本轮 focused test 已通过,但测试项目整包 warning 尚未进入本轮写集
    • 缓解措施:本轮已在 failed-test follow-up 的定向 dotnet test 中再次确认这些 warning 仍为既有基线;后续若继续修改该测试项目, 应按新增 AGENTS.md 规则先明确 warning 收口范围,再决定是否进入专门清理切片
  • ContextAware 基类命名隐藏风险:若生成器只看当前类型声明成员,派生规则会重新占用基类已声明的 _gFrameworkContextAware* 字段名,导致生成成员隐藏继承状态并让快照无法锁定后缀分配行为
    • 缓解措施:本轮已改为遍历完整 base-type 链收集保留名,并用 inherited collision 快照用例锁定该行为
  • Godot 资产文件环境风险:当前 worktree 的 GFramework.Godot restore/build 仍会命中 Windows fallback package folder
    • 缓解措施:后续若继续触达 Godot 模块,先用 Linux 侧 restore 资产或 Windows-hosted 构建链刷新该项目,再补跑定向 build
  • 并行实现风险:批量收敛时若 subagent 写入边界不清晰,容易引入命名冲突或重复重构
    • 缓解措施:只在 warning 类型或目录边界清晰时并行;每个 subagent 必须有独占文件 ownership主代理负责合并验证

活跃文档

验证说明

  • 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;WarningsOnly
    • dotnet 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 Passed0 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 Passed0 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 Passed0 Failed
  • RP-008 的策略基线:
    • 当前 GFramework.Core 剩余 warning 分布:MA0048=8MA0046=6MA0016=5MA0002=2MA0015=1MA0077=1
    • 后续批处理规则:优先按类型推进;若当轮主类型数量不足,可顺手吸收其他低冲突类型,不限定于 MA0015MA0077
  • 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.Core net8.0 warnings-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 Passed0 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.Core net8.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 Passed0 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.Core net8.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 Passed0 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.Core net8.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 Passed0 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
    • 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.Core net8.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 Passed0 Failed
  • RP-015 的验证结果:
    • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --disable-build-servers --filter "FullyQualifiedName~AsyncLogAppenderTests"
      • 结果:15 Passed0 Failed
    • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --no-restore --disable-build-servers
      • 结果:1607 Passed0 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.Core net8.0 analyzer 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 Passed0 Failed;测试构建仍会显示既有 net10.0 MA0158 与 source generator MA0051 warning
  • 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);当前 MA0158GFramework.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 Passed0 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 Passed0 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.csMA0051
    • 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 Passed0 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.csMA0051
    • dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~SchemaConfigGenerator -m:1 -p:RestoreFallbackFolders= -nologo
      • 结果:50 Passed0 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 PassedCqrsHandlerRegistryGeneratorTests=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
      • 结果:通过;EasyEventsCollectionExtensions 与 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
      • 结果:通过;ContainingAssembly null 防御与发射 helper 精简未引入新的构建错误
    • dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -v minimal
      • 结果:通过;仍保留既有 9SchemaConfigGenerator.cs MA0051 warning非本轮新增
    • 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 Passed0 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 Passed0 Failed
  • RP-023 的验证结果:
    • dotnet build GFramework.Game.SourceGenerators/GFramework.Game.SourceGenerators.csproj -c Release --no-restore -p:RestoreFallbackFolders="" -v minimal
      • 结果:通过;仍保留既有 9SchemaConfigGenerator.cs MA0051 warning未新增新的 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 Passed0 Failed
      • 说明:测试项目构建仍会显示既有 GFramework.SourceGenerators.Tests analyzer 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 Passed0 Failed
  • active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史

下一步

  1. 若要继续该主题,先读 active tracking再按需展开历史归档中的 warning 热点与验证记录
  2. 下一轮优先继续拆分 GFramework.Game.SourceGenerators/Config/SchemaConfigGenerator.cs 的剩余 MA0051;建议先从 GenerateBindingsClassAppendGeneratedConfigCatalogType 或对象/条件 schema target 验证方法切入
  3. 若改回推进 MA0158,先设计 net8.0 / net9.0 / net10.0 多 target 条件编译方案,不直接批量替换共享源码中的 object lock
  4. 若后续继续改动 GFramework.Godot,先修复该项目的 Linux 侧 restore 资产,再补跑独立 build
  5. 若本主题确认暂缓,可保持当前归档状态,不需要再恢复 local-plan/