Files
Genarrative/docs
suzmii 6e5cf195f8
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 / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend 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
feat(游戏共创): 公开目录补真游标分页(修「48 硬上限 + 无游标」导致最老作品永久不可见)
真实库实证:51 条 published 时**最老的 3 条**(含最关键的 A0/A1/A11 母版与主干)在公开目录里不可见
(AGC 共创页显示「已检查最新 48 个作品(1 页)」;数据本身没丢)。根因:handler 写死
`limit: MAX_LIST_LIMIT(48)`(并忽略客户端 `limit`),事务过滤排序后 `truncate(limit)`,**既无 has_more
也无游标**。

- **页大小**:默认 **48**(保持既有 AGC 共创页首屏语义——48 只该是默认值而非硬上限)、上限 **100**
  (单响应体量);`0` 取默认、超界**截断**(不报错);api-server 与事务共用同一归一函数。
- **游标**:`"{created_at_micros}:{game_id}"`(复用仓库既有 `"{micros}:{id}"` 惯例,与主题列表同构);
  排序键 `created_at` **倒序** + `game_id` **升序**兜底(与改前比较器逐字同序 ⇒ 首页顺序不变;全序 ⇒
  翻页不重不漏);**先过滤再切页**;「多取一条」判 has_more;`nextCursor` 为真值、**末页为 `null`**。
- **非法游标**:模块产出 `CATALOG_INVALID_CURSOR: 目录游标格式无效` → api-server 新增 `CATALOG_` 前缀分支
  (**排在 owner 不匹配 / 不存在 / 状态 等子串分支之前**)→ **400 + 稳定码 `CATALOG_INVALID_CURSOR`**,
  并纳入「码由模块真实文案可达」的枚举测试(防上次那种不可达码);未登记的 `CATALOG_` 码兜底
  `CATALOG_ERROR`(400)。
- **响应形状不变**:仍是 `{ games, nextCursor }`(`nextCursor` 从恒 `null` 变成真值);抽命名构建器
  `public_games_payload` 并登记 parity(构建器 18→**19**,`mustEmit: ['games','nextCursor']`)。
- **生成绑定**:`game_distribution_public_game_list_input_type.rs`(+`cursor`)、
  `game_distribution_game_list_procedure_result_type.rs`(+`next_cursor`);client facade 改返回
  `(games, next_cursor)`,mapper 同步。
- **文档**(同批):主规范 HTTP 表 `GET /games` 行改为真游标分页;创作者主页工程设计两处「最多 48 / 不分页」
  改写(并注明前端尚未消费游标);`docs/README.md` 索引行同步。
- **测试 +15**:纯函数 9(**51 条能翻到最老那条**、恰好整页不产生空游标、同 `created_at` 用 `game_id` 兜底、
  **先过滤再切页**、游标指向页内最后一条、limit 0/超界、非法游标 7 种);事务结构断言 1;api-server 5
  (形状、`limit` 默认与截断、非法游标 400 + 稳定码、码可达性枚举、**51 条走真实 handler 链路翻页且
  未公开/已软删/无公开版本三种不可见行不出现**)。

门禁:wasm build 0;`cargo check --all-targets` 0;`cargo test -p module-game-distribution` **143 passed**;
`-p spacetime-module` **307 passed / 1 ignored**;`-p spacetime-client` 44 passed;`-p api-server game_distribution`
**112 passed**;DTO parity 0(66 组 / **19** 构建器 / 15 手拼类型);`check:spacetime-schema` 0(98 表);
`check:encoding` 0(5548 files);`cargo fmt --all --manifest-path server-rs/Cargo.toml -- --check` 0;
`git diff --check` 0。
2026-10-07 11:23:59 +08:00
..

文档总览

本目录只把当前实现依据、公开契约和仍在维护的专题合同作为入口。代码、当前文档与项目记忆冲突时,以当前代码和最新专题文档为准;未列入下表的材料不作为实现依据。

必读入口

  1. Agent 工作入口与执行准则
  2. 规范驱动开发工作流
  3. 文档生命周期与现状索引
  4. 当前产品与工程约束
  5. server-rs 与 SpacetimeDB 数据契约
  6. 本地开发验证与生产运维
  7. 项目记忆入口

文档治理

当前产品与平台

  • 当前产品与工程约束:现役入口、账号钱包、UI 和后端分层。
  • 平台入口与玩法链路:平台壳、图片画布、游戏分发与在线游玩合同;网站游戏评分与评价已实现并通过本地验证,待用户验收,未部署。
  • 网站游戏评分与评价里程碑:唯一评价、编辑预填、4000 字符、公共分页与平均分/人数的验收边界与本地证据。
  • 创作者主页与关注粉丝合同:前后端已实现并通过工程验证,用户已确认提交交付,未部署。第四项默认进入自己主页,他人的关注/粉丝列表统一只读并支持主页跳转。
  • 创作者主页与关注粉丝工程设计:分层落点、关系表/DTO、授权、关系列表分页、组件状态、深链与验证边界;公开游戏目录原为最多 48 项且不分页,2026-10-07 已补真游标分页(缺省 48 / 上限 100 / 非法游标 400 CATALOG_INVALID_CURSOR / 末页 nextCursor 为 null),作者过滤沿用原排序但不再被 48 项截死。
  • 后台游戏评价管理合同:查找、分页、隐藏/恢复/删除、必填原因、统计与个人状态联动;已实现并通过本地验证,待用户验收,未部署。
  • 后台游戏评价管理里程碑与实施计划:单里程碑范围、接口/schema 边界及验收要求;本地证据已回写主规范。
  • 游戏广场评分展示合同、里程碑与实施计划:已实现并通过本地定向验证,待用户验收,未部署;公开列表/详情携带真实摘要,卡片显示一位小数均分与人数,复用有效评价统计。
  • 游戏买断制泥点付费与播放鉴权合同与里程碑:已实现,本机真实栈 E2E 由人工验收脚本 check:game-distribution-purchase-e2e 覆盖(最近一次人工运行 76 PASS / 0 FAIL / 1 WARN),该脚本不在 CI 自动门禁内;待用户验收,未部署;作者可选买断制泥点付费,购买后永久可玩,后台审核可见价格且审核员不限次试用;网页与 AGC 两个发布入口一致支持定价并共用 packages/shared 组件 PlatformGamePricingField,AGC 定价的前端用例与 Rust 预填单测已覆盖,AGC 真实栈发布未覆盖。
  • 游戏游玩次数计数:点「开始游戏」前端上报一次游玩,api-server 纯内存聚合(5s flush、30min 去重、IP+game 限流、关停不强制 flush),批量 procedure 自增现有 game_distribution_game.play_count,不 bump updated_at。
  • 游戏共创与作品 Fork:共创授权三态(只升不降)、作品级血缘与代际、成品包与工程源包两条改造路径、族谱树与溯源署名的产品设计与技术方案;同时作为该功能主规范,已评审通过,按 M1 逐里程碑实现。
  • 外部 OpenAPI 与 API Key 接入方案
  • 外部 MCP 语义工具说明与参数设计:15 个新增语义工具与全部原工具并存,复用现有 External API;包含工具说明、action、参数、幂等和兼容合同。
  • External v1 OpenAPI:公开 HTTP 契约唯一机器可读来源。
  • External v1 游戏场景生成路由:external v1 结构化场景生成专用路由与 AGC 美术包背景阶段迁移合同。

AI 游戏创作与 Agent Runtime

图片画布与媒体

钱包与会员计费

  • 双余额泥点与会员补差升级实施计划:每日免费 / 月度 / 永久三池并列投影、按开通日自然月计期、年付 12 期与补差升级的规则细则、里程碑与验收判据;已落地(会员购买与升级的 C 端 UI 未做)。
  • 泥点三池与会员计费后端设计:后端 DB schema、账本与幂等、领域数据结构与 HTTP 契约;会员档位改为枚举、目录表以枚举为主键,含破坏性迁移计划、遗留清理清单与落地状态;已落地。
  • 会员与泥点前端改造:共享充值弹层改为「会员与泥点」双 Tab(套餐卡 / 周期切换 / 补差升级 / 六档充值 / 套餐对比 / 确认页),金额只读后端目录与报价接口;Web 平台入口、图片编辑器与 AGC 桌面壳三处共用;含已确认决策与验收判据。
  • 泥点三池以单一总额为权威:存储层保留 wallet_balance 单一权威总额,对外并列三池;永久泥点暂为推导余数,另记独立存储的 TODO。
  • 会员账期按开通日自然月:北京时间开通日锚点、自然月推进与月末夹取、年付 12 期的期数表达与取整口径。
  • 会员订单复用充值订单与补差升级幂等锚点:会员订单复用 profile_recharge_order、MembershipUpgradeGrant 账本幂等、后端只读报价与退款人工复核边界。
  • 会员档位以枚举为权威:档位身份改为 Rust 枚举、目录表 profile_membership_plan 以枚举为主键、删除两处 tier 列与旧档位枚举、并发用哨兵值 128 表示不设上限。
  • 模型权限与并发上限的强制边界:并发上限只在认领事务按账号过滤队列 job、只算 running;模型权限只约束 AGC LLM 模型、缺省 Basic 由后台人工标 Full;raw gpt-image-2 等直连同步生成暂不计入并发。

后端、运维与测试

已核准专题补充

以下文档已有源码、测试或运行时证据,现纳入 current 集合:

维护规则

  • 当前文档只保留稳定合同、公开契约和仍在推进的专题;一次性计划、实施记录和已关闭实验完成后删除或融合,不再长期堆积。
  • 文档现行/历史/待复核状态以文档生命周期与现状索引为准;未列入当前入口的文档不能直接作为实现依据。
  • docs/project-memory/shared-memory/ 只保存长期有效的概览、决策、流程和踩坑;plans/、todos/ 仅保存仍开放且有明确下一门禁的事项。
  • 修改 /api/external/v1 必须同步 OpenAPI 和契约测试;修改 SpacetimeDB schema 必须同步 migration、表目录、绑定和 schema 检查。
  • 当前入口、公开契约和数据对象只以现役代码、路由树、shared-contracts 与 SpacetimeDB schema / bindings 为准;未登记对象不得作为兼容目标恢复。
  • 新增 Markdown 使用 【标签名】中文标题-YYYY-MM-DD.md 命名;不要把个人配置、密钥、Token、日志或构建产物写入文档。