이벤트 루프

도구에서 무언가 일어날 때 실행되는 루프입니다. 풀 리퀘스트가 열리고, 이슈가 배정되고, 라벨이 붙을 때. 자동 코드 리뷰의 정체가 바로 이것 — 여러분의 것이고, 다시 쓸 수도 끌 수도 있는 루프입니다.

이벤트 루프는 연결해 둔 도구에서 무언가 일어날 때 실행됩니다. 주기 설정도, 배정 절차도, 프롬프트를 치는 사람도 없습니다. 풀 리퀘스트가 열리면 누가 탭을 바꾸기도 전에 리뷰가 이미 진행 중입니다.

이 루프의 지시문은 이벤트가 이미 담고 있는 정보 위에 얹는 상시 지침입니다. 고블린에게 머지 리퀘스트나 이슈는 자동으로 맥락으로 주어지고, 지시문은 그에 대해 여러분이 무엇을 원하는지 알려 줍니다.

루프를 걸 수 있는 이벤트

이벤트 출처 실행 시점
머지 리퀘스트 열림 GitLab MR이 열리거나 다시 열리거나 새 커밋으로 갱신될 때
이슈 배정 GitLab 이슈가 @taskgoblin 봇에 배정될 때
풀 리퀘스트 열림 GitHub PR이 열리거나 다시 열리거나 새 커밋으로 갱신될 때
이슈 라벨 GitHub 이슈에 taskgoblin 라벨이 붙을 때
이슈 배정 Linear 이슈가 TaskGoblin 에이전트에 배정될 때
이슈 배정 Jira 이슈가 TaskGoblin 계정에 배정될 때

"열림" 계열 이벤트가 갱신까지 포함하기 때문에, 리뷰 루프는 반복이 아니라 대조를 합니다. 두 번째 차례에는 지난번 남긴 지적을 읽고, 여러분이 고친 것은 해결 처리하고, 정말 새로운 것만 올립니다.

이미 가지고 있는 루프

빈 페이지에서 시작하지 않습니다. 어떤 제공사가 조직에 존재하는 순간, TaskGoblin이 그 제공사의 기본 루프를 설치합니다.

  • GitLab머지 리퀘스트 리뷰, 배정된 이슈 처리.
  • GitHub풀 리퀘스트 리뷰, 라벨 붙은 이슈 처리.
  • Linear배정된 이슈 처리.
  • Jira배정된 이슈 처리.

상자에서 막 꺼낸 코딩 에이전트에 사람들이 기대하는 동작을 그대로 재현한 것입니다. 다른 점은 그것이 여러분의 것이라는 사실입니다. Loops 페이지에 실재하는 루프이고, 지시문을 읽고 바꿀 수 있습니다.

설치는 딱 한 번, 영구적으로 일어납니다. 기본 루프를 지우면 지워진 채로 남습니다 — 제공사를 다시 연결해도 조용히 되살아나지 않습니다.

지시문을 다시 쓰는 것이 핵심입니다

기본 리뷰 지시문은 정확성, 보안, 유지보수성을 요구하고, 변경이 타당하면 조용히 있으라고 말합니다. 합리적인 출발점이지 묶여 있어야 할 정책이 아닙니다. 팀들은 흔히 이를 좁히거나 넓힙니다.

  • "보안 문제와 데이터 손실 위험만 짚어 줘. 그 외에는 아무것도."
  • "테스트 커버리지에 엄격하게 — 동작이 바뀌면 반드시 테스트가 필요하고, 없으면 말해 줘."
  • "새 엔드포인트가 우리 레이트 리미팅 미들웨어를 거치는지도 확인해 줘."

지시문은 자유 텍스트라서 린터가 담지 못하는 것을 담습니다. 우리 팀의 관례, 지난 장애, 이 팀이 자꾸 반복하는 실수.

기본값, 그리고 그것을 강화한 버전

기본으로 제공되는 것은 이렇습니다.

이 머지 리퀘스트를 리뷰하세요. 정확성, 보안, 유지보수성에 집중하고 — 린터가 잡을 스타일 지적이 아니라 진짜 문제를 짚으세요. 가치가 있는 곳에만 인라인 코멘트를 남기고, 구체적이고 실행 가능하게 쓰며, 변경이 타당하면 조용히 있으세요.

의도적으로 절제되어 있습니다. 모든 것에 코멘트하는 리뷰어는 결국 음소거되기 때문입니다. 다음은 어떤 팀이 한 달을 함께 지내고 장애를 한 번 겪은 뒤의 같은 루프입니다.

이 머지 리퀘스트를 정확성, 보안, 유지보수성 관점에서 리뷰하세요. 스타일 지적이 아니라 진짜 문제를 짚으세요.

추가로 항상 확인할 것: 동작이 바뀌는 변경에는 테스트가 있는가. 새 엔드포인트가 레이트 리미팅 미들웨어 없이 나가지 않는가. 기존 마이그레이션 파일을 수정하지 않는가. 요청 본문 전체를 로그에 남기지 않는가. 나머지 변경이 괜찮더라도 이런 항목은 치명적으로 올리세요.

MR이 400줄을 넘으면 요약에 그 사실을 적고, 전부 훑는 대신 위험도가 높은 파일부터 리뷰하세요. 변경이 타당하면 조용히 있으세요.

두 번째 버전에 특별한 것은 없습니다. 아무도 열지 않던 위키에 있던 조직의 지식이 정작 필요한 순간에 붙어 있게 된 것뿐입니다. 물려받은 루프와 내 것인 루프의 차이가 여기에 있습니다.

정지 스위치

이 부분은 두 번 읽을 가치가 있습니다. 그러지 않으면 버그처럼 보일 동작을 설명하기 때문입니다.

루프가 관장하는 이벤트에 일치하는 활성 루프가 없으면 아무 실행도 시작되지 않습니다. 리뷰 루프를 일시정지하면 머지 리퀘스트는 리뷰되지 않습니다. 삭제해도 마찬가지입니다. TaskGoblin은 웹훅을 계속 받지만, 근거로 삼을 상시 지시문이 없으니 고블린은 깨어나지 않고 과금도 없습니다.

동작이 여러분에게 가해지는 것이 아니라 여러분의 것이 된 대가입니다. 자동 리뷰가 멈췄다면 가장 먼저 볼 곳은 그 루프가 아직 활성인지입니다.

결코 루프 관장 대상이 아닌 것

사람이 명시적으로 요청한 것은 루프가 있든 없든 항상 실행됩니다.

  • 머지 리퀘스트, 풀 리퀘스트, 이슈 코멘트에서의 @taskgoblin 멘션
  • Slack이나 Microsoft Teams에서의 메시지나 멘션
  • 고블린이 이미 작업 중인 Linear 이슈의 후속 코멘트
  • Jira 이슈 코멘트에서의 멘션
  • 자기가 남긴 리뷰 코멘트에 @taskgoblin fix 로 답하기

사람이 직접 물었다면 고블린은 답합니다. 루프가 다스리는 것은 요청되지 않은 일뿐입니다.

여러 루프가 일치할 때

같은 이벤트에 루프를 여러 개 돌려도 됩니다. 일반 리뷰 루프에 더해 보안용으로 더 엄격한 루프를 두는 식입니다. 하나의 이벤트가 여럿과 일치하면 고블린에게 후보 지시문이 모두 제시되고, 고블린이 어느 것이 해당하는지 판단해 그 선택을 실행에 기록합니다. 기록이 정직하게 남도록 하기 위함입니다. 작업 자체는 여전히 단일 실행입니다. 루프가 늘어난다고 한 머지 리퀘스트에 중복 리뷰가 쌓이지는 않습니다.

다음에 볼 것

  • 일정 루프 — 어떤 이벤트도 알려 주지 않는 일을 위한 다른 트리거.
  • 통합 연결하기 — 어떤 제공사에 루프를 걸 수 있고 각각 무엇이 열리는지.
  • 일회성 실행 — 루프를 완전히 우회하는 직접 요청.