한눈에 — 입력 → 가공 → 산출 → 배포 → 크론 소비
스킬은 읽기 전용으로 DB·소스를 보고, 코드와 정적 JSON만 고쳐 커밋한다. DB에는 한 줄도 쓰지 않는다. 실제로 DB 튜플이 바뀌는 건 한참 뒤 — 배포된 코드를 매일 새벽 2시 크론이 실행하면서 자동으로 분해·적재할 때뿐이다.
스킬의 목적 — 크론은 '적용', 스킬은 '개선'
메뉴→식재료 매핑 사전·식재료 도감·궁합 매트릭스는 전부 빌드에 박히는 정적 자산이다. 매일 도는 크론은 이 자산을 쓰기만 할 뿐 바꾸지 못한다(정적 import라 커밋+재배포가 필요하고, "이게 진짜 재료냐 오탐이냐 / 이 새 식재료가 영유아한테 안전하냐" 같은 사람 판단이 들어가야 한다). 그 자산 자체를 주기적으로 다듬어 정확도·범위를 올리는 게 이 스킬이다.
🌙 2시 크론
- 이미 만든 사전·규칙대로 새 메뉴를 분해 →
learned_menus백필 - 그 결과로 코칭 편지·질문·주간계획 작성
- 런타임 데이터(DB)만 다룬다 — 사전 자체는 못 고침
- 비유: 레시피북대로 매일 요리하는 요리사
⚙️ 이 스킬
- 그 사전·규칙·도감 자체를 더 똑똑하게 고쳐 쓴다
- 빌드 산출물(정적 JSON)·코드를 재생성·개선
- DB는 읽기 전용 — 커밋만 하고 끝
- 비유: 가끔 와서 레시피북을 고치는 편집자
주요 기능 — A0 → A → B → C
매 호출은 증분 정독(A0)으로 시작해, 매핑 사전(A) → 매트릭스(B) → 도감(C) 순으로 필요한 만큼만 손본다.
MENU_MAP, 표기변형 → LEXICON, 양념·물 → EXCLUDE. 오타·1회성은 사전화 금지(LLM 폴백에 맡김). 회귀검증 코퍼스 100% 유지.food-graph)·통계(corpus-stats)를 다시 생성. 미달이면 "재생성 불필요"로 솔직히 스킵.무엇을 읽고, 어떻게 가공하고, 어디에 저장하나
스킬의 DB 발자국은 읽기 전용 3테이블이 전부다. 가공 결과는 코드 2파일 + 정적 JSON 10종으로만 저장되며, DB INSERT/UPDATE/DELETE는 0건이다.
learned_menus(DB) — 신규 유입 메뉴 증분 감지(menu, created_at만). ※ 스킬은 절대 쓰지 않음 — 쓰는 건 크론.meal_logs(DB) — 부모가 입력한 끼니의menus, ingredients를 보고 매핑 튜닝 후보 산출user_menu_overrides(DB) — 부모가 고친 메뉴→식재료를 현재 전역 매핑과 대조(교정 충돌 = 전역 반영 후보)- 레시피·표준식단 소스 — young-recipes 90종, 농진청 성분, dietary4u 영유아 식단, NEIS 식판(권위 정답지)
- 기존 정적 JSON — 도감 풀·food-graph·매트릭스를 읽어 갭·동시출현 산출
💻 코드 사전 2
menuMapCore.ts—MENU_MAP·EXCLUDE·boostFromName·meatFixlexicon.ts— 표기변형LEXICON
🗂️ 정적 JSON 10
menu-dict.json0차 사전 ·food-graph.json궁합/사촌 ·kit-dish-matrix.jsoningredients-light.json+enriched 도감 ·must-eat·season·cooking-amounts·corpus-statsfoodmap-checkpoint.json증분 기준선
learned_menus를 백필하고 편지를 쓸 때이고, 그것도 크론이 자기 일로 자동 WRITE하는 것이지 스킬이 손대는 게 아니다. 과거 튜플을 소급해 다시 쓰지도 않는다(크론은 새 메뉴만).결정론 매핑 파이프라인 — 정적 JSON과 코드가 LLM 앞을 막는다
메뉴 한 줄이 식재료로 분해되는 순서. 0~2차가 다 결정론(정적 JSON + 코드 사전)이라 대부분의 메뉴는 LLM 없이 즉시 풀린다. 0~2차가 전부 실패할 때만 3차 LLM이 마지막 수단으로 돈다 — 그 결과는 learned_menus에 적재돼 다음엔 무료 사전 히트가 된다.
wb() 래퍼). 그래서 카레 템플릿이 [감자,당근,양파]여도 메뉴명에 "닭살"이 있으면 닭고기가 붙고, 돼지감자·새우젓 같은 오탐은 가드 정규식이 막는다.왜 테이블이 아니라 정적 JSON인가
핵심은 레퍼런스와 상태의 분리다. 매핑 사전·도감·매트릭스는 좀처럼 안 바뀌고, 빌드타임·클라에서 0ms로 읽혀야 하고, 바뀔 때 리뷰·롤백돼야 하는 레퍼런스다 → 정적 JSON. 반대로 사용자마다 매초 바뀌는 건 전부 DB 테이블이다.
🗂️ 좀처럼 안 바뀜
- 매핑 사전 · 도감 · 궁합 그래프 · 매트릭스
- 이 스킬이 가끔 갱신하는 빌드 산출물
- 빌드타임/엣지/클라 0ms 동기 읽기
- git diff로 리뷰 · 원자 배포 · revert 롤백
📒 매초 바뀜
meal_logs끼니 기록 ·learned_menus학습user_menu_overrides·coach_letters· …- 사용자·날짜마다 변동 · RLS·service_role·RPC
- 정적 사전이 못 푼 것만 런타임으로 흘림
git revert 한 번으로 즉시 롤백된다. DB row였다면 마이그레이션·데이터 드리프트가 코드와 따로 놀아 "어느 시점 사전으로 이 편지가 나왔나"가 추적 불가.scripts/gen-*가 빌드 산출물로 한꺼번에 재생성하는 레퍼런스다. 유지보수 루프에서 가끔 갱신될 뿐 유저 요청마다 바뀌지 않는다. 빌드 산출물과 런타임 상태의 경계가 명확히 분리돼 있다.graphSource.ts가 "데이터를 어디서 읽는가"만 한 겹으로 격리한다(L2 스냅샷 JSON 기본·동기 / L1 SQL opt-in COACH_GRAPH_SQL=1). 소비 함수는 byte 무변경이고 SQL이 빈약하면 JSON을 유지하는 safe-degrade. 정적 JSON 기본 + 실시간 복리가 필요한 추천만 선택적 SQL warm이라는 의도된 하이브리드 — "사전 자체는 정적이 정답"이라는 판단이 코드로 박제돼 있다.안전 — 도감 자동 등재의 절대 우회 금지선
도감 식재료 추가는 사람 승인 게이트를 없앴지만(2026-06-13), 영유아 안전 스크린만은 절대 우회하지 않는다. 내가 인터넷 조사로 실존·정체·영양을 확인하고, 안전 스크린을 통과한 것만 자동 등재한다.
✅ 통과 → 자동 등재
- 안전·실존·영유아 적합한 실재료
- 7파이프라인 전배선(풀·영양·💪배지·별등급·분량·제철·궁합)
- 흔하고 영양 우수면 💎, 아니면 일반
⛔ 위험군 → 보류·보고
- 질식(곤약·문어·통대추) · 보툴리누스(꿀)
- 고나트륨·한방 부적합(인삼·함초) · 비타민A 과잉(장어)
- "실존 식재료라도 영유아 부적합이면 절대 자동 등재 X"
인삼닭곰탕·황기닭곰탕 → [닭고기,무,대파](인삼·황기는 도감에도 안 들어가고 추천에도 안 뜸), 함초삼겹 → [돼지고기]. 제3자(아이)를 보호하는 게 안전 우회 금지의 이유다.