docs(ios): record build 26 real-device failure closure

This commit is contained in:
冰朔 2026-08-04 10:13:15 +08:00
commit d6144ced82

View file

@ -0,0 +1,139 @@
# HoloLake iOS 原生知识湖与 TestFlight 收口记录
> 开发车道:`DEV-20260802-001`
>
> 产品仓:`REPO-014 / bingshuo/hololake-system-architecture`
>
> 源码分支:`feat/ios-native-knowledge`
>
> 记录时间2026-08-04Asia/Shanghai
>
> 最终产品验收:`0 / NOT_EXISTS / FAIL`
## 1. 为什么这条线存在
桌面端 HoloLake 仍继承了 Tolaria 的文件夹型 Vault、桌面文件选择器、桌面 Git 和本机
配置目录假设。把同一套页面直接打包到 iPhone 后,先后暴露出移动端文件选择器未实现、
iOS 沙箱目录无权写入、原生知识库无法挂载,以及 Agent 配置只存在电脑本机等问题。
本线的目标不是给旧页面换皮,而是把移动端知识入口改成 HoloLake 自己的运行边界:
1. App 沙箱中存在只读基础世界与用户个人知识湖;
2. 普通知识页可由 Agent 读取、创建和修改;
3. 可同步知识页与设备密钥严格分流;
4. 服务器写入只接受登录会话并返回原子 Git 回执;
5. TestFlight 只负责交付,不能代替真机功能验收。
## 2. 实现结果
### 2.1 移动端知识湖
- 新增 App 自有的 `mobile_vault`,不再调用 iOS 不支持的文件夹选择器。
- 基础世界与个人知识湖使用不同标记和稳定目录。
- 首次创建时写入最小世界结构、说明页和 Git 忽略边界。
- 移动端入口通过原生命令解析 App 数据目录,不使用桌面路径。
### 2.2 账号、Agent 与设备密钥
- 增加邮箱验证码会话接口、知识快照、模型目录与服务器代理客户端。
- API 密钥进入 Apple Keychain 的设备本地、不可同步存储,不写 Markdown、Git、安装包或
服务器回执。
- `本地密钥/**``.hololake-*``.git/**` 不进入知识仓库同步。
- 移动端 Agent 使用服务器代理或设备本地模型配置CLI Agent 在移动端明确失败关闭。
### 2.3 服务器知识页写入
- `REPO-012` 提供受会话约束的知识页写入口。
- 服务器受限执行器完成临时文件、校验、原子替换、Git commit 和结构化回执。
- 未登录公开请求返回 `401 session_required`,没有为测试放宽身份边界。
- 服务器执行器曾真实推进知识库提交并通过 `git fsck`;这证明服务器写入链存在,不证明
iPhone 已成功完成同一链路。
## 3. 验证证据
| 验证层 | 结果 | 证据含义 |
|---|---|---|
| 移动端前端定向测试 | `66 / 66 PASS` | 组件和状态逻辑在测试环境成立 |
| 服务端测试 | `76 / 76 PASS` | 登录、知识和原子写协议成立 |
| Rust 测试 | `1148 PASS / 0 FAIL / 2 ignored` | 原生模块与边界测试成立 |
| TypeScript / Vite | `PASS` | 可生成生产前端 |
| iOS / Desktop Rust check | `PASS` | 两平台可编译检查 |
| Apple 签名与上传 | `PASS` | build 26 被 Apple 接收和处理 |
| TestFlight 内部组 | `PASS` | build 26 状态为“正在测试” |
| iPhone 安装 | `PASS` | App Store Connect 回读为已安装 `0.4.6.26` |
| 真机进入知识湖 | `FAIL` | 冰朔报告仍无法进入 |
| 真机页面滚动 | `FAIL` | 冰朔报告手机页面无法滑动 |
| 真机 Agent 新建知识页 | `NOT_RUN` | 被入口与滚动失败阻断 |
二值结论TestFlight 交付存在HoloLake iOS 可用产品不存在。前者不得覆盖后者。
## 4. 问题与因果链
### 4.1 从 Tolaria Vault 到 HoloLake 移动知识湖
```text
桌面文件夹/Vault 假设
→ iOS 没有同等文件夹选择器,桌面配置目录也不具备相同权限
→ “Folder picker is not implemented on mobile” 与 “Operation not permitted”
→ 不能继续给旧入口打补丁
→ 改为 App 沙箱内的基础世界与个人知识湖
```
该结构已经进入源码,但真机仍无法进入,说明“能创建目录”与“完整启动状态能够消费该目录”
是两个验收层。
### 4.2 当前无法进入的已知断点
移动端处理函数先调用原生命令,再以 `verifyAvailability: false` 注册路径,并立即把
onboarding 状态标记为 `ready`。现有测试验证了命令、路径和 React 状态,却没有覆盖真实
WKWebView、真实 iOS 文件系统、后续 Vault 加载器和主工作区渲染的完整设备链。因此:
```text
原生命令或路径注册局部成功
→ React 提前进入 ready
→ 后续 Vault 消费或工作区初始化仍可能失败
→ 单元测试通过,但真机仍停留/回落在不可进入状态
```
本轮没有取得设备端结构化错误回执,所以不得把某一个后续模块写成已确认根因。下一条开发
线必须先增加真机阶段回执,区分 `native_path_created``vault_registered`
`vault_loaded``workspace_rendered`,再修复具体失败点。
### 4.3 手机页面无法滑动
当前 `OnboardingShell` 使用 `h-full`、垂直居中和固定内边距;容器没有 `overflow-y-auto`
欢迎卡也没有基于 `100dvh` / safe-area 的最大高度与内部滚动。欢迎卡包含图标、标题、说明、
两张操作卡、错误信息和帮助链接,内容在窄屏上可以超过可视高度。
```text
固定高度父容器 + 居中布局 + 无纵向 overflow
→ 内容高于 iPhone 可视区
→ 超出部分被视口裁切
→ 手指滑动没有可滚动祖先
```
这是源码能够支持的高置信解释,但仍须在下一条线用真实设备视口和触摸滚动测试确认修复。
## 5. 走过的失败路线与纠正
- 仅修改 Tolaria 名称和 UI 不能解决移动端文件系统与运行边界。
- “Xcode upload complete” 不等于 TestFlight 可安装。
- TestFlight 可安装也不等于 App 可进入、可滚动或 Agent 可写页。
- 服务器原子写成功不等于 iPhone 邮箱会话到服务器的端到端链成功。
- 自动化不得代替账户持有人完成 Apple 出口合规法律声明。
- 桌面源码测试不能替代 WKWebView、safe-area、触摸滚动和 iOS 沙箱真机验收。
## 6. 下一条开发线的最小接续顺序
1. 保留 build 26 作为失败基线,不覆盖或误报通过。
2. 为移动 onboarding 增加四阶段结构化回执并在界面显示精确失败阶段。
3. 把 `OnboardingShell` 改成 `min-h-[100dvh]`、safe-area padding 和可滚动外层;加入
真实 iPhone 尺寸的触摸滚动自动化。
4. 真机验证基础世界进入、个人知识湖进入、重启后恢复同一知识湖。
5. 完成邮箱验证码登录后,让 Agent 新建知识页;服务器与手机同时回读同一 commit/receipt。
6. 只有上述全部通过,移动端知识湖与 Agent 才能从 `0` 变为 `100`
## 7. 安全与记录边界
本文保存目标、可见判断、源码依据、动作、测试和回执,不保存模型隐藏思维过程。任何密钥、
验证码、会话令牌、钥匙串内容和服务器秘密都没有进入本文或 Git。