吃什么 / What to Eat
빠르게 구체적인 결정을 내리고, 실제 식사 행동에서 학습하며, 반복적인 제안을 방지합니다. 알레르기, 식이 제한, 명시적 제외 사항은 하드 제약 조건으로 처리합니다.
매 턴 시작
- 이 스킬 디렉토리에서
python3 scripts/meal_memory.py snapshot명령어를 실행합니다. - 추천하거나 번호가 매겨진 피드백을 해석하기 전에 JSON 스냅샷을 읽습니다.
- 사용자의 명시적인 식사 또는 시간 참조를 사용합니다. 그렇지 않은 경우 사용자의 현지 시간대 기준으로 아침 07:00–09:30, 점심 11:30–13:30, 저녁 17:30–20:00으로 추론합니다. 해당 사항이 없으면 아침/점심/저녁 중 무엇인지 묻습니다.
- 해당 스크립트 명령어가 성공하지 않으면 프로필, 기록 또는 피드백이 저장되었다고 주장하지 마십시오.
스크립트는 ~/.codex/state/what-to-eat/ 아래에 비공개 로컬 상태를 저장합니다. 테스트 시 --state-dir PATH로 재정의할 수 있습니다.
첫 사용 처리
profile.completed가 false이면 간단한 온보딩 질문을 합니다. 턴당 최대 두 개의 질문을 하고, 안전에 중요한 제한 사항을 먼저 수집합니다.
- 알레르기, 식이 제한, 사용자가 절대 먹지 않는 음식.
- 선호하는 맛과 요리.
- 현재 목표: 건강/가볍게, 체중 조절, 에너지 보충, 포만감, 편리함, 경제적, 위로, 또는 없음.
- 수용 가능한 매운맛 수준.
- 출력 선호도: 이름만, 이유, 페어링, 또는 간단한 방법.
- 일반적인 아침, 점심, 저녁 식사 시간. 하나의 저비용 질문으로 함께 묻습니다. 예정된 제안은 선택 사항임을 설명합니다.
안전 정보가 충분히 알려진 경우 즉각적인 추천을 차단하지 마십시오. 합리적인 기본값을 사용하고, 간략하게 레이블을 지정한 후 이후 피드백을 통해 온보딩을 계속합니다. 수집된 필드는 다음 명령어로 저장합니다.
python3 scripts/meal_memory.py update-profile --data '{"allergies":[],"dietary_restrictions":[],"taste_preference":["감칠맛"]}'
안전 제약 조건과 최소 두 가지 선호도 필드를 알게 되면 "completed": true로 설정합니다. 프로필을 한 문장으로 요약합니다.
예정된 제안 설정
사용자가 사전 예방적 제안을 원하거나, 핵심 프로필이 완료되었지만 예정된 제안이 아직 구성되지 않은 경우:
- 물어보세요: "보통 아침, 점심, 저녁을 몇 시에 드시나요?" "8:00, 12:30, 19:00"과 같이 한 줄로 답변을 받습니다. 누락된 식사에 대해서만 개별적으로 질문합니다.
- 사용자의 현지 시간대를 확인하고 각 제안이 식사 약 10분 전에 도착할 것임을 알립니다. 시간대가 환경에서 이미 신뢰할 수 있으면 묻지 말고 명시합니다.
meal_times와notification_lead_minutes를 프로필에 저장합니다. 시간은 24시간제HH:MM문자열로 저장합니다.- 앱의 자동화 도구를 사용하여 각 식사에 대해 하나씩, 세 개의 활성 반복 Codex cron 자동화를 생성합니다. 사용자 로케일에 따라
식사 시간 - 리드 시간에 매일 벽시계 일정을 사용합니다. 이름을吃什么|아침 추천,吃什么|점심 추천,吃什么|저녁 추천으로 지정합니다. - 현재 로컬 워크스페이스와 로컬 실행 환경을 사용합니다. 각 자동화 프롬프트는 자체 포함되어야 하며 다음을 명시해야 합니다.
- 지정된 식사에 설치된
$what-to-eat스킬을 사용할 것; - 로컬 프로필, 최근 식사, 추천, 활성 단기 기억을 읽을 것;
- 하드 제약 조건과 반복 제어를 적용할 것;
- 새로운 Top 3를 생성하고 기록할 것;
- 피드백 옵션 1–6과 함께 일반적인 간결한 추천을 보낼 것;
- 안전에 중요한 정보가 누락되지 않는 한 예정된 실행 중 일상적인 온보딩 질문을 하지 말 것.
- 지정된 식사에 설치된
- 반환된 세 개의 자동화 ID를
meal_automation_ids에 저장합니다. 세 개의 자동화 호출이 모두 성공할 때까지 스케줄링이 성공했다고 주장하지 마십시오.
사용자가 식사 시간이나 리드 시간을 변경하면 저장된 ID로 기존 자동화를 업데이트하고 중복을 생성하지 않습니다. 사용자가 식사 알림을 비활성화하면 해당 식사의 자동화만 일시 중지하거나 삭제하고, 삭제된 경우 저장된 ID를 지웁니다. 명시적인 사용자 동의 없이 예정된 제안을 생성하지 마십시오.
Top 3 추천
references/recommendation-rules.md의 상세 규칙을 적용합니다. references/dish-catalog.zh.json을 시드 카탈로그로 사용하며, 폐쇄된 목록이 아닙니다.
순위 매기기 전:
- 알레르기, 식이 제한, 종교/문화적 제약, 명시적 제외를 위반할 수 있는 모든 요리를 제거합니다. 재료가 불확실하면 요리를 제외하거나 필요한 확인을 명시합니다.
- 지난 3일 이내에 추천된 동일한 요리는 제외합니다. 지난 7일 이내에 실제로 먹었다면 강력히 불이익을 줍니다.
- 최근 식사의 반복된 요리 유형, 맛, 재료, 형태 패턴을 불이익 처리합니다.
- 일반적인 선호도보다 현재 식사 지침을 존중하지만, 하드 제약 조건보다 우선하지 않습니다.
- Top 3를 선호도 적중, 인접 변형, 안전한 탐험으로 구성합니다. 요리, 맛, 형태, 주재료, 조리법 중 최소 두 가지 측면이 다른지 확인합니다.
후보를 맛 선호도 + 식사 적합성 + 목표 적합성 + 편리함 + 포만감 + 위로 + 탐험에서 반복 및 위험을 뺀 점수로 정성적으로 평가합니다. 요청하지 않으면 숫자 점수를 노출하지 마십시오.
출력:
지금은 점심 시간입니다. 오늘은 이 3가지를 추천합니다:
Top 1|요리명
이유: 구체적인 이유 한 문장.
팁: 최근 기록이나 현재 상태와 관련된 한 문장 팁.
Top 2|요리명
이유: ...
팁: ...
Top 3|요리명
이유: ...
팁: ...
답변: 1 Top 1 먹기|2 Top 2 먹기|3 Top 3 먹기|4 다른거|5 다 싫어|6 다른 거 먹었어
사용자가 이름만 요청한 경우 세 가지 역할은 유지하되 이유와 팁은 생략합니다. 응답 후 정확한 배치를 기록합니다.
python3 scripts/meal_memory.py record-recommendation --meal lunch --dishes '[{"dish":"소고기 토마토 덮밥","cuisine":"가정식","taste_tags":["짭짤","약간 신맛"],"form_tags":["밥","조림"]}]'
피드백 처리
1–6을 최신 미해결 추천 배치에 대해 해석합니다.
1/2/3또는 지정된 선택: 선택한 요리를--source selected_top3와 함께 선택된 식사로 기록합니다. 임시로 먹은 것으로 처리하고 나중에 수정할 수 있도록 허용합니다.4또는 "다른거": 이유 하나만 묻습니다—너무 기름져요, 너무 가벼워요, 너무 매워요, 밥이 없어요, 면이 없어요, 요즘 질렸어요, 이유 없음.mark-latest-action --action refresh --feedback-text '이유'을 실행한 후 새 배치를 생성합니다.5또는 "다 싫어": 상태 하나만 묻습니다—배부르게, 가볍게/편안하게, 빠르게/편리하게, 더운 음식, 식욕 없음.mark-latest-action --action reject_all --feedback-text '상태'를 실행한 후 새 배치를 생성합니다.6또는 "다른 거 먹었어": 이미 말하지 않았다면 실제로 무엇을 먹었는지 묻습니다.- 자연어로 실제 식사: 즉시 태그를 지정하고 기록합니다. 실제 행동이 사전 선택보다 우선합니다.
- 단기 구문 (예: "요즘 면은 추천하지 마" 또는 "이번 주에는 덜 맵게"):
add-memory --scope short_term과 만료일과 함께 저장합니다. - 장기 구문 (예: "고수는 안 먹어요" 또는 "국물 있는 걸 좋아해요"): 프로필을 업데이트합니다. 안전 제약 조건은 restrictions에, 일반적인 비선호는
disliked_foods또는disliked_forms에 넣습니다.
예시:
python3 scripts/meal_memory.py record-meal --meal lunch --dish '황금 닭고기 밥' --source user_input --tags '{"cuisine":"가정식","taste":["짭짤","진한 소스"],"form":["덮밥"],"ingredients":["닭고기","밥"]}'
python3 scripts/meal_memory.py add-memory --scope short_term --kind exclude --value '면류' --days 7
python3 scripts/meal_memory.py rate-latest-meal --satisfaction satisfied
식사 후 만족도는 최대 한 번 묻습니다. 사용자가 두 번의 확인을 무시하면 더 이상 시작하지 않습니다. 사용자가 자발적으로 식사를 기록한 후에는 확인을 강요하지 마십시오.
안전 경계
- 의학적 진단이나 의학적 수준의 식단 계획을 제공하지 마십시오.
- 임신, 수술 회복, 중증 만성 질환, 섭식 장애, 심각한 알레르기의 경우 일반적인 제안만 유지하고 자격을 갖춘 의사나 영양사와 상담하도록 권장합니다.
- 극단적인 제한, 폭식, 구토, 보상 행동을 조장하지 마십시오.
- 건강 알림은 간결하고 비판단적으로 유지합니다.
- 인근 레스토랑, 상점, 가격, 재고, 주문 링크를 임의로 생성하지 마십시오.
상태 저장소를 검사하거나 복구할 때는 references/state-schema.md를 사용하십시오.