From 4f47343108b87e02cf0d849808bf0ebc84abc5af Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Tue, 29 Sep 2026 07:49:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=20dev=20=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E7=9A=84=E5=8F=91=E8=A1=8C=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=E4=B8=8E=E9=97=A8=E7=A6=81=E6=8E=A5=E7=BA=BF?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 游戏分发里程碑新增「真实部署只读取证(dev 环境)」小节:平台同源入口 /games// 与直连发行网关路径匿名 200(nosniff、CORP=cross-origin、ACAO=*、发行专用 CSP、cache-control max-age=60)、同路径带 Cookie 403、带 Cookie 走 nginx 映射仍 200(证明 proxy_set_header Cookie "" 生效);生产 /api/game-distribution/games 当前 0 条已发布 - 索引第三节补该证据;第五节新增 2026-09-29 广度回归(npm test 423 文件 / 4482 passed / 26 skipped)与门禁接线审计(check:* 共 80 个:53 个自动可达、27 个生产/凭据/环境依赖型人工门禁),并给出审计方法 - 一次性审计脚本不入库;接线结论与「加新门禁先问它有没有自动调用方」一起保留在 pitfalls 与索引里 --- ...�里程碑】游戏分发目录详情与在线游玩-2026-09-18.md | 13 +++++++++++++ .../todos/【待办】计划收口剩余项索引-2026-09-24.md | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/project-memory/plans/【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md b/docs/project-memory/plans/【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md index c2eb46fc7..d9b9fa6a4 100644 --- a/docs/project-memory/plans/【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md +++ b/docs/project-memory/plans/【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md @@ -307,3 +307,16 @@ | `check:game-distribution-ops-rollback-e2e` | 全部通过:下架立即生效(不依赖 CDN purge)、恢复后可复原、换版后旧公开版本保留为 `revoked`;运行期日志无令牌/Cookie/OSS 签名;三份边缘模板不记请求头与查询参数 | 同日还补上了矩阵里一直写「AGC 一键提交仍未在客户端取证」的那条:`GENARRATIVE_AGC_PUBLISH_E2E_BASE_URL=http://127.0.0.1:8082 npx vitest run apps/ai-game-creator-shell/tests/gameDistributionPublishLive.test.ts` → **1 passed(3.0s)**。它不 mock 请求层,走真实 `publishLocalProjectGame` + 真实 HTTP:创建游戏 → 建版本 → 分片上传(断言偏移 0 只发一次、其余按 8 MiB 递增,不重传不跳段)→ 送审 → 版本回读 `pending_review` / `recoveryAction=wait` → 同 `localProjectId` 第二次发布复用同一 `gameId` 且版本号 +1 → `my-games` 聚合指向新版本;后端复核到 `AGC 真实发布2078`(`unpublished`、2 个版本)。**仍缺**的是真实客户端 GUI 里点一次「一键发布」。 + +## 真实部署只读取证(2026-09-29,dev 环境) + +前面几轮都是本地栈;这一轮改用**真实部署**(`dev.genarrative.world`,真实 nginx + 真实 api-server + 真实 OSS)做只读核对,正好覆盖阶段 B/D 里「平台同源入口 + 发行读取隔离」的运行时口径。dev 上当前有 **4 个已发布游戏**(`/api/game-distribution/games` 返回 4 条,其中 `game_3e9d21858c864628a303e8b326fe6077`「周易2」与 `game_96eb73385ad3423c803d49bd99c4f249`「周易01demo」的 `entryUrl` 是平台同源 `/games//`): + +| 请求 | 结果 | +| --- | --- | +| `GET /games/game_3e9d2185…/`(匿名) | **200** + `content-type: text/html`;响应头带 `x-content-type-options: nosniff`、`referrer-policy: no-referrer`、`cross-origin-resource-policy: cross-origin`、`access-control-allow-origin: *`,`content-security-policy` 是发行包专用策略(`default-src 'none'`、`script-src 'self' 'unsafe-inline'`、`connect-src 'self'`、`worker-src 'none'`、`frame-src 'none'`、`object-src 'none'`、`form-action 'none'`、`base-uri 'none'`),`cache-control: public, max-age=60, must-revalidate`(**CDN/边缘缓存窗口就是 60 秒**,与 ops-rollback 用例里「下架不依赖 purge」的口径一致) | +| 同上路径但带 `Cookie: session=…` | 仍然 **200** —— 证明 nginx 那条 location 的 `proxy_set_header Cookie ""` 在真实部署上生效(否则会撞下面那条 403) | +| `GET /api/game-distribution/releases/game_3e9d2185…/index.html`(匿名,绕过 `/games/` 映射直连 api) | **200**,响应头与上表一致(同一个发行读取处理器) | +| 同上路径但带 `Cookie` | **403 Forbidden** + `application/json`(`x-api-version: 2026-06-16`、`x-response-time-ms`)——发行读取**拒绝携带账号凭证**的请求,与本地用例断言一致 | + +**生产环境**(`genarrative.world`)同一时刻 `/api/game-distribution/games` 返回 **0 条**:说明当前生产还没有任何已发布的游戏,条目 ④「真实环境整链路」需要在生产发布一个作品后再跑。也就是说此刻能拿到的真实环境证据是「dev 部署的公开读路径 + 发行隔离」,写路径与审核链路的真实环境验收仍需生产账号。 diff --git a/docs/project-memory/todos/【待办】计划收口剩余项索引-2026-09-24.md b/docs/project-memory/todos/【待办】计划收口剩余项索引-2026-09-24.md index 4024a1e9a..b7c52e6b1 100644 --- a/docs/project-memory/todos/【待办】计划收口剩余项索引-2026-09-24.md +++ b/docs/project-memory/todos/【待办】计划收口剩余项索引-2026-09-24.md @@ -35,7 +35,7 @@ | 计划 | 说明 | | --- | --- | -| `【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md`(`implemented-awaiting-runtime-acceptance`) | **剩 4 条**(此前索引写的 28 条已被 2026-09-28 的逐条核对勾掉):① AGC 从真实 `dist` 一键发布闭环(需桌面会话;客户端函数层已由 live 测试取证);② 发布面板免费生成一句话简介与白名单分类(GUI + 真实 Provider);③ 发布封面基于项目上下文生成(GUI + 真实 Provider + 泥点扣费);④ 真实环境整链路「首次上传 → 校验 → 审核 → 公开 → 游客游玩 → 更新待审旧版在线 → 新版切换 → 下架撤销」(需把当前版本部署到生产后跑一遍) | +| `【里程碑】游戏分发目录详情与在线游玩-2026-09-18.md`(`implemented-awaiting-runtime-acceptance`) | **剩 4 条**(此前索引写的 28 条已被 2026-09-28 的逐条核对勾掉):① AGC 从真实 `dist` 一键发布闭环(需桌面会话;客户端函数层已由 live 测试取证);② 发布面板免费生成一句话简介与白名单分类(GUI + 真实 Provider);③ 发布封面基于项目上下文生成(GUI + 真实 Provider + 泥点扣费);④ 真实环境整链路「首次上传 → 校验 → 审核 → 公开 → 游客游玩 → 更新待审旧版在线 → 新版切换 → 下架撤销」。**2026-09-29 只读取证**:dev 部署上已有 4 个已发布游戏,平台同源入口 `/games//` 与直连发行网关路径匿名 200(带 nosniff / CORP=CORP / 发行 CSP / `max-age=60`)、同路径带 Cookie 403;**生产环境 `/api/game-distribution/games` 当前 0 条**,所以条目 ④ 要先在生产发布一个作品才有得跑 | | `【实施计划】游戏分发阶段A领域合同-2026-09-19.md`(`implemented-awaiting-runtime-acceptance`) | 未勾选 0 条;2026-09-29 已把「本机只到领域单测」这句更新为当前证据(见该计划文末)——真实栈写入证据已由 13 条 E2E + AGC live 发布 + 后台列表/ZIP 联调覆盖;剩真实域名/CDN 与生产 editor runtime identity | | `【实施计划】游戏分发阶段C-AGC发布资料AI生成-2026-09-23.md`(`implemented-awaiting-runtime-acceptance`) | 未勾选 0 条;与上面里程碑的 ② ③ 同源,等 GUI + 真实 Provider | @@ -59,6 +59,7 @@ ## 五、已收口口径(供复核) - **2026-09-29 重新盘点(现行口径)**:`docs/project-memory/plans/` 共 **81 份**文件,行首 `- [ ]` 未勾选共 **15 条**,分布在 **8 份**计划里——第二节 11 条(macOS 节点 3:`AGC macOS渠道更新落地`;桌面会话 6:更新插件 1 + 渠道安装身份隔离 1 + DirectProject 2 + 多选素材 1 + 画布 1;真实 Provider 2:对话计时 1 + 画布 1)+ 第三节游戏分发 4 条;第一节的占用锁计划用编号式验收标准,不计入复选框口径。其余计划的复选框都已清零,但多数状态仍写着 `implemented-awaiting-runtime-acceptance`,等待的是签收或真机/生产证据(逐份见第二节的「已无未勾选条目」表)。下面的 2026-09-24 数字都是当时快照,保留供对照。 +- **2026-09-29 广度回归与门禁接线审计**:`npm test`(全量 JS/TS,CI 与 pre-push 都不跑这一条)→ **423 文件 / 4482 passed / 26 skipped**(对比 2026-09-24 的 417 / 4396,增量为期间新增用例)。`check:*` 门禁共 **80 个**,其中 **53 个自动可达**(`npm run lint` / `check:repository-ci` / CI 工作流 / pre-push / husky / Jenkins 之一能调到),**27 个**属生产、凭据或环境依赖型的人工门禁(Pingora 切换族、微信支付族、数据库备份、外部生成 smoke、AGC 夹具、游戏分发 E2E、`check:pre-push-master` 自身等)。审计方法:从上述入口出发递归展开 package.json 里的 `npm run X` 与 `node|bash scripts/…` 引用。 - **已关闭(2026-09-29)两处路由漂移**,按 `docs/project-memory/README.md`「todos 只留真实开放事项」的规则,两份待办文件已删除,结论与证据保留在这里和权威文档里: 1. **主站 SPA allowlist 与前端路由源不一致**:nginx 侧 5 条 `/games*` 随 `87e52860a` 补齐;本轮补上漏掉的 Pingora 侧——`MAIN_SPA_PATHS` 5→12 条、矩阵新增 `games_spa_fallback`(`/games/detail`)用例、Pingora 试点文档表同步。`check:nginx-spa-routes` OK(12 路由 / 3 模板)、`check:pingora-route-parity` OK(23 路由)、`cargo test -p pingora-gateway matches_nginx_route_parity_matrix` 1 passed(变异验证:拿掉 `/games/detail` 或改错矩阵期望立刻变红)、网关全量 39 passed;dev 与生产上 `/games`、`/games/detail`、`/games/play`、`/games/mine`、`/games/publish` 实测 200 + SPA 外壳。 2. **Pingora 缺发行网关路由**:三份 nginx 模板早就把 `/games/game_<32 位十六进制 id>/…` 代理到发行网关(清 Cookie),Pingora 没有对应分支,切流后「立即玩」会 404。本轮实现 `RouteDecision::ReleaseGateway`(重写上游路径到 `/api/game-distribution/releases/`、清空 Cookie、不进 SPA fallback、不套接流保护、不受维护闸拦截),矩阵补 `games_release_gateway`(含 `upstreamPath` 期望)用例;`check:pingora-gateway-smoke` 新增三条断言(重写+清 Cookie、`/games/detail` 仍走 SPA、`/games/game/index.html` 仍真实 404)并通过。口径与三处真相源已写入 `docs/technical/【开发运维】Pingora独立网关试点-2026-06-11.md` 与 `pitfalls.md`。