virtual-insanity
← 리포트 목록

LaunchAgent 5개 Hermes 이관 자동화 — collab-review-loop 우선

2026-04-24 launchagent [openclaw, hermes, launchagent, migration]

결론

  • 5개 대상 모두 plist와 실행 파일 확인 완료.
  • collab-review-loop는 Hermes plist를 생성하고 스크립트 1회 실행(--once)까지 검증했다.
  • 단, 현재 Codex sandbox에서 launchctl bootstrapBootstrap failed: 5: Input/output error로 막혀 새 label 로드와 기존 OpenClaw label unload는 수행하지 않았다.
  • 따라서 현재 상태는 이관 staged 완료 / launchd cutover 보류다.

1. 대상 5개 현황

대상 기존 plist ProgramArguments Hermes 동등 label 현재 launchd 상태
collab-review-loop ~/Library/LaunchAgents/com.openclaw.collab-review-loop.plist /usr/bin/python3 -u /Users/ron/.hermes/workspace/scripts/collab_review_loop.py 신규 생성 com.hermes.collab-review-loop OpenClaw label running, pid 1228
dispatch-watcher com.openclaw.dispatch-watcher.plist /bin/bash /Users/ron/.hermes/workspace/scripts/monitoring/dispatch_watcher.sh 없음 running
hermes-tailer com.openclaw.hermes-tailer.plist /usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/hermes_otel_tailer.py 없음 running
auto-dispatcher com.openclaw.auto-dispatcher.plist /bin/bash /Users/ron/.hermes/workspace/scripts/monitoring/auto_dispatcher.sh 없음 running
task-notifier com.openclaw.task-notifier.plist Python ... /Users/ron/.hermes/workspace/scripts/task_notifier.py --daemon 없음 running

주의: launchctl print의 현재 로드 상태는 일부 stdout/stderr가 과거 .openclaw 로그로 잡혀 있었고, 파일상 plist는 이미 .hermes 로그로 수정되어 있다. 즉, 기존 label은 “로드 당시의 오래된 정의”로 계속 실행 중이다.

2. collab-review-loop 실제 이관 시도

생성/백업

  • 백업 디렉터리: ~/Library/LaunchAgents/.openclaw-migration-backup-20260424142728/
  • 백업 파일: com.openclaw.collab-review-loop.plist
  • 신규 파일: ~/Library/LaunchAgents/com.hermes.collab-review-loop.plist

신규 plist 핵심:

Label: com.hermes.collab-review-loop
ProgramArguments: /usr/bin/python3 -u /Users/ron/.hermes/workspace/scripts/collab_review_loop.py
WorkingDirectory: /Users/ron/.hermes/workspace/scripts
Stdout: /Users/ron/.hermes/logs/collab-review-loop.log
Stderr: /Users/ron/.hermes/logs/collab-review-loop.err
KeepAlive: true

검증

plutil -lint ~/Library/LaunchAgents/com.hermes.collab-review-loop.plist
=> OK

python3 -m py_compile /Users/ron/.hermes/workspace/scripts/collab_review_loop.py
=> OK

/usr/bin/python3 -u /Users/ron/.hermes/workspace/scripts/collab_review_loop.py --once
=> rc=0
=> {"review_created": 0, "review_delivered": 0, "fix_created": 0, "clarify_created": 0, "escalated": 0, "retried": 0}

launchd cutover 결과

시도:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.hermes.collab-review-loop.plist

결과:

Bootstrap failed: 5: Input/output error
Try re-running the command as root for richer errors.

동일 sandbox에서 임시 최소 plist(/bin/echo ok)도 bootstrap 실패했다. 따라서 plist 내용 문제가 아니라 현재 세션의 launchctl bootstrap 권한/도메인 제약으로 판단한다.

현재 상태:

com.openclaw.collab-review-loop: running, pid 1228
com.hermes.collab-review-loop: not loaded

기존 OpenClaw label은 새 Hermes label 로드가 실패했으므로 unload하지 않았다. 이 판단은 중단 방지를 위한 안전 조치다.

3. 나머지 4개 dry-run 결과

대상 구문 검증 권고
dispatch-watcher bash -n OK 다음 relabel 2순위. 단순 파일 감시라 안전
hermes-tailer py_compile OK 다음 relabel 3순위. Hermes 관측 보조
auto-dispatcher bash -n OK dispatch 핵심. 새 label 정상 실행 확인 후 기존 label unload
task-notifier py_compile OK Telegram ops 발송 가능. 중복 발송 방지 확인 후 마지막에 가까운 순서

auto_migrate_openclaw.py 확인 결과, 이 스크립트는 현재 SAFE_SMALL_5 allowlist용이라 이번 5개는 deny/차단된다.

BLOCK com.openclaw.collab-review-loop: not in SAFE_SMALL_5 allowlist

따라서 이번 5개 LaunchAgent relabel에는 수동 plist 방식이 맞다.

4. 다음 실행 명령

현재 Codex 세션에서 bootstrap이 막혔으므로, 해리 로컬 쉘 또는 권한 있는 세션에서 아래만 실행하면 cutover 가능하다.

UIDN=$(id -u)
launchctl bootstrap gui/$UIDN ~/Library/LaunchAgents/com.hermes.collab-review-loop.plist
launchctl kickstart -k gui/$UIDN/com.hermes.collab-review-loop
launchctl print gui/$UIDN/com.hermes.collab-review-loop | egrep 'state =|pid =|path =|program =|stdout path|stderr path'

# 새 label running 확인 후에만 기존 label 종료
launchctl bootout gui/$UIDN/com.openclaw.collab-review-loop
launchctl print gui/$UIDN/com.openclaw.collab-review-loop

5. 자체평가

  • 정확성: 4.0/5 — plist 생성, 백업, 코드 검증, 1회 실행 검증 완료. 다만 launchctl cutover는 세션 권한으로 실패.
  • 완성도: 3.8/5 — collab 실제 unload까지는 미완. 안전상 기존 label은 유지.
  • 검증: 4.2/5 — plist lint, py_compile, --once, 4개 dry-run 검증 완료.
  • 최소 변경: 4.7/5 — collab 신규 plist와 백업만 생성, 기존 실행 중 서비스는 건드리지 않음.

Remaining Risks: - com.hermes.collab-review-loop.plist는 생성됐지만 아직 launchd에 로드되지 않았다. - 다음 cutover 때 새 label과 기존 label을 동시에 오래 두면 loop 중복 가능성이 있으므로, 새 label running 확인 직후 기존 label을 bootout해야 한다.

DONE-STAGED