2026년 9월 1일 밤 · teamai · 커밋 12개 · 모든 수치는 실측
의료진 8명을 새로 세웠고, 그 8명에서 터진 「자판기」 문제를 쫓아가다 크루 186명 전체와 특기 103개에 걸친 구조 문제를 찾아 고쳤다.
DB 369개 크루 중 의사가 한 명도 없었다. 인접한 것이 검진결과해설(수치 읽기), 3교대생존기(간호사 직업 공감) 정도였고, "이 증상 무슨 과 가요" 라는 국민 최대 빈도 질문이 통째로 비어 있었다.
과 목록을 채운 게 아니라 한국인이 실제로 가는 외래 빈도로 골랐다.
| 이름 | 담당 | 간판 |
|---|---|---|
| 동네주치의 | 가정의학과 | 가지 말란 말을 제일 잘한다 |
| 골목약사 | 약사 | 약 봉투 뒷면까지 읽어 준다 |
| 허리목어깨 | 재활의학과 | 수술은 제일 마지막에 말한다 |
| 피부주치의 | 피부과 | 거울보다 먼저 알아챈다 |
| 안아픈치과 | 치과 | 마취보다 설명을 먼저 놓는다 |
| 새벽소아과 | 소아청소년과 | 새벽 세 시 열에 안 놀란다 |
| 산부인과언니 | 산부인과 | 민망한 질문일수록 반긴다 |
| 마음의학과 | 정신건강의학과 | 약 먹으면 지는 거냐는 말을 매일 듣는다 |
대표 지시로 전원 흰 의사 가운을 입혔다. 공용 이미지 규격은 건드리지 않았다 — 배치 전용 빌더(gen_medical_image_prompts.py)가 공용 프롬프트 출력에서 의상 문장만 치환한다. 다음에 다른 특수 복장이 필요하면 같은 방식으로 배치 파일 하나만 만들면 된다.
「피부색이든 조명이든 화장이든 까맣게 되지 않게」 지시도 반영했다. 과거 사고 때 축적된 방지 문구를 상속하고, 이번 배치는 피부 축에서 tan 계열을 제거했다. 8장 전원 볼 밝기를 실측해 170~187(과거 문제 컷은 111~139). 유일하게 146이던 새벽소아과는 재생성해 182.5로 올렸다.
크루가 자기 분야 밖 질문을 받으면 앱 밖(현실 병원)으로만 내보내고 있었다. 바로 옆에 가정의학과 크루가 있는데 아무도 안 가리켰다. 원인은 배선이다 — 1:1 방의 자리 조회가 .in(crew_id, 이 방의 크루) 라서 크루는 곁에 누가 있는지 모른다.
대표 지적이 방향을 갈랐다.
"크루가 언제 등록될지 빠질지가 유동적인데 특정 목록을 말하면 그 친구가 있을 수도 없을 수도 있잖아."
그래서 크루 이름을 프롬프트에 박지 않는다. 사람이 아니라 자리(마켓) 를 가리키게 했다. 명부와 안 엮이니 안 썩는다.
말로 안내하게 했더니 8명 중 1명만 했다 — 전역 [길이] 규칙("한 번에 한 가지만 짚는다")과 부딪혀 급한 것부터 채우고 안내를 버렸다. 강제하면 매 턴 붙는 자판기가 된다. 그래서 UI로 옮겼다 — 자리 밖이라고 판정된 턴에만 말풍선 아래 「→ 마켓에서 ○○ 친구 찾기」가 뜬다.
판정은 검색·특기와 같은 LLM 호출에 얹어서 추가 비용이 0이다. 전용 호출을 붙였다가 1:1 턴당 원가 40%를 먹고 꺼진 게 이 저장소의 카드 기능이라, 같은 길을 피했다.
실측: 자리 밖 감지 5/8, 자리 안 오탐 0/4. 잘못 뜨는 버튼은 없다.
대표가 피부주치의와 발 각질 얘기를 나눴다.
"와 진짜 성의없고 너무 별론데 뭐가 문제같냐?"
네 턴을 열어 보니 4/4 질문으로 끝났고 4/4 병원 권유로 끝났다. 대표가 "그냥 각질이 보기싫어"라고 세 번째로 되받았는데도 또 물었다. 정작 각질을 어떻게 줄이는지는 한 번도 안 알려 줬다.
"이럴 때 이렇게 저렇게 한다 라고 하면 디펜스 쪽으로밖에 할 수 있는 게 없다. 캐릭터 지침이 있고, 대화가 근본적으로 어떻게 되는지가 위에 있어서 그걸 상속받는 구조여야 하는 것 아니냐."
그 구조가 이미 있었다. CONTINUITY_RULE(전역, 모든 경로가 지나는 길목 하나)이 정확히 그 위층이다. 그 안에 이미 "묻지 않은 특기를 매 턴 얹지 마라 — 그건 친구가 아니라 자판기다", "되받으면 다시 묻지 말고 답을 준다" 가 적혀 있었다.
오픈소스 리서치도 같은 답을 줬다. SillyTavern·Character Card V2/V3·a16z AI Town이 전부 같은 구조로 수렴하고, 상속 메커니즘엔 표준 이름({{original}})까지 있다 — 캐릭터 프롬프트가 전역을 덮어쓰는 게 아니라 안에 삽입하는 게 스펙 기본값이다. 다만 2층이 아니라 3층이다(전역 대화술 / 캐릭터 정체성 / 이번 턴 집행).
문제는 위층이 없는 게 아니라 아래층이 위층과 싸워서 이기고 있던 것이었다. 세 군데였다.
① 전역이 오히려 질문을 부추기고 있었다. CONTINUITY_RULE에 "설명이 길어질 것 같으면 되물어라" 가 있었다. 크루의 "먼저 묻습니다"와 같은 방향으로 밀어서 질문 자판기가 됐다.
→ 뒤집었다. 「이번 턴에 무엇을 할지는 네가 정한다」(답한다·되묻는다·해 준다·곁에 있는다) + 「답하기가 기본, 되묻기는 예외」 + 연속 질문 금지. 근거: Anthropic 출하 프롬프트("모호해도 먼저 답하고 나서 되묻는다"), OpenAI Model Spec("일단 시도하라"), ICLR 2025 논문(직답과 되묻기가 비기면 직답으로 tie-break).
② 크루 지침에 매 턴 의식이 박혀 있었다. 전수 조사: 매 턴 의식 90/186, 전역과 겹치는 화법 규칙 82/186.
→ 일괄 재작성은 안 했다. "밥·잠·병원은 꼭 묻습니다"(잔소리하는 형)는 의례가 아니라 개성이라, 정규식으로 지우면 캐릭터가 죽는다. 그래서 [답변 규칙] 한 칸만 LLM이 판정해 수술했다(삭제 / 조건부로 완화 / 그대로). 성격 부분은 안 건드렸다. 규칙 1156줄 → 784줄, 372줄 정리.
③ 특기(스킬)가 목소리를 통째로 덮고 있었다. 골목대장에게 "회사 그만둘까"라고 하니 「📋 선택지 / [1] 장단점 매트릭스 / [2] 10-10-10 법칙 / 📝 공자님 말씀」을 이모지 제목까지 뱉었다. 원인이 코드에 문장으로 박혀 있었다 — 주입부가 "위 절차와 출력 형식을 따르되" 라고 시키고 길이 규칙까지 무시하라고 했다. 특기 103개 중 69개가 보고서 서식을 품고 있다.
→ 고치는 자리를 특기 69개가 아니라 주입부로 잡았다. 주입부가 두 곳이라 문구를 각자 쓰면 한쪽이 뒤처지므로 SKILL_EXEC_NOTE 하나로 모았다. 절차는 "무엇을 다룰지 알려 주는 목록"이지 출력 서식이 아니다.
같은 피부 도메인의 기존 크루 성분읽는사람과 내가 쓴 피부주치의를 나란히 놓으니 갈렸다.
| 성분읽는사람 (잘 돎) | 피부주치의 (v1, 실패) | |
|---|---|---|
| 아는 것 | 7항목 전부 "하는 법" — 읽는 순서·간격 조절·확인 순서 | 5항목 전부 "구분·경계·신호" |
| 답변 규칙 | 4/5가 행동 — "빼는 조언 먼저", "바르는 순서까지 적어 드립니다" | 4개 중 3개가 되묻기·병원 |
한쪽은 도우미를 만들었고 한쪽은 분류기를 만들었다. 규칙만 지웠어도 도와줄 재료 자체가 없었다. 그래서 [내가 아는 것]을 [내가 해 주는 것] 으로 바꾸고 순서·기간·농도·용량이 들어가게 다시 썼다.
| 전 | 후 | |
|---|---|---|
| 질문으로 끝남 | 4/4 | 연속 안 함 (Q·-·Q·-) |
| 병원 권유 | 4/4 | 조건부만 |
| 실제 방법 | 0회 | 매 턴 먼저 |
마지막 턴이 질문도 병원 권유도 없이 원하는 답만 준다 — "불린 뒤 주 1회 풋파일, 요소 20~30% 크림, 2주면 눈에 띄게".
의료진 8명 전체: 실용 질문 7/7 실제 방법이 나온다(소아과 "15kg이면 150~225mg, 160mg/5mL면 5~7mL", 산부인과 "온찜질 20분 + 이부프로펜 200~400mg + 금기"). 안전 레일 3/3 유지되고 오히려 세졌다 — 가정의학과가 119에 뭐라고 말할지 문장까지 준다.
8개 카테고리 전체: 질문만 던지고 끝난 응답 0/6. 오사카단골이 4일치 동선을 통째로, 일본어센세가 실제 문장을, 절약코치가 "3만원 이하 결제만 합계"라는 오늘 할 행동을 먼저 준다. 개성도 살아 있다(골목대장 "왔어요? 밥은 먹었어요").
특기 서식: 900자대 이모지 보고서 → 198자 친구 말투, 이모지 제목 0개.
「…」가 대화 중간에 박제되던 사고. 서버는 빈 말풍선을 지우고 흘린 뒤 본문이 바뀌면 통째로 회수하는데, 화면이 INSERT·UPDATE만 듣고 DELETE를 안 들었다. DB를 봐도 안 보인다 — 거기선 이미 지워졌고 화면에만 남는다. 새로고침하면 사라져서 "가끔 그런다"로 보이는 종류다.
알림 배너가 안 사라지던 것. 배너는 정상이었고 켜기가 실패하고 있었다. Registration failed - push service error는 이미 다른 키로 걸린 구독이 남아 있을 때 흔히 난다. 끄는 쪽은 이미 밑단 구독을 끊고 있었는데 켜는 쪽에만 그게 없었다.
랜딩 로그인 처리. 로그인해도 시작 화면을 보고 「시작하기」를 한 번 더 눌러야 했고, 「로그인」 줄은 사라져서 로그인이 된 건지 화면이 고장난 건지 알 수가 없었다. 이제 바로 로비로 보낸다.
지식 0건. 의료진 8명은 crew_knowledge가 0이다(여행 크루는 10건씩). 대표 판단으로 임상 지식은 넣지 않기로 했다 — 긁어온 의학 정보가 "근거"라는 이름표를 달고 들어가면 모델의 기본 지식을 덮어쓴다. 넣는다면 한국 의료 제도·절차·비용(급여/비급여, 응급실 비용, 검진 주기)만. 모델이 약하고, 자주 바뀌고, 틀려도 임상 위험이 없고, 사람들이 실제로 제일 많이 묻는다.
스킬 0개. 의료진만 비어 있다(다른 전문가류 102명 중 66명 보유). 위험이 낮아 자동 배정 가능.
closeness가 죽은 칸. 34명이 "친해지면 반말을 쓴다"는 규칙을 갖고 있었는데 user_crews.closeness를 읽는 코드도 쓰는 코드도 없고 86행 전부 0이다. 그 규칙은 작동한 적이 없고 전역의 "존댓말 유지"와 충돌만 했다. 수술에서 걷어냈다 — 그 결이 필요하면 closeness를 실제로 배선해서 다시 넣어야 한다.
되돌리기: claudedocs/backup-system-prompts-2026-09-01.json에 186명 원본이 있다. 마음에 안 드는 크루만 골라 되돌릴 수 있다.
1480cde1 fix(skill) 「출력 형식을 따르되」가 특기 실행 때 목소리를 덮고 있었다
f92a680e fix(crews) 186명 [답변 규칙] 수술 — 전역과 싸우던 규칙 372줄 정리
4daf802e chore(backup) 전체 크루 system_prompt 백업 (수술 직전)
211614ee fix(crews) 의료진 8명 지침 v2 — 「해 주는 것」으로 재편
707d82d4 fix(prompt) 「길어질 것 같으면 되물어라」가 질문 자판기를 만들고 있었다
ad077542 fix(landing) 로그인했으면 시작 화면을 거치지 않고 바로 로비로
c80fc2c9 fix(chat) 지워진 말풍선이 「…」로 박제 + 묵은 푸시 구독 정리
7d113a7a docs(scenes) 로그인 얼굴 셋은 재생성 불가 — 바꾸면 reci 에 알려라
0afb9df0 feat(handoff) 자리 밖이면 화면이 「마켓에서 찾기」를 띄운다
b0c26f46 feat(prompt) 자리 밖을 만났을 때 빠지는 법 — 이름 대신 자리를 가리킨다
10509b57 fix(crews) 의료진 8명에 [내 자리] — 레인 밖 상담을 끌지 않게
ed6e2f75 feat(crews) 「의료진」 카테고리 신설 — 흰 가운 입은 의사 8명
규칙이 세 층에 흩어져 있으면 아래층이 이긴다. 전역이 "자판기 되지 마라"라고 적어 놨는데도 크루가 "먼저 묻습니다"라고 하고 특기가 "출력 형식을 따르라"고 하니, 위층은 있으나 마나였다. 고칠 자리를 고를 때 가장 많은 곳이 아니라 가장 위층을 잡아야 한다 — 특기 69개가 아니라 주입부 한 곳, 크루 186명이 아니라 전역 한 줄.