dsh-router-standard
其他 已归档

dsh-router-standard

yjh051108/dsh-router-standard

已并入路由套件的路由标准历史归档仓库,留存相关历史代码,v1.19.1/v34主线研发线未发布,完整代码可至对应路由套件仓库查看

372
Stars 标星
35
Forks 分支
372
Watchers 关注
44
Open Issues
JavaScript
主要语言
MIT
开源协议
912 KB
仓库大小
28 天前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:yjh051108/dsh-router-standard
git clone https://github.com/yjh051108/dsh-router-standard.git
git clone git@github.com:yjh051108/dsh-router-standard.git
README.md main

dsh-router-standard

任务感知思维模式路由预设:把 DeepSeek V4 在 persona 轴上"非连续、分相变"的实测特性,
量化到稳定区(spec / react / weak),在首轮注入匹配的 persona 与工具面。
属于 dsh-routing-suite 套装,与 dsh-super-injector
(免重启运行时注入)配合开发。

📄 研究史说明:docs/statement.md(勘误声明)| docs/apology.md(道歉函)


当前状态(v1.19.1,2026-08-24 · 研发线,尚未发布)

Router Standard 处于「严格 workflow」研发线(以 CHANGELOG 为准,版本线文件 router-bootstrap-v34.mjs):

  • 严格阶段 workflow:完成信号驱动晋级(0→1 需澄清/计划、1→2 需计划锁定、2→3 需交付自检),
    阶段 0 强制对齐(歧义先 ask_user_question、复杂任务先 todo_write);"工具名/文本即跳级"已删除。
  • 任务回显stageText 新增 Task: <首条真实用户消息>——模型每轮都看得清在为什么事工作,不跑题。
  • 渐进披露:阶段化解锁 + 两档预放 + 直达语义 + 交付全量开放;tools_catalog 全量索引 / tools_help 完整 schema;
    已删除 all:true(无全量出口,未解锁工具不进入视野)。
  • 标准模式基底:native 直调(无 PTC/run_code 包装,SDK 全量段不存在,工具面注意力税大幅下降)。
  • 页面验证内置dev_page_check = 截图 + DOM smoke + console/pageerror/title/selector/scale
    {js:…} 模式 = 本地 JS 引擎(零外部 node 依赖);external 证据一等公民。
  • 描述 ⇄ 行为对齐presentation=native 自检、阶段文案只说真话、平台事实(win32 以 Git Bash 私有 shell seam 为准)。
  • 主动性引导:Proactivity 常驻段(自检信号,不是停手命令);压力感应器已退役。

配套预设:router-react(v17)/ router-spec(v10)(基于标准模式的两大执行预设,均支持首轮读图);
router-pro 线已退役删除。完整演进:见 CHANGELOG.mddocs/STANDARD-PLAN.md


【历史文档 · v0.3 时代】 Task-aware reasoning-mode router for DeepSeek Harness. One preset, two
routing modes (v0.2.0 naming), plus the measured three-band axis behind them:

routing mode first request thinking shape
standard(标准路由预设) 分类 persona(spec/react/weak)+ 完整 prompt sections + 分带首轮工具面 按分类带行动:react 直接产出、spec 先读后改、weak 内路由(每轮近距离引导)
spec(spec 路由预设) 分类 persona(spec/react/weak)+ 完整 prompt sections 雷霆大思考:首轮超长思维链(101K 推理 0 行动是其特征,不是缺陷)

选择:安装两个预设之一(Router Standard / Router Spec,见 Usage)。
dev_router_status 显示当前路由模式。

This is a research artifact. It encodes a measured property of DeepSeek V4
Pro / V4 Flash: model behavior along the persona axis is not a continuum
— it collapses into a few stable regions separated by phase transitions.
The router therefore quantizes to the stable regions instead of pretending
the axis is continuously tunable.

v0.3.0 — real-assembly-chain fixes

v0.2.x shipped routing logic that was validated against bare-API probes but
was broken on the REAL DeepSeek Harness assembly chain. v0.3.0 fixes all of it,
verified against @deepseek-ai/dsh-agent-loop (0.1.0-rc.7) event ordering:

  • First-turn routing actually works (issue #13): the loop claims the inbox
    BEFORE assembling the system prompt, and inbox.claim() emits the
    agent-scoped agent/inbox/claimed event synchronously — the router captures
    the first REAL user message there (source.kind === 'user' only), so the
    first request is classified instead of unconditionally falling into weak.
    (The captured text is CLASSIFIED, not fed to bandOf raw — the old capture
    path silently mapped every captured message to the spec band.)
  • Near-field guidance moved to agent/pre-step (issues #34/#36/#55):
    session/event never fires inside agent-plane presets (dsh-scope filters
    it out of entry-local realms), so the old inbox re-append never delivered
    guidance — and wherever it did fire, the next-step append forced a SECOND
    model request per user message (the 2× API-call spike). The guide is now
    inserted into decision.messages at agent/pre-step: same request as the
    user message, near-field, cache-neutral, zero extra round-trips.
  • Fixes: missing extractText/bandOf imports in both bootstrap files
    (#11) — the session/event handlers crashed with ReferenceError whenever
    they did fire; sessionMode ignoring plugin-origin messages when pinning
    the band; router.test.mjs import path; preset.yml YAML quoting (#53);
    subagent-session skip (#5); session-selected model from
    assembled.variables (#9); the RL-standard mode of the spec preset now
    returns the assembly untouched after the first tool/call (#44).
  • New: router.integration.test.mjs replays the real claim → assemble →
    pre-step ordering against the actual bootstrap code.

What it does

router-standard: reads the session's first REAL user message, classifies
the task (build → react / fix → spec / ambiguous → weak), and on the first
model request injects the matching persona while keeping the full prompt
sections; the first-turn core tool surface follows the band
(spec=read/edit/glob/grep, react=read/write/edit, weak=read/write/edit, each
plus the platform shell). Weak-band sessions also get a near-field routing
guide in the SAME request as every real user message.

router-spec: same routing core with the deep-think-first branding; keeps
the v0.2.0 dual-mode code path (routerMode), so a copy configured with
routerMode: standard still gets the RL-interface first turn (RL sentence +
shell/str_replace_editor) with full sections restored after the first durable
tool/call.

After the first durable tool call the full Standard catalog is exposed and the
router stops touching anything. The mode is derived from durable session
events, so resume/reload keeps it. The plan-mode prompt section is preserved,
so plan boundaries do not reset the model's focus.

The three measured behavior bands

Fine-grained probing (21 mode points × n=2, official API, reasoning_effort=max)
on V4 Pro shows behavior along the persona axis collapses into three bands:

band mode measured behavior
spec 0 – 0.19 stable plan-collective (We trajectories, let-me ≈ 0)
mixed 0.2 – 0.49 transition trap: unstable mixing of We/The/Let
react 0.5 – 1.0 stable doer (The/Let first-person, we ≈ 0) — 11 mode values behave alike

V4 Flash is threshold-like (0–0.5 all spec side, jumps at 0.75+). The numeric
dev_router_mode interface is kept, but it quantizes to the three bands — the
transition band is never selected automatically.

Why: dual-attractor RL policy

Evidence across projects (see docs/paper.md and docs/experiments.md):

  • The same model reaches top-band scores under spec conditions on a
    maintenance benchmark (Project2: minimal 99/96, anchored 98/99) and under
    react/code conditions on a greenfield build task (Mario: 10/10), while the
    wrong mode scores 91 / 6 respectively — a ~10-point swing from prompt
    conditioning alone ("god/ghost duality").
  • Persona is the dominant trigger (one-sentence swap flips the trajectory);
    tool-schema surface is a secondary condition; catalog text in a user message
    has no effect.
  • Behavior is path-committed: once anchored, expanding the tool catalog
    perturbs at most one reasoning block and never flips the mode.
  • Intermediate personas are out-of-distribution (training-distribution
    gap), which is the measured unstable band.

The model cannot self-route: P3 (same persona, task swap → trajectory
unchanged), P5 (router personas → doer attractor absorbs the instruction) and
P8 (domain-overlap scan) show the only internal-routing window is a WEAK
persona + few-shot routing instruction (lean, not flip; discrimination
+2.3..+3.3). There is no reward signal for switching modes mid session, and
the behavior phase transition means the model commits on the first request.
Mode selection must come from outside — a human (the "streamer"), a
heuristic classifier, or a learned router. This preset is the automated
version of that external routing.

Usage

Two presets (v0.3.0; the router-pro line was retired): install one or more under ~/.dsh/.agent-presets/:

# 标准路由预设(RL 接口还原,默认推荐)
$target = Join-Path $env:USERPROFILE '.dsh\.agent-presets\router-standard'
Copy-Item -Recurse .\preset\router-standard $target

# spec 路由预设(深度思考优先)
$target = Join-Path $env:USERPROFILE '.dsh\.agent-presets\router-spec'
Copy-Item -Recurse .\preset\router-spec $target

免重启安装(推荐):装好 dsh-super-injector
后(见套件 scripts/install-injector.ps1),改预设代码不再需要换文件名/重启:

dev_reload_preset router-standard   # 预设热更新:?v=N query 绕 ESM 缓存,新会话立即用新代码

注意事项(实测血泪)

  1. ESM 缓存:loader 按 URL 缓存模块——原地覆盖文件内容不生效(改代码必须
    dev_reload_preset 或换文件名)。
  2. 首次会话必须新开:路由模式在首个请求锁定(路径承诺),中途切 GUI 模型/
    改配置不影响已运行会话。
  3. 子代理不路由parentSession 会话跳过路由层(社区 #5 修复),shell-less
    子代理不再崩溃。
  4. 引导注入通道(v0.3.0):近场引导走 agent/pre-step,每个真实用户消息
    注入一条(weak 模式);rc.6 起 session/event 在 standing scope 收不到事件,
    旧版本引导是死的。
  5. 首轮真实分类(issue #3/#13):首轮路由读 agent/inbox/claimed 的原始
    消息文本并经 classifyTask 分类——首轮即真实 band(不再 weak 兜底)。
  6. 自举卸载dev_uninject_plugin --self=true 可卸载注入器自身(保留
    装配链,重启自动恢复)——用于验证安装闭环。

Restart DSH (or install via the suite script for zero-touch), start a new
session, pick Router Standard (experimental) (RL-interface, think-act
loops), Router Spec (experimental) (deep-think-first, the long first-turn
chain is the point) or Router Pro (V4 Pro measured optimum).

  • dev_router_status — current mode, band, persona, core tools, override state
  • dev_router_mode <spec|weak|mixed|react|0-100|0.0-1.0|auto> — explicit mode
    (numeric inputs quantize to the three bands)
  • dev_mode_subagent <spec|react|balanced> <task> — run one task in a
    DIFFERENT reasoning mode inside a fresh isolated context (its own system
    prompt), leaving the current trajectory untouched. Mode isolation is the
    only reliable way to change modes mid-session: mid-session persona switches
    invalidate the whole prefix cache, tail personas are ineffective (P6), and
    the native subagent inherits this persona.

One preset, auto-matched per model. There is no Pro/Flash split to
configure: personaFor(mode, modelId) reads the session's model route and
selects the measured optimum automatically — Pro → w6c (spec sentence +
classify instruction, no anchors; 24/24 = 100% routing, P24), Flash → w7 +
recall/anti-runaway anchors (96% routing; 100% single-task completion, P23).
The model is fixed at the first request (path commitment), so the persona is
locked for the session; switching the GUI model starts a new session with the
matching configuration.

Depth-adaptive guidance (v20, thinking efficiency). Per-message guidance
is dispatched by task complexity (isComplexTask: length or architecture
keywords):

  • simple tasks → fast-convergence guide (P30: 1 step, zero waste);
  • complex tasks → decision-closure deep guide: "Think deeply about the
    architecture, edge cases, and integration points. Do not spend reasoning
    on the environment or tooling. Produce when your information is complete.
    End each reasoning block with a decision or an information need." —
    P30: depth +12% AND faster convergence (8.0 vs 8.3 steps), 3/3 completion.
  • Rumination (environment suspicion / re-confirmation) is suppressed by the
    anti-runaway anchor: measured 0.0-0.3% of reasoning tokens.

Tests

node --test router.test.mjs   # 11 tests: classification, bands, personas, plan-section survival

Files

  • preset/agent.cordis.yml — full rc.6 Standard composition + router row
  • preset/router-core.mjs — pure routing logic (zero deps, unit-testable)
  • preset/router-bootstrap.mjs — Cordis plugin (zero external imports)
  • router.test.mjs — unit tests
  • docs/paper.md — the theory + experiments write-up
  • docs/experiments.md — full data tables

Evidence & attribution

  • Trajectory trigger matrix, dual-model matrices, and the 21-point phase probe:
    dsh-probe (this repo's sibling scripts live in the paper's appendix tables).
  • Project2 evaluation data: xiaobright/modeltest
    (V4.1b, frozen) — minimal 99/96, standard 91, PTC 92, anchored-standard 98/99.
  • Two-phase anchoring preset: xiaobright/dsh-anchored-standard
    (MIT). The router's first-turn anchoring is a plugin-level port of its
    tool-bootstrap mechanism.
  • DeepSeek Harness official minimal preset snapshot
    (sends the exact RL prompt and schemas test) — the spec persona and the
    RL-alignment claim.

License

MIT. preset/agent.cordis.yml derives from the DeepSeek Harness Standard
preset (MIT); original attribution in NOTICE.