docs(游戏共创): 按只读侦察事实修正 M2a 方案:成品包只能试玩不能重发
Project CI / AI game creator shell Rust lane 1/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
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled

- 技术方案 §2.5:把「成品包 = 产物级改造(可发布)」改成四列表(新增「能不能再发布」列),写明成品包只能试玩与提取素材、**不能直接重新发布**;补「被否证的旧表述」对照段并指向 §3.5.1/§3.5.4
- 技术方案 §1.3:新增三行缺口事实——无「按版本取 ZIP」的下载通道、导出/发布强制 Phaser 4 + Vite 声明、发行包只含 dist + 根 assets + exports/README(不含 package.json 与源码)
- 技术方案 §3.5:加术语更正块;§3.5.1 重写为「零新增上传资产,但只到『可玩参考』」——试玩成立(verification.rs:49-66)与发布必然被拦(export.rs:262-265 → :405-470;注释 :407-408、反例测试 :1239-1243)、成品包无工程声明可补、下载通道当前不存在及其内存/无续传代价
- 技术方案 §3.5.4(新增):A 参考式改编 / B 只做工程源包 / C 伪工程三条路线与推荐(A 先行、B 为正解排后续、C 不做),标注为待用户拍板材料;附 A 路线的脚手架触发互斥点
- 技术方案 §2.4 / §2.6:唤起方式(deep link 当前未注册)标为待拍板;审核队列标注文案改为「仅成品包可玩参考,不能直接发布」;用户流程图改为目标形态并加说明
- 技术方案 §5:验收表把「一键改造闭环 / 产物级改造路径」拆成源码路径闭环、参考路径(试玩 + 素材,且界面不得承诺可发布)、交付口径一致三条
- 技术方案 §6:M2a 行改名为「参考式改编(只试玩 + 素材 + 血缘,不含重新发布)」并注明成立前提;M2b 行标注为「一键复刻完整工程」的唯一正解路径
- 技术方案 §7:改写原第 1 条(其「成品包路径默认要做」的前提已被否证),追加第 8–12 条待拍板项(对外表述 / 血缘承载位 / 是否立刻做工程源包 / 唤起方式 / 是否允许伪工程)
- 里程碑「成品包改造闭环」:按事实重写「目标 / 范围 / 不在范围内 / 依赖与前置条件 / 验收标准」,新增「事实依据」四条与「前置决策(未拍板前不得实现)」五项,删除全部「能发布」的验收项,改为「本地试玩 + 素材提取 + 在自建合规工程里发布时携带血缘」
- 里程碑「作品工程源包与一键改造」:标注为正解路径;新增前置依赖①「工程包下载/授权」接口(当前不存在)与②包内禁项定义(服务端已拒绝 node_modules / .git / .env* / *.map / *.pem / *.key 与嵌套 zip),并同步「降到试玩+素材参考」的口径
This commit is contained in:
2026-10-05 00:16:42 +08:00
parent 018f9d58e9
commit ed255666c1
3 changed files with 118 additions and 51 deletions
@@ -2,10 +2,12 @@
| 字段 | 值 |
| ----------- | ----------------------------------------------------- |
| Version | 1.0 |
| Status | proposed |
| Date | 2026-10-03 |
| Parent Spec | `docs/【技术方案】游戏共创与作品Fork-2026-10-03.md` |
| Version | 1.1 |
| Status | proposed(**正解路径**;未拍板前不得实现,见依赖与前置条件) |
| Date | 2026-10-03(2026-10-04 标注为正解路径并补前置依赖) |
| Parent Spec | `docs/【技术方案】游戏共创与作品Fork-2026-10-03.md`(口径见 §2.5、§3.5.1、§3.5.2、§3.5.4) |
> **定位(2026-10-04)**:只读侦察证明成品包路径只能试玩、不能重新发布(见「成品包改造闭环」里程碑的「事实依据」),因此**本里程碑是「一键复刻完整工程」的唯一正解路径**:只有拿到作者随版本上传的工程源包,用户才可能在不重写工程的前提下改核心逻辑并重新发布。技术方案 §3.5.4 的推荐是「路线 A(参考式改编)先行验证需求,路线 B(本里程碑)作为正解排后续」。
## 目标
@@ -21,7 +23,7 @@
## 不在范围内
- 成品包路径的改造闭环(见「成品包改造闭环」里程碑;本里程碑复用其入口、血缘声明与建项基座)。
- 成品包路径的「试玩 + 素材参考」闭环(见「成品包改造闭环」里程碑;本里程碑复用其内容下发入口、血缘声明与建项基座)。
- 工程源包的版本回溯(历史版本没有工程包时不为它补做)。
- 网页端上传工程源码包(首期只支持客户端)。
- 相似度比对与低改动度判定、收益分成。
@@ -30,8 +32,10 @@
- 「游戏共创授权与血缘」里程碑已通过验收。
- 「成品包改造闭环」里程碑已通过验收(内容下发入口、客户端建项基座、发布携带来源、授权面板均在那一里程碑落地)。
- **新增前置依赖 ①(当前不存在,必须在本里程碑内新建):「工程包下载/授权」接口。** 平台今天**没有**任何「按版本取包」的下载通道——作者侧路由只有 create/upload/chunk/complete/reset/submit/get_owner_version/cancel,作者侧 payload 不回对象键或下载地址(`server-rs/crates/api-server/src/modules/game_distribution.rs:3029-3041`);对外只有公开发行网关**逐文件**读取且只服务当前已公开版本(`:395-421`、`:800-863`),扩展名受限(`server-rs/crates/module-game-distribution/src/release.rs:36-64`)。工程源包含 `.ts`/`.vue`/`package.json` 等不在白名单内的文件,**无法**靠发行网关拼出来,必须新做受鉴权下载(并设计 Range/续传或分片,现状两侧都是整包进内存:服务端 `:926-958`、客户端 `src-tauri/src/template_library.rs:564-591`)。
- **新增前置依赖 ②:包内禁项必须先定义清楚。** 服务端已拒绝 `node_modules`、`.git`、`.agent`、`.env*`、`*.map`、`*.pem`、`*.key` 与嵌套 `.zip`(`server-rs/crates/module-game-distribution/src/package.rs:135-142`、`:170-176`),且 `node_modules` 不能进包意味着用户拿到源包后仍需本机 `npm install`;本地导出上限 512 MiB 与平台 200 MiB 的上限并不对齐,需要在本里程碑内定口径。
- 客户端已有的「从包安装并建项」基座与包内容门禁可直接复用;本里程碑不新建第二套解压或建项路径。
- 决策:本里程碑成立的前提是产品同意引入工程源包;若否决,本里程碑取消,改造能力止于产物级。
- 决策:本里程碑成立的前提是产品同意引入工程源包;若否决,本里程碑取消,改编能力止于「试玩 + 素材」(见「成品包改造闭环」里程碑)。
## 验收标准
@@ -42,7 +46,7 @@
- [ ] 同一版本同时存在两种来源时,下发入口优先返回工程源包并如实标注来源类型;未上传工程包时仍能拿到成品包。
- [ ] 客户端在真实环境中完成源码工程形态建项:新项目可打开、可编辑源码、可试玩、可重跑构建并发布。
- [ ] 通过源码路径发布的作品,其来源、代际与根与成品包路径完全一致,不产生第二套血缘语义。
- [ ] 工程包未上传或上传失败不阻断发布,但界面必须明确告知改造能力被降到产物级。
- [ ] 工程包未上传或上传失败不阻断发布,但界面必须明确告知改造能力被降到「试玩 + 素材参考」(成品包路径,不能直接重新发布)。
- [ ] 作品公开后提升授权,可对**当前公开版本**补传工程包一次;补齐后改造路径升级为源码级,无需作者发新版本。
- [ ] 再次补传、换内容重传被拒绝;目标版本不是当前公开版本、或作品授权仍为禁止时,补传同样被拒绝;历史版本不会被补齐。
@@ -2,26 +2,49 @@
| 字段 | 值 |
| ----------- | ----------------------------------------------------- |
| Version | 1.0 |
| Status | proposed |
| Date | 2026-10-03 |
| Parent Spec | `docs/【技术方案】游戏共创与作品Fork-2026-10-03.md` |
| Version | 1.1 |
| Status | proposed(**未拍板前不得实现**,见下方前置决策) |
| Date | 2026-10-03(2026-10-04 按只读侦察的事实重写) |
| Parent Spec | `docs/【技术方案】游戏共创与作品Fork-2026-10-03.md`(口径见 §2.5、§3.5.1、§3.5.4) |
> **改名说明**:本里程碑原名「成品包改造闭环」,其「改造」隐含「改完能再发布」。2026-10-04 的只读侦察证明成品包路径**只能试玩、不能重新发布**(事实见下),因此本里程碑的对外名称为**「参考式改编(只试玩 + 素材 + 血缘,不含重新发布)」**;文件名保持不变以免断链。
## 前置决策(未拍板前不得实现)
1. **对外表述**:是否接受「只能试玩 + 素材复用,不能一键复刻工程」?建议接受并同步改文案(AGC 侧注释 `apps/ai-game-creator-shell/src-tauri/src/project/export.rs:407-408` 已把无 `package.json` 的静态项目排除在发布合同外)。
2. **血缘承载位**:血缘只作为客户端本地注释(项目内独立文件),还是要平台可查询(服务端新增字段)或随工程包传输(manifest 升 v2)?建议先本地,等工程源包里程碑落地再上平台字段。
3. **是否立刻做工程源包(M2b)**:它是「一键复刻完整工程」的唯一正解路径,但需要新增「工程包下载/授权接口」(当前不存在)。建议先做本里程碑验证需求。
4. **唤起方式**:AGC 内手工输入 gameId / 平台取件码 / deep link(当前 `tauri.conf.json` 未注册 scheme、无 `tauri-plugin-deep-link` 与单实例插件,需动安装器与升级链路)?建议手工输入起步。
5. **是否允许「伪工程」兼容存量**:补一个声明 phaser 4 + vite 的 `package.json` 让成品包过检——产出不可再构建,建议不允许。
## 目标
用户能在作品详情页一键把别人的已公开作品拿到本地、改完再发布,且溯源自动正确。整条链路**复用平台已存在的成品包**,作者侧不需要任何新增上传动作。
用户能在作品详情页把别人的已公开作品拿到本地,**对照试玩、复用其中素材**,并在**自己新建的合规工程**里完成改编与发布;发布后溯源、代际与署自动正确。整条链路**复用平台已存在的成品包**,作者侧不需要任何新增上传动作。
> 目标里没有「把成品包改完直接发布」这一句——它不成立(见「事实依据」第 2、3 条)。
## 事实依据(本里程碑的能力边界由这四条钉死)
1. **试玩成立**:客户端 `validate_project_game_entry`(`apps/ai-game-creator-shell/src-tauri/src/project/verification.rs:49-66`)只要求入口是 HTML 文档、引用可解析(`:68-100`),与 `package.json`、构建脚本无关。
2. **发布不成立**:导出/发布的唯一入口 `export_local_project_package`(`src-tauri/src/commands/desktop.rs:1148-1156`)→ `export_local_project_package_for_publish_at`(`export.rs:259-306`),其中「已有可玩入口」的静态入口分支(`export.rs:262-265`)**仍然无条件调用 `ensure_publish_project_stack(root)`**(实检 `export.rs:413-459`,调用点 `export.rs:463-468`):`package.json` 必须声明 phaser 主版本 4(`:440-453`)且声明 vite 依赖或存在 `vite.config.*`(`:398-410`、`:454-458`)。注释与反例测试见 `export.rs:407-408`、`:1239-1243`。该分支**不要求 build 脚本**(`resolve_publish_build_plan` 只在「无入口」分支调用,`export.rs:266-273`)。
3. **成品包里没有工程**:`collect_project_export_package_files`(`export.rs:770-804`)只收 `dist` 树 + 根 `assets/` + `exports/README.md`,**不含 `package.json` 与源码**(发布前归一化还会剥掉 `game/` 前缀并要求包根 `index.html`,`export.rs:527-534`、`:582-584`)。
4. **平台没有包下载通道**:作者侧路由只有 create/upload/chunk/complete/reset/submit/get_owner_version/cancel,作者侧 payload 不回对象键或下载地址(`server-rs/crates/api-server/src/modules/game_distribution.rs:3029-3041`);对外只有公开发行网关**逐文件**读取,且只服务**当前已公开版本**(`:395-421`、`:800-863`),扩展名受限(`server-rs/crates/module-game-distribution/src/release.rs:36-64`)。
⇒ 三条合起来:**把成品包铺成项目只能试玩,发布必然被拦,也无法从包里补出合规工程声明**。
## 范围
- 受鉴权的改造内容下发入口(先只服务成品包):只对满足授权与公开性条件的请求开放,不下发可直接匿名访问的对象地址。
- 客户端:下载 → 摘要校验 → 解压 → 以「静态可玩入口」形态在本机建成新项目 → 项目内记录来源并在界面展示。
- 受鉴权的内容下发入口(只服务成品包):只对满足授权与公开性条件的请求开放,不下发可直接匿名访问的对象地址。
- 客户端:下载 → 摘要校验 → 解压 → 以「可玩参考」形态在本机建成副本(可试玩、可提取素材)→ 项目内记录来源并在界面展示。
- 客户端:为用户提供**新建合规工程**的路径,并在其中带上血缘(来源声明随发布写入),使「在自建工程里改编后发布」能留下正确溯源。
- 从平台作品唤起客户端的入口。
- 发布链路自动携带来源声明,不要求用户手填。
- 客户端发布面板的共创授权选择与相应提示。
- 能力边界的如实告知:基于已构建成品时,界面必须说明可改范围,不能让用户误以为拿到源码。
- 能力边界的如实告知:界面必须写明「成品包只能试玩与提取素材,**不能直接重新发布**」,不能让用户以为拿到了可发布工程。
## 不在范围内
- 把成品包补成可发布的工程(补声明 `package.json` 的「伪工程」路线已否决;见前置决策第 5 条)。
- 工程源包的上传、下载与源码形态建项(见「作品工程源包与一键改造」里程碑)。
- 网页端手填来源声明。
- 创作族谱页面(见「创作族谱与衍生列表」里程碑)。
@@ -30,21 +53,25 @@
## 依赖与前置条件
- 「游戏共创授权与血缘」里程碑已通过验收(授权与血缘的数据合同、状态机、灰度入口)。
- 客户端现有的「从包安装并建项」基座、解压路径门禁与「已有可玩入口直接打包」能力可直接复用,不新建第二套解压或建项路径。
- **新增**「按版本读取/下发成品包」的受鉴权接口——当前不存在(事实依据第 4 条),需连同大小与内存策略一并设计(服务端读包整包进内存 + 进程内缓存上限 4 条 / 256 MiB,`api-server/src/modules/game_distribution.rs:926-958`、`:101-104`;客户端 `fetch_limited_bytes` 整包进内存、上限 512 MiB、无 Range 无续传,`src-tauri/src/template_library.rs:564-591`;分片能力只有上传侧,`src-tauri/src/game_package_upload.rs:96-105`、`game_package_upload/runtime.rs:353-363`)。
- 客户端现有的「从包安装并建项」基座、解压路径门禁可直接复用,不新建第二套解压路径;但**建项形态必须区分**:先铺成品包文件与先建空工程在现有 `create_npm_scaffold` 判据下互斥(`src-tauri/src/project/manifest.rs:609-613`),两条都要就得由 fork 流程自己写 `package.json` / `vite.config.*`(既有做法可参照 `src-tauri/src/template_library.rs:816-905` 的「先复制模板文件、再调标准初始化」)。
- 决策:前置决策 5 项拍板通过。
## 验收标准
- [ ] 授权为「禁止共创」的作品不出现改造入口;绕过界面直接请求内容入口同样被拒绝。
- [ ] 授权为「禁止共创」的作品不出现改编入口;绕过界面直接请求内容入口同样被拒绝。
- [ ] 未登录、无授权、来源作品未公开或已下架时,内容入口全部拒绝,且不泄露摘要与地址。
- [ ] 客户端在真实环境中完成「详情页 → 唤起客户端 → 下载 → 建项」:摘要校验失败时不留半成品目录,成功时新项目可直接试玩。
- [ ] 由该路径建成并发布的作品,详情页显示正确的来源、代际与衍生关系;代际与根由服务端计算,客户端无法伪造或覆盖。
- [ ] 客户端在真实环境中完成「详情页 → 唤起客户端 → 下载 → 建项」:摘要校验失败时不留半成品目录,成功时新副本**可直接试玩**。
- [ ] 界面明确告知该副本**不能直接重新发布**(不得出现「改完即可发布」类文案),并给出「新建合规工程」的可用路径。
- [ ] 在自建合规工程里改编后发布的作品,详情页显示正确的来源、代际与衍生关系;代际与根由服务端计算,客户端无法伪造或覆盖。
- [ ] 未携带来源声明的发布路径(旧客户端、网页端)不产生血缘,也不因此报错。
- [ ] 账号切换或退出后,迟到的下载与建项响应不得写入任何本地项目或项目来源信息。
- [ ] 移动端不出现需要桌面端才能完成的改造动作,或明确给出桌面端提示。
- [ ] 灰度未命中时改造入口不渲染,写接口返回服务不可用。
- [ ] 移动端不出现需要桌面端才能完成的改编动作,或明确给出桌面端提示。
- [ ] 灰度未命中时改编入口不渲染,写接口返回服务不可用。
## 证据要求
- 自动化:内容入口鉴权与可用性拒绝用例、客户端下载/摘要校验/解压门禁/建项的定向测试、发布链路携带来源的用例、DTO 一致性与编码、文档索引检查。
- 运行时:真实 api-server + 真实对象存储 + 真实客户端跑通「改别人的已公开作品 → 试玩 → 发布 → 溯源与代际正确」,附对比截图或录屏。
- 运行时:真实 api-server + 真实对象存储 + 真实客户端跑通「看别人的已公开作品 → 本地试玩并提取素材 → 在自建工程里改编 → 试玩 → 发布 → 溯源与代际正确」,附对比截图或录屏。
- 文案:核对产品与技术文档、AGC 界面、网页入口三处都不出现「成品包可直接发布 / 一键复刻完整工程」的表述。
- 边界:越权下载、无授权下载、来源已下架、摘要不符、解压失败、账号切换后的迟到响应、旧客户端发布不产生血缘。
@@ -10,9 +10,9 @@
1. **Fork 关系挂在 `game`,不挂在 `version`。** `game` 是稳定作品身份,`version` 是不可变内容快照;血缘是「作品 ↔ 作品」关系。唯一留在版本级的是**被复刻的内容本身**(已存在的成品包与新增的工程源包都属于版本资产),因为内容随版本演进。
2. **现状不存在任何 fork/remix/来源/父作品字段或表。** 旧的「作品改造 / Remix」在网页端已整体退役(`vite.config.ts:16-18,20-59,126-140,170-173` 把退役固化成构建门禁),后端只剩 `#[cfg(any())]` 死码(`module-runtime/src/domain.rs:137`、`api-server/src/state.rs:1317`、`shared-contracts/src/runtime.rs:879-880`)与 CSS 死类名。本功能是**从零建**,没有历史包袱,也不复活 Remix 命名。
3. **必须区分两种 Fork,它们是两层能力而不是一个开关**:
- **成品包 Fork(零新增资产,可立即做)**:每个已发布版本本来就存着构建产物 ZIP(`game_distribution_version.package_object_key`,`:797`),直接拿它建项目就能跑通「下载 → 建项 → 改造 → 发布带溯源」。
- **工程源包 Fork(真·复刻工程)**:成品包是 Vite 构建产物——模板工程 `vite.config.js` 只配了 `build: { outDir: 'dist' }`,**未关压缩也未开 sourcemap**,且平台发行校验明确拒收 `*.map`(`server-rs/crates/module-game-distribution/src/package.rs:171-175`)。所以 AI 在成品包上改核心逻辑不可靠,要让文档里「用户改造完成后可发布」成立,仍需版本级可选资产**工程源包**。
- 两者共用同一套血缘模型;成品包路径同时是工程源包缺失时(网页端发布、作者不愿公开源码)的天然降级路径。
- **成品包 Fork(零新增资产,但它只到「可玩参考」)**:每个已发布版本本来就存着构建产物 ZIP(`game_distribution_version.package_object_key`,`:797`),拿它铺成本地项目可以**试玩**、可以**提取素材**;但**不能重新发布**——包里没有 `package.json` 也没有源码,而 AGC 的导出/发布入口对「已有可玩入口」的项目同样强制 Phaser 4 + Vite 声明(`apps/ai-game-creator-shell/src-tauri/src/project/export.rs:262-265` → `:405-470`,注释与反例测试见 `:407-408`、`:1239-1243`)。详见 §3.5.1。
- **工程源包 Fork(真·复刻工程,也是唯一能直接发布的路径)**:成品包是 Vite 构建产物——模板工程 `vite.config.js` 只配了 `build: { outDir: 'dist' }`,**未关压缩也未开 sourcemap**,且平台发行校验明确拒收 `*.map`(`server-rs/crates/module-game-distribution/src/package.rs:171-175`)。所以 AI 在成品包上改核心逻辑不可靠;要让「改造完成后可发布」成立,必须有版本级可选资产**工程源包**。
- 两者共用同一套血缘模型;成品包路径是工程源包缺失时(网页端发布、作者不愿公开源码)的天然**降级路径,降级到「试玩 + 素材」,不含发布**。
4. **工程源包有现成规范与现成客户端链路可复用**:排除规则见 `docs/【模板规范】AGC模板包组织指南-2026-09-21.md`;下载→校验 SHA-256→解压→建项全链路已存在于 `apps/ai-game-creator-shell/src-tauri/src/template_library.rs`(`create_project_from_installed_template_at` `:816`)。
5. **本期不做**:创作者收益分成(仓库无收益/分成/结算表,`docs/【技术方案】外部产品支付服务接入-2026-10-03.md:200` 明确人工结算)、相似度反洗稿校验、上链。
6. **顺带必修的相关缺口(已在 M1 修复)**:公开 `author.name` 长期落到兜底文案(创建游戏时 `author_name` 写死 `None`,`api-server/src/modules/game_distribution.rs:1001-1003`;公开 payload 兜底「创作者」)。修法:公开快照改为读时联 `user_account`,账号改名/换头像立即跟随,与后台游戏管理页同口径。
@@ -64,6 +64,9 @@
| 收益 / 分成 | **不存在**;`PuzzleAuthorIncentiveClaim` 有枚举无写入方 | `module-runtime/src/domain.rs:1147` |
| 从包建项(客户端) | **存在且完整**:下载→SHA-256 校验→解压(拒绝绝对路径/`..`/盘符/反斜杠/符号链接,条目 ≤4096、单文件 ≤256 MiB)→建项→失败删半成品 | `template_library.rs`、`:815-850`、`:240-342` |
| 工程包排除规则 | **存在**:禁止 `.agent` / `.git` / `.svn` / `node_modules` 段与根 `dist` / `build` / `library` / `temp` / `local` / `.idea` / `.vscode` | `docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`(后台模板上传章节)、`docs/【模板规范】AGC模板包组织指南-2026-09-21.md` |
| 发行包下载通道(按版本取 ZIP) | **不存在**:作者侧只有 create/upload/chunk/complete/reset/submit/get_owner_version/cancel,作者侧 payload 不回对象键或下载地址;对外只有公开发行网关**逐文件**读取,且只服务**当前已公开版本**、扩展名受限 | `api-server/.../game_distribution.rs:3029-3041`、`:395-421`、`:800-863`;`module-game-distribution/src/release.rs:36-64` |
| 导出/发布的工程栈前置 | **强制**:唯一导出入口对「已有可玩入口」的项目同样调用 `ensure_publish_project_stack`,要求 `package.json` 声明 phaser 主版本 4 且声明 vite 依赖或存在 `vite.config.*`(不要求 build 脚本);注释与反例测试均确认无 `package.json` 的静态项目不在发布合同内 | `apps/ai-game-creator-shell/src-tauri/src/project/export.rs:262-265`、`:405-470`、`:407-408`、`:1239-1243` |
| 发行包内容 | **只含运行产物**:`dist` 树(条目改名 `game/...`)+ 根 `assets/` 兜底 + `exports/README.md`;**不含** `package.json` 与源码 | `apps/ai-game-creator-shell/src-tauri/src/project/export.rs:770-804` |
---
@@ -125,25 +128,27 @@ stateDiagram-v2
| --- | --- |
| `/games/mine` 每张作品卡 | 新增「共创授权」三态设置(仅允许提升,终态 `full` 时只读);新增「被改编 N」入口,弹层列出直接子代(标题 / 作者 / 代际 / 状态);提升授权后若当前公开版本没有工程源包,行内提示「上传工程源码以支持源码级改造」(上传在桌面端客户端完成,网页端只做引导) |
| `/games/publish`、AGC 发布面板 | 新增「授权共创」三态单选(默认「禁止共创」,页面提示:开启后可被他人复刻改编,开启后不可撤销);从父作品 Fork 而来时显示只读的「改编自《X》」 |
| AGC 客户端 | ① 详情页「改造这个作品」唤起 AGC(deep link `genarrative://fork?gameId=<id>`);② AGC 首页/项目入口提供「从平台作品开始创作」(输入 gameId 或从平台跳转) |
| AGC 客户端 | ① 详情页「改造这个作品」唤起 AGC(唤起方式**待拍板**,候选见 §7 第 11 条;`genarrative://fork?gameId=<id>` 的 deep link 目前**未注册**,只是候选之一);② AGC 首页/项目入口提供「从平台作品开始创作」(输入 gameId 或从平台跳转) |
**后台**
| 位置 | 内容 |
| --- | --- |
| `#game-management` 游戏管理 | 列表新增「授权」「代际」列;版本历史弹层不变;不做强制改授权(避免平台替作者背授权责任) |
| `#game-distribution` 审核队列 | 允许共创的作品审核通过时,若作者未提供工程源包,标注「仅产物级改造」(不影响发布与审核) |
| `#game-distribution` 审核队列 | 允许共创的作品审核通过时,若作者未提供工程源包,标注「仅成品包可玩参考,不能直接发布」(不影响发布与审核;口径依据 §3.5.1) |
### 2.5 两个层级的改造能力(必须让作者和用户都看懂)
已公开的作品**总是**有成品包,所以「改造这个作品」按钮对所有开放授权的作品都可用;区别只在用户拿到的东西能改到什么程度。
已公开的作品**总是**有成品包,所以「改造这个作品」按钮对所有开放授权的作品都可用;区别不只是「能改到什么程度」,还包括**改完能不能再发布**——这一点在 2026-10-04 的只读侦察里被否证过一次,必须按事实写:
| 情形 | 用户拿到什么 | 用户可见文案 |
| --- | --- | --- |
| 父作品有**工程源包**(AGC 发布且作者选择公开源码) | **源码级复刻**:AGC 下载工程 → 解压为新项目 → 可改源码、可重跑构建、可发布 | 「改造这个作品」 |
| 父作品只有**成品包**(网页端发布,或作者未上传工程源包) | **产物级改造**:AGC 以该发行版本的 ZIP 作为项目内容(静态可玩入口、无构建步骤),可改素材、数值、HUD、样式与局部逻辑 | 「改造这个作品」,并在面板注明「基于已构建成品,改核心逻辑建议作者开放工程」 |
| 情形 | 用户拿到什么 | 能不能再发布 | 用户可见文案 |
| --- | --- | --- | --- |
| 父作品有**工程源包**(AGC 发布且作者选择公开源码) | **源码级复刻**:AGC 下载工程 → 解压为新项目 → 可改源码、可重跑构建、可发布 | 能(前提是源包本身是 Phaser 4 + Vite 工程) | 「改造这个作品」 |
| 父作品只有**成品包**(网页端发布,或作者未上传工程源包) | **可玩参考 + 素材来源**:AGC 把该发行版本的成品包铺成本地副本,可对照试玩、可提取包内素材(受发行网关扩展名白名单限制,见 §3.5.1) | **不能**:成品包里既没有 `package.json` 也没有源码(`export.rs:770-804`),而 AGC 的发布入口对「已有可玩入口」的项目**同样**强制 Phaser 4 + Vite 声明(`export.rs:262-265` → `export.rs:405-470`) | 「试玩并参考改编」,面板必须写明「本作品只提供已构建成品,**无法直接重新发布**;要发布请在自建工程里重做」 |
两条路径在发布时写入**完全相同**的血缘与溯源,差别只在可编辑程度;不设「作者必须开源才能被改造」的前置条件。
两条路径在**用户自建合规工程**里发布时写入**完全相同**的血缘与溯源;不设「作者必须开源才能被改造」的前置条件。
**被否证的旧表述(保留以便对照)**:原方案写的是「成品包路径 = 产物级改造,项目无需构建步骤即可试玩与发布」、「这条形态 AGC 本来就支持」。第一句只对了一半——`validate_project_game_entry`(`verification.rs:49-66`)确实只要求入口是 HTML 文档,所以**试玩**成立;**发布**不成立,因为导出入口的静态入口分支并不豁免工程栈检查。第二句是错的:`export.rs:259-266` 的分支只说明「已有入口时不要求 build 脚本」,不说明不要求依赖声明。详见 §3.5.1 与 §3.5.4。
### 2.6 关键流程
@@ -161,7 +166,7 @@ sequenceDiagram
A->>API: 后续提升授权(POST fork-authorization,仅升)
```
**B. 用户一键改造**
**B. 用户一键改造(目标形态;成品包分支只到「试玩 + 素材」)**
```mermaid
sequenceDiagram
@@ -169,16 +174,18 @@ sequenceDiagram
participant AGC as AGC 客户端
participant API as api-server
U->>U: 详情页点「改造这个作品」
U->>AGC: deep link genarrative://fork?gameId=X
U->>AGC: 唤起客户端(方式待拍板:手工输入 / 取件码 / deep link)
AGC->>API: GET /api/game-distribution/games/X/fork-source (Bearer)
API-->>AGC: {versionId, bundleSha256, bundleBytes, downloadPath}
AGC->>AGC: 下载 → 校验 SHA-256 → 解压(同模板安装门禁)→ 新建项目
AGC->>AGC: manifest 写入 forkedFrom{gameId, versionId, rootGameId, generation}
Note over AGC: 用户改造 → 发布
Note over AGC: 工程源包可改源码/重跑构建/发布;只有成品包则只能试玩与提取素材(§3.5.1)
AGC->>API: POST /games(携带 forkedFromGameId/VersionId)
API->>API: 校验授权/来源版本/计算 generation 与 root → 写 lineage
```
> 说明:本图是**目标形态**。唤起方式尚未拍板(§7 第 11 条),`GET …/fork-source` 是**待实现**接口(§3.5.1),`fork-source` 的响应字段最终以定稿合同为准。
**C. 溯源与命名**
- 溯源卡出现在详情页与 AGC 项目内(项目信息区显示「改编自《X》」)。
@@ -265,7 +272,7 @@ pub(crate) project_bundle_sha256: Option<String>,
- **发布时**:仅当该版本所属作品的 `fork_authorization != forbidden` 才上传,与版本创建在同一次确认里完成。
- **补齐**:作品公开后,作者可以把工程源包补传给它**当前公开版本**,每个版本至多一次,内容摘要写入后不可再改。这是「版本不可变」的唯一例外——理由是工程源包不是发行内容:它不参与试玩、不参与审核、不改包摘要,补传只增加「能否被源码级改造」这一个能力。
- **不做版本回溯**:作者 v1 传了、v2 没传,那么 v2 只能走产物级改造,历史版本不给补。
- **不做版本回溯**:作者 v1 传了、v2 没传,那么 v2 只能走「试玩 + 素材参考」的成品包路径,历史版本不给补。
- **补齐前置**:目标版本必须是该作品**当前公开版本**,且该作品 `fork_authorization` 已不是 `forbidden`。
对象键:`agc/project-snapshots/v1/game-fork/{game_id}/{version_id}.zip`(与发行包同前缀族,便于生命周期统一)。
@@ -323,18 +330,23 @@ pub(crate) project_bundle_sha256: Option<String>,
### 3.5 两条改造路径:成品包(先行)与工程源包(补强)
#### 3.5.1 成品包路径(零新增上传资产)
> **术语更正(2026-10-04)**:本节原来的标题把成品包路径称为「改造」,正文还写了「项目无需构建步骤即可试玩与发布」。按只读侦察的事实,成品包路径的实际能力是**本地试玩 + 素材来源**,**不含重新发布**;下面的 3.5.1 已按事实重写。路线取舍见 §3.5.4。
- **内容来源**:父作品当前公开版本的 `package_object_key`(已存在,无需作者做任何额外动作)。服务端按现有发行网关同一套对象读取与校验复用该 ZIP,不新造存储。
- **下载授权**:与工程源包同一条受鉴权入口(`GET /games/{gameId}/fork-source`),返回的是网关路径而非裸对象键;未登录、无授权、来源不可用时一律拒绝。
- **AGC 建项**:把 ZIP 内容铺进新项目的可玩入口目录(`game/`),项目无需构建步骤即可试玩与发布——这条形态 AGC 本来就支持(`export_local_project_package_for_publish_at` 在已有可玩入口时直接打包,`src-tauri/src/project/export.rs:259-262`)。
- **能力边界**:可改素材、数值、样式、HUD 与局部逻辑;**不可**重建压缩后的核心逻辑。面板必须如实说明这一点,不能让用户以为拿到了源码。
- **价值**:零新增资产即可跑通完整闭环(血缘、溯源、代际、族谱),也是工程源包缺失时的降级路径。
#### 3.5.1 成品包路径(零新增上传资产,但只到「可玩参考」)
#### 3.5.2 工程源包路径(源码级复刻)
- **内容来源**:父作品当前公开版本的 `package_object_key`(已存在,无需作者做任何额外动作)。服务端按现有发行网关同一套对象读取与校验复用该 ZIP,不新造存储。包内容是纯运行产物:`collect_project_export_package_files`(`src-tauri/src/project/export.rs:770-804`)只收 `dist` 树(条目统一改名成 `game/...`)+ 根 `assets/` 兜底 + `exports/README.md`,**根 `package.json` 与源码不进 ZIP**。
- **下载通道(当前不存在,M2a 必须新增)**:平台今天**没有**「下载某个版本发行包」的接口——作者侧路由只有 create/upload/chunk/complete/reset/submit/get_owner_version/cancel,`private_version_payload`(`api-server/src/modules/game_distribution.rs:3029-3041`)也不返回对象键或下载地址;对外只有公开发行网关逐文件读取 `/api/game-distribution/releases/{game_id}/{*asset_path}`(`:395-421`),且**只服务当前已公开版本**(`:800-863`,非公开/下架 404),扩展名限制在白名单内(`module-game-distribution/src/release.rs:36-64`:html/js/mjs/css/json/wasm/svg/png/jpg/webp/gif/avif/ico/mp3/ogg/wav/m4a/mp4/webm/woff/woff2/ttf/otf/txt/xml)。因此 §3.4 规划的受鉴权入口 `GET /games/{gameId}/fork-source`(返回网关路径而非裸对象键)是**待实现项**,不是既有能力;同时要注意服务端读包是整包进内存 + 进程内缓存(`api-server/src/modules/game_distribution.rs:926-958`,缓存上限 4 条 / 256 MiB,`:101-104`),客户端侧 `fetch_limited_bytes`(`apps/ai-game-creator-shell/src-tauri/src/template_library.rs:564-591`)同样整包进内存、上限 512 MiB、无 Range 无续传;分片能力只有**上传侧**(`game_package_upload.rs:96-105`、`runtime.rs:353-363`),下载侧完全没有对应能力。
- **AGC 建项:能试玩,不能发布。**
- 试玩成立:`validate_project_game_entry`(`src-tauri/src/project/verification.rs:49-66`)只要求入口是 HTML 文档、引用可解析(`:68-100`),与 `package.json`、构建脚本无关;把包内文件铺进可玩入口目录即可试玩。
- 发布必然被拦:导出/发布的唯一入口 `export_local_project_package`(`src-tauri/src/commands/desktop.rs:1148-1156`)→ `export_local_project_package_for_publish_at`(`export.rs:259-306`),其中「已有可玩入口」的静态入口分支(`export.rs:262-265`)**仍然无条件调用 `ensure_publish_project_stack(root)`**(实检在 `export.rs:413-459`,调用点在 `export.rs:463-468`):`package.json` 必须声明 phaser 主版本 4(`:440-453`)且声明 vite 依赖或存在 `vite.config.*`(`:398-410`、`:454-458`)。注释直接写明「无 `package.json` 的单文件 HTML 项目不属于首版 Phaser 4 发布合同」(`:407-408`),并有反例测试(`:1239-1243`)。该分支**不要求 build 脚本**——`resolve_publish_build_plan` 只在「无入口」分支调用(`export.rs:266-273`)——所以「能试玩」确实不需要构建,但「能发布」需要依赖声明。
- 补成合规工程也走不通:成品包里没有 `package.json` 与源码,平台又不提供包下载通道,因此「改完再发布」这一步在现役能力下断裂。
- **能力边界**:可对照试玩、可提取包内素材(受上面扩展名白名单限制)、可阅读已压缩的运行产物;**不可**重建核心逻辑、**不可**直接发布。面板必须如实说明这两点。
- **价值**:零新增上传资产即可跑通「授权 → 试玩 → 素材复用 → (在自建工程里)发布 → 血缘与溯源」,是工程源包缺失时的参考路径;它不再是「完整闭环」的兑现方式。
#### 3.5.2 工程源包路径(源码级复刻,现为正解路径)
- **打包(AGC)**:新增 Rust 侧 `project_bundle` 模块,复用模板包门禁:拒绝 `.agent` / `.git` / `.svn` / `node_modules` 段(任意层级)与根 `dist` / `build` / `library` / `temp` / `local` / `.idea` / `.vscode`;条目数 ≤4096;单文件 ≤256 MiB;解压总量 ≤512 MiB;条目排序 + 固定时间戳保证同内容同摘要。
- **上传(AGC)**:仅当作者选择的授权不是 `forbidden` 时上传(默认不上传,省流量且避免无谓的源码外发)。上传失败不影响发布,但要在发布面板明确提示「未上传工程包,你的作品只能被产物级改造」。
- **上传(AGC)**:仅当作者选择的授权不是 `forbidden` 时上传(默认不上传,省流量且避免无谓的源码外发)。上传失败不影响发布,但要在发布面板明确提示「未上传工程包,你的作品只能被他人试玩与参考(不能直接重新发布)」。
- **下载与建项(AGC,复用现役基座)**:走同一条 `GET /games/{gameId}/fork-source` → 校验 `bundleSha256` 与 `bundleBytes` → 解压到 `<app_data>/forks/<gameId>/<versionId>/`(与模板安装同一套路径门禁、同一套私有 DACL 写入)→ `create_project_from_installed_template_at` 建到用户工作区 → `manifest` 写入 `forkedFrom`。
- **优先级**:同一版本同时存在工程源包与成品包时,`fork-source` 优先返回工程源包,并在响应里标明 `source: 'project' | 'package'`,由客户端决定建项形态。
@@ -342,6 +354,22 @@ pub(crate) project_bundle_sha256: Option<String>,
AGC 发布链路(`game_distribution_publish.rs`)读取 `manifest.forkedFrom` 并写入创建 game 的请求体。网页端**不提供**手填来源,声明只能来自真实下载过的内容,避免伪造血缘;网页端发布的作品因此只能作为父作品,不能作为子作品。
#### 3.5.4 第二阶段(Fork 落地)的路线选择(决策材料,待用户拍板)
> 本节是**待拍板材料**,不是定稿合同;定稿前不得据此实现。结论来自 2026-10-04 的只读侦察(材料:`local://m2a-design.md`),它否掉了原方案「成品包铺进项目即可试玩与发布」的假设(事实依据见 §2.5 与 §3.5.1)。
三条候选路线:
| 路线 | 用户拿到什么 | 能不能发布 | 对「一键复刻完整工程」的兑现度 | 工作量 |
| --- | --- | --- | --- | --- |
| **A. 参考式改编**:成品包只当「可玩参考 + 素材来源」,AGC 侧另建合规骨架(真 Phaser 4 + Vite) | 原作副本(对照试玩)+ 新工程骨架 + 从成品包提取的素材(受扩展名白名单限制) | 能(骨架是合规工程) | 低:脚本与配置要重写,对外不能说「复刻工程」 | AGC 侧中;若要把血缘做到平台可查询则跨端大 |
| **B. 只做工程源包**(跳过成品包路线) | 作者随版本上传的可编辑工程包,fork 后即完整可开发工程 | 能(源包本身是 Phaser 4 + Vite 时) | 高(前提是作者真的提供工程包) | 大(需新增工程包下载/授权接口,见 M2b) |
| **C. 成品包 + 自动补工程栈** | 铺产物 + 生成声明 phaser 4/vite 的 `package.json` | 能过客户端校验,但产出的是「dist 实体的伪工程」 | 表面中(能发布)、实质低(不可再构建) | 小–中 |
**推荐**:第二阶段落 **A**(试玩 + 素材 + 血缘),对外口径从「复刻工程」改为「参考改编 / 素材复用」;**B 作为正解排后续**(先把「可编辑工程包」的定义与包内禁项定清楚,再谈下载与授权);**C 不做**,或仅限一次性存量兼容且需产品书面接受「不可再构建」的语义。
A 路线里有一个必须提前知道的互斥点:`create_npm_scaffold` 的触发条件是「没有 manifest **且** 根与 `game/` 都没有 `index.html`、都没有 `package.json`」(`apps/ai-game-creator-shell/src-tauri/src/project/manifest.rs:609-613`)。因此「先铺成品包文件」与「先建空工程」二者互斥(先铺文件则不再生成脚手架;先建空工程则 manifest 已存在),两条都要就得由 fork 流程自己写 `package.json` / `vite.config.*`。本仓已有「先复制模板文件、再调标准初始化」的既有做法可参照(`src-tauri/src/template_library.rs:816-905`)。
### 3.6 前端链路
| 文件 | 改动 |
@@ -444,8 +472,9 @@ AGC 发布链路(`game_distribution_publish.rs`)读取 `manifest.forkedFrom`
| 溯源摘要不泄露被软删除作品的标题与作者名(降级为「原作品已不可用」) | 定向测试 + DTO parity | 待补 |
| 工程包门禁:含 `node_modules` / 符号链接 / 绝对路径 / 超限的包被拒且不产生任何对象 | 客户端 Rust 定向测试 + 服务端校验测试 | 待补 |
| 补齐:提升授权后可对当前公开版本补传工程包一次,补齐后改造升级为源码级;二次补传或换内容重传被拒;历史版本不被补齐 | 定向测试 + 真实栈 | 待补 |
| 一键改造闭环:详情页 → AGC → 下载 → 解压 → 建项 → 改造 → 发布 → 详情页出现溯源 | 真实 AGC + 真实 api-server smoke(含截图/录屏) | 待补 |
| 无工程源包时仍有可用的产物级改造路径,且面板如实说明能力边界;不伪造血缘、不出现空白或死链 | 真实栈 + 浏览器验证 | 待补 |
| 源码路径闭环(工程源包):详情页 → AGC → 下载 → 解压 → 建项 → 改源码 → 重跑构建 → 发布 → 详情页出现溯源 | 真实 AGC + 真实 api-server smoke(含截图/录屏) | 待补 |
| 参考路径(成品包):详情页 → AGC → 本地副本可试玩、素材可提取;**界面明确写明不能直接重新发布**,且不伪造血缘、不出现空白或死链 | 真实栈 + 浏览器验证 | 待补 |
| 交付口径一致:对外文案不出现「成品包可直接发布 / 一键复刻完整工程」这类与 §3.5.1 事实冲突的表述 | 文案评审 + 浏览器验证 | 待补 |
| 公开 DTO 不泄露对象键、不泄露未公开作品信息 | DTO parity + 逐键核对 | 待补 |
| 署名:公开详情/广场展示真实作者名与陶泥号,不再落到「创作者」兜底 | 真实栈 + 浏览器验证 | 待补 |
| 移动端与桌面端布局可用;移动端改造入口给出桌面端提示 | 320px / 1280px 浏览器验证 | 待补 |
@@ -480,8 +509,8 @@ AGC 发布链路(`game_distribution_publish.rs`)读取 `manifest.forkedFrom`
| 里程碑 | 范围 | 交付判据 |
| --- | --- | --- |
| [M1 授权与血缘骨架](./project-memory/plans/【里程碑】游戏共创授权与血缘-2026-10-03.md) | game 追加授权列、新血缘表、创建 game 携带血缘的校验与写入、授权提升接口、公开 DTO 增量、详情页徽章+溯源卡、`/games/mine` 授权设置、后台展示、署名修复 | 可在平台内看到并管理「能否被改编 / 改编自谁 / 第几代」;改造动作本身在 M2a 接线 |
| [M2a 成品包改造闭环](./project-memory/plans/【里程碑】成品包改造闭环-2026-10-03.md) | 复用已存在的成品包做受鉴权 `fork-source`、AGC 下载/建项/改造入口、发布自动声明血缘、发布面板授权选择 | 真实 AGC 上完成「改别人的作品 → 发布 → 溯源正确」,零新增上传资产 |
| [M2b 工程源包与源码级复刻](./project-memory/plans/【里程碑】作品工程源包与一键改造-2026-10-03.md) | version 追加工程包字段、AGC 打包/上传、`fork-source` 优先返回工程包、源码形态建项 | 真实 AGC 上完成「拿到源码 → 改核心逻辑 → 发布 → 溯源正确」 |
| [M2a 参考式改编(只试玩 + 素材 + 血缘,不含重新发布)](./project-memory/plans/【里程碑】成品包改造闭环-2026-10-03.md) | 复用已存在的成品包做受鉴权内容下发、AGC 下载/本地副本/素材提取、血缘写入与溯源展示、发布面板授权选择 | 真实 AGC 上完成「看别人的作品 → 本地试玩并参考 → 在**自建合规工程**里重做 → 发布 → 溯源正确」;**不承诺**成品包可直接重新发布(§3.5.1)。**成立前提**:产品接受对外口径从「复刻工程」改为「参考改编 / 素材复用」(§3.5.4 路线 A) |
| [M2b 工程源包与源码级复刻](./project-memory/plans/【里程碑】作品工程源包与一键改造-2026-10-03.md) | version 追加工程包字段、AGC 打包/上传、`fork-source` 优先返回工程包、源码形态建项、**新增工程包下载/授权接口**(当前不存在,§3.5.1) | 真实 AGC 上完成「拿到源码 → 改核心逻辑 → 发布 → 溯源正确」;这是「一键复刻完整工程」的**唯一正解路径**(§3.5.4 路线 B) |
| [M3 族谱与衍生列表](./project-memory/plans/【里程碑】创作族谱与衍生列表-2026-10-03.md) | `/games/lineage` 树页、`/games/{id}/lineage` 与 `/derived` 接口、`/games/mine` 被改编列表 | 族谱树可浏览、可跳转、父作品下架有降级展示 |
| M4(可选,需产品决策) | 共创主题(平台命名的归组实体)与广场共创 Tab | 仅当采纳「平台命名主题」方案时才做 |
@@ -491,10 +520,17 @@ AGC 发布链路(`game_distribution_publish.rs`)读取 `manifest.forkedFrom`
## 7. 未决问题(需要拍板)
1. **成品包路径默认要做**(零新增上传资产,且是工程源包缺失时的降级路径);需拍板的是**是否追加工程源包(M2b)**:不做,则用户只能产物级改造,AI 改核心逻辑不可靠,需求文档里「一键复刻完整工程」这半句无法兑现。建议:做。
2. **授权默认值**:本文档按需求描述取「默认禁止」;飞书文档评论中包仲航建议改为「默认允许 + 发布前合同勾选」。两者会改变默认曝光面与合规口径,需产品拍板(默认允许对生态更友好,但要处理存量作品的合法性回溯)。
> 第 1、8–12 条来自 2026-10-04 的只读侦察(`local://m2a-design.md`),其中 8–12 条是**第二阶段(M2a/M2b)落地前必须拍板**的五项;未拍板前不得据 §3.5.4 的推荐实现。
1. **成品包路径的事实边界已改写**(原条目「成品包路径默认要做……建议:做」的前提已被否证):成品包路径能试玩、能提供素材,但**不能发布**(§3.5.1)。因此要拍板的不再是「要不要顺带做工程源包」,而是「是否接受对外口径从『一键复刻完整工程』改成『参考改编 / 素材复用』,并把工程源包作为唯一源码级路径」。建议:接受并改口径(§3.5.4 路线 A 先行、B 排后续)。
2. **授权默认值**:本文档按需求描述取「默认禁止」;飞书文档评论中包仲航建议改为「默认允许 + 发布前合同勾选」。两者会改变默认曝光面与合规口径,需产品拍板(默认允许对生态更友好,但要处理存量作品的合法性回溯)。(M1 已按「默认禁止」实现,改动需连带迁移口径。)
3. **是否引入「共创主题」实体**:包仲航建议「平台命名主题 → 作品树」,并明确作品之间不存在曝光挂靠。本文档的 M1–M3 按「作品间独立展示 + 详情页溯源 + 族谱按根归组」实现,不引入新实体;若采纳主题方案,需要额外的运营命名流程与表。
4. **收益分成**:需求文档要求「每一代均享有权益(署名 / 流量回馈 / 版权分成)」。署名本期做,流量回馈与分成本期不做(无账本、无算力成本口径,`docs/【技术方案】外部产品支付服务接入-2026-10-03.md:200` 明确人工结算)。
5. **相似度反洗稿校验**:需求文档要求「低改动度复刻判定」。本期不做;本方案只保证来源声明真实、不可伪造。若要做,只能基于工程源包做结构化比对,属于独立议题。
6. **「永久链上溯源」表述**:实现为平台持久化的不可变父子链,不上链。需确认该措辞是否可以调整。
7. **`play_count` 死字段**:它被前端展示为「N 次游玩」但永不自增。本方案不依赖它;是否顺带修复(新增游玩上报)需单独立项。
8. **对外表述**:第二阶段是否接受「只能试玩 + 素材复用,不能一键复刻工程」?建议接受并同步改文案(AGC 侧注释 `export.rs:407-408` 已把无 `package.json` 的静态项目排除在发布合同外)。
9. **血缘承载位**:血缘只作为客户端本地注释(项目内独立文件,如 `.agent/fork.json`),还是要平台可查询(服务端新增字段)或随工程包传输(manifest 升 v2,旧客户端读到即失败)?建议先本地,等工程源包(M2b)落地再上平台字段。
10. **是否立刻做工程源包(M2b)**:它需要**新增工程包下载/授权接口**(当前不存在)并定义包内禁项(服务端已拒绝 `node_modules`/`.git`/`.env*`/`*.map`/`*.pem`/`*.key` 与嵌套 zip,`module-game-distribution/src/package.rs:135-142`、`:170-176`),成本最大。建议先做 A 验证需求。
11. **从平台唤起 AGC 的方式**:AGC 内手工输入 gameId / 作品链接,还是平台发取件码在客户端兑换,还是注册 deep link(`tauri.conf.json` 未注册 scheme、无 `tauri-plugin-deep-link`、无单实例插件,需动安装器与升级链路)?建议手工输入起步。
12. **是否允许「伪工程」(C 路线,补声明 phaser 4/vite 的 `package.json` 让成品包过检)用于存量作品兼容**:产出不可再构建,建议不允许;若确要做,需产品书面接受「不可再构建」的语义并限定为一次性兼容。