# dsh-restart-autoresume 验收报告 ## 1. 结论 验收日期:2026-08-29。 结论:**通过**。Phase 6 Remediation 已消除旧版“普通重启必须依赖外部 supervisor”的设计偏差:`dsh-restart-autoresume` 现在复用现有 `dsh-restart@0.3.1` 提供的 `dshRestartRuntime` Host 服务,只负责重启前持久化与新 Host 启动后的任务恢复,不实现第二套重启器。 本次不处理 DSH Desktop 安装、适配或应用修改;不开发 launchd/systemd/macOS 外部辅助。开发验收关闭时未修改生产 profile、真实用户 Session、远端仓库或发布状态;后续经用户明确授权执行的发布记录见第 12 节。 ## 2. 验收对象与基线 - 包:`@harzva/dsh-restart-autoresume@0.1.0-alpha.1` - 重启提供方:现有 `dsh-restart@0.3.1` - DSH:`0.1.1-rc.2` - Cordis:`4.0.1` - Node.js:22+ - 交付边界:一个 Host loader 行、一个 additive Client Slot、一个 JSON-only Typert Remote namespace - 运行边界:普通顶层 Session;subagent 永久排除 - 重启边界:autoresume 只调用同 Host realm 的 `dshRestartRuntime.requestRestart()`;关闭/重新打开 DSH 仍由既有 `dsh-restart` 拥有 - 数据边界:Resume Ledger 只保存 intent、Session 路由、状态、次数、时间、租约和安全结果码,不保存聊天正文、工具输出或凭据 ## 3. Phase 6 Remediation 对账 | 项目 | 结果 | 事实 | | --- | --- | --- | | 复用现有能力 | 通过 | `dsh-restart` 暴露最小 `{ provider: 'dsh-restart', requestRestart }` Service;内部仍委托既有 `desktopRuntime.requestRestart()` | | autoresume 集成 | 通过 | 删除旧 `SupervisorProbe + appExit` 生产合同;新增动态 `restart-runtime` 适配器,服务缺失、畸形或卸载时 fail-closed | | 严格顺序 | 通过 | 能力检查 → 冻结普通运行根 → flush → 原子 Ledger generation → Remote accepted ACK → fiber timer → 既有重启服务 | | Cordis 生命周期 | 通过 | Service contribution、Agent 监听、startup work、恢复 worker 与延迟重启都由 fiber/effect 持有;卸载取消未触发工作并排空已接纳工作 | | 不重复造轮子 | 通过 | autoresume 不包含进程拉起、Desktop 修改、launchd/systemd/macOS helper;隔离代次 harness 只用于测试观察,不进入候选包 | 旧候选 `0.1.0-alpha.0` 的 supervisor 假设已被本次 Remediation 取代,仅保留为历史测试记录,不再是可交付候选。 ## 4. 自动验证结果 | 验证 | 结果 | 事实 | | --- | --- | --- | | `dsh-restart` 自检 | 通过 | 15/15 Node 测试;覆盖精确委托、Service fiber 生命周期和原有 Host/Client 行为 | | autoresume `pnpm check` | 通过 | TypeScript 严格检查、构建、81/81 Node 测试、34 个源码/文档约束扫描 | | 隔离离线安装验证 | 通过 | 当前源码重新打包后安装到一次性 Web profile;配置合成、peer 检查和连续两次冷启动通过 | | Ledger/Observer | 通过 | 并发更新、写入中断、坏 JSON/坏记录、schemaVersion、过期、容量、卸载 drain、顶层 running/idle/disposed 与 subagent 排除全部覆盖 | | restart runtime/coordinator | 通过 | 服务动态出现/替换/消失、畸形服务、ACK 顺序、调用失败、重复请求、无任务、flush/ledger/scheduler 失败、卸载取消全部覆盖 | | DSH extension preflight | 通过 | Host/Client 扩展合同通过;仅提示 Client bundle 内 Zod JSON Schema URI 常量,源码无网络请求 | | 隔离 composition/mount | 通过 | 展开配置只有预期的 autoresume、真实 `dsh-restart` 与测试 Host 行;Host、Remote、Client Slot 和资产成功激活 | | 秘密与私有路径扫描 | 通过 | 源码、README、文档和候选包不含 token、凭据赋值、`.env`、临时测试目录或机器私有绝对路径 | | 候选包内容 | 通过 | 只含运行文件、声明、README、LICENSE、单一 bundle patch 和 4 张脱敏原生链路截图;不含 `src`、`tests`、脚本、环境文件或凭据 | ## 5. 隔离 Host 闭环 | 场景 | 结果 | 运行证据 | | --- | --- | --- | | 原生“仅重启” | 通过 | 真实 `dsh-restart` 发布 Host Service;点击确认后 generation 1 正常退出、generation 2 启动,HTTP 根与原页面重新可用 | | 运行任务登记 | 通过 | 普通顶层模型任务运行时,面板显示 1 个运行候选、1 个待处理 intent、0 个 Ledger issue | | 重启并恢复 | 通过 | 点击后 generation 2 正常退出、generation 3 启动;原 Session 收到稳定 operator intent 续作消息并继续原任务 | | durable 结算 | 通过 | 恢复任务完成后面板为 0/0/0;operator intent 为 `已恢复 · 尝试 1 / RESUME_DURABLE`,旧 crash marker 为 `SUPERSEDED_BY_OPERATOR_RESTART` | | disable-only 回滚 | 通过 | 同一隔离 profile 只把 `dsh-restart-autoresume` loader 设为 disabled;stock Web 根可用且“重启与任务恢复”入口不存在 | 隔离测试使用真实 `dsh-restart` 包和真实 autoresume 候选。测试 Host 只替代 DSH Desktop runtime 的退出动作,外层代次 harness 只观察子进程重连;两者均是测试 fixture,不是生产依赖,也没有修改 DSH Desktop。 真实模型密钥只在一次性隔离运行时中使用,未打印、未写入仓库、未进入截图、报告、候选包或命令输出。真实会话正文和原始日志不作为验收附件;报告只保留计数、状态码和代次事实。 ## 6. 既有故障演练回归证据 Remediation 没有改动 Ledger、资格判定、Session evidence 或 RecoveryWorker 的状态语义,以下 alpha.0 隔离证据与 81 项回归测试继续有效: - 无任务、单任务、多任务受控重启;operator/crash marker 原子 supersede。 - 模型流 `SIGKILL`、恢复中再次崩溃、每个稳定 RPC 最多一条持久继续消息。 - 工具副作用尚未发生/已经发生两种未知结果边界,恢复前先核验而不盲重试。 - 用户主动停止、completed、error、blocked、max-token 与 subagent 排除。 - 自动重试上限、熔断保持、人工 retry、断线重连、明暗/宽窄 UI。 ## 7. P0/P1 需求矩阵 | 需求 | 结果 | 证据 | | --- | --- | --- | | FR-01 两种重启操作 | 通过 | Client 测试与真实点击确认/取消闭环 | | FR-02 登记普通顶层 Session | 通过 | coordinator/Host 测试;真实 1 任务预览计数 | | FR-03 重启前 flush | 通过 | 严格顺序与失败阻断测试;真实 operator intent 形成 durable evidence | | FR-04 调用现有 DSH 重启服务 | 通过 | `dsh-restart` Service 测试;真实 generation 1→2 与 2→3 闭环 | | FR-05 重启服务缺失时拒绝 | 通过 | absent/malformed/replaced/unloaded Service 测试,候选捕获前 fail-closed | | FR-06 新进程领取 intent | 通过 | RecoveryWorker 测试;真实 generation 3 冷恢复 | | FR-07 operator 允许 disposed/interrupted | 通过 | 状态矩阵、RecoveryWorker 与真实受控重启 | | FR-08 crash 只恢复 interrupted | 通过 | 恢复资格测试和既有真实 `SIGKILL` 演练 | | FR-09 user/completed/error 不恢复 | 通过 | 状态矩阵、恢复测试与既有隔离演练 | | FR-10 固定 intent/RPC 去重 | 通过 | Session evidence、二次崩溃测试与真实 `RESUME_DURABLE` | | FR-11 未知副作用先核验 | 通过 | prompt 合同与既有两组工具故障演练 | | FR-12 展示进度与结果 | 通过 | Client 测试;真实 waiting/completed/superseded 状态 | | FR-13 限流/过期/上限/人工重试 | 通过 | Ledger/state/recovery 测试与既有隔离演练 | ## 8. 候选包与回滚 - 文件:`artifacts/harzva-dsh-restart-autoresume-0.1.0-alpha.1.tgz` - SHA-256:`71f2c5ce96aa2c626a2f27ea88a93a6fd41258eb9bbb4d689dc038dd10ae17b0` - 大小:410708 bytes - 状态:已作为 GitHub prerelease `v0.1.0-alpha.1` 发布;未发布到 npm,未安装到生产 profile 候选只允许进入可丢弃或明确批准的 profile,并要求同一 Host realm 已挂载兼容的 `dsh-restart`: ```sh dsh plugin --profile web add ./harzva-dsh-restart-autoresume-0.1.0-alpha.1.tgz --ignore-scripts ``` 立即禁用: ```yaml - id: dsh-restart-autoresume disabled: true ``` 禁用/移除不会改写 DSH Session 历史;重启后确认 stock Web 根可用且插件入口消失。 ## 9. 风险与已知限制 | 风险/限制 | 结论与处置 | | --- | --- | | 现有重启 Service 缺失/畸形 | 动态检测并 fail-closed;不会先写 operator generation 再发现无法重启 | | 外部工具 exactly-once | 不承诺;继续 prompt 强制先核验未知结果 | | 原子写断电耐久 | DSH 原子写提供锁和同目录替换,但不声明目录 `fsync` 级保证 | | 孤儿 ledger 锁 | 操作员确认无存活写者后处理;插件不猜测删除 | | subagent | 第一版不直接恢复;由恢复后的父 Session 重新协调 | | rc API 演进 | 只支持并验证 DSH `0.1.1-rc.2`;升级 rc 前重跑合同与隔离验收 | | Desktop 产品闭环 | 按用户明确边界排除;本次验证 Host Service 合同和 Web 重连,不修改 Desktop | 上述均为已接受的产品/平台边界,不构成未解决 blocker。 ## 10. 截图素材 - [现有 DSH 重启服务可用](assets/phase6-native-restart-panel.png) - [运行中的普通顶层任务已登记](assets/phase6-native-running-task.png) - [重启后原 Session 自动继续并完成](assets/phase6-native-autoresume-complete.png) - [Ledger 已恢复并结算](assets/phase6-native-ledger-settled.png) 素材来自隔离 profile,已用于 GitHub Release 与 README;发布过程没有新增或读取生产 Session 素材。 ## 11. 总验收状态 - Phase 1–6:全部完成,磁盘 checkbox、源码与测试一致。 - Phase 6 Remediation:通过。 - P0/P1:13/13 通过。 - completion gate:通过。 - 未解决 blocker:0。 - 整体开发 Goal:`closed`。 - 开发 Goal 关闭时未执行生产安装、提交、推送、发布或 DSH Desktop 修改;后续发布不改变 Phase 1–6 的关闭状态。 ## 12. 授权后的发布记录 - 公共仓库:`https://github.com/Harzva/dsh-restart-autoresume` - Git 历史:Release tag 建立在 13 个按状态模型、持久化、协调、恢复、Host、Client、测试、构建与文档拆分的非空提交之上;main 后续只增加发布记录与市场截图清单 - GitHub prerelease:`https://github.com/Harzva/dsh-restart-autoresume/releases/tag/v0.1.0-alpha.1` - Release 附件:与第 8 节记录的文件名、大小和 SHA-256 一致 - 仓库 topics:`dsh-plugin`、`deepseek-harness`、`cordis`、`session-recovery` - 市场 PR:`https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/3721` - 市场状态:普通内容检查通过;Submission gate 唯一失败项为仓库年龄 0.0 天,需等待市场规定的至少 1 天后重跑或重新提交 - 依赖边界:本仓库不打包或发布 `dsh-restart@0.3.1`;安装者必须先具备兼容的 `dshRestartRuntime` Host 提供方,且不得把 npm 上同名但未声明该合同的包视为等价实现 发布没有修改生产 profile、真实用户 Session、DSH Desktop、DSH fork 或内置 preset,也没有发布到 npm。