Files
cmshoppe/docs/reviews/2026-06-27-T001-T103-acceptance.md
T
chengmaandClaude Opus 4.8 6d821f89e2 docs: T-001~T-103 验收报告
- 新增 docs/reviews/2026-06-27-T001-T103-acceptance.md(逐任务核对、已验证事实保留、真机冒烟待办)
- progress.md 追加审查指针

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 09:53:05 +08:00

68 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 验收报告 · T-001 ~ T-103(含 T-000/T-004/T-005/T-006)
- 日期:2026-06-27
- 范围:Codex 完成的 Phase 0 地基(T-000~T-006)+ Phase 1 账号与启动(T-101~T-103)
- 评审方式:编译检查 + 单元测试 + 逐模块源码阅读 + 对照 `docs/api.md`/`docs/04-architecture.md`/`docs/06-tasks.md` 契约
- 结论:**通过。按文档完成,忠实于已验证事实,质量偏上。**
## 一、验证方法与结果
```
python3 -m compileall app main.py # OK
python3 -m unittest discover -s tests # Ran 22 tests, OK (skipped=2)
```
2 个 skip 为 `app.excel` / `app.prompts` 的**契约测试**(模块尚未实现则自动跳过,实现后即校验),属预期。
## 二、逐任务核对
| 任务 | 结论 | 关键核对 |
| --- | --- | --- |
| T-000 包结构 | ✅ | `app/` 包 + `main.py` + `__main__.py`;prototypes 导入已修正 |
| T-001 `editor.py` | ✅ | 已验证 CDP 事实全部对上(见第三节);满 9 张不臆造删除,返回 `FULL_IMAGE_SLOTS` 留 T-502 |
| T-002 `appconfig.py`+`config.json` | ✅ | 默认值齐;`response_timeout` 按分辨率派生;`_assert_no_secrets` 强制 config.json 不含密钥 |
| T-003 `db.py`+SQLite | ✅ | WAL/busy_timeout/foreign_keys;建表幂等;`set_collected/generated/applied` 等齐;schema 与架构 5.2 双向同步 |
| T-004 `.gitignore` | ✅ | 配置/密钥/DB/凭证/图片全部排除 |
| T-005 ai_models 后端 | ✅ | category 过滤、唯一名校验、至少各一个 text/image、`_mask_api_key` 打码、`get_model` |
| T-006 测试基座 | ✅ | 22 测试通过;excel/prompts 用契约测试自动 skip |
| T-101 slug+目录 | ✅ | 规范化 + sha1 后缀保证唯一;路径绝对化;按需建目录 |
| T-102 `chrome.py` 启动器 | ✅ | 正好三参数;`/json/version` 探测用空 ProxyHandler 绕过系统代理 |
| T-103 登录保活+检测 | ✅ | 登录页重定向 / 缺 `SPC_ST·SPC_U` 判未登录;5 个登录单测覆盖 |
## 三、已验证 CDP 事实保留情况(最关键)
`app/cdp.py` 完整保留三处防护:清除 `*_proxy` 环境变量、`requests.trust_env=False`、`websocket` 连接 `suppress_origin=True`。
`app/editor.py` 与原型逐项一致:
| 事实 | 实现 |
| --- | --- |
| 标题输入框 XPath | `//input[@class='eds-input__input' and string-length(@modelvalue)>24]` ✅ |
| SPA 就绪判断 | 标题框 + itembox + 上传 input 三者皆存在 ✅ |
| 写标题让 Vue 感知 | 原生 setter + 派发 input/change,校验 `value==modelvalue==新值` ✅ |
| 上传输入框 | `.shopee-image-manager__upload input[type=file]` + `DOM.setFileInputFiles` ✅ |
| 上传成功判断 | 轮询张数 +1 且新图 src 含 `susercontent`、非 `blob:` ✅ |
| 封面=第一位 | 拖拽落点 `first.left - 0.30*w` ✅ |
| 更新按钮 | `button.eds-button` 中 `<span>更新</span>`,禁用态识别 ✅ |
| 登录检测 | 登录页 URL 或缺 `SPC_ST`/`SPC_U` → 未登录 ✅ |
## 四、值得肯定
1. **不臆造未验证内容**:满 9 张删除封面未硬写,明确注释"确认框选择器未验证,留 T-502"。
2. **文档↔代码一致**:db schema 比原 5.2 丰富(batches 表、stage/status 分离、`*_attempts` 重试、行级定位 `source_file_abs/sheet/row/row_key`),但架构 5.2 已同步更新。
3. **工程加分项**:SQLite 多线程连接纪律、密钥脱敏与 `_assert_no_secrets` 守卫、契约式 pending 测试。
## 五、小问题(不影响验收,可不改)
- `editor.replace_cover` 在 `setFileInputFiles` 后又手动派发一次 input/change(原型无,冗余但无害)。
- `collect()` 旧封面写死 `.jpg` 扩展名(Shopee 封面基本为 jpg,影响极小)。
## 六、待办 / 边界
- ⚠️ T-001 验收原文为"在测试商品跑通",但本轮测试均为 **mock CDP**,未连真实 Shopee。`editor.py` 是对此前已在线验证过的原型的忠实移植,可信度高,但**这份新代码尚未在真实 Shopee 上重新冒烟**。
- **建议**:接 GUI(T-104+)前,用 prototypes 同款环境对 `editor.py` 做一次真机冒烟(打开测试商品 → 采集 → 改标题 → 换封面,不提交),确认移植无回归。
## 七、总评
合格偏上的工程交付:按文档、守纪律、有测试、不臆造。可放心推进 T-104(PySide6 主窗口骨架)。