virtual-insanity
← 리포트 목록

유동성 3형제 브리핑/웹앱 end-to-end 검증

2026-04-15 liquidity [liquidity, briefing, webapp, verify, phase17-followup]

유동성 3형제 브리핑/웹앱 end-to-end 검증

결론

FAIL / BLOCKED. 선행 조건인 surface:4 backfill 결과가 현재 운영 경로에 도착하지 않았다.

  • 현재 운영 경로 workspace/memory/macro-timeseries/RRPONTSYD.json, WTREGEN.json, WRESBAL.json이 없다.
  • Hermes 현재 cron 등록에도 macro_series_collector.py, fed_liquidity_aggregator.py 실행 job이 보이지 않는다.
  • 과거 archive에는 3개 파일이 있으나 운영 입력 경로가 아니므로 이번 검증에는 사용하지 않았다.
  • aggregator는 필수 입력 WALCL/RRP/TGA를 읽지 못해 실패했다.
  • 브리핑 함수는 빈 데이터로 동작했고, 웹앱 API는 200을 반환하지만 배열이 모두 비어 있다.

체인 5단계 판정

단계 대상 판정 근거
1 FRED → macro_series_collector.pymemory/macro-timeseries/*.json FAIL 운영 경로에 원천 JSON 없음
2 fed_liquidity_aggregator.pymemory/fed-liquidity/latest.json FAIL 직접 실행 시 필수 데이터 없음, 출력 파일 없음
3 morning_briefing.py loader/oneliner/summary FAIL _load_fed_liquidity(){} 반환, oneliner 빈 문자열
4 webapp /api/fed-liquidity/chart FAIL HTTP 200이나 실제 데이터 배열이 모두 빈 배열
5 브리핑 샘플 생성 FAIL dry-run 성공했지만 “유동성” 라인 없음

실제 지표값

지표 최신 일자 최신값 레코드 수 상태
RRPONTSYD / RRP 없음 없음 0 파일 없음
WTREGEN / TGA 없음 없음 0 파일 없음
WRESBAL 없음 없음 0 파일 없음

참고: aggregator 필수 입력인 WALCL도 운영 경로에 없음.

oneliner 한국어 원문

""

_fed_liquidity_oneliner({}) 결과가 빈 문자열이었다. _summarize_fed_liquidity({})연준 유동성 데이터 없음을 반환했다.

브리핑 샘플 출력

브리핑 dry-run 자체는 성공했지만, “유동성” 섹션/라인은 출력되지 않았다.

# 모닝 브리핑 — 2026-04-15 (수)

## ① 주요 시장 지표 (LLM 미사용 — 데이터만)
- S&P500: 6951.24 (+0.9%) [!이상치]

/api/fed-liquidity/chart 응답 샘플

첫 3개 record: [] — 반환 배열이 모두 비어 있다.

{"dates":[],"net_t":[],"resv_t":[],"rrp_b":[],"rrp_t":[],"tga_t":[]}

엣지 케이스 days=0, days=abc도 현재 엔드포인트에서는 200 + 빈 배열을 반환했다. api_chart/<ticker> 쪽에는 days 가드가 있으나, fed-liquidity/chart에는 days 파라미터 처리 자체가 없다.

원문 커맨드 출력

0. 선행 조건 1차 확인

PWD=/Users/ron/.openclaw/workspace

## RRPONTSYD ls
ls: memory/macro-timeseries/RRPONTSYD.json: No such file or directory

## latest dates for liquidity trio
--- RRPONTSYD memory/macro-timeseries/RRPONTSYD.json exists= False
--- WTREGEN memory/macro-timeseries/WTREGEN.json exists= False
--- WRESBAL memory/macro-timeseries/WRESBAL.json exists= False

0-1. 2~3분 재확인 폴링

## poll 1 2026-04-15 09:42:36 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

## poll 2 2026-04-15 09:43:06 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

## poll 3 2026-04-15 09:43:36 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

## poll 4 2026-04-15 09:44:06 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

## poll 5 2026-04-15 09:44:36 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

## poll 6 2026-04-15 09:45:06 KST
RRPONTSYD exists= False count= 0 latest= None
WTREGEN exists= False count= 0 latest= None
WRESBAL exists= False count= 0 latest= None
READY= False

0-2. Hermes/OpenClaw 등록 상태

## equivalent path search for liquidity source files
### root=/Users/ron/.openclaw/workspace
### root=/Users/ron/.hermes
/Users/ron/.hermes/migration/openclaw/20260403T154207/archive/workspace/memory/macro-timeseries/WALCL.json
/Users/ron/.hermes/migration/openclaw/20260403T154207/archive/workspace/memory/macro-timeseries/WRESBAL.json
/Users/ron/.hermes/migration/openclaw/20260403T154207/archive/workspace/memory/macro-timeseries/RRPONTSYD.json
/Users/ron/.hermes/migration/openclaw/20260403T154207/archive/workspace/memory/macro-timeseries/WTREGEN.json
### root=/Users/ron/knowledge-agent
## current Hermes/OpenClaw job registrations for liquidity scripts
### /Users/ron/.hermes/cron/jobs.json
### /Users/ron/.openclaw/cron/jobs.json
macro-series-collector enabled= False schedule= {'kind': 'cron', 'expr': '50 6 * * 1-5', 'tz': 'Asia/Seoul'} type= None
name= 매크로 시계열 수집
migration= None
fed-liquidity-aggregator enabled= False schedule= {'kind': 'cron', 'expr': '0 7 * * *', 'tz': 'Asia/Seoul'} type= None
name= 연준 유동성 집계
migration= {'target': 'hermes', 'batch': 'AP', 'hermes_id': 'ocAP-AP002-fed-liquidity-command', 'status': 'verified_cutover', 'verified_at': '2026-04-14T16:47:47+09:00', 'dual_run_count': 3, 'strict_diff': 'passed', 'verification_reports': ['/Users/ron/.openclaw/workspace/verification/hermes-batch-AP-real/ocAP-AP002-fed-liquidity-command/cycle-1/20260414_164702_fed-liquidity-aggregator_ocAP-AP002-fed-liquidity-command.json', '/Users/ron/.openclaw/workspace/verification/hermes-batch-AP-real/ocAP-AP002-fed-liquidity-command/cycle-2/20260414_164704_fed-liquidity-aggregator_ocAP-AP002-fed-liquidity-command.json', '/Users/ron/.openclaw/workspace/verification/hermes-batch-AP-real/ocAP-AP002-fed-liquidity-command/cycle-3/20260414_164705_fed-liquidity-aggregator_ocAP-AP002-fed-liquidity-command.json']}
## hermes cron list/status liquidity check
/Users/ron/.local/bin/hermes
## hermes cron status

✗ 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

  4 active job(s)
  Next run: 2026-04-15T12:00:00+09:00

1. 데이터 파일 검증

## liquidity source data verification
--- RRPONTSYD
ls: memory/macro-timeseries/RRPONTSYD.json: No such file or directory
exists= False
--- WTREGEN
ls: memory/macro-timeseries/WTREGEN.json: No such file or directory
exists= False
--- WRESBAL
ls: memory/macro-timeseries/WRESBAL.json: No such file or directory
exists= False
--- WALCL
ls: memory/macro-timeseries/WALCL.json: No such file or directory
exists= False

2. fed_liquidity_aggregator 직접 실행

## fed_liquidity_aggregator direct run
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/ron/.openclaw/workspace/scripts/pipeline/fed_liquidity_aggregator.py", line 269, in main
    data = compute(target)
  File "/Users/ron/.openclaw/workspace/scripts/pipeline/fed_liquidity_aggregator.py", line 102, in compute
    raise ValueError(f"필수 데이터 없음 ({target_date}): WALCL={walcl}, RRP={rrp}, TGA={tga}")
ValueError: 필수 데이터 없음 (2026-04-15): WALCL=None, RRP=None, TGA=None
[fed_liquidity_aggregator] 시작: 2026-04-15
RC=1
## fed-liquidity output status
ls: memory/fed-liquidity: No such file or directory
## latest.json head
exists= False

3. morning_briefing 함수 검증

## morning_briefing fed liquidity function smoke
no oauth token found for github.com
load_type= dict
loaded_keys= []
loaded= {}
oneliner= 
summary= 연준 유동성 데이터 없음
RC=0

4. webapp API 검증

## webapp fed liquidity chart test_client
PATH= /api/fed-liquidity/chart
STATUS= 200
CONTENT_TYPE= application/json
BODY= {"dates":[],"net_t":[],"resv_t":[],"rrp_b":[],"rrp_t":[],"tga_t":[]}

PATH= /api/fed-liquidity/chart?days=0
STATUS= 200
CONTENT_TYPE= application/json
BODY= {"dates":[],"net_t":[],"resv_t":[],"rrp_b":[],"rrp_t":[],"tga_t":[]}

PATH= /api/fed-liquidity/chart?days=abc
STATUS= 200
CONTENT_TYPE= application/json
BODY= {"dates":[],"net_t":[],"resv_t":[],"rrp_b":[],"rrp_t":[],"tga_t":[]}

RC=0

엔드포인트 구현 확인:

## endpoint implementation excerpt
515:def _load_fed_liquidity() -> dict:
2377:@market_bp.route("/api/fed-liquidity/chart")
...
@market_bp.route("/api/fed-liquidity/chart")
def api_fed_liquidity_chart():
    """연준 유동성 52주 시계열 데이터 API."""
    fl = _load_fed_liquidity()
    history = fl.get("history", [])
    def _t_to_b(v):
        return round(v * 1000, 2) if v is not None else None

    return jsonify({
        "dates":  [h["date"] for h in history],
        "net_t":  [h.get("net_t") for h in history],
        "rrp_t":  [h.get("rrp_t") for h in history],
        "rrp_b":  [_t_to_b(h.get("rrp_t")) for h in history],  # B 단위
        "tga_t":  [h.get("tga_t") for h in history],
        "resv_t": [h.get("resv_t") for h in history],
    })

5. 브리핑 샘플 생성

## morning_briefing dry-run no-llm sample
no oauth token found for github.com
[2026-04-15 09:47:16] === 모닝 브리핑 시작: 2026-04-15 (수) ===
[2026-04-15 09:47:16] 데이터 수집 시작: 2026-04-15
[2026-04-15 09:47:16] 수집 완료: {"indicators_count": 87, "anomalies_count": 32, "hypotheses_count": 6, "experiments_count": 0, "ideas_count": 20, "sector_news_count": 0}
# 모닝 브리핑 — 2026-04-15 (수)

## ① 주요 시장 지표 (LLM 미사용 — 데이터만)
- S&P500: 6951.24 (+0.9%) [!이상치]
- 나스닥: 23558.09 (+1.6%) [!이상치]
- VIX: 18.46 (-3.5%)
- KOSPI: 5808.62 (-0.9%)
- KOSDAQ: 1099.84 (+0.6%)
- 미10년: 4.26 (-0.9%)
- 미2년: 3.81 (+0.0%)
- 한3년: 3.34 (-1.3%)
- 달러인덱스: 98.14 (-0.2%) [!이상치]
- 원달러: 1471.88 (-0.7%)
- WTI: 91.87 (-7.3%)
- 천연가스: 2.61 (-0.7%)
- 금: 4857.9 (+2.4%)
- 구리: 6.08 (+1.7%) [!이상치]
- DDR5: 37.2 (+0.3%)
- BDI: 11.32 (+2.4%) [!이상치]
- GPR지정학: 304.22 (+79.1%)
- EPU경제정책불확실성: 430.03 (+21.0%)
...
[2026-04-15 09:47:16] no-llm 모드 완료
RC=0

유동성 라인 필터:

## morning_briefing dry-run liquidity line check
RC=0
## lines containing 유동성
## first 25 lines
no oauth token found for github.com
[2026-04-15 09:47:22] === 모닝 브리핑 시작: 2026-04-15 (수) ===
[2026-04-15 09:47:22] 데이터 수집 시작: 2026-04-15
[2026-04-15 09:47:22] 수집 완료: {"indicators_count": 87, "anomalies_count": 32, "hypotheses_count": 6, "experiments_count": 0, "ideas_count": 20, "sector_news_count": 0}
# 모닝 브리핑 — 2026-04-15 (수)

## ① 주요 시장 지표 (LLM 미사용 — 데이터만)
- S&P500: 6951.24 (+0.9%) [!이상치]
- 나스닥: 23558.09 (+1.6%) [!이상치]
- VIX: 18.46 (-3.5%)
- KOSPI: 5808.62 (-0.9%)
- KOSDAQ: 1099.84 (+0.6%)
- 미10년: 4.26 (-0.9%)
- 미2년: 3.81 (+0.0%)
- 한3년: 3.34 (-1.3%)
- 달러인덱스: 98.14 (-0.2%) [!이상치]
- 원달러: 1471.88 (-0.7%)
- WTI: 91.87 (-7.3%)
- 천연가스: 2.61 (-0.7%)
- 금: 4857.9 (+2.4%)
- 구리: 6.08 (+1.7%) [!이상치]
- DDR5: 37.2 (+0.3%)
- BDI: 11.32 (+2.4%) [!이상치]
- GPR지정학: 304.22 (+79.1%)
- EPU경제정책불확실성: 430.03 (+21.0%)

판단

현재 문제는 downstream 로직 수정 문제가 아니라 선행 데이터/크론 등록 미완료로 보인다.

확인된 사실:

  1. 운영 입력 경로에 macro-timeseries 파일이 없다.
  2. 현재 Hermes jobs.json에는 관련 cron이 없다.
  3. OpenClaw jobs.json의 fed-liquidity-aggregator는 Hermes 이전 완료 메타데이터가 있으나, 대응 Hermes job이 현재 파일에서 확인되지 않는다.
  4. hermes cron status는 gateway not running을 보고한다.
  5. webapp API는 라우팅 자체는 살아 있으나 데이터가 비어 있다.

다음 확인 포인트

  • surface:4 backfill이 실제로 어느 경로에 쓰고 있는지 확인 필요.
  • Hermes cron 재등록이 ~/.hermes/cron/jobs.json에 반영됐는지 확인 필요.
  • backfill 완료 후 RRPONTSYD/WTREGEN/WRESBAL/WALCL 최신 record date가 최소 2026-04-14 이상인지 재검증 필요.
  • API days 파라미터 가드는 surface:8 작업 결과와 맞춰 별도 확인 필요. 현재 /api/fed-liquidity/chart는 days를 무시한다.

자체평가

  • 정확성: 5/5 — 선행 조건, 데이터, aggregator, briefing, webapp을 실제 명령으로 확인했다.
  • 완성도: 4/5 — upstream backfill 미완료로 PASS 검증은 불가능했지만 FAIL/BLOCKED 상태와 근거를 모두 남겼다.
  • 검증: 5/5 — 직접 실행, Flask test_client, 파일 검색, cron 등록 상태를 확인했다.
  • 최소 변경: 5/5 — 원본 스크립트 수정 없이 보고서만 작성했다.
  • 종합: 4.75/5

Remaining Risks: - 같은 “Hermes 이전 완료 메타데이터는 있으나 현재 Hermes jobs.json에는 job이 없는” 패턴이 다른 이전 cron에도 있을 수 있다.