diff --git a/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/01-create.png b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/01-create.png new file mode 100644 index 00000000..bd9ebc80 Binary files /dev/null and b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/01-create.png differ diff --git a/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/03-preview.png b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/03-preview.png new file mode 100644 index 00000000..e40ff4a7 Binary files /dev/null and b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/03-preview.png differ diff --git a/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/06-publish-form.png b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/06-publish-form.png new file mode 100644 index 00000000..a89bc77d Binary files /dev/null and b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/evidence/06-publish-form.png differ diff --git a/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/report.md b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/report.md new file mode 100644 index 00000000..3e3e3b23 --- /dev/null +++ b/docs/agent-specs/2026-06-11-前端接线创作链路UI走查/report.md @@ -0,0 +1,56 @@ +# 前端接线·创作链路 UI 走查收口报告(HJ-FE-WALK-001) + +> 2026-06-11 | 走查对象:game-studio 创作链路真 UI 对 staging(mini-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/tycoon,clicker 默认选中)+ 创意 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;脚本一次性未入仓,配方见本报告头)。 diff --git a/docs/mvp/MVP进度总账.md b/docs/mvp/MVP进度总账.md index e176637f..756da674 100644 --- a/docs/mvp/MVP进度总账.md +++ b/docs/mvp/MVP进度总账.md @@ -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=staging,vite 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-001,CDP 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))——**剩创始人线下提交动作,本周四件见看板**