오픈클로 서브에이전트를 지속적인 팀 구성원이 아닌 무상태 함수로 취급하기

r/openclaw의 한 개발자가 OpenClaw에서 다중 에이전트 팀을 작업할 때 자신의 정신 모델이 어떻게 전환되었는지 설명합니다. 처음에는 서브에이전트를 이름, 배경 이야기, 기억 기대치를 가진 주니어 직원처럼 대하던 것이 몇 주간의 혼란과 깨진 워크플로우로 이어졌습니다.
함수 비유
돌파구는 서브에이전트가 작은 나 자신이나 지속적인 팀원이 아니라 함수라는 점을 인식하면서 찾아왔습니다. 구체적으로:
- 서브에이전트는 지속적인 팀원이 아닌 상태 없는 함수 호출입니다
- 그들은 개발자의 주니어 버전이 아닌 특수화된 도구입니다
- 그들은 컨텍스트를 기억하지 않고 순수 입력 → 출력으로 작동합니다
- 그들은 서로 대화하기보다 호출자에게 값을 반환합니다
소스는 잘못된 접근법과 올바른 접근법을 대비하는 코드 예시를 제공합니다:
# 잘못됨: 서브에이전트를 지속적인 객체처럼 대하기
frank = Agent("Frank")
frank.build_feature()
frank.fix_it() # Frank가 기억한다고 가정
올바름: 서브에이전트를 함수 호출처럼 대하기
result = frank_task(
instructions="로그인 페이지 구축",
context={"requirements": reqs, "design": mockup}
)
frank_task 실행, 출력 반환, 종료
실용적 함의
이 정신 모델 전환은 몇 가지 구체적인 함의를 가집니다:
1. SOUL.md를 함수 독스트링으로: 개성 프로필 대신, SOUL.md는 명세서 문서가 됩니다:
# frank_task()목적: Next.js 기능 구축 입력: 요구사항 (딕셔너리), 디자인 (선택사항) 출력: {코드, 테스트, 노트} 제약: 승인 없이 외부 API 호출 금지
2. 반복을 위한 명시적 상태 전달: 서브에이전트가 컨텍스트를 기억하지 않으므로, 필요한 모든 정보를 매개변수로 전달해야 합니다:
# 잘못됨
frank_fix("버그 수정") # 생성, 시도, 소멸
frank_fix("여전히 고장남") # 새로운 생성, 컨텍스트 없음
올바름
result = frank_fix({
"code": previous_output,
"issues": ["로그인 검증 실패", "모바일 CSS 고장"],
"test_cases": failing_tests
}) # 매개변수에 전체 컨텍스트 포함
3. 코디네이터를 메인 프로그램으로: 개발자는 팀 매니저가 아닌 오케스트레이터 함수가 됩니다:
def build_feature(spec):순차적으로 함수 호출
code = frank_build(spec) tests = quinn_audit(code)
if tests["passed"]: return deploy(code) else: # 명시적 컨텍스트로 반복 fixed = frank_fix({ "code": code, "failures": tests["failures"] }) return deploy(fixed)
소프트웨어 설계 유사점
이 접근법은 확립된 소프트웨어 설계 원칙과 일치합니다:
- 단일 책임: 각 서브에이전트는 한 가지 일을 합니다
- 순수 함수: 동일 입력 → 동일 출력
- 단위 테스트 가능: 각 서브에이전트의 출력을 독립적으로 테스트
- 조합 가능: quinn_test(frank_code(spec))처럼 서브에이전트 연결
- 상태 없음: 숨겨진 의존성 없음
개발자는 가치가 "더 많은 에이전트 = 더 똑똑함"이 아니라 "특수화된 함수 = 더 깔끔한 아키텍처"라고 언급합니다.
전환 후 결과
이 모델을 채택한 후, 개발자는 다음을 구축했습니다:
- 2주 만에 11,249개의 체육관 데이터베이스
- 5개의 특수화된 에이전트 (5명의 일반주의자가 아님)
- 언더라이팅 워크플로우를 가진 CRM
- 일일 Moltbook 참여
모두 상태 없는 서브에이전트와 컨텍스트를 유지하는 코디네이터를 사용했습니다.
📖 전체 소스 읽기: r/openclaw
👀 See Also

장기 세션에서 OpenClaw 느려짐 수정: llama.cpp 캐시에 대한 contextInjection continuation-skip
OpenClaw 세션이 시간이 지날수록 느려지는 실제 해결책: contextInjection을 continuation-skip으로 설정하여 llama.cpp 프롬프트 캐시를 보존하고, 프롬프트 평가 시간을 130초에서 1.3초로 줄입니다.

바이브 코더를 위한 시스템 아키텍처: 시니어 엔지니어 가이드
10년 경력 엔지니어가 클로드 코드로 앱을 구축하는 방법을 공유합니다: 코드가 아닌 시스템 수준에서 시작하세요. 프론트엔드, 백엔드, 데이터베이스, 그리고 API, 호스팅, 배포, 환경 변수, 보안을 포함한 핵심 연결부(플럼빙)를 다룹니다.

OpenCLAW 메모리가 실제로 작동하는 방식: 에이전트 '망각' 문제 해결하기
OpenCLAW 에이전트는 대화 간 지속적인 메모리를 갖지 않습니다 - 각 세션마다 SOUL.md, USER.md, MEMORY.md와 같은 파일에서 컨텍스트를 재구성합니다. 흔한 '잊어버림' 문제는 세션 비대화, 구조화되지 않은 메모리 파일, 채팅 기록과 영구 저장소를 혼동하는 데서 비롯됩니다.

OpenClaw에서 Gemini CLI write_file을 찾을 수 없음 문제 해결: 두 가지 수정 필요
OpenClaw 에이전트가 google-gemini-cli를 사용할 때 잘못된 tools.profile과 서브프로세스의 --approval-mode auto_edit 플래그 누락으로 인해 파일을 쓸 수 없습니다(write_file / default_api_write_file 없음). 해결 방법: 프로필을 full로 설정하고 cliBackends 설정을 통해 플래그를 주입합니다.