19 launchd 서비스 최종 end-to-end 검증
19 launchd 서비스 최종 end-to-end 검증
선행 조건 확인
4개 선행 보고서가 모두 존재한 뒤 검증을 시작했다.
| 보고서 | 상태 |
|---|---|
260415_fix_analyst_technical.md |
존재, 7578 bytes |
260415_fix_kpi_telegram.md |
존재, 21050 bytes |
260415_fix_morning_briefing.md |
존재, 30008 bytes |
260415_fix_door_alert.md |
존재, 10406 bytes |
launchctl list 보조 확인
launchctl list도 실행했지만, 현재 Codex 실행 컨텍스트에서는 출력이 0라인이었다. 따라서 PID/exit/runs는 launchctl print gui/$(id -u)/<label> 결과를 기준으로 채웠다.
launchctl list > /tmp/.../launchctl_list.txt
wc -l launchctl_list.txt => 0
19 서비스 상태 매트릭스
기준: launchctl print gui/$(id -u)/<label>, plist 파싱, 로그 파일 mtime/size, lsof cwd(PID 있는 경우).
| label | state | last_exit | 경로 Hermes | 텔레그램 도달 | 마지막 실행 시각 | 로그 |
|---|---|---|---|---|---|---|
com.openclaw.cowork-daily-review |
not running (pid -, runs 1) | 0 | PASS | DM 확인: cowork_daily_review.log message_id=11602 | 2026-04-15 16:25:28 | cowork_daily_review_stdout.log:2026-04-15 16:25:28:0 cowork_daily_review_stderr.log:2026-04-15 16:25:28:0 |
com.openclaw.autopilot-sweeper |
not running (pid -, runs 25) | 0 | PASS | N/A (정리 작업, 평시 발송 없음) | 2026-04-15 16:43:30 | autopilot_sweeper.stdout.log:2026-04-15 16:43:30:3050 autopilot_sweeper.stderr.log:2026-04-15 16:20:18:0 |
com.openclaw.inbox-triage |
not running (pid -, runs 1) | 0 | PASS | DM 확인: 수신함 트리아지 결과 message_id=11602 | 2026-04-15 16:25:28 | inbox_triage_stdout.log:2026-04-15 16:25:28:0 inbox_triage_stderr.log:2026-04-15 16:25:28:0 |
ai.openclaw.memory-guardian |
not running (pid -, runs 27) | 0 | PASS | 조건부 critical DM, 최근 발송 없음 | 2026-04-15 16:19:18 | memory_guardian.out:2026-04-15 16:19:18:0 memory_guardian.err:2026-04-15 16:19:18:0 |
com.openclaw.ron-orchestrator |
not running (pid -, runs 5) | 0 | PASS | N/A/조건부, 최근 발송 없음 | 2026-04-15 16:40:40 | ron_orchestrator.log:2026-04-15 16:40:40:3495 ron_orchestrator_error.log:2026-04-15 16:24:18:0 |
com.openclaw.analyst-macro |
not running (pid -, runs 1) | 0 | PASS | market 도달 플래그 true; latest.json telegram_sent=true | 2026-04-15 16:25:28 | analyst_macro_stdout.log:2026-04-15 16:25:28:0 analyst_macro_stderr.log:2026-04-15 16:25:28:0 |
com.openclaw.analyst-fundamental |
not running (pid -, runs 1) | 0 | PASS | 미확인/누락: latest.json telegram_sent=false | 2026-04-15 16:25:28 | analyst_fundamental_stdout.log:2026-04-15 16:25:28:0 analyst_fundamental_stderr.log:2026-04-15 16:25:28:0 |
com.openclaw.analyst-technical |
not running (pid -, runs 1) | 0 | PASS | market 전송 성공 로그 sent: True; latest.json telegram_sent=true | 2026-04-15 16:25:28 | analyst_technical_stdout.log:2026-04-15 16:25:28:0 analyst_technical_stderr.log:2026-04-15 16:25:28:0 |
com.openclaw.analyst-pm |
not running (pid -, runs 1) | 0 | PASS | market 전송 성공 로그 sent: True; latest.json telegram_sent=true | 2026-04-15 16:25:28 | analyst_pm_stdout.log:2026-04-15 16:25:28:0 analyst_pm_stderr.log:2026-04-15 16:25:28:0 |
com.openclaw.morning-routine |
not running (pid -, runs 0) | (never exited) | PASS | Telegram 아님: Google Home TTS 루틴 | 2026-04-15 16:11:01 | morning-routine.log:2026-04-15 16:11:01:1000 morning-routine.err.log:2026-04-15 16:10:58:270 |
com.openclaw.weekly-report |
not running (pid -, runs 1) | 0 | PASS | Telegram 아님: Google Home TTS 루틴 | 2026-04-15 16:25:52 | weekly-report.log:2026-04-15 16:25:52:1260 weekly-report.err.log:2026-04-15 16:25:52:707 |
com.openclaw.kpi-daily |
not loaded (pid -, runs -) | service not found | PASS | ops route 시도 trace 있음, message_id 없음 | 2026-04-15 16:25:28 | kpi_daily.log:2026-04-15 16:25:28:1008 kpi_error.log:2026-04-15 16:11:02:0 |
com.openclaw.kpi-weekly |
not loaded (pid -, runs -) | service not found | PASS | ops route 시도 trace 있음, message_id 없음 | 2026-04-15 16:25:28 | kpi_weekly.log:2026-04-15 16:25:28:632 kpi_weekly_error.log:2026-04-15 16:11:02:0 |
com.openclaw.cold-alert |
not running (pid -, runs 1) | 0 | PASS | 조건부 센서 알림, 현재 SKIP/HA 문제 | 2026-04-15 16:31:31 | cold-alert.log:2026-04-15 16:31:31:28 cold-alert.err.log:2026-04-15 16:31:31:32 |
com.openclaw.door-alert |
not running (pid -, runs 22) | 0 | PASS | FAIL: HA_UNREACHABLE로 상태 판독 불가 | 2026-04-15 16:43:46 | door-alert.log:2026-04-15 16:43:46:1486 door-alert.err.log:2026-04-15 16:20:32:0 |
com.openclaw.late-lights |
not running (pid -, runs 1) | 0 | PASS | 조건부 센서 알림, 현재 SKIP | 2026-04-15 16:31:57 | late-lights.log:2026-04-15 16:31:57:34 late-lights.err.log:2026-04-15 16:31:21:0 |
com.openclaw.rain-alert |
not running (pid -, runs 1) | 0 | PASS | 조건부 센서 알림, 현재 SKIP/HA 문제 | 2026-04-15 16:31:31 | rain-alert.log:2026-04-15 16:31:31:29 rain-alert.err.log:2026-04-15 16:31:31:32 |
com.openclaw.morning-briefing-telegram |
not loaded (pid -, runs -) | service not found | PASS | report trace 있음(수동), launchd not loaded/message_id 없음 | - | morning-briefing-telegram.log:missing:None morning-briefing-telegram.err.log:missing:None |
com.openclaw.weekly-briefing-telegram |
not loaded (pid -, runs -) | service not found | PASS | not loaded, 발송 증거 없음 | - | weekly-briefing-telegram.log:missing:None weekly-briefing-telegram.err.log:missing:None |
원본 스크립트 vs wrapper 매핑
| label | 실제 호출/매핑 | OpenClaw 잔존 |
|---|---|---|
com.openclaw.cowork-daily-review |
cowork_daily_review.sh → Claude/Cowork review |
False |
com.openclaw.autopilot-sweeper |
autopilot_sweeper.py --apply |
False |
com.openclaw.inbox-triage |
cowork_daily_review.sh with TRIAGE env |
False |
ai.openclaw.memory-guardian |
memory_guardian.py |
False |
com.openclaw.ron-orchestrator |
ron_orchestrator_controller.py |
False |
com.openclaw.analyst-macro |
analyst_runner.sh macro → Claude analyst prompt |
False |
com.openclaw.analyst-fundamental |
analyst_runner.sh fundamental → Claude analyst prompt |
False |
com.openclaw.analyst-technical |
analyst_runner.sh technical → Claude analyst prompt (wrapper fixed) |
False |
com.openclaw.analyst-pm |
analyst_runner.sh pm → Claude analyst prompt |
False |
com.openclaw.morning-routine |
tts_morning.sh (TTS 원본) |
False |
com.openclaw.weekly-report |
tts_weekly.sh (TTS 원본) |
False |
com.openclaw.kpi-daily |
kpi_telegram_wrapper.py → ron_kpi_tracker.py |
False |
com.openclaw.kpi-weekly |
kpi_telegram_wrapper.py --weekly → ron_kpi_tracker.py --weekly |
False |
com.openclaw.cold-alert |
auto_cold_alert.sh |
False |
com.openclaw.door-alert |
auto_door_alert.sh |
False |
com.openclaw.late-lights |
auto_late_lights.sh |
False |
com.openclaw.rain-alert |
auto_rain_alert.sh |
False |
com.openclaw.morning-briefing-telegram |
morning_briefing_wrapper.sh → telegram_briefing_wrapper.py morning |
False |
com.openclaw.weekly-briefing-telegram |
weekly_briefing_wrapper.sh → telegram_briefing_wrapper.py weekly |
False |
텔레그램/알림 증거
확인한 파일: ~/.hermes/logs/*_last_telegram.tsv, ~/.hermes/logs/sector_trace.log, ~/.hermes/logs/gateway*.log, 관련 서비스 로그.
## blog_monitor (10 hits)
2026-04-15 16:00:24 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>파월과 베센트가 은행장들을 긴급 소집한 이유 (feat 미토스)</b>\n\n앤트로픽의 AI 모델 미토스가 사이버 보안 시장에 큰 충격을 주며'
2026-04-15 16:00:29 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>원유 상황은 정말 괜찮을까?</b>\n\n호르무즈해협의 통행 제한으로 인해 원유 공급이 심각하게 감소하고 있으며, 한국은 비축유를 통해 210'
2026-04-15 16:00:34 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>우리 파키스탄이 달라졌어요 (feat 미국 이란의 종전협상 중재)</b>\n\n파키스탄은 지정학적 위치 덕분에 미국과 중국의 전략적 이해관계 '
2026-04-15 16:00:39 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>미국과 이란의 종전 협상이 결렬된 이유는 뭐고, 전쟁은 언제 끝날까?</b>\n\n미국과 이란의 종전 협상이 결렬되면서, 전쟁의 가능성이 높아'
2026-04-15 16:00:44 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>트럼프, "호르무즈해협 완전히 막겠다." 선언...</b>\n\n트럼프는 호르무즈 해협을 통과하는 선박에 대한 봉쇄조치를 지시하며, 이란의 통'
2026-04-15 16:00:50 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>중국의 황산 수출금지가 일으키는 나비효과? (feat 비료, 구리,니켈)</b>\n\n중국의 황산 수출 금지가 비료와 관련된 공급망에 심각한 '
2026-04-15 16:00:55 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>호주, 한국에 경고하다 (feat 석유제품)</b>\n\n한국은 글로벌 공급망 위기 속에서도 210일 이상 석유제품을 비축할 수 있지만, 이는'
2026-04-15 16:01:01 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>6시간동안 리치 스타리호에 무슨 일이 일어난 걸까?</b>\n\n리치 스타리호가 호르무즈 해협을 통과하는 과정에서 미국과 중국 간의 대화가 있'
2026-04-15 16:01:07 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>미장은 언제부터 오를수 있을까? A/S</b>\n\n미국 증시의 향후 전망은 유동성의 변화에 크게 의존하고 있으며, 현재 역레포(RRP) 잔고'
2026-04-15 16:01:14 [SECTOR_TRACE] send_sector(ideas) caller=blog_monitor.py:411 text='<b>3번째 항공모함 조지 H.W 부시함의 위치가...전쟁 길어지나?</b>\n\n항공모함 조지 H.W. 부시함의 이동 경로가 전쟁의 지속 가능성을'
## gmail_newsletter (2 hits)
2026-04-15 14:26:14 [SECTOR_TRACE] send_sector(report) caller=<stdin>:30 text='📬 <b>[반도체-테크] Credo Technology Deep Dive</b>\n Damnang · 2026-04-15\n\nCredo Techn'
2026-04-15 14:36:42 [SECTOR_TRACE] send_sector(report) caller=<stdin>:4 text='[cron-report-verify] Gmail newsletter report topic route test — 2026-04-15 14:36'
## kpi (2 hits)
2026-04-15 16:37:26 [SECTOR_TRACE] send_sector(ops) caller=kpi_telegram_wrapper.py:170 text='📊 <b>일일 KPI 리포트</b>\n날짜: <code>2026-04-15</code>\n\n<b>전체</b>\n• 처리/실패/대기: <b>1</b> '
2026-04-15 16:37:29 [SECTOR_TRACE] send_sector(ops) caller=kpi_telegram_wrapper.py:170 text='📈 <b>주간 KPI 리포트</b>\n상태: <b>데이터 부족 (3일)</b>\n\n최근 daily KPI가 7일치 쌓이면 주간 평균/추세를 계산합니'
## morning_report (2 hits)
2026-04-15 16:39:08 [SECTOR_TRACE] send_sector(report) caller=telegram_briefing_wrapper.py text='<b>🌅 아침 투자 브리핑 · Telegram</b>\n<i>2026-04-15 16:39 KST / source=morning_briefing.'
2026-04-15 16:40:51 [SECTOR_TRACE] send_sector(report) caller=telegram_briefing_wrapper.py text='<b>🌅 아침 투자 브리핑 · Telegram</b>\n<i>2026-04-15 16:40 KST / source=morning_briefing.'
## analyst_market (1 hits)
2026-04-15 16:09:25 [SECTOR_TRACE] send_sector(market) caller=<stdin>:4 text='[launchd-analyst-revival] market sector smoke — 2026-04-15 16:09:25 KST'
## last_telegram_tsv
### /Users/ron/.hermes/logs/analyst_technical_last_telegram.tsv
1776238230 ⚠️ Analyst technical 실행 실패 (exit: 0). 로그 확인 필요.
추가 message_id 근거: ~/.hermes/logs/cowork_daily_review.log에 chat_id: 492860021, message_id: 11602, 2026-04-15T07:30:07Z 기록이 있다.
잔존 이슈 재점검
| 세션 | 대상 | 결과 | 잔존 이슈 |
|---|---|---|---|
| s:2 | analyst-technical | wrapper 오탐 수정 반영. latest.json telegram_sent=true, market sent: True 로그 확인 |
analyst-fundamental은 telegram_sent=false로 남아 별도 복구 필요 |
| s:4 | kpi daily/weekly | plist는 wrapper 경로. sector_trace에 ops 발송 시도 2건 | com.openclaw.kpi-daily, kpi-weekly가 현재 launchd domain에 not loaded. message_id 없음 |
| s:6 | morning/weekly Telegram wrapper | wrapper plist 파일 존재, Hermes 경로. report trace 2건 확인 | morning-briefing-telegram, weekly-briefing-telegram not loaded. weekly 발송 증거 없음 |
| s:8 | door/cold/rain/late sensors | 4개 모두 Hermes 경로, door-alert runs=22/last_exit=0 | door-alert는 HA_UNREACHABLE 반복. HA endpoint 도달 실패로 실제 문 상태 알림 불가 |
해리 시야 커버리지
| 항목 | 실제 오는가 | 도착 위치 | 근거/상태 |
|---|---|---|---|
| 아침 브리핑(morning) | 부분 | report topic | telegram_briefing_wrapper.py report trace 16:39/16:40. launchd wrapper not loaded, message_id 없음 |
| 수신함 트리아지(inbox) | 예 | DM | cowork_daily_review.log message_id=11602, 트리아지 완료 |
| 뉴스레터 다이제스트(gmail_newsletter) | 예 | report topic | sector_trace: Damnang Credo 14:26, newsletter route test 14:36 |
| 블로그 모니터(blog_monitor) | 예 | ideas topic | sector_trace: 16:00~16:01 ideas 10건 |
| 채권 일일 리포트(bond_daily) | 확인 불충분 | report/webapp 추정 | 이번 19 서비스 집합에는 없음. 이전 검증에서 확인됨으로 되어 있으나 현 run에서 message_id 증거는 못 찾음 |
| 애널리스트 4종 | 부분 | market topic | macro/technical/pm은 true/sent 로그. fundamental은 latest telegram_sent=false |
| KPI 일일/주간 | 부분 | ops topic | wrapper trace는 있음. launchd not loaded, message_id 없음 |
| 주말 Weekly 종합 | 미완 | report topic 또는 TTS | weekly-briefing-telegram not loaded, weekly-report는 TTS 스크립트만 있고 Telegram 아님 |
남은 잔존 이슈 우선순위
-
P0 — not loaded 4개:
kpi-daily,kpi-weekly,morning-briefing-telegram,weekly-briefing-telegram이 launchd domain에 없다. bootstrap 재실행 필요. -
P0 — door-alert: launchd는 돌지만
HA_UNREACHABLE반복이라 실제 문 상태 감시 불가. HA URL/DNS/network 수정 필요. -
P1 — analyst-fundamental: 산출물은 있으나
telegram_sent=false. market topic 도달 증거를 남기거나 재전송 필요. -
P1 — KPI/morning wrapper message_id: sector_trace는 발송 시도 증거라서 최종 도달 증거가 약하다. wrapper에서
_send_raw결과 message_id를 별도 로그로 남겨야 함. -
P2 — bond_daily 현 run 증거 부족: 이전 보고서 의존 상태. 최종 freeze 전 bond 최신 message_id 또는 report topic trace를 한 번 더 확보 필요.
최종 판정
부분 PASS
-
19개 plist의 경로는 모두 Hermes 기준이며 OpenClaw 경로 잔존은 0으로 확인했다.
-
15개는 launchd에 loaded 상태이고, 4개 신규 Telegram/KPI wrapper 서비스는 not loaded다.
-
해리 시야의 주요 경로 중 inbox/newsletter/blog/analyst 일부는 도달 증거가 있다.
-
하지만 KPI wrapper, morning/weekly Telegram wrapper, door-alert, analyst-fundamental은 아직 완전 PASS가 아니다.
자체평가
-
정확성: 4.4/5 — 선행 보고서, launchctl print, plist, 로그, 텔레그램 trace를 분리해 확인했다.
-
완성도: 4.2/5 — 19개 매트릭스와 커버리지는 완성했지만 일부 서비스가 not loaded/도달 미확인으로 남았다.
-
검증: 4.3/5 — 런타임 상태, 로그 mtime/size, 발송 trace, latest flags를 확인했다. 실제 Telegram API message_id는 일부만 확보.
-
최소 변경: 5/5 — 검증 전담으로 원본/서비스를 수정하지 않았다.
-
종합: 4.45/5
Remaining Risks:
- sector_trace는 호출 경로 증거이지 최종 Telegram API 성공의 완전 증거가 아니다. message_id 저장을 표준화해야 한다.
- launchd state=not running, last_exit=0인 단발성 job은 정상일 수 있으나, 신규 not loaded 서비스는 스케줄 실행 자체가 불가능하다.