- 홈
- 플러그인
- 워크플로 및 자동화
- dsh-workflow (l2-protocol)
dsh-workflow (l2-protocol)
weihao654/dsh-workflow/plugins/l2-protocol
Adds twelve chain_* tools that turn a multi-agent role chain into a round state machine with one frozen baseline, per-signature failure counts, role-tagged evidence, blocking approval gates and one audit file per round; also adds a settings card that routes each role to its own model and thinking effort. Requires the sibling l1-presets bundle (plan/work/code/review) - without those presets every chain_* tool returns ROLE_DENIED.
설치
dsh plugin --profile web add github:weihao654/dsh-workflow이 플러그인은 저장소의 plugins/l2-protocol 하위 디렉터리에 있습니다.
README
dsh-workflow · 角色链的工作流插件
给 DeepSeek Harness 用的两个 bundle,把 plan → work → code → work → review → work → plan 这条角色协作链从"团队约定"变成"可由机器执行的纪律"。
用户 ↔ plan → work → code → work → review → work → plan → 用户
每轮六步:核对基线 → 收敛方案与授权 → 连续实施(唯一 T0)→ 限定修正(失败/重试/重启累计计数)→ 独立终审(分层证据不得互相扩大)→ 交付并关闭(版本 / 结果 / 未覆盖项 / 费用 / 停自有服务)。

两个部分
| 目录 | 是什么 | 状态 |
|---|---|---|
plugins/l1-presets/ | 纯配置:四个 preset(plan / work / code / review)的人设与工具矩阵,外加 protocol/ROUND-PROTOCOL.md 可抄进项目 AGENTS.md。零宿主代码 | v1.0 已装 |
plugins/l2-protocol/ | 协议插件:9 个 chain_* 工具 + 轮次状态机,把 T0 唯一、计数越限、证据分层、门禁阻塞、收尾校验变成硬约束,并把每轮落盘成审计文件 | v0.1(P0)已装,21 条自测通过 |
分开是有意的:L1 决定"谁有什么工具",L2 决定"事实必须成立"。L2 依赖 L1(按角色判定),L1 不依赖 L2(不装 L2 也能用,只是纪律靠自觉)。
装
顺序:先 L1,后 L2,然后新开会话(preset 与工具集在会话创建时冻结)。
从本仓库直接装,不需要发布到 npm(#path: 选子包):
plugin_manager install_bundle target: github:Weihao654/dsh-workflow#path:/plugins/l1-presets
plugin_manager install_bundle target: github:Weihao654/dsh-workflow#path:/plugins/l2-protocol
本地开发时也可以直接指向目录:
plugin_manager install_bundle target: <本仓库>/plugins/l1-presets
plugin_manager install_bundle target: <本仓库>/plugins/l2-protocol
两者都是普通 DSH bundle(dsh.bundle.patch 指向各自的 cordis.patch.yml),安装后可在插件列表确认 fiberPhase: active。详细前置、卸载与验证见各自 README。
角色→模型(plan 用强模型,code 用便宜模型)
子代理默认继承父代理的模型,所以四个角色本来共用一个。要分工,在项目里放一张表:
<项目根>/.dsh/role-chain.json
{
"roleModels": {
"plan": { "provider": "deepseek-account", "model": "deepseek-flash", "reasoningEffort": "high" },
"code": { "provider": "openai", "model": "gpt-6-luna" }
}
}
改完下一轮请求就生效:L2 用 agent/request 瀑布按 session.header.agentPreset 认出角色,查表换 provider / model。你在输入框手选过模型的会话,它不会再覆盖。表写坏了只是路由停用,chain_status.roleModels.errors 会说明原因。
不想手写 JSON 也行,两个入口:在 plan 会话里调 chain_role_models({ set: { code: { provider: "openai", model: "gpt-6-luna", reasoningEffort: "low" } } })(原子写入,非法输入拒绝且不动原文件);或者 DSH 设置 → 角色 → 模型 里点选四个角色的 provider / 模型 / 思考深度,保存写的是同一个文件(客户端半身需要重启一次才加载)。
装了 L2 之后,新建会话的预设菜单只保留 DSH 自带的几项 + plan;work / code / review 只由 plan 派发,不再出现在菜单里(Settings → Agent Presets 页里仍可见)。这条靠客户端过滤实现,自检步骤见 plugins/l2-protocol/ACCEPTANCE.md 第 5 步。
角色复用(不必每个任务都新建代理)
同一个项目里,chain_dispatch 会按策略复用已有子代理,而不是每个任务都新开一个:
{ "reuse": { "work": "persistent", "code": "family", "review": "fresh" } }
work 跨轮常驻;code 按任务族(family 参数)一类一个;review 每轮新开——独立审核不该继承上一轮的结论。复用时是把新任务发给同一个子代理(它接着原来的上下文干),返回的 action 会写明 spawn 还是 reuse;chain_status.agents 是当前名册,chain_release 退休并释放。换新的 plan 会话后旧名册自动失效、回退新建,不会报错。
一眼看懂差别
不装 L2 时,"这一轮只有一个 T0"是一句提示词,模型忘了就忘了;
装了 L2,chain_freeze_baseline 第二次调用直接抛 BASELINE_ALREADY_FROZEN,且 T0 是插件自己跑 git rev-parse HEAD 得到的,不听模型自述。
同理:同一个测试失败第 3 次会 exceeded,越限的轮子 chain_close_round 关不掉(除非有用户批准的 force 门禁),关掉的轮会自动产出 .dsh/rounds/<roundId>.json。
诚实声明
- "角色看不见不该有的工具"在 L1 是结构性的(工具没挂),在 L2 的 P0 是代码拒绝(
ROLE_DENIED)——迁移计划见plugins/l2-protocol/DESIGN.md§15。 work的只读是软的:它需要 shell 跑验证命令,所以仍能重定向写文件。- 门禁弹卡这一条只能在你自己的会话里验证,步骤见
plugins/l2-protocol/ACCEPTANCE.md。
关键词
deepseek-harness dsh cordis plugin agent-preset workflow round audit role-chain subagent