dsh-evolution
DeepSeek DSH 的独立 Evolution bundle 预发布;promotion 的 host 代码不是安全沙箱。
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 6, 2026
- Updated
- Oct 7, 2026
Introduction
dsh-evolution
自我进化(Evolution)能力作为独立 DSH bundle 分发。DSH 主体保持官方原样,本插件通过官方 bundle / profile 机制安装,不修改官方源码、不向官方 node_modules 复制文件、不 patch 官方仓库。
本仓库是 dsh-evolution 的唯一开发、测试与发布来源;旧的 DSH 环境只作为历史迁移源和回滚基线,不再维护插件源码。
- 包版本:
0.2.0-rc.3(本地候选,未发布) - 支持的 DSH 版本范围:
0.2.0-rc.2/0.2.1-alpha.1(精确列表)。package.json的peerDependencies逐一列出经过真实安装验收的宿主版本,不通过 exemption 伪装其它版本兼容;列表之外的宿主由host.version报blocked。 - Node:
^22.19.0 || >=24.0.0(在当前验证环境为v26.10.0,pnpm11.26.0)。
状态:官方
0.2.0-rc.2与0.2.1-alpha.1上的完整验收均已完成并通过(干净 runtime 安装 / 官方 CLI 插件安装 / 启动 / 9 个工具注册 / 核心流程 inspect→propose→trial→measure→revert 且 disposer 恢复基线 / CLI 与最终 doctor / promotion 到 canary 并跨重启存活 / startup canary 提交 / canary regression 回滚 / 禁用启用 / 卸载重装 / 数据保留 / 不可兼容宿主阻断)。验收由本仓库的脚本执行,证据已入库:docs/evidence/dsh-0.2.0-rc.2.json与docs/evidence/dsh-0.2.1-alpha.1.json;复现方式、产物与尚未消除的发布风险见RELEASE.md。本仓库的验证入口是npm test,用户侧的可复现验证入口是scripts/doctor.mjs(见第 5 节)。当前0.2.0-rc.3仅在本地构建和验收,未创建 tag 或公开发布。
1. 安装 DSH 与插件
新版 DSH 使用官方推荐方式安装(任一即可):
npx @deepseek-ai/dsh web # 官方推荐
# 或源码:pnpm install && pnpm run build
本插件的发布产物与其校验信息发布在 GitHub Release 上,并随仓库固定在 release/(见 RELEASE.md)。本仓库固定的本地候选版本是 0.2.0-rc.3,尚未公开发布;现有公开发布入口仍为 v0.2.0-rc.2。该 RC 修复两条 CodeQL high,发布前验证 tag、sourceCommit 的实际包内容、固定产物与校验和,发布后重新下载并验收。
1.1 从公开 Release 安装(用户)
# 公开下载:无需 GitHub 仓库权限或登录
RELEASE_URL=https://github.com/ryukeilee/dsh-evolution/releases/download/v0.2.0-rc.2
curl -fL "$RELEASE_URL/dsh-evolution-0.2.0-rc.2.tgz" -o dsh-evolution-0.2.0-rc.2.tgz
curl -fL "$RELEASE_URL/SHA256SUMS" -o SHA256SUMS
curl -fL "$RELEASE_URL/manifest.json" -o manifest.json
# 也可使用 GitHub CLI;公开仓库无需先运行 gh auth login
gh release download v0.2.0-rc.2 --repo ryukeilee/dsh-evolution \
--pattern 'dsh-evolution-*.tgz' --pattern 'SHA256SUMS' --pattern 'manifest.json'
# 校验:必须与本次下载的 SHA256SUMS 一致
sha256sum --check SHA256SUMS # macOS:shasum -a 256 -c SHA256SUMS
# 安装 / 升级(同一条命令;官方 CLI 负责 bundle 选择与依赖安装)
DSH_HOME=/isolated/home dsh plugin --profile web add ./dsh-evolution-0.2.0-rc.2.tgz
# 启动
DSH_HOME=/isolated/home dsh web --no-open
历史
v0.2.0-rc.1的 tag 与发布资产存在 provenance 不一致;原 tag 和附件保留,详情见RELEASE.md。请使用v0.2.0-rc.2。
1.2 从源码构建(贡献者)
本地候选可用 release/dsh-evolution-0.2.0-rc.3.tgz 安装,校验信息见仓库的 release/SHA256SUMS;它与公开 rc.2 的下载校验信息不同。
npm ci
npm run release:pack # 生成 dist/;本机构建的压缩字节受 npm 版本影响
npm run pack:check # 校验内容白名单、权限、发布固定点(pin)
本机构建的字节不保证与发布产物相同(npm pack 的 gzip 输出随 npm 版本变化);保证一致的是内容:用 npm run release:verify -- dist/dsh-evolution-0.2.0-rc.3.tgz --content-only 核对内容摘要。
安装后官方 profile 的 package.json 会把 dsh-evolution 列入 dsh.profile.bundles,插件随 profile 加载,无需每 session 手工挂载 preset。
2. 数据边界与配置
- 默认数据根:
$DSH_HOME/storages/evolution,可用 profile patch 的dataRoot覆盖。 - 事件签名密钥
event-bridge.key仅在该目录首次创建,不会被禁用/卸载删除。 - 官方
ctx.storageDomain(backend: json,root$DSH_HOME/storages)承载领域聚合元数据;领域名evolution_domain(官方UNIT_NAME_RE不允许连字符)。冷档案/轮转文件仍由插件文件后端写入<dataRoot>/dockyard。 - 领域 schema 在模块加载时按官方
defineDomain规则 fail-loud 校验(名称、表名、禁止 nullable global)。原始错误内容只经脱敏 DTO 进入领域存储。 domainSeed(默认false):显式授权把已迁移的<dataRoot>/dockyard/state.json种子载入领域聚合。默认关闭,避免误读旧环境。
3. 旧数据迁移
使用 scripts/import-evolution-data.mjs 把旧 preset 与 Dockyard 快照导入新数据根:
node scripts/import-evolution-data.mjs \
<old-preset-root> \
$NEW_HOME/storages/evolution \
<dockyard-evolution-snapshot-dir>
- 先暂存、逐文件 SHA256 校验、再原子改名发布;
migration-manifest.json记录 importId 与不可变来源副本。 - 重复执行返回
already-imported,不重复追加、不覆盖运行后数据。 - 来源内容与已导入根不一致时拒绝,防止静默合并;源文件在导入期间变化会被检出。
- 导入含未完成的旧 promotion journal 时拒绝,要求先显式恢复。
4. 升级与回滚
# 升级到新版本 tarball
DSH_HOME=/isolated/home dsh plugin --profile web add ./dsh-evolution-<new>.tgz
# 回滚到旧版本
DSH_HOME=/isolated/home dsh plugin --profile web add ./dsh-evolution-<old>.tgz
- 升级只替换插件包;数据根、
promoted.cordis.yml、promoted 子插件源码、archive/evidence 全部保留。 - 回滚旧插件包后,已提交的 promotion composition 会在启动时按 journal 恢复;若 composition 引用了新版本独有实现,需按“promotion”边界人工移除对应条目后重启(stable commit 后没有 journal 的自动回滚不受支持)。
- 官方
pluginManager.setBundleEnabled支持热禁用(当前实测applied,插件工具/服务立即下线)或restart-required;两种语义都由官方决定,插件不假设。 - 卸载:停止应用后
dsh plugin --profile web remove dsh-evolution。卸载不删除用户数据。
5. 统一诊断入口(不需要 LLM)
插件提供一个不依赖模型推理、不联网、不上传任何 Evolution 数据的诊断入口;所有结论都来自真实运行状态,并带可定位的 evidence,不是“配置是否存在”。
5.1 命令行(应用未运行也可用)
安装到 profile 后会提供 dsh-evolution-doctor 命令;也可以直接用 node 运行脚本:
# 只读诊断;默认自动识别“在 dsh.profile.bundles 中列出 dsh-evolution”的 profile
<profile>/node_modules/.bin/dsh-evolution-doctor \
--home "$DSH_HOME" [--profile web] [--dsh-cli <.../@deepseek-ai/dsh/lib/bin.js>] [--json]
# 等价写法
node <profile>/node_modules/dsh-evolution/scripts/doctor.mjs --home "$DSH_HOME" [--json]
# 只应用报告判定为“安全且幂等”的修复,然后重新验证
<profile>/node_modules/.bin/dsh-evolution-doctor --home "$DSH_HOME" --repair [--json]
- 退出码:
0健康、1存在可降级问题、2存在阻塞问题。 - 报告写入 stdout,本地绝对路径只出现在本地输出中,不会被上传。
--repair只处理报告里recoverable=true且带repair的项;recoverable=false的状态永远不会被自动改动。
5.2 会话内(真实运行时)
evolution_doctor 工具返回同一份报告,并在真实宿主中核对:必需服务(tools / storageDomain / dynamicCordisRunner / systemPrompt / loader)、全部 9 个工具的注册状态(逐个用官方注册表解析)、内部/实验性 introspection API 的可用性、promotion Include 适配器方法、数据根与跨进程锁。
5.3 分级与覆盖
| level | 含义 |
|---|---|
ok | 已验证健康 |
degraded | 仍可用,但存在有界且被命名的限制,或存在可安全恢复的状态 |
blocked | 关键保证无法满足;不要在该状态下执行破坏性流程 |
not-evaluated | 当前模式无法观测该事实(例如 CLI 模式下无法观测实时注册),报告会显式列出,绝不静默略过 |
coverage 分别列出已评估/未评估项;degradedCapabilities 单独列出已知的非阻塞能力限制(advisory evaluator、continuous/governance 未接入实时循环、host-only promotion、legacy 适配器、internal API 依赖)。
5.4 能识别的故障范围
- 宿主不兼容:
host.cli/host.version/host.modules(按peerDependencies校验 DSH 与各宿主模块版本,指出是哪个模块越界;DSH 版本必须落在经过真实验收的版本列表内,否则报blocked并给出verified: false)。 - profile 与注册:
host.install(未安装 / 未列入 bundles / 已安装版本与本诊断包版本漂移)、host.composition(调用官方dsh --dump-config,校验 bundle 层与两个 loader 入口是否存在且启用)。 - 运行时能力:
runtime.capabilities、runtime.registration、runtime.internal-api(缺哪个服务/方法/探针就点出哪个)。 - 数据与状态:
data.root、data.key、state.memory(含隔离文件)、state.archives、state.event-bridge(逐行 MAC 验证、重复事件、同 id 冲突 MAC、截断尾行)、state.domain(官方 schema 校验、pending 事务、孤儿 staging、损坏的 archive 锁)。 - 迁移:
migration.manifest(importId是否与文件清单自洽、不可变来源是否被改、目标文件是否缺失、未发布的 staging 是否残留)。 - promotion:
promotion.journal明确区分not-executed/incomplete/canary-observing/committed-pending-cleanup/rollback-failed/state-unknown,并做 journal 目标边界校验;promotion.composition校验行是否越界、悬空或残留孤儿目录;promotion.pointer校验EVOLUTION.md指针与 composition 是否一致。
5.5 恢复语义(全部幂等)
| 状态 | 处理 |
|---|---|
journal prepared / committing | 从 journal 备份回滚(CAS 保护,不覆盖并发修改);--repair 或下次启动自动完成;重复执行无副作用 |
journal stable-committed / committed | 只清理 journal 目录,不动 composition 与已提交插件 |
journal rollback-failed | 不自动处理:保留 journal 并报 blocked |
| journal 无法解析 / 阶段未知 / 目标越界 | 不自动处理:报 blocked,保留现场 |
| event bridge 未闭合尾行 | 只丢弃不构成记录的尾部字节;重复执行不改变文件 |
| domain 孤儿 staging | 仅在无活进程持有 archive 锁时清理;有活进程时报告并拒绝 |
| domain archive 锁无主(空内容或死 pid) | 运行时会自动回收;--repair 可显式清理;有活主的锁永不抢占 |
EVOLUTION.md 指向迁移前 legacy 能力 | 依据 migration manifest 的“No legacy promoted code execution”边界,报告为“有意不挂载”,不计为故障 |
| 损坏的 failure memory | 不删除:报 degraded 并说明下次启动会隔离(quarantine)保留原字节 |
| 损坏的 domain 聚合 / 事件 MAC / 不可变迁移证据 | 报 blocked,不重写、不猜测、不合并 |
6. 核心能力
保留旧 orchestrator 的成熟语义:proposal / candidate 风险分级、trial 临时激活与 teardown 基线恢复、measurement、promotionGates、journal 原子提交、CAS、跨进程锁、target claim、单调 evidence hydration、canary/restart、metricRegression 自动 rollback 与失败学习;durable memory、失败抑制、知识去重、冷档案/轮转/index 重建、canonical/tombstone/provenance。
- Promotion 通过官方
@deepseek-ai/cordis-plugin-include@1.0.9承载私有 promoted composition,不再创建 profilenode_modulesmount/symlink。禁用/卸载父 bundle 会 dispose promoted 子 Fiber,而 composition/源码/档案保留。 - 提交与回滚调用公开
Include.refresh()/EntryTree.await(),验证公开tree.store/entry.fiber的 active 状态。 - 领域层新增:
EvolutionMemory(含冷档案/语义 GC)、EvolutionObservationStore、EvolutionEvaluator、knowledge通过官方storageDomain接入。领域提交使用 staging +domain.global.set的 pending 协议,重启后installPending重放。 - 迁移白名单/guard 收紧,禁止重写 Cordis、禁止账户/provider/OAuth/旧 Web 与宿主主体写入。
7. 已知限制(必须显式记录,不使用隐藏 patch 绕过)
- Promotion 的领域 evaluator 仍是 advisory:
promotionGates是生产权威;领域 evaluator 提供记录在案的决策与“识别到 regression 即否决”的硬性 veto。它要求 goal/test/regression/已识别指标全部通过才会给promote,但本插件尚未接入宿主提供的独立生产 baseline/test 指标,因此只有自定义指标时 evaluator 会返回reject(不阻塞),真实独立指标接入待补。 - continuous / governance 领域模块已提取并单测通过,但未接入 orchestrator 实时循环:
lib/dockyard-domain/continuous/、governance/是无旧运行时副作用的纯领域实现,当前未启动第二套 Engine/scheduler。旧dockyard数据以文件形式完整保留,可用domainSeed载入。 - Host-only:Client half 一律拒绝。持久化源码使用合作式
Function(hostCode)()兼容 gate,只接受同步、独立返回 Cordis Plugin 的函数体;任何harnesstoken 保守拒绝。这不是安全沙箱。 - 内部 API 依赖:introspection 仍依赖
ctx.registry.values()、ctx.reflect.props/_getImpl()、ctx.events._hooks、Fiber effect 元数据;Include adapter 使用源码中公开的root.data/store/Entry.fiber/Fiber.state/ctx.get()。这些不是稳定跨版本公共契约,升级 DSH 前必须重新验证——runtime.internal-api会逐个探针报告可用性,缺失时降级为degraded而不是假装健康。 - 直接 dispose 底层 bundle Fiber 的手工 probe 仍无法自我断言(dispose 会使 probe 自身注入的
tools失活);官方pluginManager禁用/启用与 CLI 卸载/重装路径已独立验证。该底层路径不作为用户关闭流程。
8. 验收与官方参考
本仓库的真实验收已完成,并且由本仓库的脚本执行、证据随仓库分发:
- 单元/集成测试:
npm test(139 个用例,含故障注入、CI 工作流校验与发布固定点校验)。 - 宿主真实验收:
node scripts/acceptance/run-host-acceptance.mjs --host <version>,自包含安装官方宿主与 tarball,覆盖安装、诊断、核心流程、升级与回滚、promotion/canary 回滚与跨重启存活、禁用启用、卸载重装与数据保留。 - 用户侧可复现验证入口:
scripts/doctor.mjs,不依赖模型,对安装、状态、迁移、promotion 给出分级结论与证据。 - 发布产物、复现步骤与剩余风险:
RELEASE.md;验收证据:docs/evidence/;发布固定点:release/manifest.json。 - 从 Release 重新下载后用
npm run release:verify -- <tarball>核对字节与内容摘要。
CI 见 .github/workflows/ci.yml(单测矩阵、可复现打包与内容白名单、两个宿主的真实安装验收)。
官方参考:packages/boot/plugin-manager/README.md、docs/user/develop/basic/publish.md、packages/storage/storage-domain/{README.md,src/spec.ts}、vendor/include/README.md。