Skip to content

memos-local-plugin: 技能归档(archived)状态从未被触发 #2144

Description

@zenthos-z

现象

MemOS Local Plugin(v2.0.10 / OpenClaw)运行数月,memos_skill_list 查询显示 178 个技能中 0 个 archived(全部停留在 active 或 candidate 状态),归档状态从未被触发过。

排查发现

跟踪了 core/skill/lifecycle.tscore/skill/subscriber.ts,发现三个相互叠加的条件导致归档链路不通:

1. shouldArchiveIdle 定义了但未被调用

lifecycle.ts:192shouldArchiveIdle 函数——根据 idle 时间和 η 判定 active 技能是否应归档——在整个代码库中没有被 import 或调用subscriber.ts 只 import 了 shouldPromoteCandidate,完全忽略了旁边的 shouldArchiveIdle

2. lifecycleTick 只在 shutdown 时执行

调用了 lifecycleTick 的唯一路径是 orchestrator.flush()subs.skills.lifecycleTick(),而 flush() 只在 shutdown() 时触发。整个运行期间没有定时器、没有 turn 级别钩子驱动它。

也就是说即使 shouldArchiveIdle 被接入了,它也只在 Gateway 进程退出时才跑一次。

3. 默认阈值临界相等

defaults.ts 中:

archiveEta: 0.1              // η < 0.1 才归档
minEtaForRetrieval: 0.1     // 初始 η 地板

recomputeEta 中新建技能时 eta = clamp01(Math.max(minEtaForRetrieval, policyGain)),即初始 η ≥ 0.1。归档判定 eta < archiveEta严格小于,导致 0.1 < 0.1 = false —— 初始 η 恰好卡在阈值外。

合起来的效果

  1. shouldArchiveIdle 有出口无调用(死代码)
  2. 唯一的 lifecycle 扫描只在进程退出时跑
  3. 即使 feedback 路径(trial/user/reward)触发了 η 计算,初始 η ≥ 0.1 也让技能刚好避开归档阈值

三个条件叠加,导致 178 个技能运行数月无一归档。

环境

  • 插件: @memtensor/memos-local-plugin@2.0.10
  • 宿主: OpenClaw
  • 线程: apps/memos-local-plugin/core/skill/subscriber.ts / lifecycle.ts / orchestrator.ts

Metadata

Metadata

Labels

area:pluginOpenClaw & Hermesstatus:needs-triageNeeds initial triage | 需要初步判断 & 问题复现

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions