Releases: eddmpython/dartlab
Releases · eddmpython/dartlab
v0.9.27
AI 품질 루프와 데이터 파이프라인 안정화.
Added
- 신규 상장 종목을 KindList와 HuggingFace parquet 목록 기준으로 bootstrap 하는 DART 수집 workflow 추가.
- 분석 계약 그래프, Workspace ledger, trace summary를 확장해 tool 근거·claim·visual·품질 위반을 더 명확히 기록.
- scan 필드 SSOT와 KRX 벤치마크 기반 quant 비교 축 추가.
- 회사 대시보드에 손익 전환, 재무상태 구조, 현금흐름 브릿지, 근거 커버리지 시각 컴포넌트 추가.
Changed
- KRX 가격·지수 수집 기준을 장마감 후 당일(T-0) 데이터까지 반영하도록 조정.
- 비교 질문에서 동일 축 근거와 visual 설명을 더 안정적으로 만들도록 runtime preflight 순서를 보정.
- 운영 문서에서 외부 브랜드 의존 표현을 줄이고 DartLab 계약/프로세스 중심으로 정리.
Fixed
- KRX 일별 데이터의 HF freshness 만료 후에도 서버 프로세스 LRU가 오래된 parquet을 계속 반환할 수 있던 문제 수정.
- 벤치마크 매핑 리소스 로딩 실패가 빈 결과로 조용히 처리되지 않도록 명확한 실패로 전환.
v0.9.26
스캔 화면과 분석 실행 안정화.
Added
/scan화면에 전종목 횡단 데이터 탐색 기능 추가. KRX 가격, 밸류에이션, 공시 변화, 산업지도 데이터를 한 화면에서 조회할 수 있다.- 스캔 데이터 SQL 탐색 패널 추가. 브라우저에서 DuckDB 기반 쿼리를 실행하고 결과 테이블을 확인할 수 있다.
- 스크리너 결과에 가격 추이, 밸류에이션, 공시 변화 지표를 함께 표시하도록 확장.
- 산업지도 화면에 렌즈 선택과 색상 축 지표를 추가해 업종·공정·역할 기준 탐색을 개선.
Changed
gather("fred", ...)다중 조회 처리 속도 개선. 여러 시계열을 받을 때 불필요한 반복 보간과 중간 데이터 보관을 줄였다.- 매크로 요약 계산의 메모리 사용량 개선. 여러 축을 연속 계산할 때 중간 데이터가 더 빨리 해제된다.
- 랜딩 화면의 숫자·비율·원화 표시 형식을 정리하고, 데이터 로딩 상태와 빈 값 표시를 더 명확하게 조정.
- 자연어 분석 도구가 docstring의 상세 설명을 더 잘 활용하도록 보강해, 지원 가능한 기능과 인자 안내가 더 구체적으로 전달된다.
- EDGAR와 DART의
show/select내부 경로를 정리해 동일한 공개 진입점에서 더 일관되게 동작하도록 조정.
Fixed
- 일부 분석 계산에서 값이 없을 때
0처럼 처리되어 결손 데이터가 실제 값처럼 보일 수 있던 문제를 수정. c.story("")처럼 빈 섹션명을 전달했을 때 전체 보고서 생성으로 자연스럽게 처리되도록 수정.- 시장별로 지원하지 않는 메서드가 호출될 때 중간에 실패하지 않고 사용 가능한 경로를 안내하도록 수정.
- 브라우저 스크리너에서 DuckDB worker 로딩이 일부 배포 환경에서 실패하던 문제를 수정.
riskPremiums데이터 경로 보정으로 매크로 리스크 프리미엄 로딩 실패 가능성을 줄였다.- 베타 계산에서 선택 데이터가 없는 경우 전종목 스캔 데이터 의존 경로가 조용히 실패로 분류되던 검증 문제를 정리.
Internal
- 재무·매크로·신용·분석 도메인 파일의 import 방향을 정리하고, 공개 API 호환 shim은 유지했다.
- 전체 CI에서 Python 3.13 매트릭스는 호환성 테스트만 수행하도록 조정해 중복 coverage 실행을 제거했다.
- 커밋 메시지 검증 규칙을 강화해 한글 형식과 공개 기록의 불필요한 흔적 차단을 자동 확인한다.
v0.9.25
내부 안정화 작업.
Changed
- AI 가 한 번에 여러 도구를 동시에 호출할 수 있어 종합 분석 응답 시간 단축. "삼성전자 전체 분석" 같은 다축 질문이 끊김 없이 완료.
- 같은 종목코드 하나로
c.show("BS")·c.show("IS", freq="Y")·c.story()·c.credit()·c.analysis(...)일관되게 호출되도록 진입점 정리. - 동일 보고서 두 진입점 노출 (
c.review/c.story) 같은 중복 제거. 이제c.story()가 유일 보고서 빌더.
Fixed
- 일부 AI 응답에서 다축 분석이 중간에 끊기던 문제 해결.
- 노트북 가이드 출력에서 안내한 일부 단축 진입점이 실제로는 동작하지 않던 문제 해결 (
c.show("inventory")등 통합 진입점으로 안내 통일).
Internal
- 같은 데이터에 두 가지 import 경로가 있던 호환 모듈 제거. 사용자 코드 영향 없음 (사용자 진입점은
Company·dartlab.ask· 엔진 함수 그대로 유지).
v0.9.21
quant 엔진 안정화 + 대시보드 재설계 + 접근성 회귀 해소.
Fixed
- EDGAR 종목에서 일부 L2 분석 축이 None 이던 문제 — snakeId alias 양방향 확장으로 인텔·애플 등 EDGAR 기업에서 이전에 비어있던 재무 지표가 값을 반환하도록 복구.
/lab하위 페이지 내부 링크 깨짐 — GitHub Pages base path prefix 누락으로 배포 prerender 에러가 발생하던 문제. brand href 전수 보정.- 블로그 2 편 parse 에러 해소 —
silicon2·taihan-cable포스트의<·SGA < 15%표현이 mdsvex 에서 HTML 태그로 오인되던 문제.
Changed
- quant 엔진 팩터 계산 안정화 — accruals · altman · BAB · beneish · earningsSurprise · fundamentalMomentum · piotroski · qFactor · QMJ 9 개 alpha 정비 + factorBuild · spec 일관화. 팩터 반환값 품질 개선.
- 대시보드 페이지 재설계 —
/dashboard/{stockCode}를 v2 디자인 토큰 기반으로 단순화, 로드 속도·가독성 개선. - review 해석 문장 확장 — narrate 함수가 현금흐름·부채·매출성장 등에서 더 세밀한 조건 분기로 해석 생성.
v0.9.20
내부 안정화 + 버그 수정.
Fixed
dartlab.ask()가 ECOS / FRED 등 API 키 필요 축을 호출할 때 사용자에게 키 설정 안내가 전달되지 않던 문제 — 이전엔 서버 터미널에만 "키 필요" 로그가 출력돼 landing UI 등에서 호출한 사용자는 원인을 알 수 없었다. 이제 AI 응답 본문에 발급 URL +.env설정법이 직접 포함된다.- Windows 터미널에서 한글 로그·가이드 출력이 깨지던 문제 — 기본 인코딩이
cp949인 환경에서UnicodeEncodeError또는 가독성 저하.import dartlab시점에 stdout/stderr 를 UTF-8 로 자동 재구성한다. dartlab channel실행 직후 host 로그 스레드 크래시 — devtunnel stdout 중계 스레드가TypeError로 즉시 사망해[dt] Connect via browser: ...URL 출력이 끊기던 문제.
Changed
- 종목 오타 시 유사 종목 제안 —
Company('삼성전제')처럼 오타 입력 시 에러 메시지에 KRX 상장 종목 기반 fuzzy 매칭 top-3 을 함께 안내한다 (초성·편집거리·부분일치 지원). - 공시 검색 delta 인덱스 · Industry Map · Data Sync 등 일일 데이터 파이프라인 갱신 안정화 — 외부 데이터셋 저장소 업로드 경합으로 간헐적으로 실행이 취소되던 문제 해소. 이제 일일 cron 이 안정적으로 완료된다.
Added
ops/credit.md— 독립 신용등급 엔진 공개 문서. 7축 구조,override키, 실패 시나리오 정리.
v0.9.19
질적 안정 Q3.1 tail + Q4 효율성 + Q5 dead code 제거. 정식 1.0.0 아님 — 외부 venv 종합 검증 및 사용자 최종 승인 후에만 1.0.0 릴리즈.
Changed
- F/E-rank 복잡도 감축 (Q3.1 tail):
_calcTwoStageDcfCC 63→5 (7 sub-helper 로 분할 — wacc 해결, 고성장률, phase config, terminal growth, baseFcf, normalized FCF, netDebt+shares). E/F-rank (CC≥30) 함수 수 197 → 149 (-24%) 달성. - 효율성 — hotpath lru_cache (Q4.1):
mapSectionTitle/normalizeSectionTitle/loadSectionProfileTable@lru_cache적용. O(n²) 파이프라인 섹션 매핑 루프에서 동일 title 반복 조회 캐시 재사용. - 효율성 — regex 모듈 상수화 (Q4.2): 함수 내부
re.compile(...)15건 → 모듈 레벨 상수.providers/dart/company._QUARTER_COL_RE,providers/dart/_table_horizontalizer._UNIT_ONLY_RE/_DATE_ONLY_RE,providers/dart/docs/finance/boardOfDirectors/parser._MEETING_DATE_RE등 8 파일. 호출당 재컴파일 비용 제거.
Removed
- Dead code 제거 (Q5, 8,201줄 삭감):
analysis/financial/research/narrative.py(3,106줄),research/orchestrator.py(1,123줄),research/thesis.py · sectorKpi · spec · quality(685줄) —generateResearch()는 export 됐으나 외부 호출 경로 0건.research/scoring.py,research/types.py는 scorecard 에서 실사용하므로 유지.providers/dart/finance/mapperData/_backup/sortOrder.json(3,231줄) — 과거 snapshot, 현 sortOrder.json 이 SSoT.
Fixed
forecastCalcs.calcStructuralBreakimport 복구: 기존from dartlab.analysis.financial.research.predictionSignals import calcStructuralBreak는 존재하지 않는 경로.try/except ImportError가 silent 하게 삼켰고structuralBreak는 항상 None 이었음 (Chow Test 신호 실종).dartlab.analysis.financial.predictionSignals로 정상 경로 복구.
Migration
- 제거된
research.generateResearch·research.sectorKpi.calcSectorKpis·research.thesis·research.quality·research.narrative.buildNarrative는 외부 호출 경로가 없던 미공개 API — 외부 사용자 영향 없음. from dartlab.analysis.financial.research import calcPiotroski는 계속 유지.
v0.9.18
Fixed
c.show()라우팅 ValueError 제거:c.show("bond")/show("business")/show("fundraising")/show("companyOverviewDetail")등 registry 에는 등록됐으나 특정 회사에 데이터가 없는 topic 에서ValueError: 'topic 을 찾을 수 없습니다'로 크래시하던 문제. 이제 registered-but-empty 는None리턴, truly-unknown 만 warning +None.scan("debt")ComputeError 수정: polars schema inference 한도(기본 100행)를 넘는 큰 금액 값에서could not append value 1.2e11 ... schema mismatch로 크래시.pl.DataFrame(..., infer_schema_length=None)로 전체 행 스캔 후 schema 결정.
Added
tests/test_showRouting.py(38 parametrize 테스트): registry 의 report/disclosure topic 전수 iterate 해show()가 ValueError 없이 DataFrame or None 리턴 확인._showImpl라우팅 회귀 구조적 차단.
Changed
- quality gate baseline:
ef_count196 → 197 (_showImplregistered-but-empty 분기 추가로 복잡도 +1, 기능적 가치 대비 수용).
v0.9.17
Fixed
- PyPI wheel 에
src/dartlab/core/data/누락 재발 방지:.gitignore의 루트-미지정data/패턴이src/dartlab/core/data/까지 매치해python -m build가 해당 디렉토리를 wheel 에서 제외하던 문제..gitignore를/data/로 루트-스코프 제한하고,pyproject.toml의[tool.hatch.build.targets.wheel]에include명시를 추가해 다중 방어. - wheel-smoke 검증 대상과 publish wheel 일치: 기존에는 wheel-smoke 가 별도로 빌드한 wheel 을 검증하고 publish 는 재빌드한 wheel 을 올려 둘이 달라질 수 있었음.
publish.yml의build잡이python -m build직후 생성된 wheel 의 zip 목록과 격리 venv 설치 런타임을 직접 검증하도록 변경.
Added
tests/test_wheelPackaging.py(6 테스트):python -m build로 실제 wheel 을 빌드한 후 git-tracked 번들 리소스가 모두 zip 목록에 존재하는지 전수 대조. 핵심 JSON/parquet 개별 확인. 격리 venv 설치 후loadSections()런타임 체인까지 실행 (heavy 마커 — wheel-smoke job 에서 실행).publish.yml내부 검증 단계 2종: (1) 빌드 직후 wheel zip 에 필수 리소스 13건 포함 확인 (2) 격리 venv 에 방금 빌드된 wheel 설치 후loadSections()["chapterByMajor"]비어있지 않음 확인. 실패 시 PyPI 업로드 중단.
Changed
scripts/build/testWheelSmoke.sh빌드 도구 통일:uv build --wheel→python -m build로 변경해 publish.yml 과 동일 빌드 경로 사용. CI/publish 환경 간 wheel 차이 제거.
v0.9.16
Fixed
Company.sections접근 안정화:_SectionsSource.raw가 None 일 때.columns속성 접근으로 이어지지 않도록 명시적 가드 추가. 데이터가 비어있는 경우 None 을 그대로 반환.c.select(...).render("html")기간 컬럼 표시: HTML 렌더의 Console width 를 고정값(120) 대신 컬럼 수에 비례해 동적으로 계산. 기간 컬럼이 많은 재무제표에서도 모든 컬럼이 표시됨.c.facts속성 참조 수정:_profile_accessor에서 내부_report대신 존재하지 않는report를 참조하던 부분 교정.
Changed
- 필수 매핑 JSON 로더 — 조용한
{}대신 명시적 예외:parserMapper.loadSections/loadAffiliate/loadCostByNature,core/finance/labels._load_account_mappings,dart/edgar/edinet의sections/mapper.loadSectionMappings총 5개 로더가 번들 파일 부재 시FileNotFoundError와 함께 복구 명령(pip install -U --force-reinstall dartlab) 을 포함한 메시지를 발생. 기존에는 빈 dict 반환으로 상위 파이프라인이 원인 불명의 동작을 했음.
Added
tests/test_bundledResources.py(20 unit): 패키지에 포함돼야 하는 JSON/parquet 13건 존재 확인 + 핵심 키(chapterByMajor,detailTopicMap) 내용 계약 + 런타임 로더(loadSections,loadAffiliate,loadCostByNature,chapterFromMajorNum(1~9)) 반환값 검증. PR 마다 실행 (~3초).tests/realData/스위트: 엔진별 공개 API 를 parametrize 로 전수 iterate. Company 인스턴스 59 공개 속성, analysis 22 axis, scan 20 axis, credit 7 axis, macro 12 axis, gather 8 axis, 최상위 심볼 30+. 각 entry 가 독립 pytest 노드이므로 회귀 시 어떤 항목이 깨졌는지 즉시 특정.scripts/build/testWheelSmoke.sh: 현재 소스로 wheel 빌드 → 격리 venv 에 설치 → 번들 리소스 존재 +loadSections()["chapterByMajor"]런타임 비어있지 않음 검증.publish.yml의build잡이 이 스크립트 통과에 의존하도록 wire — wheel 이 비어있는 상태로 PyPI 에 올라가지 않도록 차단.scripts/dev/test-realdata.sh: realData 스위트를 파일별 독립 pytest 프로세스로 실행 (Polars 네이티브 메모리 격리 목적).- CI 잡 3종:
fixture-integration—test_fixture_*_real.py3건을 단일 worker 로 순차 실행 (메모리 격리)realdata-suite— realData 스위트 실행 (fixture 데이터 사용)wheel-smoke— 격리 venv wheel 설치 스모크
- pytest 마커 2종:
realData(엔진 공개 API 실데이터 스모크),freshInstall(cold 캐시 재현)
v0.9.15
Changed
- AI 분석 정확도 향상: AI 가 각 도구의 반환 구조(키, 타입, 단위)를 호출 전에 파악. 기존 런타임 에러 해소.
- 도구 설명 자동화: docstring Args/Returns → tool schema + 시스템 프롬프트 자동 반영. 새 함수 추가 시 docstring 만 작성하면 AI 즉시 인식.
- 내부 모듈 구조 정리: 중복 헬퍼 단일 출처화. memory/ → persistence/ 통합.
Removed
- 미사용 레퍼런스/실험 코드 삭제 (-49파일, -22,828줄)
- 미사용 모듈 삭제: fallback.py, readiness.py, EdgarCompany.reviewer()
Fixed
- AI 도구 호출 에러 수정 (pastInsight 빈 호출 crash, show scope/freq 혼동)
- 시스템 프롬프트 과잉 규제 제거 (숫자 강제 삭제, AI 자율 판단 복원)
- 중복 함수 통합 (_getFirst → safe.getFirst SSOT)
```bash
pip install dartlab==0.9.15
```