DSH · ENGINEERING DELIVERY ENGINE

工程化交付引擎 使用手册

这是一套装在 DeepSeek Harness 里的工程流程约束。它把「需求评审 → 设计 → 开发 → 交付 → 代码审核」做成硬门槛:阶段不能跳、关键节点必须人来拍板、验证和提交都被机械检查。在个人工作台里选一套流程,再给每个节点挂上合适的技能和规则。

选流程预设即可 standard / agile / minimal 需求、方案人工确认 范围受控本地提交 按预设激活

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 节)。日常配流程只需在「流程配置」页做两件事:

  1. 选流程预设:standard / agile / minimal 点一下即切。
  2. 给节点挂 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)。

工作台初始化(推荐)

  1. 侧边栏点「工程流程」,工作台默认落在「项目初始化」标签页
  2. 先看已有文档:顶部显示「未初始化」或「已初始化 · N 行(上限 200)」。工作区根没有 AGENTS.md 时,会自动向下找唯一子项目、向上找父目录,并把实际定位路径标出来(如 已定位到 D:\qdmai\qms\AGENTS.md)。
  3. 让 AI 初始化:点按钮,AI 扫描项目(目录结构、关键文件、技术栈、构建 / 运行命令、约定与红线)生成草稿——只预览、不落盘,硬校验行数 ≤ 200 行,超了精简到「项目是什么 → 怎么跑 → 结构 → 约定 → 坑」,只留骨架不塞长文。运行中实时显示「已耗时 X 秒」,最长 150 秒超时,超时提示重试即可。
  4. 保存 / 保存并覆盖:预览满意点「保存」——首次创建直接写入;已有 AGENTS.md 会标「保存并覆盖」,必须人工点确认才覆盖,保护项目已有治理文件不被裸覆盖。
  5. 也可点「手动编辑」直接改正文后保存。

对话式 init

  1. 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)。
  2. propose:AI 写成 AGENTS.md 草稿,此步只预览、不落盘,同样硬校验行数 ≤ 200 行,并返回内容 hash。
  3. apply:落盘。必须传回 propose 返回的 expected_hash(缺失或与内容不一致一律拒绝,防止预览与落盘之间内容被换);覆盖已有 AGENTS.md还必须传回 existing_hash(证明审批期间现有文件未被他人改动)并带 overwrite经人工批准。写入目标必须在项目根内。
项目根/
├─ AGENTS.md          ← init 生成,DSH 每会话自动注入
└─ .dsh/
   ├─ eng.json        ← flow + verify_command(可覆盖语言默认验证命令)
   ├─ skills/ · rules/
   └─ task-*.json

9. 如何开始一个任务

  1. 新建会话,预设选「工程化开发引擎」。
  2. 直接描述需求(加功能 / 修 bug)。
  3. AI 建任务、判 work_sizerisk_level,停在起始阶段(标准流程是「需求评审」)。
  4. AI 落需求说明,需要拍板处发起审批,你点「允许」才进入下一步。
  5. 之后一个阶段一个阶段推进,直到「完成」。
说需求建任务需求评审设计开发交付代码审核完成

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_sizetiny / standard / complex,决定拆多细
risk_levelstandard / high_risk,决定验证强度
requirement_confirmed需求是否已由人确认
solution_confirmed方案是否已由人确认
verification验证是否通过 + 证据(高风险附真实命令回执)
review评审结论(通过 / 未过 + 问题)
files本任务允许修改的文件范围
commits已创建的提交记录

会话断了没关系:重新开会话,AI 读 stage、确认态、验证与评审字段,就能从断点继续,不依赖上一轮聊天。

12. 验证、评审与提交

验证为什么不该总那么慢

  • 实施中优先受影响模块的编译、目标测试与静态检查。
  • 差异没变时复用有效证据,不重复跑相同命令。
  • 无法联调外部系统时必须如实写「未联调」,不能把编译成功说成功能通过。
  • high_risk 任务过验证门必须跑真实命令回执(引擎运行命令、取退出码,非自报通过)。
  • verify 不带 command 时引擎自动选命令:.dsh/eng.jsonverify_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_riskhigh_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 怎么办?
内置正文不可被同名覆盖(同名新建会被拒)。要加团队约定,新建一个不同名的项目级 skill / rule 再挂到对应节点,与内置并存。
任务文档要不要提交?
要。.dsh/task-*.json 是团队共享、跨会话恢复的任务事实,随分支提交——引擎已豁免 .dsh/task-*.json.dsh/eng.json,不受文件范围门拦截;忽略它别人只能看到代码,看不到确认内容和进度。
一个会话能同时做两个需求吗?
一个任务对应一份状态文档、一个分支。新需求保存当前进度后切新分支,切回原分支即可恢复。
提交被拒是怎么回事?
通常是四类:没建 dev_task 任务、阶段没到提交检查点、消息格式不符、提交文件不在任务范围内。按拒绝原因修正即可。
git 钩子能防住所有绕过吗?
不能,这是它的定位:.git/hooks/commit-msg本地即时反馈,拦常规 git commit(校验任务、阶段、范围、消息、快照 hash、敏感路径),但挡不住 git commit --no-verifycore.hooksPath 替换或直接手改 task 记录。最终可信门禁在 CI:CI 里重新校验 task id、快照 hash、staged 范围、提交消息、真实验证退出码、高风险回执,并检测钩子是否被绕过。三层分工:钩子 = 本地反馈,host 工具流 = 正常路径强约束,CI = 最终验证。
任务记录被手改会怎样?
流程快照内容与保存的 SHA-256 不一致时会被拒绝;任务记录本身没有签名,能同时修改内容与 hash 的本地用户仍可伪造。文件版本与 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,按当前阶段列出的字段填写。标准需求为 scopeacceptance_criteria,敏捷流程只有 scope。疑问、假设或待确认取舍写入字段正文,不新增字段名。错误输入整次不保存,修正后再提交;不需要修改流程配置或历史任务记录。

版本 0.23.1 · 流程执行与真实回执修复 · 最后更新:2026-09-16