Skip to content

Releases: eddmpython/dartlab

v0.9.27

30 Apr 02:51

Choose a tag to compare

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

27 Apr 15:51

Choose a tag to compare

스캔 화면과 분석 실행 안정화.

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

25 Apr 22:22

Choose a tag to compare

내부 안정화 작업.

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

25 Apr 00:53

Choose a tag to compare

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

23 Apr 06:44

Choose a tag to compare

내부 안정화 + 버그 수정.

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

22 Apr 01:40

Choose a tag to compare

질적 안정 Q3.1 tail + Q4 효율성 + Q5 dead code 제거. 정식 1.0.0 아님 — 외부 venv 종합 검증 및 사용자 최종 승인 후에만 1.0.0 릴리즈.

Changed

  • F/E-rank 복잡도 감축 (Q3.1 tail): _calcTwoStageDcf CC 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.calcStructuralBreak import 복구: 기존 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

21 Apr 05:20

Choose a tag to compare

Fixed

  • c.show() 라우팅 ValueError 제거: c.show("bond") / show("business") / show("fundraising") / show("companyOverviewDetail") 등 registry 에는 등록됐으나 특정 회사에 데이터가 없는 topic 에서 ValueError: 'topic 을 찾을 수 없습니다' 로 크래시하던 문제. 이제 registered-but-emptyNone 리턴, 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_count 196 → 197 (_showImpl registered-but-empty 분기 추가로 복잡도 +1, 기능적 가치 대비 수용).

v0.9.17

19 Apr 22:49

Choose a tag to compare

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.ymlbuild 잡이 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 --wheelpython -m build 로 변경해 publish.yml 과 동일 빌드 경로 사용. CI/publish 환경 간 wheel 차이 제거.

v0.9.16

19 Apr 22:12

Choose a tag to compare

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/edinetsections/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.ymlbuild 잡이 이 스크립트 통과에 의존하도록 wire — wheel 이 비어있는 상태로 PyPI 에 올라가지 않도록 차단.
  • scripts/dev/test-realdata.sh: realData 스위트를 파일별 독립 pytest 프로세스로 실행 (Polars 네이티브 메모리 격리 목적).
  • CI 잡 3종:
    • fixture-integrationtest_fixture_*_real.py 3건을 단일 worker 로 순차 실행 (메모리 격리)
    • realdata-suite — realData 스위트 실행 (fixture 데이터 사용)
    • wheel-smoke — 격리 venv wheel 설치 스모크
  • pytest 마커 2종: realData (엔진 공개 API 실데이터 스모크), freshInstall (cold 캐시 재현)

v0.9.15

17 Apr 15:42

Choose a tag to compare

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
```