fix(ingest): autoApproveExec 传错 id 致自动合并不触发(线上实测捕获)
condition 误把 taskId 传给 autoApproveExecOn(projectId) → getProject(taskId)=null → 永远 false,自动合并从不触发(任务卡 exec_review)。 重构为 shouldAutoApproveExec(store, task, codeV, secV),内部读 task.projectId 自取项目, 杜绝传错 id;补单测覆盖。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+20
-13
@@ -41,9 +41,18 @@ function shouldAutoApprovePlan(
|
||||
return subtasks.every((s) => s.complexity === 'easy');
|
||||
}
|
||||
|
||||
/** exec 自动放行开关:项目 auto-approved 且 autoApproveExec 打开(默认关)。 */
|
||||
function autoApproveExecOn(store: Store, projectId: string): boolean {
|
||||
const project = store.getProject(projectId);
|
||||
/**
|
||||
* 是否对该执行结果自动放行(跳过 exec_review 自动合并):双复审均 approve +
|
||||
* 项目 auto-approved + autoApproveExec 开。读 task.projectId 自取项目(杜绝传错 id)。默认关。
|
||||
*/
|
||||
export function shouldAutoApproveExec(
|
||||
store: Store,
|
||||
task: { projectId: string },
|
||||
codeVerdict: string | null,
|
||||
securityVerdict: string | null,
|
||||
): boolean {
|
||||
if (codeVerdict !== 'approve' || securityVerdict !== 'approve') return false;
|
||||
const project = store.getProject(task.projectId);
|
||||
return !!project && project.autonomy === 'auto-approved' && !!project.autoApproveExec;
|
||||
}
|
||||
|
||||
@@ -212,16 +221,14 @@ function applyRecord(store: Store, log: IngestLogger, taskId: string, runId: str
|
||||
|
||||
// 自动放行(默认关):auto-approved + autoApproveExec + 双复审均 approve → 自动合并。
|
||||
// 合并是 git 异步操作,fire-and-forget 不阻塞 tick;冲突则补救任务 + 留 exec_review 人审。
|
||||
if (rec.code.verdict === 'approve' && rec.security.verdict === 'approve' && autoApproveExecOn(store, taskId)) {
|
||||
const reviewed = store.getTask(taskId);
|
||||
if (reviewed) {
|
||||
void acceptAndMerge(store, log, reviewed, 'auto-approve-exec')
|
||||
.then((o) => {
|
||||
if (o.ok) log.info(`task=${taskId} 双复审 approve + 自动放行 → 已自动合并(${o.mergeCommit})`);
|
||||
else log.info(`task=${taskId} 自动合并未成(${o.error})→ 留 exec_review 人审${o.remediationTaskId ? `(补救任务 ${o.remediationTaskId})` : ''}`);
|
||||
})
|
||||
.catch((e) => log.error(`task=${taskId} 自动合并异常:${(e as Error).message}`));
|
||||
}
|
||||
const reviewed = store.getTask(taskId);
|
||||
if (reviewed && shouldAutoApproveExec(store, reviewed, rec.code.verdict, rec.security.verdict)) {
|
||||
void acceptAndMerge(store, log, reviewed, 'auto-approve-exec')
|
||||
.then((o) => {
|
||||
if (o.ok) log.info(`task=${taskId} 双复审 approve + 自动放行 → 已自动合并(${o.mergeCommit})`);
|
||||
else log.info(`task=${taskId} 自动合并未成(${o.error})→ 留 exec_review 人审${o.remediationTaskId ? `(补救任务 ${o.remediationTaskId})` : ''}`);
|
||||
})
|
||||
.catch((e) => log.error(`task=${taskId} 自动合并异常:${(e as Error).message}`));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user