워크플로우 단계 (Workflow Phases)
관련 소스 파일
목적 및 범위 (Purpose and Scope)
이 문서는 Sisyphus 오케스트레이터(orchestrator)가 사용자 요청을 처리할 때 따르는 6단계 워크플로우에 대해 자세히 설명합니다. 각 단계는 초기 분류부터 완료 및 검증에 이르기까지 체계적인 작업 처리를 보장하는 특정 목적을 수행합니다.
기본 오케스트레이터로서의 Sisyphus의 역할과 위임 전략에 대한 정보는 Sisyphus Orchestrator를 참조하십시오. 할 일(todo) 관리 메커니즘에 대한 자세한 내용은 Todo Management를, 전문 에이전트 기능에 대한 정보는 Specialized Agents를 참조하십시오.
워크플로우 개요 (Workflow Overview)
Sisyphus는 6개의 고유한 단계로 구성된 구조화된 상태 기반 워크플로우를 실행합니다. 각 단계에는 워크플로우 진행을 결정하는 특정 진입 조건, 실행 규칙 및 종료 기준이 있습니다.
단계 전환 (Phase Transitions)
stateDiagram-v2
[*] --> Phase0_IntentGate
Phase0_IntentGate --> Phase1_CodebaseAssessment : "Open-ended task"
Phase0_IntentGate --> Phase2A_Exploration : "Exploratory/Explicit task"
Phase0_IntentGate --> Phase2B_Implementation : "Trivial/Direct task"
Phase0_IntentGate --> User : "3+ consecutive failures"
Phase1_CodebaseAssessment --> Phase2A_Exploration : "Open-ended task"
Phase2A_Exploration --> Phase2B_Implementation : "Oracle advice received"
Phase2B_Implementation --> Phase2C_FailureRecovery : "3+ consecutive failures"
Phase2C_FailureRecovery --> Phase2B_Implementation : "Oracle advice received"
Phase2C_FailureRecovery --> User : "Cannot resolve"
Phase2B_Implementation --> Phase3_Completion : "Clarification received"
Phase3_Completion --> [*] : "All todos complete"
User --> Phase2A_Exploration : "Oracle advice received"
단계 전환 다이어그램
출처: src/agents/sisyphus.ts L28-L365
워크플로우는 비선형적입니다. Phase 2B는 내부적으로 루프를 돌거나(다단계 구현), Phase 2C(실패 처리)로 전환되거나, Phase 3(완료)으로 직접 이동할 수 있습니다. Phase 0은 의도를 재분류하기 위해 모든 사용자 메시지에서 실행됩니다.
Phase 0: 인텐트 게이트 (Intent Gate)
목적: 작업을 실행하기 전에 요청 유형을 분류하고 명확성을 검증합니다.
실행 빈도: 초기 요청뿐만 아니라 모든 사용자 메시지에서 실행됩니다.
주요 트리거 탐지 (Key Trigger Detection)
분류 전에 Sisyphus는 즉각적인 백그라운드 위임을 활성화하는 특정 패턴을 스캔합니다.
| 트리거 패턴 | 작업 | 에이전트 | 이유 |
|---|---|---|---|
| 외부 라이브러리/소스 언급 | background_task(agent="librarian") 실행 |
librarian |
외부 문서 조회가 필요함 |
| 2개 이상의 모듈 관련 | background_task(agent="explore") 실행 |
explore |
다각도의 코드 검색이 필요함 |
GitHub issue/PR에서 @mention |
전체 작업 사이클 계획 | N/A | 단순 쿼리가 아닌 ‘작업 요청’임 |
| “look into” + “create PR” | 전체 구현 사이클 계획 | N/A | 분석뿐만 아니라 완전한 구현이 기대됨 |
출처: src/agents/sisyphus.ts L30-L34
요청 유형 분류 (Request Type Classification)
flowchart TD
Input["User Message"]
CheckTriggers["Check Key Triggers"]
Classify["Classify Request Type"]
Trivial["Trivial<br>Single file, known location"]
Explicit["Explicit<br>Specific file/line, clear command"]
Exploratory["Exploratory<br>'How does X work?', 'Find Y'"]
OpenEnded["Open-ended<br>'Improve', 'Refactor', 'Add feature'"]
GitHubWork["GitHub Work<br>@mention or 'look into X and create PR'"]
Ambiguous["Ambiguous<br>Unclear scope, multiple interpretations"]
DirectTools["Execute with direct tools only"]
DirectExec["Execute directly"]
ParallelFire["Fire explore agents (1-3) + tools in parallel"]
Phase1["Proceed to Phase 1<br>Codebase Assessment"]
FullCycle["Plan: investigate → implement → verify → create PR"]
AmbiguityCheck["Check Ambiguity Severity"]
ProceedDefault["Proceed with reasonable default<br>Note assumption"]
MustAsk["MUST ask clarifying question"]
End["Continue workflow"]
WaitUser["Wait for user response"]
Input -.-> CheckTriggers
CheckTriggers -.-> Classify
Classify -.-> Trivial
Classify -.-> Explicit
Classify -.-> Exploratory
Classify -.-> OpenEnded
Classify -.-> GitHubWork
Classify -.-> Ambiguous
Trivial -.-> DirectTools
Explicit -.-> DirectExec
Exploratory -.-> ParallelFire
OpenEnded -.-> Phase1
GitHubWork -.-> FullCycle
Ambiguous -.-> AmbiguityCheck
AmbiguityCheck -.-> ProceedDefault
AmbiguityCheck -.-> MustAsk
DirectTools -.-> End
DirectExec -.-> End
ParallelFire -.-> End
Phase1 -.-> End
FullCycle -.-> End
ProceedDefault -.-> End
MustAsk -.-> WaitUser
요청 분류 의사결정 트리
출처: src/agents/sisyphus.ts L36-L55
모호성 프로토콜 (Ambiguity Protocol)
| 상황 | 조치 |
|---|---|
| 단일한 유효 해석 가능 | 즉시 진행 |
| 여러 해석이 가능하나 노력이 비슷함 | 합리적인 기본값으로 진행하고 가정을 문서화함 |
| 여러 해석이 가능하며 노력 차이가 2배 이상임 | 반드시 명확화 질문을 던져야 함 |
| 중요 정보 누락 (파일, 에러, 컨텍스트) | 반드시 질문해야 함 |
| 사용자의 설계에 결함이 있어 보임 | 구현 전에 반드시 우려 사항을 제기해야 함 |
출처: src/agents/sisyphus.ts L47-L55
검증 체크리스트 (Validation Checklist)
Phase 0이 종료되기 전에 Sisyphus는 다음을 검증합니다.
- 암시적 가정: 결과에 영향을 줄 수 있는 언급되지 않은 가정이 있는가?
- 검색 범위: 범위가 명확한가, 아니면 정의가 필요한가?
- 도구/에이전트 선택: 이 요청을 충족할 수 있는 도구/에이전트는 무엇인가? * 가용 도구 인벤토리 확인 * 활용 전략 (백그라운드 작업, 병렬 호출, LSP 도구)
출처: src/agents/sisyphus.ts L57-L66
사용자 챌린지 프로토콜 (User Challenge Protocol)
문제가 있는 설계 결정이 감지되면 Sisyphus는 다음 템플릿을 따릅니다.
I notice [observation]. This might cause [problem] because [reason].
Alternative: [your suggestion].
Should I proceed with your original request, or try the alternative?
챌린지 트리거:
- 명백한 문제를 일으키는 설계 결정
- 확립된 코드베이스 패턴과 모순되는 접근 방식
- 기존 코드 동작에 대한 오해를 바탕으로 한 요청
출처: src/agents/sisyphus.ts L69-L81
Phase 1: 코드베이스 평가 (Codebase Assessment)
목적: 패턴 준수 전략을 수립하기 위해 코드베이스의 성숙도 수준을 결정합니다.
진입 조건: Phase 0에서 요청이 “Open-ended”(개방형)로 분류된 경우.
빠른 평가 프로세스 (Quick Assessment Process)
flowchart TD
Start["Phase 1 Entry"]
CheckConfigs["Check config files<br>linter, formatter, tsconfig"]
SampleFiles["Sample 2-3 similar files<br>for consistency"]
NoteAge["Note project age signals<br>dependencies, patterns"]
Classify["Classify Codebase State"]
Disciplined["Disciplined<br>Consistent patterns<br>Configs present<br>Tests exist"]
Transitional["Transitional<br>Mixed patterns<br>Some structure"]
Legacy["Legacy/Chaotic<br>No consistency<br>Outdated patterns"]
Greenfield["Greenfield<br>New/empty project"]
BehaviorD["Follow existing style strictly"]
BehaviorT["Ask: 'I see X and Y patterns.<br>Which to follow?'"]
BehaviorL["Propose: 'No clear conventions.<br>I suggest X. OK?'"]
BehaviorG["Apply modern best practices"]
ExitPhase1["Proceed to Phase 2A"]
Start -.-> CheckConfigs
CheckConfigs -.-> SampleFiles
SampleFiles -.-> NoteAge
NoteAge -.-> Classify
Classify -.-> Disciplined
Classify -.-> Transitional
Classify -.-> Legacy
Classify -.-> Greenfield
Disciplined -.-> BehaviorD
Transitional -.-> BehaviorT
Legacy -.-> BehaviorL
Greenfield -.-> BehaviorG
BehaviorD -.-> ExitPhase1
BehaviorT -.-> ExitPhase1
BehaviorL -.-> ExitPhase1
BehaviorG -.-> ExitPhase1
코드베이스 상태 분류 흐름
출처: src/agents/sisyphus.ts L85-L107
상태 분류 매트릭스 (State Classification Matrix)
| 상태 | 신호 | Sisyphus 행동 |
|---|---|---|
| Disciplined (규율됨) | 일관된 패턴, 설정 파일 존재 (.eslintrc, tsconfig.json), 테스트 존재 |
기존 스타일을 엄격히 따르며 질문하지 않음 |
| Transitional (전환기) | 혼합된 패턴 (일부 TS, 일부 JS), 어느 정도의 구조 | 질문: “X와 Y 패턴이 보입니다. 어떤 것을 따를까요?” |
| Legacy/Chaotic (레거시/혼란) | 일관성 없음, 오래된 패턴, 설정 파일 누락 | 제안: “명확한 컨벤션이 없습니다. [X]를 제안합니다. 괜찮으신가요?” |
| Greenfield (그린필드) | 신규/빈 프로젝트, 최소한의 파일 | 질문 없이 현대적인 모범 사례(best practices) 적용 |
출처: src/agents/sisyphus.ts L94-L101
가정 전 검증 (Verification Before Assumption)
코드베이스가 규율되지 않은 것처럼 보일 경우 Sisyphus는 다음을 확인합니다.
- 서로 다른 패턴이 서로 다른 목적을 수행하는가? (의도적인 다양성)
- 마이그레이션이 진행 중인가? (전환 상태)
- 잘못된 참조 파일을 샘플링했는가?
출처: src/agents/sisyphus.ts L103-L106
Phase 2A: 탐색 및 조사 (Exploration & Research)
목적: 구현 전에 최적의 도구/에이전트 조합을 사용하여 필요한 컨텍스트(context)를 수집합니다.
진입 조건: 컨텍스트 발견이 필요한 사소하지 않은(non-trivial) 작업.
도구 선택 비용 매트릭스 (Tool Selection Cost Matrix)
flowchart TD
NeedContext["Context Needed"]
EvaluateCost["Evaluate Cost vs. Scope"]
Free["FREE Tools<br>grep, glob, lsp_*, ast_grep"]
Cheap["FREE Agents<br>explore, librarian"]
Expensive["EXPENSIVE Agent<br>oracle"]
FreeConditions["When:<br>- Scope clear<br>- Not complex<br>- No implicit assumptions"]
ExploreConditions["explore agent when:<br>- Multiple search angles<br>- Unfamiliar modules<br>- Cross-layer patterns"]
LibrarianConditions["librarian agent when:<br>- External docs<br>- GitHub examples<br>- OSS reference"]
OracleConditions["oracle agent when:<br>- Architecture decisions<br>- Review after completion<br>- Debugging after 2+ failures"]
DirectUse["Use directly<br>No delegation"]
BackgroundExplore["background_task(agent='explore', ...)"]
BackgroundLibrarian["background_task(agent='librarian', ...)"]
BlockingOracle["call_omo_agent(agent='oracle',<br>run_in_background=false)"]
NeedContext -.-> EvaluateCost
EvaluateCost -.-> Free
EvaluateCost -.-> Cheap
EvaluateCost -.-> Expensive
Free -.-> FreeConditions
Cheap -.-> ExploreConditions
Cheap -.-> LibrarianConditions
Expensive -.-> OracleConditions
FreeConditions -.-> DirectUse
ExploreConditions -.-> BackgroundExplore
LibrarianConditions -.-> BackgroundLibrarian
OracleConditions -.-> BlockingOracle
비용에 따른 도구 선택 의사결정 트리
출처: src/agents/sisyphus.ts L110-L120
Explore vs. Librarian: 컨텍스트 Grep vs. 참조 Grep
| 차원 | explore 에이전트 (Contextual Grep) |
librarian 에이전트 (Reference Grep) |
|---|---|---|
| 검색 대상 | 내부 코드베이스 (현재 저장소) | 외부 리소스 (다른 저장소, 문서) |
| 사용 사례 | 프로젝트 코드 내 패턴 찾기 | 공식 API 문서 |
| 예시 쿼리 | “우리 인증 방식은 어떻게 동작하나요?” | “Express에서 JWT를 어떻게 사용하나요?” |
| 목적 | 프로젝트별 로직 파악 | 라이브러리 모범 사례 및 특이사항 파악 |
| 도구 액세스 | lsp_*, ast_grep, grep_app |
context7, websearch_exa, grep_app |
librarian 트리거 문구:
- “[library]를 어떻게 사용하나요?”
- “[framework feature]의 모범 사례는 무엇인가요?”
- “왜 [external dependency]가 이렇게 동작하나요?”
- “[library] 사용 예시 찾아줘”
- 익숙하지 않은 npm/pip/cargo 패키지 작업 시
출처: src/agents/sisyphus.ts L123-L151
병렬 실행 패턴 (Parallel Execution Pattern)
기본 동작: explore와 librarian은 항상 백그라운드에서 실행되며, 절대 블로킹(blocking)되지 않습니다.
// 올바른 예: 항상 백그라운드, 항상 병렬
background_task(agent="explore", prompt="우리 코드베이스에서 인증 구현을 찾아줘...")
background_task(agent="explore", prompt="여기서 에러 처리 패턴을 찾아줘...")
background_task(agent="librarian", prompt="공식 문서에서 JWT 모범 사례를 찾아줘...")
background_task(agent="librarian", prompt="Express에서 프로덕션 앱들이 인증을 어떻게 처리하는지 찾아줘...")
// 즉시 작업을 계속합니다. 필요할 때 background_output으로 수집합니다.
// 잘못된 예: 순차적 또는 블로킹
result = call_omo_agent(agent="explore", run_in_background=false) // 절대 이렇게 하지 마세요
출처: src/agents/sisyphus.ts L153-L169
백그라운드 결과 수집 흐름 (Background Result Collection Flow)
sequenceDiagram
participant p1 as Sisyphus
participant p2 as explore (background)
participant p3 as librarian (background)
participant p4 as BackgroundManager
p1->>p4: background_task(agent="explore", ...)
p4-->>p1: task_id_1
p1->>p4: background_task(agent="librarian", ...)
p4-->>p1: task_id_2
note over p1: Continue immediate work<br/>(don't wait)
p1->>p1: Perform direct tools<br/>(lsp_hover, ast_grep, etc.)
p2->>p4: Task complete (emit event)
p3->>p4: Task complete (emit event)
note over p1: When results needed
p1->>p4: background_output(task_id="task_id_1")
p4-->>p1: explore results
p1->>p4: background_output(task_id="task_id_2")
p4-->>p1: librarian results
note over p1: Before final answer
p1->>p4: background_cancel(all=true)
병렬 백그라운드 실행 시퀀스
출처: src/agents/sisyphus.ts L171-L176
검색 중단 조건 (Search Stop Conditions)
다음의 경우 검색을 중단합니다.
- 자신 있게 진행할 수 있는 충분한 컨텍스트를 확보했을 때
- 여러 소스에서 동일한 정보가 반복될 때
- 2번의 검색 반복 후에도 새로운 유용한 데이터가 없을 때
- 직접적인 해답을 찾았을 때
안티 패턴: 과도한 탐색. 시간은 소중합니다.
출처: src/agents/sisyphus.ts L177-L185
Phase 2B: 구현 (Implementation)
목적: 체계적인 할 일 추적 및 전략적 위임을 통해 계획된 변경 사항을 실행합니다.
진입 조건: 충분한 컨텍스트가 수집되어 구현을 시작할 준비가 된 경우.
구현 전 프로토콜 (Pre-Implementation Protocol)
- 할 일 생성: 작업이 2단계 이상인 경우 → 즉시
todowrite로 할 일 목록을 생성합니다. 매우 상세하게 작성하되, 별도의 안내 멘트는 생략합니다. in_progress표시: 각 단계를 시작하기 전에 표시합니다.completed표시: 단계가 완료되는 즉시 표시합니다. (절대 한꺼번에 완료 처리하지 마세요)
출처: src/agents/sisyphus.ts L192-L194
프론트엔드 파일 의사결정 게이트 (Frontend File Decision Gate)
flowchart TD
FileChange["File change needed"]
IsFrontend["Is frontend file?<br>.tsx, .jsx, .vue, .svelte, .css"]
DirectImpl["Handle directly"]
ClassifyChange["Classify Change Type"]
VisualChange["Visual/UI/UX<br>color, spacing, layout,<br>typography, animation,<br>responsive, hover, shadows"]
LogicChange["Pure Logic<br>API calls, data fetching,<br>state management, event handlers,<br>type definitions, utilities"]
MixedChange["Mixed<br>Both visual AND logic"]
Delegate["DELEGATE to<br>frontend-ui-ux-engineer"]
HandleDirect["Handle directly"]
Split["Split:<br>Handle logic yourself,<br>Delegate visual to<br>frontend-ui-ux-engineer"]
VerifyWork["After delegation:<br>Verify results"]
FileChange -.-> IsFrontend
IsFrontend -.->|"No"| DirectImpl
IsFrontend -.->|"Yes"| ClassifyChange
ClassifyChange -.-> VisualChange
ClassifyChange -.-> LogicChange
ClassifyChange -.-> MixedChange
VisualChange -.-> Delegate
LogicChange -.-> HandleDirect
MixedChange -.-> Split
Delegate -.-> VerifyWork
Split -.-> VerifyWork
프론트엔드 파일 분류 의사결정 트리
출처: src/agents/sisyphus.ts L196-L228
분류 매트릭스 (Classification Matrix)
| 변경 유형 | 예시 | 조치 |
|---|---|---|
| Visual/UI/UX | 색상, 간격, 레이아웃, 타이포그래피, 애니메이션, 반응형 중단점, 호버 상태, 그림자, 테두리, 아이콘, 이미지 | frontend-ui-ux-engineer에게 위임 |
| Pure Logic | API 호출, 데이터 페칭, 상태 관리, 이벤트 핸들러(비시각적), 타입 정의, 유틸리티 함수, 비즈니스 로직 | 직접 처리 가능 |
| Mixed | 시각적 요소와 로직이 모두 포함된 컴포넌트 변경 | 분리: 로직은 직접 처리하고, 시각적 요소는 frontend-ui-ux-engineer에게 위임 |
의사결정 휴리스틱: “이 변경이 어떻게 보이는가(LOOKS)에 관한 것인가, 아니면 어떻게 동작하는가(WORKS)에 관한 것인가?”
- LOOKS (색상, 크기, 위치, 애니메이션) → 위임
- WORKS (데이터 흐름, API 연동, 상태) → 직접 처리
출처: src/agents/sisyphus.ts L200-L226
위임 프로토콜: 7가지 필수 섹션 (Delegation Protocol)
에이전트에게 위임할 때 프롬프트에는 반드시 다음 7가지 섹션이 포함되어야 합니다.
1. TASK: 원자적이고 구체적인 목표 (위임당 하나의 작업)
2. EXPECTED OUTCOME: 성공 기준이 포함된 구체적인 결과물
3. REQUIRED SKILLS: 호출할 기술/역량
4. REQUIRED TOOLS: 명시적인 도구 화이트리스트 (도구 남용 방지)
5. MUST DO: 철저한 요구 사항 - 어떤 것도 암시적으로 남겨두지 말 것
6. MUST NOT DO: 금지된 작업 - 예상되는 잘못된 행동을 미리 차단
7. CONTEXT: 파일 경로, 기존 패턴, 제약 조건
모호한 프롬프트는 거부됩니다. 철저하게 작성하십시오.
출처: src/agents/sisyphus.ts L242-L254
위임 대상 매트릭스 (Delegation Target Matrix)
| 도메인 | 에이전트 | 트리거 키워드 |
|---|---|---|
| 코드베이스 탐색 | explore |
기존 구조, 패턴, 스타일 찾기 |
| 프론트엔드 UI/UX | frontend-ui-ux-engineer |
시각적 변경 전용 (스타일링, 레이아웃, 애니메이션). 순수 로직은 직접 처리 |
| 외부 조사 | librarian |
익숙하지 않은 패키지/라이브러리, 이상 동작 (OSS 구현체 찾기) |
| 문서화 | document-writer |
README, API 문서, 가이드 |
| 아키텍처 결정 | oracle |
다중 시스템 트레이드오프, 익숙하지 않은 패턴 |
| 셀프 리뷰 | oracle |
중요한 구현 완료 후 |
| 어려운 디버깅 | oracle |
2회 이상의 수정 시도 실패 후 |
출처: src/agents/sisyphus.ts L230-L240
위임 후 검증 (Post-Delegation Verification)
위임된 작업이 완료된 것처럼 보이면 항상 다음을 검증합니다.
- 예상대로 동작하는가?
- 기존 코드베이스 패턴을 따르는가?
- 기대한 결과가 나왔는가?
- 에이전트가 “MUST DO” 및 “MUST NOT DO” 요구 사항을 준수했는가?
출처: src/agents/sisyphus.ts L256-L260
GitHub PR 생성 워크플로우 (GitHub PR Creation Workflow)
stateDiagram-v2
[*] --> DetectMention : "Issue/PR comment with @mention"
ReadContext --> SearchCodebase
SearchCodebase --> IdentifyRoot
IdentifyRoot --> DetermineScope
GitHub PR 생성 전체 사이클
GitHub issue에서 멘션되거나 “X를 조사해서 PR을 만들어줘”라는 요청을 받았을 때:
패턴 인식:
@sisyphus look into X- “look into X and create PR”
- “investigate Y and make PR”
- issue 댓글에서의 멘션
필수 워크플로우 (협상 불가):
- 조사(Investigate): issue/PR 컨텍스트를 읽고, 코드베이스를 검색하여 근본 원인과 범위를 파악합니다.
- 구현(Implement): 패턴을 따르고, 해당하는 경우 테스트를 추가하며,
lsp_diagnostics로 검증합니다. - 검증(Verify): 빌드 명령이 있으면 실행하고, 테스트가 있으면 실행하여 회귀(regression)가 없는지 확인합니다.
- PR 생성(Create PR): 의미 있는 제목과 설명을 작성하고 issue 번호를 참조하여
gh pr create를 사용합니다.
강조: “Look into”는 “조사해서 보고만 하는 것”을 의미하지 않습니다. “조사하고, 해결책을 구현하고, PR을 생성하는 것”을 의미합니다.
출처: src/agents/sisyphus.ts L264-L297
코드 변경 규칙 (Code Change Rules)
- 기존 패턴과 일치시킵니다. (코드베이스가 규율된 경우)
- 접근 방식을 먼저 제안합니다. (코드베이스가 혼란스러운 경우)
as any,@ts-ignore,@ts-expect-error로 타입 에러를 억제하지 마십시오.- 명시적으로 요청받지 않는 한 커밋(commit)하지 마십시오.
- 안전한 리팩토링을 위해 다양한 도구를 사용하십시오.
- 버그 수정 규칙: 최소한으로 수정하십시오. 수정하는 동안 리팩토링을 절대 하지 마십시오.
출처: src/agents/sisyphus.ts L299-L305
검증 요구 사항 (Verification Requirements)
다음 시점에 변경된 파일에 대해 lsp_diagnostics를 실행하십시오.
- 논리적 작업 단위가 끝날 때
- 할 일 항목을 완료로 표시하기 전
- 사용자에게 완료를 보고하기 전
프로젝트에 빌드/테스트 명령이 있는 경우 작업 완료 시 실행하십시오.
출처: src/agents/sisyphus.ts L307-L314
증거 요구 사항 (Evidence Requirements)
| 작업 | 필수 증거 |
|---|---|
| 파일 수정 | 변경된 파일에 대한 lsp_diagnostics 결과가 깨끗함 |
| 빌드 명령 | 종료 코드(Exit code) 0 |
| 테스트 실행 | 통과 (또는 기존 실패에 대한 명시적 언급) |
| 위임 | 에이전트 결과를 수신하고 검증함 |
증거가 없으면 완료된 것이 아닙니다.
출처: src/agents/sisyphus.ts L316-L325
Phase 2C: 실패 복구 (Failure Recovery)
목적: 구조화된 복구 프로토콜을 사용하여 구현 실패를 체계적으로 처리합니다.
진입 조건: 수정 시도가 실패하거나 3회 연속 실패가 발생한 경우.
실패 처리 프로토콜 (Failure Handling Protocol)
stateDiagram-v2
[*] --> AttemptFix : "Implementation fails"
AttemptFix --> Verify
Verify --> Success : "Fix works"
Verify --> Failure : "Still broken"
Failure --> CountFailures : "Increment failure count"
CountFailures --> Continue
Continue --> AttemptFix : "Try different approach"
OracleAdvice --> CanResolve : "Oracle found solution"
OracleAdvice --> CannotResolve : "Oracle cannot resolve"
CanResolve --> AttemptFix : "Try Oracle's approach"
CannotResolve --> AskUser : "ASK USER before proceeding"
Success --> [*]
AskUser --> [*]
실패 복구 상태 머신
출처: src/agents/sisyphus.ts L329-L346
수정 시도 규칙 (Fix Attempt Rules)
- 증상이 아닌 근본 원인을 수정하십시오.
- 모든 수정 시도 후에는 다시 검증하십시오. (
lsp_diagnostics실행) - 무작위 디버깅(shotgun debug)을 하지 마십시오. (무언가 작동하기를 바라며 무작위로 변경하는 행위)
출처: src/agents/sisyphus.ts L332-L335
3-스트라이크 프로토콜 (3-Strike Protocol)
3회 연속 실패 후에는 다음을 수행합니다.
- 중단(STOP): 즉시 모든 추가 수정을 중단합니다.
- 되돌리기(REVERT): 마지막으로 확인된 정상 상태로 돌아갑니다. (
git checkout/ 수정 취소) - 문서화(DOCUMENT): 시도한 내용과 실패한 내용을 기록합니다.
- 상담(CONSULT): 전체 실패 컨텍스트와 함께
oracle에이전트를 호출합니다. - 사용자에게 질문(ASK USER): Oracle이 해결할 수 없는 경우 진행하기 전에 사용자에게 묻습니다.
절대 금지 사항:
- 코드를 깨진 상태로 두는 것
- 작동하기를 바라며 계속 진행하는 것
- “통과”시키기 위해 실패하는 테스트를 삭제하는 것
출처: src/agents/sisyphus.ts L337-L345
Phase 3: 완료 (Completion)
목적: 최종 응답을 전달하기 전에 모든 작업이 완료되고 깨끗하며 요구 사항을 충족하는지 확인합니다.
진입 조건: 계획된 모든 작업이 완료되었거나 사용자가 상태를 요청한 경우.
완료 체크리스트 (Completion Checklist)
flowchart TD
Start["Phase 3 Entry"]
CheckTodos["Check all todo items"]
TodosComplete["All todos<br>marked completed?"]
IncompleteTodos["Identify incomplete work"]
CheckDiagnostics["Run lsp_diagnostics<br>on changed files"]
ReturnPhase2B["Return to Phase 2B"]
DiagClean["Diagnostics clean?"]
FixIssues["Fix issues caused<br>by your changes"]
CheckBuild["Check if build command exists"]
BuildExists["Build command<br>exists?"]
RunBuild["Run build"]
CheckRequest["Verify user request<br>fully addressed"]
BuildPasses["Build passes?"]
FixBuildFailures["Fix build failures"]
RequestMet["Request fully<br>addressed?"]
ReturnPhase2B2["Return to Phase 2B"]
CancelBg["background_cancel(all=true)"]
DeliverResponse["Deliver final response"]
End["[*]"]
Start -.-> CheckTodos
CheckTodos -.->|"Yes"| TodosComplete
TodosComplete -.->|"No"| IncompleteTodos
TodosComplete -.-> CheckDiagnostics
IncompleteTodos -.->|"No"| ReturnPhase2B
CheckDiagnostics -.-> DiagClean
DiagClean -.->|"Yes"| FixIssues
DiagClean -.-> CheckBuild
FixIssues -.-> CheckDiagnostics
CheckBuild -.->|"Yes"| BuildExists
BuildExists -.->|"No"| RunBuild
BuildExists -.->|"Yes"| CheckRequest
RunBuild -.->|"No"| BuildPasses
BuildPasses -.-> FixBuildFailures
BuildPasses -.-> CheckRequest
FixBuildFailures -.-> RunBuild
CheckRequest -.->|"Yes"| RequestMet
RequestMet -.->|"No"| ReturnPhase2B2
RequestMet -.-> CancelBg
CancelBg -.-> DeliverResponse
DeliverResponse -.-> End
완료 검증 흐름
출처: src/agents/sisyphus.ts L349-L365
완료 기준 (Completion Criteria)
다음 조건이 충족되면 작업이 완료된 것입니다.
- 계획된 모든 할 일 항목이 완료로 표시됨
- 변경된 파일에 대한 진단 결과가 깨끗함
- 빌드가 통과함 (해당하는 경우)
- 사용자의 원래 요청이 완전히 처리됨
출처: src/agents/sisyphus.ts L352-L355
검증 실패 처리 (Verification Failure Handling)
검증이 실패할 경우:
- 본인의 변경으로 인해 발생한 문제를 수정하십시오.
- 요청받지 않는 한 기존에 존재하던 문제는 수정하지 마십시오.
- 보고: “완료되었습니다. 참고: 제 변경 사항과 무관한 N개의 기존 린트(lint) 에러가 발견되었습니다.”
출처: src/agents/sisyphus.ts L357-L360
최종 정리 (Final Cleanup)
최종 답변을 전달하기 전에:
- 실행 중인 모든 백그라운드 작업을 취소하십시오:
background_cancel(all=true) - 이는 리소스를 절약하고 깨끗한 워크플로우 완료를 보장합니다.
출처: src/agents/sisyphus.ts L362-L364
단계 실행 컨텍스트 (Phase Execution Context)
전체 워크플로우는 src/agents/sisyphus.ts L6-L526에 있는 Sisyphus 에이전트 시스템 프롬프트에 포함되어 있습니다.
src/agents/sisyphus.ts L528-L544의 createSisyphusAgent 팩토리 함수는 다음 설정을 사용하여 에이전트를 인스턴스화합니다.
- 기본 모델(Default Model):
anthropic/claude-opus-4-5 - 모드(Mode):
primary(메인 오케스트레이터) - 최대 토큰(Max Tokens): 64000
- 생각 예산(Thinking Budget): 32000 토큰 (Claude 모델용) 또는
reasoningEffort: "medium"(GPT 모델용) - 색상(Color):
#00CED1(UI 식별용 시안색)
에이전트 구성에는 모델별 설정을 위한 조건부 로직이 포함되어 있습니다. Claude 모델은 thinking: { type: "enabled", budgetTokens: 32000 }을 수신하고, GPT 모델은 reasoningEffort: "medium"을 수신합니다.
환경 컨텍스트(현재 날짜, 시간, 시간대, 작업 디렉토리, 플랫폼)는 src/agents/utils.ts L32-L63의 createEnvContext()를 통해 Sisyphus의 프롬프트에 자동으로 주입됩니다.
출처: src/agents/sisyphus.ts L528-L546 src/agents/utils.ts L32-L63 src/agents/utils.ts L99-L102