/** * correction-clustering — 교정 룰 클러스터링 → 통합 승급 (Wave 3 W3-2). * 설계: reports/feature-audit/w3-2-design.md * * 문제: 같은 원칙을 문구·target 만 바꿔 N회 교정하면, promoteSessionCandidates 가 * render_key(정확 중복)만 dedup 하므로 N개 별도 `default` 룰로 흩어진다. "사용자가 * N번 교정했다"는 강한 개인화 신호(강도↑)가 소실된다. * * 델타 (기존 파이프라인엔 없는 2개만): * D1. 의미 클러스터링 — 같은 axis 내 교정 룰을 유사도로 묶는다. * D2. 반복 → 강도 — 클러스터 크기 N 을 Laplace 계승법칙 confidence 로 환산해 강도 tier 결정. * * 근거 (임의 상수 아님): * - τ=0.3: `solution-injector.MIN_INJECT_RELEVANCE`(동일 relevance-scorer 표현에 2026-04-21 * gate sweep 으로 실측 튜닝된 게이트)을 상속. * - confidence=(s+1)/(s+f+2): Laplace 계승법칙(1814) / Beta-Bernoulli 사후평균. * * 이 모듈은 *순수 로직*만 담는다 — 파일 IO/룰 저장/훅 연결은 호출측(correction-cluster-runner). */ import type { RuleStrength } from '../store/types.js'; /** τ — 클러스터 편입 유사도 임계. 정준 게이트(RELEVANCE_MATCH_GATE=0.3)를 코드로 상속. */ export declare const CLUSTER_SIMILARITY_TAU = 0.3; /** 클러스터링 입력: 룰의 최소 표현(순수 로직이 파일/스토어에 의존하지 않도록). */ export interface ClusterableRule { rule_id: string; /** 클러스터는 같은 category(=axis) 안에서만 형성된다. */ category: string; policy: string; strength: RuleStrength; evidence_refs: string[]; } export interface CorrectionCluster { /** 통합 대상 룰들(크기 ≥ 2). */ members: ClusterableRule[]; /** 대표 정책(가장 긴 policy — 보통 가장 서술적). 통합 룰의 policy 후보. */ representativePolicy: string; /** Laplace 계승법칙 confidence = (N+1)/(N+2). */ confidence: number; /** confidence → 강도 tier. hard 로는 절대 자동 도달하지 않는다. */ strength: RuleStrength; /** 통합 룰의 evidence_refs(멤버 union). */ evidenceRefs: string[]; } /** * 두 정책 텍스트의 대칭 유사도. calculateRelevance 는 비대칭(prompt→solution)이라 * 양방향 평균으로 대칭화한다. confidence 인자는 1(순수 태그 매치만 보고 싶음). */ export declare function policySimilarity(a: string, b: string): number; /** * Laplace 계승법칙 (rule of succession, 1814). * s = 일관 교정 횟수, f = 모순(반박) 횟수. 지속 선호일 사후평균 = (s+1)/(s+f+2). * N회 일관·모순0 → (N+1)/(N+2): N=1→0.67, N=2→0.75, N=3→0.80, N=5→0.86. */ export declare function laplaceConfidence(successes: number, failures?: number): number; /** * confidence → 강도 tier. statusConfidence 밴드(verified=0.75)에 매핑. * confidence ≥ 0.75 (= N≥2 일관교정) → strong. 그 미만 → default. * hard 는 confidence 로 자동 도달하지 않는다 — L1 안전룰 전용(오탐 시 세션 차단 위험). */ export declare function strengthForConfidence(confidence: number): RuleStrength; /** * 같은 category(axis) 내 룰들을 유사도 그래프의 connected component 로 클러스터링. * 크기 ≥ 2 인 클러스터만 반환. hard 룰은 후보에서 제외(안전룰은 통합 대상 아님). * * @param rules 후보 룰들(호출측이 me-scope active explicit_correction 로 필터해서 전달) * @param suppressed 억제 조합 키 집합(unmerge 된 조합 재통합 방지) — 정렬된 rule_id join */ export declare function clusterCorrectionRules(rules: ClusterableRule[], suppressed?: ReadonlySet): CorrectionCluster[]; /** 클러스터 멤버 집합의 안정 키(정렬된 rule_id join) — 억제 목록/식별용. */ export declare function clusterKey(members: Array<{ rule_id: string; }>): string; /** * 이 클러스터가 억제 대상인지 — 정확 일치뿐 아니라 부분집합/상위집합 관계도 억제한다. * 사용자가 거부한 조합(억제키)이 현재 클러스터에 포함(S⊆cur)되거나 현재 클러스터가 * 거부 조합의 일부(cur⊆S)면 재통합하지 않는다. 데이터 손실 없음(안 묶으면 흩어진 채 유지). */ export declare function isSuppressedCluster(members: Array<{ rule_id: string; }>, suppressed: ReadonlySet): boolean;