runtime.providerProtocol Runtime observed

Provider Protocol 동일 surface — 3-regulator drop-in

dart/edgar/edinet 3 provider 가 만족해야 하는 Protocol 5 종 SSOT 와 새 regulator (SGX·FSA 등) 추가 4 단계 절차를 명시한다. P-PR 트랙의 method-level symmetry baseline 의 기준.

이 스킬

Provider Protocol 동일 surface — 3-regulator drop-in

dart/edgar/edinet 3 provider 가 만족해야 하는 Protocol 5 종 SSOT 와 새 regulator (SGX·FSA 등) 추가 4 단계 절차를 명시한다. P-PR 트랙의 method-level symmetry baseline 의 기준.

Runtime observed runtime.providerProtocol

절차

실행 순서

  1. 1

    새 regulator 의 도메인·식별자 (CIK·corp_code 등) 체계 정리.

  2. 2

    providers/{name}/company.py 의 Company 가 CompanyProtocol 12 method 구현.

  3. 3

    providers/{name}/{docs,finance,filings} namespace 가 각 Provider Protocol 구현.

  4. 4

    providers/{name}/__init__.py 에 Company + 3 namespace re-export, providers/__init__.py __all__ 추가.

  5. 5

    tests/test_providerContract.py baseline 갱신 + providerSymmetry.json 의 _SYMMETRY_MAP 등록.

예시

이런 질문이 들어오면 이 skill 을 쓴다

  • SGX (싱가포르) provider 추가 시 CompanyProtocol 12 method 구현 후 baseline 갱신
  • FSA (UK) provider 추가 시 _SYMMETRY_MAP.rename_map 에 dart_method → fsa_method 매핑 등록
  • edinet 의 5 deferred method 가 liveFilings baseline 영구 제외 처리

출력

기대 결과

  • 3+ provider 모두 isinstance(Company(code), CompanyProtocol) == True
  • providerSymmetry.json 의 신규 provider 항목 missing/shallow 카운트
  • 폴더 mirror 10 sub-folder 통과 (folderMirror.py)

무엇을 하나

dart · edgar · edinet 3 provider 의 공통 표면을 정의하는 5 Protocol SSOT 와 그 SSOT 위에 새 regulator 를 drop-in 으로 얹는 4 단계 절차를 박는다. P-PR 트랙의 method-level symmetry baseline (providerSymmetry.json) 의 객관 기준이 본 spec.

Protocol 5 종 (SSOT 위치)

Protocol위치핵심 메서드
CompanyProtocolsrc/dartlab/core/protocols.py:69-225__enter__ / __exit__ / show / select / trace / diff / filings / disclosure / liveFilings / readFiling / view / quant / ask + index / topics / sections property
DocsProvidersrc/dartlab/core/protocols.py:366-419fetchFiling(stockCode, *, period) / listSections(...) / iterSections(...)
FinanceProvidersrc/dartlab/core/protocols.py:422-476fetchStatements(...) / listAccounts(...) / iterAccounts(...)
FilingsProvidersrc/dartlab/core/protocols.py:480-513search(query, *, market=None, limit=20) / iterSearch(...)
MemorySafeProvidersrc/dartlab/core/protocols.py:517-540cleanupCache() -> int / memorySnapshot() -> dict[str, int]

5 종 모두 @runtime_checkableisinstance(co, CompanyProtocol) 가능.

새 provider 추가 4 단계

1. providers/{@html String.fromCharCode(123)}name{@html String.fromCharCode(125)}/company.pyCompanyCompanyProtocol 구현

12 메서드 + 3 property 시그니처 그대로. dart-only 메서드 (codeName / keywordTrend / news / listing / credit 등 18) 는 본 Protocol 에 없음 — 신규 provider 는 구현 의무 없음.

# providers/sgx/company.py 예시
from dartlab.core.protocols import CompanyProtocol

class Company:  # implements CompanyProtocol structurally
    def __init__(self, stockCode: str) -> None: ...
    def __enter__(self) -> "Company": ...
    def __exit__(self, *_: object) -> None: ...
    # show / select / trace / ... 12 method + 3 property

2. providers/{@html String.fromCharCode(123)}name{@html String.fromCharCode(125)}/{@html String.fromCharCode(123)}docs,finance,filings{@html String.fromCharCode(125)} namespace 가 각 Provider Protocol 구현

# providers/sgx/docs/__init__.py
from dartlab.core.protocols import DocsProvider, FilingResult, Section

class _SgxDocs:  # implements DocsProvider
    def fetchFiling(self, stockCode: str, *, period: str) -> FilingResult | None: ...
    def listSections(self, stockCode: str, *, period: str) -> list[Section]: ...
    def iterSections(self, stockCode: str, *, period: str) -> Iterator[Section]: ...

3. providers/{@html String.fromCharCode(123)}name{@html String.fromCharCode(125)}/__init__.py 에 Company + 3 namespace re-export

"""SGX (싱가포르 거래소) 데이터 소스 엔진."""
from dartlab.providers.sgx import docs, finance, filings
from dartlab.providers.sgx.company import Company

__all__ = ["finance", "docs", "filings", "Company"]

providers/__init__.py__all__"sgx" 추가.

4. baseline 갱신

  • tests/test_providerContract.py 의 provider iteration 에 "sgx" 추가.
  • tests/audit/_baselines/providerSymmetry.json 에 신규 provider 항목 등록.
  • tests/audit/providerSymmetry.py_SYMMETRY_MAP 에 SGX-specific rename / dart_only / sgx_deferred 항목 등록.

3 provider asymmetry (현 상태)

dart (한국, 50,855 LoC)

가장 깊은 구현. 한국 시장 특화 18 메서드 보유 — edgar 패리티 대상 아님. _SYMMETRY_MAP.dart_only 영구 등록:

카테고리메서드
식별자codeName / resolve / status
시장 메타listing / industry
검색 / 뉴스search / keywordTrend / news / publicSentiment
분석 결합credit / marketScan / keywordTrend / watch / story / analysis / validateStory
데이터gather / table / rawDocs / rawFinance / rawReport

edgar (미국, 15,010 LoC)

P-PR6/7/8 후 dart 패리티 도달. XBRL / 10-K sections / Form 4 / DEF 14A / 8-K — 자체 구현 확장 (외부 edgartools 미도입).

edinet (일본, 2,856 LoC)

5 method 사용자 명시적 deferred_SYMMETRY_MAP.edinet_deferred 영구 등록:

  • ask (LLM 통합)
  • quant (기술적 분석)
  • disclosure (공시 검색 확장)
  • liveFilings (실시간 공시)
  • readFiling (원문 읽기)

본 5 method 는 EDINET API 한정 차이 + 우선순위 결정. P-PR8 strict 전환 시 baseline 영구 제외.

검증

uv run python -X utf8 -c "
from dartlab.core.protocols import CompanyProtocol
from dartlab.providers import dart, edgar, edinet
for mod, code in [(dart, '005930'), (edgar, 'AAPL'), (edinet, '7203')]:
    co = mod.Company(code)
    assert isinstance(co, CompanyProtocol), f'{mod.__name__}: CompanyProtocol fail'
    print(f'{mod.__name__}: CompanyProtocol OK')
"

tests/test_providerContract.pytest_company_isinstance_runtime + test_provider_namespaces_isinstance 자동화.

폴더 mirror (10 sub-folder)

폴더책임
accessor/provider-specific data access (DartClient · SEC API client 등)
builder/캐시 빌더 (filings catalog · finance statements 등)
bulk/bulk 적재 (corp_code dump · companyfacts batch 등)
docs/공시 본문 파싱 (DocsProvider 구현)
finance/재무제표 정규화 (FinanceProvider 구현)
openapi/raw HTTP client / API key
ops/운영 유틸 (calendar / disclosure schedule 등)
parse/표·HTML·XBRL 파서
report/정형 report (옵션)
search/도메인 검색 (FilingsProvider 구현)

누락 폴더는 placeholder __init__.py 만 — Protocol contract 만족 위해.

다음 단계

  • engines.company — Company facade 사용법
  • engines.dart / engines.edgar / engines.edinet — provider 별 엔진 사용법
  • operation.code § 11 룰 — 모든 provider 준수 룰
  • operation.architecture § 3-provider mirror — 아키텍처 SSOT

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported
Server supported
MCP supported
Web AI supported
Pyodide limited
  • Pyodide 는 외부 HTTP 호출 제한 — provider 의 fetch 메서드는 fixture 의존만 가능.

실패 회피

흔한 실패 · 절대 금지

흔한 실패
  • __init__.py 에 logic 추가 (룰 4 위반)
  • dart-only 한국 특화 메서드를 edgar 에 무리하게 패리티 강제 (예 keywordTrend 미국 시장 부재)
  • Protocol 시그니처 미스매치 (예 period keyword 누락) — isinstance 통과 못 함
절대 금지
  • 본 Protocol 우회한 duck-typing (hasattr 직접 사용) 금지 — isinstance 강제
  • Protocol 시그니처 변경 시 3 provider 동시 갱신 누락 금지
  • _SYMMETRY_MAP.edinet_deferred 의 5 method 강제 구현 금지 (사용자 명시적 deferred)