对比两次运行,自动验证并采纳修复改动
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add miketako3/dsh-fracture该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 50 处,展示前 43 条)
- 读取本地文件src/adopt.ts:40
names = await readdir(store.runsDir) - 读取本地文件src/adopt.ts:47
const text = await readFile(join(store.runsDir, name, 'result.json'), 'utf8') - 读取本地文件src/adopt.ts:77
const entries = await readdir(source) - 写入本地文件src/adopt.ts:109
await mkdir(bundleDir, { recursive: true }) - 写入本地文件src/adopt.ts:112
await writeFile(join(bundleDir, 'cordis.patch.yml'), renderPatch(rows), 'utf8') - 写入本地文件src/adopt.ts:155
await writeFile(join(bundleDir, 'ADOPT.md'), instructions, 'utf8') - 读取本地文件src/adopt.ts:162
existing = await readFile(settings.profilePatch, 'utf8') - 写入本地文件src/adopt.ts:167
await writeFile(settings.profilePatch, `${existing}${separator}${layer}`, 'utf8') - 读取本地文件src/autopilot.ts:307
const raw = await readFile(this.#statePath, 'utf8') - 写入本地文件src/memory.ts:31
await mkdir(store.memoryDir, { recursive: true }) - 写入本地文件src/memory.ts:33
await appendFile(observationsPath(store), `${lines}\n`, 'utf8') - 读取本地文件src/memory.ts:41
text = await readFile(observationsPath(store), 'utf8') - 读取本地文件src/memory.ts:67
return await readFile(digestPath(store), 'utf8') - 写入本地文件src/memory.ts:75
await mkdir(store.memoryDir, { recursive: true }) - 写入本地文件src/memory.ts:76
await writeFile(digestPath(store), markdown.endsWith('\n') ? markdown : `${markdown}\n`, 'utf8') - 写入本地文件src/memory.ts:81
await mkdir(store.baseDir, { recursive: true }) - 写入本地文件src/memory.ts:82
await appendFile(store.journalPath, `- ${new Date().toISOString()} ${line}\n`, 'utf8') - 读取本地文件src/memory.ts:88
const text = await readFile(store.journalPath, 'utf8') - 读取本地文件src/probe.ts:54
const entries = await readdir(join(store.candidateDir(candidate.id), 'plugin')) - 执行外部命令来自配置/变量src/probe.ts:89
child = spawn(settings.dshCommand, args, { cwd, signal: combined, env: process.env, stdio: ['ignore', 'pipe', 'pipe'] }) - 写入本地文件src/probe.ts:284
await mkdir(runDir, { recursive: true }) - 写入本地文件src/probe.ts:286
await writeFile(join(runDir, 'report.md'), renderReport(result, candidate, verifyDetail, judgement), 'utf8') - 读取本地文件src/propose.ts:208
const text = await readFile(join(store.candidateDir(id), 'candidate.json'), 'utf8') - 读取本地文件src/skills.ts:152
entries = await readdir(store.skillsDir, { withFileTypes: true }) - 读取本地文件src/skills.ts:161
const text = await readFile(path, 'utf8') - 读取本地文件src/skills.ts:186
const existing = await readFile(path, 'utf8') - 写入本地文件src/skills.ts:191
await mkdir(dir, { recursive: true }) - 写入本地文件src/skills.ts:192
await writeFile(path, text, 'utf8') - 写入本地文件src/store.ts:44
await mkdir(this.diagnosesDir, { recursive: true }) - 写入本地文件src/store.ts:45
await mkdir(this.candidatesDir, { recursive: true }) - 写入本地文件src/store.ts:46
await mkdir(this.runsDir, { recursive: true }) - 写入本地文件src/store.ts:47
await mkdir(this.memoryDir, { recursive: true }) - 写入本地文件src/store.ts:48
await mkdir(this.skillsDir, { recursive: true }) - 写入本地文件src/store.ts:49
await mkdir(this.criteriaDir, { recursive: true }) - 读取本地文件src/store.ts:72
text = await readFile(path, 'utf8') - 读取本地文件src/store.ts:82
const entries = await readdir(this.candidatesDir, { withFileTypes: true }) - 读取本地文件src/store.ts:104
existing = await readFile(this.lessonsPath, 'utf8') - 读取本地文件src/store.ts:122
return JSON.parse(await readFile(join(this.criteriaDir, `${assertSafeId(id, 'criteria id')}.json`), 'utf8')) as Criteria - 读取本地文件src/store.ts:140
const entries = await readdir(this.criteriaDir) - 删除本地文件递归src/store.ts:149
await rm(this.runDir(id), { recursive: true, force: true }) - 读取本地文件src/workspace.ts:30
await access(path) - 删除本地文件递归src/workspace.ts:49
await rm(destination, { recursive: true, force: true }) - 写入本地文件src/workspace.ts:50
await mkdir(destination, { recursive: true })
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence@deepseek-ai/dsh-session-query@deepseek-ai/dsh-subagent@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
一个 DSH 插件,会观察自己的会话、记住学到的东西,并改动自己运行所在的 harness,但只有第二次运行验证通过的改动才会保留。
README
由 DeepSeek 最新模型翻译生成dsh-fracture
一个 DSH 插件:读取已结束的会话,找出 harness 让智能体失败的地方,把修复写成数据,再把任务跑两遍,看修复有没有起作用。
架构
flowchart LR
S[session events] -->|turn end| O[observe.tsper-turn facts]
O --> M[(memoryobservations.jsonl)]
M --> D[digestMEMORY.md]
M --> K[skillsSKILL.md]
D --> P[prompt sectiontitles only]
K --> P
K -->|ctx.skills.register| T[skill catalog]
O --> G{repeatedand clean?
展开完整文档(README 剩余 1 节)
dsh-fracture
一个 DSH 插件:读取已结束的会话,找出 harness 让智能体失败的地方,把修复写成数据,再把任务跑两遍,看修复有没有起作用。
架构
flowchart LR
S[session events] -->|turn end| O[observe.tsper-turn facts]
O --> M[(memoryobservations.jsonl)]
M --> D[digestMEMORY.md]
M --> K[skillsSKILL.md]
D --> P[prompt sectiontitles only]
K --> P
K -->|ctx.skills.register| T[skill catalog]
O --> G{repeatedand clean?}
G -->|yes| K
D -.->|evidence| X[fracture_diagnose]
X --> Y[fracture_propose] --> Z[fracture_probe] --> A[fracture_adopt]
Z -->|verdict| W[watch windowauto-revert]
A --> B[bundlehuman installs]
读代码之前,先记住两个关键性质:
- 候选方案如果带 plugin/ 目录,就在单独的 dsh 进程里运行。未经检验的代码永远不会加载进负责评判它的那个进程。
- 候选方案只要碰到审批、沙箱策略、插件管理器或本插件,存进去之前会被拒绝,探测之前还会再拒绝一次。
分层边界的来由写在 docs/仕組み.md(日文)。
它是什么
DSH 用一串有序的插件行搭出智能体。模型、提示词段落、技能根目录、工具、审批策略:每一项都是一行,各有自己的配置。
由此有两点推论。harness 是数据,所以候选 harness 就是相对当前 harness 的一份 diff。两个 harness 可以同时存在,所以判断一项改动,可以让同一个任务在两边各跑一遍,而不是问模型「你觉得这个主意好不好」。
问题
没人有空调优的环境里,常见三种失败。
同一个错误跨会话重复。 工具失败,因为项目用的是 pnpm,或者因为测试跑之前得先构建 fixture。模型自己搞明白了,会话结束,下个会话从零开始。
调 harness 全靠猜。 有人改了系统提示词,觉得智能体表现变好了,却没办法验证。改动留下了。下一次改动又叠在上面。两个月后没人知道哪一行才重要。
什么都不积累。 会话跑得顺,让这次顺利的流程却没写进任何下个会话能读到的地方。
三种失败同一个根因:循环里没有任何东西记录发生过什么,也没有任何东西拿改动和基线做对比。Fracture 把这两样都补上,还能让它们无人值守地跑。
它做什么
它把每个已完成的回合记成事实,而不是散文:跑了哪些工具、顺序如何、什么失败了、你是否不得不介入纠正。二十个回合之后,这份日志变成一份摘要。同一套流程干净重复三次之后,流程就变成技能。摘要和技能列表以简短索引的形式进入提示词,智能体因此知道自己学到了什么,又不必加载记录的全部内容。
它也会改动 harness,但只在有测量数据支持时才改,而且它能自行改动的深度有上限:
| 层级 | 改动内容 | 门槛 |
| 记忆 | 观察记录、摘要、日志 | 无,只增不改 |
| 技能 | skills/<slug>/SKILL.md,实时注册 | 无,只增不改 |
| 组合 | 提示词行、技能目录行、工具开关 | 探测结论加观察窗口,指标回退时自动回滚 |
| 代码 | 候选插件模块 | 人工:dsh plugin add |
前两层是知识。它们不能执行任何东西,不能扩大权限,删掉文件即可移除,所以无需询问就能运行。第三层是数据改动,由循环负责,也能撤销,所以无需询问就能运行,但之后要观察十二个回合,数字变差就回滚。第四层决定你的进程里跑什么代码,所以循环可以编写、可以探测,由你决定是否运行。
最后这条是刻意设计的。能安装自己代码的智能体,做这件事时不需要人在环内;它第一次糟糕的改动,就会是它从内部无法察觉的那次改动。
它写下的所有东西都是你能读的文件:.dsh/fracture/。
提炼出技能、应用改动、回滚,各自向会话投递一条折叠通知,循环因此从不悄悄行动。其他动作不发通知,因为每回合一条通知就不再是信息了。
安装
dsh plugin --profile web add github:miketako3/dsh-fracture
这就是分发路径。它从仓库安装,并在安装过程中构建包。
pnpm 默认拒绝运行 git 托管包的构建脚本,所以第一次尝试会失败,报 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED。把错误里打印的 allowBuilds 行复制到 $DSH_HOME/profiles/web/pnpm-workspace.yaml,再跑一次命令。这个键包含拉取到的提交哈希,所以 main 一动它就变。
重启一次。无需配置:观察和记忆立即开始。
$DSH_HOME/profiles/web/cordis.patch.yml
- id: fracture
name: dsh-fracture
config:
autonomy: full # off | memory | skills | full
baseDir: .dsh/fracture
digestEvery: 20 # observed turns between digest rewrites
distillMinRepeats: 3 # clean repetitions before a skill is written
autoLoop: true # let the 15 minute idle trigger run the whole loop
autoApply: true # apply a prompt-only candidate that probed improved
watchTurns: 12 # turns watched before an applied change is kept
maxWatches: 3 # changes watched at the same time
judge: off # off | rubric; score a candidate that has no check
工具
循环内部会用到这些工具,你也可以手动调用其中任意一个。
| 工具 | 作用 |
| fracture_diagnose | 给当前 harness 的短板排序:工具失败率、重复读取、被拒绝的审批、压缩压力、消息反馈。 |
| fracture_propose | 派一个提议子代理,写出一个候选,形式为 candidate.json,外加可选的 skills/ 或 plugin/。 |
| fracture_probe | 在当前 harness 和候选上各跑一个任务,然后对比。写出 runs/<id>/report.md。 |
| fracture_plan | 把请求转成可运行或可阅读的检查项 |
| fracture_adopt | 把探测过的候选转成可安装的包,并追加经验。从不执行安装。 |
| fracture_status | 学到了什么、提议了什么、每个候选得分如何。 |
| fracture_loop | 跑一次 diagnose → propose → probe → apply,闸门与空闲触发所用的相同。 |
| memory_search | 搜索摘要、过往轮次和提炼出的技能。 |
文档
| 文件 | 内容 |
| README.ja.md | 同一篇介绍,日文版 |
| docs/仕組み.md | 工作原理:四个层级、触发器、观察窗口、受保护面 |
| CONTRIBUTING.md | 开发、发布步骤,以及什么样的 pull request 算好 |
| SECURITY.md | 什么算漏洞,什么是有意设计 |
| CHANGELOG.md | 每个版本改了什么 |
设计和贡献文档用日文写。这是有意为之:读它们的是维护这个循环的人,而翻译过的设计文档会丢掉让它有用的那份精确。
这些想法从哪来
Harness²(Google Research,Apache-2.0)是三个想法的直接来源,本插件全部实现了:
- 对比胜过内省。 判断一次编辑,要在两个 harness 上各跑任务,而不是让模型去评审。
- 经验随证据累积。 每次采纳都把线索、改动、结论和理由追加到 lessons.md。
- 从最弱的杠杆升级。 提示词先于技能,技能先于脚本,脚本先于工具,工具先于钩子。
Harness² 的八文件 harness 树有意不采纳。DSH 的行列表本身就是那棵树,还带加载器和 diff,照抄那棵树等于给同一件事再加一种描述方式。
其余是 DSH 自己的材料:用于组合的插件行、用于流程的 SKILL.md 约定、用于观察的 session/event,以及用于注入的作用域提示词段。没有引入 Harness² 的任何代码。
开发 bash
npm install && npm test # 128 tests, node:test only
npm run build
npm run demo # one loop over synthetic turns
欢迎贡献,但请先读 CONTRIBUTING.md,因为这里的多数改动是在挪动边界,而不是新增功能。
状态
0.2 覆盖观察、记忆、技能蒸馏、实时提示词区段、无人值守循环、会话内通知,以及提示词级候选的自动应用与自动回滚。行状候选仍需经过打包和人工处理。
许可证
MIT。Harness² 为上述想法提供署名,但未以 vendor 方式引入。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
miketako3/dsh-fracture
对比两次运行,自动验证并采纳修复改动
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 21,780未汉化DSH
73.5
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 1,947已汉化MCP
72.7
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,347已汉化DSH
71.9
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13917 个插件含 PR 收录与…
★ 343已汉化DSH
71.6