diff --git a/src/hooks/todo-continuation-enforcer/stagnation-detection.ts b/src/hooks/todo-continuation-enforcer/stagnation-detection.ts new file mode 100644 index 000000000..ff35a357e --- /dev/null +++ b/src/hooks/todo-continuation-enforcer/stagnation-detection.ts @@ -0,0 +1,33 @@ +import { log } from "../../shared/logger" + +import { HOOK_NAME, MAX_STAGNATION_COUNT } from "./constants" +import type { ContinuationProgressUpdate } from "./session-state" + +export function shouldStopForStagnation(args: { + sessionID: string + incompleteCount: number + progressUpdate: ContinuationProgressUpdate +}): boolean { + const { sessionID, incompleteCount, progressUpdate } = args + + if (progressUpdate.hasProgressed) { + log(`[${HOOK_NAME}] Progress detected: reset stagnation count`, { + sessionID, + previousIncompleteCount: progressUpdate.previousIncompleteCount, + incompleteCount, + }) + } + + if (progressUpdate.stagnationCount < MAX_STAGNATION_COUNT) { + return false + } + + log(`[${HOOK_NAME}] Skipped: todo continuation stagnated`, { + sessionID, + incompleteCount, + previousIncompleteCount: progressUpdate.previousIncompleteCount, + stagnationCount: progressUpdate.stagnationCount, + maxStagnationCount: MAX_STAGNATION_COUNT, + }) + return true +}