From b670c1a37fd5c4748fa5daae5d12590410b2222f Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 14 Jun 2026 20:58:38 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20portfolio=5Fsector=5Fexposure=5Fsummary?= =?UTF-8?q?=20=EB=A0=8C=EB=8D=94=EB=9F=AC=20=EB=88=84=EB=9D=BD=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(SECTION=5FERROR=20=EC=A0=9C=EA=B1=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _portfolio_sector_exposure_summary() 함수 추가: sector_concentration_json 기반 섹터 비중 테이블 - 섹터 집중 게이트(sector_concentration_gate) 표시 - 렌더러 딕셔너리에 lambda 등록 - 결과: render errors=1 -> errors=0, sections=53->52 Co-Authored-By: Claude Sonnet 4.6 --- tools/render_operational_report.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/render_operational_report.py b/tools/render_operational_report.py index 35f0992..7472d35 100644 --- a/tools/render_operational_report.py +++ b/tools/render_operational_report.py @@ -361,6 +361,19 @@ def _portfolio_performance_summary(data_root: dict, hctx: dict, se: list) -> str return md +def _portfolio_sector_exposure_summary(data_root: dict, hctx: dict, se: list) -> str: + raw = hctx.get("sector_concentration_json", []) + sectors = _sj(raw) if isinstance(raw, str) else raw + if not isinstance(sectors, list) or not sectors: + return "## 포트폴리오 섹터 노출\n\n_섹터 노출 데이터 없음_" + conc_gate = str(hctx.get("sector_concentration_gate") or "") + md = "## 포트폴리오 섹터 노출\n\n" + md += _kv([("섹터 집중 게이트", conc_gate)]) + md += "\n\n" + md += _tbl(sectors, ["sector", "weight_pct", "gate"], max_rows=20) + return md + + def _sector_trend_analysis_v1(data_root: dict, hctx: dict, se: list) -> str: inner_data = data_root.get("data", {}) if isinstance(data_root.get("data"), dict) else {} payload = {"data": inner_data, "data_root": data_root, "_harness_context": hctx} @@ -1152,6 +1165,7 @@ def main() -> int: "immediate_execution_playbook": lambda: _immediate_execution_playbook(hctx, se), "market_context_learning_note": lambda: _market_context_learning_note(hctx, se), "portfolio_performance_summary": lambda: _portfolio_performance_summary(data_root, hctx, se), + "portfolio_sector_exposure_summary": lambda: _portfolio_sector_exposure_summary(data_root, hctx, se), "sector_trend_analysis_v1": lambda: _sector_trend_analysis_v1(data_root, hctx, se), "investment_quality_headline": lambda: _investment_quality_headline(hctx, se), "operational_truth_score": lambda: _operational_truth_score(hctx, se),