13 KiB
B03 验收 01:Windows 完全访问与底部授权
日期:2026-10-21,Asia/Shanghai。受测代码:adbbb3bd37f6043d10cbaa59d6c28ade6387a7f3。交付记录:B03-交付-01。
结论:本轮 Windows 已测的核心功能通过,没有复现“完全访问仍反复弹普通授权”或“授权卡下面还有完整输入框”。本次还验证了真实会话授权、重建与客户端重启的不同生命周期。B03 仍保留未覆盖的边界和原版对照项,不能宣称全部 AC 或完整 1:1 关闭。
验收端只改验收文档和提交的脱敏证据,没有修改产品源码、正式测试、依赖或构建配置。B04 不在 B03 受测 SHA 中;验收过程中收到的 B04 交付另按 3428206 验证,不混入本报告。B01/B02 的历史失败和未验证项继续保留。
1. 环境与隔离
- Windows;Node
24.21.0、npm11.19.0、Electron37.10.3、实际 SDK0.3.304。 - 在新的
b03-accept-01工作树固定检出完整受测 SHA,独立执行npm ci --legacy-peer-deps,node_modules是本地目录,不是其他工作树的链接。 - npm 未自动运行 Electron 安装脚本,因此另行执行
node node_modules/electron/install.js;没有升级依赖或执行 audit fix。 - 生产构建之后启动测试专属实例,独立 userData、HOME、workspace、模型配置和本地 SSE 回环。未使用用户供应商、真实凭据、真实会话或当前 dev。
- 全应用测试加载未修改的
out/main/index.mjs、preload、renderer,模型响应由本地固定 SSE 服务提供。SDK/CLI 和文件、命令执行是真实的;模型内容是夹具,不证明外部模型服务或开放式 Agent 决策正确。 - 其他回环测试打包实际
ClaudeKernel,仅替换 Electron 的 userData 路径接口,SDK query 未 mock。 - 受测工作树在验证后
git status --short为空。临时探针只写忽略的.tmp,不会随本次报告替换产品实现。
2. Windows 实际内核与 SDK:9 场景、26 次本地请求
使用交付中的回环协议,在验收端临时适配 Windows 环境、Git Bash 路径,并加入真实 PowerShell 操作和结果断言。没有删掉宿主策略、hook、callback、默认权限或模式边界。
| 场景 | 人工工具审批次数 | 实际结果 |
|---|---|---|
| 默认权限 craft | 1 | Write 按夹具拒绝,目标文件不存在 |
| 切为完全访问 craft | 0 | Read/Edit/Write、简单与复合 Bash、PowerShell 成功;编辑、新建和删除结果与标记文件检查通过;业务追问 1 次 |
| 完全访问偏好 + plan | 0 | Write 被模式边界拒绝,目标不存在 |
| 完全访问偏好 + ask | 0 | Write 被模式边界拒绝,目标不存在 |
| 返回默认权限 craft | 1 | 再次出现工具审批,按夹具拒绝 |
| 完全访问 + 实际 SDK ask:Bash 规则 | 0 | 命令执行成功,callback 的 matchedAskRule=true 仍由宿主预授权 |
| 默认权限 + 同一实际规则 | 1 | rule-intercept,拒绝后标记文件未追加 |
| 销毁并重建完全访问内核 | 0 | Write 与业务追问正常;追问 1 次 |
| 完全访问下不存在目标 Edit、Bash exit 7 | 0 | 两次实际工具错误,没有重新弹权限审批 |
PowerShell 夹具使用独立目录,实际新增目录和文件、删除文件和目录、写入完成标记;断言目录不存在、完成文件内容正确。Bash 也实际新增/删除临时对象并验证完成标记。
结果:windows-loopback-results.json、日志、验收探针。
3. “本次会话内始终允许”:单独验证,未用完全访问替代
默认权限下以真实 Bash(git init *) 建议授权为夹具,执行范围仅限测试 workspace。第一次由实际 SDK 生成选项,验收回调调用真实宿主授权提交函数;后续由实际 SDK 匹配与执行。
| 场景 | 人工审批 | 结果 |
|---|---|---|
| 首次执行 | 1 | 提供 allow_once / allow_always / reject_once;选择会话授权并实际执行 |
| 同内核下一轮 | 0 | 命中会话授权,实际成功 |
| 同客户端进程、同宿主会话,销毁并重建内核 | 0 | grant 重放后成功 |
| 新宿主会话 | 1 | 未继承前一个会话的 grant |
| 已授权之后切到 plan / ask | 0 | 执行仍被模式边界拒绝 |
该组 6 场景、12 次本地请求通过,实际 .git 目录存在。结果、日志、探针。
另观察到 printf 重定向和普通 Write 的实际建议不符合现有可重放授权范围,因此界面只提供“允许一次”和“拒绝”,并提示不能安全恢复。这不是本轮证明所有命令都支持“始终允许”的证据。上述生命周期结论只针对实际返回了可重放建议的匹配规则,不扩张成全工具永久允许。
4. 完整生产应用:首发、底部授权、真实按钮和重启
两次独立 Electron 进程共享同一份全新的测试 userData,第一次 23 项、重启后 7 项,共 30 项检查通过,两次均无捕获到的 renderer console error。除实际正常通路外,测试启动器对首次 chat:respond / chat:cancel 分别注入一次失败,用于验证界面失败恢复;这两次错误是夹具,不是真实 SDK 故障的还原。
- 新任务在首发前通过真实权限控件选择完全访问,再通过输入区发送。Write 和 PowerShell 实际成功,MutationObserver 未观察到活动授权卡;会话保存为 full-access。
- 切回默认权限并发起 Write。等待模型响应时输入一份后续草稿,再释放夹具响应。授权卡独占底部,原 input-stack 为 hidden/inert,计算 display 为 none,普通工具栏和发送按钮不存在,活动授权 dialog 只有一份。
- 焦点在活动授权区域;强行调用隐藏 textarea 的 focus 无效,原生键盘输入 X 不能改变隐藏草稿。首次“拒绝”由测试启动器注入提交失败,错误显示在原授权区,普通输入框仍隐藏;再次点击真实“拒绝”按钮完成审批。文件未创建,普通输入区恢复,后续草稿原样保留。
- 默认权限执行
git init,点击真实“本次会话内始终允许”按钮。实际命令成功;同会话下一轮再次执行,无重复授权卡。 - 再次选择完全访问,退出测试客户端进程并重新打开,选择保存的会话。full-access 标签、实际 Write、PowerShell 执行均正确,未出现授权卡。这不是仅重新加载 renderer。
- 重启后切回默认权限,再执行此前授权的
git init,重新出现会话授权选项,证明 grant 不跨客户端进程永久保存;测试选择拒绝结束。 - 另发起一轮确需审批的 Write,首次“停止当前运行”注入取消失败。错误明确显示在授权区域,普通编辑区仍隐藏;再次停止调用真实取消通路,输入框和工具栏恢复。
已人工查看底部授权、拒绝后草稿恢复截图:
全应用测试进程日志另含测试启动器的“更新请求来源不受信任”、跳过托盘图标、固定夹具模型名未识别及上述主动注入失败等提示,不能把“0 renderer error”改写为整个进程无日志警告。本次没有更改更新模块信任校验,也没有把这些提示当成权限通路失败。
5. 构建与回归
| 命令 | 本轮 Windows 结果 |
|---|---|
npm run build |
退出 0,包含类型检查 |
npm test |
退出 0,类型/消息/会话/持久化/会话渲染 |
设置 jsdom 路径后 npm run test:alignment:dom |
退出 0,offline 11 套、DOM 7 套;包含 276 项 B03 mock-query policy、43 项实际组件 DOM 检查 |
npm run test:reporting |
退出 0 |
npm run test:composer-capabilities |
退出 0 |
npm run test:tool-approvals |
退出 0 |
npm run check:tokens |
退出 1,仍是既有六项、原计数;没有更新 baseline |
详见 测试结果、alignment 日志、构建日志、token 日志。B01 原生脚本可移植性、B02 hover 断言和既有 CRLF 失败未因本轮其他检查通过而关闭。
6. AC 判定与剩余范围
| AC | 本轮判定 |
|---|---|
| 7.1 | Windows SDK 原生 Read/Edit/Write、Bash/PowerShell 四类操作核心验证通过;应用首发和重启后 Write/PowerShell 通过。SDK 独立目录工具及所有工具/后续轮次的排列组合未穷举。 |
| 7.2 | 实际 Windows SDK default + host gate、真实 ask-rule 的 full/default 对照通过;合成未知/classifier/别名矩阵通过,不把合成字段等同原用户回调还原。 |
| 7.3 | default、plan、ask、业务追问和实际执行错误通过。ExitPlanMode 当前主要为离线证据;Windows 文件系统 ACL 拒绝未另行实测。 |
| 7.4 | 实装版本与实际 callback 通路有证据;原用户七次审批的具体原始判定字段仍未知。 |
| 7.5 | 完整应用首发、权限切换、客户端进程重启和实际内核重建通过;策略失败闭锁/串行 race 为 mock-query 证据,未故障注入真实 CLI 控制通道。 |
| 7.6 | 实际规则下的会话授权、下一轮、同进程内核重建、新会话隔离、模式边界、客户端重启过期均通过;不是全工具白名单,也不等于全部规则类型可重放。 |
| 7.7 | 实际日志包含宿主权限、SDK 配置/控制确认模式来源、hook/callback、哈希关联和分支;未知类别/原因代码明确 unknown。未取得原用户历史回调。 |
| 7.8 | 未修改生产应用中实际底部替换通过,有 Windows 截图;没有本轮 WorkBuddy 同状态 REA/像素比较。 |
| 7.9 | 实际应用拒绝后草稿恢复、允许会话授权、原生焦点/隐藏输入防护,以及注入提交失败和取消失败后的重试通过。附件/引用/队列和迟到结果等另有 43 项组件 DOM 证据;完整应用 IME/读屏及全部会话切换异常组合未全覆盖。 |
本轮没有确认新的阻塞性产品缺陷;尚缺证据的项目保持“未验证”,不以测试绿灯替代完整验收。建议开发端把 Windows 回环、真实会话授权与完整应用重启探针整理为可维护的正式回归,并继续完成交付记录中的剩余范围。验收探针随报告提供,验收端未将其写入正式 scripts 或产品源码。
并行复审按用户指定的 minimax-m3.1-flash-free / max 启动,但后端子任务以 max_output_tokens 错误结束,另外两个没有交付完整报告并已停止。本轮没有把这些未完成的子代理复审算作通过证据;上述运行、截图检查和最终判定均由主对话独立完成。
7. 证据复跑
在受测 SHA 的隔离检出独立安装并构建。证据中的三个脚本是验收临时探针,读取的都是自身生成的夹具,不依赖本机真实用户数据:
New-Item -ItemType Directory -Force .tmp/b03-acceptance | Out-Null
Copy-Item docs/协作/evidence/B03-review-01/windows-loopback.mjs .tmp/b03-win-loopback.mjs
Copy-Item docs/协作/evidence/B03-review-01/windows-session-grants.mjs .tmp/b03-session-grant.mjs
Copy-Item docs/协作/evidence/B03-review-01/app-native.cjs .tmp/b03-acceptance/app-native.cjs
node scripts/build-full-access-loopback-kernel.mjs
node .tmp/b03-win-loopback.mjs --kernel
node .tmp/b03-session-grant.mjs --kernel
node .tmp/b03-acceptance/app-native.cjs
Windows 探针中的 Git Bash 路径需要改为目标电脑实际安装路径;它不是产品路径配置。回环探针内部 100 秒 abort,全应用启动器每个测试进程有 120 秒上限,只结束自己创建的进程。临时目录独立生成;不准把用户真实会话或 dev 目录填成测试数据目录。
本次没有重新读取 WorkBuddy 安装包、脚本、页面或运行时,因此没有新的 REA Evidence ID。原版外观依据仍是需求中的用户截图和既有证据,不能宣称取得新的原版视觉结论。推送记录核对成功后,本批协作窗口交回开发端。