프로젝트 08. 내 워크플로우를 그래프로 그리기
관련 강의: L14. 단일 루프에서 그래프 엔지니어링으로
무엇을 할 것인가
이것은 "Loop"에서 "Graph"로 도약하는 프로젝트입니다. 지난 강의에서 maker-checker loop을 만들었습니다 — 구현, 검증, 피드백, 재구현, 모든 결정이 같은 agent의 컨텍스트 창 안에서 일어났습니다. 이번 강의에서 할 일은, 루프 안에 숨어 있던 구조를 명시적으로 그려내는 것입니다: 노드, 엣지, 공유 상태, 라우팅 규칙을 한 글자 한 글자 명확히 씁니다.
세 가지를 차례로 실험할 것입니다: 먼저 P07의 maker-checker loop을 명시적 그래프로 그리고, 그래프에 병렬 fan-out/fan-in 노드를 추가하고, 마지막으로 조건부 롤백 엣지와 인간 승인 노드를 추가합니다. 끝나면 직접 체감하게 될 것: 그래프는 새 발명이 아니라, 당신의 loop이 어느 정도 복잡해지면 스스로 변하는 모습입니다.
어떤 도구를 사용할 것인가
- Claude Code 또는 Codex
- Git
- P07에서 만든 maker-checker loop (또는 반복해서 돌릴 수 있는 아무 agent 워크플로우)
- 텍스트 편집기 또는 그리기 도구 (그래프를 그리는 것은 예쁘게 하려는 것이 아니라, 구조를 명확히 쓰려는 것입니다;
mermaid또는 손으로 쓰는graph.md모두 가능)
구체적 단계
준비 작업
- P07 완료 후의 저장소에서 출발하거나, 지금 돌고 있는 아무 agent 워크플로우를 그대로 사용하세요.
- 세 개의 브랜치를 만드세요:
p08-explicit-graph,p08-parallel,p08-human-in-the-loop. - 공유 상태 파일로
state.md를 준비하세요: 요구사항, 진행 상황, 검증 결과를 모두 여기에 씁니다. 이것이 그래프의 "공용 작업대"입니다.
실험 1: Loop을 명시적 그래프로 그리기
p08-explicit-graph 브랜치로 전환하세요.
- 모든 노드 나열: P07 maker-checker loop의 매 단계를 노드 하나로 쓰세요. 각 노드에 명확히 쓰세요: 책임, 입력, 출력, agent인지 결정적 코드인지.
- 모든 엣지 그리기: 노드 사이의 모든 엣지를 나열하세요. 두 개의 특수 엣지를 중점적으로 표시하세요:
- 조건 엣지: 검증 통과/실패, 어느 쪽으로 가는지
- 롤백 엣지: 실패 시 어느 노드로 돌아가는지
- 공유 상태 쓰기: 상태에 어떤 필드가 있는지(요구사항, 코드, 테스트 결과, 검토 결론) 명확히 나열하고, 누가 읽고 누가 쓰는지 표시하세요.
- 라우팅 규칙 쓰기: 가장 단순한 if-then 언어로 "다음에 어디로 갈지"를 적으세요. 예:
if 검증 통과 → 병합 노드 if 검증 실패 → 구현 노드 if 구현 노드 정보 부족 → 연구 노드 graph.md로 작성: 위 내용을 하나의 문서로 정리하세요. mermaid로 그래프를 그리고, 노드 표와 라우팅 규칙을 함께 넣으세요.- 이 질문에 답하기: 그리고 나서, 적어도 한 개의 원래 암묵적이던 엣지를 찾으세요 — 예전에 agent 컨텍스트 안에 숨어 있어서 당신 자신도 그 존재를 몰랐던 결정 경로.
실험 2: 병렬 Fan-out / Fan-in 노드 추가
p08-parallel 브랜치로 전환하세요.
- 병렬화할 수 있는 지점 고르기: 작업에서 두 개의 독립적인 부분으로 쪼갤 수 있는 곳을 찾으세요. 예:
- 구현을 두 개의 독립 모듈로 쪼개어 두 agent가 병렬로 작성
- 검증을 두 개의 독립 검토로 쪼개기: 하나는 테스트와 lint 실행, 하나는 코드 리뷰 (다른 지시, 다른 관심사)
- 연구를 두 방향으로 쪼개어 두 agent가 각자 한 가지를 조사
- fan-out 규칙 쓰기: 공유 상태에 "이 작업이 N개의 병렬 서브태스크로 쪼개졌다"를 기록하고, 각 서브태스크는 독립적인 context, 독립적인 노드를 가집니다.
- fan-in 규칙 쓰기: 모든 서브태스크가 끝난 뒤, 누가 결과를 병합할까요? 병합 기준은 무엇인가요(예: 두 검토가 모두 통과해야 병합, 아니면 하나만 통과해도 됨)?
- worktree로 격리: 각 병렬 서브태스크를 독립적인 git worktree에서 돌려, 파일 충돌을 물리적으로 방지하세요(13강의 Worktree 원시를 다시 보세요).
- 한 번 실행해 기록: 병렬 전후의 wall-clock 시간, token 소비, 결과 품질을 기록하세요. 병렬이 정말로 더 빨랐나요? 아니면 조정 오버헤드가 절약한 시간을 먹었나요?
실험 3: 롤백 엣지와 인간 승인 노드 추가
p08-human-in-the-loop 브랜치로 전환하세요.
이것은 세 실험 중 가장 중요합니다. 그래프에 두 종류의 노드를 추가할 것입니다:
- 조건부 롤백 엣지: 검증 노드에 "부분 통과" 경로를 추가하세요 — 전부를 구현 노드로 되돌리는 것이 아니라, 구체적 피드백을 담고 문제가 생긴 그 노드로 돌아갑니다. 예: 테스트는 전부 통과했지만 코드 리뷰가 요구사항 이해 오류를 발견했다면, 구현 노드가 아니라 연구 노드로 롤백합니다. 이러려면 공유 상태에 "문제가 어느 층에서 생겼는지"를 기록해야 합니다.
- 인간 승인 노드(Human-in-the-loop): 병합 노드 앞에 인간 노드를 추가하세요. 여기까지 오면 그래프는 멈추고, 당신이
state.md에 "승인" 또는 "반려"를 쓰기를 기다립니다. 승인 노드는 타임아웃 규칙을 가질 수 있습니다: N시간 후 응답이 없으면 자동 반려 또는 자동 상위로 승격. - interrupt의 형식 쓰기: 승인 요청을 어떻게 명확히 쓰는지 — 무슨 일이 일어났는지, 무엇이 바뀌었는지, 왜 사람이 필요한지, 승인/반려의 결과가 각각 무엇인지.
- 완전한 흐름을 적어도 2라운드 돌리기: 매 라운드마다 인간 승인 노드까지 가고, 당신이 직접 한 번 승인하고 한 번 반려하세요. 기록하세요: 당신의 승인 결정과 검증 노드의 판단이 일치했나요? 승인 노드가 검증 노드가 막지 못한 어떤 것을 막았나요?
결과를 어떻게 측정할 것인가
| 지표 | 실험 1 (명시적 그래프) | 실험 2 (병렬) | 실험 3 (인간-기계 협력) |
|---|---|---|---|
| 구조 가시성 | 암묵적 엣지를 몇 개 찾았나? | 공유 상태가 병렬 서브태스크를 지원할 수 있나? | 롤백 엣지가 문제 층을 정확히 찾을 수 있나? |
| 실패 위치 파악 | 실패 시 어떤 엣지가 잘못됐는지 바로 지적할 수 있나? | 병렬 서브태스크 실패 시, 어느 것인지 특정할 수 있나? | 승인 반려 시, 어느 층의 문제인지 지적할 수 있나? |
| 협력 오버헤드 | 그래프를 쓰는 데 얼마나 걸렸나? | 병렬로 절약한 시간 vs 조정 오버헤드 | 승인 대기 시간 vs 막아낸 문제의 가치 |
| 관측 가능성 | 매 단계에서 무슨 일이 일어나는지 이제 보이나? | 각 병렬 서브태스크의 상태가 보이나? | 승인 요청이 충분히 명확하게 쓰였나? |
| 신뢰성 | 그래프 설명과 실제 실행이 일치하나? | fan-in 병합 기준이 신뢰할 만하나? | 타임아웃/승격 규칙이 정말로 발동하나? |
무엇을 제출할 것인가
graph.md(실험 1의 완전한 그래프 설명: mermaid 그래프 + 노드 표 + 엣지 표 + 공유 상태 필드 + 라우팅 규칙)- 실험 1에서 찾은 암묵적 엣지 목록(적어도 하나)
- 실험 2의 fan-out/fan-in 규칙과 병렬 실행 기록 한 번(시간/비용/품질 비교)
- 실험 3의 롤백 엣지 규칙, 승인 노드 형식, 2라운드 인간-기계 협력 기록
- 최종 회고: loop에서 graph로, 당신의 작업 방식이 어떻게 바뀌었나요? 어떤 작업이 그래프를 그릴 가치가 있고, 어떤 것은 아닌가요?
관련 강의
- Lecture 14 — 단일 루프에서 그래프 엔지니어링으로
- Lecture 13 — 수동 프롬프팅에서 자율 루프로(당신의 loop은 그래프의 한 노드입니다; 이 프로젝트는 노드의 내부 구조를 펼쳐 보는 것입니다)
- Lecture 09 — 왜 에이전트는 너무 일찍 완료를 선언하는가(검증 노드가 왜 구현 노드와 독립이어야 하는지, 그래프에서는 구조 문제입니다)
- Lecture 11 — 왜 관찰 가능성은 하네스 내부에 속하는가(그래프가 복잡할수록, 각 노드가 무엇을 하는지 볼 필요가 커집니다)