Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dsh-agent-memory

一个宿主平面 DeepSeek Harness Cordis 插件:把记录下来的经验蒸馏进 ~/.dsh/AGENTS.md 里一个受管区块,而那个文件每个会话每一轮自动加载。

它与 preset 无关——因为是宿主平面,所以本部署的三个 preset(dsh-smith / dsh-forge / dsh-ck3-mod) 都获得它,不需要改任何一个 preset。

它解决的是哪一半

本部署原本就有四层记忆(AGENTS.md、技能、DECISIONS.md/PROJECT.md/BOARD.md、会话)。存储从来不是失败的那一半,检索才是。

真实代价,两个都有记录:一份「建索引要 225 秒」的估算,真实值是 2.4 秒——差 95 倍,而那条订正 早就写在 DECISIONS.md 里,当时的 agent 没读;另一次,二进制里两个字符串的相邻位置被当成 功能相关的证据,据此写出了一份指向不存在功能的「三步解锁」指引。

所以这个插件只做一件事:让必须每轮都对的那几条,不再依赖 agent 想起来去读。

两个工具

工具 作用
memory_remember 向 LESSONS.md 追加一条经验(结论 + 为什么 + 证据)
memory_consolidate 把 LESSONS.md 蒸馏进 ~/.dsh/AGENTS.md 的受管区块。写完不 consolidate 等于没写

受管区块由两个 HTML 注释标记界定:

<!-- BEGIN agent-memory (managed; do not edit by hand) -->
...
<!-- END agent-memory -->

它只重写这两个标记之间的字节。 标记之外一个字节都不动;若发现开始标记而没有结束标记, 它抛错拒绝而不是猜到哪里结束——那个文件归使用者所有,覆盖它是数据丢失而不是格式问题。

预算是硬的,这是设计而不是参数

AGENTS.md 每一轮都在上下文里。所以受管区块有上限(默认 16384 B),而且超限时工具 报错拒绝并列出最大的条目,绝不静默截断——截断会让机制看起来在工作而实际在丢经验, 比报错更糟。

把这个换算成直觉:一份典型的仓库 AGENTS.md 已经 30 KB 上下,而笔记层 DECISIONS.md + PROJECT.md 常有 372 KB ——永远不可能整体注入。 经验区块存在的意义就是只放这两层里那几条必须每轮都对的。

maxBytes 与 maxSourceBytes 的区别值得知道:前者截断一个渲染批次,后者整个静默丢弃一个文件 (默认 1 MiB)。本插件只写进那个已经在被读取的文件,不新增任何被发现的文件。

安装

dsh plugin --profile web add <本仓库路径>

然后在 profile 的 cordis.patch.yml 里加一行(name 必须是包名,不是目录):

- insert:
    - id: agent-memory
      name: 'dsh-agent-memory'
      config:
        lessonsPath: 'C:\Users\<你>\.dsh\agent-memory\LESSONS.md'
        targetPath: 'C:\Users\<你>\.dsh\AGENTS.md'
        maxBlockBytes: 16384

改完要重启宿主才加载新的模块。区块内容本身不需要重启:dsh-agent-instructions 每轮都会重新校验指令文件。

自证

node test/falsify.mjs      # 29 assertions, offline

两条断言是重点:标记之外的字节逐一保全,以及有头无尾标记时抛错。 另有 resolve 与 lstat 的语义断言——fs.resolve 不是存在性检查(它可以为不存在的路径返回稳定目标), 存在性是 lstat;把这个弄反的初版拒绝写任何尚不存在的文件,是测试抓到的,不是读代码看出来的。

⚠️ 已知能力边界:在沙箱会话里只生成、不落盘

实测:在 workspace-write 策略的会话里,两个工具都会以 file access denied under workspace-write mode 失败,而同一会话的 dryRun 读得到。

机制在接缝上而不是路径上:插件写文件走的是被沙箱包住的 fs,dsh-fs-sandbox 按 ctx.sandboxPolicy.defaultMode 逐次判定,workspace-write 只允许写工作区之内。

这是保护在起作用,不是缺陷:agent 不该能悄悄改掉那份指导每个会话的文件。 后果要如实说清楚——区块内容是正确且完整的,只是该会话无法把它落盘。 要落盘需要一个策略允许写到工作区之外的会话,或由有该权限的写入者执行。

不得夸大

这不是学习。 本插件没有权重更新路径;模型不会因为积累了经验而变聪明。它做的是保证检索。

因此边界明确:对没有人记录过的教训它一无所知;而如果一条经验被记录、被 consolidate、被注入, 行为依然没变,那失败已经从检索转移到遵从——任何加载机制都修不好后者。

许可

MIT。与 dsh-smith 同作者。

About

DeepSeek Harness host-plane plugin: a bounded experience layer that distils recorded lessons into a managed block of the user-global AGENTS.md, loaded every turn.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages