1. 工作原理
开发者在「工程化开发引擎」会话里提出开发请求后,统一由 dev_task 工具接管,再由编排技能 eng-delivery 读任务状态、按当前阶段推进,一个阶段一个阶段地走。
开发请求
→ dev_task(统一入口,硬约束在代码里执行)
→ eng-delivery(编排:读状态 → 选阶段 → 推进)
→ 需求评审 · requirement-analysis
→ 设计 · solution-design
→ 开发 · code-implement
→ 交付 · code-verify
→ 代码审核 · code-review + code-commit
它不是常驻程序。只有你在「工程化开发引擎」预设的会话里提出开发请求时,才触发 dev_task 和这套门禁;换到别的预设,流程完全不介入。
三样东西分工明确:流程预设决定「走哪条流水线、有哪些守卫」,Skill 决定「这一站做什么」,Rule 决定「这一站守什么」。任务状态单独落盘,负责「跨会话恢复到哪一步」。
诚实边界:阶段流转、提交格式、文件范围、消息里的任务绑定、流程快照 hash、钩子完整性、敏感路径风险策略是代码硬校验(不匹配直接拒绝);高风险任务的「验证通过」也是真实命令回执——引擎实际运行 verify 命令、取退出码(exit_code === 0 且非超时/中止)才放行,不是模型自报。仍属模型自报、需人工或 CI 兜底的是:旧任务的常规风险验证声明、「评审通过」「实施项完成」,以及回执命令本身的覆盖面。只有「需求确认」「方案确认」两扇门由人工批准点亮,风险降级(high_risk → standard)也由人工批准。
2. 安装与启用
2.1 前置:Node.js ≥ 22 + pnpm
npm install -g pnpm # dsh 的 plugin 子命令底层转发给 pnpm,必须先装
2.2 先装 DSH(三选一)
# 方式 A:npm 装 CLI(非源码,推荐给使用者)
npm install -g @deepseek-ai/dsh
dsh web
# 方式 B:npx 免安装直接跑
npx @deepseek-ai/dsh web
# 方式 C:从源码 clone(开发者)
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install && pnpm run build && pnpm dsh web
2.3 把引擎插件装进 profile
dsh plugin --profile web add @godv61/dsh-task-engine
dsh plugin --profile <name> add <package> 会在 $DSH_HOME/profiles/<name>/ 里执行 pnpm add,并自动识别插件声明的 dsh.bundle.patch,把它挂进该 profile 的插件层栈——不要手写 npm i 装到别处,那样不会挂载。
装完重启 dsh web 生效,自动完成两件事:侧边栏多出「工程流程」工作台;预设列表多出「工程化开发引擎」。
2.4 启用
新建会话 → 预设选「工程化开发引擎」。这个会话就挂上 dev_task + 内置技能 + 工程人设,开始按流程走。
想「正式开发」就选它;想「让 AI 自由探索」就选 standard。切换预设本身就是开关,零配置。
3. 文件与目录
D:\workspace\
├─ AGENTS.md ← init 生成的项目描述(DSH 每会话自动注入)
├─ .dsh\
│ ├─ eng.json ← 流程预设 + 节点挂载(团队共享,可进 git)
│ ├─ skills\ ← 项目级 skill
│ ├─ rules\ ← 项目级 rule
│ └─ task-*.json ← 每个任务的状态快照
└─ $DSH_HOME\
├─ skills\ ← 用户级 skill(个人所有项目通用)
└─ rules\ ← 用户级 rule
| 路径 | 作用 | 何时读取或修改 |
|---|---|---|
.dsh/eng.json | 声明用哪套流程 + 每个节点挂哪些 skill / rule | 任务推进前读取;工作台保存时写入 |
.dsh/skills/ | 项目级 skill(团队共享) | 节点挂载命中时按需读取 |
.dsh/rules/ | 项目级 rule(团队共享) | 节点挂载命中时按需读取 |
.dsh/task-*.json | 当前任务的有效状态快照 | 确认、实施、验证、评审、切换阶段时更新 |
$DSH_HOME/skills/ · rules/ | 用户级 skill / rule | 同名时让位于内置(内置 > 用户 > 项目) |
4. 三套流程预设
阶段图、守卫、提交规则都随预设固化好,团队只选一套,不改流程图。
| 预设 | 阶段顺序 | 适用 | 守卫强度 |
|---|---|---|---|
standard 标准研发 | 需求评审 → 设计 → 开发 → 交付 → 代码审核 → 完成 | 默认;流程最完整 | 含产物门 + 人工确认 + 评审门 |
agile 敏捷轻量 | 需求 → 开发 → 交付 → 审查 | 快速迭代、少产物 | 四阶段,产物要求更轻 |
minimal 纯代码 | 开发 → 交付 | 只有代码、无评审流程 | 只留提交门禁 |
预设之外,单个任务还有两个模型自动判断的字段:work_size(tiny / standard / complex,决定拆多细)和 risk_level(standard / high_risk,决定验证强度)。它们不是流程档位,是单个任务的规模与风险标签。
高风险任务只能在 standard 流程建——引擎要求高风险任务具备「验证门 + 文件范围 + 评审门」,agile/minimal 没有验证门和评审门,建 high_risk 任务会被直接拒绝。要跑高风险就选标准研发,或把风险降到 standard。
任务创建时会把所选流程固化成快照——之后在途任务一直按创建时的门禁走,中途改 .dsh/eng.json 只影响新任务,不影响已建任务。
5. Skills:这一步做什么
每个内置 Skill 尺寸很小、只做一件事。挂到对应节点后,走到那一步才加载,不会一次性全塞给模型。
| Skill | 职责 | 不负责 |
|---|---|---|
eng-delivery | 读任务状态、按阶段推进、确保不越轨 | 代替各阶段 Skill 的专业工作 |
requirement-analysis | 目标、验收、非目标,落需求说明,等人确认 | 编码 |
solution-design | 最小方案、技术基线、改动点,落设计文档 | 实现 |
code-implement | 实现、做「规格 + 质量」两阶段评审,都过才标完成 | 无关重构 |
code-verify | 按验收与风险验证、记录结果(高风险必须跑真实命令回执) | 掩盖失败或自动修复 |
code-commit | 校验阶段、范围、消息格式后提交 | 远程 push / 合并 / 发布 |
code-review | 评审变更,落结论与问题清单 | 代替实现或验证 |
6. Rules:这一步守什么
Rule 是纯正文的约束,只有挂在节点上、且走到那一步时才读。内置三条:
| Rule | 约束内容 | 典型触发 |
|---|---|---|
coding-conventions | 编码规范:复用优先、禁空 catch、禁全表更新等 | 写代码 |
commit-conventions | 提交消息格式、只提交任务内文件、禁止 push / 合并 / 发布 | 本地提交 |
security-redlines | 敏感数据、危险动作和权限边界 | 所有写操作 |
最重要的轻量原则:团队想改「提交消息格式」「交付要自测」这类约定,新建一个项目级规则 / 技能(用新名字)再挂到对应节点,而不是改一堆参数;内置 skill / rule 的正文不可被同名覆盖。
当前版本支持三个内置流程及追加阶段资源。可视化自定义流程处于规划阶段,尚未发布。
7. 配置流程与挂载
侧边栏点「工程流程」打开工作台,五个标签页:项目初始化 / 流程配置 / 任务 / 技能 skill / 规则 rule,默认落在「项目初始化」(详见第 8 节)。日常配流程只需在「流程配置」页做两件事:
- 选流程预设:standard / agile / minimal 点一下即切。
- 给节点挂 skill / rule:先选一个节点(如「开发」),再勾选它用什么 skill、守哪条 rule,保存。
「技能」和「规则」页提供搜索、来源筛选、新建、安装、查看、编辑与删除。内置资源只读。点「安装技能」直接打开系统文件选择器,选择含 SKILL.md 的文件夹;点「安装规则」选择一个 .md 文件。选择后先显示预览:名称、正文、文件数、体积、目标路径和同名冲突。确认项目或个人范围后点击「确认安装」;预览本身不写入文件,改变范围后需要重新预览。
项目资源写入工作区 .dsh/skills 或 .dsh/rules;个人资源写入 $DSH_HOME 对应目录。浏览器选择的是浏览器所在电脑的文件;高级目录模式读取 Harness 主机的目录。技能保留脚本、references、模板和二进制资源,排除常见缓存;上限 1000 文件、100 MB、单文件 20 MB、20 层目录,SKILL.md 和规则正文上限 1 MB。拒绝覆盖同名资源;主机扫描拒绝符号链接和 junction。浏览器上传不提供源链接元数据。
资源删除前会显示名称与实际目标路径,确认后永久删除;可点击「保留」取消。任务台账支持搜索、风险与阶段筛选,并显示验证、审核和更新时间。流程配置读取与保存失败时显示错误,损坏任务记录不会被静默视为没有任务。
// .dsh/eng.json 等价内容
{
"flow": "standard",
"stage_bindings": {
"需求评审": { "skills": ["requirement-analysis"], "rules": ["security-redlines"] },
"开发": { "skills": ["code-implement"], "rules": ["coding-conventions"] }
}
}
页面实时校验:挂到不存在的阶段、空名等会红字提示并置灰保存;保存前主机再校验一遍。错误的配置存不进去。
三层来源与优先级:同名 skill / rule,内置 > 用户 > 项目——内置不可被同名覆盖(新建同名会被拒,解析同名只读内置版)。要加团队约定,新建一个不同名的项目级 / 用户级资源再挂到节点上。
8. 项目初始化(init)
二开 / 遗留项目没有文档时,先给项目建一份「描述文件」——项目根的 AGENTS.md。DSH 平台会把它自动注入到每个会话,生成一次,之后每个任务开工 AI 都自带这份项目认知(项目是什么 → 怎么跑 → 结构 → 约定 → 坑)。
两种入口,推荐工作台:① 工作台「项目初始化」标签页(点按钮,可视化预览 + 保存,0.19.0 起,默认第一个标签页);② 对话式 init(对 AI 说「帮我初始化这个项目」,AI 调 dev_task 走 inspect → propose → apply)。
工作台初始化(推荐)
- 侧边栏点「工程流程」,工作台默认落在「项目初始化」标签页。
- 先看已有文档:顶部显示「未初始化」或「已初始化 · N 行(上限 200)」。工作区根没有
AGENTS.md时,会自动向下找唯一子项目、向上找父目录,并把实际定位路径标出来(如已定位到 D:\qdmai\qms\AGENTS.md)。 - 让 AI 初始化:点按钮,AI 扫描项目(目录结构、关键文件、技术栈、构建 / 运行命令、约定与红线)生成草稿——只预览、不落盘,硬校验行数 ≤ 200 行,超了精简到「项目是什么 → 怎么跑 → 结构 → 约定 → 坑」,只留骨架不塞长文。运行中实时显示「已耗时 X 秒」,最长 150 秒超时,超时提示重试即可。
- 保存 / 保存并覆盖:预览满意点「保存」——首次创建直接写入;已有
AGENTS.md会标「保存并覆盖」,必须人工点确认才覆盖,保护项目已有治理文件不被裸覆盖。 - 也可点「手动编辑」直接改正文后保存。
对话式 init
- inspect:对 AI 说「帮我初始化这个项目」;AI 读现有
AGENTS.md(若有)返回,没有则扫目录结构、技术栈、构建 / 运行命令、约定与红线。同时报告:项目根(自动从 workspace 向上发现)、语言栈(Node / Java / Python / Go / Rust)与默认验证命令、其它治理文件(CLAUDE.md、.cursorrules——init 只管理 AGENTS.md,不覆盖它们)、项目级 skill/rule 目录(.dsh/rules/*.md、.dsh/skills/<name>/SKILL.md)。 - propose:AI 写成
AGENTS.md草稿,此步只预览、不落盘,同样硬校验行数 ≤ 200 行,并返回内容 hash。 - apply:落盘。必须传回 propose 返回的
expected_hash(缺失或与内容不一致一律拒绝,防止预览与落盘之间内容被换);覆盖已有AGENTS.md时还必须传回existing_hash(证明审批期间现有文件未被他人改动)并带overwrite且经人工批准。写入目标必须在项目根内。
项目根/
├─ AGENTS.md ← init 生成,DSH 每会话自动注入
└─ .dsh/
├─ eng.json ← flow + verify_command(可覆盖语言默认验证命令)
├─ skills/ · rules/
└─ task-*.json
9. 如何开始一个任务
- 新建会话,预设选「工程化开发引擎」。
- 直接描述需求(加功能 / 修 bug)。
- AI 建任务、判
work_size与risk_level,停在起始阶段(标准流程是「需求评审」)。 - AI 落需求说明,需要拍板处发起审批,你点「允许」才进入下一步。
- 之后一个阶段一个阶段推进,直到「完成」。
10. 流程如何逐阶段执行
| 阶段 | AI 在这一站做什么 | 过关条件(不满足不让走) |
|---|---|---|
| 需求评审 | 拆需求、落「需求说明」 | 字段填全,且人点「允许」确认需求 |
| 设计 | 出最小方案、落「设计文档」 | 字段填全,且人点「允许」确认方案 |
| 开发 | 独立交付可派子代理,小修正可由主代理实施;每项做规格 + 质量两阶段评审 | 实施项非空且全部 done(每项带两阶段评审);已有项可省略标题,改已审核标题须显式重开 |
| 交付 | 执行验证、记录证据 | 新任务必须真实命令回执,退出码 0,未超时、取消或被沙箱拒绝 |
| 代码审核 | 评审变更,执行终态技能,受控提交 | 结论通过、字段填全、技能义务完成且真实 Git 提交已回写 |
| 完成 | 收尾 | — |
新任务离开阶段前检查绑定技能是否通过 skill 工具成功加载;附加技能需通过 skill_result 记录执行场景与真实验收命令;状态中的 command_receipts_required 列出这些技能,七个内置技能无需重复登记。挂在“完成”的技能在前一阶段执行。命令成功只证明该命令通过,不证明测试覆盖完整。审核改动后须重跑验证。旧任务继续使用冻结快照。
贯穿全程的硬规则
- 阶段是硬状态:status 说你在哪,就只做那一步,绝不倒带重走、绝不跳。
- 确认只能人来做:需求确认、方案确认由 AI 发起审批,你在页面点「允许」;AI 不能自己通过、不能绕过。
- 渐进披露:走到哪个阶段,才加载那一段的 skill / rule。
11. 任务状态如何记录进度
每个任务一份 .dsh/task-*.json,只保存当前有效状态,不保存聊天全文和流水日志。
| 字段 | 含义 |
|---|---|
id / title | 任务标识与标题 |
branch | 所属功能分支;恢复时以真实当前分支为准 |
stage | 当前阶段(决定下一步做什么、能往哪走) |
work_size | tiny / standard / complex,决定拆多细 |
risk_level | standard / high_risk,决定验证强度 |
requirement_confirmed | 需求是否已由人确认 |
solution_confirmed | 方案是否已由人确认 |
verification | 验证是否通过 + 证据(高风险附真实命令回执) |
review | 评审结论(通过 / 未过 + 问题) |
files | 本任务允许修改的文件范围 |
commits | 已创建的提交记录 |
会话断了没关系:重新开会话,AI 读 stage、确认态、验证与评审字段,就能从断点继续,不依赖上一轮聊天。
12. 验证、评审与提交
验证为什么不该总那么慢
- 实施中优先受影响模块的编译、目标测试与静态检查。
- 差异没变时复用有效证据,不重复跑相同命令。
- 无法联调外部系统时必须如实写「未联调」,不能把编译成功说成功能通过。
high_risk任务过验证门必须跑真实命令回执(引擎运行命令、取退出码,非自报通过)。verify不带command时引擎自动选命令:.dsh/eng.json的verify_command优先,其次按项目语言用默认(node →npm test、java →mvn -q test、python →python -m pytest、go →go test ./...、rust →cargo test);识别不出语言且未配置时保留自报路径。跑命令依赖宿主 shell 服务,未挂载会明确报错。- 验证命令始终在任务记录的项目根运行(任务创建时自动发现并固化
root),不是会话当前目录——monorepo 里会话停在子目录时,npm test等也会在放清单文件的项目根执行;回执记录的root与任务根强校验,不一致直接拒绝。
评审
开发阶段每项做「规格 + 质量」两阶段评审,都 pass 才标 done;缺评审或任一阶段 fail 会挡住「开发 → 交付」。
提交策略
| 策略 | 何时提交 | 标识 |
|---|---|---|
task | 整项验证、评审通过后一次提交 | TASK |
item | 每个独立项验证后提交;整项完成再提最终状态 | Tn,最终 TASK |
manual | 等用户明确要求才提交 | 用户指定 |
提交消息要求 【模块】【TASK】做了什么,且只提交任务 files 范围内的文件。要彻底封死模型绕过 dev_task 直接 git commit,给仓库装一道机械钩子:
dev_task operation=install_hook # 装入 .git/hooks/commit-msg,装上后任何 git commit 都被同一套规则校验
dev_task operation=verify_hook # 随时比对安装钩子与内置门禁的 hash,被替换/篡改立即报错
钩子的额外硬校验(0.21/0.22):① 任务记录的流程快照带 SHA-256 hash,被手改过的快照一律拒绝提交;② 触及敏感路径(.env、credentials、secrets、.git;.dsh 的任务记录与流程配置由快照 hash 与豁免保护,项目级 rules/skills 属常规内容)的提交,要求任务为 high_risk 且验证有真实命令回执,否则拒绝;③ 删除、类型变换、重命名的旧·新路径都受范围检查。
风险降级(0.22):set_risk 把 high_risk 降为 standard 必须人工批准,并写入任务的 risk_downgrades 审计记录;降级后高风险回执门不再适用,请谨慎。
13. 一个标准任务的完整走查
假设需求是「给现有查询接口加一个权限校验」。标准流程下,关键决策点应接近下面这样:
flow: standard // 项目预设
work_size: standard // 数个文件 + 权限判断
risk_level: high_risk // 涉及鉴权,验证要加证据
① 需求评审
- 目标:无权限返回 403;有权限正常返回。
- 验收、非目标写清 → 【人确认需求】
② 设计
- 最小方案:Controller 加校验、Service 复用现有鉴权方法。
- 不新建接口 / DTO / 异常包装 → 【人确认方案】
③ 开发
- T1:接口加校验 + 编写无权限 / 有权限用例。
- 规格 ✓ 质量 ✓ → done
④ 交付
- 验证:跑鉴权用例,`verify` 传真实命令(high_risk 由引擎取退出码判定)。
- 文件改动后必须重新验证,旧回执失效。
⑤ 代码审核
- 结论:通过 · 问题:无
- 执行挂在完成阶段的附加技能,再提交并回写真实 hash。
⑥ 完成
这类任务不应因为「以后可能复用」扩展成多层架构,也不应把推荐项自动当成验收条件。
14. 边界与常见问题
引擎只允许:读取仓库事实、修改已确认任务范围内的文件、按策略创建范围受控的本地提交。远程 push / 合并 / 发布、数据库写入,需人单独决定。
切换预设就是开关吗?
dev_task 和内置技能;选 standard 等其它预设则完全不介入。想改内置 skill / rule 怎么办?
任务文档要不要提交?
.dsh/task-*.json 是团队共享、跨会话恢复的任务事实,随分支提交——引擎已豁免 .dsh/task-*.json 与 .dsh/eng.json,不受文件范围门拦截;忽略它别人只能看到代码,看不到确认内容和进度。一个会话能同时做两个需求吗?
提交被拒是怎么回事?
git 钩子能防住所有绕过吗?
.git/hooks/commit-msg 是本地即时反馈,拦常规 git commit(校验任务、阶段、范围、消息、快照 hash、敏感路径),但挡不住 git commit --no-verify、core.hooksPath 替换或直接手改 task 记录。最终可信门禁在 CI:CI 里重新校验 task id、快照 hash、staged 范围、提交消息、真实验证退出码、高风险回执,并检测钩子是否被绕过。三层分工:钩子 = 本地反馈,host 工具流 = 正常路径强约束,CI = 最终验证。任务记录被手改会怎样?
revision 检查用于阻止并发覆盖,不提供身份认证。0.23.0 在读取内容前取得文件版本,使读取期间发生的并发写入也被拒绝。多用户隔离和可信状态签名需要 Harness 支持。Remote 如何限制工作区?
workspaceRegistry.resolveByPath 的 Harness 使用主机注册目录;未注册路径拒绝。旧主机保留绝对路径和系统目录检查,并提供严格注册 API。工作区注册不等于当前会话授权;共享多用户部署仍需要调用上下文和主机权限边界。dev_task 写文件被沙箱拒绝(file access denied)怎么办?
sandbox_permissions: "workspace-write"(或 "danger-full-access") 并配 justification(一句话说明原因),升级需要人工批准;无审批服务时直接拒绝。日常任务记录写入默认已在会话工作区内放行,通常无需升级。「完成」等于上线了吗?
done 只表示本地验证与必要评审通过;上线、合并、发布需人另行决定。状态查询中的 evidence_blockers 列出过期验证和附加技能回执;commit.allowed 同时检查这些阻塞及技能执行义务。legal_next 是流程定义的候选去向,不表示所有门禁已通过。
记录需求时提示字段不存在怎么办?
status.artifact_requirements,按当前阶段列出的字段填写。标准需求为 scope 和 acceptance_criteria,敏捷流程只有 scope。疑问、假设或待确认取舍写入字段正文,不新增字段名。错误输入整次不保存,修正后再提交;不需要修改流程配置或历史任务记录。版本 0.23.1 · 流程执行与真实回执修复 · 最后更新:2026-09-16