/** * 허용오차의 **기본값** — 선언이 아무 말도 없을 때만 쓴다. * * 10% 는 근거에서 나온 수가 아니라 **판단값**이다(그 사실을 적어 두는 것이 이 주석의 목적이다). 그리고 * 단일 잣대로 쓰면 틀린다 — 우리 트레일러 템플릿이 그것을 보여 준다: 용접은 변동폭을 `PT55M~PT1H35M` * (선언 소요 `PT1H10M` 기준 −21%~+36%)로 **스스로 선언한다.** 10% 관문은 그 공정의 **정상 변동조차** * "다른 모델" 로 판정해 보정을 끊는다. 반대로 1% 변동도 치명적인 공정에는 10% 가 너무 느슨하다. * * 그래서 허용오차는 **그 공정이 선언한 변동폭에서 나온다**(§toleranceOf). 선언이 있으면 선언이 이기고, * 없을 때만 이 값으로 떨어진다 — 도메인 설정을 새로 만들지 않는다(현장이 이미 말한 것을 읽는다). */ export declare const BASIS_TOLERANCE = 0.1; export interface ModelBasis { /** 작업 종류 → 실측 소요(ms). `buildMeasuredEstimator().learned`. */ measured?: Record; /** 자원 종류 → 속도(m/s). `buildTravelEstimator().speedsByKind`. */ speeds?: Record; /** * 선언된 공정 — key + ISO 8601 원문(문자열은 그대로 비교한다: 선언이 바뀌면 다른 모델). * * **변동폭도 지문에 든다.** 변동폭이 허용오차를 정하므로(§toleranceOf), 그것이 바뀌었는데 "같은 모델" * 이라고 하면 판정의 잣대가 알리지 않고 바뀐 채로 학습이 이어진다. */ declared?: DeclaredOperation[]; } /** 선언된 공정 하나 — 소요와 변동폭(모델의 `operations` 원형에서 필요한 만큼만). */ export interface DeclaredOperation { key: string; duration?: string; variability?: { distribution?: string; min?: string; max?: string; mode?: string; }; } /** * 작업 종류별 **허용오차** — 그 공정이 선언한 변동폭에서 나온다. * * 실측 p50 은 정상 변동 안에서 흔들린다. 그 흔들림을 "다른 모델" 로 읽으면 보정이 자꾸 끊기고, 사용자는 * 학습이 왜 안 듣는지 모른다. 얼마나 흔들리는 것이 정상인지는 **현장이 이미 선언했다**(`variability`). * * 반폭을 쓴다(`(max − min) / 2 / 소요`) — 중앙에서 어느 쪽으로든 그만큼은 정상이라는 뜻이다. * 선언이 없거나 읽을 수 없으면 기본값으로 떨어진다(짐작해 만들지 않는다). */ export declare function toleranceOf(declared?: DeclaredOperation[]): Record; /** * 모델이 달라졌는가 — 보정을 적용하기 전의 관문. * 한쪽 근거를 모르면 **판정하지 않는다**(false) — 모르는 것을 근거로 학습을 끊지 않는다. */ export declare function modelBasisChanged(before?: ModelBasis, after?: ModelBasis, tol?: number): boolean; /** * 사람이 읽는 근거 요약 — **로그·진단용**(비교의 근거가 아니다). * 지문으로 같음을 판정하지 않는 이유는 위 주석 참조. 두 근거가 왜 달라졌는지 눈으로 보려면 이것을 찍는다. */ export declare function describeModelBasis(basis?: ModelBasis): string;