docs(acceptance): verify B03 Windows permissions and composer recovery
This commit is contained in:
1 parent
1df1861a7a
commit
352d62d49a
24 files changed
+1723
No files matched your search
@@ -0,0 +1,127 @@
|
||||
# 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 或产品源码。
|
||||
|
||||
## 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。原版外观依据仍是需求中的用户截图和既有证据,不能宣称取得新的原版视觉结论。推送记录核对成功后,本批协作窗口交回开发端。
|
||||
Reference in new issue
Block a user