Files
oh-my-openagent/issue-1501-analysis.md
YeonGyu-Kim a691a3ac0a refactor: migrate delegate_task to task tool with metadata fixes
- Rename delegate_task tool to task across codebase (100 files)
- Update model references: claude-opus-4-6 → 4-5, gpt-5.3-codex → 5.2-codex
- Add tool-metadata-store to restore metadata overwritten by fromPlugin()
- Add session ID polling for BackgroundManager task sessions
- Await async ctx.metadata() calls in tool executors
- Add ses_ prefix guard to getMessageDir for performance
- Harden BackgroundManager with idle deferral and error handling
- Fix duplicate task key in sisyphus-junior test object literals
- Fix unawaited showOutputToUser in ast_grep_replace
- Fix background=true → run_in_background=true in ultrawork prompt
- Fix duplicate task/task references in docs and comments
2026-02-06 21:35:30 +09:00

9.0 KiB

Issue #1501 분석 보고서: ULW Mode PLAN AGENT 무한루프

📋 이슈 요약

증상:

  • ULW (ultrawork) mode에서 PLAN AGENT가 무한루프에 빠짐
  • 분석/탐색 완료 후 plan만 계속 생성
  • 1분마다 매우 작은 토큰으로 요청 발생

예상 동작:

  • 탐색 완료 후 solution document 생성

🔍 근본 원인 분석

파일: src/tools/delegate-task/constants.ts

문제의 핵심

PLAN_AGENT_SYSTEM_PREPEND (constants.ts 234-269행)에 구조적 결함이 있었습니다:

  1. Interactive Mode 가정

    2. After gathering context, ALWAYS present:
       - Uncertainties: List of unclear points
       - Clarifying Questions: Specific questions to resolve uncertainties
    
    3. ITERATE until ALL requirements are crystal clear:
       - Do NOT proceed to planning until you have 100% clarity
       - Ask the user to confirm your understanding
    
  2. 종료 조건 없음

    • "100% clarity" 요구는 객관적 측정 불가능
    • 사용자 확인 요청은 ULW mode에서 불가능
    • 무한루프로 이어짐
  3. ULW Mode 미감지

    • Subagent로 실행되는 경우를 구분하지 않음
    • 항상 interactive mode로 동작 시도

왜 무한루프가 발생했는가?

ULW Mode 시작
  → Sisyphus가 Plan Agent 호출 (subagent)
    → Plan Agent: "100% clarity 필요"
      → Clarifying questions 생성
        → 사용자 없음 (subagent)
          → 다시 plan 생성 시도
            → "여전히 unclear"
              → 무한루프 반복

핵심: Plan Agent는 사용자와 대화하도록 설계되었지만, ULW mode에서는 사용자가 없는 subagent로 실행됨.


적용된 수정 방안

수정 내용 (constants.ts)

1. SUBAGENT MODE DETECTION 섹션 추가

SUBAGENT MODE DETECTION (CRITICAL):
If you received a detailed prompt with gathered context from a parent orchestrator (e.g., Sisyphus):
- You are running as a SUBAGENT
- You CANNOT directly interact with the user
- DO NOT ask clarifying questions - proceed with available information
- Make reasonable assumptions for minor ambiguities
- Generate the plan based on the provided context

2. Context Gathering Protocol 수정

- 1. Launch background agents to gather context:
+ 1. Launch background agents to gather context (ONLY if not already provided):

효과: 이미 Sisyphus가 context를 수집한 경우 중복 방지

3. Clarifying Questions → Assumptions

- 2. After gathering context, ALWAYS present:
-    - Uncertainties: List of unclear points
-    - Clarifying Questions: Specific questions
+ 2. After gathering context, assess clarity:
+    - User Request Summary: Concise restatement
+    - Assumptions Made: List any assumptions for unclear points

효과: 질문 대신 가정 사항 문서화

4. 무한루프 방지 - 명확한 종료 조건

- 3. ITERATE until ALL requirements are crystal clear:
-    - Do NOT proceed to planning until you have 100% clarity
-    - Ask the user to confirm your understanding
-    - Resolve every ambiguity before generating the work plan
+ 3. PROCEED TO PLAN GENERATION when:
+    - Core objective is understood (even if some details are ambiguous)
+    - You have gathered context via explore/librarian (or context was provided)
+    - You can make reasonable assumptions for remaining ambiguities
+    
+    DO NOT loop indefinitely waiting for perfect clarity.
+    DOCUMENT assumptions in the plan so they can be validated during execution.

효과:

  • "100% clarity" 요구 제거
  • 객관적인 진입 조건 제공
  • 무한루프 명시적 금지
  • Assumptions를 plan에 문서화하여 실행 중 검증 가능

5. 철학 변경

- REMEMBER: Vague requirements lead to failed implementations.
+ REMEMBER: A plan with documented assumptions is better than no plan.

효과: Perfectionism → Pragmatism


🎯 해결 메커니즘

Before (무한루프)

Plan Agent 시작
  ↓
Context gathering
  ↓
Requirements 명확한가?
  ↓ NO
Clarifying questions 생성
  ↓
사용자 응답 대기 (없음)
  ↓
다시 plan 시도
  ↓
(무한 반복)

After (정상 종료)

Plan Agent 시작
  ↓
Subagent mode 감지?
  ↓ YES
Context 이미 있음? → YES
  ↓
Core objective 이해? → YES
  ↓
Reasonable assumptions 가능? → YES
  ↓
Plan 생성 (assumptions 문서화)
  ↓
완료 ✓

📊 영향 분석

해결되는 문제

  1. ULW mode 무한루프
  2. Sisyphus에서 Plan Agent 호출 시 블로킹
  3. 작은 토큰 반복 요청
  4. 1분마다 재시도

부작용 없음

  • Interactive mode (사용자와 직접 대화)는 여전히 작동
  • Subagent mode일 때만 다르게 동작
  • Backward compatibility 유지

추가 개선사항

  • Assumptions를 plan에 명시적으로 문서화
  • Execution 중 validation 가능
  • 더 pragmatic한 workflow

🧪 검증 방법

테스트 시나리오

  1. ULW mode에서 Plan Agent 호출

    oh-my-opencode run "Complex task requiring planning. ulw"
    
    • 예상: Plan 생성 후 정상 종료
    • 확인: 무한루프 없음
  2. Interactive mode (변경 없어야 함)

    oh-my-opencode run --agent prometheus "Design X"
    
    • 예상: Clarifying questions 여전히 가능
    • 확인: 사용자와 대화 가능
  3. Subagent context 제공 케이스

    • 예상: Context gathering skip
    • 확인: 중복 탐색 없음

📝 수정된 파일

src/tools/delegate-task/constants.ts

Diff Summary

@@ -234,22 +234,32 @@ export const PLAN_AGENT_SYSTEM_PREPEND = `<system>
+SUBAGENT MODE DETECTION (CRITICAL):
+[subagent 감지 및 처리 로직]
+
 MANDATORY CONTEXT GATHERING PROTOCOL:
-1. Launch background agents to gather context:
+1. Launch background agents (ONLY if not already provided):

-2. After gathering context, ALWAYS present:
-   - Uncertainties
-   - Clarifying Questions
+2. After gathering context, assess clarity:
+   - Assumptions Made

-3. ITERATE until ALL requirements are crystal clear:
-   - Do NOT proceed until 100% clarity
-   - Ask user to confirm
+3. PROCEED TO PLAN GENERATION when:
+   - Core objective understood
+   - Context gathered
+   - Reasonable assumptions possible
+   
+   DO NOT loop indefinitely.
+   DOCUMENT assumptions.

🚀 권장 사항

Immediate Actions

  1. 수정 적용 완료 - constants.ts 업데이트됨
  2. 테스트 수행 - ULW mode에서 동작 검증
  3. PR 생성 - code review 요청

Future Improvements

  1. Subagent context 표준화

    • Subagent로 호출 시 명시적 플래그 전달
    • is_subagent: true 파라미터 추가 고려
  2. Assumptions validation workflow

    • Plan 실행 중 assumptions 검증 메커니즘
    • Incorrect assumptions 감지 시 재계획
  3. Timeout 메커니즘

    • Plan Agent가 X분 이상 걸리면 강제 종료
    • Fallback plan 생성
  4. Monitoring 추가

    • Plan Agent 실행 시간 측정
    • Iteration 횟수 로깅
    • 무한루프 조기 감지

📖 관련 코드 구조

Call Stack

Sisyphus (ULW mode)
  ↓
task(category="deep", ...)
  ↓
executor.ts: executeBackgroundContinuation()
  ↓
prompt-builder.ts: buildSystemContent()
  ↓
constants.ts: PLAN_AGENT_SYSTEM_PREPEND (문제 위치)
  ↓
Plan Agent 실행

Key Functions

  1. executor.ts:587 - isPlanAgent() 체크
  2. prompt-builder.ts:11 - Plan Agent prepend 주입
  3. constants.ts:234 - PLAN_AGENT_SYSTEM_PREPEND 정의

🎓 교훈

Design Lessons

  1. Dual Mode Support

    • Interactive vs Autonomous mode 구분 필수
    • Context 전달 방식 명확히
  2. Avoid Perfectionism in Agents

    • "100% clarity" 같은 주관적 조건 지양
    • 명확한 객관적 종료 조건 필요
  3. Document Uncertainties

    • 불확실성을 숨기지 말고 문서화
    • 실행 중 validation 가능하게
  4. Infinite Loop Prevention

    • 모든 반복문에 명시적 종료 조건
    • Timeout 또는 max iteration 설정

🔗 참고 자료

  • Issue: #1501 - [Bug]: ULW mode will 100% cause PLAN AGENT to get stuck
  • Files Modified: src/tools/delegate-task/constants.ts
  • Related Concepts: Ultrawork mode, Plan Agent, Subagent delegation
  • Agent Architecture: Sisyphus → Prometheus → Atlas workflow

Conclusion

Root Cause: Plan Agent가 interactive mode를 가정했으나 ULW mode에서는 subagent로 실행되어 사용자 상호작용 불가능. "100% clarity" 요구로 무한루프 발생.

Solution: Subagent mode 감지 로직 추가, clarifying questions 제거, 명확한 종료 조건 제공, assumptions 문서화 방식 도입.

Result: ULW mode에서 Plan Agent가 정상적으로 plan 생성 후 종료. 무한루프 해결.


Status: Fixed
Tested: Pending
Deployed: Pending

Analyst: Sisyphus (oh-my-opencode ultrawork mode)
Date: 2026-02-05
Session: fast-ember