tars 포커스 모드를 포커스 모드로 만들기
지난 글 끝에 포커스 모드는 실제 기능을 몇 개 만들어 봐야 쓸 만한지 안다고 적었다. 그 뒤 tars의 포커스 모드를 v0.43.0으로 릴리스했고 수정 세 건과 릴리스 세 번을 포커스 모드로 진행했다. 포커스 모드는 채팅 세션 하나를 계획, 구현, 리뷰, PR, PR 리뷰, 머지 단계로 보여 주고 사람은 승인 게이트 네 곳에서만 결정하는 콘솔 화면이다.
지시와 구현 나누기
에픽(여러 PR로 나눈 큰 작업)을 시작할 때 구현은 전부 tars가 하기로 정했다. 설계는 Claude Code 세션과 정리해서 내가 승인했고 그 세션이 단계별 작업 지시를 쓰고 게이트에 답하고 diff마다 리뷰어를 따로 붙였다. 구현은 개발용 tars 서버의 세션이 단계마다 격리된 git worktree에서 했다. tars는 claude-code-cli provider로 Claude를 부른다.
포커스 모드가 없던 첫 두 단계는 일반 채팅 세션으로 만들었고 그다음부터는 앞 단계까지 들어간 빌드로 서버를 띄워 포커스 파이프라인으로 돌렸다.
| PR | 내용 | 추가한 줄 | 만든 방식 |
|---|---|---|---|
| #1070 | 파이프라인 모델, 블록 파서, API | 3,998 | 채팅 세션 |
| #1072 | 콘솔 화면 | 4,885 | 채팅 세션 |
| #1075 | 서버가 돌리는 구현 반복, 카드별 질문 | 5,371 | 포커스 파이프라인 |
| #1076 | 리뷰 반복, 지적 한 장씩 분류 | 2,465 | 포커스 파이프라인 |
| #1077 | PR, CI 리뷰 반복, 머지 게이트 | 4,023 | 포커스 파이프라인 |
| #1073 | 릴리스 트레인, 파이프라인 그래프 | 2,824 | 포커스 파이프라인 |
| #1080 | v0.43.0 릴리스 | 17 | 릴리스 파이프라인 |
에픽 이슈는 10월 1일에 열어 18시간 뒤에 닫았다. 포커스 모드를 처음 담은 릴리스도 게이트를 거치는 파이프라인으로 냈다.
이슈 하나를 계획부터 머지까지 돌리기
이 글에 넣을 화면이 필요해서 지시 세션이 작업 하나를 녹화하며 다시 돌렸다. 끝난 파이프라인을 훑어보다가 보고 카드가 요약을 두 번 보여 주는 것을 찾았다. 제목은 요약 첫 줄을 120자에서 자른 것인데 본문에 요약 전체가 다시 나왔다.

이것을 #1109로 올리고 포커스 모드에는 이슈 번호와 제목 한 줄만 목표로 줬다. 머지까지 가도 된다는 것은 내가 미리 정했다.
전체 34분을 2분 45초로 줄인 영상이다. 게이트 구간은 실제 속도이고 기다리는 구간은 배속을 화면에 표시했다. 클릭은 지시 세션이 스크립트로 보냈고 서버, 에이전트, 저장소, CI, 머지는 실제다.
목표를 넣고 1분 뒤에 계획이 나왔다. 계획 게이트에는 완료 기준이 붙은 작업 세 개, 거칠 단계, 구현 턴이 끝날 때마다 서버가 실행할 검증 명령이 나오고 승인 전에 단계를 빼거나 명령을 고칠 수 있다. 이번에는 그대로 승인했다.

구현은 사람 없이 돌았다. 에이전트가 테스트와 함께 작은 함수를 만들어 카드에 연결했고 서버가 검증 명령 세 개를 실행해 통과한 것을 보고 리뷰 단계로 넘겼다. 여기까지 4분쯤 걸렸다. 수정을 알리는 보고 카드도 요약이 두 번 나왔는데, 그 카드를 보여 주는 서버가 아직 수정 전 빌드였기 때문이다.
리뷰 턴은 지적 두 개를 냈다. 지적은 한 장씩 나오고 실패 시나리오와 서버가 직접 뽑은 diff 발췌가 붙는다.

첫 번째는 수정 자체의 결함이었다. 요약 첫 줄이 공백 두 칸이나 CRLF로 끝나면 저장된 제목과 맞지 않아 요약이 다시 두 번 나온다. 두 번째는 함수만 테스트해서 나중에 컴포넌트를 고치다 되돌려도 테스트가 통과한다는 지적이었다. 둘 다 수정으로 보냈다. 수정 턴 한 번으로 둘을 고쳤고 검증에 브라우저 테스트 91개가 더해져 통과했으며 두 번째 리뷰에서는 지적이 없었다.
PR 게이트에서는 에이전트가 쓴 제목과 본문을 고칠 수 있다. 승인하자 에이전트가 브랜치를 올리고 #1111을 열었다. 서버는 체크 14개가 모두 통과할 때까지 PR을 조회하다가 머지 게이트를 열었다.

지시 세션이 화면 밖에서 diff(파일 8개, +96 −9)를 한 번 더 읽고 승인했다. 에이전트가 squash 머지를 했고 이슈가 닫혔으며 서버가 세션 worktree를 지웠다.
| 목표 입력부터 머지까지 | 34분 |
| 에이전트 턴 | 8번 |
| 결정 | 게이트 4곳에서 클릭 5번 |
| 리뷰 지적 | 2개, 모두 수정 |
| CI | 체크 14개 통과 |
| 모델 사용량 | tars가 API 단가로 계산한 값 12.66달러, 실제로는 구독 한도에서 차감 |
머지한 빌드로 서버를 바꾸고 같은 카드를 다시 열었다. 예전 버전이 저장한 카드도 저장된 제목을 기준으로 나누기 때문에 고쳐진 대로 나온다.

써 보면서 찾은 버그
단계마다 붙인 리뷰어가 구현 세션의 테스트를 통과한 결함을 찾았다. 첫 단계에서는 계획 승인과 세션 삭제가 락을 반대 순서로 잡아 서로 멈추는 문제와, 계획을 승인하지 않고 구현 단계로 넘어갈 수 있는 경로가 나왔다. 콘솔 화면 단계에서는 지적이 14개 나왔고 그중에는 대기 중인 프롬프트가 새로고침하면 사라지는 문제가 있었다.
v0.43.0 릴리스와 그다음 수정을 포커스 모드로 진행하면서 세 가지가 더 나왔다.
- 게이트가 열려 있는 동안 에이전트의 질문에 답하면 그 답이 저장만 되고 전달되지 않았다(#1079).
- 머지 게이트가 열린 뒤 PR에 새 커밋이 올라와도 게이트가 예전 커밋의 결과를 계속 보여 줬다. 그대로 승인하면 CI가 끝나지 않은 코드를 머지하게 된다(#1087).
- PR마다 SonarCloud 봇의 “Quality Gate passed” 코멘트가 지적 카드로 올라와 머지 전에 기각해야 했다(#1094).
셋은 포커스 파이프라인 두 개로 고쳤다. 에이전트가 PR을 열고 머지했으며 v0.43.1과 v0.43.2도 같은 방식으로 릴리스했다. 이번 작업에서는 봇 코멘트가 카드로 올라오지 않았다.
반복 횟수 제한도 실제로 걸렸다. PR 단계를 만든 파이프라인은 카드 32장 가운데 지적이 14장이었고 부하가 높은 맥에서 브라우저 테스트가 실패해 리뷰 단계가 막힘 상태로 끝났다.
운영 문제로 멈춘 시간이 더 길었다. 사람 없이 오래 돌리는 동안 맥이 잠자기에 들어갔고 백그라운드 작업으로 띄운 개발 서버는 시간제한에 걸려 종료됐으며 리뷰 단계에 남겨 둔 끝난 파이프라인이 서버를 올린 뒤에 검증 턴을 다시 시작했다.
확인한 것과 남은 것
이번 작업은 카드와 게이트만 보고 진행했고 Advanced 모드로 넘어가지 않았다. 계획, 지적 분류, PR 본문, 머지에 필요한 사실은 카드에 있었다. 머지 전 diff는 화면 밖에서 gh로 읽어야 했고, 머지 게이트에서 바뀐 내용을 바로 볼 방법은 아직 없다.
릴리스 트레인 화면은 이미 릴리스한 #1093과 #1096을 이번 #1111과 함께 “v0.44.1 이후 변경”으로 보여 줬다. 원인은 아직 확인하지 못했다.
포커스 모드는 v0.43.0부터 들어 있고 이번 수정은 main에 0.44.2로 올라가 있다. 설계 기록은 docs/decisions/focus-mode.md에 있고, tars.marvin-42.com에서 설치하거나 github.com/devlikebear/tars에서 소스를 받는다.