/** 커널 `DurationEstimate` 와 같은 모양(커널 타입에 의존하지 않기 위해 구조로 맞춘다). */ export interface MeasuredEstimate { meanMs: number; spread?: { distribution: 'triangular'; minMs: number; maxMs: number; modeMs: number; }; } export interface MeasuredEstimatorResult { estimator?: { estimate(ctx: { kind: string; fromNode: string; toNode: string; resourceKind?: string; }): MeasuredEstimate | undefined; }; /** 작업 종류 → 실측 소요(ms). 추정기가 답하는 종류들. */ learned: Record; /** 퍼짐까지 배운 종류 — 평균만 배운 것과 구별한다(변동 없는 소요는 대기를 과소평가한다). */ spreads: Record; /** 표본이 모자라 쓰지 않은 종류와 그 건수 — 배우지 못한 것을 밝힌다. */ skipped: { kind: string; count: number; }[]; minSamples: number; } /** 기본 표본 하한 — 이보다 적으면 그 종류는 배우지 않는다(작은 표본의 p50 을 현장 값으로 승격 금지). */ export declare const DEFAULT_MIN_SAMPLES = 5; /** * 작업 종류별 KPI 그룹에서 추정기를 만든다(순수 — DB·커널 모름). * `groups` 는 `computeTwinKpi({ groupBy: 'taskKind' })` 의 `groups.items` 를 그대로 넘긴다. */ export declare function buildMeasuredEstimator(groups: { key: string; workTime?: { count: number; p10Ms?: number; p50Ms: number; p90Ms?: number; }; }[] | undefined, opts?: { minSamples?: number; }): MeasuredEstimatorResult;