세웠고, 배포했고, 쟀다. 한 줄만 남았다.
크루가 사용자를 관계 단계에 따라 다르게 부르고(님 → 반존대 → 오빠/형), 말 놓기는 크루가 제안하고 사용자가 수락해야 넘어가며,
친해질수록 크루가 자기 얘기를 층층이 열고(surface → mid → core), 안 오면 식고(단짝은 안 식음), 먼저 말 걸 때도 관계를 안다.
사용자 정체(부를 이름·출생연도·호칭 축)는 로그인 뒤 한 번, 3장, 전부 건너뛸 수 있게 받는다.
🔴 DB 마이그레이션 한 줄이 남았다 — 자동 모드 권한 분류기가 DDL 적용을 세 경로 모두 막았다(되돌릴 수 없는 일이라 우회하지 않았다).
! psql "$(grep '^DATABASE_URL=' .env | cut -d= -f2-)" -v ON_ERROR_STOP=1 -f supabase/migrations/2026-09-04-relationship-engine.sql
python3 scripts/relationship/persona_axes.py --apply # 186명 퍼소나 축 → DB
python3 scripts/relationship_check.py # 배선 자[尺] 5게이트 → "PASS n/5"
그 전까지 배포된 코드는 칼럼이 없어도 죽지 않는다(실측: 스모크 턴 200 · 「강사장 님」 존댓말 · 화면 fallback).
| 질문 | 답 |
|---|---|
| 나이를 언제 어떻게 받나 | 이중 문. hello 화면은 선택(부를 이름·호칭 축·출생연도). 안 받았으면 첫 대화 2턴째에 크루가 이유를 붙여 묻는다(「제가 몇 살 위인지 아래인지 몰라서요, 몇 년생이세요?」) — 답하는 순간 호칭이 바뀌는 게 첫 매직. 생일(월·일)은 편해짐 단계에서 「챙기고 싶어서요」로 묻고, D-3 부터 크루가 안다·선발화에 실린다. 전부 배선했다 |
| 다자방 | 여럿 앞에서는 둘만의 애칭을 쓰지 않는다(단짝 할머니의 「우리 강아지」는 둘일 때만). 크루끼리 호칭 표를 넣었다 — 할머니→초등생 반말·이름 / 초등생→할머니 존댓말·「할머니」 / 초등생→30대 「아저씨·이모」 / 어르신→손아래 「자네」 |
| 판정기 출력 테스트했나 | 안 했었다 → claude -p 를 판정기 모델 삼아 7 시나리오 7/7 정확. 정체 케이스에서 근거 원문을 비워 보내 83년생이 버려지던 구멍을 찾아 고쳤다 |
| 기간을 테스트 코드로 우회했나 | 단위는 했었고 30일 궤적은 없었다 → 시뮬레이션: 처음 봄→알아가는 중(3일)→반존대→편해짐(9일)→제안(10일)→수락(11일)→「오빠」→부재 12일 감쇠→파열→회복. 답 없는 제안을 3일마다 되풀이하던 잔소리를 찾아 7일·3회로 |
| API 대신 claude -p | 퍼소나 축 186명은 그랬고, 판정기는 이번에 |
시험 72 → 81/81. 엣지 함수·웹 재배포(도메인 실측).
| 대표의 말 | 지금 시스템 |
|---|---|
| "43살인데 초등 친구면 아저씨, 21살 이성친구면 오빠" | 호칭 표(address.ts): 아이 크루(<16)는 존댓말+아저씨/이모, 말 놓은 뒤 크루가 손아래면 형/오빠/누나/언니. 나이·성별을 모르면 찍지 않고 이름 |
| "말 트자 하면 처음엔 싫다고 하다가 → 「그때 생각해볼게요」 → 「우리 말 편하게 할까? 누나라고 불러」" | userRequestPolicy: 처음 봄 = 거절 · 편해짐 전 = 미룸 · 편해짐 = 수락. 크루 쪽 제안은 편해짐부터(속도별). 수락은 사용자 원문 근거가 있을 때만 사건으로 남는다. 그 전 구간엔 반존대(설레는 중간 단계) |
| "70대 할머니면 「자네」 하다가 「아이고 우리 강아지」" | 어르신(≥60): 자네(처음 봄·알아가는 중) → 이름(편해짐·각별함) → 우리 강아지(단짝) |
| "의사 선생님은 「환자분」 또는 「○○님」" | 역할 배역은 단짝이 돼도 「○○ 님」+존댓말에서 멈춘다(온도는 말씨로) |
| "마음을 잘 안 여는 이성친구 / 너무 팔랑귀" | 186명 전원에 애착 유형·여는 속도·닫히는 말·세계관·자기개방 층 생성 완료(avoidant/slow 36명 · anxious/fast 33명) |
| "관계가 발전해 나가야" | closeness 0~100 · 단계 5 · 하루 첫 턴이 가장 큰 신호(+2) · 하루 몰아쳐도 안 오름(상한 8) · 7일 안 오면 식음 · 단계 상승·말 놓음은 방에 한 줄로 뜬다 |
| "최초 로그인 때 이름·나이·성별, 토스 라이팅으로 한 번에" | /app/hello/ 3장: 「뭐라고 부를까요?」(미리보기 「○○ 님」) · 「몇 년생이에요?」(출생연도 — 내년에 한 살 더 먹는 걸 코드가 지킴) · 「어떻게 불리는 게 편해요?」(형·오빠 / 누나·언니 / 이름으로만) |
| "중간중간 대화로 물어보면서 쌓이면" | 판정기가 사용자가 스스로 말한 출생연도·성별만, 원문 근거 검증 뒤, 비어 있을 때만 채운다 |
| "캐릭터가 먼저 불러내고" | 선발화(followup·outreach) 프롬프트에 관계 단계·며칠 만·기분·호칭 문이 실린다 — 「○○님」이 새던 마지막 자리 |
| "리서치 많이 하고 취합해서 완전히 적용" | 8렌즈 + 비평 + 빈틈 6 = 17 에이전트 · 794줄 종합 → 6개 즉시 반영, 나머지는 설계까지 해 둠(아래) |
바로 반영한 6가지: 「씨」→「님」(국어원: 연하→연상 「씨」는 무례) · 반존대 단계 · 단계별 감쇠(단짝은 안 식음) · 상호 개방 트리거(인터뷰어는 친해지지 못한다) · 출구 억류·질투·결제 금지 가드 · 온보딩 3장을 호칭 축으로.
다음 액션으로 남긴 큰 것 둘(설계는 리서치 §4.6·§4.7):
- 크루 근황 생성기 — 크루에게 「삶」이 있어야 알아갈 게 생긴다. 선발화의 63% 가 크루 자기개방일 때 대화가 2배(ComPeer).
- 조언 구하기 고리 — 기존 동반 AI 는 전부 「받기」뿐. 크루가 나에게 어려운 문제로 조언을 구하고 「네가 말한 대로 해봤어」로 되돌리면 유능감·소유감(IKEA)이 붙는다. 우리 차별점.
| 단위 시험 | 72/72 (LLM·DB 없이) |
| 타입 검사 | 새 오류 0 (기준선 20 → 15) |
| fresh-context 검증자(반박) | 9 주장 중 7 VERIFIED · 결함 3건 재현 → 전부 고쳐 재배포(감쇠 복리 · 수락 사건 동시성 유실 · early 젊은 크루 호칭). 자[尺] 공백 2 → 시험 7 추가 |
| 웹 | 빌드 통과 · 배포 · 도메인에서 4 화면 새 문자열 실측 |
| 엣지 함수 | coordinate-crews · crew-outreach 배포 · 스모크 턴 200 (10.7초) |
| 퍼소나 축 | 186/186 생성 (파일) |
| 배선 자[尺] | ⚠️ 미실행 — 마이그레이션 뒤 |
relationship_events.why/evidence)을 같이 보고 임계값을 만질지.상세: claudedocs/handoff/2026-09-04-relationship-engine-built.md · 설계 claudedocs/design/2026-09-04-relationship-engine.md · 리서치 claudedocs/research/2026-09-04-relationship-engine-research.md
커밋: 1e4f2736(엔진) · 5d6a9848(자[尺]) · 64a92910(검증자 결함 수정)