8.4 KiB
B03 交付 01:完全访问预授权与底部授权替换
日期:2026-10-21(Asia/Shanghai)。状态:已实现;Linux 实际内核/SDK 回环及离线交互验证通过;Windows/客户端重启等剩余项目待验收,不宣称所有 AC 全量通过。
- 需求:B03-需求,YC-007。
- 开发基线:
0bc9faa1292c4223a61608e72ba3cd13d572252b。 - 受测代码 SHA:
adbbb3bd37f6043d10cbaa59d6c28ade6387a7f3。 - B01/B02 及测试清理保持原结论;未启动、修改或中断用户正在运行的会话,未访问原版 WorkBuddy。
1. 后端实现
SDK 实装版本为 @anthropic-ai/claude-agent-sdk@0.3.304。采用SDK default + 宿主显式预授权 gate,不是把 acceptEdits 误称完全访问,也不启用进程级 bypassPermissions 能力:
- craft 且用户选择 full-access:PreToolUse 对普通工具预授权 allow;若 SDK 仍转 callback(包括真实 matchedAskRule),callback 同样按有效宿主权限直接 allow,不发人工审批。
- 默认权限继续使用 SDK 实际判定并进入审批,真实规则匹配仍标记 rule-intercept。
- plan 使用 SDK plan,ask 使用 default;两者均先经过宿主只读模式边界,full-access 偏好不使其变为 craft。
- AskUserQuestion 通过 hook ask 保留业务追问回调;ExitPlanMode 保留计划内容展示/拒绝执行分支,不当成普通审批静默放行。
- 不自动保存全工具 allow 规则,不模拟点击允许,不修改用户全局设置。已有“本次会话始终允许”的 grant 逻辑仍单独存在。
- 策略切换串行化;切换中阻断执行,过期审批不能应用。SDK 控制失败时关闭不一致进程并锁定失败状态,明确重试 setPolicy 成功后才能恢复/重建。
新增白名单脱敏诊断 [claude-permission]:宿主权限、agentMode、配置/控制确认的 SDK 模式、分支、匹配 ask-rule 的布尔值、安全分类/未知、原因码是否存在,以及哈希 toolCall 关联。不保存参数、命令、路径、环境、规则内容或凭据。SDK mode 字段带来源说明,不是独立 CLI 内部状态探测;原生 EnterPlanMode 自主切换的完整行为未额外验收。
SDK .d.ts 没有声明的 decisionReasonType/Code 在 sdk.mjs 的 wire 转换确有映射;未知/未提供值记录 unknown,不据此反推原始用户七条请求的确切原因。
2. 前端实现
活动工具审批使用 approvalSlot 独占底部输入区域,不再挂在完整普通输入框上方。
- 普通输入保持挂载以保存草稿/附件/引用/队列,但 hidden、inert、disabled,不能接受焦点、键盘、拖放或发送;普通发送工具栏移除。
- 业务追问仍是独立的 question 流程,不与工具审批混同。
- 允许、拒绝、失败/重试、取消及会话切换后恢复输入状态;审批响应和停止操作校验捕获的 session/runId。
- 取消失败明确展示错误;取消面板按请求标识隔离,旧请求的迟到结果不能污染新审批。
- 复用现有 Composer/PermissionConfirm 与回归脚本,不另造一套授权业务组件;不恢复已撤回骨架补丁。
3. 实际内核 + SDK 证据
实际生产 ClaudeKernel 打包后仅替换 Electron 的 userData 路径,SDK query 没有 mock。真实 Linux CLI 对接固定 SSE 回环模型;临时 HOME/config/userData/workspace,清空环境继承,不使用用户供应商或真实凭据。25 个本地请求、9 个场景全部按预期通过:
| 场景 | 人工审批 | 实际结果 |
|---|---|---|
| default craft | 1 | 夹具拒绝 Write,目标未创建 |
| 切为 full craft | 0 | Read/Edit/Write、简单及复合 Bash 成功;文件内容正确;新建后删除的目录/文件不存在,完成标记正确;业务追问 1 次 |
| 切为 plan | 0 | Write 被模式边界拒绝,无目标文件 |
| 切为 ask | 0 | Write 被模式边界拒绝,无目标文件 |
| 返回 default craft | 1 | 再次询问并按夹具拒绝 |
| full craft + 真实 SDK ask:Bash 规则 | 0 | 实际 callback matchedAskRule=true,仍按 full-access 直接执行成功 |
| default + 同一 Bash/规则 | 1 | 真正 rule-approval,夹具拒绝,文件保持不变 |
| 销毁重建并传入 full 偏好 | 0 | Write 与业务追问成功,追问 1 次 |
| full 下不存在目标 Edit、Bash exit 7 | 0 | 2 次真实工具错误,不重新弹权限卡 |
ask:Bash 仅通过真实 Query 的 session-only applyFlagSettings 配置在测试进程中,不写用户设置。真实 SDK/文件检查支持此 gate 选择,而不仅是合成 callback 元数据测试。
脚本限制 Linux Bash;Windows/PowerShell 不具备环境时明确阻塞。内部有请求上限、100 秒 abort,执行时另加 120 秒外层截止;结束关闭 query/server 并清理临时目录。没有修改网络或 OS 安全设置;未单独审计 CLI 的所有潜在非模型出站尝试。
4. 其余回归
npm test:退出 0,类型/消息/会话存储/持久化/会话渲染。test:alignment:dom(指定现成 jsdom 路径):退出 0,offline 11 套、DOM 7 套;其中 B03 actual-kernel/mock-query policy 276 项、实际 Composer/PermissionConfirm jsdom 43 项。test:reporting、test:composer-capabilities、test:tool-approvals:退出 0。npm run build:退出 0,含类型检查。check:tokens:退出 1,保留相同六项既存失败及计数,没有新增漂移、没有改 baseline。- 独立复审重跑 276/43 项,无剩余阻塞性发现;审查发现的取消错误不可见问题已修复。
- ChatPane 保留基线 CRLF,采用
git -c core.whitespace=cr-at-eol diff --check通过,不为格式统一改写整文件。
5. AC 状态与未验证项
| AC | 本轮证据与剩余范围 |
|---|---|
| 7.1 | Linux 原生读写/编辑、新增/删除临时对象、简单/复合 Bash 实际 0 审批;Windows PowerShell、原生独立目录工具及全部后续轮次组合待验 |
| 7.2 | 实际 kernel/SDK default + host gate;真实 ask-rule 下 full 0/default 1;classifier/别名/未知字段由 276 项离线矩阵验证 |
| 7.3 | 实际 default、plan、ask、业务追问和执行错误对照通过;ExitPlanMode 为离线验证,文件系统权限拒绝未实测 |
| 7.4 | 检查实装 SDK 类型与 wire 映射;未知字段策略离线验证,原用户 callback 的具体字段仍无法追溯 |
| 7.5 | 实际同内核切换/返回及销毁重建通过;策略失败闭锁与串行 race 离线通过;客户端重启后持久偏好加载、真实首发 UI 全链仍待 Windows 验收 |
| 7.6 | full 自动执行不写 grants;已有 grant policy/replay 离线通过。真实 SDK session-grant 生命周期尚未完整验证,不把本轮自动预授权测试替代它 |
| 7.7 | 已加入最小脱敏分支记录,真实日志有 matchedAskRule 与宿主决策证据;未知原因码明确 unknown |
| 7.8 | 底部替换由实际组件 DOM/CSS 层叠检查通过;没有取得 Windows 同状态截图或原版像素结果 |
| 7.9 | 43 项覆盖允许/拒绝/失败重试/取消、旧取消迟到、隐藏焦点/发送、真实附件 stage 返回、草稿/引用/队列及请求切换;真实窗口 IME/屏幕阅读器和全应用会话切换仍待验 |
因此本交付是已实现并取得部分真实 SDK 证据,不是整个 B03 全量验收通过。未通过项不得被核心测试或构建绿灯替代。
6. 复跑与交接
按固定代码 SHA 独立安装构建,Windows 应用使用全新 YCODE_USER_DATA_DIR,不得操作正在运行的用户会话;dev 启动遵循 Dev 启动 SOP。当前包含 main 代码变更,验收实例应重新启动自己的构建,不复用旧 renderer。
npm ci --legacy-peer-deps
npm test
YCODE_TEST_DOM_MODULE=/absolute/path/to/jsdom npm run test:alignment:dom
npm run build
# 仅 Linux,有真实 SDK CLI 与本地回环权限,执行前阅读脚本:
timeout --signal=TERM --kill-after=5s 120s npm run test:permissions:loopback
PowerShell 的 DOM 环境变量用 $env:YCODE_TEST_DOM_MODULE = <路径>。Windows 验收须另补四类操作/PowerShell、底部授权替换截图、失败恢复及持久偏好重启矩阵。
远端推送并核对 SHA 后才算 Git 交接完成。交付后窗口交回验收端,保留旧需求与历史失败记录。