dsh-jspace-trigger 规则设计草案

August 18, 2026 · View on GitHub

状态:已实现并覆盖自动化测试(40/40)。 已对照 DSH 0.1.0-rc.7@deepseek-ai/cordis 4.x)的类型契约核验主机侧 API。 核心目标:不搞一刀切注入;用可配置规则判断是否命中,命中才提示加载 j-space,未命中零成本。

1. 调研结论

1.1 J-Space 本身的触发语义

J-Space Cognition Suite V3.6 是一个 Skill,不是 DSH 插件。它内部自带 gate:

Pass何时用加载内容
fast单步、一眼可核验不加载模块
full多步但单一交付物、可一次验证加载 1-2 个相关模块
loop多阶段、多文件、多轮、需要持久状态加载 capacity/broadcast/… 等模块

它没有“关键词自动触发”机制;在 DSH 里纯 Skill 只能靠模型按任务语义主动加载。因此需要外部规则层来决定“什么时候值得把 J-Space 拉上台”。

1.2 DSH 现有的成熟做法:dsh-routing-suite

参考 dsh-router-standard(231★)与整合项目 dsh-router-jspace

  • 结论:模型自身无法稳定自路由,外部分类器是必要组件。
  • 分类方式:
    • CHAT_RE:问候/感谢/简短确认 → 直接让位,不触发。
    • REACT_RE / SPEC_RE:关键词命中数比较,决定 build/fix 行为带。
    • COMPLEX_RE + 文本长度:判断 复杂任务
    • LOOP_RE + 超长文本:判断 长程/循环任务
  • 注入机制:
    • system-prompt/assemble:首次请求前注入 persona / protocol section。
    • session/event + agent.inbox.append('next-step', ...):每条真实用户消息后追加 near-field 引导,不进 system 前缀,不破坏缓存。
  • 已有测试:passForisChatTaskisLoopTaskmodulesFor、round≥3 强制重新分类等。

1.3 对我们的启发

  1. 不要用“模型自己觉得要不要用”作为唯一机制,外部规则至少要做初筛/兜底
  2. 不要对每条消息注入;先用 chat/ignore 规则快速放行。
  3. 触发结果不应只是“是/否”,最好直接给出 fast / full / loop 和推荐模块。
  4. 注入点建议用 near-field(用户消息后追加),而不是固定 system prompt,符合“不能一刀切注入”。
  5. 规则要可配置:关键词/正则/长度/显式命令,且可关闭。
  6. 只统计“是否命中”不能校准效果;需要把触发、投递和后续 skill 调用连成可审计漏斗,同时不保留提示词或工具参数。

2. 设计目标

  • 默认静默。
  • 命中规则时才追加一条轻量引导,例如:

    「J-space pass: full. Load: introspection, markers.」

  • 未命中任何规则:完全零成本。
  • 支持显式触发:/j-space 或“使用 j-space”。
  • 支持忽略规则:寒暄、纯确认、无需推理的任务。
  • 支持优先级:显式拒绝 > explicit > ignore > workspace-research > loop > research > complex > 长度兜底 > none
  • 规则全部可配置,配置改动即时生效或重启后生效(DSH 插件规范决定)。

3. 规则决策流程

真实用户消息

  ├─ 1. explicit 规则?          ── 是 → 强制 full/loop
  ├─ 2. ignore/chat 规则?       ── 是 → 不触发(fast,静默)
  ├─ 3. 工作区范围 + 调研意图?   ── 是 → loop + 推荐模块
  ├─ 4. loop 规则或超长文本?     ── 是 → loop + 推荐模块
  ├─ 5. 调研/full/complex 规则?  ── 是 → full + 推荐模块
  ├─ 6. 短文本且无规则命中?      ── 不触发
  └─ 7. 不确定 → 可配置 fallback:none / fast / full

优先级按顺序短路:显式拒绝 > explicit > ignore > workspace-research > loop > research > complex;同一档内可做评分,例如多个关键词命中增加置信度。

实现上,显式拒绝jspace-optout)是内置安全规则:无论用户是否在 trigger.rules 里删掉或重排规则,它都永远最先求值,保证“不要使用 j-space”之类显式拒绝不可能被内容关键词覆盖。chat 规则可被自定义替换, 但删除后仍保留一个最小内置寒暄兜底。所有正则在一次 evaluateRules 调用内 按规则预编译,避免在 session/event 热路径上反复编译。

4. 可配置规则 Schema(草案)

插件配置放在 DSH plugin config 中(cordis.patch.yml 或外部配置文件加载),YAML 形态如下:

enabled: true
injectMode: near-field   # near-field | none
analytics:
  enabled: true           # 仅规则/投递/工具名元数据,不存文本或参数
  maxRecords: 50          # 1..500 条内存记录
trigger:
  minScore: 1            # matchMode: score 时至少命中多少个关键词/正则
  loopChars: 1800        # 超过该长度直接判 loop
  fullChars: 120         # 超过该长度且非 chat 判 full
  rules:
    - id: explicit
      action: trigger
      pass: loop
      modules: [capacity, broadcast]
      patterns:
        - "/j-space"
        - "use j-space"
        - "启用 j-space"
        - "load j-space"

    - id: chat
      action: ignore
      patterns:
        - "^你好[!。.!??~~]*$"
        - "^(hello|hi|hey|thanks|thank you|ok|okay|好的|嗯|在吗)[!。.!??~~]*$"

    # 两种独立信号同时出现才判 loop,避免单文件读取被过度触发。
    - id: workspace-research
      action: trigger
      pass: loop
      matchMode: all
      modules: [capacity, broadcast, markers, self-monitoring]
      patterns:
        - "文件夹|目录|仓库|代码库|工作区|(?:todo|ddl).*(?:文件|列表|状态)|(?:文件|列表).*(?:todo|ddl)|folder|directory|repository|repo|workspace"
        - "调研|盘点|梳理|画像|审计|研究|分析|了解|research|survey|audit"

    - id: loop
      action: trigger
      pass: loop
      modules: [capacity, broadcast, markers, self-monitoring]
      patterns:
        - "多阶段|多文件|多轮|长程|长期|仓库级|跨文件|系统化|完整项目|长时"
        - "agentic|long-horizon|multi-stage|multi-file|multi-turn|repository-wide|workflow"

    - id: research
      action: trigger
      pass: full
      modules: [deep-reasoning, self-monitoring]
      patterns:
        - "调研|盘点|梳理|尽调|研究|调查|research|investigate|survey"

    - id: complex
      action: trigger
      pass: full
      modules: [deep-reasoning, self-monitoring]
      patterns:
        - "重构|架构|全面|详细|设计|系统|优化|分析|审查|调试|排查|报错|修复"
        - "refactor|architecture|comprehensive|detailed|design|system|optimize|analyze|review|debug|fix"

    - id: fast-allow
      action: none       # 不触发也不打扰
      pass: fast
      patterns: []       # 由 fallback 逻辑处理

字段说明

字段说明
enabled总开关
injectModenear-field 推荐;none 为仅观测:记录命中但不注入
trigger.minScorematchMode: score 时的命中数阈值,减少单关键词误报
trigger.rules[].minScore某条 score 规则独立的阈值,优先于全局值
trigger.rules[].actiontrigger / ignore / none
trigger.rules[].passfast / full / loop
trigger.rules[].modules命中后建议加载的 J-Space 模块
trigger.rules[].patterns关键词或正则(JS RegExp source 字符串)
trigger.rules[].excludePatterns命中时否决该规则,可表达“不要使用 j-space”
trigger.matchMode可选 any / all / score

默认建议

  • 默认 minScore: 1,避免过度敏感。
  • 默认 injectMode: near-field
  • ignore/chat 规则放在最前,防止“谢谢”“好的”被误判。
  • loop 规则优先级高于 complex:跨文件/长任务即使没出现“复杂”词也走 loop。
  • workspace-research 使用 matchMode: all:只有“工作区范围”和“调研/综合意图”同时出现才走 loop;单独“查看文件”不会触发。
  • 短文本不等于 fast:research 规则让“调研/盘点/梳理”等通常需要多步验证的请求直接走 full。
  • 长度兜底:fullCharsloopChars 只对非 chat 消息生效。

5. 插件实现草图

扩展点

参考 dsh-router-standard / dsh-router-jspace

export const name = 'jspace-trigger'
export const inject = ['systemPrompt', 'agent'] // 或最少依赖

export function apply(ctx, config) {
  // 1. 监听真实用户消息
  ctx.on('session/event', (session, event) => {
    if (event.type !== 'user/message') return
    if (event.data?.source?.kind !== 'user') return
    const text = extractText(event.data)
    const decision = evaluateRules(config, text)
    if (decision.action !== 'trigger') return
    // 2. 去重,避免同一轮重复注入
    if (seen.has(event.id)) return
    seen.add(event.id)
    // 3. near-field 注入
    agent.inbox.append('next-step', {
      id: `jspace-trigger-${Date.now()}-${...}`,
      role: 'user',
      source: { kind: 'plugin', plugin: 'jspace-trigger' },
      content: [{ type: 'text', text: guideText(decision) }],
    })
  })
}

纯逻辑与实现分离

  • src/trigger-core.mjs:零依赖,纯规则求值,可单测。
  • src/index.js:Cordis 插件入口,负责事件监听、注入和注册工具。
  • tests/:用 node:test 覆盖规则优先级、chat 让位、短消息的工作区调研、loop/full 判定、显式触发、去重和 agent 事件时序。

建议工具

  • jspace_trigger_status:查看当前规则配置,以及命中、注入、observe-only 和失败计数。
  • jspace_trigger_test <text>:干跑一条消息,输出决策结果,便于调规则。
  • jspace_trigger_analytics:查看 规则命中 → 投递结果 → 后续 tool/call → jspaceSkillLoaded 的有界内存漏斗。只记录元数据,绝不记录用户原文或工具参数。

6. 与已装插件/生态的共存

  • 已安装 dsh-mnemon:本插件只做 J-Space 触发提示,不碰记忆层,可共存。
  • 已安装 dsh-super-injector / dsh-mode-boost / dsh-agent-teams:本插件不替换 persona、不改工具面,只追加 near-field 文本,冲突风险低。
  • dsh-router-standard:在 weak 行为带会追加自己的路由引导;若本插件也命中规则,同一轮会出现两条 near-field 引导。两者不争夺 persona 或工具面,但会增加提示噪声。当前不做自动检测或静默;需要 Router Standard 独占 near-field 时,设置 injectMode: none
  • 梁神模式(Liangshen / anchored standard):首轮锚定阶段会过滤 source.kind: plugin 的消息,因此本插件首轮命中只计入指标、不影响锚定;模式晋升后,后续提示可正常参与会话。需要全程纯净轨迹时,同样使用 injectMode: none

7. 待验证/开放问题

  1. near-field 注入是否足够:模型是否真的会因此主动调用 skill 加载 j-space?需要真机跑 2-3 个复杂任务验证。
  2. 是否要自动加载 skill:DSH 插件能否直接触发模型加载 skill 不可控;当前方案是“提示模型按需加载”,不是强制。
  3. 规则误报率:关键词规则需要样本校准;建议先收集 20-30 条真实消息做干跑测试。
  4. DSH 新版本主机侧 API 漂移session/eventdata 形状、tool/call 参数是否为 JSON 字符串、ctx.agent/ctx.agents 是否保留,需随 DSH 发版回归核验(已纳入 CI 的 rc.7 形状测试)。

8. DSH 0.1.0-rc.7 主机侧契约核验(已核实)

契约结论
ctx.on('session/event', (session, event))event = { type, seq, time, data }
user/messagedata✅ 直接是 UserMessage { id, role:'user', content: ContentBlock[], source:{kind:'user'} }
tool/calldata{ turn, step, callId, name: string, arguments: string(JSON) }
agent.inbox.append('next-step' | 'next-turn', UserMessage)✅ 需要完整 UserMessage
ctx.tools.register(ToolDefinition)ctx.effect 包裹✅ HMR 安全,返回 disposer
当前 agent 解析ctx.agent(Context 属性)+ ctx.agents.get(id)(注册表),不是 ctx.get('agent')(该名非 reflector service)

9. 参考来源