modusensus / modusensus/dsh-mneme
[Feature Request] scope 标注缺人工入口与提升回路:自动载体标签不该直接吃硬过滤效力
- Dominant language
- JavaScript
- Stars
- 100
- Forks
- 11
- Avg merge
- 1h 20m
- Merged PRs (30d)
- 116
Description
## 背景与使用场景
我是 #17 的提案作者。日常形态就是 #17 的场景 1 + 场景 2:多个 preset(编码 / 写作 / …)× 多个互不相关的 workspace,mneme 0.8.0。
当前版本落地后我把实现逐条对了一遍(对照 #17 的规格),有两个风险想提出来对齐——**都是我自己在 #17 里没说清楚、被实现放大之后才看出来的**:
1. agent 维的自动标注范围过宽:它把"这条共享给谁"当成了"写入会话的身份快照",于是绝大多数本应全局的记忆被自动归属;
2. `strictScope` 打开之后,错标的记忆缺少纠偏路径——既没有人工改 scope 的入口,也没有能发现"这条其实该全局"的机制。
## 已查现状
CHANGELOG 0.8.0、README、面板设置页、#153 / #155 / #156 / #157 / #163,以及已关闭的 #17。确认 `scopeEnabled` / `strictScope` 默认关;也确认**当前不存在任何手动改 scope 的入口**(不是没找到开关,是逐条 grep 过)。
环境:`@modusensus/dsh-mneme@0.8.0`(desktop profile 实际安装版本)、Windows、DSH Desktop。
## 一、现状核对(v0.8.0 / `b852323`)
1. **两维都只有"写入载体"一个来源,没有人工入口。** `memory_save` 参数 = type / title / content / tags / importance / source / sensitivity / occurred_at,`memory_update` 参数 = id / title / content / type / tags / importance / reason——两处都没有 scope;`agent_scope` / `workspace_scope` 在 tools.js 里只出现在输出 item schema;面板只有 `group.scope = [scopeEnabled, strictScope]` 两个开关加只读展示;全 `src/` 搜索 `promote|scope_set|setScope` 无命中,即没有任何修改 scope 的代码路径。
2. **自动标注的键 = 写入会话的 preset 快照**(`scopeEnabled` 关时一个字段都不标)。
3. **A2 是 OR + 写死系数,A3 是 fail-closed 且两维同构。** 本会话命中行与未标注行同为 ×1.25,只有确立 foreign 才 ×0.5 → 实际落差 2.5 倍;且 agent 维能单独把 workspace 完全命中的记忆罚到 0.5。A3 下当前会话某维解析不到,该维度带标注的记忆一律不可见。
| 内容 | 位置 |
|---|---|
| `memory_save` / `memory_update` 参数 | `src/tools.js:85-94` / `:282-289` |
| scope 仅出现在输出 schema | `src/tools.js:30-33` |
| 面板开关组 / 详情只读行 | `lib/client.js:1737` / `:125-126`、`:3282-3285` |
| 自动标注来源(preset 快照) | `src/scope.js:33-34`、`:55-57` |
| A2 系数与 scope 乘数 | `src/service.js:56-57`、`:64-72` |
| A3 谓词 / SQL 同口径 | `src/service.js:95-101`、`src/store.js:722-733`、`:1044-1060` |
对 #17 规格的差异(维护者在 #17 收尾也列过):`memory_save` 的 scope 枚举参数、`defaultMemoryScope` 配置、存量记忆的收窄 / 提升工具三项未随批次 A 落地。现在的形态是"每条写入都按载体自动归属 + 没有任何出口"。
## 二、问题 1:自动归属的范围过宽
四象限里 agent 维唯一不可替代的只有一格——**agent 专属 × workspace 全局**(跨项目能力库);其余三格 workspace 维都能表达("完全专属"也只是再加一道锁)。而自动标注对**每一条**写入都打 agent 标签,于是:一条通用偏好只要是在某个 preset 的会话里写下的,就永久带上了那个 preset 的身份。
用户无法表达"这条对所有 agent 都有效":唯一的办法是把 `scopeEnabled` 整个关掉,那会连 workspace 标注一起失去(两维共用一个开关)。我实际需要的形态正相反——**只有极少数记忆需要被显式收窄到某个 agent**,绝大多数应该是全局或项目级。
我仔细考虑了 agent scope 的作用,其实它更接近于 dsh 中 agent preset 的概念,本应是直接封在 preset 中的,我们这里其实相当于一个灵活的注入。那么如果这样考虑下去的话,它的作用面就很窄,只有极少数场景下才会真的需要将部分记忆与某个特定的 agent preset 绑定。
## 三、问题 2:strictScope 打开后,错标缺少纠偏路径
- 标签来源只有载体,A3 不区分"自动打的"与"显式声明的",自动标签直接吃硬效力;
- 没有任何工具能改 scope(save / update 都没有该参数,面板只读);
- `NULL` 兼任"未判定"与"全局",且没有 `scope_source` / `scope_decided_at` → 事后筛不出该复核的候选集;
- 维护面(dream / sleep)用 `store.all()` 绕过过滤(`src/store.js:1092-1093`,调用点 `dream.js:673/736/1093`、`dream/sleep.js:106/418`)——它们**看得见**跨 scope 的重复与通用内容,但这个信号不会交回给用户。
结果是:目录改名、中途换 preset、或某次身份解析取空(#163 就是这类),都会让一批记忆在检索与注入里消失,而界面上没有任何"它被 scope 挡住了"的提示——只有关掉开关才发现它们还在。
## 四、期望的行为变化(不指定实现)
1. **作用域可以显式声明**:写 / 改记忆时能指定或覆盖归属,至少能声明"这条对所有 agent 可见";面板能看到并修正单条记忆的 scope。自动标注保留为**默认候选值**即可,但不该是唯一来源。
2. **一条提升 / 纠偏回路**:能把已标错的记忆提升回全局(放宽可见性 = 需显式确认 + 审计),并且能被半自动地提示候选——例如 dream / sleep 阶段遇到跨 scope 高度相似、或明显通用的内容时列出来交用户裁决。维护面本来就有全量视图(`store.all()`)和全库向量配对(`sleep.js:97` `phaseConflicts`,阈值 `gentle 0.92 / normal 0.85 / aggressive 0.75`),"同一个教训在两个 scope 各写了一遍"正好是它的输入。
3. **区分"自动"与"显式"的效力**——这是我最想跟维护者对齐的一点:载体自动打的标签,是否应该在 `strictScope` 下直接等于硬墙?我的观点是自动标注只该提供软加权,硬过滤只认显式声明。
这几项原本就在 #17 的设计规格里(`memory_save` 的 scope 参数、`defaultMemoryScope`、存量记忆的收窄 / 提升工具),批次 A 未落地——本 issue 想请维护者把它们排进 v0.8.x。
## 五、开放问题
1. agent 维表达的是"身份"还是"受众(这条共享给谁)"?如果只有显式声明才作数,它的值不必等于 `agentPreset`(可以是 `coding` / `shared` / 某个项目名),`agentPreset` 只是默认候选值。看路线图里"跨 workspace 共享层",这似乎是同一件事,是否合并设计?
2. 是否考虑把 agent 维做成两档(标注只软降权、不进硬过滤),或给两维各自独立开关(现在是共用一个 `scopeEnabled`)?
3. 是否需要 `scope_source`(auto / explicit)+ `scope_decided_at`,作为"候选集筛选 + 提升审计"的底座?
---
说明:第一、三节引用的行号是 v0.8.0(`b852323`)源码核对结果;0.8.0 已在本机安装运行,但本轮**没有**开 `strictScope` 做长时间实测。"会消失多少条""体感如何"属于个人经验推断,具体情况可能取决于各人记忆库的标注分布,我这里没有量化数据。
Contributor guide
Assessment
This issue has not been assessed yet.