aresrecovery
Production
internal/aresrecovery 包(package aresrecovery)实现了 ARES Kernel Recovery
子系统(docs/zh/architecture/ares-runtime.md 的 P5):独立负责在 Agent 崩溃后保持
持久化任务存活。
设计不变量(ares-runtime.md §13):
- Agent 是可丢弃的,Task 是持久化的 — Agent 死亡 ≠ Task 死亡。
- Recovery 与 Chaos(故障注入)是独立的职责:Chaos 故意破坏;Recovery 证明运行时 能够存活。
Recovery 子系统编排了三种故障路径:
- 租约过期 → 重排:已死 Agent 的租约过期后,任务回到
READY状态,等待另一个 Agent 获取(Task Fabric)。 - 检查点恢复:通过新 Agent 恢复任务保存的检查点(Task Fabric + Agent Fabric
CognitiveState)。 - Agent 重启:用新 Agent 替换崩溃的 Agent,新 Agent 承接死亡 Agent 的认知检查点
(Agent Fabric
Recover)。
职责
- 将 Task Fabric(持久化任务 + 租约过期 + 检查点)与 Agent Fabric(可丢弃 Agent + 认知状态)串联,使 Agent 死亡后依次执行任务重排、检查点恢复和 Agent 替换。
- 通过
RequeueExpiredLeases扫描 Task Fabric 中已过期的租约,将对应任务重排至READY状态(故障路径 1)。 - 通过
RecoverTaskCheckpoint用新 Agent 恢复任务保存的检查点:生成或复用替换 Agent, 获取任务,并将检查点安装为新 Agent 的认知状态(故障路径 2)。 - 通过
RestartAgent用新 Agent 替换崩溃的 Agent:生成一个具备死亡 Agent 能力的 替换 Agent,并安装保存的认知状态,受重启预算约束(故障路径 3)。 - 通过指数退避执行重启预算(
RestartPolicy):MaxRestarts次尝试,Backoff初始 延迟每次翻倍(上限MaxBackoff)。 - 提供
EvolutionAwareSpawner集成点(v0.4.0 M2-1):接入后,每次替换生成都通过该 生成器路由,使进化策略(Enabled/MaxConcurrent/PreferredCapabilities) 塑造重启和检查点恢复 — “进化决策,内核执行”。恢复生成绕过人口上限 (SpawnForRecovery),确保自愈生成不会被MaxConcurrent阻塞。 - 暴露
RecoverFromAgentDeath作为完整的恢复链:扫描过期租约 → 重排任务 → 用新 替换 Agent 恢复每个重排任务的检查点(P5 验收路径)。
架构
flowchart TD
AD["Agent 死亡"] --> LE["Task Fabric<br/>租约过期"]
LE --> RQ["RequeueExpiredLeases<br/>Task → READY"]
RQ --> ACQ["Acquire(task, agent)<br/>新租约纪元"]
RD["Agent 死亡"] --> CP["检查点已保存"]
CP --> RC["RecoverTaskCheckpoint<br/>生成替换 → Acquire → 安装检查点"]
RC --> CS["Agent CognitiveState = 检查点"]
RD["Agent 死亡"] --> CG["CognitiveState 已保存"]
CG --> RA["RestartAgent<br/>检查重启预算 → 生成替换 → 恢复认知"]
RA --> RB{"RestartCount < MaxRestarts?"}
RB -- 是 --> SP["spawnAgent<br/>EvolutionAwareSpawner.SpawnForRecovery"]
RB -- 否 --> EX["ErrRecoveryExhausted"]
SP --> RP["替换 Agent<br/>带有死亡 Agent 的认知状态"]
FC["RecoverFromAgentDeath<br/>完整链"] --> RQ
FC --> RC
CH["Chaos<br/>故障注入"] --> AD
EV["进化<br/>M2-1 策略"] --> SP
外部接口
package aresrecovery
// --- Recovery ---
type Recovery struct {
// tasks *taskfabric.Fabric
// agents *agentfabric.Fabric
// spawner *EvolutionAwareSpawner
// policy RestartPolicy
// mu sync.Mutex
// restarts map[string]int
// now func() time.Time
}
func New(tasks *taskfabric.Fabric, agents *agentfabric.Fabric, policy RestartPolicy) *Recovery
func (r *Recovery) WithClock(now func() time.Time) *Recovery
func (r *Recovery) WithSpawner(s *EvolutionAwareSpawner) *Recovery
func (r *Recovery) RequeueExpiredLeases() []string
func (r *Recovery) RecoverTaskCheckpoint(ctx context.Context, taskID, replacementID string) (string, uint64, error)
func (r *Recovery) RestartAgent(ctx context.Context, deadAgentID string, cognitive agentfabric.CognitiveState, capabilities []string) (*agentfabric.Agent, error)
func (r *Recovery) RestartCount(agentID string) int
func (r *Recovery) RecoverFromAgentDeath(ctx context.Context) int
// --- RestartPolicy ---
type RestartPolicy struct {
MaxRestarts int
Backoff time.Duration
MaxBackoff time.Duration
}
func DefaultRestartPolicy() RestartPolicy
// --- EvolutionAwareSpawner (v0.4.0 M2-1) ---
type SpawnPolicy struct {
Enabled bool
MaxConcurrent int
PreferredCapabilities []string
}
type SpawnPolicySource interface {
ActiveSpawnPolicy(ctx context.Context) (SpawnPolicy, error)
}
type EvolutionAwareSpawner struct {
// agents *agentfabric.Fabric
// source SpawnPolicySource
}
func NewEvolutionAwareSpawner(agents *agentfabric.Fabric, source SpawnPolicySource) *EvolutionAwareSpawner
func (s *EvolutionAwareSpawner) Spawn(ctx context.Context, spec agentfabric.SpawnSpec) (*agentfabric.Agent, error)
func (s *EvolutionAwareSpawner) SpawnForRecovery(ctx context.Context, spec agentfabric.SpawnSpec) (*agentfabric.Agent, error)
// --- Sentinel errors ---
var ErrRecoveryExhausted = errors.New("aresrecovery: restart budget exhausted")
var ErrSpawnDisabled = errors.New("aresrecovery: evolution disabled spawning")
var ErrSpawnLimitReached = errors.New("aresrecovery: evolution spawn limit reached")
关键类型与方法
| 类型 / 方法 | 用途 |
|---|---|
Recovery | 编排内核的故障恢复路径 — 将 Task Fabric 与 Agent Fabric 串联,使 Agent 死亡后依次执行任务重排 + 检查点恢复 + Agent 替换。 |
New | 将 Recovery 子系统连接到 Task 和 Agent Fabric,并指定 RestartPolicy;零值回退到 DefaultRestartPolicy。 |
WithClock | 注入可控时钟,用于确定性测试。 |
WithSpawner | 注入进化感知生成门控,使进化策略塑造重启和恢复生成(v0.4.0 M2-1)。 |
RequeueExpiredLeases | 扫描 Task Fabric 中已过期的租约,返回重排队的任务 ID(故障路径 1)。 |
RecoverTaskCheckpoint | 用新 Agent 恢复任务的保存检查点 — 生成替换 Agent,获取任务,并将检查点安装为认知状态。返回替换 Agent ID 和新租约纪元( fencing token)。 |
RestartAgent | 用新 Agent 替换崩溃的 Agent,新 Agent 承接死亡 Agent 的认知检查点;检查重启预算,生成替换,调用 Recover。预算耗尽时返回 ErrRecoveryExhausted。 |
RestartCount | 返回 Agent 已被重启的次数。 |
RecoverFromAgentDeath | 完整恢复链:扫描过期租约,重排任务,用新替换 Agent 恢复每个重排任务的检查点。 |
RestartPolicy / DefaultRestartPolicy | 约束 Agent 重启尝试次数:MaxRestarts=5,Backoff=1s,MaxBackoff=30s 作为生产默认值。 |
EvolutionAwareSpawner | 进化感知生成门控,在生成前咨询 SpawnPolicySource;Spawn 强制执行 Enabled 门控和 MaxConcurrent 配额,SpawnForRecovery 仅绕过配额(绝不绕过 Enabled 门控)。 |
模块协作
aresrecovery->internal/fabric/task(经tasks *taskfabric.Fabric;导入路径internal/fabric/task):通过CheckExpiredLeases扫描过期租约,为替换 Agent 获取任务,读取保存的检查点。RequeueExpiredLeases返回重排队的任务 ID([]string)。aresrecovery->internal/fabric/agent(经agents *agentfabric.Fabric;导入路径internal/fabric/agent):生成替换 Agent,通过SetCognitiveState和Recover安装认知状态。aresrecovery->internal/ares_evolution(经SpawnPolicySource,该接口在 aresrecovery 中定义、由进化系统实现 — aresrecovery 从不导入进化包):进化策略(SpawnPolicy)塑造重启和恢复生成;SpawnForRecovery仅绕过人口配额。aresrecovery->internal/kernel(System Runtime 控制面):Recovery 子系统经Orchestrator.Adopt注册为组件,由 Orchestrator 停机;接线在cmd/ares/kernel.go与internal/ares_bootstrap/system_runtime_wiring.go。
扩展点
- 接入进化感知生成门控:通过
Recovery.WithSpawner(spawner)使进化策略(Enabled/MaxConcurrent/PreferredCapabilities)塑造重启和检查点恢复。恢复生成始终使用SpawnForRecovery— 绕过人口上限,确保自愈生成不会被MaxConcurrent阻塞。 - 自定义重启策略:向
New传递非默认的RestartPolicy;调整MaxRestarts、Backoff和MaxBackoff以适应运维需求。 - 注入确定性时钟:通过
Recovery.WithClock(now)实现重启顺序和退避定时的封闭测试。 - 验证完整恢复链:调用
RecoverFromAgentDeath— 扫描过期租约,重排任务,用新替换 Agent 恢复每个检查点(P5 验收路径)。 - 监控恢复可观测性:读取
RestartCount(agentID)跟踪每个 Agent 的重启尝试次数,检测预算耗尽。
双语状态
本页为中文翻译。英文参考以相同结构和内容发布为 aresrecovery.en.md。所有代码标识符、类型名和签名在两种语言中都保持英文;仅散文部分不同。
成熟度
Production。该包包含单元测试,实现了带有重启预算执行、进化感知生成门控和完整 RecoverFromAgentDeath 链的 Kernel Recovery 子系统(P5)。它与 Task Fabric、Agent Fabric 和 Evolution 子系统集成,且无实验性标记。
策略分数写回(零-LLM 反馈闭环)
ScoredFeedbackAdapter.Apply 用 DeterministicScorer 从执行归因聚合分数,
经 StrategyScoreAdapter.WriteActiveScore → StrategyStore 写回活跃策略。写回
需要存在活跃策略——bootstrap 会向空 store 播种 bootstrap-root;缺播种时每次
写回报 “no active strategy”,GA 无证据可学。该 adapter 不改变哪个策略处于
活跃状态,只原地更新 Score 字段。