文档:AGC 发布面板补齐买断制定价口径
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- 主规范「入口与边界」改为网页与 AGC 两个发布入口一致支持定价,并写明给已上线作品发新版本的预填规则 - 主规范「定价与冻结」补充发布新版本必须预填并保持现有价格、不允许因默认免费静默改价,定价 UI 由 packages/shared 共享组件承载 - 主规范「契约与迁移」补记 AGC 版本请求 priceMudPoints 字段与 #[serde(default)] 仅作旧客户端兼容的口径 - 主规范验收表新增「定价(AGC 入口)」行,AGC 侧证据标注待补及其来源 - 里程碑范围补上 AGC 发布面板定价,删除「不在范围内」的 AGC 后续切片条目 - 里程碑验收标准新增 AGC 入口复选框(保持未勾选并注明等待实现证据) - 排障记录 pitfalls 把 AGC 按免费提交改为历史口径 + 现行口径,保留「改请求 DTO 必须同时编译 AGC 壳」的排障经验 - docs/README.md 合同/里程碑条目同步为两个入口一致并标注 AGC 证据待补
This commit is contained in:
+1
-1
@@ -24,7 +24,7 @@
|
||||
- [后台游戏评价管理合同](./【玩法创作】平台入口与玩法链路-2026-05-15.md#后台游戏评价管理合同):查找、分页、隐藏/恢复/删除、必填原因、统计与个人状态联动;已实现并通过本地验证,待用户验收,未部署。
|
||||
- [后台游戏评价管理里程碑](./project-memory/plans/【里程碑】后台游戏评价管理-2026-10-01.md)与[实施计划](./project-memory/plans/【实施计划】后台游戏评价管理-2026-10-01.md):单里程碑范围、接口/schema 边界及验收要求;本地证据已回写主规范。
|
||||
- [游戏广场评分展示合同](./【玩法创作】平台入口与玩法链路-2026-05-15.md#游戏广场评分展示合同)、[里程碑](./project-memory/plans/【里程碑】游戏广场评分展示-2026-10-01.md)与[实施计划](./project-memory/plans/【实施计划】游戏广场评分展示-2026-10-01.md):已实现并通过本地定向验证,待用户验收,未部署;公开列表/详情携带真实摘要,卡片显示一位小数均分与人数,复用有效评价统计。
|
||||
- [游戏买断制泥点付费与播放鉴权合同](./【玩法创作】平台入口与玩法链路-2026-05-15.md#游戏买断制泥点付费与播放鉴权合同)与[里程碑](./project-memory/plans/【里程碑】游戏买断制泥点付费与播放鉴权-2026-10-05.md):已实现,本机真实栈 E2E 76 PASS,待用户验收;未部署;人工验收脚本 `check:game-distribution-purchase-e2e` 不在 CI 自动门禁内;作者可选买断制泥点付费,购买后永久可玩,后台审核可见价格且审核员不限次试用。
|
||||
- [游戏买断制泥点付费与播放鉴权合同](./【玩法创作】平台入口与玩法链路-2026-05-15.md#游戏买断制泥点付费与播放鉴权合同)与[里程碑](./project-memory/plans/【里程碑】游戏买断制泥点付费与播放鉴权-2026-10-05.md):已实现,本机真实栈 E2E 76 PASS,待用户验收;未部署;人工验收脚本 `check:game-distribution-purchase-e2e` 不在 CI 自动门禁内;作者可选买断制泥点付费,购买后永久可玩,后台审核可见价格且审核员不限次试用;网页与 AGC 两个发布入口一致支持定价并共用 `packages/shared` 组件,AGC 入口证据待补。
|
||||
- [游戏游玩次数计数](./adr/【ADR】游戏游玩次数计数-2026-10-03.md):点「开始游戏」前端上报一次游玩,api-server 纯内存聚合(5s flush、30min 去重、`IP+game` 限流、关停不强制 flush),批量 procedure 自增现有 `game_distribution_game.play_count`,不 bump `updated_at`。
|
||||
- [外部 OpenAPI 与 API Key 接入方案](./【后端架构】外部OpenAPI与APIKey接入方案-2026-06-19.md)
|
||||
- [外部 MCP 语义工具说明与参数设计](./technical/【技术方案】外部MCP语义工具说明与参数设计-2026-09-23.md):15 个新增语义工具与全部原工具并存,复用现有 External API;包含工具说明、action、参数、幂等和兼容合同。
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
## 范围
|
||||
|
||||
- 作者端定价:网页 `/games/publish` 新建与更新模式选择“免费 / 买断制 N 泥点”。
|
||||
- 作者端定价:网页 `/games/publish` 与 AGC 发布面板在新建与更新模式选择“免费 / 买断制 N 泥点”;两入口共用 `packages/shared` 定价组件,AGC 壳请求透传 `priceMudPoints`;给已上线作品发新版本时预填当前价格与模式,作者不改则价格不变。
|
||||
- 玩家端:公开详情展示价格与购买态、泥点购买、购买后游玩。
|
||||
- 付费游玩鉴权:未购买不得游玩,直连公开发行路径必须失败。
|
||||
- 泥点钱包扣费与 `game_purchase` 流水。
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- AGC 发布面板的定价入口(后续切片,不与本里程碑同批验收)。
|
||||
- 创作者分成与结算、退款/撤销购买、促销/限时免费、订阅或游戏内购、价格运营审批流。
|
||||
- 评分/评论与付费的耦合、外部 OpenAPI。
|
||||
- 免费游戏现有链路的任何行为变化。
|
||||
@@ -36,6 +35,7 @@
|
||||
## 验收标准
|
||||
|
||||
- [x] 作者网页发布可选「免费」或「买断制 N 泥点」;负数/超上限/非整数被前后端同时拦截。证据:真实本地栈 E2E 价格 `1000001` → 400 且不落版本,`0` / `1000000` → 200;`cargo test -p module-game-distribution` 29 passed、`cargo test -p api-server game_distribution` 53 passed 覆盖定价校验,网页发布表单定价定向 Vitest 覆盖前端拦截。
|
||||
- [ ] AGC 发布面板与网页一致可选「免费 / 买断制 N 泥点」,非法值被前后端同时拦截;给已上线作品发新版本时预填当前价格与模式,作者不改则价格不变。证据:待补(由实现 worker 提供:AGC 发布面板定价定向 Vitest、AGC 壳 `cargo check` 编译、真实本地栈 E2E 发布付费版本);两入口共用 `packages/shared` 组件 `PlatformGamePricingField`。
|
||||
- [x] 后台审核详情展示该版本价格;无价格的历史版本按免费展示。证据:`cargo test -p api-server game_distribution` 53 passed(`private_version_payload` / `version_detail_payload` 输出 `priceMudPoints`,历史无价格版本按 0);admin-web 审核价格展示定向 Vitest。
|
||||
- [x] 审核员不限次数试玩待审付费版本,不校验购买、不扣泥点。证据:真实本地栈 E2E 审核员两次试玩待审付费版本均 200、两次包内字节一致,作者与审核员余额/流水均不变。
|
||||
- [x] 未购买用户详情可见资料但无可播放入口;直连 `/games/<gameId>/` 返回 404。证据:真实本地栈 E2E 详情 `priceMudPoints=30` / `purchased=false` / `entryUrl=null`,发行网关与平台同源均 404,创建会话 403,未登录 401。
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
- **现象**:`npm run dev:all` 的根栈五个服务与 AGC Vite 都就绪、终端也会打印启动汇总,但 AGC 窗口始终不出现;stdout 里夹着 `error[E0063]: missing field `price_mud_points` in initializer of `GameDistributionCreateVersionRequest``(`src\game_distribution_publish.rs:1356`)和 `error: could not compile `genarrative-ai-game-creator-shell` (bin ...) due to 1 previous error`。编译失败不会让 `tauri dev` 退出,dev:all 只会一直挂着(`waitForAgcFrontend` 的 660s 预算耗尽后才收束整棵树),容易被误判成端口占用或根栈没起来。
|
||||
- **根因**:变更在 `server-rs/crates/shared-contracts/src/game_distribution.rs` 给请求 DTO 末尾追加了 `#[serde(default)] pub price_mud_points: u64`。`serde(default)` 只影响**反序列化缺字段**,Rust **结构体字面量仍必须列全字段**。AGC 壳 `apps/ai-game-creator-shell/src-tauri` 是**独立 cargo workspace**(自带 `[workspace]`,只把 `shared-contracts` 当 path 依赖),`server-rs` 侧的 `cargo test -p ...` 六个 crate 全绿也覆盖不到它。
|
||||
- **处理(现行口径)**:改 `shared-contracts` 里**请求 DTO 字段**时,必须同一次编译 AGC 壳:先 `npm run agc:bundled-resources:prepare`(`build.rs` 只做只读校验,未准备资源会以「随包插件存在未声明文件」失败关闭),再 `cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --features=cocos-editor-execute,unity-editor-execute,godot-editor-execute`(约 30s,feature 与 dev/release 对齐);完整口径是 `npm run ai-game-creator-shell:check:rust`。AGC 发布面板没有买断制定价入口,构造版本请求时显式按免费提交 `price_mud_points: 0`,与升级前行为一致。
|
||||
- **处理(现行口径)**:改 `shared-contracts` 里**请求 DTO 字段**时,必须同一次编译 AGC 壳:先 `npm run agc:bundled-resources:prepare`(`build.rs` 只做只读校验,未准备资源会以「随包插件存在未声明文件」失败关闭),再 `cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --features=cocos-editor-execute,unity-editor-execute,godot-editor-execute`(约 30s,feature 与 dev/release 对齐);完整口径是 `npm run ai-game-creator-shell:check:rust`。定价字段的取值口径分两段:**历史口径**(2026-10-05 之前)AGC 发布面板没有买断制定价入口,构造版本请求时显式按免费提交 `price_mud_points: 0`,与升级前行为一致;**现行口径** AGC 发布面板已支持「免费 / 买断制」定价,请求按作者选择从载荷透传价格,`#[serde(default)]` 仅用于向后兼容不传该字段的旧客户端(按免费处理)。
|
||||
- **边界**:`cargo check` **不能省 feature 参数**——默认 feature 下 `build.rs` 会因为已 staging 的 godot/unity 插件 DLL「不在当前 feature 组合的声明清单里」而红,那是资源准备前置条件,不是本次代码的编译错误。门禁本身**已经存在**:CI `.gitea/workflows/project-ci.yml` 的 `AI game creator shell Rust lane 1/2`、`lane 2/2` 各顺序跑两片 `npm run check:native-shells:agc-rust-shard-N`(底层 `ai-game-creator-shell:check:rust:shell` → `cargo test --locked` 编出壳 bin),本地同序列是 `npm run check:native-shells`。漏拦的原因是本地验证只跑了 `server-rs` 侧 crate、没等 MR/CI 上的 AGC lane,不是缺门禁;因为 2466 条 bin 单测跑满很贵,**不要**把整条 lane 塞进常用本地命令,只在改动 shared-contracts 请求 DTO 时补上面的 `cargo check`。
|
||||
- **判据/取证**:E0063 原文(`logs/dev-all-feature.log`);修复后 `tauri dev` watcher 重建输出 `Finished `dev` profile [unoptimized + debuginfo] target(s) in 38.16s` 并拉起 `target\debug\genarrative-ai-game-creator-shell.exe`;同一 feature 组合 `cargo check` 退出码 0;`.app/dev-stack.json` 记录的实际端口下 api-server `/healthz`、主站 `/`、admin-web `/admin/`、AGC marker `/__agc_dev_server.json` 均 200。
|
||||
- **关联**:`server-rs/crates/shared-contracts/src/game_distribution.rs`、`apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs`、`.gitea/workflows/project-ci.yml`、`scripts/check-native-shells.mjs`。
|
||||
|
||||
@@ -578,7 +578,8 @@
|
||||
|
||||
### 入口与边界
|
||||
|
||||
- 作者入口:网页 `/games/publish`(新建与更新模式)。AGC 发布面板的定价入口列为后续切片,不与网页同批验收。
|
||||
- 作者入口:网页 `/games/publish`(新建与更新模式)与 AGC 发布面板;两个发布入口一致支持「付费方式:免费 / 买断制」与「买断价(泥点)」,共用同一份前端校验与服务端口径,非法值阻止提交。
|
||||
- 预填规则:给已上线作品发新版本时,面板预填当前价格与模式;作者不改则价格不变,避免审核通过后静默改价。
|
||||
- 玩家入口:`/games`、`/games/detail`、`/games/play`。
|
||||
- 审核入口:后台 `#game-distribution` 审核页(详情与待审列表)。
|
||||
- 正式状态来源:SpacetimeDB 的游戏价格、购买记录与钱包余额/流水;前端只负责表现与请求编排。
|
||||
@@ -590,6 +591,8 @@
|
||||
- 价格是版本冻结资料的一部分:作者提交新版本时携带价格,与封面/截图一样在审核通过时整体生效到游戏行;未通过审核的价格不改变当前公开价格。
|
||||
- 价格是整数泥点数,`0` 表示免费,取值域由服务端约束为 `0..=1_000_000`(上限于 2026-10-05 定稿);免费与付费共用同一条发布与审核链路。
|
||||
- 展示资料编辑(`PATCH /my-games/{gameId}`)不得直接变更公开价格;调整价格必须走新版本审核。
|
||||
- 发布新版本必须预填并保持现有价格:面板预填当前价格与模式,作者不改则价格不变;不允许因默认免费而静默改价。
|
||||
- 定价 UI 已抽取为 `packages/shared` 共享组件(`PlatformGamePricingField`),网页与 AGC 两个发布入口共用同一实现,不再保留两份。
|
||||
|
||||
#### 购买与所有权
|
||||
|
||||
@@ -633,6 +636,7 @@
|
||||
- SpacetimeDB:`game_distribution_game` 末尾追加 `price_mud_points: u64`(明确默认 0);新增私有 `game_distribution_purchase`(`purchase_id` 主键,含 `game_id`、`user_id`、成交价快照、钱包流水 ID 与创建时间,`(user_id, game_id)` 唯一);同步 `migration.rs`、后端表目录与生成绑定,并运行 `npm run check:spacetime-schema`。
|
||||
- 泥点流水新增来源类型 `game_purchase`(`RuntimeProfileWalletLedgerSourceType`),同步 Rust `shared-contracts`、`packages/shared`、前端与后台文案。
|
||||
- 游戏 DTO 增加 `priceMudPoints` 与购买态;新增购买与播放会话 DTO。免费游戏必须能忽略这些新字段而不改变行为。
|
||||
- AGC 版本请求携带 `priceMudPoints`(Rust DTO `GameDistributionCreateVersionRequest.price_mud_points`,`#[serde(default)]`);字段仅用于向后兼容不传该字段的旧客户端(按免费处理),新客户端从发布面板透传作者选择的价格。
|
||||
- 不修改已有表字段的类型或顺序;新增字段一律末尾追加并带明确默认值。
|
||||
|
||||
### 验收标准与证据
|
||||
@@ -640,6 +644,7 @@
|
||||
| 条款 | 验收方式 | 证据 |
|
||||
| --- | --- | --- |
|
||||
| 定价 | 网页发布可选「免费/买断制」并拦截非法值,前后端口径一致 | 真实本地栈 E2E:价格 `1000001` → 400 且不落版本,`0` 与 `1000000` → 200;`cargo test -p module-game-distribution` 29 passed(`normalize_game_price_mud_points` 上限)、`cargo test -p api-server game_distribution` 53 passed(`validate_version_declaration` 定价校验);网页发布表单定价定向 Vitest |
|
||||
| 定价(AGC 入口) | AGC 发布面板与网页一致可选「免费/买断制」并拦截非法值;给已上线作品发新版本时预填当前价格与模式,作者不改则价格不变 | 待补(由实现 worker 提供:AGC 发布面板定价定向 Vitest、AGC 壳 `cargo check` 编译与真实本地栈 E2E 发布付费版本);定价 UI 与网页共用 `packages/shared` 共享组件 `PlatformGamePricingField` |
|
||||
| 后台可见 | 审核详情与待审列表显示该版本价格 | `cargo test -p api-server game_distribution` 53 passed(`private_version_payload` / `version_detail_payload` 输出 `priceMudPoints`,历史无价格版本按 0,不回退游戏行当前价);admin-web 审核价格展示定向 Vitest |
|
||||
| 审核试玩 | 审核员不限次试玩待审付费版本,不校验购买、不扣泥点 | 真实本地栈 E2E:审核员两次试玩待审付费版本均 200、两次包内字节一致,作者与审核员余额/流水均不变 |
|
||||
| 购买 | 余额不足失败且不变更;成功扣 N、账单出现 `game_purchase` 流水、购买记录唯一 | 真实本地栈 E2E:余额不足 400 `INSUFFICIENT_MUD_POINTS` 且余额与流水不变;成功购买扣 30(120→90),`game_purchase` 流水与购买行各 1 条;同 key 重放与换 key 重复购买都不再扣费 |
|
||||
|
||||
Reference in New Issue
Block a user