원본 글 Anthropic의 Effective harnesses for long-running agents를 보고 정리한 내용.
feature_list.json / Write init.sh / Write claude-progress.txt / Initial commitclaude-progress.txtinit.sh 스크립트와 claude-progress.txt 파일과 최초의 git commit이 무엇이 추가 되어야 하는지를 보여줌. 즉, 이러한 초기 구성을 제공하는 것이 역할이다.여기서 찾을 수 있는 핵심은 에이전트가 새로운 컨텍스트 윈도우에서 작업 상태를 빠르게 이해하도록 하는 것이다. 이때 claude-progress.txt 파일을 이용하고 부가적으로 git history를 이용한다.
Claude 4 프롬프팅 가이드를 참고..
베스트 프랙티스 사례에서도 최초 프롬프트는 향후 에이전트들이 효율적으로 일할 수 있도록 환경을 구성하도록 한다. 이러한 구성요소는 무엇이 있는가?
{
"category": "functional",
"description": "New chat button creates a fresh conversation",
"steps": [
"Navigate to main interface",
"Click the 'New Chat' button",
"Verify a new conversation is created",
"Check that chat area shows welcome state",
"Verify conversation appears in sidebar"
],
"passes": false
}
에이전트는 절대 이 파일을 수정할 수 없다. 가능한 부분은 passes 뿐이다. 다음과 같은 프롬프트가 사용되어야 한다.
| “It is unacceptable to remove or edit tests because this could lead to missing or buggy functionality.”
JSON이 마크다운 파일보다 부적절한 수정이 이루어질 확률이 더 낮은 결과를 보여주었다.
Incremental progress
초기 환경 스캐폴딩이 제공된 다음 각 반복에서 coding agent는 한 번에 한 기능을 담당하여 개발하게 된다. 이러한 단계적인 접근 방식이 에이전트가 한 번에 너무 많은 일을 하려는 것을 방지하는데 매우 중요한 역할을 한다.
한 번 이렇게 단계적으로 수행하게 되면, 모델이 코드를 수정한 뒤 환경을 Clean state로 남겨두는 것이 매우 중요해진다.
이러한 행동을 유도하는 가장 좋은 방법은 모델에게 수행한 내용을 기반으로 git commit을 하게 하고, claude-progress.txt 파일에 한 내용을 적게 하는 것이다. 이렇게 하면 모델이 git revert를 사용하여 나쁜 코드 변경을 제거하고 작업 상태를 회복시킬 수 있다.
이런 명확한 기록이 에이전트가 이전에 발생한 일들을 추측하지 않아도 되기 때문에 매우 유용하다.
Testing
최종적인 중요한 실패의 유형 중 하나는 Claude가 적절한 테스트 없이 기능을 완성했다고 표시하는 것이다. 명시적인 프롬프팅없이 Claude는 코드를 수정하고 단위 테스트나 cURL을 사용하여 테스트했지만, 이러한 기능이 전체적으로 제대로 작동하지 않는다는 사실을 인지하지 못하는 경우가 많았다.
Web App을 빌드하는 경우, 명시적으로 브라우저 자동화 도구를 사용하여 인간이 일으킬 수 있는 모든 행위들을 테스트하도록 프롬프트 작성했고 Calude는 거의 잘 수행했다.
Claude에게 이런 테스팅 도구를 제공하는 것은 성능을 극적으로 높일 수 있는 방법이다. 따라서 코드 외에도 이런 에러를 발견할 수 있는 방법이 제공되어야 한다.
(Puppeteer MCP Server 같은 것들.)
Claude의 시각적 능력이나 브라우저 자동화 도구가 애초에 버그를 발견하기 어렵게 되어 있는 경우는 여전히 한계이다.
예를 들어 Claude는 브라우저 네이티브 경고 모달을 Puppeteer MCP를 통해 볼 수가 없다.
그리고 이러한 모달에 의존하는 기능은 결과적으로 버그가 더 많이 발생하는 경향이 있었다.
위 모든 사항들이 충족되면, 모든 코딩 에이전트는 다음과 같은 일련의 문장들을 통해 실행되도록 프롬프트된다.
| Prompt | Description |
|---|---|
1. Run pwd to see the directory you’re working in. You’ll only be able to edit files in this directory. | 현재 작업 디렉토리를 확인하고 이곳의 파일만 수정하라. |
| 2. Read the git logs and progress files to get up to speed on what was recently worked on. | git logs와 Progress 파일을 확인하고 최근 발생한 일들에 대해 이해하라. |
| 3. Read the features list file and choose the highest-priority feature that’s not yet done to work on. | 기능 목록 파일을 읽고 현재 완료되지 않은 가장 높은 우선순위의 기능을 선택하라. |
이렇게 하면 에이전트가 코드를 어떻게 테스트해야하는지 알아내도 되지 않아서 토큰을 아낄 수 있다. 그리고 이런 방식은 Initializer agent가 개발 서버를 실행하기 위한 init.sh를 작성하거나 새 기능을 구현하기 전 기초적인 End-to-End 테스트를 해볼 수 있도록 돕는다.
예를 들어서 에이전트가 항상 로컬 개발 서버를 실행하고, Puppeteer MCP로 새로운 chat을 사용하도록 하고, 메세지를 보낸 뒤 응답을 확인하는 것들을 수행하게 한다. 이런 방식으로 Claude가 애플리케이션이 마지막으로 오류 상태에서 종료되었는지 체크할 수 있게 된다. 그리고 즉각적으로 존재하는 버그를 수정하게 한다.
만약 에이전트가 이런 행동을 하지 않고 새로운 기능을 개발하게 된다면, 문제를 더 심각하게 만들 수 있다.
이러한 점을 잘 보여주는 예시는 다음과 같다. 다음 어시스턴트 메세지를 출력하게 했다.
[Assistant] I'll start by getting my bearings and understanding the current state of the project.
[Tool Use] <bash - pwd>
[Tool Use] <read - claude-progress.txt>
[Tool Use] <read - feature_list.json>
[Assistant] Let me check the git log to see recent work.
[Tool Use] <bash - git log --oneline -20>
[Assistant] Now let me check if there's an init.sh script to restart the servers.
<Starts the development server>
[Assistant] Excellent! Now let me navigate to the application and verify that some fundamental features are still working.
<Tests basic functionality>
[Assistant] Based on my verification testing, I can see that the fundamental functionality is working well. The core chat features, theme switching, conversation loading, and error handling are all functioning correctly. Now let me review the tests.json file more comprehensively to understand what needs to be implemented next.
<Starts work on a new feature>
너무 유익한 정보입니다