fix(growth): HIGH-3 FeedbackCollector 信任度持久化
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

根因: FeedbackCollector 用纯内存 HashMap 存储信任度记录,重启后归零。

修复:
- FeedbackCollector 添加 viking: Option<Arc<VikingAdapter>> 字段
- 添加 with_viking() 构造器
- 添加 save(): 遍历 trust_records → MemoryEntry → VikingAdapter 存储
- 添加 load(): find_by_prefix 反序列化回 HashMap
- EvolutionEngine::new()/from_experience_store() 传入 VikingAdapter
- submit_feedback() 改为 async,提交后自动调用 save()
- 添加 load_feedback() 供启动时恢复

测试: save_and_load_roundtrip + load_without_viking + save_without_viking
This commit is contained in:
iven
2026-04-18 23:03:31 +08:00
parent f358f14f12
commit 2c0602e0e6
2 changed files with 154 additions and 8 deletions

View File

@@ -49,8 +49,8 @@ pub struct EvolutionEngine {
impl EvolutionEngine {
pub fn new(viking: Arc<VikingAdapter>) -> Self {
Self {
viking,
feedback: FeedbackCollector::new(),
viking: viking.clone(),
feedback: FeedbackCollector::with_viking(viking),
config: EvolutionConfig::default(),
}
}
@@ -58,9 +58,10 @@ impl EvolutionEngine {
/// Backward-compatible constructor
/// 从 ExperienceStore 中提取共享的 VikingAdapter 实例
pub fn from_experience_store(experience_store: Arc<ExperienceStore>) -> Self {
let viking = experience_store.viking().clone();
Self {
viking: experience_store.viking().clone(),
feedback: FeedbackCollector::new(),
viking: viking.clone(),
feedback: FeedbackCollector::with_viking(viking),
config: EvolutionConfig::default(),
}
}
@@ -142,9 +143,14 @@ impl EvolutionEngine {
// 反馈闭环
// -----------------------------------------------------------------------
/// 提交反馈并获取信任度更新
pub fn submit_feedback(&mut self, entry: FeedbackEntry) -> TrustUpdate {
self.feedback.submit_feedback(entry)
/// 提交反馈并获取信任度更新,自动持久化
pub async fn submit_feedback(&mut self, entry: FeedbackEntry) -> TrustUpdate {
let update = self.feedback.submit_feedback(entry);
// 非阻塞持久化:失败仅打日志,不影响返回值
if let Err(e) = self.feedback.save().await {
tracing::warn!("[EvolutionEngine] Failed to persist trust records: {}", e);
}
update
}
/// 获取需要优化的进化产物
@@ -178,6 +184,14 @@ impl EvolutionEngine {
pub fn feedback(&self) -> &FeedbackCollector {
&self.feedback
}
/// 启动时加载已持久化的信任度记录
pub async fn load_feedback(&mut self) -> Result<usize> {
self.feedback
.load()
.await
.map_err(|e| zclaw_types::ZclawError::Internal(e))
}
}
#[cfg(test)]