JP모건 크레딧 간행물 누락 — 대체경로 제안서 (실존 경로 재검증판)
JP모건 크레딧 간행물 누락 — 대체경로 제안서 (실존 경로 재검증판)
작성: 2026-09-26 11:36~11:50 KST, cowork. 코드 수정 없음(읽기·재현만).
이 문서의 모든 파일 경로는 작성 시점에 ls -l로 실존을 확인했다. 과거 반려 사유였던
워크스페이스 경로(/Users/ron/.hermes/workspace/report_routing.py,
/Users/ron/.hermes/workspace/build_house_daily_digest.py,
/Users/ron/.hermes/workspace/tests/test_report_routing.py)는 실존하지 않으므로 인용 금지.
레포 절대경로(이하 REPO): /Users/ron/knowledge-agent/400-reports/hermes-research-sales-engine
| 파일 | 크기·수정 | 실존 확인 |
|---|---|---|
REPO/scripts/report_routing.py |
30,194B, 09-26 06:22 | ls -l exit 0 |
REPO/scripts/build_house_daily_digest.py |
29,480B, 09-26 06:29 | ls -l exit 0 |
REPO/tests/test_report_routing.py |
7,700B, 09-26 06:22 | ls -l exit 0 |
REPO/tests/test_report_routing.py.bak-jpmpub-20260926 |
3,903B, 08-13 | ls -l exit 0 |
REPO/scripts/report_routing.py.bak-jpmpub-20260926 |
29,356B, 09-07 | ls -l exit 0 |
REPO/scripts/build_house_daily_digest.py.bak-window-20260926 |
28,646B, 09-08 | ls -l exit 0 |
REPO/tests/test_build_house_daily_digest_window.py |
1,931B, 09-26 06:29 | ls -l exit 0 |
REPO/scripts/collect_jpmorgan_archive.py |
19,552B, 08-27 | ls -l exit 0 |
1. [권고]
한 줄 결론: 오늘 새벽 두 개의 코드 보정(라우팅 06:22, 날짜 창 06:29)은 들어갔지만 앞으로 돌 실행에만 적용된다. 이미 지나간 09-21~25 외사별일일 JP모건 0건은 자동으로 복구되지 않고, 내일(09-27 일) 주간 크레딧 요약본에서도 JP모건이 빠진다. 그리고 144A 편입 분석이 새 규칙에서 실제로 통과하는지는 수집 로그에 판정 근거 메타가 안 남아 확인 불가다.
- 0순위(ron, 코드 수정 아님, 오늘 중) — 09-21 외사별일일 JP모건 재생성
- 무엇:
cd REPO && python3 scripts/build_house_daily_digest.py --date 2026-09-21 --no-upload(발송 플래그--send금지). - 왜: 새 날짜 창으로 재현하면 09-21 창은 09-19~09-21이고 JP모건 포함 대상 5건(09-19 Credit Market Outlook & Strategy,
09-20 Global FI Markets Weekly·The J.P. Morgan View·U.S. FI Markets Weekly·US Weekly Prospects)이 잡힌다.
09-21 실제 산출(08:17)은 보정 전이라 바클레이즈·골드만 2개뿐이었다(
output/pdf/house-daily/20260921/manifest.json). - 기대효과:
외사 리서치/2026-09-21/00_외사별일일/260921_jpmorgan_외사별일일.md1건 생성 → 09-27 요약본(대상 09-21~27)에 JP모건 재료 0 → 5건. 부작용: 같은 날 바클레이즈·골드만 파일도 주말분만큼 다시 쓰일 수 있으므로 실행 전 해당 폴더 백업. - 1순위(codex) — 수집 로그에 라우팅 판정 메타 보존
- 무엇:
REPO/scripts/collect_jpmorgan_archive.pycollect()안listing_rows.append({...})(305~315행)에publications,businessGroup,synopsis3필드를 추가(이미_row_metadata()176~196행이 만드는 값을 그대로 복사). - 왜: 목록 파일
runs/20260926/jpmorgan/listing-060035.untitled.json의 144A 행에는assetClasses=[FixedIncome],regions=[NorthAmerica]만 남아 있다. 이 값으로 새 규칙을 재현하면 exclude, 간행물명·Credit Research를 넣으면 include(ig_market)로 갈린다. 즉 06:22 보정이 실제 피드에서 먹히는지를 지금 로그로는 판정할 수 없다. - 기대효과: 라우팅 수정 때마다 과거 실행 전수를 재분류해 "의도한 건만 바뀌었는지" 숫자로 확인 가능(현재 0% → 100%).
- 1순위(codex, 병행) — 기대 시리즈 감시: 기존 정본 제안서 §8 T1 그대로(
_series_staleness()신설,status=partial). 근거: 09-21~26 6회 실행 전부status=ok, 목록 50 · 포함 24/23/23/23/21/20 · 저장 0(아래 현황 표). 조용한 누락이 계속ok로 찍힌다. - 2순위(codex) — 일요일 볼트 변환 사전 단계: 정본 제안서 §8 T2 그대로(
scripts/prepare_weekend_obsidian_notes.py신설,deliver_research_link_brief._write_obsidian_notes()직접 호출). 주말 저장 JP모건 주간물이 일요일 요약본에 들어가게 한다. - 3순위(선행조건 있음) — 두 번째 목록 채널: 정본 제안서 §8 T3. 해리의 JP모건 리서치 앱 약관 1회 수락 + ron의 목록 주소 실측 전 착수 금지.
- 하지 말 것: 홈 피드 50건 상한 조정(서버 고정, 효과 0 — 참고본 실측), 워크스페이스 경로에 새 스크립트 생성.
2. [현황] — 오늘 직접 확인한 수치
2-1. 외사별일일 폴더(/Users/ron/knowledge-agent/400-reports/외사 리서치/<날짜>/00_외사별일일/)
| 날짜 | 외사 파일 수 | jpmorgan | 들어온 외사 |
|---|---|---|---|
| 09-21(월) | 2 | 0 | 바클레이즈, 골드만 |
| 09-22(화) | 7 | 0 | 바클레이즈, 보파, 씨티, 골드만, HSBC, 모건스탠리, 노무라 |
| 09-23(수) | 7 | 0 | 동일 |
| 09-24(목) | 6 | 0 | 모건스탠리 빠짐 |
| 09-25(금) | 5 | 0 | 보파·모건스탠리 빠짐 |
→ 5영업일 JP모건 0/5. 같은 기간 분류 폴더 *jpmorgan* 노트도 0건, raw/jpmorgan/의 마지막 저장일은 20260919.
2-2. JP모건 수집 결과(REPO/runs/<날짜>/daily-collection-0545*.json, results[]의 source=jpmorgan)
| 실행일 | status | 목록 | 포함(eligible) | 저장 | 중복 |
|---|---|---|---|---|---|
| 09-21 | ok | 50 | 24 | 0 | 24 |
| 09-22 | ok | 50 | 23 | 0 | 23 |
| 09-23 | ok | 50 | 23 | 0 | 23 |
| 09-24 | ok | 50 | 23 | 0 | 23 |
| 09-25 | ok | 50 | 21 | 0 | 21 |
| 09-26 | ok | 50 | 20 | 0 | 20 |
→ 수집기는 정상 동작, 새 글이 목록에 안 뜨는 것이 원인(목록 미노출). 09-26 새로 뜬 144A 편입 분석(GPS-5456329-0, 09-25 발행)은
06:00 실행 당시 excluded_by_routing, 사유 "US IG·한국물·미국 금리/거시 연결이 확인되지 않음"(runs/20260926/jpmorgan/discovery.jsonl).
data/archive_index.json에 GPS-5456329-0 0건(미저장).
2-3. 오늘 들어간 두 보정의 실제 상태
- 라우팅(
report_routing.py): 148행_JPMORGAN_CREDIT_PUBLICATIONS3종, 404행if source_key == "jpmorgan":분기, 415~418행 간행물 메타 일치 시include/ig_market, 419~420행Credit Research+ 북미·글로벌 시 포함. 테스트는test_report_routing.py에 3개 추가(백업 대비 +94행, 백업 모듈과 결과 비교하는 회귀 테스트 포함). - 날짜 창(
build_house_daily_digest.py): 396행_collection_window(), 408행_in_collection_window(), 428·431행 호출. 재현: 09-21 → (09-19~09-21) JP모건 5건, 09-22~25 → 당일 하루 창 0건, 09-28 → (09-26~09-28) 현재 0건(아직 수집 전). python3 -m pytest tests/test_build_house_daily_digest_window.py tests/test_report_routing.py -q→ 13 passed.- 크론
research-house-daily-0815(15 8 * * 1-5,/Users/ron/.hermes/cron/jobs.json7289행)은 평일만 돈다 → 보정 효과가 처음 나오는 건 09-28(월) 08:15. 09-21은 이미 지나갔으므로 0순위 재생성이 필요하다.
2-4. 주간 요약본 영향: 크론 5c45c26045be(jobs.json 7964행, 일요일 09:00)는 target-6~target 날짜 폴더를 읽는다.
09-21~26 폴더 JP모건 파일 0건 → 0순위 미실행 시 09-27 요약본 JP모건 블록 누락 확정(다른 외사가 3개 이상이라 발송 게이트는 통과 → 조용한 누락).
3. [리스크]
- 단일 장애점 — 목록 채널 1개:
collect_jpmorgan_archive.py38행FEED_URL하나에 100% 의존. 50건 서버 고정·계정 맞춤형이라 크레딧 데스크 간행물은 08-13~09-25 43회 실행 중 08-27 1회만 노출(참고본 실측). 3순위 없이는 구조적으로 해결 불가. - 검증 공백: 1순위(메타 보존) 전까지 라우팅 보정이 실제 피드에서 먹히는지는 "다음 실행에 저장되느냐"로만 사후 확인 가능.
09-27 새벽 실행에서 GPS-5456329-0이
saved가 아니면, 원인이 규칙인지 메타 누락인지 로그만으로는 못 가른다. - 재생성 부작용(0순위):
build_house_daily_digest.pymain()은 날짜 폴더 md와data/house_daily_digest_cache.json을 덮어쓴다. 09-21 바클레이즈·골드만 파일이 주말분 포함으로 내용이 바뀔 수 있다 → 실행 전외사 리서치/2026-09-21/00_외사별일일/백업. - 라우팅 오탐:
Credit Research조건은 유럽·중남미·중국 크레딧까지 끌어올 수 있다. 현재 419행이 regions를 북미·글로벌로 제한하고, 테스트test_jpmorgan_credit_research_north_america_includes가 European Credit Weekly 비포함을 확인한다(통과). - 대체 수집 후보별 제약: (a) 간행물·섹션 목록 채널 — 리서치 앱 약관 동의 화면에서 정지, 해리 수락 필요(에이전트 대리 수락 금지)
(b) 검색 조회(
CFP?page=search) — 인증 오류로 막힘 (c) 메일 알림 —collect_broker_mail_archive.py는 JP모건 인식 규칙이 있으나 09-21~25 JP모건 메일 저장 0건, 구독 설정은 해리 계정 작업.
4. codex에 넘길 수정 지점 (파일·함수·행, 전부 ls 실존 확인)
| 우선 | 파일 | 함수·행 | 변경 |
|---|---|---|---|
| 1 | REPO/scripts/collect_jpmorgan_archive.py |
collect() 305~315행 listing_rows.append |
publications/businessGroup/synopsis 추가 (_row_metadata() 176~196행 값 재사용) |
| 1 | 같은 파일 | 신규 _series_staleness(), collect() 255행·_fetch_feed() 199행 결과 사용, 468행 status 판정 |
기대 시리즈 초과 시 stale_series + status=partial |
| 1 | REPO/scripts/check_source_health.py |
70행 안내문 | "최신 5건" → 홈 피드 50건, listing_gap 경고 |
| 2 | 신규 REPO/scripts/prepare_weekend_obsidian_notes.py |
deliver_research_link_brief._write_obsidian_notes() import만 |
토·일 날짜 볼트 변환(발송 경로 호출 금지) |
| 3(보류) | REPO/scripts/collect_jpmorgan_archive.py |
신규 _fetch_series_listing(), 323~441행 listing_channel 하드코딩 교체 |
두 번째 목록 채널 — 약관 수락·주소 실측 후 |
| 수정 불필요 | REPO/scripts/report_routing.py 148·404·415~420행, REPO/scripts/build_house_daily_digest.py 396·408·428행 |
— | 09-26 06:22/06:29 반영 완료, 재발행 금지 |
위임 방법: codex exec --skip-git-repo-check --sandbox workspace-write -C REPO - < prompt.md
(/Users/ron/.hermes/workspace/scripts/codex_answer.sh는 빈 스텁이라 사용 금지). 위임 전 .bak-<태그>-20260926 백업, 위임 후 diff -u.
5. [검증방법]
| 대상 | 명령 | 기대값 | 실패·롤백 조건 |
|---|---|---|---|
| 0순위 재생성 | ls "/Users/ron/knowledge-agent/400-reports/외사 리서치/2026-09-21/00_외사별일일/" \| grep -c jpmorgan |
1 이상, md 안 "포함 리포트" 5건 | 0이면 output/pdf/house-daily/20260921/manifest.json의 failed_sources 확인 |
| 라우팅 실효 | grep GPS-5456329-0 REPO/runs/20260927/jpmorgan/discovery.jsonl |
fetch_status = saved 또는 duplicate |
excluded면 1순위(메타 보존) 먼저 적용 후 원인 재판정 |
| 메타 보존(1순위) | python3 -c "import json;r=json.load(open('<listing 파일>'))['results'];print(sum('publications' in x for x in r),len(r))" |
50 50 | 필드 누락 행 존재 |
| 시리즈 감시 | 정본 §8 T1 테스트 tests/test_jpmorgan_series_staleness.py |
정상 목록 [], 시리즈 제거 시 partial |
오탐 주 3회 이상 → 허용 지연일 조정 |
| 날짜 창 운영 | 09-28(월) 08:15 후 ls "외사 리서치/2026-09-28/00_외사별일일/" \| grep -c jpmorgan |
주말 저장분 있으면 1 | 화~금 외사별 건수가 보정 전과 달라지면 백업(.bak-window-20260926)으로 복귀 |
| KPI(2주) | 평일 외사별일일 JP모건 ≥ 주 1건, 일요일 요약본 근거목록 JSON에 jpmorgan 존재 | 4주 중 3주 이상 | — |