/** * Forgen v0.4.1 — TEST-1: 사실 vs 합의 가드 * * 목적: Claude 가 "동작합니다 / 통과했습니다 / 검증됐습니다" 같은 **사실 주장**을 * 내놓을 때, 그 턴(또는 최근 N턴)에 실제 측정/검증을 수행한 도구 호출이 있었는가? * 측정 없이 합의(agreement)만으로 사실로 변환된다면 alert. * * 배경 (RC1): v0.4.0 릴리즈 직전 self-assessment 에서 점수가 조금씩 올라가는데 * 측정 도구 호출은 0건인 케이스가 반복. 메타 점수 인플레이션 (TEST-2 / US-13) * 의 직전 단계. 여기서는 alert 레벨까지만 — block 은 TEST-2 에서. * * 순수 함수 설계: I/O 없이 텍스트 + 측정 신호 메타데이터만 받아 판정. * Stop hook / session scorer / CLI 어느 쪽에서도 호출 가능. */ /** TEST-1 판정 입력. */ export interface FactCheckInput { /** Claude 의 최근 턴 응답 텍스트. */ text: string; /** * 최근 N 턴에서 실행된 도구 이름 목록 (중복 OK). 없으면 빈 배열. * 호출지가 0턴/전체 세션 등 윈도우를 결정한다. */ recentTools: string[]; /** * optional: 측정으로 간주할 최소 tool count. 기본 1. * 빌드/테스트같은 확정 측정 1회면 충분하다고 간주. */ minMeasurements?: number; } export interface FactCheckResult { /** true = 측정 없는 사실-주장 감지, alert 필요. */ alert: boolean; /** 매칭된 사실-주장 키워드 (최대 3개). */ factAssertions: string[]; /** 감지된 합의/추측 신호 (최대 3개). */ agreementSofteners: string[]; /** 관찰된 측정성 도구 호출 수. */ measurementCount: number; /** 호출지가 surface 하기 좋은 사람-읽기 이유. */ reason: string; } /** * 핵심 판정 — 텍스트에 사실-주장이 있고 측정 도구가 없으면 alert. * 측정이 있거나 사실-주장이 없으면 alert=false. * 합의 softener 는 참고용 — softener 많을수록 reason 에 경고 추가. */ export declare function checkFactVsAgreement(input: FactCheckInput): FactCheckResult;