/** * Meta-guard dispatcher — TEST-1/2/3 + DANGEROUS 빌트인 가드의 단일 평가 지점. * * ADR-009 §2a: 기존 stop-guard.main() 안에 인라인돼 있던 checks[] + for-loop 를 * 순수 함수로 추출한다. 목적은 동일 로직을 `Stop`(메인 응답) 과 `SubagentStop` * (워크플로우/Task subagent 응답) 두 hook 에서 공유하기 위함이다 (probe 실측: * 워크플로우 내부 에이전트도 forgen 훅을 발화 → subagent 산출물도 검증 대상). * * 순수성: IO/부수효과 없음. recordViolation·blockStop·override 분기는 호출자가 * 담당한다 (hook 별로 다름). 평가 순서·sanitize 적용·dangerous 의 raw 입력 사용은 * 추출 전 stop-guard 동작과 정확히 동일하게 보존한다 (회귀 테스트로 박제). */ export interface MetaGuardContext { /** 평가 대상 응답 원문 (dangerous-pattern 은 코드펜스 보존 위해 raw 사용). */ lastMessage: string; /** 최근 tool 이름 윈도우 (TEST-1/2 의 "측정 도구 호출 수" 계산). */ recentTools: string[]; /** TEST-1 fact-vs-agreement 최소 측정 횟수 (기본 1). */ minMeasurements?: number; /** * W4-3 (ADR-010): 완료 가드(TEST-1/2/3)의 동작 모드. 'advise' 면 block 을 * correction(기록만)으로 강등한다 — 측정된 프론티어 모델(opus-4.8 blocks=0) * 에서 잔여 발화는 거짓양성 개연성이 높으므로. DANGEROUS-RESPONSE 는 모델 * 무관 안전장치라 이 모드의 영향을 받지 않는다. 기본 'block' (현행 유지). */ completionGuardMode?: 'block' | 'advise'; } export interface MetaGuardResult { /** 짧은 식별자 (builtin: 형태의 rule_id 와 reason prefix 에 사용). */ shortId: string; /** 사람-읽기 rule slug (systemMessage 보조). */ ruleSlug: string; /** block = 세션 재개 강제, correction = 기록만 (alert-level). */ kind: 'block' | 'correction'; reason: string; } /** * 트리거된 가드를 평가 순서대로 반환한다. **첫 block 까지** 평가 후 중단한다 * (추출 전 for-loop 가 첫 block 에서 return 하던 laziness 보존 — block 이후 가드는 * 어차피 기록되지 않으므로 평가하지 않는다). * * 평가 순서: DANGEROUS-RESPONSE(즉시 차단·안전 우선) → TEST-2(self-score, 강한 신호) * → TEST-3(conclusion/verification 비율) → TEST-1(fact-vs-agreement, alert-only). */ export declare function runMetaGuards(ctx: MetaGuardContext): MetaGuardResult[];