0. 한눈에 — 매일 일어나는 일
app/api/cron/coach/route.ts 가 활성 아이마다:① 신호 수집 — meal_logs(끼니·식재료·수용도·환경)·daily_questions(어제 답) 읽어 잘먹는음식·결핍군·선호상태 산출
② 주간 닻(일요일만) —
runWeeklyPlanning(Sonnet LLM)이 이번주 mission_target·레버·goals·소견 → enrichWeeklyPlan(결정론)이 7일치 구체 dish 슬롯·거울 스케줄 구움(weekly_plans.plan_detail)③ 커리큘럼 진척 —
advanceProgress가 오늘 유닛 결정(deepen/advance/pivot/celebrate)④ 일간 두뇌 —
pickActionByBrain이 오늘 시나리오·레버·음식추천여부(useFood) 결정⑤ 작문 —
composeLetter가 위 전부를 프롬프트로 묶어 DeepSeek(intro만 Sonnet)로 편지 생성 → 안전·유사도·must-weave 가드로 재생성⑥ 오늘의 질문 — focus 유닛의 신호 프로브를 던져(P0-D) 답이 다음날 진척 신호로 흐르게
1. 모듈별 정확한 동작
① 신호 수집 + 선호계량화 출고
lib/preferenceQuantification.ts — 수용도를 식재료별 상태(liked/exploring/unknown/disliked)·Wilson 하한·집필터로 정량화. 핵심: 미상(null)을 liked로 오판 차단 — 명시 완식(acceptance_level≥3 또는 ate_well=true)이 ≥2회+Wilson 통과만 'liked'.
- 입력:
meal_logs.acceptance_level(수용 5단계 0거부~4완식, care UX) 우선, 없으면ate_well폴백. - 소비(route.ts):
confidentLiked→콜드스타트 게이트,targetAccepts=acceptanceLevel≥1(미상 배제)→스톨 감지,dislikedIng→추천 제외. - 콜드스타트(
coachRecos.coldStartSeed): 확신 liked<2면 Tier2(자주 차려진)→Tier3(youa 급식 고빈도)로 추천 앵커 보강.
② 커리큘럼 상태기계 출고
lib/curriculumUnits.ts(12유닛 선언=명세)·lib/curriculum.ts(advanceProgress 순수함수). 각 유닛이 steps[].passWhen(evidence)로 졸업, extract가 meal_logs+프로브답에서 신호 산출.
- 진척: passWhen 7일 연속 충족(holdWeeks)→step++. 최종 단→maintenance→1주 무코칭 유지→mastered.
- 피벗: 정체(stalled/limping)면 standby 유닛으로 전환. hardStallDays:18 — 18일 코칭했는데 진전0이면 주1회 캡 무시 강제 전환,
fallbackPivot이 standby 비어도 CORE_ORDER에서 음식 트랙으로. - 온보딩:
ONBOARDING_ARC(1신뢰·2관찰·3확장 주)·CORE_ORDER에 확장 트랙 4종(minWeek3).
③ 주간계획 — LLM 종합 + 결정론 enrich 출고
일요일에만. runWeeklyPlanning(Sonnet)=mission_target·budget(레버)·goals·impression(코치 내부 소견) 산출. enrichWeeklyPlan(coachWeekly·LLM0)=7일치 plan_detail: 구체 dish 슬롯 회전(supply 결핍보급 2 : challenge 잘먹는음식 사촌 1)·BMI/탄단지 macro·거울 스케줄.
- 슬롯
PlanSlot: ingredient·dishes·group·track(supply/challenge)·pairLiked·reason·weeklyEstFreq(어드민 근거). - 일간 소비
pickPlanSlot: 그날 슬롯 1개 선택(유연성 가드: 더는 결핍 아니면 다음 슬롯).
④⑤ 일간 두뇌 + 작문(F-18 슬롯본문봉합) 부분
pickActionByBrain이 오늘 시나리오(예 nutrient-gap·mealtime-atmosphere)·useFood(음식추천 여부)를 정함. composeLetter가 프롬프트 조립:
- F-18: 슬롯 음식(slotDish)을 본문 must-weave 블록+linter 재생성으로 강제. part(b) 사촌(감자→두부) 억제. 거울 음식=항상 슬롯 음식(deficitDishFor 두부 디폴트 제거).
- 카테고리 정합: challenge 슬롯이면 "감자 잘 먹으니 비슷한 단호박부터"(부족 프레이밍 금지), supply면 부족군 채움.
- 급식 근거:
youaRankOf→"또래 급식에 자주 나오는 재료(상위 N%)"를 안심 톤으로. - 가드: 결정론 안전(괴식·없는증상)·어휘 유사도·영양거울/슬롯/성장 must-weave 재생성.
⑥ P0-D 환경신호 다리 출고(다리만)
pickUnitProbe(coachDaily) — ICFQ 아닌 날 오늘 focus 유닛의 신호 프로브를 결정론 질문으로 던지고 daily_questions.context.unitProbe에 키 박음. 부모가 답하면 parseProbeAnswers→advanceProgress→유닛 extract로 흘러 envTablePct 등 표본 축적. 유닛 내 2프로브 일별 회전.
⚠️ 다리만 깔림 — 실제 진척은 부모가 답을 줘야 발생. 아린(시뮬)은 양성신호 0이라 envTablePct가 null→실수로만 바뀌고 0.4 미달.
2. 문제 — 랄프위검 천장 (연속성 52→48→44 하락)
핵심 통찰: 인프라(선호계량화·신호 다리·피벗·카테고리 정합)는 깔렸으나, 아린 시뮬은 양성신호 0이라 letters가 본질적으로 정체를 비춘다. 최근 라운드의 통독 품질 패치(변주·lever정합·일째단조)는 같은 정체를 더 또렷이 노출해 점수가 오히려 내려갔다. 분류: 실데이터 대기 코드 버그 다른 세션(coachRecos)
#1 슬롯-본문 음식 이혼 버그(부분봉합)
비-콩류 슬롯(치즈·메추리알 challenge) 날 메타는 슬롯 음식인데 본문은 두부로 회귀 → 메타-본문 이중장부.
근본(실측 06-16): brain.useFood=false(음식 쉬는 날)인데 최종 시나리오=home-daycare-gap(콩류 채우라는 음식 시나리오)로 모순. useFood=false라 slotFood=null이 돼 슬롯 강제가 풀리고, 시나리오 promptHint(coachScenarios.ts:116 "집에서 비는 식품군 1개에 행동을 두라")의 콩류→두부가 이김.
이번 봉합(route.ts:853): 음식-제안 시나리오(home-daycare-gap/nutrient-gap/repeat-menu)는 어차피 음식을 권하므로 _noFood를 끄고 슬롯 음식 강제. 남은 근본: brain.useFood ↔ 최종 scenario ↔ curriculum unit 3자가 독립 결정돼 모순 가능(별도 EPIC — brain이 useFood=false면 시나리오도 환경이어야).
#2 step 24일 1단 고착 — 전진 0 실데이터 대기
커리큘럼이 피벗(table↔exposure)은 하나 step 1단→2단 전진이 24일 0회. '다음:' 목표 문구가 글자까지 불변.
근본: passWhen 졸업 게이트가 아린 양성신호 0개(완식·환경 신호 미입력)로 영영 미충족. P0-D 다리는 깔렸으나 부모가 실제로 답·기록을 줘야 envTablePct가 임계(0.4)를 넘어 졸업. 코드 문제 아님 — 실데이터 필요. 일째단조 수술(전역 캠페인일)이 정체를 더 또렷이 보이게 함(숫자↑·단계 불변).
#3 두부 단일 디폴트 과포화 coachRecos·다른 세션
슬롯이 검은콩·메추리알·치즈·단호박으로 회전해도 본문 추천은 두부·달걀 2종에 46% 쏠림. '미역국+두부' 동일 문장 반복.
근본: 콜드스타트 시드(coachRecos.coldStartSeed)가 확신 liked 0개라 Tier2(자주 차려진=두부·달걀)에 수렴, Tier3 youa 큐레이션이 실추천으로 안 빠짐. 추천 풀 후보가 콩류 deficit→두부로 좁음. coachRecos는 현재 다른 세션이 개발 중(메뉴 정제·괴식 필터) — 충돌 회피로 미관여.
#4 7일 주기 무브/피벗 복붙 실데이터 대기일부
table↔exposure 교대가 진척이 아니라 같은 트랙 두 바퀴. 06-11≈06-18 무브·추천·피벗문구 완전 동일.
근본: 환경 무브풀 작고(7종으로 확장했으나) table-stage가 정체라 7일 주기로 같은 순열 재진입. 근본은 #2(정체)이고, 정체가 풀리면(실데이터) 자연 해소. 안티반복 윈도를 7일+로 넓히면 부분 완화 가능(코드).
#5 급식 안심·영양거울 후렴구 과다(17/24통) 구조
"어린이집 덕에 전체 영양 채워지고…"가 17통에 박힘. 변주 수술이 어절만 흔들고 출현빈도 자체는 안 줄임.
근본: 영양거울이 매일 무조건 1줄 삽입되는 구조(쿨다운/생략 게이트가 결핍줄 출현빈도엔 미적용). LLM 자체 기본 클로징 습관도 가세. 해결: 거울 결핍줄에 '최근 N일 출현이력 쿨다운'(생략 게이트)을 걸어 매일 출력을 막아야 — 변주가 아니라 빈도 감소.
#6 도입 훅 "부모님," 수렴(17/24) 코드
편지 첫 문장이 "부모님," 호명으로 수렴(후반 8/9). 도입 소재가 매일 달라야 하는데 한 종류로.
근본: 편지 빌더에 도입 훅 회전 풀이 없음(시간대·소재·질문형 회전). 해결: 도입 hook 선택기를 daySeed·소재로 회전(프로브회전을 첫문장에 연결 가능).
#7 macro(BMI/탄단지) 트랙 dead — 24통 0회 실데이터+배선
이사님 5조건 중 'BMI보고 저체중이면 고기류↑'가 본문에 한 번도 안 나옴. enrichWeeklyPlan의 macro 트랙이 plan_detail엔 있으나 일일 편지 본문 산출 경로에 미배선 + 아린 성장데이터(키·몸무게) 부재로 게이트 영영 false(profileNudge도 미도달=input starvation).
3. 무엇이 준비됐고 무엇이 대기인가
| 영역 | 상태 | 다음 |
|---|---|---|
| 선호계량화 캡처→정량화 | ✅ end-to-end 라이브 | 실데이터 유입 대기 |
| P0-D 환경신호 다리 | ✅ 다리 라이브 | 부모 답 유입 시 졸업 작동 |
| 커리큘럼 피벗·온보딩 | ✅ 라이브 | 전진은 #2(실데이터) |
| F-18 슬롯본문봉합 | 🟡 부분(#1 봉합) | brain↔scenario↔unit 정합 EPIC |
| 추천 풀 다양성 | 🟣 coachRecos(다른 세션) | Tier3 youa 큐레이션 배선 |
| 거울/도입 후렴구 빈도 | 🔴 미해결(#5·#6) | 출현이력 쿨다운·도입 훅 회전 |
| macro 트랙 | 🔴 dead(#7) | 성장데이터 nudge + 본문 배선 |
⭐ 전략적 결론: 아린(양성신호 0) 시뮬 폴리싱은 바닥에 도달 — 더 패치하면 정체를 더 또렷이 비출 뿐(점수 역효과). 진짜 개선은 실제 부모가 5단계 수용·환경 신호를 줄 때 인프라가 작동하며 나온다. 코드로 더 잡을 것: #1 잔여(정합 EPIC)·#5(거울 빈도 쿨다운)·#6(도입 훅 회전)·#7(macro 배선). #3은 coachRecos(다른 세션).