HOMECLAW GATEWAY · 2026-09-23 기준

홈클로 가드 지도

한 발이 사용자에게 닿기까지 지나가는 문(게이트) 전체 — src/gateway/guards/prompt-gates.ts의 입장 분류, tool-scope.ts의 도구 게이팅, 모델 응답을 검사하는 출력 가드까지 한 장으로.

1,011
감사 대상 발화 (09-04)
21%
가드 발동률
80~92%
도구 토큰 게이팅 절감
7종
휴면 가드 (0건 — 제거 금지)

파이프라인handle-chat.ts · prompt-gates.ts · tool-scope.ts

발화 하나가 지나는 7단. ④→⑥ 사이에서 문제가 잡히면 모델 호출로 되돌아간다(강제 재검색·재프롬프트, 최대 1회).

① INPUT

입력 분류

발화를 종류별로 판별해 이후 단계의 스위치를 켠다. 뉴스·재난·실시간·사실확인·인사·실행형·메시징.

isLiveDataRequestisNewsRequestDISASTER_PATTERNisFactualInfoRequestisGreetingLikeisExecutionLike
② TOOLS

도구 게이팅

정의 77개(build-tools.ts)를 세션·턴 종류별로 거른다. 부팅 턴은 2개만, 번역·proj 세션은 0개, 코드AI는 블록리스트 제외, 나머지는 스킬 키워드 게이트.

selectToolsForTurnbuildSkillToolFiltercodeAiBlockedTools
③ PROMPT

프롬프트 조립

시스템 프롬프트 + 성격 컨텍스트(USER.md·메모리 스니펫·카테고리 감지) + 도구 스키마. 게이팅 덕에 도구 프롬프트 비용이 17.4K 토큰에서 80~92% 절감된다.

buildChatSystemPromptpersonality-context
④ MODEL

모델 호출 · 라운드 루프

primary glm-5.3-flash:cloud (09-22 교체). 라운드 0에서 실시간·사실형 질의면 tool_choice: required 강제 — 전역 ON(07-29).

forceToolChoiceOnLiveDataround loop
⑤ SPLIT

thinking 분리

separateThinkingFromContent — think 태그 제거 + 키워드 휴리스틱 + 영어 셀프토크 구조 기반 분리(GLM 노출 대응, 진행 중).

⑥ GUARDS

출력 가드

답변을 다시 검사한다. 실패하면 검색 강제·재프롬프트로 ④로 되돌아감 — 아래 표.

NUMERIC-GROUNDINGSEARCH-ABANDONMENTINTENT-ONLYDEFERRALSTALE-VERSIONSYCOPHANTIC-CONFIRM
⑦ REPLY

응답

세션 저장 + thinking은 UI에서 별도 표시.

입력 게이트guards/prompt-gates.ts

발화를 보고 "이건 어떤 요청인가"를 판별하는 술어들. 출력 가드와 달리 발화가 통과하는 문이 아니라 라우팅 스위치 역할.

게이트판별 대상효과
isLiveDataRequest날씨·실시간·시세도구 강제, 실시간 검색 경로 — round 0 tool_choice required
isNewsRequest · DISASTER_PATTERN뉴스·재난 키워드뉴스 라우팅, 재난 시 전건수 답변
isFactualInfoRequest / ThreadFollowUp사실형 질문·후속질문검증 경로 진입
isExecutionLikeRequest실행형 요청사실검증·가드 면제
isGreetingLikeMessage인사말검증 면제
isMessagingRequest + claimsMessageSent"보냈다"는 주장전송 사실 검증
assumedGenerationTokenInQuery검색어에 학습시점 세대 박음("M4" 등)세대 추정 쿼리 차단
shouldForceSessionScopeForTemporalClaim시점 주장세션 범위 강제
isExemptFromVerification면제 목록가드 전체 스킵

출력 가드handle-chat.ts · retry-decisions.ts · numeric-grounding.ts

모델이 이미 낸 답을 검사해 실패 시 모델 호출로 되돌린다. 가드 발동률 실측 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"보냈다" 주장전송 사실 검증

감사 실측 노트2026-09-02 ~ 09-04

발화 1,011건 전수 — 전부 게이트 통과. 로그 기반 감사로 보정한 유일한 기준선.
휴면 가드 7종 — 감사 시점 0건이지만 의도적 휴면. 제거하면 안 됨.
호출 47%가 출력 60토큰 미만 — 가드·게이트 오버헤드가 큰 비중을 차지하지 않는 이유.
한글 정규식 함정 — \b는 한글 뒤에서 절대 매칭 안 됨 → rankResults가 한국어 검색 관련성을 0으로 만들었던 진범. 한글 정규식은 문자클래스부터 의심.
가드는 실측 데이터로만 보정 — 가상 케이스로 임계값 잡으면 3번 연속 틀림. SSE tool_result는 잘려 있음.
가드의 전제 검증 — NUMERIC-GROUNDING이 맞는 답을 5턴 연속 지운 사례 → sourceCoversQuery 관문 신설.

진행 중

09-22 · GLM 전환 + 영어 셀프토크 노출

primary를 gemma4:31b-cloud에서 glm-5.3-flash:cloud로 교체하자 답변 앞에 영어 내부 계획("Key message:", "Answer format:")이 노출되고 마지막 단락에서 한글과 무공백 융합("No emoji habit.아쉽게도…").

대응: separateThinkingFromContent를 thinking-separation.ts로 추출 + 구조 기반 stripEnglishScratchPrefix 추가. 단위 테스트 6건 중 4건 실패 — 한글이 섞인 영어 계획 단락 허용하도록 수정 필요 (미해결).