DeepSeek Harness 语义监视插件(dsh-derive-watcher)

前言

DeepSeek Harness(DSH)是「一切皆插件」的智能体开发框架。当 agent 长链任务逐渐偏离语义方向或陷入重复循环时,开发者的直觉往往滞后于实际进展。DSH 插件 dsh-derive-watcher(语义监视器,L3)通过观察每个助手回合的语义进展,把会话沉淀成一本「语义旅程账本」,并在语义停滞时分级告警、向上层治理请求干预。

它只观察与建议,不直接执行——需要真正拦截工具或步骤时,由姊妹插件 step-governor(L2)动手;L2 不在线时本插件自动放行(fail-open),绝不因为治理联动失败卡住任务。

这是什么

  • 定位:DSH L3 插件,负责会话语义的持续观察与分级治理。
  • 维护者:JiewiW。
  • 核心问题:长对话中模型可能逐渐偏离目标或陷入语义重复,人工介入往往滞后;会话进展缺乏可追溯的记录。

核心功能

1. 语义旅程账本

每个助手消息被总结为结构化条目:finding / decision / dead-end / hypothesis / plan / fact。这些条目以 JSONL 与 Markdown 双镜像落盘到 ~/.dsh/storages/semantic-watcher/。每条写入都做长度守恒校验(写入字节数等于序列化字节数)并回读验证,校验失败只丢弃这一条、发事件告警,不会让账本静默损坏。

水位线记录每会话最后处理的消息,进程重启后自动幂等补扫,不永久漏账。

reasoning(思考块)与正式 text 分开观察、走独立账本:当模型长期只有思考没有正文产出时,以 reasoning 流为准,且思考内容绝不混入正式结论。

2. Flash 总结

条目由小模型异步总结产出。总结调用默认跟随触发消息的 provider/model,也可由 summaryProvider / summaryModel 显式指定。

队列上限 2 并发,单次 30 秒超时,畸形结果重试 1 次。队列溢出时丢最旧并记 gap。模型返回空数组算正常结果(只推进水位);调用失败按「无可用模型路由 / 超时 / 草稿解析失败 / 空回复」分类落 gap,并作为独立原因出现在 timeline 上。

3. 新颖性判定

提供两种模式:
- 字符 3-gram MinHash 词法比对(Jaccard 阈值 0.8),再经 LLM schema 自检确认;
- embedding 余弦相似度(阈值 0.85),模型无 embedding 能力时自动回退。

4. 里程碑折叠

当账本条目超过阈值(recentN × 3)时,最旧一批交模型蒸馏成里程碑,原文移入归档。失败教训(dead-end)全量保留零丢失,未完成目标(open objectives)跨折叠保留。

5. 上下文注入(默认关闭)

在下一步前把「最近几条未完成目标(置顶)+ 里程碑 + 最近 N 条有推进意义的结论 + 最近几条死胡同」注入上下文。目标与死胡同默认各只取最近 3 条(injectionObjectiveLimit / injectionDeadEndLimit),更早的只报数量。

结论区只收 finding/decision/fact 等有进展的条目,计划类只在目标区展示,复读与已被取代的条目不注入。预算紧张时依次压正文、剔旧结论、收缩目标与死胡同、把摘要压成短句,最后实在放不下才降级为「最新要点」单行,不再整块跳过。水位落后时明确标注 latestSummarized:false。

6. 三级语义停滞响应

级别 触发 动作
stall-1 连续若干步只有重复、没有新结论(或墙钟旁路:连续 3 个无正文/无产物步骤且跨度 ≥ 5 分钟) 注入警示
stall-2 重复继续累积 请求 L2 拒读类工具(denyToolCategory,默认关闭)
stall-3 进一步恶化 请求 L2 硬终止本步(rejectStep),并写交接账本与续跑种子(默认关闭)

纯字面重复(措辞一模一样)只记账不升级,只有语义重复才推进停滞级别;真人发来新消息归零所有状态(系统/插件注入的消息不算)。

7. 生命周期管理

worker 每分钟心跳;会话结束或最后事件后 10 分钟无新事件,自动清理会话状态与心跳;归档按保留期定期清扫。

8. 静默中断识别与原窗口主动续跑(v0.3.0)

当回合被步级上限(blocked)、输出长度上限(max-tokens)或运行时错误(error)打断、且未形成面向用户的结论时,watcher 检测该「静默中断」并按设置决定是否在原窗口主动发送续跑指令(<silent-resume> 模板:先汇报结论与断点,再继续推进)。

动作模式四档(silentAbortAction,互斥穷尽):

档位 行为
off 完全不检测(连 detected 事件都不落)
notify(默认) 检测 + 落事件 + timeline 干预通道 + agent-notify 告警,不发消息(fail-safe:不会自动向会话发送任何内容)
followup notify 全部动作 + 冷却到点后向原窗口 agent.followup() 发送续跑指令
goal-resume 优先对 blocked/paused 的 goal 调 goals.resume();无 goal 或 resume 抛错(含轮次用尽)回退 followup,仍不行回退 notify

安全闸包括:冷却 G2(回合结束后等 cooldownMs,默认 15 秒;窗内出现新 turn 或真人消息即放弃,真人永远优先)、预算 G1(每会话自动续跑 ≤ maxAutoResumePerSession 默认 3 次,跨冷却不重置、真人接管才清零)、进展 G5(续跑新回合须达 progressMinSteps 默认 3 步或 ≥1 次工具调用)、错误码排除 D4(errorNoRetryCodes 默认 401/403/signed-out,命中只告警不重试)、goal 让位 G4(goal active+armed 时不介入)、服务降级 G6(agents/goals/agent-notify 缺失或抛错一律只落事件与告警,绝不抛穿主流程)。

9. 右侧栏干预时间线(timeline,v0.2.0)

DSH Web 右侧栏新增「语义监视」选项卡,把一次会话的治理痕迹合并成一条纵向时间线,统一归并五类来源并按时间倒序:

source 含义
intervention stall-2/3 的 L2 干预受理结果(deny-read / reject-step),醒目卡片
watcher-event 其余 semantic-watcher/* 事件(stall、heartbeat、handoff-written 等)
milestone 里程碑折叠产出
gap 总结跳过(无可用模型路由 / 超时 / 草稿解析失败 / 空回复,带原因徽标;无 grade 时显示「原因未知」)
journey 语义旅程条目(finding/decision/…,含重复标记)
observation 每步 reasoning/text/产物观察(默认折叠,可展开)

干预卡片展示动作、所在 turn/step、是否被 step-governor 受理、TTL 与解除步(expiresAtStep),字段全部取自 L2 真实返回,缺失即省略。

宿主侧新增两个只读路由:

  • GET /plugins/derive-watcher/timeline/sessions
  • GET /plugins/derive-watcher/timeline?sessionId=<sid>&limit=<n>(limit 默认 200、上限 1000;缺 sessionId 返 400、无账本返 404)

安装

dsh plugin --profile <你的profile> add github:JiewiW/dsh-derive-watcher#v0.3.1

零第三方运行时依赖。账本默认落在 ~/.dsh/storages/semantic-watcher/(设置项 storagePath 可改)。

设置

常用默认值:

键 默认 说明
enableJourney true 旅程账本总开关
enableInjection false 上下文注入总开关(首发默认关)
enableStall2Deny / enableStall3Reject false / false stall-2/3 与 L2 的联动(首发默认关,L2 不在线时 fail-open)
stall1Steps / stall2Steps / stall3Steps 3 / 6 / 10 语义停滞分级阈值(保存时校验严格递增,倒挂拒绝)
stallWatchSteps / stallWatchWindowSec 3 / 300 墙钟旁路:连续无产出步骤数 K 与跨度 T(秒)
injectionTokenBudget 1200(允许 800–1500) 注入 token 预算
recentN 8 最近结论窗口,也是折叠阈值基准
injectionObjectiveLimit 3(允许 1–10) 目标区最多注入几条未完成目标(最近优先)
injectionDeadEndLimit 3(允许 1–10) 死胡同区最多注入几条(最近优先)
noveltyMode schema-selfcheck 另可选 embedding / both / semantic-only
lexicalThreshold 0.8(允许 0.1–0.95) 词法重复判定阈值
enableLexicalStallCount false 词法重复计入停滞升级(改进①:code 派生 lexical-stall-2)
lexicalStallSteps 0(允许 0–50,0=关) 独立词法复读警告阈值,>0 时连续 N 条词法重复发 lexical-stall 事件(仅提示,不升级)
maxConcurrency 1(上限 2) 总结并发闸
sessionTtlMinutes 10 会话无新事件后的存活时间
retentionDays / ledgerRetentionDays 30 / 0 归档保留天数;主账本保留天数(0 = 不清主账本)
escapeClosingTags true 闭标签写入前转写、读取还原

联动约束:enableInjection 要求 enableJourney;enableStall2Deny / enableStall3Reject 要求 enableInjection。

事件

12 个事件(semantic-watcher/* 前缀):

stall · intervention(v0.2.0 新增) · store-corruption · injection-skipped · execution-unavailable · lexical-repeat · lexical-stall(改进⑤ 新增) · summarizer-degraded · handoff-written · heartbeat · fold-milestone · retention-cleaned

intervention 只在 L2 调用成功返回时发出,必带 action(deny-read / reject-step)、accepted、code、level;ttlSteps / expiresAtStep / pending 仅在 L2 返回值真实存在时才写入。L2 调用失败仍走 execution-unavailable,不发 intervention。

适用场景与注意

  • 适合谁:需要长期跟踪会话语义进展、希望对语义停滞进行分级治理的开发者。
  • 权限:插件以当前 dsh 进程权限运行;安装前建议检查源码与许可证。
  • 生态背景:DSH 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

短结尾

dsh-derive-watcher 通过语义旅程账本、flash 总结、新颖性判定、里程碑折叠、上下文注入、三级停滞响应与右侧栏干预时间线,为长链任务提供持续的语义观察与治理能力。需要治理联动时,应配合 L2 插件 step-governor 使用。更多细节与源码见 GitHub。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye