dsh-cross-memory:跨实例硬约束与记忆锚点修复

前言

在 DeepSeek Harness(DSH)里跑多个实例时,每个实例往往各自挂载 @a9i5k4/dsh-auto-memory,用户级记忆按 DSH_HOME 隔离。于是「哪些规则是所有实例都必须遵守的」没有单一真源:要么在每个实例的 MEMORY.md 里重复写,要么指望按需加载的 SKILL.md——前者在 auto-memory 的规则层里会被 200 字符截断,后者又不带「每轮必读」属性。

下面介绍维护者 ShukebtAb 发布的 dsh-cross-memory(GitHub:ShukebtAb/Dsh-Cross-Memory,社区目录:skillhub 条目)。它是 auto-memory 的增量插件,不替代本体、不改本体代码与数据,只补本体没有的两块能力:跨实例规则全文注入,以及记忆文件锚点结构修复。

这是什么

  • 名称:dsh-cross-memory(npm 包名同仓库名)
  • 分类:记忆
  • 当前版本(资料中的安装示例):v0.4.0
  • 许可:MIT;运行需 Node.js ≥ 20,peer 依赖 @deepseek-ai/cordis ^4.0.1
  • 关系:与 @a9i5k4/dsh-auto-memory 互不 import、不读写对方数据;auto-memory 未安装时,本插件的注入通道仍可工作,只是「跨实例统一约束」这一缺口在单插件场景下意义变小

能力一:跨实例硬约束注入

解决什么问题

auto-memory 的用户级记忆目录随实例的 userMemoryDir 隔离,子实例看不到主实例里沉淀的全局约束。本插件从固定绝对路径读取共享规则文件,在每轮上下文中注入 cross:begin 与 cross:end 之间的条目——改一处,所有开启注入的实例同步生效。

规则文件约定

路径硬编码为 ~/.dsh/memory/cross/RULES.md(不受 wsKey 与 userMemoryDir 影响):

# …头部说明(不注入)…

<!-- cross:begin -->
- 【必须遵守】第一条……
- 【禁止】第二条……
<!-- cross:end -->
约定 说明
生效区间 仅注释标记之间的内容;头部说明不注入
行格式 以 - 开头即一条;不设标记词白名单
单条长度 建议 ≤260 字符(含 -);资料注明可因完整错解否定保留报错串而有个别例外
编码 UTF-8 无 BOM、LF

定位区间时用完整注释串 <!-- cross:begin -->,避免头部说明里字面出现 cross:begin 时误匹配。

与写进 MEMORY.md 的差异(资料实测口径)

资料在「22 条规则、本机实测」下对比过承载方式:插件全文注入约 3786 字符且错解否定完整保留;同样条目分散写入各实例 MEMORY.md 约 4444 字符且规则段会被 auto-memory rules-layer.js 的 200 字符渲染截断。长约束若要每轮完整进入模型上下文,走本插件注入是资料给出的路径之一。

注入行为

  • 通道:systemPrompt.context()(user-role,追加在历史尾部),不击穿 DeepSeek 前缀缓存
  • 顺序:order: 10001,排在 auto-memory(SECTION_ORDER = 10000)之后
  • 缓存:按文件 mtimeMs,未变不重读
  • 失败:文件缺失、读失败、锚点缺失时静默空串,不报错、不影响会话
  • 正文:不截断,原样注入

能力二:锚点结构修复工具

auto-memory 用 <!-- memory:mem_<32hex> --> 作为唯一条目分隔符。结构损坏可能导致整文件 fail-closed 拒写,或新内容进不了注入面;本体没有「修复锚点结构」的工具。本插件提供 cross_memory_fix_bare_entries。

三类病灶

类 现象 处置
A 无锚点裸条 条目无锚点(常见于 memoryAnchorEnabled=false 时的 append) 在对应 ## 行之前插入锚点行
B 空锚点 orphan 锚点后无非空行,整篇可能永久拒写 在锚点行之后补中性占位行
C 重复锚点 同一 mem_<32hex> 多次出现 只报告,不自动删

资料强调:B、C 与 memoryAnchorEnabled 开关无关,手工编辑、并发写入、复制段落都可能产生;只要仍用锚点分隔,就需要这类修复通路。

参数与保证

参数 说明
scope 'workspace'(默认)或 'user'(用户级 ~/.dsh/memory/MEMORY.md)
memoryFile scope='workspace' 时必填,目标 MEMORY.md 绝对路径
apply 默认 false 只出方案;true 才写盘

硬保证:

  1. 只插入新行,过滤锚点行后与原文逐行 diff 必须为 0
  2. apply=true 时先留 .pre-write-<stamp> 基线,写后自检;A/B 仍存在则整份回滚并回报 rolledBack: true

幂等:同一文件第二次执行通常 changed: false。

典型调用(来自 README):

cross_memory_fix_bare_entries(
  scope      = 'workspace',
  memoryFile = '<工作区绝对路径>\MEMORY.md'
)

cross_memory_fix_bare_entries(..., apply = true)

工具:cross_memory_status

输出 JSON,包含 rulesPath、ok、sha256、bytes、mtimeMs、itemsParsed、injectEnabled、itemsInjected 等。用途之一:主实例定期比对 RULES.md 的 sha256——资料指出该文件目前无写保护,DSH 的 write/edit 等工具在权限允许下可直接覆写,校验哈希是「位置隔离 + SHA256」方案里校验侧的可操作手段。auto-memory 的 memory_status 不包含 cross/RULES.md 路径。

安装与启用

安装命令(资料原文)

# 从 GitHub(推荐,锁定 commit/tag 可复现)
dsh plugin --profile web add github:ShukebtAb/Dsh-Cross-Memory#v0.4.0

# 本地开发期(示例路径以 README 为准)
dsh plugin --profile web add file:D:\Study\Product\dsh-cross-memory

安装后须确认:dependencies 中出现该包,且 dsh.profile.bundles 里也列出它;缺后者不会生效。

inject 开关(每个实例显式声明)

插件不猜测主/子实例;内容指纹去重对「重写版」RULES.md 不可靠。在该实例 profile 的 cordis.patch.yml 中配置:

- id: cross-memory
  name: 'dsh-cross-memory'
  config:
    inject: true          # 子实例:注入全部跨实例规则
角色 配置 效果
主实例(规则段即真源) inject: false(缺省) 不注入;仍可使用两个工具
特化子实例 inject: true 每轮注入全部跨实例条目

资料建议主实例也安装本插件,以便使用 cross_memory_status 与 cross_memory_fix_bare_entries。

适用场景与注意

适合谁

  • 多 DSH 实例(主 + 特化子实例)需要一份共享、每轮必达的硬约束
  • 使用 auto-memory 且记忆文件出现裸条、空锚点、重复锚点等结构问题,需要可审计的「只插入、不改写」修复

注意

  • 插件以当前 DSH 进程的权限运行;安装前请自行查看仓库源码与 MIT 许可证
  • 社区目录 skillhub.cn 为独立生态站点,与 DeepSeek / 幻方无官方从属关系
  • 跨实例规则依赖本机固定路径 ~/.dsh/memory/cross/RULES.md;迁移或多机同步需自行管理该文件

结尾

dsh-cross-memory 在 auto-memory 之外补了两条窄而明确的链路:共享 RULES.md 的全文注入,以及锚点结构的三分类修复。若你的痛点正是「全实例同一套硬约束」或「记忆文件因锚点损坏拒写」,可按上文安装、配置 inject,并用两个工具做状态校验与结构修复。

  • 社区目录:https://www.skillhub.cn/plugins/ShukebtAb/Dsh-Cross-Memory
  • GitHub:https://github.com/ShukebtAb/Dsh-Cross-Memory
  • 相关本体:https://github.com/Aik358/dsh-auto-memory(资料参考版本 3.2.5)
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜