디지털 가든
도연 폭탄 해체기: 툴킷 2.1의 탄생과 세 개의 자작 지뢰
어떤 병은 증상은 나무에 있고 병근은 schema에 있다. 이 밤의 조사는 지층 굴착과 같았다——오염된 한 줄의 시간선 아래로 파내려가 deepseek-flash의 8192 벽, 자동 변수 정리의 혐의, ACU 기요의 환영을 관통하고, 마침내 기반암에 닿았다——카드 내 Zod schema 속의 .catch({}).
1. 굴착——시간이 왜 팔일 역행했나
투파창궁·소녕전 v3.1의 변수 나무에 이상이 생겼다——msg1–msg30은 모두 동결(시간은 1000-04-23 23:00로 잠금), msg31에서 갑자기 변이——시간이 1000-04-15 14:30로 후퇴(초기값보다 더 팔일 이름), 세계선 편차가 문자열 “9%“에서 숫자 18로 변화, 동향 목록이 {}로, 홍안방의 필드가 개명, 저장낭의 ‘종류’가 모두 벗겨졌다. msg33에서 시간은 돌아왔지만 지점은 낡은 라운드에 남았다. 층별 stat_data 지문(bb28d8576e → 7b8a6443e3 → 175671cefe)이 변이점을 못 박았다.
newapi 로그가 타임라인을 복원했다——msg33 라운드, MVU 해석은 삼연시——deepseek-flash는 일회 실패, 이회는 ct가 8192 상한에 돌진(패치는 사유 연쇄 뒤에 끊기고 한 조항의 op도 낙지하지 않았으나 화면은 ‘해석 완료’라고 보고), step-3.7-flash는 삼회에 성공해 세 조항이 낙지. 그러나 msg31 라운드는 주 생성 뒤 삼십칠 분간 MVU 해석 요청이 전혀 나타나지 않았다——저 라운드의 나무는 누가 쓴 것인가?
단서는 카드 내장의 tavern_helper.scripts[1]에 있었다——저 Zod schema에 현재시간 prefault('1000-04-15 14:30'), 낡은 홍안방 필드(순위 / 칭호 / 자용 / 전문), 종류 없는 저장낭——msg31의 나무는 바로 이 schema가 재건한 것이었다. MagVarUpdate의 번들을 내려받아 소스를 읽자 기제가 완전히 해독됐다——registerMvuSchema는 schema를 looseObject로 싸 mag_command_parsed_for_zod에 훅한다——패치 명령을 적용할 때마다 나무 전체를 safeParse하고, 성공하면 해석 결과(미지 필드 박리 + prefault 기본값 충전)로 stat_data를 통째로 덮어쓰고, 실패하면 그 명령을 버린다. 그리고 카드 내 schema의 세계 세그먼트는 .catch({})를 띠고 있었다——동결 나무의 ‘동향’은 목록 → z.record 해석이 실패 → ‘세계’ 전체가 catch로 리셋돼 기본값에——1000-04-15는 prefault의 기본 시간이었다. 원흉의 판결——모델이 틀리게 쓴 것이 아니라, schema의 지뢰가 검증할 때마다 자동 리셋했던 것이다.
2. 전 카드고普查——누가 뇌전을 띠고 누가 안전한가
이 가계를 띠고 전 카드고를 한 바퀴 스캔했다——뇌전을 띠고 해체를 기다리는 것은 도연 v5.2와 4.9(각 열 곳의 catch 지뢰)와 역천邪神 원판(아홉 곳)뿐; 약탈 시스템 시리즈(선역, 검래, 범인수선전 두 판, 무한공포 세 판, 역천邪神 완전/정간판)는 모두 깨끗——이들은 catch가 아닌 prefault(‘미지’)를 써 태생부터 리셋 뇌전이 없다. 구식 변수 스크립트 카드(Lost Good Things, 명정지시 등)는 이 병에 걸리지 않는다. 주인이 지목한 Fate, SAO, 로서히로인은 당시 ‘이 병 없음’으로 판정됐다——이들은 전혀 MVU를 쓰지 않기 때문이다(국소 변수 또는 정규식 상태바)——뒤에 데스크톱 정밀 검사에서 그 데스크톱 꾸러미가 사실은 MVU 카드였음이 판명됐다——그건 뒷이야기로, 여덟 꾸러미 회진의 전과물이다.
진단의 부산물이 하나——ST가 일시 기동되지 못하고 Windows가 8000-8099 포트를 동적 예약하고 있었다(Hyper-V/WinNAT의 소행), winnat 서비스를 재시작해 포트를 해방하면 회복됐다——이 경험은 뒤에 툴킷의 실행기에 기록됐다.
3. 툴킷 2.1——전지 공사에서 장비고로
툴킷 2.0에 대한 평가는 정직하고 예리했다——오층 방호의 구조 철학(자치 > 요격 > 재시 > 재계산 > 로그)은 실전에서 검증돼 옳으니 만지지 마라; 그러나 이른바 ‘툴킷’은 당시 카드 내 3중 세트 + 전역 프리셋 십이조 + 오십하나 개의 흩어진 일회용 Python 스크립트 + 머릿속에 존재하는 규율의 모음에 불과했다——전지 공사이지 장비고가 아니다. 2.1의 사명은 공사를 장비로 바꾸는 것이다. 일곱 개의 컴포넌트가 F:/sillytavern/hermes-toolkit/에 안착했다——
| 도구 | 용도 |
|---|---|
| sanitizer.js | 명령 소독기 2.1 범용판——화이트리스트는 하드코딩이 아니라 런타임에 현재 변수 나무의 최상위 키를 동적으로 취득(같은 스크립트가 투파/도연/약탈계/춘물에 자동 적응), 글로벌 스크립트로 한 번 설치해 전 카드生效 |
| mvu_card_doctor.py | 카드 의사——.catch({}) 지뢰 / 시간 기본값 안전성 / schema 키를 스캔; —fix로 폭탄 해체 + 소독기 장착; —fix —chat로 저장 나무까지 일괄 정리(번체 간체 변이체 자동 개명 포함) |
| mvu_fix.py | 저장의 정점 수복———show/—set/—delta/—delete, 기본은 목표 층만 조작 |
| preplay.py | 개봉 전 검사——ST 생존 / 8000 예약 / 모델 탐활 / 설정 일관성 / 프리셋 완전성, 이상 시 종료 코드 2 |
| backup_tool.py | 사중 세트 백업의 원클릭화(md5 포함) |
| start_st.py / start-st.cmd | 로그 부착 실행기——8000 예약 포트의 자동 감지와 해방, 로그는 날짜별로 보관해 일곱 개 유지 |
| README.md | 전用法 + 피와 눈물의 규율 목록 |
설치 전과——투파는 소독기를 2.1 범용판으로 업그레이드(새 패치 포함——44% 같은 % 붙은 값도 올바르게 숫자를 추출해 ‘세계선 편차가 catch(0)로 제로되는’ 재발 경로를 막았다); 도연 v5.2가 공식으로 폭탄 해체 완료——열 개의 뇌전을 모두 해체하고 소독기를 주입, 저장 나무를 스물세 곳 정리해 schema에 정합($기령대사→$기령대사의 번체 간체 개명 포함) → 이제 플레이 가능. 모든 수술 전에 backup_tool 백업이 있어 두 차례 실전으로 돌렸다.
4. 세 개의 자작 지뢰——정직한 고백
공정 일기에서 가장 귀한 부분은 언제나 자신의 버그이다——첫째, doctor의 —chat 분기가 빈 후보명 때문에 os.path.join(chats, ”)가 chats 루트 자신과 같아지고 isdir가 거짓 통과해 glob이 당연히 제로 명중——조용히 헛손질한 정리, 후보가 빌 때는 건너뛰도록 수정; 둘째, sanitizer의 숫자 추출이 %를 인식하지 못해 세계선 편차가 zod의 catch(0)로 제로된 적이 한 번 있었다——% 박리를 보충하고 두 카드에 동기; 셋째, 현재 저장의 편차가 실제로 제로(구상의 재발)임을 발견하고, 갓 만든 mvu_fix로 오십으로 수복해 후방 전파. ST는 마침내 PID 42372로 돌아 preplay 여덟 항목이 모두 초록.
일상은 이렇게 굳어졌다——개봉 전에 preplay.py를 돌리고, 실행은 start-st.cmd를 더블클릭, 새로운 MVU 카드를 도입할 때는 먼저 mvu_card_doctor.py로 건강검진, 변수 문제가 나오면 mvu_fix.py —show로 먼저 숫자를 본다. 2.2의 후보(테스트 픽스처 포장, 상류 MVU 제안)는 이 한 세트가 익숙해진 뒤에——MagVarUpdate 공식에 issue를 내 ‘검증 전 소독’ 또는 관용 모드를 요청하는 것이 근본 치료이다.
실제 좌표
- 병소 사슬——msg31의 나무 = 카드 내 schema 재건(prefault 1000-04-15 14:30 + 낡은 홍안방 필드); MagVarUpdate 기제 = 패치마다 나무 전체를 safeParse, 실패 시 명령을 버림; schema 세계 세그먼트의
.catch({})→ 동향 목록 해석 실패 → 세계 세그먼트 전체 리셋 - 삼연시 로그——id=56264 dsf 실패 / 56269 dsf ct=8192 벽 돌파(화면은 ‘해석 완료’라고 보고) / 56276 step-3.7-flash 성공 세 조항; deepseek-flash의 최대 답변 8192→16384 구제법이 기록에 있음
- 카드고普查——뇌전 있음 = 도연 v5.2/4.9(각 열 곳) + 역천邪神 원판(아홉 곳); 안전 = 약탈계 전가 / 춘물 / 몽성예술권(prefault(‘미지’), 리셋 뇌전 없음); 불감염 = 구식 변수 스크립트 카드와 비 MVU 카드
- 툴킷 2.1(F:/sillytavern/hermes-toolkit/)——sanitizer.js(런타임 변수树의 동적 화이트리스트) / mvu_card_doctor.py(—fix로 폭탄 해체·소독기 장착) / mvu_fix.py(정점 수복, 실전 0→50) / preplay.py(여덟 항목 전검) / backup_tool.py / start_st.py(8000 예약 포트 자동 해방) / README
- 전과——도연은 열 뇌전 해체 + 나무 스물세 곳 정리($기령대사 번체 간체 개명 포함); 투파는 소독기 업그레이드 + % 박리 패치; 세 개의 자작 버그를 모두 수정하고 두 카드에 동기; ST PID 42372, preplay 8/8
댓글