GFramework/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md
gewuyou 4e98b63e9c fix(cqrs): 收口 PR review 剩余问题
- 修复 NotificationLifetimeBenchmarks 的 scoped 容器释放与公开 XML 契约缺口

- 修复 generated descriptor 预热阶段先去重后校验导致的有效后继条目丢失问题

- 更新 generated descriptor 的 MethodInfo 比较方式并补充 request/stream 回归测试

- 同步 cqrs-rewrite active tracking 与 trace 的当前 PR 锚点到 PR #348
2026-05-11 14:52:39 +08:00

7.9 KiB
Raw Blame History

CQRS 重写迁移跟踪

目标

围绕 GFramework 当前的双轨 CQRS 现状,继续完成以“去外部依赖、降低反射、收口公开入口”为目标的 CQRS 迁移与收敛。

当前恢复点

  • 恢复点编号:CQRS-REWRITE-RP-134
  • 当前阶段:Phase 8
  • 当前 PR 锚点:PR #348
  • 当前结论:
    • 本轮按 $gframework-batch-boot 协调多波 non-conflicting subagent基线固定为 origin/main @ 3b2e6899d5ffdcfb634b28f3846f57528fbf9196 (2026-05-11T12:25:00+08:00)
    • 本轮停止继续扩 batch 的主信号是 reviewability / context-budget,不是 50 文件阈值; 自然停点时累计 branch diff 约为 12 files,仍明显低于阈值。
    • CQRS runtime / tests 侧已补齐并提交:
      • CqrsNotificationPublisherTests 锁定“多 publisher 报错”与“单 dispatcher 内 publisher 缓存复用”
      • CqrsGeneratedRequestInvokerProviderTestsCqrsHandlerRegistrar 收口 generated descriptor 的异常枚举、 坏元数据与重复 pair 回退契约
      • CqrsDispatcherCacheTests 锁定 request / stream pipeline presence、executor cache 与上下文重新注入组合分支
    • benchmark 侧已补齐并提交:
      • RequestStartupBenchmarksMediator startup 对照
      • StreamStartupBenchmarks
      • NotificationStartupBenchmarks
      • GFramework.Cqrs.Benchmarks/README.md 的 current coverage / gap 收口
    • 文档与恢复入口侧已补齐并提交:
      • GFramework.Cqrs/README.md
      • docs/zh-CN/core/cqrs.md
      • docs/zh-CN/source-generators/cqrs-handler-registry-generator.md
      • ai-plan/public/cqrs-rewrite/archive/** 顶部导航与跳转约定
    • 当前 PR #348 latest-head review 再次复核后:
      • 跳过 NotificationLifetimeBenchmarks.HandlerLifetime[GenerateEnumExtensions] 建议,原因是仓库没有“所有枚举统一生成扩展”的约定,且 benchmark 局部枚举不在该能力的强制范围内
      • 接受并修复 NotificationLifetimeBenchmarks 的 scoped 容器释放与公开 XML 文档缺口
      • 接受并修复 CqrsHandlerRegistrar 对 generated descriptor 的“先去重后校验”缺陷,并补回归测试锁定“首条无效、后条有效”的同键场景
      • 接受并修复 generated descriptor 校验对 MethodInfo 使用 ReferenceEquals 的过严比较,改为按方法语义等价匹配
    • 当前尚未提交的收尾切片仅剩:
      • GFramework.Cqrs.Benchmarks/Messaging/NotificationLifetimeBenchmarks.cs
      • GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs
      • GFramework.Cqrs/README.md
      • docs/zh-CN/core/command.md
      • docs/zh-CN/core/query.md
      • 本 tracking / trace 文件本身

当前活跃事实

  • 当前分支:feat/cqrs-optimization
  • 当前 PRPR #348
  • 当前写面:
    • GFramework.Cqrs.Benchmarks/README.md
    • GFramework.Cqrs.Benchmarks/Messaging/NotificationLifetimeBenchmarks.cs
    • GFramework.Cqrs.Benchmarks/Messaging/NotificationStartupBenchmarks.cs
    • GFramework.Cqrs.Benchmarks/Messaging/RequestStartupBenchmarks.cs
    • GFramework.Cqrs.Benchmarks/Messaging/StreamStartupBenchmarks.cs
    • GFramework.Cqrs.Tests/Cqrs/CqrsDispatcherCacheTests.cs
    • GFramework.Cqrs.Tests/Cqrs/CqrsGeneratedRequestInvokerProviderTests.cs
    • GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs
    • GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs
    • GFramework.Cqrs/Internal/CqrsHandlerRegistrar.cs
    • GFramework.Cqrs/README.md
    • ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md
    • ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md
    • ai-plan/public/cqrs-rewrite/archive/todos/cqrs-rewrite-migration-tracking-history-through-rp131.md
    • ai-plan/public/cqrs-rewrite/archive/traces/cqrs-rewrite-migration-trace-history-through-rp131.md
    • docs/zh-CN/core/command.md
    • docs/zh-CN/core/cqrs.md
    • docs/zh-CN/core/query.md
    • docs/zh-CN/source-generators/cqrs-handler-registry-generator.md
  • 当前基线:
    • 本轮 batch 启动前,分支相对基线的累计 diff 为 0 files / 0 lines
    • 当前自然停点时,累计 diff 约为 12 files
    • 本轮新增 benchmark smoke 结果:
      • RequestStartupBenchmarks
        • ColdStart_GFrameworkCqrs 61.648 us / 25336 B
        • ColdStart_Mediator 110.867 us / 57872 B
        • ColdStart_MediatR 679.103 us / 606256 B
      • StreamStartupBenchmarks
        • ColdStart_GFrameworkReflection 71.13 us / 25504 B
        • ColdStart_GFrameworkGenerated 82.12 us / 28280 B
        • ColdStart_MediatR 933.87 us / 678992 B
      • NotificationStartupBenchmarks
        • ColdStart_GFrameworkCqrs 85.09 us / 24752 B
        • ColdStart_Mediator 136.08 us / 62512 B
        • ColdStart_MediatR 1.379 ms / 719056 B

当前风险

  • NotificationLifetimeBenchmarks 当前已跑完整默认作业,但还没并入提交;若继续新开 batch未提交面会明显降低可审查性。
  • RequestStartup 的提交 8990749d 连带带入了 CqrsDispatcherCacheTests.cs;虽然两条切片均有效且已验证通过,但提交边界不再严格对应单个 ownership slice。
  • startup 与 lifetime benchmark 的默认作业结果已足以证明路径与相对量级,但 Initialization_* 与少量 short-run 结果仍不应直接当成稳定排序结论。

最近权威验证

  • dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release
    • 结果:通过,0 warning / 0 error
  • dotnet build GFramework.Cqrs/GFramework.Cqrs.csproj -c Release
    • 结果:通过,0 warning / 0 error
  • dotnet build GFramework.Core/GFramework.Core.csproj -c Release
    • 结果:通过,0 warning / 0 error
  • dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsRegistrationServiceTests"
    • 结果:通过,Passed: 4, Failed: 0
  • dotnet run --project GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release --no-build -- --artifacts-suffix pr347-req-scoped --filter "*RequestLifetimeBenchmarks.SendRequest_GFrameworkCqrs*" --job short --warmupCount 1 --iterationCount 1 --launchCount 1
    • 结果:通过
    • 备注:Singleton 52.69 ns / 32 BTransient 57.88 ns / 56 BScoped 144.72 ns / 368 B
  • dotnet run --project GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release --no-build -- --artifacts-suffix pr347-stream-scoped --filter "*StreamLifetimeBenchmarks.Stream_GFramework*" --job short --warmupCount 1 --iterationCount 1 --launchCount 1
    • 结果:通过
    • 备注:Scoped + FirstItem 约为 266.7~267.0 ns / 792 BScoped + DrainAll 约为 331.6~332.2 ns / 856 B

下一推荐步骤

  1. 先提交当前未提交的 NotificationLifetime + registration fallback tests + CQRS/legacy docs 收尾切片,回收工作树到干净状态。
  2. 再次运行 $gframework-pr-review,复核 PR #348 latest-head open thread 是否已随着本轮多波 head 收敛。
  3. 若继续扩 benchmark优先从 GFramework.Cqrs.Benchmarks/README.md 已明确列出的 gap 中选下一个单文件切片,而不是继续扩大 shared infra 改动面。

活跃文档

  • 当前 active trackingai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md
  • 当前 active traceai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md
  • 当前历史归档:
    • ai-plan/public/cqrs-rewrite/archive/todos/cqrs-rewrite-migration-tracking-history-through-rp131.md
    • ai-plan/public/cqrs-rewrite/archive/traces/cqrs-rewrite-migration-trace-history-through-rp131.md

说明

  • RP-131 及之前的长历史验证、阶段流水与旧恢复点说明已迁移到新的 archive/ 文件,不再继续堆叠在 active 入口。
  • active tracking 现在只保留当前恢复点所需的最小事实、风险、权威验证与下一步,供 boot 与后续 PR review 快速恢复。