明确多选素材批量追加标签的行为合同

限定追加语义、冻结对象、原子保存与类型保留边界

记录已评审里程碑及前后端并行实现计划
This commit is contained in:
2026-09-17 21:12:42 +08:00
parent 0a85c4f87e
commit da44d66dc8
3 changed files with 75 additions and 0 deletions
@@ -0,0 +1,30 @@
# 【实施计划】多选素材批量标签
| 字段 | 值 |
| --- | --- |
| Milestone | docs/project-memory/plans/【里程碑】多选素材批量标签-2026-09-17.md |
| Status | ready |
| Owner | 主 Agent 集成;deepseek-flash 实现和独立 review |
## 修改边界
- 原生:`project/manifest` 标签批量追加函数和 DTO、`commands.rs` 权限门面、`main.rs` 注册、分类测试。沿用项目写锁、manifest mutation、审计和 revision,不新建状态系统。
- 前端:扩展现有 `ResourceClassificationPanel` 为单/批量模式,复用已有字段与 pill;`ResourceCanvasPanelView` 增加可选批量标签动作;工作台冻结选择并用完整返回条目更新。前端不得逐素材循环写回。
- 并行采用不重叠文件集:原生 agent 只写 Rust,前端 agent 只写 TS/TSX/CSS/前端测试;主 Agent 负责文档与集成,禁止跨区提交别人文件。
## 顺序与检查点
规范经独立 deepseek-flash 评审通过;批量输入仅追加草稿,面板动作行直接增加入口,返回顺序、去重上限、no-op revision 和未知字段拒绝已在主规范明确。
1. 规范独立评审,确定命令与错误语义。
2. 前后端并行实现,均在明确工作区局部修改、自审和定向验证。
3. 集成后独立 review,再按有效发现返修;不因测试方便而扩产品范围。
4. 本地中文提交、报告已验证和待真机事项;远程操作留待用户后续确认。
## 验证
`npm test -- <相关测试>`、AGC 类型检查、目标文件 ESLint、原生 classification 相关测试、`npm run check:encoding``npm run check:doc-index``git diff --check`。依赖复用时使用本工作树忽略目录的隔离配置,避免修改主目录依赖。
## 风险与回滚
批量写不能掩盖部分失败;类型字段不能借标签保存被读时自愈值覆盖。单素材编辑与多素材追加保留明确分支,不重构其它菜单动作;本地独立提交可回退新需求,保留主线合并及既有画布工作。
@@ -0,0 +1,33 @@
# 【里程碑】多选素材批量标签
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | approved |
| Date | 2026-09-17 |
| Parent Spec | docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md |
## 目标与范围
多选已登记素材后一次追加标签,保留每项原有标签和类型。复用主线菜单与现有标签面板,画布和资源面板均可进入,原生一次校验与保存。
## 非目标
不处理动画失败、资源面板卡死与未完成编辑恢复;不做聊天引用扩展、批量类型修改、既有标签批量删除或 AI 自动分类。不推送、不触发或监视 CI、不写飞书。
## 前置
主线菜单 PR #410 已合入;保留本分支前六项画布功能。主规范及本里程碑通过独立评审后进入实现。
## 验收
- [ ] 两个入口均按完整冻结选择集编辑,不只修改首项。
- [ ] 原有标签、正式分类和无关素材不变。
- [ ] 权限/身份/CAS/任意项上限失败时无部分写入;成功一次 revision。
- [ ] 空操作、重复标签和重复 ID 不重复写入;最大 200 项有界。
- [ ] 保存锁定、失败草稿保留、切项目迟到响应正确处理。
- [ ] 单素材标签、菜单角标和画布布局回归通过。
## 证据
前端组件与宿主整合测试、Rust 原生定向测试、AGC 类型检查、ESLint、编码/文档索引/diff 检查;真实客户端验证单独报告。
@@ -1,5 +1,17 @@
# AI 游戏创作智能体 App 实施计划
## 多选素材批量标签
- 画布与资源面板共用选中集合。选择至少两项同项目已登记素材后,从已有“编辑标签”入口或资源面板的“批量标签”动作打开同一标签编辑器的批量模式;入口遵循既有“常用操作 + 更多”收纳,不新增平行资源管理页。
- 批量模式只将用户填写的标签追加到整组选中素材。输入按既有中英文逗号、顿号、换行拆分,trim、去空及去重;每份素材原有标签、正式分类、类型、路径、来源、版本关系均保留。批量删除/替换既有标签、批量改素材类型及 AI 自动分类不在本次范围。
- 操作对象在打开面板时冻结为去重后的素材 ID 列表,不随后续选择变化扩散;项目切换关闭面板并忽略迟到响应。混合选择含虚拟版本、未登记附件或已删除资源时,不允许只对其中一部分静默保存,入口禁用并给出原因。
- 批量范围为当前入口展示的完整选中集合:资源面板保留跨筛选的选择时,也必须显示实际目标数量;不得仅修改第一项或仅修改当前可见项。每批最多 200 个不同素材,超过上限要求缩小选择。
- 原生新增局部命令 `add_local_project_resource_tags`,参数 `input: { projectPath, expectedProjectId, expectedProjectRevision, assetIds, tags }`;仅消费当前 manifest 素材 ID。响应 `{ assets, committedProjectRevision }` 返回整组选中素材最新条目。沿用 `asset.register` 权限、项目身份、写锁及 revision CAS;不新建 manifest schema、数据库字段或外部 API。
- 原生按锁内最新 manifest 为每项合并标签,沿用现有单标签长度与标签总量限制,先校验全部目标及合并后上限,再一次写 manifest;非法 ID、标签、项目身份或版本冲突不写入任何一项。重复标签重试不重复追加;整批无变化时不推进 revision、不追加修改审计。已写 manifest 后的审计或 revision 异常必须明确返回“已写入”状态信息,沿用既有单资源写入错误语义,不能谎称回滚。
- 保存期间禁用重复提交及关闭;失败保留待追加标签,CAS 冲突需明确报错而非自动覆盖。成功用原生返回条目刷新宿主 manifest 与筛选统计,不循环调用单素材保存、不按旧闭包覆盖最新其他素材。
- 单素材标签编辑仍保持既有增删标签行为;菜单信息/类型入口、批量移动、文档与引擎资源预览不得回退。验收覆盖不同原始标签与分类、资源面板/画布多选入口、重复标签、超限及混合选择、批次失败零部分写、一次 revision、项目切换迟到回包和单素材回归。
- 批量模式的标签输入仅显示待追加草稿,不把各素材已有标签并集作为提交值。资源面板入口放入现有动作行,画布入口沿用选中工具栏的收纳。响应条目按去重后请求 ID 的首次出现顺序返回,无变化时返回当前 revisionDTO 使用 camelCase 并拒绝未知字段,批次上限按去重后数量计算。
## 资源画布生成、展示与布局合同
- 生成工具点击后先在当前栏目创建临时占位卡,并以卡片为锚点展示独立生成浮层;占位不登记为正式素材、不进入 Agent 可引用资源集。上传仍沿用文件选择,不创建虚假生成任务。关闭编辑浮层不应丢失正在执行的任务;切换项目不得将旧项目结果或草稿写入新项目。