chore(cqrs-rewrite): 刷新PR350合并后的恢复入口

- 更新 cqrs-rewrite tracking 到 PR #350 已合并且 branch diff 归零的当前真值
- 补充 batch boot 恢复结论与下一轮 CQRS 工作应从新分支继续的建议
This commit is contained in:
gewuyou 2026-05-13 08:29:00 +08:00
parent 4837aa2a23
commit 01360bb4ae
2 changed files with 59 additions and 48 deletions

View File

@ -12,75 +12,60 @@ CQRS 迁移与收敛。
## 当前恢复点 ## 当前恢复点
- 恢复点编号:`CQRS-REWRITE-RP-140` - 恢复点编号:`CQRS-REWRITE-RP-142`
- 当前阶段:`Phase 8` - 当前阶段:`Phase 8`
- 当前 PR 锚点:`PR #350OPEN2026-05-12` - 当前 PR 锚点:`PR #350MERGED2026-05-13`
- 当前结论: - 当前结论:
- 本轮按 `$gframework-pr-review` 重新抓取 GitHub 真值后,确认当前公开 PR 不是已合并的 `PR #349`,而是仍处于 `OPEN` 状态的 `PR #350` - 本轮按 `$gframework-batch-boot 50` 恢复后,先核对本地仓库真值,确认 `feat/cqrs-optimization` 已与
- 最新 AI review 只有 1 条 Greptile open thread关注点是 `origin/main` 指向同一合并提交 `4837aa2a`,此前 tracking 中的 `PR #350OPEN``14 files` 等事实已过期。
- `StreamStartupBenchmarks.ColdStart_Mediator()``RequestLifetimeBenchmarks.SendRequest_Mediator()` 先前只做了编译验证,未实际 smoke-run - 当前 topic 的 benchmark runtime 修正、XML 文档补齐与 `README` 边界收口已经随 `PR #350` 合并进入
- 主线程按 review 提示执行最小 benchmark smoke run 后,确认 Greptile 线程不是误报,而是命中了真实运行时缺陷: `origin/main`,不再存在可继续扩批的活动写面。
- `StreamStartupBenchmarks.ColdStart_Mediator()` 在 BenchmarkDotNet 自动生成宿主里抛出 - 这轮收口不再继续新增 benchmark 或测试切片,而是把 public recovery 入口刷新为“已合并、无 branch diff、等待下一轮新任务”的状态
`Invalid configuration detected for Mediator. Generated code for 'Transient' lifetime, but got 'Singleton' lifetime from options.` 避免后续 `boot` 落回已完成的 PR 上下文。
- `RequestLifetimeBenchmarks.SendRequest_Mediator()``Singleton / Scoped` 也抛出同类异常;只有 `Transient` 变体能跑通 - 当前 branch-wide 停止原因不是 `50 files` 阈值,而是语义边界已经完成:
- 根因确认: - `origin/main...HEAD` 的累计 diff 为 `0 files / 0 lines`
- NuGet `Mediator` 的 DI lifetime 由 source generator 在 benchmark 项目编译期固定 - 当前工作树干净
- 当前工程同时存在默认 `AddMediator()` 与 request lifetime 场景下的 `AddMediator(options => options.ServiceLifetime = ...)` - 继续在同一 topic 上机械扩批不会产生新的低风险、可验证切片
- 这会让同一份生成产物在 BenchmarkDotNet 自动生成宿主中出现 compile-time 形状与 runtime options 不一致
- 本轮收口策略:
- `BenchmarkHostFactory.CreateMediatorServiceProvider()` 统一显式固定为 `Singleton` compile-time lifetime
- `RequestLifetimeBenchmarks` 撤回当前无法真实运行的 `Mediator` 生命周期矩阵,只保留 `GFramework.Cqrs``MediatR`
- `GFramework.Cqrs.Benchmarks/README.md` 同步收窄 request lifetime coverage并把 `Mediator` 生命周期矩阵改记为当前缺口
- 本轮未修改 `GFramework.Cqrs` 运行时代码;修复面限定在 benchmark 宿主装配与 reader-facing docs。
## 当前活跃事实 ## 当前活跃事实
- 当前分支:`feat/cqrs-optimization` - 当前分支:`feat/cqrs-optimization`
- 当前 PR`PR #349已合并当前分支暂无新的公开 PR` - 当前 HEAD / 基线:`origin/main @ 4837aa2a (2026-05-12 20:37:56 +0800)`
- 当前 PR`PR #350OPEN` - 当前 PR`PR #350已合并到 origin/main`
- 当前写面: - 当前写面:
- `GFramework.Cqrs.Benchmarks/Messaging/BenchmarkHostFactory.cs`
- `GFramework.Cqrs.Benchmarks/Messaging/RequestLifetimeBenchmarks.cs`
- `GFramework.Cqrs.Benchmarks/README.md`
- `ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.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/traces/cqrs-rewrite-migration-trace.md`
- 当前基线: - 当前基线:
- `origin/main @ 2b2bec65 (2026-05-12 11:49:39 +0800)` - `origin/main @ 4837aa2a (2026-05-12 20:37:56 +0800)`
- 当前已提交 branch diff`14 files` - 当前已提交 branch diff`0 files / 0 lines`
- 当前分支比 `origin/main``5` 个提交:`f346110a``a016e3d4``ab422b05``555c7c07``c32a1ec4` - `origin/main...HEAD` 提交差异:`0 behind / 0 ahead`
- 当前工作面已收口为 `Mediator` benchmark runtime 配置修正、request lifetime coverage 收窄与对应 `README` / `ai-plan` 同步 - 当前工作面已收口为 public recovery 文档刷新CQRS benchmark 代码不再处于活跃修改状态
- 本轮提交: - 最近已合并提交:
- `f346110a` `feat(cqrs-benchmarks): 补齐 stream startup 的 Mediator 对照路径` - `2dd9435c` `fix(cqrs-benchmarks): 修正Mediator基准运行时配置`
- `ab422b05` `docs(cqrs-benchmarks): 补齐 request benchmark 返回值注释` - `e3532fc2` `feat(cqrs-benchmarks): 补齐request生命周期的Mediator对照`
- `555c7c07` `docs(cqrs-benchmarks): 补齐 request benchmark 返回值文档` - `092946e9` `docs(cqrs-benchmarks): 同步startup基准文档边界`
- `c32a1ec4` `docs(cqrs-benchmarks): 补齐stream与notification基准返回值文档`
## 当前风险 ## 当前风险
- `StreamLifetimeBenchmarks` 仍缺 `Mediator` parity如果后续要补必须采用独立 compile-time config 或独立 benchmark 工程,而不是在当前项目里切换 runtime `ServiceLifetime` - 后续若再次评估 `StreamLifetimeBenchmarks` 或 request lifetime 的 `Mediator` parity仍必须采用独立 compile-time config
- `RequestLifetimeBenchmarks` 目前不再覆盖 `Mediator`;若后续要恢复该矩阵,也必须先解决 source-generated lifetime 与 BenchmarkDotNet 自动宿主的编译期塑形边界 或独立 benchmark 工程,而不是在同一份 source-generated 产物上切换 runtime `ServiceLifetime`
- benchmark XML 盘点若再次依赖粗糙脚本或只读 inventory仍有把已存在文档误记为缺口的风险后续若再开 XML 波次,必须先用主线程抽样核对代表文件 - 如果 `feat/cqrs-optimization` 继续承载新的 CQRS 任务而不先分支public recovery 入口会把“已合并的 PR #350”与下一轮新工作混在一起
- 当前 PR 的 Greptile open thread 在代码修正后虽已有本地验证证据,但线程本身还未在 GitHub 上回复 / resolve - 若未来再开 benchmark XML / docs 波次,仍需要主线程先抽样核对代表文件,避免重复接受误报 inventory
## 最近权威验证 ## 最近权威验证
- `git rev-list --left-right --count origin/main...HEAD`
- 结果:通过
- 备注:返回 `0 0`,确认当前分支与 `origin/main` 没有提交差异
- `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`
- 备注:确认统一 `Mediator` compile-time lifetime 后 benchmark 工程仍可编译 - 备注:作为当前 recovery 刷新任务的最小 build validation继续确认 benchmark 工程在合并后保持可编译
- `dotnet run --project GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release --no-build -- --artifacts-suffix pr350-stream-startup-mediator-fixed --filter "*StreamStartupBenchmarks.ColdStart_Mediator*" --job short --warmupCount 1 --iterationCount 1 --launchCount 1`
- 结果:通过
- 备注:`ColdStart_Mediator` 已在 BenchmarkDotNet 自动生成宿主中实际执行,约 `144.036 us / 69.3 KB`
- `dotnet run --project GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release --no-build -- --artifacts-suffix pr350-request-lifetime-fixed-rerun --filter "*RequestLifetimeBenchmarks*" --job short --warmupCount 1 --iterationCount 1 --launchCount 1`
- 结果:通过
- 备注:当前矩阵为 `9`baseline / `GFramework.Cqrs` / `MediatR` * `Singleton|Scoped|Transient`),不再包含伪 `Mediator` lifetime 条目
- `$gframework-pr-review`
- 结果:确认 `PR #350` openCodeRabbit 已 `APPROVED`Greptile 仍有 `1` 条 open thread 指向 `StreamStartupBenchmarks.cs`
## 下一推荐步骤 ## 下一推荐步骤
1. 在 GitHub `PR #350` 回应并 resolve 当前 Greptile 线程,说明 `ColdStart_Mediator` 已补 smoke-run且 request lifetime 的 `Mediator` 矩阵已按 source-generator 真实约束撤回 1. 若要继续 CQRS 主题的新一轮实现,先从最新 `origin/main` 创建新的 topic branch再补新的 recovery point而不是继续复用已完成的 `PR #350` 上下文。
2. 若后续评估 `StreamLifetimeBenchmarks` 或 request lifetime 的 `Mediator` parity优先设计独立 compile-time config / 独立 benchmark 工程,而不是继续在同一项目里切换 runtime `ServiceLifetime` 2. 若后续重新打开 `Mediator` 生命周期 parity 工作,优先设计独立 compile-time config / 独立 benchmark 工程,并把该设计单独记录到新的 tracking phase。
3. 若后续再开 XML / docs 批次,先由主线程逐文件核对代表样本,不要直接沿用误报 inventory 扩批 3. 若只是恢复本 worktree 继续其他 topic可把 `cqrs-rewrite` 视为“当前已在自然停点完成”的历史入口,不再默认把 benchmark README / XML 清扫当作活跃批处理目标。
## 活跃文档 ## 活跃文档

View File

@ -5,6 +5,32 @@ SPDX-License-Identifier: Apache-2.0
# CQRS 重写迁移追踪 # CQRS 重写迁移追踪
## 2026-05-13
### 阶段PR #350 合并后的 recovery 入口刷新CQRS-REWRITE-RP-142
- 继续按 `$gframework-batch-boot 50` 恢复当前 topic但启动时先核对分支真值而不是沿用 active tracking 中的旧 PR 状态。
- 本轮基线按 skill 规则固定为 `origin/main @ 4837aa2a (2026-05-12 20:37:56 +0800)`
- 本地核对结果:
- `feat/cqrs-optimization` 当前 `HEAD``origin/main` 指向同一合并提交 `4837aa2a`
- `git rev-list --left-right --count origin/main...HEAD` 返回 `0 0`
- `git diff --name-only origin/main...HEAD | wc -l` 返回 `0`
- 当前工作树干净,不存在可继续扩批的 CQRS benchmark / test 写面
- 批处理候选重判:
- 不再把当前任务视为新的 benchmark 批处理波次
- 原因不是 `50 files` 阈值耗尽,而是语义边界已经完成,继续在已合并 topic 上扩批只会制造恢复入口噪音
- 本轮 accepted scope
- `ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md`
- `ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md`
- 本轮主线程收口目标:
- 把 active tracking 从 `PR #350OPEN` 刷新为 `PR #350MERGED`
- 把 branch metric 从过期的 `14 files` 刷新为 `0 files / 0 lines`
- 把“继续回 GitHub resolve thread”替换为“下一轮 CQRS 工作应从新分支 / 新 recovery point 开始”
- 当前下一步:
- 串行执行一次 benchmark 工程 Release build满足仓库对完成任务的 build validation 要求
- 运行 `python3 scripts/license-header.py --check --paths ...``git diff --check`
- 提交本轮 recovery 刷新
## 2026-05-12 ## 2026-05-12
### 阶段PR #350 的 Mediator runtime 配置收口CQRS-REWRITE-RP-141 ### 阶段PR #350 的 Mediator runtime 配置收口CQRS-REWRITE-RP-141