#1258에서 분리. 개선안 1·2는 #1259와 #1265로 구현 완료되었고, 남은 개선안 3만 여기서 추적한다.
문제
<task-notification status=stopped>는 두 개의 전혀 다른 상황에 같은 문구를 쓴다.
- 작업 자체가 실패/중단됨 — 조치가 필요하다
- 감시자만 유실됨 — 작업은 detached라 계속 돌고 있거나 이미 끝났고, 조치는 로그 확인뿐이다
에이전트는 이 알림만으로 둘을 구분할 수 없어, 이미 성공한 작업을 실패로 오판하거나 멱등하지 않은 작업을 재실행할 위험이 있다. #1258의 원 사례가 정확히 이것이었다 (EXIT=0, 12/12로 끝난 작업이 실패 의심 상태로 남음).
왜 이 레포에서 못 고치는가
해당 문구는 Claude Code 하네스가 생성한다. ccc-node 전수 검색 결과 이 문자열을 만들어 내는 코드는 없고, 매칭되는 것은 #1265가 추가한 설명 주석뿐이다. 즉 알림 문구 자체를 바꾸는 것은 상류 소관이다.
현재 완화 상태 (#1265, 51ae68e)
ccc-node 쪽에서 할 수 있는 완화는 이미 적용되어 있다. claude/hooks/lib/detached_jobs.py가 로그의 EXIT= 마커를 근거로 detached 작업을 done/running/lost로 분류하고, 매 SessionStart에 다시 읽는다. 이 판정은 감시자 생존과 무관하므로, status=stopped를 받아도 실제 상태는 별도로 확인 가능하다.
따라서 오판 위험 자체는 이미 낮아졌고, 남은 것은 알림 문구가 여전히 오해를 유도한다는 점이다.
할 수 있는 후속
- 상류(Claude Code)에 문구 구분을 제안할지 판단
- 또는 ccc-node 쪽에서
status=stopped 수신 시 자동으로 detached_jobs.py sweep을 참조하도록 하는 훅/문서 강화 — 이건 이 레포에서 가능하다
관련
#1258에서 분리. 개선안 1·2는 #1259와 #1265로 구현 완료되었고, 남은 개선안 3만 여기서 추적한다.
문제
<task-notification status=stopped>는 두 개의 전혀 다른 상황에 같은 문구를 쓴다.에이전트는 이 알림만으로 둘을 구분할 수 없어, 이미 성공한 작업을 실패로 오판하거나 멱등하지 않은 작업을 재실행할 위험이 있다. #1258의 원 사례가 정확히 이것이었다 (
EXIT=0, 12/12로 끝난 작업이 실패 의심 상태로 남음).왜 이 레포에서 못 고치는가
해당 문구는 Claude Code 하네스가 생성한다. ccc-node 전수 검색 결과 이 문자열을 만들어 내는 코드는 없고, 매칭되는 것은 #1265가 추가한 설명 주석뿐이다. 즉 알림 문구 자체를 바꾸는 것은 상류 소관이다.
현재 완화 상태 (#1265,
51ae68e)ccc-node 쪽에서 할 수 있는 완화는 이미 적용되어 있다.
claude/hooks/lib/detached_jobs.py가 로그의EXIT=마커를 근거로 detached 작업을done/running/lost로 분류하고, 매 SessionStart에 다시 읽는다. 이 판정은 감시자 생존과 무관하므로,status=stopped를 받아도 실제 상태는 별도로 확인 가능하다.따라서 오판 위험 자체는 이미 낮아졌고, 남은 것은 알림 문구가 여전히 오해를 유도한다는 점이다.
할 수 있는 후속
status=stopped수신 시 자동으로detached_jobs.py sweep을 참조하도록 하는 훅/문서 강화 — 이건 이 레포에서 가능하다관련