From 5fbcb88a3f06134200600fb8fbc8d159a8b29a57 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 28 Dec 2025 16:38:03 +0900 Subject: [PATCH] fix(todo-continuation-enforcer): persist errorBypass mode until user sends message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, errorBypass mode was cleared on session.idle, causing continuation to fire again on next idle event. This led to unwanted task resumption after user abort. Changes: - Don't clear errorBypass on session.idle - stay in errorBypass mode - Clear errorBypass to idle only when user sends a new message This ensures that once user aborts, the enforcer respects that decision until the user explicitly sends a message to resume. 🤖 Generated with assistance of OhMyOpenCode (https://github.com/code-yeongyu/oh-my-opencode) --- src/hooks/todo-continuation-enforcer.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/hooks/todo-continuation-enforcer.ts b/src/hooks/todo-continuation-enforcer.ts index 5f3cca6..9837fb6 100644 --- a/src/hooks/todo-continuation-enforcer.ts +++ b/src/hooks/todo-continuation-enforcer.ts @@ -424,10 +424,9 @@ export function createTodoContinuationEnforcer( return } - // Skip if in error bypass mode (clear it for next time) + // Skip if in error bypass mode (DO NOT clear - wait for user message) if (state.mode === "errorBypass") { - state.mode = "idle" - log(`[${HOOK_NAME}] Skipped: error bypass (cleared for next idle)`, { sessionID }) + log(`[${HOOK_NAME}] Skipped: error bypass (awaiting user message to resume)`, { sessionID }) return } @@ -489,8 +488,13 @@ export function createTodoContinuationEnforcer( if (!sessionID) return - // User message: Always cancel countdown + // User message: Always cancel countdown and clear errorBypass if (role === "user") { + const state = sessions.get(sessionID) + if (state?.mode === "errorBypass") { + state.mode = "idle" + log(`[${HOOK_NAME}] User message cleared errorBypass mode`, { sessionID }) + } invalidate(sessionID, "user message received") return }