/** 창 하나 — 폴드의 창과 같은 모양(ms). */ export interface BaselineWindow { fromMs: number; toMs: number; } /** 며칠 전 같은 시간대인가, 몇 주 전 같은 요일·시간대인가. */ export type BaselineStride = 'day' | 'week'; /** 한 번에 볼 수 있는 과거 구간 수 — 창마다 조회가 한 번 더 붙으므로 상한을 둔다. */ export declare const MAX_BASELINE_PERIODS = 14; /** * 비교할 과거 창들 — 현재 창을 **같은 길이로** 하루(또는 한 주)씩 뒤로 옮긴다. * * 가까운 것부터 준다(어제 → 그제 → …). 화면이 시간 순서를 다시 정하지 않아도 되게. * * **한계를 밝힌다**: 옮기는 것은 ms 산술이다. 트윈 공간은 고정 오프셋(`utcOffsetMinutes`)을 선언하므로 * 현재 모델에서는 "같은 시간대" 가 정확하다. 일광절약시간을 쓰는 시간대를 나중에 지원하면 전환이 있는 * 주의 하루가 한 시간 밀린다 — 그때는 오프셋 기준 캘린더 산술로 바꿔야 한다(지금 지어내지 않는다). */ export declare function baselineWindows(fromMs: number, toMs: number, periods: number, stride?: BaselineStride): BaselineWindow[]; /** 지표의 성질 — 이름과 값 꺼내기는 호출부(`TWIN_METRIC`)가 소유한다. */ export interface MetricSpecLike { direction: 'higher' | 'lower'; unit: string; } /** 과거 창 하나에서 꺼낸 값들 — 그 창에 기록이 없으면 값이 `undefined` 다. */ export interface BaselineSampleInput { fromMs: number; toMs: number; values: Partial>; } /** 과거 창 하나의 결과 — **결측도 남긴다**(빼면 "지난 7일" 이 거짓이 된다). */ export interface BaselineSample { fromMs: number; toMs: number; measured: boolean; value?: number; } /** 왜 자리를 말하지 않는지. */ export type BaselineNoPosition = 'no-current' | 'too-few-samples'; /** * 분포 안에서 현재의 자리 — **방향을 적용한 읽기.** * * 임의의 임계가 없다: 표본 전부보다 좋으면 `best`, 전부보다 나쁘면 `worst`, 그 사이는 중앙값을 기준으로 * 구분한다. `typical` 은 중앙값과 **같을 때**만이다. */ export type BaselineStanding = 'best' | 'better-than-typical' | 'typical' | 'worse-than-typical' | 'worst'; export interface MetricBaseline { metric: M; direction: 'higher' | 'lower'; unit: string; /** 지금 창의 값 — 없으면 `undefined`(0 이 아니다). */ current?: number; /** 요청한 과거 창 전부(결측 포함, 가까운 것부터). */ samples: BaselineSample[]; /** 요청한 창 수 / 그중 실제로 측정된 수 — 둘을 함께 봐야 "지난 7일" 을 믿을 수 있다. */ requested: number; measuredCount: number; /** 측정된 표본만의 요약. 표본이 없으면 전부 `undefined`. */ min?: number; median?: number; max?: number; /** 측정 표본을 오름차순으로 놓았을 때 현재 값이 몇 번째인가(1 = 가장 작음) — **방향 없는 사실**. */ rank?: number; /** 그 순위를 셀 때의 표본 수(+현재 1). 순위만 보면 표본이 둘이었는지 열이었는지 알 수 없다. */ rankOf?: number; /** 방향을 적용한 읽기. 말할 수 없으면 없다. */ standing?: BaselineStanding; /** 자리를 말하지 않은 이유. */ noPosition?: BaselineNoPosition; } /** * 지표별로 분포와 자리를 만든다. * * @param specs 지표 성질(방향·단위). 열거된 지표만 낸다 — 모르는 이름을 짐작하지 않는다. * @param current 지금 창에서 꺼낸 값들(결측은 `undefined`). * @param inputs 과거 창들에서 꺼낸 값들(가까운 것부터). */ export declare function summarizeBaseline(specs: Readonly>, current: Partial>, inputs: readonly BaselineSampleInput[]): MetricBaseline[];