chore(cqrs-rewrite): 修复PR349评审遗留问题

- 更新 stream benchmark 的 XML 返回值契约

- 修复通知发布器缓存回归测试的误导性安全网

- 同步 ai-plan 中的当前 PR 锚点与验证结果
This commit is contained in:
gewuyou 2026-05-12 11:15:13 +08:00
parent d85b85c614
commit e746fede7e
5 changed files with 48 additions and 11 deletions

View File

@ -146,6 +146,7 @@ public class StreamPipelineBenchmarks
/// <summary> /// <summary>
/// 直接调用 handler并按当前观测模式消费响应序列作为 stream pipeline 编排之外的基线。 /// 直接调用 handler并按当前观测模式消费响应序列作为 stream pipeline 编排之外的基线。
/// </summary> /// </summary>
/// <returns>按当前观测模式完成 stream 消费后的等待句柄。</returns>
[Benchmark(Baseline = true)] [Benchmark(Baseline = true)]
public ValueTask Stream_Baseline() public ValueTask Stream_Baseline()
{ {
@ -155,6 +156,7 @@ public class StreamPipelineBenchmarks
/// <summary> /// <summary>
/// 通过 GFramework.CQRS runtime 创建 stream并按当前矩阵配置执行 stream pipeline。 /// 通过 GFramework.CQRS runtime 创建 stream并按当前矩阵配置执行 stream pipeline。
/// </summary> /// </summary>
/// <returns>按当前观测模式完成 stream 消费后的等待句柄。</returns>
[Benchmark] [Benchmark]
public ValueTask Stream_GFrameworkCqrs() public ValueTask Stream_GFrameworkCqrs()
{ {
@ -169,6 +171,7 @@ public class StreamPipelineBenchmarks
/// <summary> /// <summary>
/// 通过 MediatR 创建 stream并按当前矩阵配置执行 stream pipeline作为外部设计对照。 /// 通过 MediatR 创建 stream并按当前矩阵配置执行 stream pipeline作为外部设计对照。
/// </summary> /// </summary>
/// <returns>按当前观测模式完成 stream 消费后的等待句柄。</returns>
[Benchmark] [Benchmark]
public ValueTask Stream_MediatR() public ValueTask Stream_MediatR()
{ {

View File

@ -167,6 +167,7 @@ public class StreamingBenchmarks
/// <summary> /// <summary>
/// 通过 `ai-libs/Mediator` 的 source-generated concrete mediator 创建 stream并按当前观测模式消费。 /// 通过 `ai-libs/Mediator` 的 source-generated concrete mediator 创建 stream并按当前观测模式消费。
/// </summary> /// </summary>
/// <returns>按当前观测模式完成 stream 消费后的等待句柄。</returns>
[Benchmark] [Benchmark]
public ValueTask Stream_Mediator() public ValueTask Stream_Mediator()
{ {

View File

@ -179,12 +179,12 @@ internal sealed class CqrsNotificationPublisherTests
.Returns(() => .Returns(() =>
{ {
notificationPublisherLookupCount++; notificationPublisherLookupCount++;
return notificationPublisherLookupCount switch if (notificationPublisherLookupCount == 1)
{ {
1 => Array.Empty<object>(), return Array.Empty<object>();
2 => [new ReverseOrderNotificationPublisher()], }
_ => throw new AssertionException("Notification publisher should be resolved at most once.")
}; throw new AssertionException("Notification publisher should not be resolved more than once.");
}); });
}); });

View File

@ -12,14 +12,20 @@ CQRS 迁移与收敛。
## 当前恢复点 ## 当前恢复点
- 恢复点编号:`CQRS-REWRITE-RP-135` - 恢复点编号:`CQRS-REWRITE-RP-136`
- 当前阶段:`Phase 8` - 当前阶段:`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)` `origin/main @ ef4d3d5d (2026-05-11 17:33:43 +0800)`
- 当前 branch 相对基线的累计 diff 约为 `9 files / 1111 lines`;本轮停点由 - 当前 branch 相对基线的累计 diff 约为 `9 files / 1111 lines`;本轮停点由
`context-budget / reviewability` 决定,而不是 `50 files` 阈值。 `context-budget / reviewability` 决定,而不是 `50 files` 阈值。
- `PR #349` latest-head review 当前确认仍成立的项只有:
- `StreamPipelineBenchmarks` 三个公开 benchmark 方法补齐 `<returns>` XML 契约
- `StreamingBenchmarks.Stream_Mediator` 补齐 `<returns>` XML 契约
- `CqrsNotificationPublisherTests` 中 fallback publisher 缓存回归测试去掉误导性的“第二次解析返回其它 publisher”分支
- active tracking / trace 的当前 PR 锚点与下一步入口同步到 `PR #349`
- tests 侧已补齐并提交: - tests 侧已补齐并提交:
- `CqrsRegistrationServiceTests`:补空输入、空项过滤、稳定键排序与跨调用跳过边界 - `CqrsRegistrationServiceTests`:补空输入、空项过滤、稳定键排序与跨调用跳过边界
- `CqrsHandlerRegistrarTests``CqrsHandlerRegistrarFallbackFailureTests` - `CqrsHandlerRegistrarTests``CqrsHandlerRegistrarFallbackFailureTests`
@ -34,7 +40,7 @@ CQRS 迁移与收敛。
## 当前活跃事实 ## 当前活跃事实
- 当前分支:`feat/cqrs-optimization` - 当前分支:`feat/cqrs-optimization`
- 当前 PR`PR #348` - 当前 PR`PR #349`
- 当前写面: - 当前写面:
- `GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs` - `GFramework.Cqrs.Benchmarks/Messaging/StreamPipelineBenchmarks.cs`
- `GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs` - `GFramework.Cqrs.Benchmarks/Messaging/StreamingBenchmarks.cs`
@ -66,6 +72,8 @@ CQRS 迁移与收敛。
- `dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release` - `dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release`
- 结果:通过,`0 warning / 0 error` - 结果:通过,`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"` - `dotnet test GFramework.Cqrs.Tests/GFramework.Cqrs.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsRegistrationServiceTests|FullyQualifiedName~CqrsHandlerRegistrarTests|FullyQualifiedName~CqrsHandlerRegistrarFallbackFailureTests|FullyQualifiedName~CqrsNotificationPublisherTests"`
- 结果:通过,`Passed: 36, Failed: 0` - 结果:通过,`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` - `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而不是并行扩多个矩阵。 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 切片处理。 3. 若切回文档收尾,把 `GFramework.Cqrs/README.md``docs/zh-CN/core/command.md``docs/zh-CN/core/query.md` 作为单独一波 docs-only 切片处理。

View File

@ -7,6 +7,31 @@ SPDX-License-Identifier: Apache-2.0
## 2026-05-12 ## 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` 缺少 `<returns>` XML 契约,接受修复
- `StreamingBenchmarks.Stream_Mediator` 缺少 `<returns>` XML 契约,接受修复
- `CqrsNotificationPublisherTests` 的 fallback publisher 缓存回归测试用“第二次解析返回另一个 publisher”充当安全网和断言消息表达不一致接受收口为“首次后任何再次解析都直接失败”
- active tracking / trace 的当前 PR 锚点与下一步入口仍停留在 `PR #348`,接受同步到 `PR #349`
- 本轮主线程实施:
- `StreamPipelineBenchmarks`
- 为 3 个公开 benchmark 方法补齐 `<returns>` XML 文档
- `StreamingBenchmarks`
- 为 `Stream_Mediator()` 补齐 `<returns>` 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 ### 阶段:多波 batch 继续收口CQRS-REWRITE-RP-135
- 按 `$gframework-batch-boot 50` 恢复当前 topic并把基线固定为 - 按 `$gframework-batch-boot 50` 恢复当前 topic并把基线固定为
@ -40,7 +65,7 @@ SPDX-License-Identifier: Apache-2.0
- 明显低于 `50 files` 阈值 - 明显低于 `50 files` 阈值
- 本轮停止信号来自 `context-budget / reviewability`,不是文件预算耗尽 - 本轮停止信号来自 `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 - 若继续扩 benchmark优先补 `StreamLifetimeBenchmarks``StreamStartupBenchmarks` 的单文件 `Mediator` parity
- 若切回文档收尾,把 `GFramework.Cqrs/README.md``docs/zh-CN/core/command.md``docs/zh-CN/core/query.md` 单独作为 docs-only 下一波 - 若切回文档收尾,把 `GFramework.Cqrs/README.md``docs/zh-CN/core/command.md``docs/zh-CN/core/query.md` 单独作为 docs-only 下一波