2026-09-18 임베딩 3모델 평가, 신의 질문 개선, 낮 화면 재구성, 최종 배포
09-17 밤부터 이어진 휴먼테스트 반영 배치의 자정 이후 기록.
임베딩 — 왜 빠졌었는지 기록하고, 한 자리에 되살리고, 3모델을 E7 기준으로 평가 (오전~오후)
출발은 사용자 질문 하나였다: “Core·NPC는 로컬도 외부도 다 평가했는데, 임베딩만 로컬이랑 비교를 안 했네?”
- 왜 빠졌었나 — 정본에 추가 기록(A.20). 코드·DB 실사:
get_embedding()호출 0,truth_claim_embeddings0행,/health에 표시 없음. 누락이 아니라 09-06 채점 밸런스 조정에서 RAG top-3 절단 경로를 제거(top-3만 심판에게 주던 게 “정답에 도달해도 21~42%”의 원인 — 8개 전부 주니 정답형 65.3→100.0)했고, 두 번째 용도search_notes는 미구현. 즉 임베딩 모델을 비교하기 전에 쓰임새가 채점 캘리브레이션 축에서 빠진 것. 기획서 확정본 v9.0(§11.5·§11.6)·Evaluation PART1(§5 Anchor)·쉬운 설명 문서(§49)에 원문 무수정으로 이력 블록 추가(삭제 0줄),apiscenario.md의 틀린 미해결 과제(“임베딩 무료 키 한도 운영 전환 전 확인”) 정정. - 운영 전환 뒤에는 코드를 동결하므로 → 전환 전에 구현·평가 가능한 건 전부. 사용자 결정: 임베딩은 ① 직접 쓰기 규칙 대안 순위 한 자리에만 되살린다(플레이어가 고르는 추천이라 틀려도 게이트 무해 — 09-06의 교훈 “임베딩으로 결정하면 틀렸을 때 조용히 깎인다”를 지킴). 채점·NPC 기억·단서 해금에는 안 닿게.
- 구현(A.21).
alternative_rank.pyStrategy(StemOverlapRank기본·EmbeddingRank예외 시 어간 폴백 + warning 1줄),ollama_embedding.py(/api/embed, MRLdimensions, Qwen3 계열에만 query 지시문), Geminitask_type두 갈래, 포트에embed_query/embed_documents. 자매 프로젝트 lifetutorial의 임베딩 방식을 참고 기준으로(MRL 절단·L2 정규화·질의/문서 비대칭·”provider별 벡터는 한 컬럼에 섞지 않는다”). sonnet 검토 Critical 1(캐시 조회가try밖 → 짧은 응답 시 KeyError가 폴백 우회) + Major 1(지시문이 bge에도 붙음) 수정. - 평가 — 3모델을 E7·E6과 같은 축으로. 비교 러너
run_rule_alternatives_eval.py, 골든은 에이전트 초안 30문장 → 검수한 22문장(뜻이 다른 8문장 제외, “포대를 들여다본다”는 “포대 자체가 뭔지 보는” 뜻으로 14·15 교체). 검수 골든 top-1: 어간 0.364 / qwen3-embedding:4b@2560 0.909 / qwen@1536 0.818 / bge-m3@1024 0.909 / Gemini 0.955(1024·1536·2560·3072 전부 동일 — 차원 무관). top-3는 임베딩 전 셀 1.000. 모델 간 순위 일치도(벡터 코사인은 공간이 달라 무의미 — Kendall τ로): qwen2560↔1536 τ 0.90(절단 무해), Gemini↔qwen τ 0.31~0.36, Gemini↔bge-m3 τ 0.59~0.63 — bge-m3가 Gemini와 가장 닮은 로컬 모델. 반복 n=3 적중률·오답 집합 3회 완전 동일(결정론). 공통 오답 1건 “은상이 본 대로 얘기하게”(6셀 전부 “들은 것을 그대로 전한다”로 — 모델 공통 한계, top-3엔 포함). - 서버 실경로·VRAM 동주 — 여기서 결정이 갈렸다. 별도 포트/테스트 DB에서 HTTP
/rule/preview임베딩 순위 확인(“스피커실”→”방송실에 간다” 어간 3위→임베딩 1위), ollama 차단 시 200+어간 폴백. VRAM(RTX 5060 Ti 16GB): gemma4 8.1 + kanana 5.3 + qwen3-embedding:4b 4.4GB(실상주) = 17.7GB → 임베딩 호출이 Core·NPC 둘 다 축출(2/2, 재로드 4~6.5s). bge-m3 0.66GB → 14,187 MiB 셋 다 온칩·축출 0(2/2). 서버→ollama 본문 프록시 캡처로 지시문 미부착·1024 반환 실증. - 결정(사용자). 차원은 둘 다 2560(Gemini는 무손실, qwen은 무절단 — Settings 기본). 최종 구성: 프로덕션 = Core·NPC Anthropic + 임베딩 Gemini@2560 / 로컬 개발·롤백 = gemma4 + kanana + bge-m3@1024(
.envEMBEDDING_PROVIDER=ollama한 줄,Settings.embedding_model기본bge-m3). qwen@2560은 로컬 단독 최적 기록으로만. metrics.yml +30줄, A.21 §1~§8. - A.19 후속 과제 닫음 — planner beats 상한 결정적 절단. Anthropic 구조화 출력이
maxItems·maximum을 못 받아 재생성·폴백이 나던 결함.cut_to_max_length헬퍼(필드MaxLenreflection)로NpcPlan.beats(꽉 찬 계획만 번호 위치 재부여 — sonnet 검토 Major:beat: 7혼입)·AdvisorOptionsOutput.options·AdvisorReplyOutput.evidence. 프롬프트 “정확히 6개” 한 줄. 테스트 5건, 960 passed. - 러너 3종
--provider anthropic—runner_common.make_provider_llm(프로덕션 팩토리 경유), ollama 기본 경로 실주행 3건 동일.run_paw_eval은 self-play 판을 읽는 러너라 라벨만. Anthropic 키 런북(self-play→paw_eval→채점 캘리브레이션→누설)은 최종 시나리오까지 끝난 뒤 마지막에 한 번(사용자 결정, 오늘 밤 실행 취소).
신의 질문 개선 (테스터9 F16·F19·F20, 테스터10 F5)
- “알 수 없다”면 질문 횟수를 환급한다(한 밤 3회 상한, 같은 질문 재입력은 차감, 안내 질문은 무차감). 화면은 판정 배지와 첫 문장 → “내일 해 볼 일” 조언 블록 → 나머지는 접기 순서로 바꿨다.
- 게임 목적·사용법 질문은 키워드 표로 분류해 모델 호출 없이 고정 안내로 답한다. 입력창 위에 두 사용법(가설 판정 / 기록 찾기)을 적었다.
- 시나리오에 공개 사다리 8칸을 두고 회차·최고 점수(25점 단위)로 한 칸씩 연다. 조언자 입력에는 열린 칸만 들어가고, “알 수 없다” 답에는 사다리 원문이 나가지 않는다. 실제 모델 스모크에서 unknown이 10/10 → 7/10으로 줄었다.
- 리뷰에서 Critical 두 건(동시 요청으로 환급·호출 상한 우회, 연결 풀 고갈 시 모델 호출 뒤 롤백돼 무료 재호출)이 나와 A등급으로 올려 잠금·감사 기록 분리로 고쳤다.
비용 동시성 차단 (5b)
- 낮 장면·밤 답안·회차 시작의 잠금을 전부 NOWAIT로 바꿨다. 앞 요청이 처리 중이면 기다리지 않고 409(
request_in_flight)를 돌려준다. 채점 중 답안 수정도 같은 잠금으로 묶어, 채점한 문장과 저장된 문장이 어긋나던 경로를 막았다. - 답안 응답을 이벤트에 저장해, 채점 뒤 연결이 끊겨도 답안 재전송이 같은 응답을 받는다(모델 호출 0).
- 모델 호출 감사 기록은 전용 작은 풀에 쓰고 실패해도 롤백하지 않는다 — 모델을 불렀으면 차감이 남는다.
NPC 답변 품질 (테스터9 F14)
- 민석 수첩 내용이 비어 있어 모델이 둘러대던 문제를 시나리오 데이터로 채우고, 기억·질문에 없는 숫자와 자기 행동 부정을 거부하는 검사를 넣었다. 실제 모델로 세 사례 전부 개선을 확인했다.
설정 메타포 정리
- 손목띠·침상 명판·민석 수첩의 표식은 인물 눈에만 숫자·이름이고 사람 기준으로는 글자가 아니다. 사람(관리자) 쪽 글자는 아무도 읽지 못한다. 인물별 손목띠 번호를 고정값으로 정의해 모델이 지어내지 못하게 했다.
문서·보안
- 기획서 정본을
docs/define/…확정본_v9.0으로 확인하고 09-17~18 결정을 이식했다(루트 v8.1은 구판 표시). /health에서 모델 구성을 빼고, 자격 증명 정리 1건을 처리했다.- 판 소유자 확인·공개 배포 강화(
7141943, 07:32) — 판 하위 17개 라우트에 로그인+판 주인 확인(AttemptAccessInteractor), 남의 판·없는 판·잘못된 ID를 같은 404로, 남의prior_attempt_id는 없는 판처럼 무시. 공개 배포 설정에 배포 보안 점검 1건 적용./docs·/openapi.json비활성. 테스트 DB 이름이_test가 아니면 거부.
오후 — 테스터9 A등급 마무리와 B등급 반영 (14:00~14:40)
A등급 셋 중 F26(판 주인 확인)·F17(노트 비채점, 안 B)은 밤에 이미 끝나 있었고, 남은 것은 F11의 “매칭 문장 지목 오류”였다. 기록 문서의 조치 줄은 밤 반영분에 맞춰 전부 갱신했다(F1·F2·F10·F12·F14·F16·F17·F19·F21·F22·F25·F26).
- F11 매칭 문장 지목 오류 (A) — DB harness_event를 읽어 원인을 찾았다: 채점 모델이
why에서는 맞는 후보를 인용하면서matched_index는 하나 낮게 낸다(실판 181건 중 38건, 전부 −1). 출력에matched_quote(후보 원문 일부)를 번호 앞에 두고, 인용이 유일하게 가리키는 후보로 번호를 결정적으로 보정한다(scoring_rules.resolve_matched_index). 하네스 재시도로 풀지 않은 이유는 temperature 0이라 같은 출력이 반복되기 때문. sonnet 검토 Major 2건(none 판정의 잔여 인용, 러너 정합)·opus 최종 리뷰 Major 1건(따옴표·번호 접두가 붙으면 보정이 꺼짐)을 수정 1회로 반영. DB 249건을 gemma4:12b로 재판정: 번호 오류 옛 프롬프트 35% → 새 원 번호 8% → 보정 뒤 0.6%, verdict 분포는 옛·새 동일(일치 230/249). 정본model_evaluation.mdA.22,metrics.yml2줄. 982 passed. 14:32 백엔드 재기동(09:57 이후 플레이 없음). - F23 단서 조각 표시 (B) — 파편 관찰이 단서 기록에만 들어가고 채팅에 안 나오던 것을 그 장면 채팅에 표시(서술 파편은 서술문,
이름: "…"파편은 그 인물의 점선 말풍선). 파편 문장"귀표"라는 단어를 준이 쓴다.는 대사로 바꿨다(준: "귀표. 이거 귀표라고 하던데.", 시나리오 확인 완료). sonnet 리뷰 Critical/Major 없음, Minor 2건(회차 ID 필터·둥근따옴표)은 Codex CLI가 반영 — 사용자 지시로 이제 프론트엔드 작업은 Codex에 맡긴다.tsc통과. - 사용자 결정(14:45) — 채점 엄격도는 그대로, “귀표” 대사 문장 그대로, 커밋 진행.
- 남은 것 — F11 난이도 목표 점수대, F14 추가 사례 2(설명 규칙이 장면 행동 반복), F19 3(추천 질문 생성), F23 ③ 충식 첫 등장 맥락·④ NEW 표시(F18), 나머지 UI 묶음(F3~F9·F13·F15·F18·F20·F24). 리서치 사이트 스냅샷은 미실행. 커밋은 아직.
오후 — 리서치 근거와 모델 평가 문장 대조·정정 (00d4f86, 16:24)
리서치 사이트 전수 검토에서 나온 지적을 정본에 되먹였다. model_evaluation.md 511줄(+298/−225)·metrics.yml 12줄.
- 맨 위에 “최종 구성과 증거 범위” 표를 두어 공개 운영용(Sonnet 5·Haiku 4.5·gemini-embedding 2560)과 로컬 롤백(gemma4·kanana·bge-m3) 구성을 결정 위치·예외와 함께 한눈에 보이게 했다.
- 비열등은 역할별 게이트를 비교하는 운영 규칙이지 통계 검정이 아니라고 명시. 공개 집계와 접근 제한 자료(
output/원문·프롬프트)를 구분해 적었다. - 임베딩
metrics.yml의repeat_n3_identical필드를 뺐다 — n=3 반복은 초기 30문장에만 해당하고 검수 22문장은 단일 실행이라 필드가 사실을 과장하고 있었다. note에 그 구분을 적었다. - 리서치 사이트 Exp 1 스냅샷은 이 커밋 뒤 18:28에 다시 떴다(A.20·A.21 반영,
01b115f).
오후~저녁 — 낮 화면 재구성: 비주얼노벨 대사창·공통 HUD (B등급, 14:50~16:35)
09-17 승인 설계(specs/2026-09-17-day-screen-vn-design.md)를 사용자 지시(“프론트 작업해줘”)로 착수. 사용자 지시로 프론트엔드는 Codex CLI가 맡았다(codex exec, 워크스페이스 쓰기 샌드박스). 장부 plans/2026-09-18-day-screen-vn.md.
- T1 서버
lines(Claude) —execute_scene이 문자열 대신 줄 레코드를 쌓고narration은 그 텍스트를 이어 붙인다. 네 응답(회차 시작·다음 장면·원숭이손 응답·발화)에lines: Line[], NPC 답변은 순수 함수sentence_rules.split_sentences로 문장 분할(따옴표 안 마침표 보존).voice_id는 서버에 음원 ID 개념이 없어 None, 프론트 문구 매칭 유지. 테스트 +26, 1008 passed. - T2~T4(Codex) —
lineStyles.ts표 하나로 9종 줄 스타일,dayMode.ts모드 reducer(intro↔dialogue),LineBox(◀▶·모두 보기·마지막 줄 도달 시 입력 해제),SceneIntro·DialogueStage·AskBar·PawPopup.DayScreen.tsx854→305줄. 공통 HUD(“N일째 / 5일” + [기록·안내])를page.tsx에 한 번, 기록 패널 두 탭(RecordLog한 줄 로그·NEW·그림 보기 / 안내·걸린 규칙). 관찰 상태를 page.tsx로 올려 HUD·밤 갤러리가 공유. - 사용자 요청 반영(T6~T8, T11) — 플레이 안내를 1일째 진입 화면에 펼쳐 표시하고 4줄로 축약(“명시되지 않으면 알 수 없는 것만”), 인물 카드는 이름만, 남은 대화 게이지를 장면 제목 아래 “남은 대화 횟수”로, “장면 1/6” 표기, 대사창 좌우 패딩.
- 헤드리스 — Codex 샌드박스가 Chrome 소켓을 막아 실행은 컨트롤러가 맡았다(Playwright는 스크래치 디렉터리에 설치,
NODE_PATH). 8종 기대값 갱신 +day-screen-vn.cjs(390/1440px) 신규. 첫 실행 2종 실패 →RecordsPanel포커스 트랩 부재(실제 접근성 결함)·opener 포커스 복귀(요소 참조 →data-observation-id재조회)·테스트 타이밍(body의 textContent가 본문을 포함해 조기 통과) 수정 후 10종 전부 통과. five-loop-flow의 BGM 요소 동일성 단언도 통과(회귀 아님). - 스크린샷(PC 1440) —
frontend/tests/day-screen-vn-shots.cjs(실서버, 개발 로그인) →frontend/tests/.playwright-out/day-screen-vn/14장. 사용자 요청으로 모바일은 찍지 않음. - 리뷰 — sonnet 전체 1회: Critical/Major 없음, Minor 3(기록만).
- 남은 것 — 9b 트럭 방송 연결(5회차 하루 끝), EntryScreen 2일째 문구 소스 정리, 문장 분할기 「」 따옴표, 테스터9 F3·F15 소리, F18 새 단서 모아 보기 필터.
저녁 — 테스터9 잔여 항목 일괄 반영 (17:30~18:05, F15 제외)
사용자 지시로 F15(대기 효과음)만 빼고 전부. 프론트는 Codex gpt-6-astra(17:30부터 모델 지정), 백엔드·시나리오는 Claude 서브에이전트 3명 병렬. 장부 plans/2026-09-18-tester9-remaining.md.
- F24 / 9b 트럭 방송 — 4회차 결말 조각(트럭 옆면에 적힌 상호를 그대로 드러내던 줄)을 지우고(인물이 글자를 못 읽는 설정과 모순), 5회차 낮 마지막 장면 끝에 관리자 방송 MA13을 번들
day_end_broadcasts로 붙였다.lines의 마지막 in-world 줄(broadcast, 음성 MA13, 그림 P06)이고 NPC 기억에는 넣지 않는다(해당 낱말 발화 금지 유지). P06은 그 줄이 현재 줄일 때만 대사창 위 그림으로 나온다(캡션 “트럭 옆면에도 글자가 있다.”). - F23 ③ 충식 — 첫 등장 조각을
같은 방에 있던 충식은 어제 이송됐다. 아침에 그 자리는 깨끗하게 비어 있었다.로. 두 문장 모두 시나리오 확정 전초안. - F14 사례 2 — 설명 규칙 대사는 모델이 아니라 시나리오 정적 문장이었고 문제 문장은 아침 커밋에서 이미 고쳐져 있었다. 재발 방지로
explanation_grounding(설명이 장면 밖 새 낱말 2개 미만이면 연결 지식 문장을 덧붙임)과SceneActionDTO.explanation_knowledge링크를 두었다. - F19-3 추천 질문 — 규칙 기반 3종(“오늘 방송에서 관리자는 무엇을 말했는가?”, “오늘 소등 뒤에 무엇이 새로 드러났는가?”, “{이름}은 오늘 무엇을 했는가?”), 물은 것 제외,
submit·questions응답에suggested_questions. 조언자가 “무엇인가·뜻” 같은 낱말을 정의 요구로 읽어 unknown을 내는 경로를 피해 문구를 골랐고, “오늘” 질문은 현재 회차 기록을 우선한다. 신의 개입 화면에 “예시:” 칩. - F3 랜딩 BGM — 로그인 버튼 등장(4.2s)에 기존 곡 재생·우상단 토글, 자동재생 거부 시 첫 조작에 재시도. F18 — 기록 패널 “새 단서만” 필터(현재 회차 + 직전 회차 밤 단서).
- 검증 — 백엔드 1033 passed(18:40 재기동), tsc 통과, 헤드리스 10종 전부 통과, 스크린샷 15장. sonnet 리뷰 Critical/Major 없음, Minor 3(음성이
voice_id대신 문장 일치에만 의존 → astra 수정 1회로voice_id우선 재생; ◀▶로 방송 줄을 오갈 때 재생 반복은 기존 동작; 설명 가드는 낱말 겹침 기준). - astra 재구현 비교 — 사용자 요청으로 같은 낮 화면을 gpt-6-astra가 별도 워크트리에서 처음부터 다시 만들었다(16:48~17:16). 화면은 sol과 사실상 동일, 헤드리스 9/10. 사용자 결정으로 폐기하고 이후 프론트 모델만 astra로 바꿨다.
- 모바일 배경 빈 띠 — 랜딩과
/play진입 화면의 A01 배경이 세로 화면에서 위아래에 빈 띠를 남기던 것을fixed inset-0+scale-[1.35]로 PNG 여백을 잘라 덮게 했다. 390x844에서 두 화면 모두 빈 띠 없음, 랜딩 진입 카피 줄바꿈 유지 확인(헤드리스 dev-login·gameplay-clarity·day-screen-vn 통과). - 남은 것 — F15(제외), F11 목표 점수대(결정 대기), 시나리오 확인(충식 문장·MA13 배치·HANDOFF 10번 단서 중복), 테스터10 기록 조치 줄 동기화.
밤 — 배포 뒤 사용자 실플레이 검증 (23:32~00:03, 판 8fc30a72)
프로덕션 조합(Core Sonnet 5 · NPC Haiku 4.5)으로 사용자가 구글 계정으로 직접 플레이. 결론: 좋다(사용자). 5회차 진행 중.
- 점수 — 1회차 35.0 → 2회차 39.4 → 3회차 73.8(통과) → 4회차 69.4(통과). 3·4회차 identity 100.
- 정체를 정답 낱말 없이 맞혔다 — 인정된 문장 하나가 identity-1·2 동시 인정으로 처리됐다. 채점 프롬프트의 동의어 규칙이 의도대로 동작한 사례.
-
체감 지연 — 사용자: “채팅 올라오는 속도가 느려지고 장면 넘어갈 때 사진이 늦게 뜬다. 어쩔 수 없는 부분이고 신경쓰이는 정도는 아니다.” 실측(이 판의 harness 기록, 호출당 평균/최대):
모델 역할 호출 평균 최대 Sonnet 5 planner(장면 조립) 5 10.0s 10.9s Sonnet 5 advisor_answer 4 4.7s 5.7s Sonnet 5 manager_check 13 4.0s 7.0s Sonnet 5 evaluator_verdict 40 3.6s 5.3s Sonnet 5 classifier 27 2.3s 7.0s Haiku 4.5 agent(NPC 답변) 28 2.0s 3.1s 장면 전환이 느린 주범은 planner 10초. NPC 답변은 2초로 빠른 편. 남은 개선 수단은 Sonnet 프롬프트 캐시뿐이고 이는 코드 변경이라 운영 전환 뒤 코드 동결 기간에는 불가 — 사용자에게 알림.
- 긍정 평가(사용자) — 화면 문제 없음. 긴 정리형 질문에 그에 맞는 답변이 돌아온다. 중간 힌트가 늘었고 하루 마무리 힌트가 크게 도움. “단서” 표시가 좋다. 규칙을 원하는 방향으로 정할 수 있다.
밤 — 최종 배포 준비 실행 (22:54~23:15)
사용자가 “최종 배포 준비” 신호를 전달. HANDOFF-26-09-18.md “최종 배포 절차”를 실행했다.
- 프론트 검증 — tsc 통과, 헤드리스 11종 중
npc-followup1건이 결정적으로 실패. 원인은 저녁에 들어간 타이핑 연출: 무의미 입력 대체 문장이 다 찍힌 뒤 1초 안쪽에 입력이 열리는데 테스트가 문장이 보이자마자 단언했다(디버그 실행으로 +0.35s false → +0.85s true 확인). 제품은 정상이라 테스트가 입력 해제를 기다리게 1줄 수정(Codex astra), 2회 연속 통과. 브랜치 푸시 완료.main푸시는 컨트롤러 권한(프로덕션 배포)이 막혀 사용자에게 넘김. - 키·모델 —
.env의 ollama 중복 4줄 제거 → 재기동 → 로컬·터널 health 200, 설정anthropic claude-sonnet-5 | anthropic claude-haiku-4-5 | key set: True. 개발 로그인 스모크 전 구간 200, DB 기록으로 Core=Sonnet 5·NPC=Haiku 4.5 실호출과 폴백 0 확인. - 전환 — 개발 계정이 오늘 72판이라 문서 순서(한도 → 스모크)대로면 스모크가 막히므로 스모크를 먼저 했다. 이후 과잉 사용 방지 허들 적용(한도 동작 확인) → 공개 접근 구성으로 전환.
main배포(23:4x) — 사용자 지시로mainff 푸시(b5441e1 → 7e7411a) → Vercel success. 전환 뒤 재검증: 백엔드 1031 passed, tsc, 헤드리스 10/11(dev-login은 의도된 실패), 공개 API·사이트 점검 기대값.- 남은 것 — 사용자: “최종 배포 완료” 선언. 롤백은 HANDOFF 절차 끝의 한 줄대로.
검증 (커밋 전)
- 백엔드 940 passed(실패 0), import 계약 4 kept, 프론트 타입 검사 0, 헤드리스 9종 전부 통과, 실서버 스모크(로그인→판→회차→다음 장면) 200. 새 원숭이손 소원이 실제 판에서 제안되는 것을 확인했다.
밤 — 오늘 최종 배포 목표로 전환: 남은 결정 일괄, 대사창 재설계 수용, 장부·정본 정리 (18:00~)
사용자 결정으로 공개 운영 전환을 09-20에서 오늘로 당겼다. 운영 전환(한도·배포 설정·모델 조합)은 맨 마지막 한 번에 하기로 하고, 그 전에 결정·수정을 전부 끝내는 순서.
- 결정 6건 — B1 F11 목표 점수대: 확인 신호 반영 후 사람 1판 재측정 뒤 결정. B2 충식 첫 등장: 앞문장만(뒷문장이 준의 기억과 겹쳐 조각이 단서를 먼저 주던 것,
dd7f6d8). B4: 남은 “…” 2곳 문구로, EntryScreen 목표 줄은 안 넣음. B5 비용 후속 5b: 운영 전환 때 한도 복귀로만. B6: main으로 ff 머지(31커밋, Vercel 프로덕션 브랜치 = main 확정). 원숭이손 창작 문구 6곳 그대로 확정, 준 설명 단서 중복(HANDOFF 10번)은 추천안으로. - 장부 동기화 — 테스터7·8·10 조치 줄이 반영분을 반영하지 않아 “미착수 18건”으로 보이던 것을 코드로 재확인해 갱신(
f0a5643). 실제 미착수는 10건. 테스터10 F3은 막혔던 입력 5건 중 4건이 이미 풀려 있었다(test_custom_rule_grammar46 passed로 재현). 테스터9 F25intent점검: 추천 규칙 104건에 추리문 전문이 저장돼 있던 결함이 있었으나cf5a0b7에 이미 수정돼 있었다(5b29173). - 러너
/health의존 제거(HANDOFF 16,1fa49e6) — Stage 4가 이미 쓰던 러너 전용/loop-debug에서 모델 라벨을 읽는다. 공개/health는 그대로{"db":"ok"}. - v9.0 불일치(HANDOFF 14,
094e083) — 4건 중 실제 불일치는 2건(§7.2 조언 권한 규칙 우선 배치 명문화, 원숭이손 스펙 §0 정본 v9.0). 나머지 2건은 이미 맞아 있었다. - 준 손목띠 설명·기억(
9372340) — 기본 설명이 “작은 글자”를 먼저 줘 규칙 “가진 것을 보여준다”를 걸 이유가 없던 문제. 문장만 흐리면 설명 가드가 지식을 자동으로 덧붙여 다시 새므로 지식jun-before-start-band자체를 “구멍 말고 뭔가 더 있는 것 같았다”로 바꿨다. “작은 글자”는 규칙 장면 서술에만. 초안 표시 13곳 → 0. - 리서치 사이트 — 정본 재확인 결과
model_evaluation.md·metrics.yml은 직전 스냅샷 이후 바이트 무변경. 기준 라벨 한 줄만 갱신해 푸시(01b115f). - 프론트 재설계 수용(Cursor 세션) — 낮 화면 대사창을 “한 줄씩 ◀▶”에서 누적 채팅 + 타이핑 연출(글자당 18ms, 줄 사이 220ms, 탭/Space/Enter로 건너뜀,
prefers-reduced-motion이면 즉시)로. 플레이어 질문도 오른쪽 말풍선으로 남고, 인물 초상은 왼쪽 아래 + 초상 너비의 2×2 카드(테스터7 F3 원래 요청과 일치). 장면 그림은 도입 타이핑 동안만 보이고 대화 모드에서 사라지는 것은 사용자 확인으로 의도된 동작. 헤드리스는 Cursor 세션이 2종, Codex(astra)가 컨트롤러 진단대로 6종을 적응: 공통 원인은 새readAll이getByRole로 대사창을 찾는데 원숭이손 팝업이 열리면 낮 화면이inert+aria-hidden이 되어 못 찾던 것(CSS 셀렉터로 교체), 나머지는 누적 로그·타이핑 시점에 맞춘 단언 순서.scene-illustrations만 실제 타이핑 속도로 돌린다. Q03 같은 규칙 줄 그림은 기록 패널 ‘그림 보기’로 확인. - 실수 1건 — 운영 전환을 “지금”으로 잘못 알아듣고
.env한도를 운영용 값으로 낮추고 백엔드를 재기동하다 1분쯤api.remakeday.com502. 즉시 되돌리고 복구(로컬·프로덕션 200). 전환은 맨 마지막에 한 번.
밤 — 테스터12(사용자 본인) 재측정 판과 피드백 9건 반영 (19:06~)
대사창 재설계 + 확인 신호 3종이 들어간 7645286으로 사용자가 직접 1판(로컬 3500 — 프로덕션에서는 개발 로그인을 쓸 수 없어서). 점수 8.8 → 8.8 → 27.5 → 27.5 → 27.5(원인 25 고정, 정체 62.5는 3회차부터, 동기 0), 신의 질문 1회차 4문항(환급 3)·2회차 2문항·3회차 이후 0문항. 테스터10과 같은 궤적 — 확인 신호만으로는 안 풀렸다. 기록 review-verification/2026-09-18-tester12/tester12.md.
- F1 관리자 음성 잘림(
5c78e84) — 타이핑 활성 줄이 바뀔 때 cleanup의stopVoice()가 방송을 끊었다. 방송 줄이 활성화되면 음성이 끝날 때까지 타이핑을 그 줄에서 멈춘다(비주얼노벨 방식). Codex가 탭 동작을 “현재 줄만 완성”으로 바꿔놓은 것은 되돌려 “음성 보류 중이 아니면 남은 줄 전부”(Cursor 세션 동작)로. - F3 창 전체 스크롤(
5c78e84) — 실측: 세 뷰포트 모두 문서가 창보다 정확히 126px 컸다 = 전역 푸터./play에서만 푸터를 숨긴다. - F2 원숭이손 쟁반 모순(
caad070) — 5비트 정적 서술 “쟁반 세 개”와 ① 관찰 “정오에 다 비웠다”. ① 저녁 은상 서술에 “은상의 쟁반은 손도 대지 않은 채다.”를 붙여 세 쟁반 중 하나가 은상 것임을 드러냈다(이상자가 채연→은상으로 바뀌는 설계와 일치). 회차 상태로 쟁반 수를 계산하는 건 운영 전환 후. - F6 밤 기록 파편 중복(
caad070) — 판 기록 306줄/고유 107. 원인:_disclose_scene이execute_scene이 행동 서술을 이어 붙인 beat를 받아 장면 관찰을 합성문으로 저장 → 행동 한 줄들과 겹침. 비트 원문 서술만 저장. - F5 신의 질문 6번(
1e42e78, 사용자 결정) — 아침의 환급 규칙 철회. 한 밤 3회 고정, 대신 같은 밤 2·3번째 질문일수록 공개 사다리를 한 단계씩 더 연다(_open_rungs에 그 밤 질문 수 가산). 환급 전용 테스트 3건 삭제, 신규 2건, 1031 passed. 정본 §7.1 정정 문단. - F8 원숭이손 범위(질문) — 답: 판 전체(v9.0 §7.3). 변경 없음.
- F2 후속 — ① 아침 억제 추가(시나리오 결정) — 사용자 보충: 부조화는 “채연이 먹었는데도 고정 대사가 아픈 채”가 아니라 2일째부터 아침에 또 반을 남기는 반복이었다. ① 효과에 1비트 억제를 더하고 공개 판정에서 공개 비트 앞의 억제를 제외(엔진 3줄). 지속 범위(판 전체)는 정본대로 유지. 1031 passed.
- 21:20 세션 종료, 이후 Cursor 세션 진행 — 결정 마감: 최종 배포 때 새 Anthropic 키를 쓴다. 전환값은 구글 로그인만 허용 + 과잉 사용 방지 허들 적용(이어받기 없음·이탈 경고로 대신). 절차는 HANDOFF-26-09-18 “최종 배포 절차” 1~6. 남은 코드 작업: 프론트 커밋 뒤 EntryScreen “숫자” 한 단어 +
beforeunload이탈 경고 + 헤드리스 10종 + main. 2차 실측·비용은 A.23 §5~7. - F4 신의 질문 안내 멘트 배열·F9 회고 개발 데이터 그래프 — Codex 진행(아래 검증 줄에 결과).
- F7 규칙 문장 전반 어색 — 예시 없이 전반 인상. 기록만, 운영 전환 후 과제.
- F11 목표 점수대 — 사용자 결정: F5 반영 뒤 점수를 보고, 오르면 채점 기준은 안 바꾼다. self-play 1판으로 신호 확인(아래).
- F4·F9 반영(
a7804fb) — 안내 문구를 문장 단위·break-keep으로, 환급 문장 삭제. 회고 개발 데이터 맨 위에 회차별 이해도·최종 칸 점수·규칙 출처 막대. 푸터를 없애자 390px에서 Next dev 배지가 인물 카드를 덮어 헤드리스가 막혀devIndicators: false. - 키 투입·세 축 실측(A.23) — 서버
anthropic claude-sonnet-5 | claude-haiku-4-5 | gemini확인. 채점 캘리브레이션 정답형 100·절반형 54.8·오답형 0(가장 좋은 프로파일, 절반형만 밴드 +4.8), 누설 on 0%/off 50%, self-play 5회차 4.4→8.8→0.0 오류 0, paw Δ −0.8. 러너 실수:--provider anthropic에--model을 안 주면 ollama 모델명으로 404가 나 0점으로 집계돼 metrics에 가짜 2줄 → 되돌리고 가드 추가(4a8519a). self-play는 신의 질문을 안 써서 F11 재료가 못 됨 — F11 미결. - 같은 코드에서 로컬 조합과 나란히(A.23 §5, 20:17) — 로컬 gemma4/kanana vs Sonnet 5/Haiku 4.5. 운영 조합의 이점은 하나에 집중된다: 오답형 무득점(0 vs 14.6) — gemma는 틀린 문장의 동기 칸에 점수를 준다. 정답·절반형은 칸별로 동일(채점기가 아니라 골든·매칭 규칙이 정한 값). 누설은 하네스 on이면 둘 다 0, off면 Haiku가 더 흘린다(50% vs 30%, 운영은 항상 on). self-play는 온라인이 더 빠르다(274s vs 306s, 로컬은 3모델 동주).
- 판당 비용 실측(A.23 §6, 20:25) — self-play 판의 하네스 이벤트 92건 프롬프트·출력을
count_tokens로 세고 정가를 곱해 기록분 $0.46(밤 채점 0.17·관리자 검사 0.14·계획 0.07·NPC 0.04). 하네스에 안 남는 NPC 발화 95건을 더해 테스터12 규모(발화 113·질문 6·밤 5)로 환산하면 판당 약 $0.9~1.2, 09-17 추정 ~$0.8과 같은 자릿수. 캐시 미사용(cache_read0) — NPC 시스템 프롬프트 ~3k tok을 캐시하면 판당 약 $0.6까지 내려가지만 운영 전환 후 과제이므로 안 한다. - 원숭이손 ① 아침 억제 반영 뒤 2차 실측(A.23 §7, 20:42~20:55,
155a15b) — 조합별로 서버를 재기동해 세 축을 다시 쟀다. 그림은 1차와 같다(오답 무득점·누설 on 0·온라인이 빠름). 절반형만 Sonnet이 원인 칸 부분 인정을 한 번 더 줘 54.8→59.2(n=1 변동). 아침 억제는 채점·누설 축과 무관한 시나리오 데이터라 그 축에 변화가 없고, DB 관찰 이벤트에서 2회차 1비트가 “채연은 오늘 쟁반을 옆으로 밀지 않는다”로 남는 것을 확인(e5c911f로 근거를 DB 이벤트로 정정).
밤 — 프론트 마감 커밋(Cursor 세션)과 사용 한도 기본값 조정 (22:35, bc4b672)
21:20 세션 종료 뒤 남겨둔 코드 작업(위 전환값 줄)이 Cursor 세션 커밋으로 들어왔다. 18파일 +655/−91.
- 낮 화면 전환 연출 — 도입 → 대화 전환을 0.55s
cubic-bezier(0.4, 0, 0.2, 1)네 갈래(dayRailIn·dayPortraitSlide·daySceneShrink·dayChatGrow)로 묶었다. 레일 너비는 초상 콘텐츠(17.55rem)에 맞추고 폭 애니메이션은 쓰지 않는다.prefers-reduced-motion이면 네 요소 모두transition: none !important. 초상 교체는 두 장을 겹친 채 opacity만 바꾼다 — 교체 중 빈 프레임이 생기던 것을 막기 위해서다. 채팅 줄에 얼굴 아이콘, 플레이어·관리자 줄에도 타이핑을 붙였다. - 이탈 경고 —
useLeaveWarning(active)16줄. 판 진행 중일 때만beforeunload를 걸고 새로고침·탭 닫기·이탈에 브라우저 기본 확인창을 띄운다. 이어받기를 구현하지 않기로 한 결정의 대체물이다. 최신 브라우저가 커스텀 문구를 무시한다는 점은 주석으로 남겼다. - 과잉 사용 방지 허들 기본값 조정 — 전환값에만 있던 한도를 코드 기본값으로 내리고, 관련 테스트와 문서 표기를 함께 맞췄다.
- 헤드리스 —
leave-warning.cjs신규 86줄(390×900,reducedMotion: 'reduce', 8500 응답 전부 라우트 스텁 — 판 진행 중에는 경고, 진입·회고에서는 없음). 기존 4종(day-screen-vn·gameplay-clarity·npc-followup·scene-illustrations) 단언을 새 연출에 맞춰 조정. 이 커밋이 남긴npc-followup타이밍 회귀는 23:04f3045dd로 따로 고쳤다(위 배포 준비 줄).
밤늦게 — 외부 피드백 6건 접수, 리서치 사이트 첫 화면·Exp 2 재집계, 소개 NPC 문장 (23:23~00:10)
배포가 끝난 뒤 공개 결과물에 대한 비평 6건을 받았다. 대응은 연구 보고서(당시 별도 저장소, 미커밋 — 현재 이 사이트 13장)와 이 저장소의 문서 1건이다. 코드 변경은 없다.
- 리서치 첫 화면 순서 — 홈이 원칙 문구·NOT RUN 나열로 시작하고 게임 링크가 없었다. 맨 위 버튼을 “게임 먼저 해보기 → remakeday.com”으로, S1 그림 아래에 “지금까지 확정한 것” 5줄(372 실행 폴백 0·극성 게이트·라이선스 교체·14판 중 10판 완주·운영 조합)과 “알려진 약점” 3줄(채점 안정성 미입증·재미 미측정·운영 구성 재측정 부족)을 Abstract 앞에 뒀다. 전부 기존 공개 문장의 재배치이고 각 줄이 근거 절로 링크된다. Abstract의 미측정 나열은 “미측정 항목” 절로 내렸다. S1 그림 라벨 01~04가 그림 하단에 붙어 잘려 보이던 여백(-3px → 18px)도 고쳤다.
- Exp 2가 9/16에서 멈춰 있었다 — 사람 관찰 페이지는 스냅샷 스크립트가 없어 손으로 갱신하는데, 9/15 집계(6판·20건)와 9/16 테스터6 사례 뒤로 아무도 안 올렸다. 테스터7~12의
review-verification/판 ID를 DB 읽기 전용 조회로 대조해 사람 판 14판으로 재집계했다: 규칙 60건 중 AI 계열 48(원숭이손 수락 17·추천 31)·직접 작성 12, 원숭이손 수락 17/21, 5회차 완주 10/14. 세션별 14행 표(판·루프·출처·점수 궤적)를 넣고 기존 6판 집계는 병기했다. 테스터7은 “미포함”에서 9/17 완주 판61acc8ef로 정정. 새로 드러난 것: 4→5회차 점수 하락은 단조 잠금 도입(9/14) 전 4판에만 있고 이후 6판은 0건 — 잠금 작동의 증거이지 채점기 안정성 증거가 아니라고 적었다. Limitations에 채점 안정성·재미 미측정 항목 추가. 검증: check_public 0건 · refresh_research_data –check · Jekyll 빌드 · check_site –anchor-baseline(옛 Tester 7 앵커 span으로 보존) · 헤드리스 렌더 1280/400px. - planner maxItems(피드백 6번)는 이미 닫혀 있었다 —
ff8fa05(11:39)cut_to_max_length절단 + 테스트 4건 통과, 서버 기동(23:06)이 그 뒤라 프로덕션에 반영돼 있다. 리뷰어는 A.19 시점 문장을 본 것. 코드 변경 없음. 사이트 약점 3번째 줄을 “절단으로 닫았지만 절단 뒤 외부 API 재측정 없음”으로 고쳤다. - 소개 스크립트 NPC 정책 문장(피드백 4번) — 스크립트 파일이 저장소에 없어 교체 문장만
docs/발표_NPC정책_문장_갱신_2026-09-18.md에 뒀다. 근거 대조 결과 말투(7세)와 규칙의 문자 그대로 실행은 유지, “왜=몰라”·3턴 망각·무조건 전언 수용은 통과 조건에서 빠졌고 당일 기억·출처 구분이 들어왔다. NPC·planner에는 규칙 문장만 넘어가고 이유(shown_reason)는 플레이어 화면에만 남는다는 것을 코드로 확인해, 부작용 근거를 “해석자가 일곱 살이라서”에서 “규칙에 의도가 실리지 않아서 + 원숭이손 숨은 조건”으로 바꿨다. 구→신 문장 6쌍, 소개용 한 문단, Q&A 4줄. - 재기동 보류 — 23:32부터 구글 계정 실사용자 1명이 3회차 진행 중(판
8fc30a72)이라 백엔드를 건드리지 않았다. 재미 게이트·방어선 ⑤는 사용자 지시로 다루지 않는다.