diff --git a/GFramework.Core/Command/AbstractAsyncCommand.cs b/GFramework.Core/Command/AbstractAsyncCommand.cs
index e0d2ca1a..a97411e4 100644
--- a/GFramework.Core/Command/AbstractAsyncCommand.cs
+++ b/GFramework.Core/Command/AbstractAsyncCommand.cs
@@ -1,5 +1,6 @@
using GFramework.Core.Abstractions.Command;
using GFramework.Core.Rule;
+using GFramework.Cqrs.Abstractions.Cqrs.Command;
namespace GFramework.Core.Command;
@@ -26,3 +27,54 @@ public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand
/// 表示异步操作的任务
protected abstract Task OnExecuteAsync();
}
+
+///
+/// 抽象异步命令基类,为需要命令输入且无返回值的异步命令提供统一执行骨架。
+///
+/// 命令输入类型,必须实现 接口。
+/// 命令输入参数。
+public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand
+ where TInput : ICommandInput
+{
+ ///
+ /// 执行异步命令的实现方法。
+ ///
+ /// 表示异步操作的任务。
+ async Task IAsyncCommand.ExecuteAsync()
+ {
+ await OnExecuteAsync(input).ConfigureAwait(false);
+ }
+
+ ///
+ /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑。
+ ///
+ /// 命令输入参数。
+ /// 表示异步操作的任务。
+ protected abstract Task OnExecuteAsync(TInput input);
+}
+
+///
+/// 抽象异步命令基类,为需要命令输入且返回结果的异步命令提供统一执行骨架。
+///
+/// 命令输入类型,必须实现 接口。
+/// 命令执行结果类型。
+/// 命令输入参数。
+public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand
+ where TInput : ICommandInput
+{
+ ///
+ /// 执行异步命令并返回结果的实现方法。
+ ///
+ /// 表示异步操作且包含结果的任务。
+ async Task IAsyncCommand.ExecuteAsync()
+ {
+ return await OnExecuteAsync(input).ConfigureAwait(false);
+ }
+
+ ///
+ /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果。
+ ///
+ /// 命令输入参数。
+ /// 表示异步操作且包含结果的任务。
+ protected abstract Task OnExecuteAsync(TInput input);
+}
diff --git a/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs b/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs
deleted file mode 100644
index 00fcaaba..00000000
--- a/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using GFramework.Core.Abstractions.Command;
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Command;
-
-namespace GFramework.Core.Command;
-
-///
-/// 抽象异步命令基类,用于处理无返回值的异步命令操作
-///
-/// 命令输入类型,必须实现ICommandInput接口
-public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand
- where TInput : ICommandInput
-{
- ///
- /// 执行异步命令的实现方法
- ///
- /// 表示异步操作的任务
- async Task IAsyncCommand.ExecuteAsync()
- {
- await OnExecuteAsync(input).ConfigureAwait(false);
- }
-
- ///
- /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑
- ///
- /// 命令输入参数
- /// 表示异步操作的任务
- protected abstract Task OnExecuteAsync(TInput input);
-}
diff --git a/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs b/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs
deleted file mode 100644
index 7d1f6a91..00000000
--- a/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using GFramework.Core.Abstractions.Command;
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Command;
-
-namespace GFramework.Core.Command;
-
-///
-/// 抽象异步命令基类,用于处理有返回值的异步命令操作
-///
-/// 命令输入类型,必须实现ICommandInput接口
-/// 命令执行结果类型
-public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand
- where TInput : ICommandInput
-{
- ///
- /// 执行异步命令并返回结果的实现方法
- ///
- /// 表示异步操作且包含结果的任务
- async Task IAsyncCommand.ExecuteAsync()
- {
- return await OnExecuteAsync(input).ConfigureAwait(false);
- }
-
- ///
- /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果
- ///
- /// 命令输入参数
- /// 表示异步操作且包含结果的任务
- protected abstract Task OnExecuteAsync(TInput input);
-}
diff --git a/GFramework.Core/Command/AbstractCommand.cs b/GFramework.Core/Command/AbstractCommand.cs
index c83b1698..ce28d162 100644
--- a/GFramework.Core/Command/AbstractCommand.cs
+++ b/GFramework.Core/Command/AbstractCommand.cs
@@ -1,5 +1,7 @@
using GFramework.Core.Abstractions.Command;
using GFramework.Core.Rule;
+using GFramework.Cqrs.Abstractions.Cqrs.Command;
+using ICommand = GFramework.Core.Abstractions.Command.ICommand;
namespace GFramework.Core.Command;
@@ -20,4 +22,55 @@ public abstract class AbstractCommand : ContextAwareBase, ICommand
/// 命令执行的抽象方法,由派生类实现具体的命令逻辑
///
protected abstract void OnExecute();
-}
\ No newline at end of file
+}
+
+///
+/// 抽象命令类,实现 接口,为需要命令输入的具体命令提供基础架构支持。
+///
+/// 命令输入参数类型,必须实现 接口。
+/// 命令执行所需的输入参数。
+public abstract class AbstractCommand(TInput input) : ContextAwareBase, ICommand
+ where TInput : ICommandInput
+{
+ ///
+ /// 执行命令的入口方法,实现 接口的 Execute 方法。
+ ///
+ void ICommand.Execute()
+ {
+ OnExecute(input);
+ }
+
+ ///
+ /// 命令执行的抽象方法,由派生类实现具体的命令逻辑。
+ ///
+ /// 命令执行所需的输入参数。
+ protected abstract void OnExecute(TInput input);
+}
+
+///
+/// 带返回值的抽象命令类,为需要输入和返回值的命令提供统一执行骨架。
+///
+/// 命令输入参数类型,必须实现 接口。
+/// 命令执行后返回的结果类型。
+/// 命令执行所需的输入参数。
+public abstract class AbstractCommand(TInput input)
+ : ContextAwareBase, GFramework.Core.Abstractions.Command.ICommand
+ where TInput : ICommandInput
+{
+ ///
+ /// 执行命令的入口方法,实现 接口的
+ /// Execute 方法。
+ ///
+ /// 命令执行后的结果。
+ TResult GFramework.Core.Abstractions.Command.ICommand.Execute()
+ {
+ return OnExecute(input);
+ }
+
+ ///
+ /// 命令执行的抽象方法,由派生类实现具体的命令逻辑。
+ ///
+ /// 命令执行所需的输入参数。
+ /// 命令执行后的结果。
+ protected abstract TResult OnExecute(TInput input);
+}
diff --git a/GFramework.Core/Command/AbstractCommandWithInput.cs b/GFramework.Core/Command/AbstractCommandWithInput.cs
deleted file mode 100644
index c3ebbb03..00000000
--- a/GFramework.Core/Command/AbstractCommandWithInput.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Command;
-using ICommand = GFramework.Core.Abstractions.Command.ICommand;
-
-namespace GFramework.Core.Command;
-
-///
-/// 抽象命令类,实现 ICommand 接口,为具体命令提供基础架构支持
-///
-/// 命令输入参数类型,必须实现 ICommandInput 接口
-/// 命令执行所需的输入参数
-public abstract class AbstractCommand(TInput input) : ContextAwareBase, ICommand
- where TInput : ICommandInput
-{
- ///
- /// 执行命令的入口方法,实现 ICommand 接口的 Execute 方法
- ///
- void ICommand.Execute()
- {
- OnExecute(input);
- }
-
- ///
- /// 命令执行的抽象方法,由派生类实现具体的命令逻辑
- ///
- /// 命令执行所需的输入参数
- protected abstract void OnExecute(TInput input);
-}
diff --git a/GFramework.Core/Command/AbstractCommandWithResult.cs b/GFramework.Core/Command/AbstractCommandWithResult.cs
deleted file mode 100644
index ca40957a..00000000
--- a/GFramework.Core/Command/AbstractCommandWithResult.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Command;
-
-namespace GFramework.Core.Command;
-
-///
-/// 带返回值的抽象命令类,实现 ICommand{TResult} 接口,为需要返回结果的命令提供基础架构支持
-///
-/// 命令输入参数类型,必须实现 ICommandInput 接口
-/// 命令执行后返回的结果类型
-/// 命令执行所需的输入参数
-public abstract class AbstractCommand(TInput input)
- : ContextAwareBase, Abstractions.Command.ICommand
- where TInput : ICommandInput
-{
- ///
- /// 执行命令的入口方法,实现 ICommand{TResult} 接口的 Execute 方法
- ///
- /// 命令执行后的结果
- TResult Abstractions.Command.ICommand.Execute()
- {
- return OnExecute(input);
- }
-
- ///
- /// 命令执行的抽象方法,由派生类实现具体的命令逻辑
- ///
- /// 命令执行所需的输入参数
- /// 命令执行后的结果
- protected abstract TResult OnExecute(TInput input);
-}
diff --git a/GFramework.Core/Events/EasyEventGeneric.cs b/GFramework.Core/Events/Event.cs
similarity index 65%
rename from GFramework.Core/Events/EasyEventGeneric.cs
rename to GFramework.Core/Events/Event.cs
index e116603c..57205255 100644
--- a/GFramework.Core/Events/EasyEventGeneric.cs
+++ b/GFramework.Core/Events/Event.cs
@@ -3,8 +3,8 @@
namespace GFramework.Core.Events;
///
-/// 泛型事件类,支持一个泛型参数 T 的事件注册、注销与触发。
-/// 实现了 IEvent 接口以提供统一的事件操作接口。
+/// 泛型事件类,支持一个泛型参数 的事件注册、注销与触发。
+/// 实现了 接口以提供统一的事件操作接口。
///
/// 事件回调函数的第一个参数类型。
public class Event : IEvent
@@ -16,11 +16,11 @@ public class Event : IEvent
private Action? _mOnEvent = _ => { };
///
- /// 显式实现 IEvent 接口中的 Register 方法。
- /// 允许使用无参 Action 来订阅当前带参事件。
+ /// 显式实现 接口中的 Register 方法。
+ /// 允许使用无参 来订阅当前带参事件。
///
/// 无参事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
+ /// 对象,用于稍后注销该事件监听器。
IUnRegister IEvent.Register(Action onEvent)
{
return Register(Action);
@@ -35,7 +35,7 @@ public class Event : IEvent
/// 注册一个事件监听器,并返回可用于取消注册的对象。
///
/// 要注册的事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
+ /// 对象,用于稍后注销该事件监听器。
public IUnRegister Register(Action onEvent)
{
_mOnEvent += onEvent;
@@ -52,7 +52,7 @@ public class Event : IEvent
}
///
- /// 触发所有已注册的事件处理程序,并传递参数 t。
+ /// 触发所有已注册的事件处理程序,并传递参数 。
///
/// 传递给事件处理程序的参数。
public void Trigger(T t)
@@ -61,9 +61,9 @@ public class Event : IEvent
}
///
- /// 获取当前已注册的监听器数量
+ /// 获取当前已注册的监听器数量。
///
- /// 监听器数量
+ /// 监听器数量。
public int GetListenerCount()
{
return _mOnEvent?.GetInvocationList().Length ?? 0;
@@ -71,30 +71,30 @@ public class Event : IEvent
}
///
-/// 支持两个泛型参数 T 和 TK 的事件类。
+/// 支持两个泛型参数 和 的事件类。
/// 提供事件注册、注销和触发功能。
///
/// 第一个参数类型。
-/// 第二个参数类型。
-public class Event : IEvent
+/// 第二个参数类型。
+public class Event : IEvent
{
///
/// 存储已注册的双参数事件处理委托。
/// 默认为空操作(no-op)委托。
///
- private Action? _mOnEvent = (_, _) => { };
+ private Action? _mOnEvent = (_, _) => { };
///
- /// 显式实现 IEvent 接口中的 Register 方法。
- /// 允许使用无参 Action 来订阅当前带参事件。
+ /// 显式实现 接口中的 Register 方法。
+ /// 允许使用无参 来订阅当前带参事件。
///
/// 无参事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
+ /// 对象,用于稍后注销该事件监听器。
IUnRegister IEvent.Register(Action onEvent)
{
return Register(Action);
- void Action(T _, Tk __)
+ void Action(T _, TK __)
{
onEvent();
}
@@ -104,8 +104,8 @@ public class Event : IEvent
/// 注册一个接受两个参数的事件监听器,并返回可用于取消注册的对象。
///
/// 要注册的事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
- public IUnRegister Register(Action onEvent)
+ /// 对象,用于稍后注销该事件监听器。
+ public IUnRegister Register(Action onEvent)
{
_mOnEvent += onEvent;
return new DefaultUnRegister(() => UnRegister(onEvent));
@@ -115,27 +115,27 @@ public class Event : IEvent
/// 取消指定的双参数事件监听器。
///
/// 需要被注销的事件处理方法。
- public void UnRegister(Action onEvent)
+ public void UnRegister(Action onEvent)
{
_mOnEvent -= onEvent;
}
///
- /// 触发所有已注册的事件处理程序,并传递参数 t 和 k。
+ /// 触发所有已注册的事件处理程序,并传递参数 和 。
///
/// 第一个参数。
/// 第二个参数。
- public void Trigger(T t, Tk k)
+ public void Trigger(T t, TK k)
{
_mOnEvent?.Invoke(t, k);
}
///
- /// 获取当前已注册的监听器数量
+ /// 获取当前已注册的监听器数量。
///
- /// 监听器数量
+ /// 监听器数量。
public int GetListenerCount()
{
return _mOnEvent?.GetInvocationList().Length ?? 0;
}
-}
\ No newline at end of file
+}
diff --git a/GFramework.Core/Query/AbstractAsyncQuery.cs b/GFramework.Core/Query/AbstractAsyncQuery.cs
index 5e50b5f3..27d517fc 100644
--- a/GFramework.Core/Query/AbstractAsyncQuery.cs
+++ b/GFramework.Core/Query/AbstractAsyncQuery.cs
@@ -1,5 +1,6 @@
using GFramework.Core.Abstractions.Query;
using GFramework.Core.Rule;
+using GFramework.Cqrs.Abstractions.Cqrs.Query;
namespace GFramework.Core.Query;
@@ -24,4 +25,31 @@ public abstract class AbstractAsyncQuery : ContextAwareBase, IAsyncQuer
///
/// 返回查询结果的异步任务
protected abstract Task OnDoAsync();
-}
\ No newline at end of file
+}
+
+///
+/// 抽象异步查询基类,为需要输入参数的异步查询提供统一执行骨架。
+///
+/// 查询输入类型,必须实现 接口。
+/// 查询结果类型。
+/// 查询输入参数。
+public abstract class AbstractAsyncQuery(TInput input)
+ : ContextAwareBase, IAsyncQuery
+ where TInput : IQueryInput
+{
+ ///
+ /// 执行异步查询操作。
+ ///
+ /// 返回查询结果的异步任务。
+ public Task DoAsync()
+ {
+ return OnDoAsync(input);
+ }
+
+ ///
+ /// 抽象方法,用于实现具体的异步查询逻辑。
+ ///
+ /// 查询输入参数。
+ /// 返回查询结果的异步任务。
+ protected abstract Task OnDoAsync(TInput input);
+}
diff --git a/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs b/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs
deleted file mode 100644
index 03713712..00000000
--- a/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using GFramework.Core.Abstractions.Query;
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Query;
-
-namespace GFramework.Core.Query;
-
-///
-/// 抽象异步查询基类,用于处理输入类型为TInput、结果类型为TResult的异步查询操作
-///
-/// 查询输入类型,必须实现IQueryInput接口
-/// 查询结果类型
-/// 查询输入参数
-public abstract class AbstractAsyncQuery(
- TInput input
-) : ContextAwareBase, IAsyncQuery
- where TInput : IQueryInput
-{
- ///
- /// 执行异步查询操作
- ///
- /// 返回查询结果的异步任务
- public Task DoAsync()
- {
- return OnDoAsync(input);
- }
-
- ///
- /// 抽象方法,用于实现具体的异步查询逻辑
- ///
- /// 查询输入参数
- /// 返回查询结果的异步任务
- protected abstract Task OnDoAsync(TInput input);
-}
diff --git a/GFramework.Core/Query/AbstractQuery.cs b/GFramework.Core/Query/AbstractQuery.cs
index 35f2c9b2..c9849011 100644
--- a/GFramework.Core/Query/AbstractQuery.cs
+++ b/GFramework.Core/Query/AbstractQuery.cs
@@ -1,5 +1,6 @@
using GFramework.Core.Abstractions.Query;
using GFramework.Core.Rule;
+using GFramework.Cqrs.Abstractions.Cqrs.Query;
namespace GFramework.Core.Query;
@@ -7,7 +8,7 @@ namespace GFramework.Core.Query;
/// 抽象查询类,提供查询操作的基础实现
///
/// 查询结果的类型
-public abstract class AbstractQuery : ContextAwareBase, IQuery
+public abstract class AbstractQuery : ContextAwareBase, GFramework.Core.Abstractions.Query.IQuery
{
///
@@ -25,4 +26,31 @@ public abstract class AbstractQuery : ContextAwareBase, IQuery
///
/// 查询结果,类型为TResult
protected abstract TResult OnDo();
-}
\ No newline at end of file
+}
+
+///
+/// 抽象查询类,为需要输入参数的同步查询提供基础实现。
+///
+/// 查询输入参数的类型,必须实现 接口。
+/// 查询结果的类型。
+/// 查询输入参数。
+public abstract class AbstractQuery(TInput input)
+ : ContextAwareBase, GFramework.Core.Abstractions.Query.IQuery
+ where TInput : IQueryInput
+{
+ ///
+ /// 执行查询操作。
+ ///
+ /// 查询结果,类型为 。
+ public TResult Do()
+ {
+ return OnDo(input);
+ }
+
+ ///
+ /// 抽象方法,用于实现具体的查询逻辑。
+ ///
+ /// 查询输入参数。
+ /// 查询结果。
+ protected abstract TResult OnDo(TInput input);
+}
diff --git a/GFramework.Core/Query/AbstractQueryWithResult.cs b/GFramework.Core/Query/AbstractQueryWithResult.cs
deleted file mode 100644
index ae099abe..00000000
--- a/GFramework.Core/Query/AbstractQueryWithResult.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using GFramework.Core.Rule;
-using GFramework.Cqrs.Abstractions.Cqrs.Query;
-
-namespace GFramework.Core.Query;
-
-///
-/// 抽象查询类,提供查询操作的基础实现
-///
-/// 查询输入参数的类型,必须实现IQueryInput接口
-/// 查询结果的类型
-public abstract class AbstractQuery(TInput input)
- : ContextAwareBase, Abstractions.Query.IQuery
- where TInput : IQueryInput
-{
- ///
- /// 执行查询操作
- ///
- /// 查询结果,类型为TResult
- public TResult Do()
- {
- return OnDo(input);
- }
-
- ///
- /// 抽象方法,用于实现具体的查询逻辑
- ///
- /// 查询输入参数
- /// 查询结果,类型为TResult
- protected abstract TResult OnDo(TInput input);
-}
diff --git a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md
index 68d9ab65..5ed33a95 100644
--- a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md
+++ b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md
@@ -7,12 +7,13 @@
## 当前恢复点
-- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-008`
-- 当前阶段:`Phase 8`
+- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-009`
+- 当前阶段:`Phase 9`
- 当前焦点:
- - 当前 `MA0051` 主线已完成;后续改为按 warning 类型和数量批处理,而不是继续按单文件切片推进
- - 优先批量收敛当前数量最高且风险较低的类型;当某一轮主类型数量不足时,允许顺手合并其他低冲突 warning 类型,
- `MA0015` 与 `MA0077` 只是当前最明显的低数量示例,不构成限定
+ - 当前 `MA0048` 已在 `GFramework.Core` 的 `net8.0` warnings-only 基线中清零;下一轮切到 `MA0046`
+ - 后续继续按 warning 类型和数量批处理,而不是回退到按单文件切片推进
+ - 当某一轮主类型数量不足时,允许顺手合并其他低冲突 warning 类型,`MA0015` 与 `MA0077`
+ 只是当前最明显的低数量示例,不构成限定
- 单次 `boot` 的工作树改动上限控制在约 `100` 个文件以内,避免 recovery context 与 review 面同时失控
- 若任务边界互不冲突,允许使用不同模型的 subagent 并行处理不同 warning 类型或不同目录,但必须遵守显式 ownership
@@ -20,9 +21,9 @@
- 已完成 `GFramework.Core`、`GFramework.Cqrs`、`GFramework.Godot` 与部分 source generator 的低风险 warning 清理
- 已完成多轮 CodeRabbit follow-up 修复,并用定向测试与项目/解决方案构建验证了关键回归风险
-- 当前 `PauseStackManager`、`Store` 与 `CoroutineScheduler` 的长方法 warning 已从 active 入口移除;主题内剩余 warning
- 主要集中在 `MA0048` 文件/类型命名冲突、`MA0046` delegate 形状、`MA0016` 集合抽象接口、`MA0002` comparer 重载,
- 以及 `MA0015` / `MA0077` 两个低数量尾项
+- 当前 `PauseStackManager`、`Store`、`CoroutineScheduler` 与 `GFramework.Core` 的 `MA0048`
+ 文件/类型命名冲突已从 active 入口移除;主题内剩余 warning 主要集中在 `MA0046` delegate 形状、
+ `MA0016` 集合抽象接口、`MA0002` comparer 重载,以及 `MA0015` / `MA0077` 两个低数量尾项
## 当前活跃事实
@@ -38,12 +39,14 @@
调度、取消与完成状态语义未回归
- `RP-008` 将后续策略从“单文件 warning 切片”切换为“按类型批处理 + 文件数上限控制”,并允许在非冲突前提下使用
不同模型的 subagent 并行处理
+- `RP-009` 在不改公共 API 的前提下,将同名泛型家族收拢到与类型名一致的单文件中,清空当前 `GFramework.Core`
+ `net8.0` 基线中的 `MA0048`,并通过定向 build/test 验证 `Command`、`Query`、`Event` 路径未回归
- 当前工作树分支 `fix/analyzer-warning-reduction-batch` 已在 `ai-plan/public/README.md` 建立 topic 映射
## 当前风险
-- 结构性重构风险:剩余 `GFramework.Core` 侧 `MA0051` 与 `MA0048` 可能要求较大的文件拆分或类型重命名
- - 缓解措施:按 warning 类型分批推进,并把单次 `boot` 的文件改动规模控制在约 `100` 个文件以内
+- 公共契约兼容风险:剩余 `MA0046` / `MA0016` 若直接改公开委托或集合类型,可能波及用户代码
+ - 缓解措施:优先选择不改公共 API 的低风险切法;若必须触达公共契约,先补齐 XML 契约说明与定向测试
- 测试宿主稳定性风险:部分 Godot 失败路径在当前 .NET 测试宿主下仍不稳定
- 缓解措施:继续优先使用稳定的 targeted test、项目构建和相邻 smoke test 组合验证
- 多目标框架 warning 解释风险:同一源位置会在多个 target framework 下重复计数
@@ -86,11 +89,16 @@
- `RP-008` 的策略基线:
- 当前 `GFramework.Core` 剩余 warning 分布:`MA0048=8`、`MA0046=6`、`MA0016=5`、`MA0002=2`、`MA0015=1`、`MA0077=1`
- 后续批处理规则:优先按类型推进;若当轮主类型数量不足,可顺手吸收其他低冲突类型,不限定于 `MA0015` 与 `MA0077`
+- `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 Passed`,`0 Failed`
- active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史
## 下一步
1. 若要继续该主题,先读 active tracking,再按需展开历史归档中的 warning 热点与验证记录
-2. 下一轮优先以 `MA0048` 为主批次启动;若改动规模和风险允许,可顺手并入其他低冲突类型,而不限定于单独的尾项 warning
-3. 若 `MA0048` 的文件 ownership 可以清晰切分,允许使用不同模型的 subagent 并行处理互不冲突的目录或类型簇
+2. 下一轮优先以 `MA0046` 为主批次启动,先从 `Architecture*` 与 `CoroutineScheduler` 的低风险 delegate 形状修正中选一个切入点
+3. 若 `MA0046` 的文件 ownership 可以清晰切分,允许使用不同模型的 subagent 并行处理互不冲突的目录或类型簇
4. 若本主题确认暂缓,可保持当前归档状态,不需要再恢复 `local-plan/`
diff --git a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md
index 188e0c0c..54e82d98 100644
--- a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md
+++ b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md
@@ -1,5 +1,30 @@
# Analyzer Warning Reduction 追踪
+## 2026-04-21 — RP-009
+
+### 阶段:`MA0048` 批次收口(RP-009)
+
+- 依据 `RP-008` 的批处理策略,本轮继续从 `GFramework.Core` 的 `MA0048` 启动,但不采用重命名公共类型的高风险做法;
+ 改为把同名不同泛型 arity 的家族收拢到与类型名一致的单文件中
+- 具体调整:
+ - 将 `AbstractCommand` 与 `AbstractCommand` 合并进 `AbstractCommand.cs`
+ - 将 `AbstractAsyncCommand` 与 `AbstractAsyncCommand` 合并进 `AbstractAsyncCommand.cs`
+ - 将 `AbstractQuery` 合并进 `AbstractQuery.cs`
+ - 将 `AbstractAsyncQuery` 合并进 `AbstractAsyncQuery.cs`
+ - 将泛型 `Event` / `Event` 从 `EasyEventGeneric.cs` 迁移到 `Event.cs`
+- 首次构建暴露出合并后的 `ICommand` / `IQuery` 命名空间歧义;随后改用
+ `GFramework.Core.Abstractions.*` 的限定名完成最小修正,没有引入行为改动
+- 定向验证通过:
+ - `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)`;`MA0048` 已从当前 `GFramework.Core` `net8.0` warnings-only 基线中清空
+ - `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 Passed`,`0 Failed`
+- 当前建议的下一批次顺序更新为:
+ - 第一优先级:`MA0046`
+ - 第二优先级:`MA0016`
+ - 顺手吸收:`MA0015`、`MA0077`
+ - 单独评估:`MA0002`
+
## 2026-04-21 — RP-008
### 阶段:批处理策略切换(RP-008)