virtual-insanity
← 리포트 목록

launchd 부활 1/5 — 애널리스트 4개 복구

2026-04-15 launchd [launchd, analyst, hermes, revival]

launchd 부활 1/5 — 애널리스트 4개 복구 보고

결론

  • 4개 plist 모두 백업 후 Hermes 경로로 rewrite 완료.
  • plist 문법 정상: plutil -lint 4/4 OK.
  • analyst_runner.sh 문법 정상: bash -n OK.
  • 하지만 이 세션에서 launchctl bootstrap은 4개 모두 Bootstrap failed: 5: Input/output error로 실패했다.
  • launchctl list에 4개 label은 아직 없음. 즉, launchd 부활은 이 세션에서 완료되지 않았다.
  • 원인은 plist 내용 문제가 아니라 이 세션의 launchd 등록 권한/도메인 제약으로 보인다. 같은 plist를 XML로 변환해 재시도해도 동일했다.
  • 직접 실행 fallback으로 technical 1회 실행을 시도했으나 Claude CLI 인증 실패(Not logged in) + Telegram DNS 실패로 실제 리포트 생성/발송에는 실패했다.

수정한 plist

백업 시각: 20260415-160700

label 백업 파일 Hermes rewrite 결과
com.openclaw.analyst-macro ~/Library/LaunchAgents/com.openclaw.analyst-macro.plist.bak-hermes-20260415-160700 analyst_runner.sh macro, stdout/stderr → ~/.hermes/logs/
com.openclaw.analyst-fundamental ~/Library/LaunchAgents/com.openclaw.analyst-fundamental.plist.bak-hermes-20260415-160700 analyst_runner.sh fundamental, stdout/stderr → ~/.hermes/logs/
com.openclaw.analyst-technical ~/Library/LaunchAgents/com.openclaw.analyst-technical.plist.bak-hermes-20260415-160700 analyst_runner.sh technical, stdout/stderr → ~/.hermes/logs/
com.openclaw.analyst-pm ~/Library/LaunchAgents/com.openclaw.analyst-pm.plist.bak-hermes-20260415-160700 analyst_runner.sh pm, stdout/stderr → ~/.hermes/logs/

변경 후 4개 plist 모두 /Users/ron/.openclaw 파일시스템 경로는 남아있지 않다.

launchctl 결과

label bootout bootstrap list kickstart
com.openclaw.analyst-macro 0 5 (Input/output error) not in list 113 (service not found)
com.openclaw.analyst-fundamental 0 5 (Input/output error) not in list 113 (service not found)
com.openclaw.analyst-technical 0 5 (Input/output error) not in list 113 (service not found)
com.openclaw.analyst-pm 0 5 (Input/output error) not in list 113 (service not found)

추가로 plutil -convert xml1 후 재시도했지만 동일하게 bootstrap_exit=5였다.

결과 표

label 재기동 cwd 발송경로 라이브 성공
analyst-macro ❌ bootstrap 5 미기동 prompt: send_sector("market", text) / runner 실패 fallback: Telegram DM curl launchd 실패. 기존 latest.json은 2026-04-15, telegram_sent=true
analyst-fundamental ❌ bootstrap 5 미기동 prompt: send_sector("market", text) / runner 실패 fallback: Telegram DM curl launchd 실패. 기존 latest.json은 2026-04-15, telegram_sent=true
analyst-technical ❌ bootstrap 5 미기동 prompt: send_sector("market", text) + chart album 안내 / runner 실패 fallback: Telegram DM curl launchd 실패. 직접 실행도 Claude 인증 실패. 최신 파일은 2026-04-14.json, telegram_sent=false, latest.json 없음
analyst-pm ❌ bootstrap 5 미기동 prompt: send_sector("market", text) / send_sector_album("market", ...) launchd 실패. 기존 latest.json은 2026-04-15, telegram_sent=true

스크립트/발송 경로 확인

공통 실행기:

  • /Users/ron/.hermes/workspace/scripts/analyst_runner.sh
  • 실행 인자: macro, fundamental, technical, pm
  • 프롬프트 파일: ~/.hermes/workspace/scripts/analyst_<type>_prompt.md
  • 출력 폴더: ~/.hermes/workspace/memory/analyst-<type>/
  • 로그 폴더: ~/.hermes/logs/

발송 경로:

  • 각 prompt의 리포트 발송 지시: send_sector("market", text) — 론 알림센터 market 섹터
  • PM prompt: send_sector("market", text) 및 필요 시 send_sector_album("market", [...])
  • runner 내부 실패 fallback: Telegram DM curl. 다만 runner 끝부분에 “Telegram DM fallback disabled — reports available via 론 알림센터 + /analyst/log” 로그가 찍힘.

실제 산출물 상태

analyst 파일 mtime telegram flag
macro ~/.hermes/workspace/memory/analyst-macro/latest.json 2026-04-15 07:06 telegram_sent=true
fundamental ~/.hermes/workspace/memory/analyst-fundamental/latest.json 2026-04-15 07:18 telegram_sent=true
technical ~/.hermes/workspace/memory/analyst-technical/2026-04-14.json 2026-04-15 07:25 telegram_sent=false; latest.json 없음
pm ~/.hermes/workspace/memory/analyst-pm/latest.json 2026-04-15 07:44 telegram_sent=true

직접 실행 테스트

launchctl이 막혀서 technical만 직접 실행했다.

명령:

/bin/bash /Users/ron/.hermes/workspace/scripts/analyst_runner.sh technical

결과:

  • exit: 0 (runner 자체는 정상 종료)
  • 내부 Claude CLI 결과: Not logged in · Please run /login
  • runner 로그: WARN: Claude CLI failed (exit: 1, no output)
  • Telegram fallback: WARN: Telegram send failed
  • 산출물 변화: 없음. analyst-technical/latest.json 여전히 없음.

별도 send_sector("market", ...) smoke도 수행했다.

  • sector_trace.log에는 호출 라인이 남음.
  • 실제 전송은 실패: nodename nor servname provided, or not known.
  • 따라서 이 세션의 네트워크/DNS 환경에서는 Telegram 실제 전송 확인 불가.

실패 원인

  1. launchd 등록 실패
  2. launchctl bootstrap gui/501 <plist>가 4개 모두 Input/output error.
  3. plist lint, 경로 존재, 로그 디렉터리 존재, XML 변환 모두 확인했으므로 plist 자체 오류 가능성은 낮다.
  4. 현재 Codex 세션의 launchd 제어 제약으로 판단.

  5. Claude CLI 인증 실패

  6. 직접 runner에서 Claude Code가 Not logged in으로 종료.
  7. analyst_runner는 Claude CLI 기반이라 이 상태에서는 새 분석 생성 불가.

  8. Telegram DNS 실패

  9. shared.telegram.send_sector smoke가 DNS 에러로 실패.
  10. 단, sector_trace.log에는 호출 자체가 기록됨.

다음 조치

샌드박스 밖 메인 터미널에서 아래를 실행해야 launchd 등록이 완료될 가능성이 높다.

for label in \
  com.openclaw.analyst-macro \
  com.openclaw.analyst-fundamental \
  com.openclaw.analyst-technical \
  com.openclaw.analyst-pm; do
  launchctl bootout gui/$(id -u)/$label 2>/dev/null || true
  launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/$label.plist
  launchctl kickstart -k gui/$(id -u)/$label
done

확인:

launchctl list | grep -E 'com\.openclaw\.analyst-(macro|fundamental|technical|pm)'

그리고 Claude CLI 인증 상태 확인:

~/.local/bin/claude --version
# 분석 실행 시 Not logged in 이 나오면 claude /login 필요

자체평가

  • 정확성: 4.2/5 — plist rewrite와 경로 검증은 완료. launchd 부활은 세션 제약으로 실패를 명확히 확인.
  • 완성도: 3.8/5 — 실제 launchd running/cwd/message id까지는 못 갔다.
  • 검증: 4.3/5 — plutil, bash -n, launchctl 실패 코드, 직접 runner, Telegram smoke까지 확인.
  • 최소 변경: 4.8/5 — plist 경로 rewrite만 수행. analyst 원본 스크립트는 수정하지 않음.
  • 종합: 4.28/5