From d00a6bbf16a39bcdb4480839cdbdfa07ef0fff4b Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Fri, 10 Apr 2026 11:15:23 +0900 Subject: [PATCH] fix(keyword-detector): always trigger ultrawork keywords --- .../keyword-detector/hook-ralph-loop.test.ts | 7 ++++--- src/hooks/keyword-detector/hook.ts | 17 ----------------- .../ultrawork-edge-trigger.test.ts | 9 +++++---- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/hooks/keyword-detector/hook-ralph-loop.test.ts b/src/hooks/keyword-detector/hook-ralph-loop.test.ts index 93b066b18..567e4ae08 100644 --- a/src/hooks/keyword-detector/hook-ralph-loop.test.ts +++ b/src/hooks/keyword-detector/hook-ralph-loop.test.ts @@ -106,7 +106,7 @@ describe("keyword-detector ralph-loop activation", () => { expect(output.parts[0]?.text).toContain("please ulw fix the flaky keyword tests") }) - test("#given question about ultrawork #when chat.message fires #then ralph-loop startLoop is not invoked", async () => { + test("#given question about ultrawork #when chat.message fires #then ralph-loop startLoop is invoked", async () => { // given setMainSession("main-session") const startLoopCalls: StartLoopCall[] = [] @@ -121,8 +121,9 @@ describe("keyword-detector ralph-loop activation", () => { await hook["chat.message"]({ sessionID: "main-session", agent: "sisyphus" }, output) // then - expect(startLoopCalls).toHaveLength(0) - expect(output.parts[0]?.text).toBe("what is ultrawork?") + expect(startLoopCalls).toHaveLength(1) + expect(startLoopCalls[0].prompt).toBe("what is ?") + expect(output.parts[0]?.text).toContain("what is ultrawork?") }) test("#given non-ulw message #when chat.message fires #then ralph-loop startLoop is not invoked", async () => { diff --git a/src/hooks/keyword-detector/hook.ts b/src/hooks/keyword-detector/hook.ts index 5623bb964..684e65d48 100644 --- a/src/hooks/keyword-detector/hook.ts +++ b/src/hooks/keyword-detector/hook.ts @@ -17,7 +17,6 @@ import { parseRalphLoopArguments } from "../ralph-loop/command-arguments" const ULTRAWORK_LONGHAND_PATTERN = /\bultrawork\b/i const ULW_SHORTHAND_PATTERN = /\bulw\b/i -const LEADING_ULTRAWORK_PATTERN = /^\s*(ultrawork|ulw)\b/i const GREETING_PREFIX_ULTRAWORK_PATTERN = /^\s*(?:hi|hello|hey|hiya|greetings)(?:\s+there)?(?:[!,.:;-]+\s*|\s+)(ultrawork|ulw)\b/i function normalizeUltraworkTask(taskText: string): string { @@ -38,12 +37,6 @@ function extractUltraworkTask(cleanText: string): string { return normalizeUltraworkTask(cleanText.replace(ULTRAWORK_LONGHAND_PATTERN, " ")) } -function shouldAllowUltraworkKeyword(cleanText: string): boolean { - return ULW_SHORTHAND_PATTERN.test(cleanText) - || LEADING_ULTRAWORK_PATTERN.test(cleanText) - || GREETING_PREFIX_ULTRAWORK_PATTERN.test(cleanText) -} - export function createKeywordDetectorHook( ctx: PluginInput, _collector?: ContextCollector, @@ -99,16 +92,6 @@ export function createKeywordDetectorHook( } } - if (!shouldAllowUltraworkKeyword(cleanText)) { - const preFilterCount = detectedKeywords.length - detectedKeywords = detectedKeywords.filter((k) => k.type !== "ultrawork") - if (preFilterCount > detectedKeywords.length) { - log(`[keyword-detector] Filtered disallowed ultrawork keyword`, { - sessionID: input.sessionID, - }) - } - } - if (detectedKeywords.length === 0) { return } diff --git a/src/hooks/keyword-detector/ultrawork-edge-trigger.test.ts b/src/hooks/keyword-detector/ultrawork-edge-trigger.test.ts index 9287fc225..8e2a2a926 100644 --- a/src/hooks/keyword-detector/ultrawork-edge-trigger.test.ts +++ b/src/hooks/keyword-detector/ultrawork-edge-trigger.test.ts @@ -132,7 +132,7 @@ describe("keyword-detector ultrawork edge trigger", () => { expect(output.parts[0]?.text).toContain("please ulw fix the flaky keyword tests") }) - test("#given trailing ultrawork reference without punctuation #when chat.message fires #then ultrawork stays disabled", async () => { + test("#given trailing ultrawork reference without punctuation #when chat.message fires #then ultrawork still activates", async () => { // given const toastCalls: string[] = [] const startLoopCalls: StartLoopCall[] = [] @@ -150,8 +150,9 @@ describe("keyword-detector ultrawork edge trigger", () => { await hook["chat.message"]({ sessionID: "main-session", agent: "sisyphus" }, output) // then - expect(toastCalls).not.toContain("Ultrawork Mode Activated") - expect(startLoopCalls).toHaveLength(0) - expect(output.parts[0]?.text).toBe("what is ultrawork") + expect(toastCalls).toContain("Ultrawork Mode Activated") + expect(startLoopCalls).toHaveLength(1) + expect(startLoopCalls[0]?.prompt).toBe("what is") + expect(output.parts[0]?.text).toContain("what is ultrawork") }) })