dsh-jspace-trigger 规则设计草案
August 18, 2026 · View on GitHub
状态:已实现并覆盖自动化测试(40/40)。 已对照 DSH
0.1.0-rc.7(@deepseek-ai/cordis4.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 前缀,不破坏缓存。
- 已有测试:
passFor、isChatTask、isLoopTask、modulesFor、round≥3 强制重新分类等。
1.3 对我们的启发
- 不要用“模型自己觉得要不要用”作为唯一机制,外部规则至少要做初筛/兜底。
- 不要对每条消息注入;先用 chat/ignore 规则快速放行。
- 触发结果不应只是“是/否”,最好直接给出
fast / full / loop和推荐模块。 - 注入点建议用 near-field(用户消息后追加),而不是固定 system prompt,符合“不能一刀切注入”。
- 规则要可配置:关键词/正则/长度/显式命令,且可关闭。
- 只统计“是否命中”不能校准效果;需要把触发、投递和后续 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 | 总开关 |
injectMode | near-field 推荐;none 为仅观测:记录命中但不注入 |
trigger.minScore | matchMode: score 时的命中数阈值,减少单关键词误报 |
trigger.rules[].minScore | 某条 score 规则独立的阈值,优先于全局值 |
trigger.rules[].action | trigger / ignore / none |
trigger.rules[].pass | fast / 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。 - 长度兜底:
fullChars和loopChars只对非 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. 待验证/开放问题
- near-field 注入是否足够:模型是否真的会因此主动调用
skill加载j-space?需要真机跑 2-3 个复杂任务验证。 - 是否要自动加载 skill:DSH 插件能否直接触发模型加载 skill 不可控;当前方案是“提示模型按需加载”,不是强制。
- 规则误报率:关键词规则需要样本校准;建议先收集 20-30 条真实消息做干跑测试。
- DSH 新版本主机侧 API 漂移:
session/event的data形状、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/message 的 data | ✅ 直接是 UserMessage { id, role:'user', content: ContentBlock[], source:{kind:'user'} } |
tool/call 的 data | ✅ { 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. 参考来源
- J-Space Cognition Suite V3.6:https://github.com/Tiger3807861189/J-Space-Cognition-Suite-V3.6
- dsh-routing-suite:https://github.com/yjh051108/dsh-routing-suite
- dsh-router-standard:https://github.com/yjh051108/dsh-router-standard
- dsh-router-jspace:https://github.com/DreamRift/dsh-router-jspace
- Yhx888 DSH resident plugin wrapper:https://github.com/Yhx888/j-space-cognition-suite