종료 알림은 불리언(Boolean)이 아니라 임대(Lease)입니다
요약
코딩 에이전트의 작업 종료 알림을 단순한 불리언 값이 아닌, 유효 기간이 있는 '임대(Lease)' 개념으로 모델링해야 함을 제안합니다. 이를 통해 불필요한 알림 소음을 방지하고 사용자 주의력을 효율적으로 관리하는 설계 패턴을 설명합니다.
핵심 포인트
- 알림 상태를 불리언이 아닌 수명이 있는 '임대'로 모델링하여 불필요한 알림 방지
- 스캐너와 리마인더 시스템을 분리하여 상태 정보와 새로운 정보의 혼동 방지
- 알림 전달 직전 현재 상태를 재검증하여 최신 컨텍스트 유지
- 고유한 전달 키(delivery key)를 통해 핸드오프 이벤트를 정확히 식별
코딩 에이전트가 한 턴을 마칩니다. 모니터가 알림을 예약합니다. 2초 후, 개발자는 이미 답장을 보냈습니다.
알림이 여전히 나타나야 할까요?
만약 완료 상태가 불리언 (Boolean) 값으로 저장된다면, 대답은 보통 '예'입니다. 알림은 '참(true)' 값으로부터 예약되었으며, 지연된 작업은 그 값에 의문을 제기할 이유가 없기 때문입니다. 그 결과, 기술적으로는 정확하지만 이미 쓸모없어진 알림이 생성됩니다.
우리는 완료 상태를 인간의 주의력(human attention)에 대한 짧은 수명의 임대 (Lease)로 모델링하는 것이 더 유용하다는 것을 발견했습니다. 이 임대에는 고유 식별자(identity), 신선도 경계(freshness boundary), 그리고 전달 전후에 사라질 수 있는 조건이 존재합니다.
탐지는 방해할 권리가 아닙
로컬 세션 스캐너(local session scanner)와 리마인더 시스템(reminder system)은 서로 다른 질문에 답합니다.
스캐너는 최신 유의미한 증거가 에이전트의 턴이 종료되었음을 나타내는지 묻습니다. 리마인더 시스템은 이것이 여전히 사용자를 필요로 하는 새로운 핸드오프 (handoff)인지 묻습니다.
이러한 분리는 시작 시점에 중요합니다. 완료된 트랜스크립트 (transcript)는 정확한 상태 정보일 수 있지만, 반드시 새로운 정보인 것은 아닙니다. 앱이 열릴 때 디스크에서 발견된 모든 완료 사항을 다시 재생한다면, 정확한 이력이 소음 섞인 알림으로 변할 것입니다.
따라서 Agent Island는 시작 시 발견된 완료된 턴들을 기준점(baseline)으로 설정합니다. 이들은 새로 생성된 방해 요소로 취급되지 않으면서도 상태 화면에 나타날 수 있습니다.
전달 시점에 상태를 재확인하십시오
로컬 세션 파일은 핸드오프 (handoff) 전후로 빠르게 변합니다. 사용자는 알림 지연 시간이 만료되기 전에 터미널로 돌아올 수 있습니다. 클라이언트는 또한 어시스턴트의 터미널 이벤트 이후에 장부 기록 데이터 (bookkeeping data)를 추가할 수도 있습니다.
리마인더는 짧은 지연과 함께 예약된 후, 현재 상태를 다시 검증합니다:
알림 활성화됨
+ 동일한 턴이 여전히 주의를 필요로 함
+ 턴이 확인(acknowledged)되지 않음
...
두 번째 확인이 중요한 부분입니다. 지연된 작업은 자신을 생성한 스냅샷 (snapshot)을 신뢰해서는 안 됩니다.
이 패턴은 코딩 에이전트 너머에도 적용됩니다. 가역적인 조건 (reversible condition)에 기반한 모든 알림은 사용자를 방해하기 직전에 해당 조건을 반드시 확인해야 합니다.
핸드오프(handoff)에 안정적인 식별자 부여하기
제공자(provider) 이름으로 중복을 제거하는 것은 범위가 너무 넓습니다. 하나의 Claude 세션은 여러 번의 턴(turn)을 마칠 수 있기 때문입니다. 최신 파일 타임스탬프(timestamp)를 기준으로 중복을 제거하는 것은 너무 좁습니다. 반복적인 스캔을 통해 동일한 턴이 관찰될 수 있기 때문입니다.
전달 키(delivery key)는 핸드오프를 식별할 수 있는 충분한 컨텍스트(context)를 가져야 합니다: 제공자(provider), 세션(session), 프로젝트(project), 트랜스크립트(transcript), 그리고 턴 식별자(turn identity)가 필요합니다. 해당 키가 반복적으로 관찰되면 하나의 이벤트로 간주합니다. 이후의 턴은 동일한 세션에 속하더라도 다른 키를 할당받습니다.
전달된(delivered) 키와 확인된(acknowledged) 키는 제한된 기간 동안 유지됩니다. 이를 통해 리마인더 레이어(reminder layer)가 영구적인 트랜스크립트 데이터베이스가 되지 않으면서도, 새로고침 시 오래된 알림이 다시 재생되는 것을 방지할 수 있습니다.
취소는 전달된 이후에도 작동해야 합니다
알림이 나타나기 전에 이를 방지하는 것은 오래된 상태(stale-state) 문제의 절반만 해결할 뿐입니다.
알림 패널이 이미 보이는 동안 사용자가 다른 창에서 답장을 보낼 수도 있습니다. 매 스캔마다 리마인더 레이어는 현재의 어텐션 키(attention keys)를 이전 세트와 비교합니다. 키가 사라지면, 대기 중인 작업을 취소하고 그에 해당하는 표시된 알림을 해제합니다.
UI는 더 이상 사실이 아닌 증거를 사용자에게 닫으라고 요청하는 대신, 소스 조건(source condition)을 따릅니다.
버스트(Bursts)는 여러 번의 이벤트보다 하나의 인간 이벤트인 경우가 더 많습니다
에이전트 워크플로(Agent workflows)는 몇 초 내에 여러 개의 자식 세션(child sessions)을 완료할 수 있습니다. 파일 시스템은 여러 번의 완료를 감지합니다. 실행을 감독하는 사람은 하나의 부모 워크플로(parent workflow)가 핸드오프(handoff)에 도달하는 것을 보게 됩니다.
모든 자식 완료 사항을 전달하는 것은 주의력(attention)이 아닌 이벤트 횟수를 최적화하는 방식입니다. 리마인더 레이어는 가장 최신의 관련 턴을 선택하고 나머지 버스트(burst)를 기준점(baseline)으로 삼습니다. 자식 세션의 트래픽이 메인 세션의 신호를 압도할 수 있으므로, 서브에이전트(subagent) 알림은 선택 사항(opt-in)으로 유지됩니다.
복귀 동작은 정직해야 합니다
유용한 알림은 제공자(provider), 프로젝트(project), 세션을 식별합니다. 알림의 동작(action)은 개발자를 해당 작업으로 다시 돌려보내야 합니다.
Claude CLI 세션의 경우, 알려진 세션 ID(session ID)를 터미널에서 재개할 수 있습니다. Claude Desktop은 동일한 정확한 대화 라우팅(exact-conversation routing) 계약을 노출하지 않습니다. 이 경우, 앱을 활성화하고 검색을 위해 세션 제목을 복사하는 것이, 부정확한 동작을 보장된 딥 링크(deep link)라고 라벨링하는 것보다 더 정직한 방식입니다.
플랫폼의 제한 사항은 버튼이 작동하지 않은 후의 각주가 아니라, 상호작용 디자인(interaction design) 단계에서 다뤄져야 합니다.
신호가 증명하지 못하는 것
"당신의 차례입니다"라는 메시지는 로컬 증거상 에이전트(agent)가 턴(turn)을 마쳤으며 여전히 응답이 필요하다는 것을 의미합니다. 이것이 생성된 코드가 정확하다거나, 작업이 완료되었다거나, 혹은 출력이 머지(merge)하기에 안전하다는 것을 의미하지는 않습니다.
그 경계가 알림을 유용하게 유지합니다. 모니터는 주의 상태(attention state)를 소유하며, 검증(verification)은 여전히 개발자의 몫입니다.
전체 설정 및 동작 가이드는 여기에서 확인할 수 있습니다: Get notified when Claude Code finishes.
Agent Island는 macOS 및 Windows용 오픈 소스입니다: source and releases.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기