docs(ai): 记录无需求ID拆解分组
This commit is contained in:
@@ -23,9 +23,10 @@
|
||||
- 不带引用的草案不允许写入
|
||||
|
||||
3. **AI 输出必须有"对账报告"**
|
||||
- 拆解任务前,先输出三段对账:
|
||||
- 拆解任务前,先输出结构化对账:
|
||||
- ✅ 完美对应(需求 ↔ 原型注释 ↔ 任务)
|
||||
- ⚠️ 仅需求未见原型 / 仅原型未见需求
|
||||
- ⚠️ 需求未见原型
|
||||
- 无需求ID分组(原型有明确功能,但没有匹配到关联需求)
|
||||
- ❓ 注释含糊无法转化
|
||||
- 对账报告先呈现给用户,用户审核后才执行写入
|
||||
|
||||
@@ -49,7 +50,7 @@
|
||||
|
||||
### Agent 1:Prototype Decompose Agent(原型拆解)
|
||||
|
||||
**目的**:把"产品方案原型 + 关联需求"拆解成开发任务草案 + 测试用例草案。
|
||||
**目的**:把"产品方案原型 + 关联需求"拆解成开发任务草案 + 测试用例草案。关联需求是正式范围锚点;原型中明确可拆但没有匹配到关联需求的功能,也可以拆成无需求ID分组草案。
|
||||
|
||||
**输入**:
|
||||
- 当前版本「产品方案」类型 + status=completed 的 VersionPlan,取其 `resultUrl` 作为**原型链接**(约定:产品方案的成果即原型)
|
||||
@@ -63,7 +64,7 @@
|
||||
- 当前版本至少关联 1 条需求
|
||||
|
||||
**输出**:
|
||||
- 对账报告(结构化文本,含"完美对应/单边/含糊"三段)
|
||||
- 对账报告(结构化文本,含"完美对应/需求未见原型/无需求ID分组/含糊")
|
||||
- DevTask 草案数组(每条带 `aiDraft: true` + `references[]` + `aiEstimateHours`,可选 `recommendedAssigneeName` / `recommendedAssigneeReason`)
|
||||
- TestCase 草案数组(每条带 `aiDraft: true` + `references[]` + `aiEstimateHours`,可选 `recommendedAssigneeName` / `recommendedAssigneeReason`)
|
||||
- `target = dev_tasks` 时 `testCaseDrafts` 必须为空数组;`target = test_cases` 时 `devTaskDrafts` 必须为空数组
|
||||
@@ -73,7 +74,8 @@
|
||||
- 编号未出现时,再按需求标题和需求概述(`title` / `description`)做语义匹配。
|
||||
- 有 QY 编号时,`prototype_note` 引用只能使用真实存在的 QY 编号。
|
||||
- 没有 QY 编号但原型文本已命中需求编号或需求概述时,不应丢弃;可只引用 `requirement`,并在 `matched.noteIds` 返回空数组。
|
||||
- 只有既匹配不到需求编号,也匹配不到需求概述语义的原型批注,才进入 `noteOnly` 或 `ambiguous`。
|
||||
- 既匹配不到需求编号,也匹配不到需求概述语义,但能形成明确功能名称和任务范围的原型批注,进入 `prototypeOnly`,对应草案带 `requirementName` 且不带 `requirement` 引用。
|
||||
- 只有无法形成稳定任务/用例的含糊批注才进入 `ambiguous`。
|
||||
|
||||
**测试用例拆解粒度**:
|
||||
- TestCase 要按功能点、UI 交互、表单校验、接口、数据一致性、权限、异常、边界、状态流转、兼容性和回归点拆细。
|
||||
@@ -86,6 +88,9 @@
|
||||
- 打开采纳弹窗前,前端先过滤当前版本已采纳过的重复 DevTask/TestCase 草案
|
||||
- 写入字段中 `aiDraft: true`、`aiDraftAt: ISO时间戳`
|
||||
- 写入 `aiEstimateHours`,不写入执行人预估 `estimateHours`
|
||||
- DevTask / TestCase 必须写入 `versionId` 作为执行归属;`requirementId` 可选
|
||||
- 无正式需求 ID 的草案写入 `requirementName` 作为分组展示名,列表显示为 `无需求ID · {requirementName}`
|
||||
- 无需求ID分组不创建 Requirement,不写入需求池,不加入版本关联需求列表
|
||||
- DevTask 草案不写预计开始/截止时间,负责人后续排期时再填写
|
||||
- 只有用户在采纳弹窗勾选“采纳推荐负责人”时,才把已校验的 `recommendedAssigneeName` 写入 `assigneeId`
|
||||
|
||||
@@ -242,15 +247,27 @@ interface DecomposeOutput {
|
||||
report: {
|
||||
matched: Array<{ reqId: string; noteIds: string[]; taskCount: number }>;
|
||||
reqOnly: string[]; // 需求 ID 列表
|
||||
noteOnly: string[]; // 原型注释 ID 列表
|
||||
prototypeOnly: Array<{ requirementName: string; noteIds: string[]; taskCount: number }>;
|
||||
ambiguous: Array<{ noteId: string; reason: string }>;
|
||||
};
|
||||
devTaskDrafts: Array<{ title: string; description?: string; categoryCode: string; priority: Priority; aiEstimateHours: number; recommendedAssigneeName?: string; recommendedAssigneeReason?: string; references: Reference[] }>;
|
||||
testCaseDrafts: Array<{ title: string; description: string; categoryCode: string; priority: Priority; aiEstimateHours: number; recommendedAssigneeName?: string; recommendedAssigneeReason?: string; references: Reference[] }>;
|
||||
devTaskDrafts: Array<{ title: string; description?: string; categoryCode: string; priority: Priority; aiEstimateHours: number; requirementName?: string; recommendedAssigneeName?: string; recommendedAssigneeReason?: string; references: Reference[] }>;
|
||||
testCaseDrafts: Array<{ title: string; description: string; categoryCode: string; priority: Priority; aiEstimateHours: number; requirementName?: string; recommendedAssigneeName?: string; recommendedAssigneeReason?: string; references: Reference[] }>;
|
||||
}
|
||||
```
|
||||
|
||||
要求:AI 不输出数据库 `categoryId`,只输出稳定 `categoryCode`。前端确认写入时按 `TaskCategory.code` 映射成 `categoryId`;映射失败时使用对应分组的默认类型兜底。AI 不输出 `estimateHours`、预计开始或预计截止。
|
||||
要求:AI 不输出数据库 `categoryId`,只输出稳定 `categoryCode`。前端确认写入时按 `TaskCategory.code` 映射成 `categoryId`;映射失败时使用对应分组的默认类型兜底。AI 不输出 `estimateHours`、预计开始或预计截止。草案没有 `requirement` 引用时,必须有 `requirementName` 和至少一个 `prototype_note` 引用。
|
||||
|
||||
### 任务/用例分组契约
|
||||
|
||||
```ts
|
||||
interface VersionScopedRequirementGroup {
|
||||
versionId: string; // 执行归属,必填
|
||||
requirementId?: string; // 正式需求 ID,可选
|
||||
requirementName?: string; // 无正式需求 ID 时的展示分组名
|
||||
}
|
||||
```
|
||||
|
||||
要求:版本级聚合使用 `versionId`;需求级进度只统计带 `requirementId` 的 DevTask。无需求ID分组只影响版本任务/用例视图,不影响需求池和关联需求列表。
|
||||
|
||||
## 视觉规范
|
||||
|
||||
@@ -258,3 +275,4 @@ AI 草案在 DevTask / TestCase 列表中的视觉区分:
|
||||
- 整行加 `border-l-2 border-l-purple-400 bg-purple-50/30`
|
||||
- 标题旁紫色徽章「AI 草案」(`bg-purple-100 text-purple-600`)
|
||||
- 用户在详情抽屉里编辑保存任意字段后,徽章和左边线自动消失
|
||||
- 无需求ID分组不额外显示“原型发现”等标记,只在分组标题中展示 `无需求ID · {requirementName}`
|
||||
|
||||
Reference in New Issue
Block a user