recipes.fundamental.quality.forensics.deepDive Recipes Recipe observed

Evidence Forensics Deep Dive

L2 분석엔진 없이 data coverage, account trace, revenue-cash bridge, working capital, note/event signal, falsifier, engine candidate memo를 한 번에 실행하는 깊은 포렌식 팩 최종 절차다. 트리거 — '포렌식 deep dive', 'analysis 없이 깊게 검증'.

이 스킬

Evidence Forensics Deep Dive

L2 분석엔진 없이 data coverage, account trace, revenue-cash bridge, working capital, note/event signal, falsifier, engine candidate memo를 한 번에 실행하는 깊은 포렌식 팩 최종 절차다. 트리거 — '포렌식 deep dive', 'analysis 없이 깊게 검증'.

Recipes observed recipes.fundamental.quality.forensics.deepDive

이어 가기

절차

실행 순서

  1. 1

    공개 호출 블록은 AST parse가 되어야 한다.

  2. 2

    공개 호출 블록은 L2/L3 호출 문자열을 포함하면 실패다.

  3. 3

    EngineCall 가능한 Company/scan 입력을 RunPython 내부 계산으로 재구현하지 않는다.

  4. 4

    visualRefs 는 observed viz skill 만 포함해야 하며, 원표 기간·evidenceBinding 이 없으면 차트 대신 ledger 표로 답한다.

  5. 5

    selfRun 결과에 `deepDive`, `falsifierLedger`, `engineCandidateMemo`가 모두 있어야 한다.

  6. 6

    ask 답변은 riskScore만 말하지 않고 open falsifier와 candidate memo를 함께 설명해야 한다.

예시

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

  • 삼성전자 포렌식 deep dive
  • analysis 없이 원표와 공시만으로 깊게 검증
  • L1.5 회계 포렌식 전체 실행

출력

기대 결과

  • 10단계 deepDive ledger
  • riskScore와 signalCount
  • open falsifier 수
  • engine candidate 수

공개 호출 방식

AI 도구 실행 순서는 EngineCall 우선이다. Company.show("IS"|"BS"|"CF"), Company.disclosure, scan.quality, scan.audit, scan.disclosureRisk 는 엔진 호출로 근거를 먼저 확보한다. 아래 Python 블록은 확보한 L1/L1.5 근거를 buildEvidenceForensicsMemo 로 묶는 RunPython fallback 절차다.

import dartlab
from dartlab.synth.evidenceForensics import buildEvidenceForensicsMemo

target = "005930"
c = dartlab.Company(target)
statements = {}
for topic in ("IS", "BS", "CF"):
    try:
        statements[topic] = c.show(topic, freq="Y")
    except TypeError:
        statements[topic] = c.show(topic)
    except Exception:
        pass

sectionTexts = {}
for topic in ("businessOverview", "riskFactors", "mdna", "notesDetail"):
    try:
        sectionTexts[topic] = str(c.show(topic))[:20000]
    except Exception:
        pass

try:
    disclosure = c.disclosure()
    events = disclosure.head(20).to_dicts() if hasattr(disclosure, "head") else list(disclosure)[:20]
except Exception:
    events = []

scanRows = []
for axis in ("quality", "audit", "disclosureRisk"):
    try:
        df = dartlab.scan(axis)
        rows = df.head(3).to_dicts() if hasattr(df, "head") else []
        for row in rows:
            row["axis"] = axis
        scanRows.extend(rows)
    except Exception:
        pass

memo = buildEvidenceForensicsMemo(
    target=target,
    market=str(getattr(c, "market", "KR")),
    companyName=str(getattr(c, "corpName", target)),
    statements=statements,
    sectionTexts=sectionTexts,
    events=events,
    scanRows=scanRows,
)

emit_result(
    table=memo["tables"]["deepDive"],
    values={
        "target": target,
        "riskScore": memo["headline"]["riskScore"],
        "signalCount": memo["headline"]["signalCount"],
        "candidateCount": memo["headline"]["candidateCount"],
        "openFalsifiers": sum(1 for row in memo["tables"]["falsifierLedger"] if row["status"] == "open"),
    },
    date=memo["asOf"],
    sources=memo["sources"],
)

호출 동작

1. 결론 도출

riskScore, signalCount, candidateCount, openFalsifiers를 한 번에 반환한다. 이 수치는 깊은 원표 검산의 현재 상태이지 투자 결론이 아니다.

2. 핵심 근거 수집

IS/BS/CF 원표, section text, disclosure events, scan primitive rows를 모으지만 L2/L3 엔진은 호출하지 않는다. 가능한 입력은 EngineCall 결과를 우선 사용하고, RunPython 은 memo builder 결합과 emit_result(...) 발급에만 사용한다.

3. 메커니즘 분석

원표 coverage와 trace가 먼저이고, 그 다음 매출-현금 괴리와 운전자본 압력을 본다. 공시 text와 event는 이 신호를 설명하거나 반증하는 보조층이다.

4. 반례·한계

open falsifier가 있으면 결론은 확정되지 않는다. 특히 신규 고객, 수주잔고, 계절성, M&A, 표준 감사 문구, 금융업 계정 구조는 주요 반례다.

5. 후속 모니터링

같은 신호가 여러 target selfRun과 ask 품질 점검에서 반복될 때만 engineCandidateMemo를 근거로 L2 엔진 환류를 제안한다.

대표 반환 형태

deepDive : list[dict]

column의미
order실행 순서
step세부 ledger 이름
statusmissing/ok/watch/risk
rowCount해당 ledger row 수
evidence대표 근거
nextAction다음 조치

연계 절차

  1. recipes.fundamental.quality.forensics.dataCoverageAudit - 원표 coverage.
  2. recipes.fundamental.quality.forensics.accountTraceLedger - 계정 trace.
  3. recipes.fundamental.quality.forensics.revenueToCashBridge - 매출-현금 bridge.
  4. recipes.fundamental.quality.forensics.workingCapitalPressureMap - 운전자본 pressure.
  5. recipes.fundamental.quality.forensics.noteSignalExtractor - 공시 text signal.
  6. recipes.fundamental.quality.forensics.eventToStatementMatcher - 이벤트 매칭.
  7. recipes.fundamental.quality.forensics.crossSectionAnomalyRank - scan 후보.
  8. recipes.fundamental.quality.forensics.falsifierLedger - 반증 ledger.
  9. recipes.fundamental.quality.forensics.engineCandidateMemo - 엔진 후보 memo.

기본 검증

  • 공개 호출 블록은 AST parse가 되어야 한다.
  • 공개 호출 블록은 L2/L3 호출 문자열을 포함하면 실패다.
  • EngineCall 가능한 Company/scan 입력을 RunPython 내부 계산으로 재구현하지 않는다.
  • visualRefs 는 observed viz skill 만 포함해야 하며, 원표 기간·evidenceBinding 이 없으면 차트 대신 ledger 표로 답한다.
  • selfRun 결과에 deepDive, falsifierLedger, engineCandidateMemo가 모두 있어야 한다.
  • ask 답변은 riskScore만 말하지 않고 open falsifier와 candidate memo를 함께 설명해야 한다.

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported
Server supported
MCP supported
Web AI supported
Pyodide limited

실패 회피

흔한 실패 · 절대 금지

흔한 실패
  • ask가 기존 analysis skill을 선택해 L2로 우회
  • RunPython 결과는 있는데 답변이 근거 표 없이 요약만 제시
  • engineCandidateMemo를 실제 구현 완료처럼 표현
절대 금지
  • c.analysis, c.credit, c.quant, c.macro, c.industry, c.story를 호출하지 않는다.
  • riskScore를 투자 결론으로 해석하지 않는다.
  • open falsifier를 숨기지 않는다.