Files
ycode/docs/协作/B03-验收-01.md
T

13 KiB
Raw Blame History

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、npm 11.19.0、Electron 37.10.3、实际 SDK 0.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 故障的还原。

  1. 新任务在首发前通过真实权限控件选择完全访问,再通过输入区发送。Write 和 PowerShell 实际成功,MutationObserver 未观察到活动授权卡;会话保存为 full-access。
  2. 切回默认权限并发起 Write。等待模型响应时输入一份后续草稿,再释放夹具响应。授权卡独占底部,原 input-stack 为 hidden/inert,计算 display 为 none,普通工具栏和发送按钮不存在,活动授权 dialog 只有一份。
  3. 焦点在活动授权区域;强行调用隐藏 textarea 的 focus 无效,原生键盘输入 X 不能改变隐藏草稿。首次“拒绝”由测试启动器注入提交失败,错误显示在原授权区,普通输入框仍隐藏;再次点击真实“拒绝”按钮完成审批。文件未创建,普通输入区恢复,后续草稿原样保留。
  4. 默认权限执行 git init,点击真实“本次会话内始终允许”按钮。实际命令成功;同会话下一轮再次执行,无重复授权卡。
  5. 再次选择完全访问,退出测试客户端进程并重新打开,选择保存的会话。full-access 标签、实际 Write、PowerShell 执行均正确,未出现授权卡。这不是仅重新加载 renderer。
  6. 重启后切回默认权限,再执行此前授权的 git init,重新出现会话授权选项,证明 grant 不跨客户端进程永久保存;测试选择拒绝结束。
  7. 另发起一轮确需审批的 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 或产品源码。

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。原版外观依据仍是需求中的用户截图和既有证据,不能宣称取得新的原版视觉结论。推送记录核对成功后,本批协作窗口交回开发端。