- 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
358 lines
9.0 KiB
Markdown
358 lines
9.0 KiB
Markdown
# 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 섹션 추가
|
|
|
|
```typescript
|
|
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 수정
|
|
|
|
```diff
|
|
- 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
|
|
|
|
```diff
|
|
- 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. 무한루프 방지 - 명확한 종료 조건
|
|
|
|
```diff
|
|
- 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. 철학 변경
|
|
|
|
```diff
|
|
- 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 호출**
|
|
```bash
|
|
oh-my-opencode run "Complex task requiring planning. ulw"
|
|
```
|
|
- 예상: Plan 생성 후 정상 종료
|
|
- 확인: 무한루프 없음
|
|
|
|
2. **Interactive mode (변경 없어야 함)**
|
|
```bash
|
|
oh-my-opencode run --agent prometheus "Design X"
|
|
```
|
|
- 예상: Clarifying questions 여전히 가능
|
|
- 확인: 사용자와 대화 가능
|
|
|
|
3. **Subagent context 제공 케이스**
|
|
- 예상: Context gathering skip
|
|
- 확인: 중복 탐색 없음
|
|
|
|
---
|
|
|
|
## 📝 수정된 파일
|
|
|
|
```
|
|
src/tools/delegate-task/constants.ts
|
|
```
|
|
|
|
### Diff Summary
|
|
|
|
```diff
|
|
@@ -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
|