# 验收记录与研究边界

日期：2026-10-04（Asia/Shanghai）。结论：**host研究交付通过；未进行真机验收；未上线。**

## 隔离记录（包含发现的外部并发变更）

| 项目 | 开始 | 最终核验 |
|---|---|---|
| wearable branch | 从origin/main创建 | `codex/wearable-shell-spike-0.6`，独立worktree |
| base | `3b46835ffaf3783e00ecc9eda9f923d6481eb18a` | 不变 |
| main branch ref | 同base | 仍同base；本轮无main commit |
| production工作目录 | `main`、clean | **外部任务切到 `codex/speech-40ms-gateway-ab-0.5.1`，HEAD `2fa0daddd80cd3dfc4841aae5b5b62483f9595d8`，clean** |
| Speech diagnostics branch | `f011ebb165d575b64340a17f264e6dbe250db023`、clean | 相同、clean；本轮未修改 |
| Gateway user service | active/running，PID281486，启动18:00:40 | active/running，PID307693，启动18:26:53；本轮未操作service |

Git reflog记录18:26:51从main切到上述speech branch并cherry-pick两条40ms实验提交。与本轮命令记录无关，已向用户明确说明。**不能宣称整个production运行现场在这段时间完全未变，也不能宣称原目录最终仍在main。** 本轮没有擅自checkout回去、撤销cherry-pick或重启服务，避免破坏并行Speech试验。

创建分支前执行了status/fetch/HEAD/origin/main核对；初始main和origin/main完全一致。`.git`元数据写入经沙箱授权执行；所有新增项目文件只在 `/home/lighthouse/esp32-dev/.cache/wearable-shell-spike-0.6`。最终diff只新增本研究docs/prototypes，不修改已有追踪文件。没有push/merge/flash/production API mutation。

## 运行结果

```bash
python3 prototypes/wearable_shell/run_tests.py
```

- C++17，`-Wall -Wextra -Werror -fsanitize=undefined`：PASS。
- UiState=48 bytes；50,000次输入转换的页面、index、preferences边界：PASS。
- 21byte偏好记录round-trip、每个截断位置、每字节损坏、坏字段、合成v1迁移、future版本只读、generation溢出保护：PASS。
- 按钮完整路径、offline本地设置、编辑Apply/Cancel、旧epoch、模态优先、picker Next、选择确认与ACK：PASS。
- Python unittest **13项**：PASS（10目录协议 + 3布局/文本）。
- catalog4项/页、4096byte上限、转义与最坏长度、NFC/UTF-8、非法编码/重复JSON字段/超深输入、跨device/connection、TTL、MAC cursor篡改、request重用、旧响应/取消、target CAS竞争、移除会话、BUSY、有限输入迭代/cache：PASS。
- 16场景×3字号×2主题 = **96套布局安全区检查**；16×3的文字包围盒重叠检查：PASS。
- 22张468×466 PNG + 1280×1408圆形contact sheet + 本地HTML图库生成：PASS。

初次尝试ASan因执行环境预加载库导致runtime加载顺序不满足而未运行；没有绕过沙箱或清除其preload。改用UBSan完成检查，不声称ASan PASS。

额外探针：

| 探针 | 结果 | 限制 |
|---|---|---|
| Pi 0.85.1 SessionManager | 指定cwd、生成ID、指定ID重建成功；空manager与元数据未落盘、list为空 | 未构造完整runtime、未prompt、未测试agent重启流程 |
| Codex 0.154.0 | 本地experimental schema提取成功；start/resume/name/settings存在，create不存在 | 固定版本源码解释空thread延期落盘；没有调用生产daemon或创建thread |
| 现有ELF中文glyph | 原回归 + 原型64个不同中文字符PASS；CN318199 + TW592105 = 910304bytes；行度量一致 | ELF为只读已有build，未重新build当前分支，不等于真实面板效果 |

## 视觉检查

人工查看contact sheet、Watch IDLE单图和Large/Dim中文压力图：标题/状态/正文/按钮hint分层，三行picker名称和state独立，长中文有明确省略，不与footer重叠；Watch IDLE/RUNNING/DONE共享布局而状态突出。圆形边界保留安全空间。Approval显示现有 A APPROVE / B REJECT，不引入触摸才能操作的按钮。

Large正文最多三行，不能把省略后的mock当完整final_text交付；固件需保持现有分页可读全文。footer次行12px需要真机确认，Host Noto和固件位图字形也不完全相同。所有数字/状态是fixture；没有从设备读取RTC、电池、Wi-Fi，也没有测亮度/响度/功耗。

## 未实现、风险和待确认项

1. NVS adapter和硬件Apply仍是设计；当前app_main存在整分区erase恢复路径，接NVS时须独立处理。codec的双槽恢复测试不等于真实flash断电试验。
2. M5PM1 standalone库与M5Unified对power source0x04的枚举/位图解释矛盾，需USB/外部5V/电池实测；百分比只能估算。
3. RTC参考实现存在，但项目没有驱动；时钟有效性、备份供电、UTC同步异常必须测。官方RTC PDF下载成功，但本机PDF解析缺AES依赖，本轮RTC API结论来自已读取的官方driver，不以未解析PDF补充寄存器断言。
4. Volume运行中更改是否pop/与capture争用/寄存器失败反馈，需Speech稳定后在audio owner安全点验证；本轮没有修改codec/streaming。
5. 新B short=HOME的交互需要一手真机试用；Touch范围0..233与现有framebuffer映射/I²C port冲突需解决。
6. 固件有界JSON parser、Gateway异步锁/持久化target generation/ACK丢失、双方capability兼容与scan预算尚未实现。Python reference不是可部署安全边界。
7. 新Session需draft持久化和两种SDK独立crash测试；New Workspace权限、TOCTOU和journal还只有设计。

这次不需要更改production来验证host交付。下一步如开0.6a，应以Speech最终收口后的main重新建独立worktree，把已确认的helper逐项迁入；不要把本spike整体合入当前production。

## 分组提交

- `88c2e26` — 架构、产品方向与硬件能力边界。
- `607183c` — host导航、偏好codec、圆屏原型与布局测试。
- `3eb28f8` — bounded catalog参考实现、测试和Workspace设计。
- `e38db03` — 已安装Pi/Codex能力探针、glyph验证和来源哈希。
- 最后一条验收提交包含本记录与 `evidence/host-tests.txt`；可用 `git log --oneline 3b46835..HEAD` 查看完整列表。
