HOMECLAW GATEWAY · 2026-09-23 기준
한 발이 사용자에게 닿기까지 지나가는 문(게이트) 전체 — src/gateway/guards/prompt-gates.ts의 입장 분류,
tool-scope.ts의 도구 게이팅, 모델 응답을 검사하는 출력 가드까지 한 장으로.
발화 하나가 지나는 7단. ④→⑥ 사이에서 문제가 잡히면 모델 호출로 되돌아간다(강제 재검색·재프롬프트, 최대 1회).
발화를 종류별로 판별해 이후 단계의 스위치를 켠다. 뉴스·재난·실시간·사실확인·인사·실행형·메시징.
정의 77개(build-tools.ts)를 세션·턴 종류별로 거른다. 부팅 턴은 2개만, 번역·proj 세션은 0개, 코드AI는 블록리스트 제외, 나머지는 스킬 키워드 게이트.
시스템 프롬프트 + 성격 컨텍스트(USER.md·메모리 스니펫·카테고리 감지) + 도구 스키마. 게이팅 덕에 도구 프롬프트 비용이 17.4K 토큰에서 80~92% 절감된다.
primary glm-5.3-flash:cloud (09-22 교체). 라운드 0에서 실시간·사실형 질의면 tool_choice: required 강제 — 전역 ON(07-29).
separateThinkingFromContent — think 태그 제거 + 키워드 휴리스틱 + 영어 셀프토크 구조 기반 분리(GLM 노출 대응, 진행 중).
답변을 다시 검사한다. 실패하면 검색 강제·재프롬프트로 ④로 되돌아감 — 아래 표.
세션 저장 + thinking은 UI에서 별도 표시.
발화를 보고 "이건 어떤 요청인가"를 판별하는 술어들. 출력 가드와 달리 발화가 통과하는 문이 아니라 라우팅 스위치 역할.
| 게이트 | 판별 대상 | 효과 |
|---|---|---|
| isLiveDataRequest | 날씨·실시간·시세 | 도구 강제, 실시간 검색 경로 — round 0 tool_choice required |
| isNewsRequest · DISASTER_PATTERN | 뉴스·재난 키워드 | 뉴스 라우팅, 재난 시 전건수 답변 |
| isFactualInfoRequest / ThreadFollowUp | 사실형 질문·후속질문 | 검증 경로 진입 |
| isExecutionLikeRequest | 실행형 요청 | 사실검증·가드 면제 |
| isGreetingLikeMessage | 인사말 | 검증 면제 |
| isMessagingRequest + claimsMessageSent | "보냈다"는 주장 | 전송 사실 검증 |
| assumedGenerationTokenInQuery | 검색어에 학습시점 세대 박음("M4" 등) | 세대 추정 쿼리 차단 |
| shouldForceSessionScopeForTemporalClaim | 시점 주장 | 세션 범위 강제 |
| isExemptFromVerification | 면제 목록 | 가드 전체 스킵 |
모델이 이미 낸 답을 검사해 실패 시 모델 호출로 되돌린다. 가드 발동률 실측 21%.
| 가드 | 잡는 것 | 동작 |
|---|---|---|
| NUMERIC-GROUNDING | 검증 안 된 스펙·가격 숫자 | 강제 재검색 (최대 1회). sourceCoversQuery 관문으로 "맞는 답을 지우는" 오탐 차단(09-04) |
| SEARCH-ABANDONMENT | 도구 0개로 턴 종료 | 재검색 재프롬프트 |
| DEFERRAL-PROMISE · INTENT-ONLY | "잠시만 기다려 주세요"·의지만 말고 종료 | 턴 강제 지속 |
| SYCOPHANTIC-CONFIRMATION | 근거 없이 사용자 추측 맞다고 확인 | 재검증 |
| STALE-VERSION | 최신판 요청에 버전 확인 누락 | 버전 확인 재요청 |
| EMPTY-GROUNDING · DEAD-END | 빈 검색결과·막다른 길 | 폴백 체인 (searxng→ollama_cloud→tavily→…) |
| SAFETY-REFUSAL | 안전 거부 오탐 | 재시도 판단 |
| MSG-SENT | "보냈다" 주장 | 전송 사실 검증 |
\b는 한글 뒤에서 절대 매칭 안 됨 → rankResults가 한국어 검색 관련성을 0으로 만들었던 진범. 한글 정규식은 문자클래스부터 의심.sourceCoversQuery 관문 신설.primary를 gemma4:31b-cloud에서 glm-5.3-flash:cloud로 교체하자 답변 앞에 영어 내부 계획("Key message:", "Answer format:")이 노출되고 마지막 단락에서 한글과 무공백 융합("No emoji habit.아쉽게도…").
대응: separateThinkingFromContent를 thinking-separation.ts로 추출 + 구조 기반 stripEnglishScratchPrefix 추가. 단위 테스트 6건 중 4건 실패 — 한글이 섞인 영어 계획 단락 허용하도록 수정 필요 (미해결).