🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

自愈实验台 miketako3/dsh-fracture

DeepSeek Harness
miketako312 天前有提交已提供中文文档扫描:含敏感能力

对比两次运行,自动验证并采纳修复改动

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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 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 方式引入。
预览分享卡片长什么样 ↓miketako3/dsh-fracture
分享 · DeepSeek Harness Hub
miketako3/dsh-fracture

对比两次运行,自动验证并采纳修复改动

回到顶部