# 单包双模式本地验收

## 真实 pi 会话

### Native 基础操作：通过

- cua_status 确认 native 模式。
- 真实计算器依次清屏、6、加号、7、等号，共 5 次点击。
- 每次动作前后用新 stateId 读取状态；最终 AX 与截图显示 `6+7` 和 `13`。
- 未调用 Jev。此时本机仍配置着 Key，因此“缺 Key 仍可 native”的分支仅有离线测试证据，不把它混作这次实测。

### Jev 正常执行：通过

- 用户通过 /cua-mode jev 显式切换，状态检查确认模式。
- 真实 Jev + Sky 执行 `12 + 30232`，10 次动作、约 15.3 秒。
- 声明式验证通过；主 Agent 再次读取，AX 与截图分别显示 `12+30,232`、`30,244`。
- 没有自然触发 needs_planner，不以此声称真实 Jev 失败后的自主恢复已通过。

## 受控实机接管：通过（明确含模拟）

入口：`npm run accept:handoff -- --live`。没有 --live 时拒绝运行，不包含在自动实机测试或 npm 发布生命周期中。

边界：使用隔离的脚本宿主/调用上下文，调用与插件相同的注册工具处理函数和真实 Sky。Jev 回复及主 Agent 的动作选择由脚本确定，不是当前生产 pi 中一次真实 LLM 失败/自主接管。不是绕过官方授权，也不改实际模式、凭证、白名单或生产阈值。

实测过程：

1. 转交 1 次官方 Calculator 授权到真实系统对话框，由用户选择 Allow；不是硬编码接受。
2. 唯一模拟回复：当前真实候选中的数字 6，confidence=0.1、risk=0.01、done=0。
3. 插件返回 needs_planner，已执行动作 0、剩余预算 2。没有执行或重放模拟建议。
4. 脚本作为接管调用方，从新 AX 中定位 Clear/All Clear，真实点击并读取显示值 0。
5. 从新 AX 中定位数字 6，真实点击并读取显示值 6。
6. 共 2 次真实动作、4 次原生读取；剩余预算归零，原生写工具从此隔离上下文的活动工具列表移除，模式仍为 jev。
7. 测试结束后，在原 pi 会话独立读取真实计算器，确认显示 6；cua_status 确认原会话仍为 jev、没有遗留 handoff。

没有读取真实 TypeSafe Key、没有向 TypeSafe 发请求，没有自动创建 fullTrace 文件或修改用户 pi 设置。系统对话框取消、未知结果或任何断言失败均停止，不自动重试。日志明确带 controlledTest 和 synthetic 标记。

## 应用范围：实机只读验收通过

入口：`npm run accept:app-access -- --live`。没有 `--live` 时拒绝运行，不在自动测试或发布生命周期中启动桌面访问。

使用当前任务分支的真实配置加载器、插件处理函数和真实 Sky；pi 宿主由隔离脚本提供，并非当前已安装插件的热更新验收。临时私有配置不含 Key，名单为空，不加载或修改用户原配置；任何 HTTP/TypeSafe 请求都会被测试拒绝。

实测结果：

1. `allowlist` 下 Calculator 不在名单，调用在连接 Sky 前被拒绝。
2. 将临时文件改为 `all`，同一实例的状态立即显示新范围；仍标明官方授权由运行时控制、系统权限未检查。
3. 真实 Sky 请求 1 次 Calculator 官方授权，经系统对话框转交用户并收到 Allow 后继续，不模拟批准。
4. 兼容文本观察、native 状态读取各 1 次成功；native 返回 stateId 和可用截图。日志不保存 AX 原文或截图。
5. 临时文件切回 `allowlist`，携带原 stateId 的按键请求在插件范围检查时被拒绝，未派发到 Sky；native 与兼容读取也再次被拒绝。
6. 共 2 次真实读取、0 次原生写操作；临时配置清理，用户原配置未改动。官方用户授权可能由 Sky 按其自身规则保留，测试不尝试撤销或伪造它。

这验证了真实桥接下的范围启用、配置重读和撤销；未测试真实点击/输入、付费 Jev 或所有应用，也不能证明开启 `all` 后不再需要官方授权。

## 仍未覆盖

- 在生产 pi 会话里真实 Jev 自然失误后，由真实主模型自主规划并恢复的完整案例。
- Chrome 复杂菜单、表单和批量发布的可靠性。
- 所有应用/显示器/系统版本及长任务表现。

结论仅为基础操作、真实 Jev 正常任务、受控接管链路及应用范围只读验收通过，不能外推为稳定版或与官方 Codex 等价。
