fix: avoid false positives in progress-evidence gate

This commit is contained in:
Eve
2026-04-23 18:13:13 +08:00
parent 83077adcda
commit 242f7ce463
3 changed files with 149 additions and 24 deletions

View File

@@ -98,6 +98,33 @@ function buildProgressEvidence(wrapperResult: any): Record<string, unknown> | nu
return Object.keys(progressEvidence).length > 0 ? progressEvidence : null;
}
function shouldClaimProgression(wrapperResult: any, progressEvidence: Record<string, unknown> | null): boolean {
if (!wrapperResult || wrapperResult.classification !== "long_task") return false;
if (progressEvidence && Object.keys(progressEvidence).length > 0) return true;
const requiredNextAction = typeof wrapperResult.requiredNextAction === "string"
? wrapperResult.requiredNextAction.trim()
: "";
const progressingActionPrefixes = [
"dispatch_",
"handoff_",
"launch_",
"resume_",
"continue_",
"queue_",
"schedule_",
"run_",
"start_",
"spawn_",
];
if (requiredNextAction && progressingActionPrefixes.some((prefix) => requiredNextAction.startsWith(prefix))) {
return true;
}
return wrapperResult.silentLaunchOk === true;
}
function buildGateLockInput(wrapperResult: any): Record<string, unknown> {
if (!wrapperResult || wrapperResult.classification !== "long_task") {
return { classification: wrapperResult?.classification ?? "general_chat" };
@@ -124,16 +151,16 @@ function buildGateLockInput(wrapperResult: any): Record<string, unknown> {
concreteNextAction: requiredNextAction,
}
: null;
const progressEvidenceReason = progressEvidence
? ""
: "progression claim requires concrete evidence such as sessionKey, runId, modified_files, or verification result";
const claimedProgression = shouldClaimProgression(wrapperResult, progressEvidence)
? "already progressing to the next step in background"
: "";
const progressEvidenceReason = claimedProgression && !progressEvidence
? "progression claim requires concrete evidence such as sessionKey, runId, modified_files, or verification result"
: "";
const hasExternalizedCheckpointEvidence = wrapperResult.silentLaunchOk === true
&& typeof wrapperResult.taskRecord?.task_name === "string"
&& wrapperResult.taskRecord.task_name.trim().length > 0;
const hasButtonPathClosureEvidence = needsOwnerDecision && wrapperResult.silentLaunchOk === true;
const claimedProgression = wrapperResult.classification === "long_task"
? "already progressing to the next step in background"
: "";
return {
classification: wrapperResult.classification,