refactor/整理现有的string-typed资源类型 #388
Reference in New Issue
Block a user
Delete Branch "feat/agc-organize-assetkind"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
close #368
1. 资源引用按钮曾用
selectedResource.category作为subtype的回退。canvas category 不是资源 kind,该分支只会解析成unknown;已改为直接解析selectedResource.subtype。提交97e2b2690。2.
GameCreationAppAssetKind的反序列化只实现visit_str,带 JSON 转义的 kind 字符串会直接报错。已补visit_string转发并新增回归用例。提交3caefd671、55d0c99e2。3.
binding.rs的GameCreationAppAssetKind导入只在测试里用到。已加#[cfg(test)],正式构建不再报未使用导入。提交d07ea186f。4. UI 原型桥接与 UI 工作流的 kind 校验仍在比较
ui-prototype,而 manifest 写入侧已用正式枚举。已统一为GameCreationAppAssetKind::UiDesign/ui-design,路径常量保持原样。提交a19319d81、c2da8e184。5. 图集切片读取侧校验与测试筛选仍比较旧字面量,导致平台图集切片登记无法短路、测试断言失真。已改为
GameCreationAppAssetKind::Icon叠加assets/art-spritesheet-slices/路径判定。提交8b007c637。6. 资源桥接、Codex 资源引用与 direct tool bridge 的测试 fixture 仍用字符串构造
kind。已改为Character、Icon、CharacterAnimation、Spec、UiDesign等枚举成员。提交30edfee00、f0a62c630、21dbbb4c3。7.
ts-rs直连版本号未走 workspace 依赖。已在server-rsworkspace 统一声明并从shared-contracts引用。提交040f64648。8.
sourceSubtype/source_subtype等字符串字段接收枚举时类型不匹配。已显式to_string(),不改字段语义。提交46dfa2cff、3907a8bf7。9. 上传资源 kind 测试仍断言旧的
document/asset,且把枚举传给字符串集合。已改为font/unknown与kind.as_str()。提交39e33f7a5。10. 资源引用入口的源码正则仍匹配旧的
subtype || category形状。已更新为匹配parseGameCreationAppAssetKind(selectedResource.subtype, ...),对应用例已单跑通过。提交512f669f5。11. review 第 9 条(绑定测试应断言单引号)经核实是误报:
exports_ui_editor_types会先用 ts-rs 把绑定就地重写成双引号原始格式再读取,单引号断言会让该测试失败。已回退,恢复双引号断言并验证通过。提交2a75a2d2c。12. review 关于
ts(export_to)会被当成目录、生成到GameCreationAppAssetKind.ts/GameCreationAppAssetKind.ts的推断经核实不成立:实际落点就是apps/ai-game-creator-shell/src/contracts/generated/GameCreationAppAssetKind.ts,与提交文件一致。13. 图集切片读取侧与写入侧词汇不一致。现状:写入侧切片的 manifest kind 已是正式成员,读取侧却仍在比较平台/工作流标识(
art-spritesheet-slice),判定恒不成立,切片美术列表会返回空、切片链路失效。修复:切片登记与读取统一按GameCreationAppAssetKind::Icon,切片与普通图标靠assets/art-spritesheet-slices/路径前缀区分。提交a61b0cce8。14. 陶泥儿美术资产身份比对错用了字符串。现状:
direct_taonier_art_asset_identity拿"art-spritesheet"/"game-background"去比枚举字段,除已是 canonical 的icon-spec外全部恒不匹配,整包校验与恢复校验会失败。修复:函数签名改成expected_kind: GameCreationAppAssetKind,调用点与 fixture 统一传IconSpec/Scene/IconSpritesheet;同一提交里直连游戏工程产物的game-entry/game-script/game-style/game-package/game-lockfile/game-build-config/game-source也收敛为正式成员Code。提交a61b0cce8。15. 非 canonical manifest kind 字面量审计。现状:真正的问题不是「字面量多」,而是写入边界没有把平台请求词汇转成正式成员,读取侧还拿平台词汇去比枚举字段。修复:
assets.rs画板导出推断直接返回枚举并删掉兜底归一;commands.rs登记边界按上下文解析 kind;canvas_generation.rs新增platform_art_asset_manifest_kind,把ui-prototype/art-spritesheet/game-background/game-art等平台词汇显式映射为正式成员;manifest.rs的必填视觉资产校验此前拿ui-prototype/art-spritesheet去比枚举字段(真实 bug,恒不匹配),已改为IconSpec/UiDesign/IconSpritesheet;project_gates.rs、autonomous_policy.rs、recovery_scan.rs、direct_tool_bridge.rs、ui_editor/*与测试 fixture 同步收敛。原文举的tool_policy_snapshot.rs不成立:该文件只列工具名,没有 kind 列表。剩余字面量都在平台请求字段与 JSON 载荷里,不再进 manifest。提交a61b0cce8。16.
GameCreationAppAssetManifestEntry.kind由String改成枚举是公开 Rust 类型的破坏性变更。现状:分支里已经按类型收紧落地,没有String版本;本次不写历史兼容代码、不做数据迁移、不写兼容测试,写入侧只接受枚举成员,未知输入仍按读边界收口Unknown。修复/说明:把这次破坏性变更写进实施计划的「已落地 / 明确不修改」两节;版本策略与对外变更说明由你决定,我没有自行宣布任何兼容或迁移策略。提交7eee89ded。17.
source_subtype与资源 kind 字段语义混用(原文:会把art-image、svg、text、project-version、agent-result-derivative传进 kind)。现状:非正式成员会被收口成Unknown,项目版本与 Agent 回执在冒充 manifest kind。修复:新增ResourceEditSourceKind(Manifest(GameCreationAppAssetKind)/ProjectVersion/AgentResultText),快照字段改收该枚举;前端sourceSubtype只传正式枚举成员,非 manifest 来源传null;栅格源归一化只认正式成员(删掉task-artifact特判,未知按Image收口);账本、HTTP 载荷与提示词边界用as_str(),写回 manifest 用manifest_kind()。提交f185d21f5、f9bc2d917。18. 你说的「没看到这个文件」——它是
apps/ai-game-creator-shell/src/contracts/assetKind.ts(资源 kind 的前端契约入口,不在view/目录里,平时不会翻到)。现状:GAME_CREATION_APP_ASSET_KINDS是手写字面量列表,与生成的 union 各写一份,且已包含生成侧才有的font/unknown,两边会再次分叉。修复:改成GAME_CREATION_APP_ASSET_KIND_MEMBERS: Record<GameCreationAppAssetKind, true>常量表,集合与新增的isGameCreationAppAssetKind类型守卫都由它派生;生成 union 增删成员时 TS 会直接编译报错,列表没法再悄悄漂移。提交f9bc2d917。19.
BindingChange/BindingDTO不是凭空出现的名字:它们是apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/binding.rs里真实的内部结构(LLM 组件绑定响应体)。原文的问题是那个手写测试exports_ui_editor_types:它用 ts-rs 把这两个结构导出到已退役的src/features/ui-editor/types/,并顺手把src/contracts/generated/GameCreationAppAssetKind.ts就地重写成生成器原始格式——测试自己重写文件,既发现不了漂移又污染工作树。修复:删掉该测试与那套额外的类型导出(退役类型不再导出,前端消费方已删),生成只走cargo test export_bindings;枚举自带#[ts(export, export_to = .../src/contracts/generated/)];生成的src/contracts/generated/加入.prettierignore与 eslintignorePatterns,让 ts-rs 原始格式保持幂等、跑完不污染工作树。提交b96cd4b7c。20. 顺带修掉
apps/ai-game-creator-shell/tests/assetKindCanonicalMapping.test.ts两条在改动前就已经恒失败的用例:解析 Rust canonical 目录的正则只认裸字符串字面量,认不出GAME_CREATION_APP_UI_DESIGN_DOC_ASSET_KIND这类常量引用,于是「两侧 canonical kind 目录一致」永远少一项;现在解析前先把pub const *_ASSET_KIND: &str = "..."展开成字面量,并删掉测试体里游离的'font',表达式。提交f9bc2d917。本分支把 manifest 的
kind从String收紧成 Rust 枚举GameCreationAppAssetKind(server-rs/crates/shared-contracts/src/game_creation_app/asset_kind.rs),TS 侧经 ts-rs 生成同名 union;
from_str_lossy是精确匹配、无 trim/无别名表,不认识的值一律落Unknown,回写时序列化成"unknown"。技术方案
docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md(2026-09-15 节)写明**"不为旧本地 manifest 提供 migration、alias 兼容或静默转换"。所以「旧 manifest 里的
"UI"/"ui-prototype"/"art-spritesheet"读不到」这一族现象是既定口径**,我按"不是缺陷"处理;但其中会引起运行中门禁失败或静默丢数据的,我单独标出来请你决定。另外 review 里的示例补丁不一定可用,第 6 条我实际核对后推翻了它给的修法。
一、原 review 清单(保持原文件顺序,编号即条目号)
1.
ResourceReferenceInput.tsx:1316-1317缩略图里残留kind === 'ui'—— 已修复(faab31812)kind === 'ui' || mediaType === GAME_CREATION_APP_UI_DESIGN_DOC_MEDIA_TYPE,靠前者把 UI 设计 JSON 当文本预览。unknown,上层又经parseGameCreationAppAssetKind收口,'ui'恒不命中,是死分支。kind === 'ui'与只为它取值的kind变量;UI 设计文档仍由mediaType === application/json命中,行为不变。5.
uiDesignResourceBridge.ts:93-96裸字符串'ui-design'—— 已修复(9dccf5318)asset.kind === 'ui-design'。packages/shared里已有唯一定义,再手写一份裸字符串会与 Rust 枚举静默漂移。GAME_CREATION_APP_UI_DESIGN_ASSET_KIND(该常量在f21638161中新增,供 TS 侧统一引用)。6.
asset_kind.rs:88-89from_str_lossy不 trim / 不 lowercase —— 不修(真问题,但给的修法不对)match value { "image" => Self::Image, ... _ => Self::Unknown },纯字面量、大小写敏感、不 trim;parse_with_context落Unknown时打 warn。canonical_game_creation_app_asset_kind是trim().to_lowercase()加别名表;只加 lowercase 时"UI"会归一成"ui",而"ui"仍不是 canonical 值(canonical 是ui-design),照样落Unknown。要修"UI",需要的是别名表,不是 lowercase。Unknown当"不在本客户端词汇表"的显式信号;(b) 只做 trim+lowercase 纯归一化(风险最小,但修不了"UI");(c) 让from_str_lossy复用canonical_game_creation_app_asset_kind,等于恢复旧兼容并推翻既定口径。选哪个都要同步改技术方案。7.
asset_kind.rs:53-54Font与 canonical 列表分叉 —— 不修(真问题,需口径决策)Font(as_str() == "font");但 TS 的GAME_CREATION_APP_CANONICAL_ASSET_KINDS(17 项)不含font,canonical_game_creation_app_asset_kind("font")仍按别名映射到document;而 AGC 上传路径assets.rs::uploaded_asset_kind对字体文件(font/*、ttf/otf/woff/woff2)真的会写出GameCreationAppAssetKind::Font。font,读侧 canonical 口径却是document,TS canonical 集合里也没有font。(分类结果目前仍正确,因为font → document;坏的是"落盘值集合"与"canonical 集合"不一致。)font提升为 canonical(补 TS 列表、分类表、assetKindCanonicalMapping.test.ts交叉钉住),要么删掉Font成员让上传继续写document。8.
src/contracts/assetKind.ts:55非字符串入参被String(raw)字符串化 —— 已修复(d333f783f)String(raw)再记rawKind,于是null/undefined/ 对象会打成"null"/"undefined"/"[object Object]",与"真的未知字符串"无法区分。unknown并单独记rawType日志,补了assetKind.test.ts用例钉住新日志形状。9.
src-tauri/Cargo.toml:17[build-dependencies]打开ts-bindings—— 已修复(a5ee45aa4)[build-dependencies]的shared-contracts带features = ["ts-bindings"],而build.rs只用GameCreationAppAgentGroup与new_game_creation_app_seed_tasks,用不到 ts-rs。[dependencies]保留;已核验cargo check --locked通过,且cargo test -p shared-contracts --features ts-bindings仍能重新生成同一份绑定(无 diff)。10.
direct_tool_bridge.rs:1247-1248+direct_tools_mcp.rs示例 —— 部分修复(示例已修d454d3fa4)asset.list把kind入参经parse_with_context收口成枚举,再kind.is_none_or(|kind| asset.kind == kind)过滤;未知值落Unknown,于是"过滤出 0 条"而不是报错。art-spritesheet-slice在收口后恒不命中,已改成 canonical 的icon-spritesheet);"未知值应报错"部分属行为变更,留给你。kind收口处对Unknown直接Err("asset.list.kind 不是已知 kind:…"),同步 MCP schema 描述,并补一条工具侧用例。注意Unknown本身是合法枚举成员,要区分"调用方传错值"与"真想查 unknown 资产"。11.
direct_runtime/mod.rs:2741-2745切片路径与兜底的旧字面量 —— 已修复(41930b858)direct_registered_taonier_runtime_image_paths用asset.kind != "icon-spec"、asset.kind == "art-spritesheet-slice"这类旧字面量比较。as_str()只产出 canonical 名,旧字面量恒不命中,"切片必须走严格 manifest/receipt 校验、不得被弱兜底重新收录"的排除条件失效。补充事实:这在改枚举前(kind: String)是真的有效的,不是本来就死的代码。IconSpec、Icon),保留切片路径前缀条件。12.
view/project-development/index.tsx:7473原型图判断仍是'ui-prototype'—— 已修复(f21638161)selectedResourceOpensUiEditor与openResourceUiEditor用subtype === 'ui-prototype'判原型图,而同文件ensureUiDesignResourceForPrototype已要求'ui-design'。ui-design,旧判断恒 false,原型图的「UI 编辑器」按钮不再出现。GAME_CREATION_APP_UI_DESIGN_ASSET_KIND;resourceProjectionModel.ts::isPendingUiPrototype同步;fixture 改 canonical;补了回归用例「opens the UI editor bridge from a canonical ui-design prototype image」(去掉修正即转红,已实测),appSurface全绿。14.
commands.rs:2203-2206新建 UI 设计资源编号撞车 —— 已修复(d23c80837)create_ui_design_resource用"已登记的 UI 设计文档数 + 1"取名/编号(ui/UI 设计 N.json、resourceId: ui:N),而统计只算 canonicalui-design-doc。"UI"存量时编号从 1 重开,与已有文件撞名,命令报「UI 设计资源路径已存在」。ui_editor::resource_bridge::next_ui_design_path(提升为pub(crate))做无冲突扫描,resourceId与文件名取同一编号;补「已存在ui/UI 设计 1.json时落到编号 2」用例。"UI"纳入统计(旧存量仍不参与编号,只是不会再撞车)。15.
assets.rs:922-927画板同步的assetKind未 canonical 化 —— 不修(真问题,属口径)GameCreationAppAssetKind::parse_with_context(value, "canvas.asset_sync");而同类平台入口commands.rs::imported_platform_asset_kind是先canonical_game_creation_app_asset_kind(kind)再from_str_lossy(有测试钉着Some("UI") == UiDesign)。ui-prototype/game-background/UI/art-spritesheet)经imported_platform_asset_kind会收口成 canonical,经这条路会落Unknown,分类随后掉到unclassified(改枚举前这里能派生出ui-interaction/scene)。assets.rs这条路改为走imported_platform_asset_kind,或抽一个platform_asset_kind_from_external公共函数。18.
direct_runtime/mod.rs:2743-2745兄弟筛选仍用旧字面量 —— 已修复(41930b858,与第 11 条同一提交)direct_registered_taonier_runtime_image_paths的切片排除、direct_game_sources_referenced_taonier_assets的matches!(kind.as_str(), "art-spritesheet" | "art-spritesheet-slice" | "game-background")兜底都还是旧字面量。IconSpritesheet | Icon | Scene,icon-spec比较与切片排除一并换成枚举成员;agent::direct_runtime模块 95 条用例通过。二、附:本轮额外发现(不在原 review.txt 内)
19.
project-summary/projectAssetSummaries.ts::isProjectVisualAsset残留旧 kind 字面量 —— 已修复(56c4faa8e)kind === 'sprite' || kind === 'ui' || kind === 'background'参与「项目视觉资产」判定(/art摘要用它筛资产)。GameCreationAppAssetManifestEntry.kind已是枚举、from_str_lossy精确匹配,落盘值只能是 canonical 成员或unknown,TS 拿不到sprite/ui/background。mediaType分支覆盖);它们本来就是死代码,删除不改变行为。20.
direct_runtime/mod.rs切片路径前缀判断冗余(review 在第 11 条顺带提到)—— 不修(可读性,非缺陷)direct_registered_taonier_slice_paths先用asset.local_path == slice.path做身份匹配,再叠一个starts_with("assets/art-spritesheet-slices/")。validated_art_slices产出的路径带该前缀,所以第二次判断恒真)。本轮 review 结论:当前不建议合并,发现以下问题:
P1:存量 legacy kind 图片快速编辑会被服务端拒绝
apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs:1406-1418将旧 manifest kind(如ui、art-spritesheet、game-background)解析为Unknown,随后在:1936以assetKind: "unknown"发给服务端。服务端server-rs/crates/api-server/src/editor_project.rs:4123-4148的静态图片白名单不包含unknown,因此存量图片执行快速编辑会返回 400。需要明确:不要把客户端收口后的
unknown当作 API 的来源类型发送,或同步补齐服务端/API 的兼容口径,并补充存量 legacy kind 的回归测试。P1:旧 UI 设计 JSON 资产失去编辑能力
存量 UI 设计资产仍可能是
UI/ui,但apps/ai-game-creator-shell/src-tauri/src/ui_editor/persistence.rs:314-323现在要求kind == "ui-design-doc"。因此卡片入口可能仍显示,load/save/generate 进入后却会报“目标资源不是 UI 设计 JSON 资产”;桥接流程还可能新建一份重复文档,旧文档被孤立。需要保留已有合法 UI State 的加载/保存能力,或提供明确的一次性迁移,并覆盖旧项目回归场景。
P2:任意 manifest 写入会不可逆改写旧 kind
GameCreationAppAssetKind的未知值解析为Unknown,整体写 manifest 时再序列化为"unknown"(server-rs/crates/shared-contracts/src/game_creation_app/asset_kind.rs:110-118、apps/ai-game-creator-shell/src-tauri/src/project/manifest.rs:2178)。修改标签、任务或其他 manifest 字段后,原始 legacy kind 会丢失,后续也无法再做可靠迁移。建议写入侧保留原始值,或在首次读取时保存可恢复的迁移清单。
本地验证:shared-contracts 28/28、TS 契约 22/22、encoding、rustfmt、diff check 通过;PR CI run 2472 全部成功。AGC typecheck 在本地受缺失依赖(
@tauri-apps/plugin-updater、three、react-window)影响,未能完成。都是关于旧数据的风险,可以接受, 而且最好在周一上线前就统一
审查基线
• 固定点:origin/master = b137f1759(Merge PR #417),分支 feat/agc-organize-assetkind,merge-base a2e6f205d。
• 范围:git diff origin/master...HEAD — 84 个文件,+3205 / −1267,72 个提交;HEAD = 03d7bca9a(把 master 合并回来的 merge)。
• 本次审查是静态审查(未执行测试/构建),结论基于 diff 与仓库文档、决策日志的交叉核对。
• 规格来源(两族,均为本分支新增文档):docs/project-memory/plans/ 下 7 份 ——
【技术方案】AGC资源kind枚举化Rust权威边界-2026-09-15.md、【里程碑】AGC资源kind枚举化共享契约与TS绑定-2026-09-15.md、【里程碑】AGC资源kind枚举化词汇审
计与绑定架构-2026-09-15.md、【实施计划】AGC资源kind纵深化Rust绑定与内部收口-2026-09-15.md、【待办】AGC资源kind枚举化扫描清单-2026-09-15.md、【实施计
划】UI设计文档引用代码上下文-2026-09-14.md、【里程碑】UI设计文档引用代码上下文-2026-09-14.md;另有
docs/project-memory/shared-memory/decision-log.md、pitfalls.md。
• 规范来源:AGENTS.md、UI_CODING_STANDARD.md、docs【协作规范】*、docs/project-memory/shared-memory/team-conventions.md,外加内置代码坏味基线。
规范轴(Standards)
文档口径不一致(硬性文案冲突)
• apps/ai-game-creator-shell/src-tauri/src/assets.rs:480:函数文档仍写「判不出内容类型时返回中性的 asset」,而同一提交把函数内注释(第 287–288 行
hunk)改成了
unknown,代码(:537)也返回 Unknown。同一提交内同一事实两处写法不同,且文档引用了已退役的 asset 值(AGENTS.md「四不写」第 3条同类问题)。
• assets.rs:470–478 整段新注释(「不用 uploaded 这类来源词」「更不能把 ui 当默认类型」「别名表」、「读时自愈」)是在解释已删除的别名表与 uploaded/ui
旧值,属墓碑式说明;这些信息已在 decision-log.md 顶部条目与 pitfalls.md 记录,注释里的重复副本会随代码漂移。
生成物与工程策略(判断项)
• packages/shared/src/contracts/generated/GameCreationAppAssetKind.ts 新入库(生成文件,含「Do not edit」),但本次未新增 .gitattributes,且
.prettierignore 新增 generated 让它静默跳过格式检查;仓库 .gitignore:320 已有 .generated. 规则,命名相近易混。生成能力用 #[cfg(feature =
"ts-bindings")]
门禁(server-rs/crates/shared-contracts/Cargo.toml、asset_kind.rs:51–61)是对的,但「生成物如何入库/如何校验」缺少成文约定(.codex/skills/genarrative
-spacetimedb 那类 skill 未覆盖)。
• 生成门禁可发现性:导出由 ts-rs 的 export_bindings_* 测试触发(asset_kind.rs:52–61 的 export/export_to),仓库与文档均未记录具体命令(实际为 cargo
test export_bindings),漂移风险缺少说明(轻微)。
重复知识与类型退化(判断项)
• apps/ai-game-creator-shell/src/features/project-summary/projectAssetSummaries.ts:101–127:isProjectAudioAsset / isProjectVisualAsset 仍手写 kind
字面量(audio/sound-effect/background-music/image/icon/character-animation),且先 asset.kind.toLowerCase() 使比较退化为普通 string —— 新 union
的编译期穷举保护在这里失效(写错字面量不会报错)。同一套「图片/音频族」判据在 Rust 侧 ui_editor/resource_editor.rs(matches! 8 项)另有一份实现,构成
Duplicated Code / Primitive Obsession。
写入口径自相矛盾(判断项)
• asset_kind.rs:48–49 明确「正常资源写入路径不应主动选择 Unknown」,但 assets.rs:537(内容判型兜底)与 :552(空白入参回退 Image、非空认不出回退
Unknown)正是写入路径主动落 Unknown。口径需要二选一:要么放宽 Unknown 的语义说明,要么让写入侧在无法判型时改用明确的中性值。
迁移收尾(既有问题,非本次引入)
• apps/ai-game-creator-shell/src/view/project-development/index.tsx:392 仍比较 asset.kind ===
'art-spritesheet'(已退役值,比较恒假死分支)。本次未改动该文件,但属同一词汇收敛范围,建议顺带清理。
规格轴(Spec)
• 【里程碑】AGC资源kind枚举化词汇审计与绑定架构-2026-09-15.md:26「不实现旧 manifest migration、alias 表或 fallback
清理」,:40「(该表属读边界,本次未新增也未扩展,留给独立词汇收敛切片)」;而本次直接删除了
GAME_CREATION_APP_LEGACY_ASSET_KINDS、canonicalGameCreationAppAssetKind() 及 Rust 同名实现。
• 代价已在 decision-log.md:12
记录(「已知代价,不补救……不得把别名表加回解析路径」),但上级里程碑/实施计划未同步:【实施计划】AGC资源kind纵深化Rust绑定与内部收口-2026-09-15.md
仍是 Status: planned、37 个验收框全未勾选,【里程碑】词汇审计 验收项仍写「未扩展/留给独立切片」。按 AGENTS.md「工程修改要同步更新对应
docs/」,这是文档同步缺口。
• 行为后果需评审确认:服务端保留了兼容白名单(server-rs/crates/api-server/src/editor_project.rs:4139–4140、:20766 「实测 art-spritesheet / ui 曾整片
400」,本次仅改注释语义),而 shell 读侧不再归一 —— 存量/平台登记的 art-spritesheet、ui-prototype、font 资产从「图标素材 / UI 交互 /
文档」退化为「待归类」(GameCreationAppAssetKind.ts 与 packages/shared/src/contracts/gameCreationApp.ts:519–598 的 unknown 收口)。
• 变更:asset.kind === 'ui-prototype' → === GAME_CREATION_APP_UI_DESIGN_ASSET_KIND(ui-design,resourceProjectionModel.ts:411–413)。
• 影响面在 :421–433:这会把标签改成「(待视觉验收)」、来源标成「画板 · 候选界面图」。旧实现只命中原型导入资产,新实现命中所有 ui-design
资产(CANVAS_ASSET_KINDS 含 UiDesign,画板生成 UI 设计也在此列),只要 design-foundation 未完成就会被标注。里程碑只要求「manifest kind 统一为
ui-design」,没有要求放宽该运行门禁,需要确认是否有意为之。
• 与 1 同源:这些旧值语义上确实不再是 canonical,但删除后此类存量资产在项目摘要里既不算美术也不算音频,直接从汇总消失(此前经别名归到
image/ui-design)。里程碑没有交代存量摘要在「不迁移」下的预期表现(建议在文档中显式声明为可接受代价)。
• 【实施计划】...纵深化Rust绑定与内部收口-2026-09-15.md 第 34–37 项(别名表清理、font 移除 default/category、UNKNOWN_RESOURCE_PROJECTION_KIND、TS
kind 映射收口)已在代码中落实且测试覆盖(decision-log.md、pitfalls.md 有记录、pitfalls.md 有 4 条真机回归清单),但计划/里程碑的验收框与 Status
全部停留在未开始状态,验收证据无法从文档侧核对。
• apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/wire.rs 新增的 render_ui_design_code_context 与里程碑一致:仅认 ui-design-doc
一并需要处理的工作区状态
• 未提交更改:package-lock.json(仓库以 pnpm 为主,pnpm-lock.yaml 同时存在,疑似误改)与 .env(AGENTS.md 绝对约束禁止提交;请确认不该被 git
add)。未跟踪的 .output.txt 是本会话临时产物,已删除。
汇总
• 规范轴:7 条(其中 1 条硬性文案冲突、其余为判断项),最重为 assets.rs:480 与同提交 unknown 口径不一致 + 大段墓碑注释。
• 规格轴:5 条,最重为「删除别名表」与里程碑明文边界冲突、且里程碑文档未同步(代价虽已记入 decision-log.md,但存量资产在 shell
侧退化为「待归类」的影响面需要显式确认)。