이 기간 동안 klaw.hondi.net(Openhash-Gopang/klaw)과 hondi-proxy 백엔드(Openhash-Gopang/hondi worker.js)에 이뤄진 모든 변경사항을 정리합니다. PR 번호는 각 저장소 기준입니다.
배경 원칙(주피터 지시): "혼디 가입자는 혼디 시스템의 모든 모듈에 자유로이 접근할 수 있어야 한다 — hondi.net에 전화번호 인증하면 다른 모든 K-서비스에 자유로이 접근하고, hondi.net과 동일한 방식으로 사용량에 따른 GDC 차감이 이뤄져야 한다."
k-service-auth-client.js, phone_verify_token 기반)로 로그인 후 /klaw/relay(K-Law 공유 계정)를 통해 이용. 본인 API Key 입력 시(BYOK)는 기존처럼 브라우저에서 각 제공사 API로 직접 호출 — relay를 거치지 않음._klawCall이 요청 전 반드시 KAuth.ensureLogin()을 거치도록 변경. 이전엔 401을 받은 뒤에야 재로그인하는 반응형 구조였음._onGopangAuth) 잔재라 실제 상태와 무관하게 고정 표시되던 문제를 발견, KAuth.hasValidLogin() 기반 실시간 배지(_klawRefreshAuthBadge)로 교체.핵심 발견: klaw-pro 티어는 DeepSeek의 "thinking"(추론) 모드가 항상 켜져 있고 (hondi worker.js payload.thinking), 추론 토큰도 max_tokens 예산에서 함께 소모된다. 예산이 부족하면 모델이 추론만 하다 실제 답변은 한 글자도 못 쓰고 끝나는 사례가 반복 발견됨.
| 항목 | 최초 | 최종 |
|---|---|---|
| 사건 분석 (단순) | 1400 | 2400 |
| 사건 분석 (복잡, pro) | 2400 | 10000 |
| STEP 0 | 3000 | 9000 |
| STEP A | 3000 | 14000 |
| STEP B (최종 판결문) | 3000 | 16000 |
| STEP C | 3000 | 9000 |
STEP A·B가 특히 높은 이유: 각 STEP은 이전 STEP 전체 출력을 컨텍스트로 이어받아 갈수록 입력이 커지고, 요구되는 실제 출력 분량도 STEP C(확신도 숫자+짧은 요약)보다 훨씬 길다.
_klawCaseIsComplex() — 글자 수(900자) 또는 당사자 키워드 빈도(12개 초과) 기준으로 복잡한 사건을 판정해 klaw-flash 대신 klaw-pro로 자동 승격.finish_reason:'length'로 잘리면, klaw-pro로 한 번 자동 재시도(사전 복잡도 판정을 놓친 사례 사후 구제).[종합 확신도: min(8,9)=8/10]처럼 계산식을 적어도 마지막 숫자를 정확히 추출하도록 정규식 보완.기존 이력 기능은 currentUser?.ipv6(2026-07-23 제거된 죽은 코드가 채워야 하는 값)에 의존해 저장·조회가 항상 조용히 실패하고 있었다. 게다가 백엔드가 클라이언트가 보내는 user_id를 그대로 신뢰해, 값만 바꾸면 남의 이력을 보거나 남의 이름으로 기록을 남길 수 있는 취약점 발견.
/klaw/sessions/*가 phone_verify_token으로 서버가 guid를 직접 재확인 — 클라이언트가 보내는 user_id는 완전히 무시.klaw_sessions에 match_rate 필드 신설(마이그레이션/Admin API로 무중단 반영)."일치도만 표시"에서 한 발 나아가, STEP 0~C 판결문 전문을 저장하고 이력 목록 클릭 시 모달로 다시 열람하는 기능 추가.
/klaw/sessions 저장 시 verdict_full 함께 저장. /klaw/sessions/detail(신규) — record id + phone_verify_token으로 조회, 레코드의 user_id가 요청자 guid와 정확히 일치할 때만 반환(안 맞으면 404 — 존재 여부조차 안 알려줌).verdict_full 텍스트 필드(최대 200,000자) 신설._klawCall과 동일한 재로그인 자동복구 로직 적용.디자인 방향이 세션 내내 여러 번 전환되었다 — 각 결정은 그 시점 지시를 반영한 것으로, 이후 지시가 이전 방향을 대체한다.
| 단계 | 내용 |
|---|---|
| 자료 다운로드 카드 | Material Design 카드(#19) → 법원 문서풍 무장식 고지문(미채택) → 헤더 우측 여백으로 이동, 카드/문구 삭제(#29, 최종) |
| 안내 박스 배경색 | 제각각(주황/초록/파랑) → 청색으로 통일(#14) → 2곳(면책 고지·표 강조행)만 남기고 플레인 텍스트化(#16, 최종) |
| AI 모델 카드 | 빈 선택 표시등·제각각 아이콘 모양·3줄 텍스트 → 체크 배지·통일 아바타·2줄 압축, API Key 버튼 간소화(#33, 최종 — 사전에 목업 승인 절차 거침) |
| 진행 표시 | dot 4개 → 막대 바(#23) → 실제 DeepSeek 스트리밍 원문 미리보기 + 경과시간 기반 바(#24, 최종) |
| 입력 제출 | Enter 키 제출은 다문단 사건 개요 작성과 충돌 — Ctrl+Enter로 제출, 일반 Enter는 줄바꿈 유지(#23) |
.gitattributes — Python 스크립트로 파일을 열고 저장하는 과정에서 Windows 텍스트 모드가 파일 전체 줄바꿈을 CRLF로 바꿔버려, 다음 patch들이 매번 컨텍스트 불일치로 실패하는 원인이 됨. 정규화 커밋(내용 변경 없음, 재현 확인)으로 해결하고 재발 방지용 설정 추가.\가 아닌 백틱(`) 사용, git am 대용량 patch 실패 시 git apply로 대체 가능."이력" 탭을 클릭해도 반응이 없다는 제보. 재현해보니 실제로는 한 클릭 안에서 두 가지가 동시에 일어나고 있었다: ① 탭의 onclick="toggleHistoryPanel()"이 실행되어 패널이 열리고, ② 같은 클릭 이벤트가 document까지 계속 버블링되며 "패널 바깥 클릭 시 닫기" 리스너가 발동해 곧바로 닫혀버렸다. 같은 패널을 여는 우측 상단 아바타 버튼(#user-info-bar)은 그 리스너의 예외 목록에 들어있어 정상 작동했지만, 나중에 추가된 "이력" 탭 버튼은 예외 목록에서 빠져 있던 게 원인.
탭 버튼에 id="history-tab-btn"을 부여하고 리스너 조건에 추가해 해결. Playwright로 "아바타는 정상, 탭은 열렸다 즉시 닫힘" 상태를 직접 재현해 원인을 확정한 뒤 수정했다.
"사건의 개요" 입력란 아래에 "일치도 평가" 패널을 신설. 사용자가 실제 대법원 판결문 전문을 붙여넣으면, 방금 생성된 K-Law 가상 판결문과 비교하여 "일치도 평가 기준" 방법론에 따른 평가 보고서를 생성한다.
.docx라 그대로 프롬프트에 넣을 수 없다. mammoth.browser.min.js로 클라이언트에서 텍스트만 추출.loadKlawVersion()과 동일한 패턴으로 저장소 파일 목록을 스캔해 일치도_평가_기준_v[숫자].docx 중 가장 높은 버전을 자동 선택. 문서가 새 버전으로 교체되기만 하면 코드 수정 없이 반영됨."팝업이 아니라 게시판 형식의 이력 페이지를 보여달라"는 지시로, 작은 플라이아웃 패널을 완전히 걷어내고 my-history.html 신규 페이지로 교체.
window._verdictText 전문을 verdict_full 필드로 저장(최대 200,000자, 초과 시 무음 절단 대신 [⚠ 저장 용량 한도로 잘림] 명시)./klaw/sessions/detail — record id + phone_verify_token으로 조회, 레코드의 user_id가 요청자 guid와 정확히 일치할 때만 반환.일치도 평가 프롬프트가 방법론 원문에서 자동 추출한 실제 항목명(결론 방향 일치도/핵심 법리 일치도/세부 논증 일치도)으로 [항목: X] [점수: Y%] 태그를 출력하도록 지정. 항목명을 코드에 하드코딩하지 않고 정규식으로 파싱해 match_items(JSON)에 저장 — 방법론 문서가 버전업되어 항목 구성이 바뀌어도 코드 수정이 필요 없다.
분석 프롬프트에 【사건명】 태그를 추가해 "건축인허가 처분 취소 청구"처럼 실제 법원 사건명 형태의 짧은 제목을 K-Law가 직접 생성하도록 함. 날짜는 이미 별도 칼럼에 있으므로 제목에는 절대 포함하지 않음. 이 필드 도입 이전에 생성된 레코드는 소급 적용되지 않아, case_type+case_summary 기반 대체 제목으로 폴백.
public-board.html 신설 — is_public=true인 이력만 인증 없이 볼 수 있는 게시판. 작성자는 이용자-xxxx 형태로 익명화(guid 뒷자리 일부만 노출).
_sendCaseToKlaw()가 모든 시뮬레이션 결과를 예외 없이 옛 klaw_cases 컬렉션(공개 옵션 자체가 없는 시스템)에 계속 자동 게시하고 있었다는 것을 뒤늦게 발견. 새 is_public 플래그를 다 만들어놓고도 이 호출 하나를 제거하지 않으면 전체 기능이 무의미해지는 상황이었음 — 발견 즉시 자동 호출 제거, 판결문 카드의 게시판 링크도 새 public-board.html로 교체(옛 board.html은 이제 새 글이 안 쌓이는 페이지라 그대로 두면 사용자를 막다른 곳으로 보내는 셈이었음).| 항목 | 이전 | 이후 |
|---|---|---|
| 생성 시각 | 전체 로케일 문자열(폭 넓음) | 2026.09.16.15:36 압축 표기 |
| 제목 | 없거나 "(제목 없음)"만 표시 | 사건명 자동 생성 + 옛 레코드 대체 제목(날짜 미포함) |
| 일치도 칼럼 | "종합 일치도", 값에 "(복잡도 N/10 기준)" 포함 | "일치도 예상"으로 개명, 순수 %만(옛 값도 화면에서 걸러냄) |
| 항목별 평가 | 미평가 항목에 "미평가" 텍스트, 2줄로 줄바꿈 | 흐린 색상의 항목명만, flex-wrap:nowrap으로 한 줄 강제 |
| 공개 칼럼 | 다른 칼럼과 동일 폭 | 토글 크기에 맞춘 최소 폭 |
_onGopangAuth/currentUser가 2026-07-23 제거된 인증 스크립트를 전제로 작성되어 있어, 이력 저장·조회·헤더 배지가 전부 "성공한 것처럼 보이지만 실제로는 항상 실패"하는 상태였다. 에러가 안 나서 오래 발견되지 않았을 가능성./klaw/sessions/*가 클라이언트가 보내는 user_id를 검증 없이 사용해, 값만 바꾸면 타인의 사건 요약·판결 내용을 조회하거나 타인 명의로 기록을 남길 수 있었다._klawCall과 동일한 자동복구 적용. ④ KAuth 미정의 방어 누락 → 추가.git am이 반복 실패(원인: CRLF 정규화 이전 상태 기준으로 만들어졌던 patch). (b) 보완 전 원본 patch(#34)가 먼저 merge되어, 4가지 허점 보완판을 현재 head 기준으로 다시 만들어 별도 PR(#35)로 반영._sendCaseToKlaw() 제거를 빠뜨려, 새 기능을 다 만든 뒤에도 모든 결과가 여전히 무조건 공개되고 있었다(9번 섹션 참조). 계획을 문서로 남겨도 실행을 별도로 검증해야 한다는 교훈.finish_reason:'length' 발생 시 "이어서 계속 작성" 요청을 자동으로 보내 이어붙이는 방식일 것 — 둘 다 별도 설계가 필요한 큰 작업으로 남겨둠.DEEPSEEK_API_KEY로 폴백하는 공유 계정 구조상, 무료 경로 사용량이 늘면 하루 예산(1인 300원/계정 전체 30,000원) 소진이 더 빨라질 수 있다 — thinking 모드 토큰 상향과 트레이드오프 관계..caution-bar(동적 경고 메시지 스타일)는 이번 청색 통일 작업에서 의도적으로 제외 — 정적 안내 박스 묶음과 성격이 달라 보여서. 필요 시 후속 작업으로 통일 가능.portal.scourt.go.kr)가 특정 판례 하나를 가리키는 고정 링크라, 시간이 지나면 "최신 판례" 취지와 안 맞을 수 있음 — 주기적 갱신 필요.