删除美术包完成时多余的参考图身份比较
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m46s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m30s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m22s
Project CI / Backend tests (pull_request) Successful in 8m22s
Project CI / Frontend tests (pull_request) Successful in 3m29s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m56s
Project CI / Repository checks (pull_request) Successful in 6m19s
Project CI / Native shell tests (pull_request) Successful in 8m25s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m46s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m30s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m22s
Project CI / Backend tests (pull_request) Successful in 8m22s
Project CI / Frontend tests (pull_request) Successful in 3m29s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m56s
Project CI / Repository checks (pull_request) Successful in 6m19s
Project CI / Native shell tests (pull_request) Successful in 8m25s
移除参考图原始资源 ID 与请求参考 ID 的直接相等要求 保留本轮图集资源、对象和任务身份核对 调整现有完成与恢复用例覆盖规范图重新登记,删除过期拒绝断言 同步美术包规范、验收证据和共享排障说明
This commit is contained in:
@@ -775,11 +775,8 @@ fn direct_taonier_spritesheet_matches_retained_stage_result_at(
|
||||
DIRECT_CODEX_SPRITESHEET_ASSET_PATH,
|
||||
GameCreationAppAssetKind::IconSpritesheet,
|
||||
)?;
|
||||
let retained = retained_platform_art_generation_runtime_spritesheet_identity_at(
|
||||
root,
|
||||
&context,
|
||||
&art_spec.resource_id,
|
||||
)?;
|
||||
let retained =
|
||||
retained_platform_art_generation_runtime_spritesheet_identity_at(root, &context)?;
|
||||
Ok(retained
|
||||
== Some((
|
||||
spritesheet.resource_id,
|
||||
@@ -6350,6 +6347,7 @@ mod tests {
|
||||
init_local_game_project_at(root.path(), "direct-workflow-cleanup", "整包账本清理")
|
||||
.expect("init project");
|
||||
register_direct_taonier_art_package_fixture(root.path());
|
||||
register_direct_taonier_spec_upload_binding_fixture(root.path());
|
||||
let mut workflow = prepare_direct_taonier_regeneration_workflow_at(
|
||||
root.path(),
|
||||
"第一套美术",
|
||||
@@ -6683,6 +6681,7 @@ mod tests {
|
||||
Vec::new(),
|
||||
&new_spec,
|
||||
);
|
||||
register_direct_taonier_spec_upload_binding_fixture(root.path());
|
||||
rollback
|
||||
.record_replacement_at(root.path(), DIRECT_CODEX_ART_SPEC_ASSET_PATH)
|
||||
.expect("record spec replacement");
|
||||
@@ -6729,20 +6728,6 @@ mod tests {
|
||||
DirectTaonierRegenerationWorkflowState::InProgress
|
||||
);
|
||||
|
||||
write_direct_taonier_spritesheet_stage_result_fixture(
|
||||
root.path(),
|
||||
"foreign-spec",
|
||||
"strict-crash-spritesheet",
|
||||
"strict-crash-spritesheet-object",
|
||||
"strict-crash-spritesheet-task",
|
||||
);
|
||||
let foreign_reference_error = recover_direct_taonier_regeneration_workflow_at(root.path())
|
||||
.expect_err("a retained result for another art spec cannot complete this workflow");
|
||||
assert!(
|
||||
foreign_reference_error.contains("retained spritesheet"),
|
||||
"{foreign_reference_error}"
|
||||
);
|
||||
|
||||
write_direct_taonier_spritesheet_stage_result_fixture(
|
||||
root.path(),
|
||||
"strict-crash-spec",
|
||||
@@ -7958,6 +7943,59 @@ mod tests {
|
||||
.expect("register TaoNier art asset");
|
||||
}
|
||||
|
||||
// 模拟规范图重新上传登记:派生请求使用上传后的 ID,规范图保留不同的原始生成 ID。
|
||||
fn register_direct_taonier_spec_upload_binding_fixture(root: &Path) {
|
||||
let (project_id, art_spec, uploaded_id) = mutate_manifest_at(root, |manifest| {
|
||||
let art_spec = manifest
|
||||
.assets
|
||||
.iter_mut()
|
||||
.find(|asset| asset.local_path == DIRECT_CODEX_ART_SPEC_ASSET_PATH)
|
||||
.expect("art spec");
|
||||
let uploaded_id = art_spec.source.resource_id.clone().expect("spec resource");
|
||||
art_spec.source.resource_id = Some(format!("generated-{uploaded_id}"));
|
||||
Ok((manifest.project_id.clone(), art_spec.clone(), uploaded_id))
|
||||
})
|
||||
.expect("separate generated and uploaded spec identities");
|
||||
let access = ExternalEditorBindingAccess::for_developer(
|
||||
"http://127.0.0.1:38201",
|
||||
"spec-upload-fixture-key",
|
||||
)
|
||||
.expect("fixture access");
|
||||
let principal = external_editor_binding_principal(&access).expect("fixture principal");
|
||||
let project_binding = new_external_editor_project_binding(
|
||||
&project_id,
|
||||
&principal,
|
||||
"taonier-project",
|
||||
"taonier-assets",
|
||||
unix_timestamp(),
|
||||
)
|
||||
.expect("project binding");
|
||||
write_external_editor_project_binding_at(root, &project_binding)
|
||||
.expect("write project binding");
|
||||
let bytes = std::fs::read(root.join(&art_spec.local_path)).expect("spec bytes");
|
||||
let source = new_external_editor_source_identity(
|
||||
&art_spec.id,
|
||||
&format!("{:x}", Sha256::digest(&bytes)),
|
||||
&art_spec.media_type,
|
||||
&art_spec.kind,
|
||||
)
|
||||
.expect("local spec identity");
|
||||
let binding = new_external_editor_resource_binding(
|
||||
&project_id,
|
||||
&principal,
|
||||
"taonier-project",
|
||||
&source,
|
||||
Some(&uploaded_id),
|
||||
"uploaded/art-spec.png",
|
||||
"uploaded-spec-object",
|
||||
Some(1),
|
||||
Some(1),
|
||||
unix_timestamp(),
|
||||
)
|
||||
.expect("spec upload binding");
|
||||
write_external_editor_resource_binding_at(root, &binding).expect("write upload binding");
|
||||
}
|
||||
|
||||
fn register_direct_taonier_art_package_fixture(root: &Path) {
|
||||
register_direct_taonier_art_base_fixture(root);
|
||||
register_direct_taonier_art_asset_fixture(
|
||||
|
||||
@@ -3056,7 +3056,6 @@ pub(in crate::agent) fn retained_platform_art_generation_runtime_state_matches_d
|
||||
pub(in crate::agent) fn retained_platform_art_generation_runtime_spritesheet_identity_at(
|
||||
root: &Path,
|
||||
runtime_context: &PlatformArtGenerationRuntimeContext,
|
||||
expected_reference_resource_id: &str,
|
||||
) -> Result<Option<(String, String, String)>, String> {
|
||||
if !retained_platform_art_generation_runtime_state_matches_direct_stage_at(
|
||||
root,
|
||||
@@ -3068,10 +3067,6 @@ pub(in crate::agent) fn retained_platform_art_generation_runtime_spritesheet_ide
|
||||
let Some(state) = read_platform_art_generation_runtime_state(root, runtime_context)? else {
|
||||
return Ok(None);
|
||||
};
|
||||
let snapshot = platform_art_generation_runtime_request_snapshot(&state)?;
|
||||
if snapshot.reference_resource_ids != [expected_reference_resource_id] {
|
||||
return Ok(None);
|
||||
}
|
||||
let Some(generated) = platform_art_generation_runtime_retained_result(&state) else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# AGC 图集实际产物与语义识别实施计划
|
||||
|
||||
- Version: 2
|
||||
- Version: 3
|
||||
- Status: Implemented, Awaiting Acceptance
|
||||
- Date: 2026-10-05
|
||||
- Parent Spec: [里程碑](./【里程碑】AGC图集实际产物与语义识别-2026-10-05.md)
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
## 2026-10-06 验收缺口修正
|
||||
|
||||
- 用户已确认本轮只修复第二次调用的续生成与完成判据。范围为 Direct 美术包编排、结果构造、对应 Rust 测试和文档;第三次显式重生成的身份比较问题单独处理。
|
||||
- 第二次调用的续生成与完成判据已修复。范围为 Direct 美术包编排、结果构造、对应 Rust 测试和文档。
|
||||
- 先删除已有基础图时返回两图的分支;已有图集阶段账本优先进入原恢复逻辑,没有账本才查询可恢复资源,查询错误直接返回。
|
||||
- 美术包结果构造返回 Result,固定返回三张通过现有校验的主图;保持零切片告警和原有错误传递,补齐失败明确基础图保留状态。
|
||||
- 新增五项回归,仅覆盖只生成缺失图集、prepared/accepted/已保留结果恢复、身份冲突或账本损坏、查询或生成失败,以及两图包不能返回完成;验证实际 POST 数量、冻结请求与基础图文件/登记不变。零片/多片和图片校验边界复用已有覆盖。
|
||||
@@ -41,3 +41,11 @@
|
||||
- 同一测试可执行文件的 `canvas_generation_tests`、`direct_tool_bridge`、`mcp` 分组:118 / 44 / 53 项通过。
|
||||
- `cargo check --locked --offline --bin genarrative-ai-game-creator-shell` 通过;现有编译告警未在本轮扩大处理。
|
||||
- 修改文件的 rustfmt、编码、文档索引与 diff 检查通过。HTTP 夹具只访问本机回环端口;未调用真实 Provider,也未修改用户项目现场。
|
||||
|
||||
## 删除重生成末尾多余的参考图检查
|
||||
|
||||
- 用户已评审并授权删除请求参考 ID 与规范图原始资源 ID 的直接相等要求;保留图集完成结果的资源、对象、任务身份核对。
|
||||
- 删除生成账本辅助函数的该参数和比较分支,收口唯一调用方;不引入替代检查或持久化迁移。
|
||||
- 删除专门构造不同参考 ID 并要求失败的过期测试步骤;让已有正常完成、崩溃恢复测试使用重新登记的规范图绑定,覆盖本次实际故障,不增加低价值测试。
|
||||
- 在约 30 分钟内完成局部修改、定向验证与边界复核;运行 Direct runtime 与 canvas generation 回归、Rust check、格式、编码、文档索引和 diff 检查。不调用付费 Provider、不修改用户项目现场;回滚仅涉及本次局部代码和说明。
|
||||
- 验证完成:Direct runtime 106 项、canvas generation 118 项通过,包含改用上传绑定的原完成重放与中断恢复用例;无新增测试用例。Rust check、修改文件 rustfmt、编码、文档索引与 diff 检查通过;未调用真实 Provider,未改写用户项目。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# AGC 图集实际产物与语义识别
|
||||
|
||||
- Version: 2
|
||||
- Version: 3
|
||||
- Status: Implemented, Awaiting Acceptance
|
||||
- Date: 2026-10-05
|
||||
- Parent Spec: [AGC 实施计划](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#2026-08-23-direct-codex-美术包显式重生成与切片投影)
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
必须移除客户端数量参数及按顺序赋义,按实际产物返回完整身份和可查看图片。风险项为动态集合事务、旧活动账本恢复与零切片告警;可选的自动语义分类、补切工作流不实施。服务端 API 与 OpenAPI 不变。
|
||||
|
||||
2026-10-06 用户复核发现复用两张基础图时跳过缺失图集、并将不完整包返回 completed;用户已评审补齐流程与完成判据方案并指示修复提交。本次为同一里程碑验收缺口修正,不处理显式重生成的参考资源 ID 比较错误,不改输入长度校验。
|
||||
2026-10-06 用户复核发现复用两张基础图时跳过缺失图集、并将不完整包返回 completed;续生成与完成判据已修复。随后用户明确要求删除第三次显式重生成末尾错误的参考资源 ID 相等检查,保留任务完成结果核对。本次继续修正同一里程碑验收缺口,不改输入长度校验,不增加参考图恢复工作流。
|
||||
|
||||
## 验收
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
6. 定向测试、Rust 检查、提示词与 skill 包、文档索引、编码及 diff 检查通过;真实 Provider 未验证部分明确记录。
|
||||
7. 已有规范图和背景图但缺图集时,仅补齐图集;已有请求优先恢复原身份,无请求才只读查找并按需生成。查询失败、身份冲突或账本损坏不能触发新的生成。
|
||||
8. 整包只有三张主图有效才返回 completed;图集失败保留已有基础图并返回明确错误,零切片和实际多切片仍按原合同交付。恢复用例证明无新增付费请求,基础图的文件和登记保持不变。
|
||||
9. 规范图重新登记导致请求参考 ID 与原始资源 ID 不同时,整包正常完成和中断恢复均可收口;仍核对本轮图集完成结果,不改变账本格式或触发重新生成。
|
||||
|
||||
## 验收证据
|
||||
|
||||
@@ -36,6 +37,7 @@
|
||||
| 6 工程检查 | 生成组 118、Direct 运行时 93、工具桥 44、MCP 32、账本 6、提示词 24,共 317 项 Rust 测试通过;cargo check、rustfmt、skill 包、文档索引、变更文件编码及 diff 检查通过 |
|
||||
| 7 补齐与恢复(2026-10-06) | 五项新增回归覆盖只生成缺失图集、三种请求状态恢复、查询/生成失败、身份冲突/账本损坏和完成判据;断言只提交所需图集请求,已受理或已有结果不新增生成 POST,基础图文件与登记不变 |
|
||||
| 8 完成与保留(2026-10-06) | 两图包结果构造返回错误;图集失败返回原原因及基础图保留状态;已有零片/多片、图片校验与重生成测试继续通过。此次 Direct 106、生成 118、工具桥 44、MCP 相关 53 项通过,Rust check、格式、编码、文档索引和 diff 检查通过 |
|
||||
| 9 删除参考图 ID 重复比较(2026-10-06) | 原完成重放及严格提交中断恢复用例改用不同原始/上传资源 ID 的规范图绑定,两条路径均完成;删除旧的参考 ID 不同即失败断言。Direct 106、生成 118 项通过,cargo check、格式、编码、文档索引和 diff 检查通过;没有新增测试用例或调用真实 Provider |
|
||||
|
||||
使用本地 HTTP 夹具验证生产入口,没有调用真实付费 Provider,也没有客户端视觉试玩;这些测试不证明素材语义正确。用户安装 PyYAML 6.0.3 后,使用 `python3` 重跑通用 skill `quick_validate.py`,随包 `taonier-art-assets` 校验通过(`Skill is valid!`);仓库 skill 包完整性检查和提示词/随包 skill 回归也已通过。原无参数全仓编码命令受沙箱子进程限制,按真实变更文件列表重跑通过。
|
||||
|
||||
|
||||
@@ -6549,6 +6549,7 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
|
||||
- 新切片按源资源摘要隔离、以中性序号保存;普通清单记录实际总图路径,美术包回执按实际集合验证。工具返回全部身份与路径标注预览,Agent 看图识别后使用或处理;零片仍交付有效总图与告警。
|
||||
- 动态集合必须同时进入事务 journal、重生成快照、完整性检查和工具投影。旧数量请求需先定位原动作槽并使用原请求体、幂等键和 operation,候选不唯一则对账;不能删掉指纹字段后直接发起新付费请求。完成结果要保留 sliceMode/gridX/gridY,否则重放会丢失服务端回显。
|
||||
- 美术包仅有规范图和背景图时,`reuse-or-create` 必须继续补齐图集,不能把两图包返回为 completed。补齐优先恢复现有阶段请求;无请求才只读查找并按需生成,查询失败、身份冲突或账本损坏不能当作资源不存在而重发。补齐失败保留有效基础图,三张主图齐全且可验证后才交付;零切片告警不等于缺失总图。
|
||||
- 规范图的原始生成资源 ID 与当前账号重新登记后的参考 ID 可以不同。整包完成和中断恢复只按阶段完成结果核对图集资源、对象、任务身份,不能额外要求请求参考 ID 等于规范图原始 ID;这会在素材已经保存后误报身份未绑定。规范图来源关系沿用现有绑定校验。
|
||||
|
||||
## 2026-10-05 在线游玩「一直黑屏」:加载面缺失 + 发行网关不压不发 ETag
|
||||
|
||||
|
||||
@@ -1604,6 +1604,7 @@ game-project/
|
||||
- 美术包和普通图集按实际返回的 0–256 张切片保存、登记与返回。有效透明总图没有独立切片时仍完成并返回切片告警;Agent 必须看图确认实体、状态、用途及缺失内容,再决定使用、进一步本地处理或补充生成。已有授权、付费幂等与资产登记规则继续适用,不能虚构切片、坐标或 Canvas 身份。
|
||||
- 美术包 `reuse-or-create` 复用有效规范图和背景图,继续补齐缺失图集。补齐时若图集阶段有持久化请求,优先恢复原请求、原幂等键和操作身份,不以远端资源查找绕过账本;没有请求时才尝试只读恢复已有图集,确认没有可恢复产物后才发起图集生成。查询失败、账本损坏或身份冲突返回错误并保留现场,不把失败解释为不存在而新建请求,也不重生成已有效的前两张图。完整本地包仍按已有规则直接复用。
|
||||
- 美术包成功结果统一要求规范图、背景图和总图通过已有文件、来源与登记校验,并返回这三张主图及实际可验证切片;缺失任一主图时返回工具错误,不返回 `completed`。有效总图没有独立切片仍为完成并附切片告警。补齐图集失败时保留已有规范图、背景图和可恢复请求,明确告知图集未完成及真实原因;游戏工程本身允许复用已有基础素材的验收规则不随之收紧。
|
||||
- 整包重生成完成与中断恢复按阶段完成结果核对图集的资源、对象和任务身份,不再要求请求参考 ID 等于规范图最初的资源 ID;规范图在当前账号重新登记后可具有不同 ID。既有来源绑定、请求恢复和本轮替换记录校验继续适用,不增加新的参考图对账流程。
|
||||
- 新切片使用源图集身份隔离的目录与中性序号,不再生成按 player 等用途命名的别名。普通图集的清单记录实际总图路径并保存在自己的目录;美术包公共清单与私有回执只证明来源、完整性和实际产物集合,不表达语义分类。历史四用途路径仅白名单兼容读取与恢复,文件名不能证明用途。
|
||||
- 本地事务按固定合同文件与本次实际切片集合冻结快照、提交及恢复,保留摘要、真实 alpha、可见像素、唯一身份、项目归属、资源预算和 CAS 校验。重生成的旧快照包含实际旧切片;历史固定集合事务仍可恢复,不重写旧账本或请求体。普通调用升级前携带数量的活动请求必须在新 POST 前被定位并继续使用原身份;多个可能候选时失败关闭,不能任选或重复付费。
|
||||
- 图集完成结果账本保留响应的 `sliceMode/gridX/gridY`,以支持同身份重放。历史账本已丢失切分声明且返回零切片时,声明无法用于证明切片方式;保留有效总图并明确告警,不因此重发生成。存在实际切片时仍要求切分声明一致。
|
||||
|
||||
Reference in New Issue
Block a user