test(fe-walk): 创作链路 UI 走查收口——链路①UI全绿+链路②逮2真发布缺陷(HJ-FE-WALK-001)

CDP harness(player_cdp.CdpSession)驱动 6c6g headless chrome 经 Tailscale 打 mini :4173
对 staging 真 UI 走查(与并发会话 9222 池隔离零碰撞):

链路① 创作→生成→预览 全绿(实测):
- 鉴权守卫(注 localStorage token 过)+ 4 模板全显(clicker/merge/idle/tycoon)
- 一句话→开始生成→studio/generate→/task 轮询(0%)→~18s→/preview canvas 500x700 可玩
- 生成出《霓虹深空实验室》能量0/5;0 console error/0 network failure
- 截图证据 evidence/{01-create,03-preview}.png

链路② 发布 UI 逮 2 真后端缺陷(阻真人 UI 发布,编排器用 task.versionId 旁路掩盖):
- Bug A: 生成成功未回写 project.currentVersionId(详情恒 None)→门禁⑤「存在可发布版本」
  恒失败→versionId 缺失提交被拦。修=生成回调回写 current_version_id(同事务)
- Bug B: feed/zones 返回空[]→发布去向专区无可选→launchZoneId 缺失。修=seed 专区
  或修 zones 查询(feed item 有 zoneId 但 zones 列表空,疑 seed 缺/查询过滤)

排除伪缺陷(脚本 bug 非产品): includes('满意')误中「不满意,重做」/ await fetch 未 awaitPromise
致 feed total=0(干净 curl 实证 feed 非空含 idle 9108)。

落账: 总账链路①→🟢UI确认/链路②→标 2 缺陷; §5 加修复待办。两缺陷需后端修+重部署。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-11 05:01:22 +00:00
parent 104aa99586
commit 17b2e6a2ca
5 changed files with 60 additions and 3 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,56 @@
# 前端接线·创作链路 UI 走查收口报告HJ-FE-WALK-001
> 2026-06-11 走查对象game-studio 创作链路真 UI 对 stagingmini-desktop :4173 → :48080
> 工具:项目自有 CDP harness`player_cdp.CdpSession`)驱动 6c6g 本机 headless Chrome 149经 Tailscale 打 mini 前端(与并发会话的 9222 池隔离,零碰撞)。
> 证据:`evidence/01-create.png`(创作页)、`evidence/03-preview.png`(生成结果可玩)、`evidence/06-publish-form.png`(发布门禁页)。
## 结论先行
- ✅ **链路①「一句话 → 选模板 → 生成 → 预览试玩」全程真 UI 跑通**headline 护城河可视证据已补齐)。
- 🔴 **链路②「发布」UI 被两个真实后端集成缺陷卡死**(编排器旁路了它们故批跑能发布、真人 UI 不能)——这正是总账「链路② 前端未接」的确切根因。
## 一、链路① 创作→生成→预览:真 UI 全绿(实测)
| 步骤 | 实测 |
|---|---|
| 鉴权守卫 | 注 localStorage `wanxiang_token=test1``/create` 不被重定向(创作区 requiresAuth 通过) |
| 创作页渲染 | **4 模板全显**(点击收集/合成升级/放置挂机/模拟经营=clicker/merge/idle/tycoonclicker 默认选中)+ 创意 textarea + 0/1000 计数 + 开始生成,**0 console error / 0 network failure** |
| 生成入队 | 填创意→开始生成→`studio/generate`(gameId 9135, taskId 125)→导航 `/create/task/125`「任务排队中 0%」 |
| 轮询 | UI 轮询 `aigc/task/125` ~12 次全 200 |
| 自动转预览 | ~18s 后自动跳 `/create/preview/93107`「可试玩 / 满意去发布」 |
| 可玩性 | iframe(sandbox `allow-scripts allow-same-origin`)内 **canvas 500×700 渲染**;截图实证生成出主题游戏《霓虹深空实验室》「能量 0/5・点击屏幕开始」 |
**判定**:链路① UI 层(鉴权守卫 / 模板同步 / 受控输入 / 异步轮询 / 自动转场 / 沙箱 runtime 渲染)逐项真实工作。总账链路① → 🟢 UI 确认。
## 二、链路② 发布 UI两个真实后端缺陷阻断真人发布
> 复现:新生成 game 9136/版本 93108已预览、`runtime/package/93108` 取包 200→ 去发布页 `/project/9136/publish` → 提交被卡。
### 🔴 Bug A生成成功未回写 `project.currentVersionId`(发布版本检查恒失败)
- **现象**:发布门禁⑤「存在可发布版本」对刚生成+预览过的游戏仍判「请先生成游戏版本(!)」,提交发布被前端拦(`versionId` 契约 required 缺失)。
- **根因**`GET /app-api/project/9136` 返回 **`currentVersionId=None`**,尽管版本 93108 真实存在。生成成功链路**只写版本表/任务表、未回写 project 记录的 `currentVersionId`**。
- UI 侧 `publish-gates.ts:68``p.currentVersionId``Publish.vue:121``versionId = p.currentVersionId` 提交——读的就是这个空字段。
- 编排器 `_publish_one``task.versionId` 直发,**绕过了 project.currentVersionId**,故批跑能发布、掩盖了缺陷。
- **建议修**生成成功回调创建版本处studio/aigc 模块)追加 `UPDATE game_project SET current_version_id = :versionId WHERE id = :gameId`(与版本创建同事务)。修后 project 详情即带版本门禁⑤过、UI 可发布。
- **影响面**:所有真人 UI 发布;不影响批跑/已发布游戏feed 现有内容由编排器旁路发布)。
### 🔴 Bug B`feed/zones` 返回空 `[]`(发布去向专区无可选→恒缺 launchZoneId
- **现象**:发布页「发布去向专区」恒「专区加载中…」,门禁⑦「发布专区已选择」失败;`launchZoneId` 契约 required 缺失,提交被拦。
- **根因**`GET /app-api/feed/zones` 返回 `data=[]`(空)。`Publish.vue:91 feedApi.getZones()` 拿到空 list → zones 为空 → 选择器无项。
- 矛盾点feed item 带 `zoneId`(游戏已落在专区里),但 zones **列表**为空 → 疑似**专区记录未 seed / 或 zones 列表查询被过滤**enabled/status 条件),需二选一确认。
- **建议修**:先查 staging 专区表——①若无记录=seed 默认专区(至少 1 个 UGC type=2与 Publish.vue:45 默认选择口径对齐);②若有记录但被过滤=修 feed/zones 查询条件。
- **影响面**:所有真人 UI 发布;编排器发布走的 zone 口径需一并核feed 有 zoneId 说明发布侧有 zone 兜底)。
## 三、走查中排除的「伪缺陷」(避免误导)
- 「不满意,重做」按钮:首轮走查脚本 `includes('满意')` 误中「不**满意**,重做」(子串碰撞),点成了重做(正确返回 /create——**测试脚本 bug非产品缺陷**;产品重做行为正确(且会作废当前版本)。
- feed `total=0`:走查脚本内 `await fetch` 未 awaitPromise 取值,返回空——**脚本 bug**;干净 curl 实测 feed 非空10+ 款,含 idle 游戏 9108 在 feed
- feed item `packageUrl=null`**非缺陷**,真实取包走 `runtime/package/{versionId}`(已入 smoke-test 注释)。
## 四、落点 / 下一步
- 总账:链路① → 🟢 UI 确认;链路② → 标注两缺陷Bug A/B阻断真人发布。
- 两缺陷均后端改动A=studio/aigc 生成回调B=专区 seed 或 zones 查询)+ staging 重部署(授权部署窗口)。建议:先 A一行回写解锁 UI 发布主路)+ B先查专区表定 seed/查询)→ 重部署 → 重走查generate→publish→入 feed闭合链路②。
- 走查可复现6c6g `python3 /tmp/walk_create.py`(需 9222 chrome + websocket-client脚本一次性未入仓配方见本报告头

View File

@ -62,8 +62,8 @@
| # | 链路 | 状态 | 真实进度 |
|---|---|---|---|
| 1 | 创作 → 生成 → 预览试玩 | 🟢 | 创建真实;**生成链路贯通**UI 一句话→18-27s 可玩游戏,执行器在线);**四模板**clicker 点击/merge 拖拽合成/idle 放置挂机/tycoon 经营)各可生成可玩;预览/试玩 runtime 真实(B2);前端创作页接线待 |
| 2 | 发布 → 审核 → 游戏流 | 🟡 | publish+锁风门 curl 真实、审核状态机真实、feed 结构在;**前端未接** |
| 1 | 创作 → 生成 → 预览试玩 | 🟢 | **前端 UI 实证全绿2026-06-11 走查 HJ-FE-WALK-001**一句话→4 模板(clicker/merge/idle/tycoon)→开始生成→`studio/generate``/task`轮询(0%)→~18s→`/preview` canvas 500×700 可玩(《霓虹深空实验室》能量0/5),鉴权守卫/受控输入/异步轮询/自动转场/沙箱 runtime 逐项真实0 error |
| 2 | 发布 → 审核 → 游戏流 | 🟡 | publish+锁风门 curl 真实、审核状态机真实、feed 结构在;**前端发布走查逮 2 真后端缺陷(阻真人 UI 发布编排器旁路掩盖HJ-FE-WALK-001**A=生成成功未回写 `project.currentVersionId`(门禁⑤恒失败)B=`feed/zones` 返回空[](专区无可选→缺 launchZoneId)。两者均需后端修+重部署 |
| 3 | 游戏流 → 试玩 → 互动 → 分享 | 🟢 | **真人试玩闭环 e2e 真实(B2)**feed(真标题)→点卡→自研 Canvas clicker 真玩通关→game_play_start/end 真遥测→quality→**feed 重排(浏览器实证翻转)**like/share 接真遥测;真实编译打包/分享落地页=桩 |
| 4 | 广告展示 → 收益 → 钱包可见 | 🟡 | 骨架;**真实广告/pay=桩** |
| 5 | 遥测 → 质量分 → 推荐优化(数据回路) | 🟢 | **数据回路 e2e 真实(B2)**事件→quality_score→feed 重排(B超A)+重放幂等MQ 异步化/真实试玩前端待补 |
@ -103,7 +103,8 @@
### 联调(把"模块编译通过"转成"可演示闭环"= Doc A P0 可验证的硬通货)
- [x] **`deploy/smoke-test.sh` 五链路冒烟门2026-06-11** — API 级就绪门:只读 12/12 + `--deep` 13/13 全过health/鉴权 + 链路①四模板就绪+draft + 链路②feed非空+zones+project/my + 链路③runtime/package取包 + 链路④ad/钱包/收益 + 链路⑤feed携qualityScore回灌 + deep:generate入队。**5 条链路后端 API 全绿**CORS/鉴权test1 token从前端 origin 验证通过。**实测 gotcha**feed item 的 `packageUrl` 恒 null真实取包走 `GET /app-api/runtime/package/{versionId}`(已写入脚本注释)。
- [~] **game-studio 前端接 staging** — 配置已就绪(`.env.staging` VITE_API_BASE=stagingvite mock 自动关);后端 5 链路 API 全绿smoke 12/12**UI 视觉走查待 `/browse`**(创作区 requiresAuth 仅认 localStorage `wanxiang_token`走查前须注登录态。game-admin 接 staging 走查未启动。
- [~] **game-studio 前端接 staging** — 配置已就绪 + 后端 5 链路 API 全绿smoke 12/12**创作链路 UI 走查已做2026-06-11 HJ-FE-WALK-001CDP harness 驱动 6c6g chrome 经 Tailscale 打 mini :4173**:链路①创作→生成→预览 UI 全绿;**链路②发布 UI 逮 2 真后端缺陷**A=`project.currentVersionId` 生成未回写B=`feed/zones` 空)。**下一步=修 A/B后端+重部署)→重走查闭合链路②发布**。game-admin 接 staging 走查未启动。
- [ ] **修复发布 UI 两缺陷HJ-FE-WALK-001**A=生成成功回调回写 `project.current_version_id`studio/aigc与版本创建同事务B=查 staging 专区表→seed 默认 UGC 专区 或 修 `feed/zones` 查询条件。修后重部署 staging + 重走查 generate→publish→入 feed。
### 不可压缩日历闸门(人侧并行启动,非工程量;见记忆 mvp-binding-constraint-calendar-gates
- [~] ICP 备案 支付进件 广告联盟审核 LLM 实名充值 短信签名报备 大模型登记/算法备案/分账选型 — **这些才是 MVP 上线的真正约束**。✅ 2026-06-10 看板已建:[`A1闸门看板.md`](./A1闸门看板.md)12+1 项含 owner/最晚提交日/阻塞状态;主体已确认可用;律所咨询 brief 已备 [`律所合规咨询brief.md`](./律所合规咨询brief.md))——**剩创始人线下提交动作,本周四件见看板**