agent-notify
승인 질문을 놓쳐 작업이 몇 시간씩 멈춰 있곤 했다. 알림 배너가 사라져도 대기 목록은 남게 만들었다.
개인 · 설계 및 구현26.07 –
Python · Swift · launchd · GitHub Actions
Problem
AI 도구를 터미널 여러 개에서 동시에 돌리면 진짜 손실은 다 끝난 걸 늦게 아는 게 아니다. 중간에 “이거 해도 됩니까” 하고 물어본 걸 못 보고 지나쳐서 작업이 몇 시간씩 멈춰 있는 것이다. macOS 알림 배너는 8초면 사라진다. 그리고 사라진 배너는 되돌릴 방법이 없다. 다른 창을 보고 있었거나 자리를 비웠으면 그 질문은 없었던 일이 된다. 더 나쁜 건 시스템이 그걸 “처리했다”고 여기지도 않는다는 점이었다. 한때 확인하지 않은 알림이 902건 쌓여 있었는데, 그중 842건은 내가 직접 알리지 말라고 꺼 둔 것들이었다. 화면에 뜬 적이 없으니 눌러서 없앨 방법도 없는데 목록에서는 계속 대기로 세고 있었다.
Decision
- 알림 배너와 “아직 답 안 함” 상태를 완전히 분리했다. 배너는 눈길을 끄는 용도로만 쓰고, 실제 목록은 메뉴 막대에 남아 하나씩 눌러 없앨 때까지 사라지지 않는다. 배너는 전달 수단이지 상태를 저장하는 곳이 아니다.
- 배너를 더 오래 띄우는 쪽이 훨씬 간단한 해법이었다. 버렸다. 오래 사는 배너가 바로 메모리 83GB를 먹고 컴퓨터를 멈춰 세웠던 그 프로그램이라, 잘 보이게 만드는 값을 배너 수명으로 치르면 그 위험을 다시 사는 셈이다.
- 한 번에 지우기 버튼의 기본 동작을 “끝난 것만”으로 정했다. 답을 기다리는 질문까지 같이 지우는 버튼도 있지만 경고를 먼저 띄운다. 밀린 목록을 비우다가 정작 답해야 할 질문을 같이 날리면 이 도구가 막으려던 바로 그 상황이 벌어진다.
- 사람이 눌러야만 없어지는 목록에는 기한을 뒀다. 그리고 애초에 화면에 뜰 일이 없는 알림은 만들자마자 처리된 것으로 표시한다. 알리지 말라고 꺼 둔 것을 “확인 대기”로 기록하면 그 대기는 원리적으로 해소될 수가 없다.
- 특정 AI 도구 전용으로 만들지 않았다. 정해진 형식으로 신호만 보낼 수 있으면 어떤 프로그램이든 같은 알림 체계를 쓴다. 쓰는 도구는 계속 갈아타는데 그때마다 알림을 새로 만들 수는 없다.
Result
- 잘못 쌓여 있던 대기
- 902건 중 842건
- 알리지 말라고 직접 꺼 둔 알림이 “확인 대기”로 적재된 것이었다.
- macOS 배너 수명
- 8초
- 사라진 배너는 되돌릴 수 없다.
- 알림 보관 기간
- 30일
- 확인이 끝난 것만 지운다. 아직 답하지 않은 승인 대기는 기간과 상관없이 절대 지우지 않는다.
구성은 셋이다. 명령줄 도구가 알림을 받아 목록으로 관리하고, 메뉴 막대 앱이 그 목록을 항상 보이게 하고, 자리를 오래 비울 때는 Slack으로 넘긴다. 메뉴 막대 앱은 얇게 만들었다. 목록을 읽고 확인 버튼을 누르는 일만 하고, 무엇을 어떻게 처리할지는 전부 명령줄 도구가 정한다. 화면과 규칙이 각자 상태를 들고 있으면 둘이 어긋나는 건 시간 문제다.
알림에서 바로 그 터미널로 갈 수 있다. 어느 창에서 온 질문인지 기록해 두고, 목록에서 누르면 그 자리로 이동하면서 확인 처리까지 한다. 알림을 보고 나서 창을 찾아 헤매면 8초 배너를 고친 의미가 없다.
메모리 사고에서 배운 것도 코드에 남아 있다. 이 도구가 띄운 배너 프로그램은 자기가 띄운 것만 골라서 끈다. 이름이 같다는 이유로 남의 프로그램을 끄지 않고, 번호가 재사용될 수 있어서 끄기 직전에 실행 경로를 한 번 더 확인한다. 처음 만든 버전은 이름만 보고 껐는데, 실제로 돌려 보니 전혀 다른 곳에 설치된 같은 이름의 프로그램이 대상으로 잡혔다.
테스트와 자동 검사를 붙여 두었다. 명령줄 도구는 단위 테스트로, 메뉴 막대 앱은 실제 macOS 환경에서 빌드가 되는지로 확인한다. 상시 켜 두는 도구라 조용히 망가지면 알아챌 방법이 없다.