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

130 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# B03 验收 01:Windows 完全访问与底部授权
日期:2026-10-21,Asia/Shanghai。受测代码:**`adbbb3bd37f6043d10cbaa59d6c28ade6387a7f3`**。交付记录:[B03-交付-01](B03-交付-01.md)。
**结论:本轮 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](evidence/B03-review-01/windows-loopback-results.json)、[日志](evidence/B03-review-01/windows-loopback.txt)、[验收探针](evidence/B03-review-01/windows-loopback.mjs)。
## 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` 目录存在。[结果](evidence/B03-review-01/windows-session-grants-results.json)、[日志](evidence/B03-review-01/windows-session-grants.txt)、[探针](evidence/B03-review-01/windows-session-grants.mjs)。
另观察到 `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,首次“停止当前运行”注入取消失败。错误明确显示在授权区域,普通编辑区仍隐藏;再次停止调用真实取消通路,输入框和工具栏恢复。
证据:[首次运行报告](evidence/B03-review-01/app-first-report.json)、[重启报告](evidence/B03-review-01/app-restart-report.json)、[全应用验收探针](evidence/B03-review-01/app-native.cjs)。
已人工查看底部授权、拒绝后草稿恢复截图:
- [底部授权替换](evidence/B03-review-01/app-first-bottom-approval.png)
- [拒绝后草稿恢复](evidence/B03-review-01/app-first-draft-restored.png)
- [实际会话授权选项](evidence/B03-review-01/app-first-session-grant.png)
- [重启后重新询问会话授权](evidence/B03-review-01/app-restart-grant-reapproval.png)
- [审批提交失败仍占据输入区](evidence/B03-review-01/app-first-approval-failure.png)
- [停止失败的可见错误](evidence/B03-review-01/app-first-cancel-failure.png)
全应用测试进程日志另含测试启动器的“更新请求来源不受信任”、跳过托盘图标、固定夹具模型名未识别及上述主动注入失败等提示,不能把“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 |
详见 [测试结果](evidence/B03-review-01/test-results.json)、[alignment 日志](evidence/B03-review-01/alignment.txt)、[构建日志](evidence/B03-review-01/build.txt)、[token 日志](evidence/B03-review-01/check-tokens.txt)。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 的隔离检出独立安装并构建。证据中的三个脚本是验收临时探针,读取的都是自身生成的夹具,不依赖本机真实用户数据:
```powershell
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。原版外观依据仍是需求中的用户截图和既有证据,不能宣称取得新的原版视觉结论。推送记录核对成功后,本批协作窗口交回开发端。