virtual-insanity
← 리포트 목록

Hermes 이전 마감 작업 4/5 최종 전체 검증

2026-04-15 migrate [phase17-followup, hermes-migration, final-verify, openclaw-retirement]

Hermes 이전 마감 작업 4/5 최종 전체 검증

최종 판정

부분 PASS. OpenClaw freeze 권고는 보류.

통과한 것:

  • s:2/s:4/s:6 선행 보고서 3개 모두 생성 확인.
  • Hermes active cron은 8개 유지.
  • active cron command 내 /Users/ron/.openclaw 참조는 현재 0개.
  • 실제 경로형 .openclaw/ 잔존은 5개이며 모두 컨테이너 mount 계열로 분류 가능.
  • Hermes 데이터 경로는 존재한다.
  • price-history: /Users/ron/.hermes/workspace/memory/price-history
  • fed-liquidity: /Users/ron/.hermes/workspace/memory/fed-liquidity/latest.json
  • macro-timeseries: /Users/ron/.hermes/workspace/memory/macro-timeseries/*.json
  • newsletter vault: /Users/ron/knowledge-agent/100 수신함/121 뉴스레터
  • fed_liquidity_aggregator.py 현재 Hermes 경로 기준 직접 실행 성공.
  • price_history_collector.py 현재 Hermes 경로 기준 저장 로그 확인.

보류/실패한 것:

  • 요청된 hermes_cli.main cron status 명령은 Gateway is not running을 반환했다.
  • 다만 lsof는 18789 LISTEN PID를 확인했고, gateway.log는 14:07까지 Telegram polling과 API access 로그를 기록 중이다.
  • .tick.lock mtime도 최신이라 실제 ticker는 움직이는 정황이 있다.
  • 즉, CLI/launchd service status와 실제 foreground/API 프로세스 상태가 불일치한다.
  • macro-series-collector는 Hermes 경로에서 FRED key가 없어 직접 실행 시 exit 1이다.
  • /Users/ron/.hermes/fred_api_key 없음.
  • /Users/ron/.openclaw/fred_api_key는 존재.
  • fed-liquidity-aggregator job의 last_status는 아직 error로 남아 있다. 현재 command 직접 실행은 성공했으나 다음 cron tick 이후 상태 갱신 확인 필요.
  • blog_monitor.py --notify는 backlog 44건 주의가 남아 있다. 즉시 notify 실행 시 대량 발송 가능성 있음.
  • launchctl list | grep openclaw는 비어 있지만, ~/Library/LaunchAgents에는 OpenClaw plist 파일이 많이 남아 있다. 로드 상태와 파일 잔존은 분리해서 봐야 한다.

선행 조건 확인

대기 시작: 2026-04-15 13:42:29 KST
완료 확인: 2026-04-15 14:04:59 KST

[2026-04-15 13:42:29] poll 1/60 260415_migrate_s2_residual_files.md=MISS | 260415_migrate_s4_data_dirs.md=OK | 260415_migrate_s6_cron_verify.md=MISS
...
[2026-04-15 13:48:29] poll 13/60 260415_migrate_s2_residual_files.md=OK | 260415_migrate_s4_data_dirs.md=OK | 260415_migrate_s6_cron_verify.md=MISS
...
[2026-04-15 14:04:59] poll 46/60 260415_migrate_s2_residual_files.md=OK | 260415_migrate_s4_data_dirs.md=OK | 260415_migrate_s6_cron_verify.md=OK
READY

읽은 선행 보고서:

  • /Users/ron/knowledge-agent/400-reports/260415_migrate_s2_residual_files.md
  • /Users/ron/knowledge-agent/400-reports/260415_migrate_s4_data_dirs.md
  • /Users/ron/knowledge-agent/400-reports/260415_migrate_s6_cron_verify.md

s:6 기준 실패/주의:

  • ✅ 정상: price-history SPY refresh, fed-liquidity-aggregator, gmail-newsletter-collector
  • ⚠️ 주의: vault-analyst-feedback, bond-daily-report-real-notify, bond-morning-poll-real-gmail-collector, batchM-intelligence-blog-monitor
  • ❌ 수정 필요: macro-series-collector

1. OpenClaw 참조 0 확인 또는 허용 목록

요청 원문 명령 결과:

## OpenClaw references count raw
     127

raw count는 목표 <20을 넘는다. 하지만 s:2 보고서처럼 이 값에는 com.openclaw.* launchd label, ai.openclaw.* bundle/subsystem, ron.openclaw.local namespace, migration tool 내부 변수명까지 포함된다.

실제 디렉터리 경로형 .openclaw/만 다시 분리하면 5개다.

## exact .openclaw/ path-like count excluding .bak
       5
## path-like refs
/Users/ron/.hermes/workspace/scripts/podman/openclaw.container.in:13:EnvironmentFile={{OPENCLAW_HOME}}/.openclaw/.env
/Users/ron/.hermes/workspace/scripts/test-live-models-docker.sh:30:  -v "$WORKSPACE_DIR":/home/node/.openclaw/workspace \
/Users/ron/.hermes/workspace/scripts/test-live-gateway-models-docker.sh:29:  -v "$WORKSPACE_DIR":/home/node/.openclaw/workspace \
/Users/ron/.hermes/workspace/scripts/run-openclaw-podman.sh:189:    -v "$WORKSPACE_DIR:/home/node/.openclaw/workspace:rw" \
/Users/ron/.hermes/workspace/scripts/run-openclaw-podman.sh:203:  -v "$WORKSPACE_DIR:/home/node/.openclaw/workspace:rw" \
## absolute /Users/ron/.openclaw refs excluding .bak

판정: 부분 PASS

  • strict raw grep 기준: FAIL (127)
  • 운영 경로형 참조 기준: PASS (5, 모두 컨테이너 계열)
  • active cron command 기준: PASS (/Users/ron/.openclaw 없음; s:4 보고서와 현 jobs.json 확인)

2. cron scheduler 상태

요청 명령 결과:

## cron status via requested command

✗ Gateway is not running — cron jobs will NOT fire

  To enable automatic execution:
    hermes gateway install    # Install as a user service
    sudo hermes gateway install --system  # Linux servers: boot-time system service
    hermes gateway            # Or run in foreground

  8 active job(s)
  Next run: 2026-04-15T16:46:14+09:00

## gateway log recent errors

hermes gateway status도 launchd service 기준으로 not loaded를 반환했다.

Launchd plist: /Users/ron/Library/LaunchAgents/ai.hermes.gateway.plist
⚠ Service definition is stale relative to the current Hermes install
  Run: hermes gateway start
✗ Gateway service is not loaded
  Service definition exists locally but launchd has not loaded it.
  Run: hermes gateway start

하지만 실제 로그/포트 정황은 다르다.

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Python  50183  ron   21u  IPv4 0xd94e553afa70ae0b      0t0  TCP 127.0.0.1:18789 (LISTEN)
## tick lock status
-rw-r--r--@ 1 ron  staff  0 Apr 15 14:07 /Users/ron/.hermes/cron/.tick.lock
mtime=Apr 15 14:07:36 2026 size=0

gateway.log 최근 tail은 Telegram polling과 API access가 계속 남는다. 민감 토큰은 보고서에서 마스킹했다.

2026-04-15 14:06:53,550 INFO httpx: HTTP Request: POST https://api.telegram.org/bot***/getUpdates "HTTP/1.1 200 OK"
2026-04-15 14:07:03,803 INFO httpx: HTTP Request: POST https://api.telegram.org/bot***/getUpdates "HTTP/1.1 200 OK"
2026-04-15 14:07:12,605 INFO aiohttp.access: 127.0.0.1 [15/Apr/2026:14:07:12 +0900] "GET /v1/models HTTP/1.1" 200 397 "-" "curl/8.7.1"
2026-04-15 14:07:14,589 INFO httpx: HTTP Request: POST https://api.telegram.org/bot***/getUpdates "HTTP/1.1 200 OK"

현재 Codex sandbox에서는 localhost socket connect가 차단되어 API 직접 검증은 실패했다.

socket_connect=FAIL PermissionError(1, 'Operation not permitted')

판정: 부분 PASS / 상태 불일치

  • active jobs: 8개 OK
  • next run: 있음
  • 실제 gateway 로그/포트: alive 정황
  • CLI/launchd status: FAIL
  • 결론: freeze 전 hermes gateway status와 실제 프로세스/launchd 상태를 하나로 맞춰야 한다.

3. cron entry 실제 실행 재검증

현재 active jobs:

active_count= 8

ID= 41c2736f0527
name= vault-analyst-feedback
kind= prompt
command= None
last_status= ok last_error= None
next_run_at= 2026-04-16T09:00:00+09:00

ID= ocPH-SPY-price-history-refresh
name= price-history SPY refresh
kind= shell
command= python3 /Users/ron/.hermes/workspace/scripts/pipeline/price_history_collector.py --ticker SPY
last_status= ok last_error= None
next_run_at= 2026-04-15T18:00:00+09:00

ID= ocAK-AK000-bond-daily-dry-run
name= bond-daily-report-real-notify
kind= shell
command= PYTHONPATH=/Users/ron/.hermes/workspace/scripts/shared:/Users/ron/.hermes/workspace/scripts/pipeline /usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/bond_daily_report.py --notify
last_status= ok last_error= None
next_run_at= 2026-04-16T02:30:00+09:00

ID= ocAO-AO003-bond-morning-command
name= bond-morning-poll-real-gmail-collector
kind= shell
command= /usr/bin/python3 /Users/ron/.hermes/workspace-root-scripts/gmail_credit_monitor.py --fixed-income-only && echo 완료
last_status= ok last_error= None
next_run_at= 2026-04-16T07:03:00+09:00

ID= macro-series-collector
name= macro-series-collector FRED macro timeseries collector
kind= shell
command= /usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/macro_series_collector.py
last_status= ok last_error= None
next_run_at= 2026-04-16T06:50:00+09:00

ID= fed-liquidity-aggregator
name= fed-liquidity-aggregator Fed liquidity aggregator
kind= shell
command= /usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/fed_liquidity_aggregator.py
last_status= error last_error= Exit code 1
next_run_at= 2026-04-16T07:00:00+09:00

ID= ocM-M019-blog-monitor
name= batchM-intelligence-blog-monitor
kind= shell
command= python3 /Users/ron/.hermes/workspace/scripts/pipeline/blog_monitor.py --notify
last_status= None last_error= None
next_run_at= 2026-04-15T16:46:14+09:00

ID= ocAQ-AQ004-gmail-newsletter-command
name= gmail-newsletter-collector
kind= shell
command= PYTHONPATH=/Users/ron/.hermes/workspace/scripts/shared:/Users/ron/.hermes/workspace/scripts/pipeline bash /Users/ron/.hermes/workspace/scripts/pipeline/gmail_newsletter_collector_dual.sh --days 2
last_status= None last_error= None
next_run_at= 2026-04-16T06:47:00+09:00

재검증 요약:

entry 결과 근거
price-history SPY refresh PASS 현재 Hermes command 직접 실행, 저장 경로 Hermes 출력, RC=0
fed-liquidity-aggregator PASS / 상태 갱신 필요 직접 실행 RC=0, latest.json Hermes 경로 저장. jobs.json last_status는 이전 error 유지
macro-series-collector FAIL Hermes FRED key 없음으로 dry-run 1개 series도 RC=1
gmail-newsletter-collector 부분 PASS 기존 vault 파일 13:18~13:24 저장 확인. safe run은 sandbox DNS 제한으로 Gmail token refresh 실패
blog_monitor 주의 s:6 dry-run 기준 backlog 44건, current command는 --notify
bond notify 계열 주의 실제 실행 시 텔레그램 발송 가능성이 있어 직접 실행하지 않음. s:6 dry-run/최근 output 기준 확인
vault-analyst-feedback 주의 prompt job. 구현 파일과 job wiring 분리

macro collector 현재 실패:

[macro_series_collector] 시작 — incremental(최근 60일)
  ⚠️  dry-run 모드: 실제 저장 없음
  ❌  DGS10: FRED API 키 없음. https://fred.stlouisfed.org/docs/api/api_key.html 에서 무료 발급 후 ~/.hermes/fred_api_key 파일에 저장하거나 FRED_API_KEY 환경변수로 설정하세요.

완료: 0개 성공, 1개 실패
요약: 0/1 succeeded, 1 failed (success_rate=0.0%)
  실패 목록: DGS10
❌ macro_series_collector 실패: 성공한 시리즈가 0개입니다.
RC=1

키 위치:

## FRED key locations
MISSING /Users/ron/.hermes/fred_api_key
EXISTS /Users/ron/.openclaw/fred_api_key size=      33

참고: 기존 cron output에는 오래된 OpenClaw path 실행 기록이 남아 있다. 현재 jobs.json command는 Hermes path로 바뀌었지만, 다음 tick 이후 output 갱신 확인이 필요하다.

# fed-liquidity-aggregator old output
**Command:** `/usr/bin/python3 /Users/ron/.openclaw/workspace/scripts/pipeline/fed_liquidity_aggregator.py`
**Exit Code:** 1

4. 데이터 저장 경로 확인

price_history_collector.py

직접 실행 결과 저장 로그가 Hermes 경로다.

## price_history_collector SPY run
=== 가격 이력 수집 시작 [증분] — 1개 티커 ===
저장 경로: /Users/ron/.hermes/workspace/memory/price-history

  [SPY] 증분 수집 (마지막: 2026-04-14)...
  [WARN] SPY yfinance 수집 실패: 'NoneType' object is not subscriptable
  [SPY] StockAnalysis fallback 시도...
  [WARN] SPY fallback 실패 — 기존 51일치 유지: <urlopen error [Errno 8] nodename nor servname provided, or not known>

=== 완료 — 성공 1/1, 실패 0 ===
RC=0

파일 존재:

/Users/ron/.hermes/workspace/memory/price-history/SPY.json

fed_liquidity_aggregator.py

직접 실행 성공. latest.json은 Hermes 경로.

## fed_liquidity_aggregator run
[fed_liquidity_aggregator] 시작: 2026-04-15
[fed_liquidity_aggregator] 저장 완료: /Users/ron/.hermes/workspace/memory/fed-liquidity/latest.json
  국면: 유동성 축소 — 흡수 국면
  순유동성: $5.9452T  WoW: $-0.0001T
[fed_liquidity_aggregator] 완료
RC=0
path= /Users/ron/.hermes/workspace/memory/fed-liquidity/latest.json
date= 2026-04-15 phase= 유동성 축소 — 흡수 국면 net_t= 5.9452 wow_t= -0.0001

macro-timeseries

Hermes 경로에 JSON 존재. 최신값:

--- RRPONTSYD exists= True
count= 40 latest= {'date': '2026-04-14', 'value': 0.306}
--- WTREGEN exists= True
count= 8 latest= {'date': '2026-04-08', 'value': 748376.0}
--- WRESBAL exists= True
count= 8 latest= {'date': '2026-04-08', 'value': 3116247.0}
--- WALCL exists= True
count= 8 latest= {'date': '2026-04-08', 'value': 6693871.0}

newsletter vault

뉴스레터 저장 파일은 knowledge-agent vault에 정상 존재한다.

## newsletter recent vault files
-rw-r--r--@ 1 ron  staff  1625 Apr 15 13:24 260408_LinasNewsletter_dLocal-is-building-a-monopoly-in-plain-s.md
-rw-r--r--@ 1 ron  staff  3847 Apr 15 13:24 260409_LinasNewsletter_Anthropic-stopped-selling-Intelligence-a.md
-rw-r--r--@ 1 ron  staff  3017 Apr 15 13:24 260410_LinasNewsletter_The-Definitive-Guide-to-Perplexity-Compu.md
-rw-r--r--@ 1 ron  staff  3107 Apr 15 13:23 260412_LinasNewsletter_Visas-AI-bet-be-the-Bouncer-not-the-Regi.md
-rw-r--r--@ 1 ron  staff  1906 Apr 15 13:23 260413_LinasNewsletter_How-to-Build-an-AI-Agent-from-Scratch-Wi.md
-rw-r--r--@ 1 ron  staff  3038 Apr 15 13:23 260414_LinasNewsletter_One-unreleased-AI-model-just-triggered-a.md
-rw-r--r--@ 1 ron  staff  1823 Apr 15 13:20 260410_AppEconomyInsights_Anthropic-Leapfrogs-OpenAI.md
-rw-r--r--@ 1 ron  staff  2811 Apr 15 13:18 260415_Damnang_Credo-Technology-Deep-Dive.md

safe run with --days 0 --no-digest는 sandbox DNS 제한으로 Gmail API refresh에서 실패했다. 기존 저장 파일과 s:6 output 기준으로 저장 경로 자체는 정상으로 판단한다.

[done] 0건 수집 완료
[dual-collector] gmail_token.json ok
...
google.auth.exceptions.TransportError: HTTPSConnectionPool(host='oauth2.googleapis.com', port=443): Max retries exceeded ...
[dual-collector] gmail_token_mangdeng2.json FAILED rc=1
RC=1

판정: 부분 PASS

5. OpenClaw 프로세스 의존성 없음 확인

요청 명령 pgrep -fl openclaw는 현재 Codex sandbox 권한 제한으로 실패했다.

## openclaw processes
sysmon request failed with error: sysmond service not found
pgrep: Cannot get process list

launchctl list | grep openclaw는 빈 결과다.

## launchctl list grep openclaw exact rerun

다만 LaunchAgents 파일은 남아 있다. 파일 존재와 loaded 상태는 다르다.

## LaunchAgents file counts (names only)
      44
       9
## enabled-looking openclaw plist names (no contents)
ai.openclaw.companion.plist
ai.openclaw.memory-guardian.plist
ai.openclaw.staged-boot.plist
com.openclaw.agent-queue-codex.plist
com.openclaw.agent-queue-cowork.plist
com.openclaw.agent-queue-fundamental.plist
com.openclaw.agent-queue-guardian.plist
com.openclaw.agent-queue-macro.plist
com.openclaw.agent-queue-pm.plist
com.openclaw.agent-queue-ron.plist
...

판정: 부분 PASS

  • loaded launchctl 기준: OpenClaw 없음
  • process grep 기준: 권한 제한으로 미확인
  • filesystem 기준: plist 파일 다수 잔존, 별도 cleanup 필요

6. OpenClaw 디렉토리 freeze 권고

지금은 freeze 권고 보류.

이유:

  1. macro-series-collector가 Hermes 단독으로 아직 실패한다. ~/.hermes/fred_api_key 배치 또는 job env 주입이 필요하다.
  2. hermes cron status가 Gateway not running을 보고한다. 실제 gateway 로그/포트와 불일치하므로 freeze 전 health 상태를 정합화해야 한다.
  3. fed-liquidity-aggregator는 직접 실행 성공했지만 cron last_status=error가 남아 있다. 다음 tick 또는 수동 tick 후 상태 갱신 확인 필요.
  4. blog_monitor.py --notify backlog 44건 발송 위험이 남아 있다.
  5. OpenClaw LaunchAgents 파일이 여전히 다수 남아 있다. loaded는 아니지만 cleanup/freeze 전 의도 확인 필요.

따라서 chmod -R a-w ~/.openclaw/workspace는 아직 실행하지 않았고, 권고도 조건부 보류한다.

조건부 freeze 가능 기준:

  • /Users/ron/.hermes/fred_api_key 또는 Hermes cron env에 FRED key 배치 후 macro-series-collector --series DGS10 --dry-run exit 0 확인
  • hermes cron status / hermes gateway status / 18789 API health 상태 일치
  • fed-liquidity-aggregator cron last_status 갱신 확인
  • blog monitor backlog seed 또는 notify 폭주 방지 처리
  • OpenClaw plist 파일 cleanup/disabled 정책 확정

잔존 이슈 리스트

  1. Gateway status 불일치
  2. CLI/launchd: not loaded
  3. lsof/log/tick lock: alive 정황
  4. 최종 판정 전 정합화 필요

  5. macro-series-collector FRED key 없음

  6. /Users/ron/.hermes/fred_api_key 없음
  7. 현재 Hermes cron command는 env 주입 없음
  8. 다음 06:50 tick에서 실패 가능성 높음

  9. fed-liquidity-aggregator last_status stale error

  10. 직접 실행은 성공
  11. jobs.json 상태는 아직 error
  12. 다음 tick 후 갱신 필요

  13. blog_monitor notify backlog

  14. s:6 dry-run 기준 44건 backlog
  15. 현 command는 --notify
  16. 첫 운영 tick 전 seed/limit/no-notify 처리 필요

  17. OpenClaw LaunchAgents 파일 잔존

  18. launchctl list에는 없음
  19. 파일은 다수 존재
  20. cleanup 작업은 별도 승인/분배 필요

  21. sandbox 기반 네트워크 검증 제한

  22. FRED/Gmail/localhost socket 검증 일부가 sandbox DNS/permission 제한으로 실패
  23. 기존 gateway 로그와 다른 세션 escalated 결과로 보완 판단함

종합 판정표

항목 판정 요약
선행 보고서 3개 PASS 14:04:59 모두 생성 확인
OpenClaw 참조 부분 PASS raw 127, 경로형 5, active command 0
cron scheduler 상태 부분 PASS 8 active/tick 정황 OK, CLI status not loaded
cron entry 재검증 부분 PASS macro FAIL, blog/bond 주의, fed 직접 OK
데이터 저장 경로 부분 PASS Hermes 경로 확인. newsletter safe run은 sandbox DNS 실패
OpenClaw 프로세스 의존성 부분 PASS launchctl loaded 없음, pgrep 권한 제한, plist 파일 잔존
freeze 권고 보류 아직 조건 미충족

자체평가

  • 정확성: 4.5/5 — 요청 명령과 실제 경로/로그를 모두 확인했고, CLI 상태와 실제 프로세스 정황을 분리했다.
  • 완성도: 4.3/5 — sandbox 권한/DNS 제한 때문에 pgrep, localhost API, Gmail/FRED 네트워크 일부는 직접 완료 검증하지 못했다.
  • 검증: 4.4/5 — 선행 보고서, grep, cron status, jobs.json, 데이터 파일, 직접 실행, 로그 tail을 확인했다.
  • 최소 변경: 5/5 — freeze/서비스 재시작/secret copy 없이 보고서만 작성했다.
  • 종합: 4.55/5

Remaining Risks: - Gateway status 불일치가 반복되고 있다. CLI가 launchd 기준으로 not loaded를 보고하는데 실제 로그/포트는 alive인 상태라, 다음 단계에서 health 기준 단일화가 필요하다. - OpenClaw launchd plist 파일이 loaded는 아니어도 다수 남아 있어, freeze 이후 혼선 가능성이 있다.