diff --git a/GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs b/GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs index 16c4292d..b747e733 100644 --- a/GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs +++ b/GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs @@ -146,6 +146,7 @@ public class StreamPipelineBenchmarks /// /// 直接调用 handler,并按当前观测模式消费响应序列,作为 stream pipeline 编排之外的基线。 /// + /// 按当前观测模式完成 stream 消费后的等待句柄。 [Benchmark(Baseline = true)] public ValueTask Stream_Baseline() { @@ -155,6 +156,7 @@ public class StreamPipelineBenchmarks /// /// 通过 GFramework.CQRS runtime 创建 stream,并按当前矩阵配置执行 stream pipeline。 /// + /// 按当前观测模式完成 stream 消费后的等待句柄。 [Benchmark] public ValueTask Stream_GFrameworkCqrs() { @@ -169,6 +171,7 @@ public class StreamPipelineBenchmarks /// /// 通过 MediatR 创建 stream,并按当前矩阵配置执行 stream pipeline,作为外部设计对照。 /// + /// 按当前观测模式完成 stream 消费后的等待句柄。 [Benchmark] public ValueTask Stream_MediatR() { diff --git a/GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs b/GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs index b0e6ee5b..bb3f634a 100644 --- a/GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs +++ b/GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs @@ -167,6 +167,7 @@ public class StreamingBenchmarks /// /// 通过 `ai-libs/Mediator` 的 source-generated concrete mediator 创建 stream,并按当前观测模式消费。 /// + /// 按当前观测模式完成 stream 消费后的等待句柄。 [Benchmark] public ValueTask Stream_Mediator() { diff --git a/GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs b/GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs index 21a77a40..25064cd2 100644 --- a/GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs +++ b/GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs @@ -179,12 +179,12 @@ internal sealed class CqrsNotificationPublisherTests .Returns(() => { notificationPublisherLookupCount++; - return notificationPublisherLookupCount switch + if (notificationPublisherLookupCount == 1) { - 1 => Array.Empty(), - 2 => [new ReverseOrderNotificationPublisher()], - _ => throw new AssertionException("Notification publisher should be resolved at most once.") - }; + return Array.Empty(); + } + + throw new AssertionException("Notification publisher should not be resolved more than once."); }); }); diff --git a/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md b/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md index 9bd96049..9e6dafdc 100644 --- a/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md +++ b/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md @@ -12,14 +12,20 @@ CQRS 迁移与收敛。 ## 当前恢复点 -- 恢复点编号:`CQRS-REWRITE-RP-135` +- 恢复点编号:`CQRS-REWRITE-RP-136` - 当前阶段:`Phase 8` -- 当前 PR 锚点:`PR #348` +- 当前 PR 锚点:`PR #349` - 当前结论: - - 本轮按 `$gframework-batch-boot 50` 持续协调多波 non-conflicting subagent,基线固定为 + - 本轮先按 `$gframework-pr-review` 重新确认当前分支最新 GitHub 上下文,确认 `feat/cqrs-optimization` 在 `2026-05-12` 已切到 `PR #349`,不再沿用旧 tracking 中的 `PR #348` 锚点。 + - 随后按 `$gframework-batch-boot 50` 持续协调多波 non-conflicting subagent,基线固定为 `origin/main @ ef4d3d5d (2026-05-11 17:33:43 +0800)`。 - 当前 branch 相对基线的累计 diff 约为 `9 files / 1111 lines`;本轮停点由 `context-budget / reviewability` 决定,而不是 `50 files` 阈值。 + - `PR #349` latest-head review 当前确认仍成立的项只有: + - `StreamPipelineBenchmarks` 三个公开 benchmark 方法补齐 `` XML 契约 + - `StreamingBenchmarks.Stream_Mediator` 补齐 `` XML 契约 + - `CqrsNotificationPublisherTests` 中 fallback publisher 缓存回归测试去掉误导性的“第二次解析返回其它 publisher”分支 + - active tracking / trace 的当前 PR 锚点与下一步入口同步到 `PR #349` - tests 侧已补齐并提交: - `CqrsRegistrationServiceTests`:补空输入、空项过滤、稳定键排序与跨调用跳过边界 - `CqrsHandlerRegistrarTests` 与 `CqrsHandlerRegistrarFallbackFailureTests`: @@ -34,7 +40,7 @@ CQRS 迁移与收敛。 ## 当前活跃事实 - 当前分支:`feat/cqrs-optimization` -- 当前 PR:`PR #348` +- 当前 PR:`PR #349` - 当前写面: - `GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs` - `GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs` @@ -66,6 +72,8 @@ CQRS 迁移与收敛。 - `dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release` - 结果:通过,`0 warning / 0 error` +- `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsNotificationPublisherTests"` + - 结果:通过,`Passed: 9, Failed: 0` - `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsRegistrationServiceTests|FullyQualifiedName~CqrsHandlerRegistrarTests|FullyQualifiedName~CqrsHandlerRegistrarFallbackFailureTests|FullyQualifiedName~CqrsNotificationPublisherTests"` - 结果:通过,`Passed: 36, Failed: 0` - `python3 scripts/license-header.py --check --paths GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs GFramework.Cqrs.Benchmarks/README.md GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarFallbackFailureTests.cs GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md` @@ -75,7 +83,7 @@ CQRS 迁移与收敛。 ## 下一推荐步骤 -1. 再次运行 `$gframework-pr-review`,复核 `PR #348` latest-head open thread 是否已随着本轮 5 个新提交收敛。 +1. 再次运行 `$gframework-pr-review`,复核 `PR #349` latest-head open thread 是否已随着当前修复提交收敛。 2. 若继续扩 benchmark,优先在 `StreamLifetimeBenchmarks` 或 `StreamStartupBenchmarks` 中补单文件 `Mediator` parity,而不是并行扩多个矩阵。 3. 若切回文档收尾,把 `GFramework.Cqrs/README.md`、`docs/zh-CN/core/command.md`、`docs/zh-CN/core/query.md` 作为单独一波 docs-only 切片处理。 diff --git a/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md b/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md index 47d284cf..3523d2d0 100644 --- a/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md +++ b/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md @@ -7,6 +7,31 @@ SPDX-License-Identifier: Apache-2.0 ## 2026-05-12 +### 阶段:PR #349 latest-head review 收口(CQRS-REWRITE-RP-136) + +- 重新执行 `$gframework-pr-review`,按 GitHub 当前分支状态确认 `feat/cqrs-optimization` 在 `2026-05-12` 对应的是 `PR #349`,不再沿用 active tracking 中的 `PR #348` 锚点。 +- 本轮 latest-head open AI thread 复核结论: + - `StreamPipelineBenchmarks` 的 `Stream_Baseline`、`Stream_GFrameworkCqrs`、`Stream_MediatR` 缺少 `` XML 契约,接受修复 + - `StreamingBenchmarks.Stream_Mediator` 缺少 `` XML 契约,接受修复 + - `CqrsNotificationPublisherTests` 的 fallback publisher 缓存回归测试用“第二次解析返回另一个 publisher”充当安全网,和断言消息表达不一致,接受收口为“首次后任何再次解析都直接失败” + - active tracking / trace 的当前 PR 锚点与下一步入口仍停留在 `PR #348`,接受同步到 `PR #349` +- 本轮主线程实施: + - `StreamPipelineBenchmarks` + - 为 3 个公开 benchmark 方法补齐 `` XML 文档 + - `StreamingBenchmarks` + - 为 `Stream_Mediator()` 补齐 `` XML 文档 + - `CqrsNotificationPublisherTests` + - 把 fallback publisher 缓存回归测试改为“首次返回空数组,后续任何再次解析立即抛 `AssertionException`”,避免测试安全网与失败消息自相矛盾 + - `ai-plan/public/cqrs-rewrite/**` + - 将 active tracking / trace 的当前 PR 锚点与下一步入口同步到 `PR #349` +- 本轮权威验证: + - `dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release` + - 结果:通过,`0 warning / 0 error` + - `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsNotificationPublisherTests"` + - 结果:通过,`Passed: 9, Failed: 0` + - `python3 scripts/license-header.py --check --paths GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs GFramework.Cqrs.Tests/Cqrs/CqrsNotificationPublisherTests.cs ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md` + - 结果:通过 + ### 阶段:多波 batch 继续收口(CQRS-REWRITE-RP-135) - 按 `$gframework-batch-boot 50` 恢复当前 topic,并把基线固定为 @@ -40,7 +65,7 @@ SPDX-License-Identifier: Apache-2.0 - 明显低于 `50 files` 阈值 - 本轮停止信号来自 `context-budget / reviewability`,不是文件预算耗尽 - 当前下一步: - - 先按需要运行 `$gframework-pr-review`,确认 `PR #348` latest-head open thread 是否已随本轮新增提交收敛 + - 先按需要运行 `$gframework-pr-review`,确认 `PR #349` latest-head open thread 是否已随当前修复提交收敛 - 若继续扩 benchmark,优先补 `StreamLifetimeBenchmarks` 或 `StreamStartupBenchmarks` 的单文件 `Mediator` parity - 若切回文档收尾,把 `GFramework.Cqrs/README.md`、`docs/zh-CN/core/command.md`、`docs/zh-CN/core/query.md` 单独作为 docs-only 下一波