# HANDOFF — dsh-approval-ledger > Language: [English](HANDOFF.en.md) · [中文](HANDOFF.md) > 从设计会话迁移的交接文档。新会话先读这一份,再读 `docs/design.md`、`docs/runtime-spike.md` 和 `docs/runtime-notes.md`。 ## 0. 当前状态 - 阶段:**Sprint 3 代码完成,0.2.0-beta.5 待发布**(`0.2.0-beta.4` 已发布:`ask_choices` + 中文审批介绍;280 个单测;desktop 当前 beta.4)。高风险 opt-in 端到端测试已补:计划可授权,但实际高风险调用仍回退官方审批卡。`/approvals sessions` 已实现跨会话只读计数,不展示范围、不允许跨会话放行。剩余发布前工作:Windows 闪烁真机、sibling live 验证、0.3.0 稳定版。 - 运行时依据:`docs/runtime-spike.md`(静态核对 DSH 0.2.1-rc.2;目标已改为 0.2.1-rc.2)。 - live P0:临时 profile `approval-p0` 已用无头 Chrome + CDP 自动验证:plan-review → 多选授权(只勾 A)→ A 执行/B 不执行;高风险 `danger-full-access` write 弹出官方审批卡,标题被改写为 `write · …\p0-approval-test.md · danger-full-access`,拒绝后 fail-closed、文件未创建;计划“要求修改”返回 cancelled 且无写入;子代理调用返回 `DELEGATED_CALLER` 错误。audit 已能把无审批事件的 A 按 targetHash 归到计划项(标“无法验证”),把被拒的高风险 write 归到计划项(标“已核对/拒绝”)。 - desktop 安装:已切换到 npm `dsh-approval-ledger@0.2.0-beta.4`;`package.json` 依赖已是版本号,`node_modules` 是实际包目录(非 junction),`request_approvals`、`ask_choices` 和 client header `approval-ledger-details` 已加载。切换时的旧 link junction 备份为 `node_modules\dsh-approval-ledger.link-bak-20261019`,可后续确认删除。`pnpm peers check` 的缺失 peer 来自既有 `dsh-context`/`dsh-cost-meter`,本插件无依赖/peer。sibling prepend ordering 已由 FakeContext 单测覆盖,live 双插件场景未测。 - 仓库: - 包名 / Loader row id:`dsh-approval-ledger` / `approval-ledger` - License:MIT - 作者:`yingcai233333` - 目标 DSH:`0.2.1-rc.2`(Windows 桌面;macOS/Linux 只保证非闪烁功能) - 工作区:`D:\AIworkspace\dsh-approval-ledger` ## 1. 要解决的问题 DSH 的写文件/跑命令审批是一个一个串行弹的:第一个审批卡住时,后面的工具调用还没开始。用户希望: 1. 一次看到这一批需要审批的操作,而不是逐个点; 2. 列表简明,能点开看“是什么 / 为什么 / 批准后会怎样 / 建议”; 3. 有明确承接关系的审批能按阶段/依赖展示; 4. 关键/危险操作要重点标出,避免漏看; 5. 需要审批时桌面图标能闪烁提醒; 6. 所有决策可追溯,像 DSH 的会话日志一样有迹可循。 ## 2. 不可违反的硬约束 - **不新增 session 事件类型**。DSH 的 live `Session.append()` 不能设置 `ignorable: true`,新事件会让会话拒绝重开。决策审计只能基于现有事件 + `tool/result.meta` + 插件账本 + 派生投影。 - **不替换 `ui-approval`**。用官方审批卡,升级风险最低。 - **不占用 `conversation.approval.detail`**。它是 single 槽,已被 `ui-chat` 的 `ApprovalCommand` 占用;再注册会抛错。 - **不修改 Electron 主进程**、不改系统环境变量、不安装原生依赖。 - **日志/账本不记录密钥、完整参数、完整 reason**;只存 hash/摘要/等级/归属。 - 任何不确定、解析失败、异常,**一律回退到官方审批**(fail-closed)。 - `critical` 永不自动放行;`unknown` 一律 manual。 ## 3. 已定方案(速查) | 项 | 决定 | |---|---| | 名字 | `dsh-approval-ledger` | | License | MIT | | 官方 UI | 不替换 `ui-approval` | | 批量批准 | 官方 **plan-review 卡** + 侧栏全文 | | 单条审批 | 官方卡不动;标题摘要化 + 会话头部“审批详情”弹窗 | | 授权 | 双门匹配;critical 永不;high 默认 manual;medium 仅数据类写入 | | 审计 | `tool/result.meta` + 插件账本 + `approval-audit` 投影 | | 提醒 | Host 侧 Win32 `FlashWindowEx` + 页面红点/标题 | | 版本 | 0.1 observe → 0.2 grants → 0.3 high/ask_choices → 1.0 stable | ### 3.1 批量计划:`request_approvals` 工具参数(草案): ```ts { summary: string, items: Array<{ id: string, // A/B/C,短且唯一 tool: string, // write / edit / pwsh / plugin_manager … title: string, // 一行人类可读 mode?: string, // escalation 的目标模式 scope?: { paths?: string[], // 绝对路径或相对 cwd;默认精确文件 commands?: string[], // 归一化后整串相等 args?: Record // 精确子集,兜底 }, uses?: number, // 默认 1,上限 5 dependsOn?: string[], // 声明的承接关系 note?: string // 模型说明(未验证) }> } ``` 流程: 1. 校验 id 唯一、依赖无环、路径/命令合法、tool 已注册。 2. 用 `ctx.userQuestions.ask` 发一个 **plan-review** 问题: - `detail` = 计划 Markdown(简明清单 + 每项详情); - `intent = { kind: 'plan-review', approve: '