发布灰度默认关闭:修掉客户端“看得到点不动”与后台看不到 key #482

Merged
kdletters merged 2 commits from codex/game-publish-gate-optin into master 2026-09-22 21:38:03 +08:00
Member

解决什么

你反馈的两个现象都是真问题,这个 PR 一次修掉:

  1. 没开灰度也能看到发布按钮:发布开关此前是「无 gate 行 = 默认开放」,所以没配灰度时后端把 gameDistributionPublishEnabled 判成 true,客户端就渲染了发布入口。
  2. 按钮点了没反应:发布动作的提示原先只写 workspaceStatus,而普通项目走 DirectProjectChatView 时并不渲染工作台状态行,于是「先打开一个项目再发布」「构建失败…」这类信息全都看不见。
  3. 后台看不到 key:预设项此前在未合并的另一个 PR 里,而且后台只列「已创建」的 gate 行。

改成什么

  • is_game_distribution_publish_enabled_for_user 要求 gate 行存在且 enabled=true灰度默认关闭,未登录/无行/enabled=false 一律不开放;只有白名单 / 灰度比例 / 用户标签命中才开放。作者写入与新版本激活都按这条判据。
  • 新增与作者无关的总开关 is_game_distribution_publish_open:管理员审核激活新版本只看「灰度是否开启」,不会因为审核员不在作者白名单里而被挡住(这是合入后立刻发现的回归,已修 + 有用例)。
  • AGC 新增 announcePublishMessage:发布相关提示同时写工作台状态与 DirectProject 对话,点「发布到游戏广场」不会再像没反应。
  • 后台「灰度发布配置」新增「可配置开关」列表:game-distribution:publish 等预设即使还没创建行也会显示,点「配置」按默认关闭填表,运营开启后填白名单/比例即可放量。

验证

  • npm run check:game-distribution-media-e2e(真实 Phaser 构建产物)现在覆盖:灰度关闭 → 作者拿不到入口 + 写入口 503 → 开启灰度 → 真实封面/截图直传 → 创建游戏/版本/上传/送审 → 管理员审核通过 → 网关 index.html 与 bundle 200 → nosniff;全流程通过。
  • 后端:cargo test -p api-server game_distribution 19 passed(含新增 game_distribution_publish_open_ignores_author_allowlist_for_activation)、frontend_runtime_config 6 passed。
  • 前端:admin 灰度页 10 用例(含「未创建的预设开关可见并可一键配置」)、AGC 聊天头 3 用例、网页发布页 15 用例;三端 typecheck、check:encodingcheck:doc-indexcheck:rustfmt、全量 npm test(400 文件 / 4441 用例)与 check:repository-ci -- origin/master HEAD 全绿。

上线注意

灰度默认关闭是刻意的:合入后到运营在后台把 game-distribution:publish 配置并开启之前,作者看不到发布入口、写入口 503;已公开游戏、目录、详情、发行网关、安全下架不受影响。

## 解决什么 你反馈的两个现象都是真问题,这个 PR 一次修掉: 1. **没开灰度也能看到发布按钮**:发布开关此前是「无 gate 行 = 默认开放」,所以没配灰度时后端把 `gameDistributionPublishEnabled` 判成 true,客户端就渲染了发布入口。 2. **按钮点了没反应**:发布动作的提示原先只写 `workspaceStatus`,而普通项目走 `DirectProjectChatView` 时并不渲染工作台状态行,于是「先打开一个项目再发布」「构建失败…」这类信息全都看不见。 3. **后台看不到 key**:预设项此前在未合并的另一个 PR 里,而且后台只列「已创建」的 gate 行。 ## 改成什么 - `is_game_distribution_publish_enabled_for_user` 要求 gate 行存在且 `enabled=true`:**灰度默认关闭**,未登录/无行/`enabled=false` 一律不开放;只有白名单 / 灰度比例 / 用户标签命中才开放。作者写入与新版本激活都按这条判据。 - 新增与作者无关的总开关 `is_game_distribution_publish_open`:管理员审核激活新版本只看「灰度是否开启」,不会因为审核员不在作者白名单里而被挡住(这是合入后立刻发现的回归,已修 + 有用例)。 - AGC 新增 `announcePublishMessage`:发布相关提示同时写工作台状态与 DirectProject 对话,点「发布到游戏广场」不会再像没反应。 - 后台「灰度发布配置」新增「可配置开关」列表:`game-distribution:publish` 等预设即使还没创建行也会显示,点「配置」按默认关闭填表,运营开启后填白名单/比例即可放量。 ## 验证 - `npm run check:game-distribution-media-e2e`(真实 Phaser 构建产物)现在覆盖:灰度关闭 → 作者拿不到入口 + 写入口 503 → 开启灰度 → 真实封面/截图直传 → 创建游戏/版本/上传/送审 → 管理员审核通过 → 网关 index.html 与 bundle 200 → nosniff;全流程通过。 - 后端:`cargo test -p api-server game_distribution` 19 passed(含新增 `game_distribution_publish_open_ignores_author_allowlist_for_activation`)、`frontend_runtime_config` 6 passed。 - 前端:admin 灰度页 10 用例(含「未创建的预设开关可见并可一键配置」)、AGC 聊天头 3 用例、网页发布页 15 用例;三端 typecheck、`check:encoding`、`check:doc-index`、`check:rustfmt`、全量 `npm test`(400 文件 / 4441 用例)与 `check:repository-ci -- origin/master HEAD` 全绿。 ## 上线注意 灰度默认关闭是**刻意**的:合入后到运营在后台把 `game-distribution:publish` 配置并开启之前,作者看不到发布入口、写入口 503;已公开游戏、目录、详情、发行网关、安全下架不受影响。
kdletters added 2 commits 2026-09-22 21:21:34 +08:00
- admin-web:灰度发布配置的固定目标新增「游戏分发 → 游戏发布」(game-distribution:publish),前缀标签与描述说明「未配置或关闭时默认开放,开启后只放行白名单/灰度命中」。
- 默认语义:选中预设后保持 enabled=false,避免误把发布收紧成全关;需要灰度时再显式打开并填白名单/比例。
- 用例:新增「可选择游戏发布开关且默认不收紧」与「保存写入白名单与比例」两条后台用例。
- 文档:开发运维文档说明该键配置前不会出现在已有列表、必须从预设或手填新建一行。
发布灰度改为默认关闭并修掉客户端“看得到点不动”
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m28s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m2s
Project CI / Backend tests (pull_request) Successful in 5m37s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m8s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m29s
Project CI / Native shell tests (pull_request) Successful in 6m53s
Project CI / Frontend tests (pull_request) Successful in 2m52s
Project CI / Repository checks (pull_request) Successful in 2m59s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m21s
4d7c2530bf
- 后端:is_game_distribution_publish_enabled_for_user 现在要求 gate 行存在且 enabled=true(未登录、无行、enabled=false 一律不开放),因此没配灰度时 gameDistributionPublishEnabled=false;新增与作者无关的 is_game_distribution_publish_open,管理员审核激活新版本只按总开关判定,避免被作者白名单挡住(修复合入后立即发现的回归)。
- AGC:新增 announcePublishMessage,把「已构建并打包试玩包」「先打开一个项目再发布」等提示通过 DirectProject 聊天容器的 announce 出口回话;普通项目不渲染工作台状态行,之前只写 workspaceStatus 才会表现为点了没反应。
- 后台:「灰度发布配置」新增「可配置开关」列表,预设开关在未创建行时也可见并可一键配置(game-distribution:publish 不再需要先猜键名)。
- 脚本:check:game-distribution-media-e2e 先验证「灰度关闭 → 作者拿不到入口 + 写入口 503」,再开启灰度把真实 Phaser 构建产物发布到可玩,全链路 25 项断言通过。
- 文档:玩法链路、后端契约、开发运维与实施计划统一改为「灰度默认关闭,运营配置后开放」口径。
kdletters merged commit f502829fde into master 2026-09-22 21:38:03 +08:00
kdletters deleted branch codex/game-publish-gate-optin 2026-09-22 21:38:03 +08:00
Sign in to join this conversation.