Files
Agent-System/internal/squad/rdev_steps.go
T
weichenandCursor dc3aef4607 fix(squad): inject rdev_leader InstructionsFile for DHF final review
Prefer AgentSpec.InstructionsFile when building AGENTS.md so rd_* leader
steps no longer fall back to business-tone leader.md.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 09:46:37 +00:00

216 lines
7.7 KiB
Go

package squad
const rdevDHFAccept = "模板写满;结论先行;追溯表必填;缺项标「待确认」;不编造数据/签字/附件"
func rdevSquadAgents(taskKey string) []AgentSpec {
meta, _ := LookupRDevTask(taskKey)
agents := []AgentSpec{
{
Role: "organizer",
Name: "材料整理专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"材料事实抽取", "适用性与缺口识别", "字段回填"},
ForbiddenActions: []string{"严禁编造试验数据", "严禁伪造签字"},
},
}
switch meta.Kind {
case RDevKindReviewMinutes:
agents = append(agents,
AgentSpec{
Role: "writer",
Name: "文档撰写专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"按评审记录模板成文", "问题-决议-行动项闭环"},
},
rdevLeaderAgent(),
)
case RDevKindUploadIndex:
agents = append(agents,
AgentSpec{
Role: "engineer",
Name: "技术专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"附件索引完整性", "缺失影响分析"},
},
AgentSpec{
Role: "writer",
Name: "文档撰写专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"按附件清单模板成文", "标明待上传项"},
},
rdevLeaderAgent(),
)
default:
agents = append(agents,
AgentSpec{
Role: "engineer",
Name: "技术专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"技术内容与追溯", "设计控制论证"},
},
)
if RDevNeedsRegulatory(taskKey) {
agents = append(agents, AgentSpec{
Role: "regulatory",
Name: "法规专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"法规/标准适用性", "软件与风险管理合规要点"},
})
}
agents = append(agents,
AgentSpec{
Role: "writer",
Name: "文档撰写专员",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
Responsibilities: []string{"按 RD 模板成文", "结论先行与待确认清单"},
},
rdevLeaderAgent(),
)
}
return agents
}
func rdevLeaderAgent() AgentSpec {
return AgentSpec{
Role: "leader",
Name: "研发设计控制负责人",
Model: "claude-3-7-sonnet",
Tools: []string{"read", "write", "edit"},
BashPermission: "deny",
InstructionsFile: "configs/agents/rdev_leader.md",
Responsibilities: []string{"DHF 完整性终审", "不适用理由审核", "禁止编造检查"},
ForbiddenActions: []string{"严禁代签", "严禁伪造附件内容"},
}
}
func rdevWorkflowSteps(taskKey string) []StepSpec {
meta, ok := LookupRDevTask(taskKey)
kind := RDevKindDocument
title := taskKey
if ok {
kind = meta.Kind
title = meta.Title
}
switch kind {
case RDevKindReviewMinutes:
return []StepSpec{
{
ID: "step_01_organize", Role: "organizer", Title: "整理评审输入与议题",
SubWorkspace: "tasks/01_organize", Mode: "execute",
Accept: []string{"汇总上游批准文档要点", "列出待评审议题与缺口", rdevDHFAccept},
},
{
ID: "step_02_draft", Role: "writer", Title: "撰写评审记录",
SubWorkspace: "tasks/02_draft", Mode: "execute",
Needs: []string{"tasks/01_organize/output.md"},
Accept: []string{"按模板写满评审记录", "问题-决议-行动项可追溯", rdevDHFAccept},
},
{
ID: "step_03_review", Role: "leader", Title: "研发设计控制终审",
SubWorkspace: "tasks/03_review", Mode: "execute",
Needs: []string{"tasks/02_draft/output.md"},
Accept: []string{"完整性与粒度达标", "无编造签字/数据", rdevDHFAccept},
},
}
case RDevKindUploadIndex:
return []StepSpec{
{
ID: "step_01_organize", Role: "organizer", Title: "整理附件材料线索",
SubWorkspace: "tasks/01_organize", Mode: "execute",
Accept: []string{"列出已知附件与缺失项", rdevDHFAccept},
},
{
ID: "step_02_engineer", Role: "engineer", Title: "完善附件索引与影响分析",
SubWorkspace: "tasks/02_engineer", Mode: "execute",
Needs: []string{"tasks/01_organize/output.md"},
Accept: []string{"索引表完整", "缺失影响已说明", rdevDHFAccept},
},
{
ID: "step_03_draft", Role: "writer", Title: "撰写附件清单",
SubWorkspace: "tasks/03_draft", Mode: "execute",
Needs: []string{"tasks/02_engineer/output.md"},
Accept: []string{"按 upload_index 模板成文", "禁止伪造附件正文", rdevDHFAccept},
},
{
ID: "step_04_review", Role: "leader", Title: "研发设计控制终审",
SubWorkspace: "tasks/04_review", Mode: "execute",
Needs: []string{"tasks/03_draft/output.md"},
Accept: []string{"索引与待上传结论一致", rdevDHFAccept},
},
}
default:
return rdevDocumentSteps(taskKey, title)
}
}
func rdevDocumentSteps(taskKey, title string) []StepSpec {
steps := []StepSpec{
{
ID: "step_01_organize", Role: "organizer", Title: "抽取材料事实并回填",
SubWorkspace: "tasks/01_organize", Mode: "execute",
Accept: []string{"facts/gaps/implications 入黑板", "适用性字段回填", rdevDHFAccept},
},
{
ID: "step_02_engineer", Role: "engineer", Title: "技术内容与追溯编制",
SubWorkspace: "tasks/02_engineer", Mode: "execute",
Needs: []string{"tasks/01_organize/output.md"},
Accept: []string{"技术论证完整", "追溯表可填则填", rdevDHFAccept},
},
}
draftNeeds := "tasks/02_engineer/output.md"
if RDevNeedsRegulatory(taskKey) {
steps = append(steps, StepSpec{
ID: "step_03_regulatory", Role: "regulatory", Title: "法规与风险合规要点",
SubWorkspace: "tasks/03_regulatory", Mode: "execute",
Needs: []string{"tasks/02_engineer/output.md"},
Accept: []string{"法规适用性明确", "风险类引用可追溯", rdevDHFAccept},
})
draftNeeds = "tasks/03_regulatory/output.md"
steps = append(steps,
StepSpec{
ID: "step_04_draft", Role: "writer", Title: "撰写《" + title + "》",
SubWorkspace: "tasks/04_draft", Mode: "execute",
Needs: []string{draftNeeds},
Accept: []string{"严格按 rd_ 模板成文", "结论先行", rdevDHFAccept},
},
StepSpec{
ID: "step_05_review", Role: "leader", Title: "研发设计控制终审",
SubWorkspace: "tasks/05_review", Mode: "execute",
Needs: []string{"tasks/04_draft/output.md"},
Accept: []string{"DHF 粒度达标", "无编造", rdevDHFAccept},
},
)
return steps
}
steps = append(steps,
StepSpec{
ID: "step_03_draft", Role: "writer", Title: "撰写《" + title + "》",
SubWorkspace: "tasks/03_draft", Mode: "execute",
Needs: []string{draftNeeds},
Accept: []string{"严格按 rd_ 模板成文", "结论先行", rdevDHFAccept},
},
StepSpec{
ID: "step_04_review", Role: "leader", Title: "研发设计控制终审",
SubWorkspace: "tasks/04_review", Mode: "execute",
Needs: []string{"tasks/03_draft/output.md"},
Accept: []string{"DHF 粒度达标", "无编造", rdevDHFAccept},
},
)
return steps
}