证据矩阵按 2026-09-29 的两次修复更新
Project CI / AI game creator shell Rust crates (push) Successful in 1m26s
Project CI / AI game creator shell Rust smoke (push) Successful in 1m59s
Project CI / AI game creator shell Rust lane 2/2 (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
Project CI / AI game creator shell Rust crates (push) Successful in 1m26s
Project CI / AI game creator shell Rust smoke (push) Successful in 1m59s
Project CI / AI game creator shell Rust lane 2/2 (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
- 第 3 条:包体上限改为单一来源 shared_contracts 常量,AGC 客户端读包阶段按平台上限预检,本地 512 MiB 导出上限只是防呆线 - 第 5 条:免费生成简介/分类补上客户端侧合同(上下文有界 6,000 字符、素材只带文件名脱敏、失败本地兜底不阻断发布)与用例证据 - 保证 D6 的矩阵与当前代码/证据一致,未取证项分类不变
This commit is contained in:
@@ -42,7 +42,7 @@
|
||||
| --- | --- | --- |
|
||||
| 1. AGC 取 `dist/` 归一化为根 `index.html`;网页 ZIP 同样要求根 `index.html`;不上传整个项目或源码快照 | 网页 ZIP 侧已取证(`check:game-distribution-web-publish-e2e` 真实选包提交);AGC `dist` 归一化有客户端实现与单元测试,但**没有**真实 AGC 一次提交的运行证据 | 部分取证 |
|
||||
| 2. 运行依赖全部在包内,相对地址,不允许前导 `/assets`、外链与本地文件 URL;客户端给可操作错误、服务端独立校验、运行时 CSP 兜底 | 服务端校验有领域测试;运行时兜底由沙箱 E2E 的 CSP 拦截取证(外站 fetch/websocket/worker 都失败);客户端对前导 `/assets` 与绝对 URL 的可操作错误未单独取证 | 部分取证 |
|
||||
| 3. 额度与拒绝集:包 100 MiB→现行 200 MiB、展开 250/500 MiB、单文件 64 MiB、10 000 文件、100:1 压缩比;拒绝加密 ZIP、路径冲突、绝对路径、`..`、符号链接、设备文件、嵌套压缩与 `.agent`/VCS/`node_modules`/凭据/源码映射 | `check:game-distribution-package-limits-e2e` 11 PASS(196 MiB 成功档耗时 36.9s/确认 9.6s、声明超限 413、文件数 422 `TooManyFiles`、单文件 `FileTooLarge`、展开量 `ExpandedPackageTooLarge`、压缩比 `CompressionRatioTooHigh`);`module-game-distribution` 16 passed 覆盖缺入口/越界/重复与大小写冲突/符号链接(含变异验证);加密条目与嵌套 `.zip` 有实现(`EncryptedFileNotAllowed` / `NestedArchiveNotAllowed`)但没有专门用例,**设备文件**没有专门拒绝实现(只区分常规文件与符号链接) | 已取证(两处子项见缺口) |
|
||||
| 3. 额度与拒绝集:包 100 MiB→现行 200 MiB、展开 250/500 MiB、单文件 64 MiB、10 000 文件、100:1 压缩比;拒绝加密 ZIP、路径冲突、绝对路径、`..`、符号链接、设备文件、嵌套压缩与 `.agent`/VCS/`node_modules`/凭据/源码映射 | `check:game-distribution-package-limits-e2e` 11 PASS(196 MiB 成功档耗时 36.9s/确认 9.6s、声明超限 413、文件数 422 `TooManyFiles`、单文件 `FileTooLarge`、展开量 `ExpandedPackageTooLarge`、压缩比 `CompressionRatioTooHigh`);`module-game-distribution` 16 passed 覆盖缺入口/越界/重复与大小写冲突/符号链接(含变异验证);加密条目与嵌套 `.zip` 有实现(`EncryptedFileNotAllowed` / `NestedArchiveNotAllowed`)但没有专门用例,**设备文件**没有专门拒绝实现(只区分常规文件与符号链接)。**2026-09-29 补**:包体上限改为单一来源 `shared_contracts::game_distribution::GAME_DISTRIBUTION_MAX_PACKAGE_BYTES`(AGC 客户端发布前检查读它,服务端领域常量由 api-server 的 `publish_package_limit_matches_the_shared_contract` 锁一致);客户端本地导出上限 512 MiB 仍只是防呆线,不再被当成发布额度 | 已取证(两处子项见缺口) |
|
||||
| 4. 声明 SHA-256 与字节数,服务端重算并建展开清单;摘要不符/缺文件/入口损坏必须失败 | `check-game-distribution-upload-safety` 24 PASS:结构合法但摘要不符 → 409 `PACKAGE_MISMATCH` → `upload_failed` → reset → 重传成功;领域侧 `accepts_root_entry_and_returns_file_manifest` | 已取证 |
|
||||
| 5. 资料冻结与额度(标题 2–40 字、简介 ≤120、详介 ≤2000、1 分类、≤5 标签 ≤20 字、必需封面、≤6 截图、操作方式 ≤240、分类白名单);AGC 免手打 ZIP;发布灰度键 `game-distribution:publish` 与前端 `gameDistributionPublishEnabled`;续发复用冻结资料;公开投影只暴露对象键 | 资料校验与冻结由 `check-game-distribution-media-e2e`(真实素材直传 → 创建 → 送审 → 回读 frozenMetadata)与 DTO parity 覆盖;灰度键与前端下发在阶段 A/B/C 核对里取证(含 `skipAuth` 缺陷修复);AGC 免手打 ZIP 与面板免技术摘要未取证 | 部分取证 |
|
||||
| 6. `supportedDevices` 至少含 desktop/mobile 之一;`inputModes` ∈ {keyboard,mouse,touch};声明移动端必须含 touch;`orientation` ∈ {landscape,portrait,responsive} | 服务端校验实现 + 领域测试;`check-game-distribution-media-e2e` 的创建资料走真实接口被接受/拒绝 | 已取证 |
|
||||
@@ -50,6 +50,11 @@
|
||||
| 8. 发行网关路径/内容类型白名单/未知扩展名 404/`nosniff`/CORP/CORS/HTML CSP/Cookie 403/进程内有界缓存 | `check-game-distribution-media-e2e`、`check-game-distribution-sandbox-e2e`(22 PASS,真实 Chromium)、本轮 `check:game-distribution-ops-rollback-e2e` 都断言响应头;带 Cookie 403 在沙箱脚本里取证 | 已取证 |
|
||||
| 9. 发行入口由服务端按 gameId 派生同源路径 `/games/{gameId}/`,不接受管理员填写或部署侧配置;派生失败即失败,客户端按当前 origin 解析 | 阶段 B 核对:审核通过后 `currentVersion.entryUrl=/games/<gameId>/`;`check-game-distribution-web-e2e` 里 iframe src 就是同源 `/games/<gameId>/`;三份 nginx 模板的映射由本轮脚本断言 | 已取证 |
|
||||
|
||||
本节补充(2026-09-29,两次修复后复核):
|
||||
|
||||
- **第 3 条的落地口径变了**:包体上限现在单一来源 `shared_contracts::game_distribution::GAME_DISTRIBUTION_MAX_PACKAGE_BYTES`(200 MiB);AGC 客户端在读包阶段就按它预检并给可操作错误,服务端领域常量由 api-server 的 `publish_package_limit_matches_the_shared_contract` 锁成一致。客户端那个 512 MiB 的 `MAX_PROJECT_EXPORT_PACKAGE_BYTES` 只是本地导出防呆线,**不再被当作发布额度**。
|
||||
- **第 5 条的「免费生成简介/分类」补上了客户端侧合同**:上下文有界(6,000 字符)且脱敏(素材只带文件名,绝对路径不外发),失败保留本地兜底不阻断发布;证据是 `gameDistributionPublishPanel.test.tsx` 的 13 条(含新增脱敏用例与变异验证)。GUI 打开面板与真实 Provider 生成仍未取证,所以第 5 条仍是**部分取证**。
|
||||
|
||||
## 4. 身份、状态、审核与更新
|
||||
|
||||
| 条款 | 证据 | 结论 |
|
||||
|
||||
Reference in New Issue
Block a user