diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 0211d51..f7078c8 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -16,6 +16,51 @@ > 7. **验收归用户**:每批做完**停在干净交接点**,由用户亲自验证;回执必须含「用户可照做的验证步骤 + 每步预期结果」。 > 8. **门禁(不达标不提交)**:后端 = `mvn test` 全过(核心接口须有契约测试);Web = `pnpm build:pro` 通过 + eslint 零错误;Flutter = `dart analyze lib test` 零告警 + `flutter test` 全过。 > 9. **分支**:在 `develop` 提交并 `git push origin develop`;**绝不动 `main`**(dev→main 走 PR,由用户操作)。 +> 10. **设备验证必须「设备侧取证」(2026-10-16 新增,血的教训)**:真机 / 模拟器 / 小程序等目标设备的验证,**证据必须产自设备侧**(设备侧集成测试、设备日志、设备截图、设备侧抓到的连接)。**禁止**用"在开发机上 `curl` 某地址返回 200"证明设备可达 —— 本机 curl 本机网卡地址必然 200,这是**假阳性**(已实际误导过一次:`10.157.242.1` 是开发机 VPN 网卡地址,手机根本不可达,导致真机「剧目列表加载失败」)。**拿不到设备侧证据的,一律标「未验证」**,不得写成"已验证"。 + +--- + +## [待处理] 2026-10-16 20:30 | K1-verify:用**正确地址**重做真机验证(设备侧取证) + +**用户指令(2026-10-16 20:20)**:「让 Codex 用正确地址重做一次真机验证」。 + +**背景(为什么必须重做)**:你 1-3/1-4 那批的真机验证用的是 +`--dart-define=API_BASE_URL=http://10.157.242.1:8081` —— 该地址是**开发机某块 VPN 网卡(utun)的地址**, +现已不存在,**手机侧没有这块网卡**,所以按它构建、安装到手机上的 App **在真机上必然请求失败** +(用户实测提示「**剧目列表加载失败**」,报错里就显示着这个地址)。 +更关键的是:当时那条"证据"是**在开发机上 `curl` 本机网卡地址拿到 200** —— 本机 curl 本机必然 200, +**不构成真机可达的证据(假阳性)**。PM 已把 specs 里 4 处记录修正并作废该结论(`481d4bb`)。 + +### 一、重做验证(**必须设备侧取证**,见红线第 10 条) + +1. **先取真实地址,不要硬编码**:`ipconfig getifaddr en0` 拿开发机局域网 IP(PM 实测当前 `192.168.31.187`;**换网络会变**)。 +2. **前置条件**:手机与开发机在**同一局域网**;iPhone 已授权「**本地网络**」权限(设置 → 隐私与安全性 → 本地网络)。 +3. 真机跑:`flutter run -d 00008101-000875813E42001E --dart-define=API_BASE_URL=http://<步骤1得到的IP>:8081` +4. **证据至少一条来自设备侧**(优先级从高到低): + - **首选:加设备侧集成测试**(`integration_test` 依赖 + `integration_test/` 目录), + 用 `flutter test integration_test -d --dart-define=API_BASE_URL=http://:8081` 在**手机进程里** + 真实请求 `/app/home/feed` 与 `/app/dramas/{id}`,断言 `code=0` 且列表非空。 + —— 这是可重复、可入库的最硬证据,也顺带把"设备验证"变成可回归的。 + - 或:App 运行时抓**从手机 IP 到 8081 的已建立连接**(`lsof -nP -iTCP:8081 | grep <手机IP>`), + 并**同时**给出后端侧确实收到该请求的证据。 + - 或:手机侧截图(`device` 截图不支持无线 iPhone —— 那就用设备侧测试或连接证据替代)。 +5. **若都拿不到:如实标「未验证」**,并说明卡在哪一步(同网段?权限未授权?),**不许含糊**。 +6. 顺带确认原故障已消失:首页「剧目列表」能出内容(或由步骤 4 的测试断言覆盖)。 + +### 二、留痕要求(**只写本仓库,别动 specs**) + +- `docs/plans/PROGRESS.md`(本仓库 FruitServer 这份)**追加**逐动作留痕:命令 + 原始输出 + 解读。 +- 本条下写回执,含**用户可照做的验证步骤 + 每步预期结果**,并**明确标注"证据来自设备侧"**。 +- **不要去改 specs 仓库**(它只拉取;那 4 处 PM 已修正,别重复改)。 + +### 三、门禁与 git + +- `dart analyze lib test` 零告警 + `flutter test` 全过(新增的 integration_test 一起跑;若它依赖真机、无法在纯本机跑,就在回执里说明并给出真机执行命令与输出)。 +- 在 `ReelShort` **`develop`** 提交并 `git push origin develop`;**不动 `main`**;新文件首行 `// Author: fruit.com.cn`。 + +### 四、节奏 + +做完**停下写回执**,不要连做下一批。 ---