virtual-insanity
← 리포트 목록

JP모건 수집 목록 50건 고정 한계 — IG 누락 방지 설계안 (대안 비교 + codex 위임 명세)

2026-09-26 hermes [외사리서치, jpmorgan, 수집커버리지, US-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 목록의 jpmorgan 5줄(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.json json {"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.py collect() 끝(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.py exit 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에만 목록 구성이 바뀐 이유.