Session memory extraction deletes non-root memory files (entities/preferences/experiences) without type whitelist — memory_diff.json evidence, 148 deletions / 116 files lost over a month

Open
#7,504 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
42/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
python
Domain
backend, databases

Research direction

Start by tracing MemoryUpdater._apply_delete to viking_fs.rm and compare that path with #7101's root-page protection and #7099. Then inspect how session extraction supplies delete_ids and how MemoryUpdater.apply_operations is shared with compile memory. Define and test the requested type-level deletion policy, global or account-level deletion switch, and deletion audit; done means non-root memory deletion is protected by default and deletion attempts are recorded.

Written by the indexing model from the issue text.

Description

EN TL;DR: Session-commit memory extraction feeds model-generated delete_ids straight into MemoryUpdater._apply_delete → viking_fs.rm with no memory-type whitelist and no accounting (compile bills show deletes=[], journal silent). Beyond #7099's root memory files, this hits entities / preferences / experiences / cases / peers files. We hold three matching memory_diff.json delete records for one file that silently vanished 3× in 2 hours, plus a full ledger: 148 delete records since Oct 10, 116 URIs still missing on disk (incl. memories/profile.md, deleted 6×).


环境

openviking 0.5.4.1(PyPI,uv tool 安装,systemd 托管),自 0.5.3 原地升级;单 account 单 user,无第三方插件改动存储层。server.observability.traces 事发时为默认关闭(现已开启 local)。

缺陷与定性

session 记忆抽取(含 MCP 会话记录的抽取)中,模型输出的 delete_ids 被直接送入 MemoryUpdater._apply_delete → viking_fs.rm 落盘:

  • 无记忆类型白名单——不仅 root memory files,entities / preferences / experiences / cases / peers 各区文件均可被删(_apply_delete 不区分类型);
  • 无账——删除不进任何任务账单(compile bill deletes=[])、不进 journal(删除相关日志走 tracer.info 仅入 OTel span,trace_console=False 时不落 logger)。

与 #7099 为同一缺陷路径;#7101 只保护三个根页,不覆盖本场景。

直接证据:同一文件三次消失 ↔ 三张删除记录

同一张 entities 卡在约 2 小时内三次静默消失。事后在 session 归档 memory_diff.json 的 operations.deletes[] 中找到三次一一对应的删除记录(URI 一字不差,deleted_content 全文俱在,可提供原始 JSON):

次 删除记录(归档 / 条目) 记录时间 发现缺失
1 sessions/zc-sess_<sid>/history/archive_015/memory_diff.json deletes[0] 11-11 22:37 22:50–22:52
2 sessions/mcp-store-<sid>/history/archive_001/memory_diff.json deletes[0](MCP 调用记录会话的抽取) 11-11 23:09 23:26
3 sessions/zc-sess_<sid>/history/archive_023/memory_diff.json deletes[2] 11-11 23:28 00:12
记录 1(archive_015 deletes[0],memory_type=entities)
{"uri": "viking://user/<uid>/memories/entities/<dir>/openviking_rules_机制要点.md", "memory_type": "entities", "deleted_content": "# OpenViking Rules 机制要点\nOpenViking Rules 官方机制要点(2026-10-27 整理)。\n\n- 定位与官方边界\n- Rules 是第四类上下文(Resource/Memory/Skill/Rule),0.5.3 版本 Beta。……(约 3.9K 字符:编译管线、存储与生命周期、检索与判定、Beta 边界、十问核实补记;全文与原始 JSON 可提供)"}
记录 2(mcp-store-<sid>/archive_001 deletes[0],memory_type=entities)
{"uri": "viking://user/<uid>/memories/entities/<dir>/openviking_rules_机制要点.md", "memory_type": "entities", "deleted_content": "# OpenViking Rules 机制要点\n……(同卡较新版本,约 5.3K 字符,含官方核实版增量章节;全文与原始 JSON 可提供)"}
记录 3(archive_023 deletes[2],memory_type=unknown)
{"uri": "viking://user/<uid>/memories/entities/<dir>/openviking_rules_机制要点.md", "memory_type": "unknown", "deleted_content": "# OpenViking Rules 机制要点\nOpenViking Rules 官方机制要点(2026-10-27 整理;2026-11-11 两度被 compile 活动期静默删除后第三次恢复,防丢哨已挂)。\n……(第三次恢复版全文约 3.8K 字符——被删时卡正文里正记录着前两次消失事件;全文与原始 JSON 可提供)"}

注:记录 3 的 memory_type 为 unknown;同批 deletes 还包含 memories/profile.md 与另一张 entities 卡。

三次事件时间线(本地时间 2026-11-11 晚)

次 最后确认在位 发现缺失 窗口内活动
1 22:44(snapshot 锚收录) 22:50–22:52(MCP edit 报 File not found;find 全库零命中) 22:42 session commit;22:44 / 22:46 compile memory 两单(账单 deletes 全空);journal 显示 memory_updater 22:53:46、22:57:49 两次触达该卡
2 23:04 写回恢复+23:20 锚 23:26(目录对账 22→21 张) 23:10–23:17 rules compile 8 单;memory_updater 23:20:31 触达该卡
3 23:59:30(该卡最后一次成功写回,memory_updater 同秒重嵌) 00:12(MCP 调用报 File not found;stat/head 坐实不存在) 3 次 session commit(00:00:01 / 00:00:54 / 00:03:17);无任何 compile

影响面(超出 #7099 的 root memory files)

全量扫描所有 session 归档的 memory_diff.json:自 10-10 起共 148 条删除记录;其中 125 条对应的文件当前仍缺失(116 个唯一 URI)。分桶:entities 46、peers 区 27、experiences 25、preferences 13、cases 3、memories/profile.md 1(被删 6 次)、第三方 peer 区 1。包含用户实际工作数据。向量/目录索引仍列着缺失文件,召回即 404。 另:10-14 profile / identity / soul 三页集体消失的旧案,在台账中同样有对应删除记录——同源。完整 125 条清单见文末附件。

已排除的其他解释

  • 外部 API 删除:_system/usage_audit/usage_audit.sqlite3(request_audit 表)全表仅 2 条 DELETE(均为事发前本人冒烟测试),三个窗口 0 条删除请求;
  • MCP forget:全部归档 0 次 forget 工具调用(仅 1 处正文提及);
  • 本侧定时任务:crontab 仅 3 个任务(只读监控+快照锚),无删除逻辑;
  • journal 无删除行:deleted_uris / Memory operations applied 走 tracer.info 仅入 OTel span——日志设计使然,非部署异常(已开启 local traces 补此盲区)。

配置对照(预先说明:非自配触发)

对照 0.5.4.1 源码默认值,与删除路径相关的配置差异如下——核心结论:entities/preferences 类删除在官方默认配置下同样会发生:

配置 官方默认 本环境 与删除路径的关系
memory.extraction_enabled true(默认开启) 事发后已改 false 止血 session 抽取总闸,默认即在运行
抽取类型范围 9 类 − {cases, experiences, trajectories}(agent_evolution 默认 false 时被 AGENT_EVOLUTION_MEMORY_TYPES 扣除) 全 9 类(agent_evolution=true) entities / preferences / profile 本就在默认范围内;非默认项只放大了 experiences/cases 的暴露面
extraction_output_format "python"(DSL) "json"(legacy) 与删除无关:python_protocol.py 同样产生 delete_ids(DSL delete() 映射为 delete_ids)
memory_policy / session_auto_commit 未配置 / false 九类全集 / true 与默认等效 / 仅影响自动提交频率

诉求

  1. 全类型删除保护:将 #7101 的根页保护推广为类型级 allow_delete(默认禁删 entities / preferences / experiences 等非 root 类型);
  2. 全局 / account 级"只增不删"开关:session 抽取与 compile memory 共用 MemoryUpdater.apply_operations,需要一个不改代码即可关闭删除能力的配置;
  3. 删除独立审计:抽取删除至少落入任务账单(compile bill deletes)或独立审计事件,保证事后可溯源。

(临时止血已在做:account 级 memory.extraction_enabled=false 关闭抽取+每半小时文件存在性哨兵+每小时快照锚。)

现场保全(可配合核验)

  • 快照锚:5475b3af / 07cc0489 / edd777aa / a18dcff8
  • 相关任务:69a456bf-76ee-4ed4-aa84-d3378d3d4c7f、cfa6d35d-7069-4f00-9505-be4332d5ab16、rules compile 八单 rul_7e559f73…–rul_03ed0b55…
  • 全量 tar 备份、三张删除记录原始 JSON、148 条台账均在案

Related: #7099(同一缺陷路径的首报,root memory files)、#7101(根页保护,不覆盖本场景)


附件:现仍缺失的 125 条删除记录明细(116 个唯一 URI;删除时间|来源归档)
URI 时间 来源归档
memories/cases/a门v2分三段直贴复核.md 10-28 20:46 zc-session_8635…/archive_010
memories/cases/dsh现状调研.md 10-18 12:53 dsh-session-…/archive_001
memories/cases/八路分区会审.md 11-09 22:23 zc-sess_db98…/archive_065
memories/entities/api 密钥/internlm_api_keys.md 10-22 11:05 zc-session_3fa9…/archive_001
memories/entities/none/none.md 11-07 05:24 zc-sess_db98…/archive_039
memories/entities/wiki问答/wiki_qa_ten_questions.md 10-28 23:55 zc-session_652c…/archive_008
memories/entities/人物/王丽萍.md 11-08 12:36 zc-sess_1f43…/archive_005
memories/entities/人物/胡萍.md 10-26 09:56 zc-session_5870…/archive_003
memories/entities/任务/Obsidian_硅基流动向量集成.md 10-27 11:52 zc-session_bab0…/archive_003
memories/entities/任务/compshare与h3出片.md 10-10 19:40 mcp-store-8e89…/archive_001
memories/entities/任务/授权复审与内容闸隔离.md 11-09 22:23 zc-sess_db98…/archive_065
memories/entities/任务/日常照片归档.md 11-06 21:51 zc-sess_db98…/archive_005
memories/entities/任务/照片识图对账与降耗机制.md 11-09 22:23 zc-sess_db98…/archive_065
memories/entities/任务/照片识图整理方案定稿(图片复审收口).md 11-09 22:23 zc-sess_db98…/archive_065
memories/entities/任务/识图任务执行管线.md 11-07 12:28 mcp-store-efb1…/archive_001
memories/entities/功能/编译引擎.md 11-11 23:28 zc-sess_5cdc…/archive_023
memories/entities/地点/三湖管理区.md 10-26 09:56 zc-session_5870…/archive_003
memories/entities/地点/江陵县.md 10-26 09:56 zc-session_5870…/archive_003
memories/entities/地点/荆州市.md 10-26 09:56 zc-session_5870…/archive_003
memories/entities/定时任务/ov-kdistill-daily.md 11-02 11:17 zc-session_5d2d…/archive_004
memories/entities/定时任务/蒸馏任务.md 10-14 00:26 zc-sess_2d8d…/archive_012
memories/entities/工作/20261030党代会分团讨论条稿件.md 11-01 12:06 zc-session_26a8…/archive_034
memories/entities/工作/20261030党代表采访名单与提示.md 11-10 10:19 zc-sess_f2b9…/archive_001(×2 条)
memories/entities/工作/20261108政协采访名单v6.md 11-09 10:46 zc-sess_1f43…/archive_014
memories/entities/工作/20261110人大八届一次会议采访名单.md 11-11 14:15 zc-sess_1f43…/archive_059
memories/entities/工作/OpenViking班次总表.md 11-02 11:58 zc-session_5d2d…/archive_005
memories/entities/工作/电视新闻工作.md 11-02 22:55 zc-sess_5f8d…/archive_003
memories/entities/工具/openviking embedding 讯飞4096切换.md 10-27 18:18 zc-session_53d8…/archive_014
memories/entities/工具链/openviking.md 10-10 19:41 zc-sess_6413…/archive_001
memories/entities/工具链/openviking_053改造清单.md 11-03 08:44 zc-sess_da7c…/archive_004
memories/entities/工具链/vault记忆层.md 10-10 19:41 zc-sess_a878…/archive_008
memories/entities/工具链/电脑环境.md 10-13 07:02 mcp-store-117d…/archive_001
memories/entities/待办/夜间监测汇总与四项拍板.md 10-28 18:50 zc-session_8635…/archive_004
memories/entities/文档/官方渠道三轮问答实录.md 10-27 03:08 zc-session_9c53…/archive_002
memories/entities/服务器/500w台式机.md 11-02 22:49 zc-sess_bb92…/archive_007
memories/entities/服务器/deepseek应急渠道.md 10-20 23:20 zc-session_7cae…/archive_002
memories/entities/服务器/openviking_官方版本线.md 10-28 23:45 zc-session_be47…/archive_009
memories/entities/服务器/家里_openviking_服务器.md 11-02 22:49 zc-sess_bb92…/archive_007
memories/entities/服务器/记忆服务器已知坑.md 10-10 19:41 / 10-14 00:26 zc-sess_6413…/archive_001;zc-sess_2d8d…/archive_012
memories/entities/服务器/记忆服务器模型链.md 11-02 11:17 zc-session_5d2d…/archive_004
memories/entities/服务器组件族/openviking_0.5.1_编译架构变更与书生渠道组合病.md 10-25 08:34 zc-session_7326…/archive_013
memories/entities/服务器组件族/升级资产清单族.md 10-25 23:54 zc-session_db6e…/archive_045
memories/entities/看板/在制任务看板-基础设施-日报编译修复.md 10-26 00:53 zc-session_7326…/archive_054
memories/entities/看板/在制任务看板-基础设施-服务器与账号.md 11-02 22:45 zc-sess_bb92…/archive_006
memories/entities/看板/在制任务看板-基础设施-模型链与定时.md 10-13 11:35 zc-sess_56ad…/archive_003
memories/entities/看板/在制任务看板-基础设施-记忆治理.md 10-28 18:13 zc-session_8635…/archive_001
memories/entities/网络拓扑/home_network.md 11-12 00:15 zc-sess_bbf4…/archive_001
memories/entities/记忆治理/记忆治理10-20失败单与issue.md 11-07 12:24 mcp-store-aeae…/archive_001
memories/entities/镜像/机智罗_jzl_导演台_v8.2.md 11-05 19:19 zc-sess_2e1c…/archive_022
memories/experiences/(25 张:API_key安全加载与预检 / API_故障分层排查法 / OV_embedding维度_Ollama表qwen3写错 / openviking升级前官方信息自查 / ov_compile_日报须归档_staging_化 / ui搜索范围实测结案 / 主线主卡制合并判据 / 免费api密钥验通 / 冲突合并留证补丁建议 / 可读性评估流程 / 合并冲突拒写复现 / 备用渠道创建与路由验证 / 备用渠道路由验证 / 官方cron入口修复确认 / 工作区钩子信任重授 / 整体逻辑验证账交付 / 服务器升级前置核查 / 检索漏项补正 / 生产补丁原文审后定案 / 组件版本更新分层详解 / 补丁版本错配归因 / 记忆卡终局回写 / 评审结论归档追加 / 长卡覆盖丢失诊断与限额变更决策 / 项目记忆卡清单更新) 10-22–11-02 多个归档
memories/preferences/zheng/(7 张:任务执行顺序与质检偏好 / 创作线细则 / 执行规矩 / 新闻稿数据口径 / 本地记忆执行纪律 / 盒子服务器关机操作流程 / 记忆库写入规范 / 魔搭账号管理) 10-10–11-11 多个归档
memories/preferences/郑先生/(5 张:新闻稿栏目模板写作 / 新闻类产出落点 / 盒子_sudo_使用偏好 / 记忆系统分工 / 采访提纲与名单整理偏好) 10-10–11-11 多个归档
memories/profile.md 10-10 / 10-14 / 10-25 / 10-27 / 11-06 / 11-11(共 6 次) 六个不同归档
peers/<peer>/memories/(27 张:entities 人物·任务·地点·定时任务·工具·工具链·服务器·看板·网络·资产·风险防护 等 + identity.md + soul.md×2 + preferences 4 张) 10-10–11-12 多个归档
peers/<peer-org>/memories/entities/工具/ov-taskdoctor.md 10-10 19:41 zc-sess_68a7…/archive_030

("多个归档"分组的逐条时间/来源明细、以及三张删除记录的完整原始 JSON,均可按需提供。)

Dominant language
Python
Stars
41.8k
Forks
3.4k
Avg merge
19h 29m
Merged PRs (30d)
500

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from volcengine/OpenViking

All issues in volcengine/OpenViking

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.