JP모건 수집 목록 50건 고정 한계 — IG 누락 방지 설계안 (대안 비교 + codex 위임 명세)
JP모건 수집 목록 50건 고정 한계 — IG 누락 방지 설계안
선행 진단: [[260926_hermes_jpmorgan-discovery-gap]] (같은 날 00:28 작성, 노출 문제 판정). 이 문서는 그 진단을 코드 줄 번호로 재확인하고, 세 가지 대안을 비교한 뒤 codex 위임용 명세까지 적는다. 코드 수정은 하지 않았다.
모든 인용 경로는 실존 확인함(ls/grep -n, 2026-09-26 KST). 스크립트 루트 = /Users/ron/knowledge-agent/400-reports/hermes-research-sales-engine/scripts/.
결론
JP모건 수집기는 홈 피드 한 곳(50건, 페이지 넘김 없음) 만 읽는다. 이 피드는 계정 맞춤형 고정 묶음이라 크레딧 데스크 IG 간행물(High Grade Weekly Spotlight, HG Credit Foreign Demand Monitor)이 43회 실행 중 8/27 단 1회만 떴다. 그래서 9/21~25 JP모건 신규는 0건인데 수집 결과는 매일 ok였다(조용한 누락). 권고 순서는 ② 누락 감지 경보(즉시) → ① 검색 기반 보조 수집(목록 주소 실측 후) → ③ 크레딧/IG 우선 필터 보강(①과 동시) 이다. ③ 단독은 효과가 없다 — 목록에 안 뜬 글은 필터를 넓혀도 안 들어온다.
1. 목록 수집 로직 — 줄 번호 정리 (collect_jpmorgan_archive.py, 492줄)
| 줄 | 원문/내용 | 의미 |
|---|---|---|
| 11–13 | 현재 계정은 홈 피드 50건은 보이나 CFP-RESEARCH 원문은 … 따라서 발견 목록은 남기되, 원문 저장은 0건일 수 있다. |
설계 당시(8/13)부터 목록 원천이 홈 피드 50건뿐이라고 명시 |
| 38 | FEED_URL = "https://markets.jpmorgan.com/mcp-home/api/data-service/feed-content?type=research" |
목록 주소 1개. 페이지·오프셋·검색어 인자 없음 |
| 49–50 | MAX_PORTAL_REQUESTS = 90 / MAX_ARTICLE_OPENS = 12 |
요청·원문열기 상한(목록 크기와는 무관) |
| 199–215 | _fetch_feed() — session.get(FEED_URL) 1회 후 Data.feedResearch.data.researchService.research.results 반환 |
페이지네이션 없음. 응답 리스트를 그대로 씀 |
| 286–287 | rows = _fetch_feed(session, budget) / result["discovered"] = len(rows) |
발견 수 = 피드 길이(실측 매일 50) |
| 290 | DiscoveryLog("jpmorgan", ..., capability_status="unsupported") |
"과거분 소급 불가"만 표기, 시리즈 누락 여부는 표현 안 됨 |
| 299–304, 316–329 | classify_report(...) → action != "include"면 excluded_by_routing |
필터는 목록 안에서만 작동 |
| 332–345 | is_archived("jpmorgan", doc_id) → duplicate |
이미 받은 글은 중복 |
| 323 등 | listing_channel="home_research_feed" |
채널 구분값이 하나뿐 |
| 468 | result["status"] = "ok" if not result["failed"] and result["not_attempted_due_cap"] == 0 else "partial" |
신규 0건이어도 ok — 누락이 경고로 안 올라옴 |
관련 파일:
- collect_daily_archive.py:297 — collect_jpmorgan(max_reports=12, max_opens=12, cdp_port=9236) (매일 05:45 경로에서 호출, 살아있는 호출 경로 확인)
- report_routing.py:138–141 — JP모건 전용 포함 목록 _JPMORGAN_FIXED_INCOME_INCLUDE에 us weekly prospects|u.s. fixed income markets weekly|credit market outlook|the j.p. morgan view만 있음. High Grade / HG Credit 시리즈는 명시 안 됨(8/27엔 일반 규칙으로 통과).
- check_source_health.py:70 — "jpmorgan": "최신 5건 목록만 확인" (실제 50건과 불일치 — 안내 문구 오류)
- 비교 사례: collect_barclays_archive.py:21 — SEARCH_ENDPOINT = f"{HOST}/RSX/content-archive/v1/REST/publication/search" (바클레이즈는 이미 검색 기반 목록을 씀 → 같은 패턴 이식 가능)
2. 누락 규모 추정
볼트 목록(외사 리서치/2026-09-21~25/00_리포트목록.md) 실측
- 날짜별 당일 신규 파일명 접두어
YYMMDD_jpmorgan_건수: 9/21 0, 9/22 0, 9/23 0, 9/24 0, 9/25 0 → 5일 합계 0건. - 같은 기간 다른 외사 합계(당일 접두어 기준): 바클레이즈 20, 골드만 34, 씨티 12, HSBC 14, 노무라 7, 보파 6, 모건스탠리 3.
- 9/25 목록의
jpmorgan5줄(21·108·109·110·111행)은 전부 7일 누적분으로, 9/19(Credit Market Outlook & Strategy)·9/20(US Weekly Prospects, U.S. Fixed Income Markets Weekly, The J.P. Morgan View, Global Fixed Income Markets Weekly) 폴더 링크다.
수집 로그(runs/2026092{1..5}/jpmorgan/discovery.jsonl) 실측
| 실행일 | 목록 | 포함(전부 중복) | 주제 제외 | 발행일 범위 | 전일 대비 새 문서 |
|---|---|---|---|---|---|
| 9/21 | 50 | 24 | 26 | 08-07~09-19 | — |
| 9/22 | 50 | 23 | 27 | 08-07~09-21 | 1 |
| 9/23 | 50 | 23 | 27 | 08-07~09-21 | 0 |
| 9/24 | 50 | 23 | 27 | 08-07~09-21 | 0 |
| 9/25 | 50 | 21 | 29 | 08-10~09-24 | 2 |
- 43개 실행 이력 전체에서 크레딧 키워드 제목의 첫/마지막 노출: Credit Market Outlook & Strategy만 8/13~9/25 상시 노출. High Grade Weekly Spotlight, HG Credit Foreign Demand Monitor, European Credit Weekly, High Yield Weekly Spotlight, High Yield Talking Points, LATAM Corporates Daily, CNH Credit Markets는 8/27 단 1회.
- 8/27 1회 노출 때 실제 저장 5건(
runs/20260827/jpmorgan/portal-latest.untitled.json): High Grade Weekly Spotlight(8/20), HG Credit Foreign Demand Monitor(8/17), European Credit Weekly ×2, Global Commodities. 원문 실존:raw/jpmorgan/20260820/20260820_jpmorgan_gps-5416037-0_high-grade-weekly-spotlight.pdf,raw/jpmorgan/20260817/20260817_jpmorgan_gps-5412365-0_hg-credit-foreign-demand-monitor.pdf→ 노출만 되면 계정 권한·필터 모두 통과한다.
추정 (포털 직접 확인 전 — 추정치)
- 미국 IG 전용 주간물 2종(High Grade Weekly Spotlight, HG Credit Foreign Demand Monitor)이 주 1회씩 나온다고 가정하면, 8/13~9/25 약 6주간 기대 약 12건 중 확보 2건 → 약 10건 누락 추정, 이번 주(9/21~25)만 보면 약 2건.
- 데일리 IG물(US High Grade 데일리류)은 존재·주기 자체가 미확인이라 추정에 넣지 않았다. 넣으면 규모는 더 커진다.
- 필터 문제로 빠진 IG 글은 0건(9/21~25 제외 제목 전부 주식·구조화·환율·원유·자금흐름, 경계 사례는 Flows & Liquidity 1종).
3. 대안 비교
| 기준 | ① 검색 기반 보조 수집 | ② 누락 감지 알림 | ③ 크레딧/IG 카테고리 우선 필터 |
|---|---|---|---|
| 무엇 | 홈 피드 외에 포털 검색/시리즈 목록을 두 번째 채널로 읽음(High Grade, HG Credit, Credit Market Outlook 등 검색어) | 기대 시리즈가 주기+2일 동안 안 뜨면 ok 대신 warn: series_missing |
포함 정규식에 High Grade/HG Credit 명시, 목록 내 크레딧 글을 원문열기 우선순위 상단으로 |
| 누락 자체를 줄이나 | 예 (유일하게 목록 밖 글을 가져옴) | 아니오(드러내기만) | 아니오(목록 안 글에만 작용) |
| 선행 조건 | 살아있는 JP모건 세션(9236)에서 검색 화면이 부르는 목록 주소·응답 형태 실측 필수 — 미실측 | 없음(기존 로그만으로 판정 가능) | 없음 |
| 구현 난이도 | 중~상(내부 주소 의존, 요청 예산 90 안에서 설계) | 하 | 하 |
| 깨짐 위험 | 포털 개편 시 조용히 깨질 수 있음 → ②가 있어야 드러남 | 오탐(휴가·발간 중단) — 주기값 조정으로 관리 | 과포함(HY·LATAM·유럽) — 기존 제외 규칙 유지로 관리 |
| 이번 주 같은 상황 효과 | 주 2~3종 IG 주간물 확보 기대(8/27 기준) | 늦어도 수요일에 경보 | 효과 0(목록에 없었음) |
| 우선순위 | 2순위(실측 후 착수) | 1순위(즉시) | 3순위(①과 함께) |
판단: ③만 하면 "고쳤다"는 착시만 생긴다. ②로 조용한 누락을 먼저 경보로 바꾸고, ①의 목록 주소를 실측한 뒤 ①+③을 한 번에 넣는다. 메일 알림 구독·드롭 폴더(수동 보충)는 해리 계정 설정이 필요해 이번 명세에서 제외하고 해리 확인 사항으로 남긴다(9/21~25 메일 경로 JP모건 보충 0건, 선행 진단 60행).
4. codex 위임 명세 (코드 수정은 codex, 여기선 명세만)
태스크 A — 기대 시리즈 누락 감지 (1순위, 선행조건 없음)
- 새 파일:
hermes-research-sales-engine/data/jpmorgan_expected_series.jsonjson {"series": [ {"title_regex": "credit market outlook", "cadence_days": 7, "grace_days": 2, "bucket": "ig_market"}, {"title_regex": "high grade weekly spotlight", "cadence_days": 7, "grace_days": 2, "bucket": "ig_market"}, {"title_regex": "hg credit foreign demand monitor", "cadence_days": 7, "grace_days": 2, "bucket": "issuance_flows"} ]}(주기값은 초기값. High Grade/HG Credit 실제 주기는 미확인 — 2주 운영 후 조정) - 변경:
scripts/collect_jpmorgan_archive.pycollect()끝(468행 상태 판정 직전)에 함수_check_expected_series(listing_rows, archive_root)추가. 시리즈별 "마지막으로 본 발행일" = max(이번 목록 발행일,raw/jpmorgan/*/*<slug>*.meta.json의 발행일).today - last_seen > cadence+grace면result["series_missing"]에 추가. - 상태:
series_missing이 비어있지 않으면status를ok→warn(기존partial/failed는 유지).collect_daily_archive.py와check_source_health.py가warn을 실패와 구분해 표시하도록 반영. - 같이 고칠 것:
check_source_health.py:70문구"최신 5건 목록만 확인"→"홈 피드 50건(맞춤형 고정 묶음) — 크레딧 데스크 간행물 미노출 가능". - 검증: (1)
python3 -m py_compile scripts/collect_jpmorgan_archive.py scripts/check_source_health.pyexit 0 (2) 단위 테스트tests/test_jpmorgan_expected_series.py: 가짜 listing_rows(High Grade 없음, 기준일 9/26)로series_missing에 high grade 포함 확인, Credit Market Outlook 9/19 있을 때는 미포함 확인 (3) 9/25 실제listing-055814.untitled.json으로 오프라인 재판정 시 high grade·hg credit 2건 경보.
태스크 B — 검색 기반 두 번째 목록 채널 (2순위, 실측 선행)
- 0단계(코드 전, codex 또는 ron): CDP 9236 JP모건 탭에서 검색창에 "High Grade Weekly Spotlight" 입력 →
page.on("response")로 목록 응답 주소·쿼리 인자·응답 경로(JSON 키) 기록 →runs/<날짜>/jpmorgan/search-probe.json저장. 이 파일이 없으면 B 착수 금지. - 변경:
collect_jpmorgan_archive.py에SEARCH_URL(실측값),SEARCH_TERMS(expected_series의 제목),_fetch_search(session, budget, term)추가. 결과를 홈 피드 rows와id로 합치고listing_channel="search:<term>"로 기록(현재 323행 등"home_research_feed"고정값을 행별 채널값으로). 요청 예산은 검색어당 1회, 총 90 한도 내. discovery_log.py: 채널별 집계(counts_by_channel) 추가.- 롤백 조건: 검색 채널로 인증 오류가 새로 생기거나 수집 시간 2배 초과 시
SEARCH_TERMS=[]로 비활성화. - 검증: 다음 5영업일
discovery.jsonl에search:채널 행이 매일 존재 + High Grade/HG Credit 저장 주 1건 이상.
태스크 C — 크레딧/IG 우선 필터 (3순위, B와 함께)
report_routing.py:138–141_JPMORGAN_FIXED_INCOME_INCLUDE에high grade weekly spotlight|hg credit foreign demand monitor|us high grade추가,bucket은 각각ig_market/issuance_flows.collect_jpmorgan_archive.py원문열기 루프(291행): 포함 판정 행 중bucket in {ig_market, issuance_flows, sector_issuer}를 먼저 열도록 정렬(12건 상한에서 IG가 밀리지 않게).- 유지: HY·LATAM·CNH·유럽 크레딧 제외 규칙(8/27 판정) 그대로.
- 검증:
python3 -c "from report_routing import classify_report;print(classify_report(source='jpmorgan',title='High Grade Weekly Spotlight',synopsis='',metadata={}).as_metadata()['action'])"→include; 기존 제외 제목 29건(9/25) 재판정 결과 불변.
공통 완료 조건
codex 완료 보고는 4블록(결론/근거/검증/근거파일) + 실제 테스트 출력. 라이브 크론 반영 여부는 collect_daily_archive.py:297 호출 경로에서 새 함수가 실제로 불리는지까지 확인.
5. 남은 미확인
- JP모건 포털 검색 목록 주소·응답 형태(태스크 B 0단계).
- High Grade Weekly Spotlight / HG Credit Foreign Demand Monitor 실제 발행 주기.
- 8/27 05:57에만 목록 구성이 바뀐 이유.