现象
MemOS Local Plugin(v2.0.10 / OpenClaw)运行数月,memos_skill_list 查询显示 178 个技能中 0 个 archived(全部停留在 active 或 candidate 状态),归档状态从未被触发过。
排查发现
跟踪了 core/skill/lifecycle.ts 和 core/skill/subscriber.ts,发现三个相互叠加的条件导致归档链路不通:
1. shouldArchiveIdle 定义了但未被调用
lifecycle.ts:192 的 shouldArchiveIdle 函数——根据 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 —— 初始 η 恰好卡在阈值外。
合起来的效果
shouldArchiveIdle 有出口无调用(死代码)
- 唯一的 lifecycle 扫描只在进程退出时跑
- 即使 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
现象
MemOS Local Plugin(v2.0.10 / OpenClaw)运行数月,
memos_skill_list查询显示 178 个技能中 0 个 archived(全部停留在 active 或 candidate 状态),归档状态从未被触发过。排查发现
跟踪了
core/skill/lifecycle.ts和core/skill/subscriber.ts,发现三个相互叠加的条件导致归档链路不通:1.
shouldArchiveIdle定义了但未被调用lifecycle.ts:192的shouldArchiveIdle函数——根据 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中:而
recomputeEta中新建技能时eta = clamp01(Math.max(minEtaForRetrieval, policyGain)),即初始 η ≥ 0.1。归档判定eta < archiveEta是严格小于,导致 0.1 < 0.1 = false —— 初始 η 恰好卡在阈值外。合起来的效果
shouldArchiveIdle有出口无调用(死代码)三个条件叠加,导致 178 个技能运行数月无一归档。
环境
@memtensor/memos-local-plugin@2.0.10apps/memos-local-plugin/core/skill/subscriber.ts/lifecycle.ts/orchestrator.ts