여러 Claude Code 및 Codex 세션을 긴급도에 따라 순위를 매기는 방법
요약
Claude Code 및 Codex 세션이 여러 개일 때, 메뉴 바의 제한된 공간에 어떤 세션의 상태를 표시할지 결정하는 우선순위 알고리즘을 다룹니다. 단순 최신순이 아닌 실행 가능성(actionability)을 기준으로 세션을 분류하고 정렬하는 설계 원칙을 제안합니다.
핵심 포인트
- 단순 수정 시간(Recency) 대신 실행 가능성(Actionability)을 우선순위 기준으로 사용
- 미확인 사용자 필요 > 중단됨 > 작업 중 순으로 우선순위 할당
- 우선순위 정렬 후 동점자 처리 시에만 타임스탬프를 활용하여 결정론적 동작 유지
- 대표 아이콘 표시와 리마인더 큐(알림) 기능을 분리하여 설계
메뉴 바 모니터는 5개의 세션이 활성화되어 있더라도 단 하나의 Claude 또는 Codex 상태만을 표시할 공간이 있습니다. 이러한 제약은 UI의 세부 사항을 정책 문제로 전환합니다: 어떤 세션이 제공자(provider)를 대표해야 하는가?
보통 잘못된 답변은 가장 최근에 변경된 트랜스크립트(transcript)입니다. 수정 시간(Modification time)은 어떤 파일이 마지막으로 기록되었는지는 알려주지만, 어떤 세션이 사용자의 주의를 끌어야 하는지는 알려주지 않습니다.
백그라운드 워커(background worker)는 다른 스레드가 권한 요청 프롬프트에서 멈춘 후 일상적인 진행 상황을 추가할 수 있습니다. 최근에 확인된 핸드오프(handoff) 또한 형제 세션이 유용한 작업을 재개하는 동안 '사용자 필요(needs-you)' 상태로 남아 있을 수 있습니다. 만약 모니터가 최신순(newest-first)으로 작동한다면, 가치가 낮은 활동이 다음 동작이 사용자에게 속한 단 하나의 세션을 가려버릴 수 있습니다.
먼저 분류하고, 나중에 집계하라
더 안전한 리듀서(reducer)는 두 단계를 거칩니다:
- 각 세션을 독립적으로 분류합니다.
- 결과로 나온 상태들을 실행 가능성(actionability)에 따라 순위를 매깁니다.
최신성(Recency)은 동일한 우선순위를 가진 상태들 사이에서 동점자를 가리는 용도로만 사용되어야 합니다.
Agent Island v1.7.1에서 출시된 macOS 및 Windows 모니터는 다음 순서를 사용합니다:
확인되지 않은 사용자 필요 (unacknowledged needs-you) = 4
중단됨 (stalled) = 3
작업 중 (working) = 2
...
응답되지 않은 핸드오프(handoff)가 우선권을 갖는데, 이는 사용자가 다음 유용한 동작을 소유하고 있기 때문입니다. 중단된(stalled) 세션이 그다음인데, 이는 이상 징후(anomaly)가 일상적인 진행 상황 뒤로 사라져서는 안 되기 때문입니다. 작업 중(working) 상태는 더 긴급한 것이 없을 때 가시성을 유지합니다.
미묘한 사례는 확인된(acknowledged) 핸드오프입니다. 이는 여전히 스레드 기록에 속하지만, 작업 중인 형제 세션보다는 낮은 순위를 가져야 합니다. 그렇지 않으면, 처리된 하나의 요청이 제공자 아이콘을 고정시켜 시스템 전체가 멈춘 것처럼 보이게 만들 수 있습니다.
타임스탬프를 통해 동등한 조건 해결하기
우선순위를 할당한 후, 우선순위로 먼저 정렬하고 수정 시간으로 두 번째 정렬합니다:
ranked = sessions
.filter(provider)
.map(session => (session, priority(session)))
...
이렇게 하면 타임스탬프가 정책을 정의하게 두지 않으면서도 결정론적(deterministic) 동작을 유지할 수 있습니다.
테스트는 상태(state)와 시간(time)을 독립적으로 변화시켜야 합니다. 답변되지 않은 오래된 핸드오프(handoff)는 더 새로운 작업 세션(working session)보다 우선순위를 가져야 합니다. 두 개의 작업 세션 중에서는 더 새로운 것이 승리해야 합니다. 이것들은 서로 다른 규칙이며, 훌륭한 테스트 스위트(test suite)는 이러한 차이를 명확하게 드러내야 합니다.
아이콘과 리마인더 큐(reminder queue)는 서로 다른 제품입니다
프로바이더(provider) 아이콘에는 하나의 대표 세션이 필요합니다. 하지만 리마인더 큐(reminder queue)는 모든 열려 있는 핸드오프(handoff)를 유지해야 합니다.
이 두 가지 작업을 혼동하면 또 다른 종류의 버그가 발생합니다. 만약 구현 방식이 프로바이더를 하나의 세션으로 축소한 뒤 그 승자로부터 알림(notification)을 도출한다면, 한 스레드(thread)의 확인(acknowledgement)이 실수로 다른 스레드의 알람을 취소할 수 있습니다.
Agent Island는 대신 표시를 위한 최적의 세션 하나를 선택하는 동시에, '당신이 필요함(needs-you)' 스레드는 각각 별도로 수집합니다. 리마인더 식별자(identity)에는 프로바이더, 세션, 그리고 턴(turn)이 포함됩니다. 메뉴 바에는 하나의 집계된 상태(aggregate state)가 표시되더라도, 대기 중인 두 개의 스레드는 여전히 두 개의 의무(obligation)로 남습니다.
압축된 테스트 매트릭스(test matrix)는 다음과 같습니다:
- 답변되지 않은 오래된 '당신이 필요함' + 새로운 작업 중: '당신이 필요함' 표시.
- 오래된 중단됨(stalled) + 새로운 작업 중: '중단됨' 표시.
- 확인된 '당신이 필요함' + 작업 중: '작업 중' 표시.
- 두 개의 작업 세션: 더 새로운 수정 시간(modification time)을 선택.
- 두 개의 답변되지 않은 핸드오프: 더 새로운 것을 표시하되, 두 리마인더를 모두 유지.
- 두 개의 핸드오프 중 하나를 확인: 다른 하나는 실행 가능한 상태로 유지.
- 프로바이더에 대한 세션 없음: 선택된 스레드 없이 유휴(idle) 상태 반환.
소스 레코드(source records)를 온전하게 유지하십시오
집계된 상태(aggregate state)는 표시를 위한 결정일 뿐, 다른 세션들이 존재하기를 멈췄다는 증거가 아닙니다. 딥 링크(deep links), 리마인더, 또는 진단(diagnostics)에 사용되는 스레드별 레코드를 절대 덮어쓰지 마십시오.
이러한 경계(boundary)를 유지해야 향후 정책 변경이 가능해집니다. UI는 기저의 진실(underlying truth)을 잃지 않으면서도 순위 지정 방식을 변경할 수 있습니다.
태그된 v1.7.1 구현체는 두 플랫폼 모두에서 오픈 소스로 공개되어 있습니다. 이 일반적인 교훈은 동시 작업자(concurrent workers)를 하나의 상태 표면(status surface)으로 압축하는 모든 개발자 도구에 적용됩니다.
실행 가능성 (actionability)에 따라 집계하고, 작업자별 정체성 (per-worker identity)을 유지하며, 동점인 경우에만 최신성 (recency)을 사용하여 순위를 결정하십시오.
전체 구현 노트와 테스트 경계 (test boundary)는 정식 엔지니어링 문서 (canonical engineering article)에 있습니다. v1.7.1 소스 및 릴리스 (v1.7.1 source and release)는 MIT 라이선스 하에 공개되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기