Files
life-helper/app/assets/seed/frame_patterns.json
joungmin 8fe6a8f378 [Developer] #204 Phase 1 MVP — Flutter app skeleton complete
- Drift 21 tables (8 catalog + 11 user + habit_dose_variants + meta_kv)
  with R1~R10 CHECK constraints and 19 indexes
- 8 hand-crafted seed JSON catalogs in app/assets/seed/
  (refs 84, protocols 34, methodologies 21, frame_patterns 30,
   reward_menu_items 30, break_protocols 8, common_frames 5, diet_patterns 5)
- 6 domain functions: recommend_variant, compute_streak,
  validate_frame_level, active_habit_quota, weekly_minimum_ratio,
  seed_importer (transactional, idempotent)
- 4 vertical-slice Riverpod screens: HabitList, HabitCreate, CheckIn, Streak
- 31 unit tests passing; flutter analyze clean
- OQ-5 streak semantics: missing entry ≠ explicit blank
  (missing = end of history; only TrackerValue.blank triggers Never-miss-twice)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 10:33:03 +09:00

243 lines
7.4 KiB
JSON

[
{
"id": "snack_quit",
"domain": "food",
"avoidance_keyword": "끊기",
"l0_example": "과자 끊기",
"l2_suggestion": "오후 4시 견과류 한 줌 + 물 한 잔",
"l3_identity": "오후 4시 에너지 충전 의식"
},
{
"id": "late_night_eating_quit",
"domain": "food",
"avoidance_keyword": "끊기",
"l0_example": "야식 끊기",
"l2_suggestion": "저녁 8시 마지막 식사 종료 + 따뜻한 차",
"l3_identity": "잠을 위한 저녁 마감"
},
{
"id": "alcohol_reduce",
"domain": "drink",
"avoidance_keyword": "줄이기",
"l0_example": "술 줄이기",
"l2_suggestion": "평일 저녁 탄산수 + 라임 한 조각",
"l3_identity": "또렷한 아침을 가지는 사람"
},
{
"id": "smoking_quit",
"domain": "smoking",
"avoidance_keyword": "끊기",
"l0_example": "담배 끊기",
"l2_suggestion": "흡연 충동 시 5분 산책 + 호흡 1분",
"l3_identity": "호흡이 깊은 사람"
},
{
"id": "caffeine_reduce",
"domain": "drink",
"avoidance_keyword": "줄이기",
"l0_example": "카페인 줄이기",
"l2_suggestion": "오후 2시 이후 루이보스/허브차",
"l3_identity": "깊이 자는 사람"
},
{
"id": "oversleep_avoid",
"domain": "sleep",
"avoidance_keyword": "안",
"l0_example": "늦잠 안 자기",
"l2_suggestion": "기상 즉시 햇빛 5분 (§Huberman 1.1)",
"l3_identity": "아침을 여는 사람"
},
{
"id": "overtime_stop",
"domain": "general",
"avoidance_keyword": "그만",
"l0_example": "야근 그만하기",
"l2_suggestion": "저녁 7시 노트북 닫기 + 산책 20분",
"l3_identity": "회복을 우선하는 사람"
},
{
"id": "smartphone_stop",
"domain": "screen",
"avoidance_keyword": "그만",
"l0_example": "스마트폰 그만 보기",
"l2_suggestion": "화장실/이동 시간엔 책 1쪽 읽기",
"l3_identity": "깊이 읽는 사람"
},
{
"id": "instagram_quit",
"domain": "screen",
"avoidance_keyword": "끊기",
"l0_example": "인스타그램 끊기",
"l2_suggestion": "평일 아침 30분 일기 + 산책",
"l3_identity": "자기 삶을 사는 사람"
},
{
"id": "youtube_shorts_avoid",
"domain": "screen",
"avoidance_keyword": "안",
"l0_example": "유튜브 쇼츠 안 보기",
"l2_suggestion": "점심 후 NSDR 10분 (§Huberman 2.2)",
"l3_identity": "회복하는 사람"
},
{
"id": "gaming_reduce",
"domain": "screen",
"avoidance_keyword": "줄이기",
"l0_example": "게임 줄이기",
"l2_suggestion": "주 3회 운동 1시간 (§Huberman 1.6)",
"l3_identity": "몸을 쓰는 사람"
},
{
"id": "procrastination_stop",
"domain": "general",
"avoidance_keyword": "그만",
"l0_example": "미루기 그만",
"l2_suggestion": "매일 가장 어려운 일 1개 Phase 1 배치 (§4.1)",
"l3_identity": "먼저 끝내는 사람"
},
{
"id": "binge_eating_avoid",
"domain": "food",
"avoidance_keyword": "안",
"l0_example": "폭식 안 하기",
"l2_suggestion": "매끼 단백질 30g+ 먼저 (§1.9)",
"l3_identity": "영양을 챙기는 사람"
},
{
"id": "snacking_avoid",
"domain": "food",
"avoidance_keyword": "안",
"l0_example": "군것질 안 하기",
"l2_suggestion": "점심 식사에 단백질·채소 충분히",
"l3_identity": "든든하게 먹는 사람"
},
{
"id": "cursing_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "욕 안 하기",
"l2_suggestion": "짜증 순간 cyclic sigh 1분 (§2.3)",
"l3_identity": "차분한 사람"
},
{
"id": "anger_avoid",
"domain": "general",
"avoidance_keyword": "않기",
"l0_example": "화내지 않기",
"l2_suggestion": "욱할 때 60초 호흡 + 한 박자 쉼",
"l3_identity": "호흡으로 대응하는 사람"
},
{
"id": "anxiety_stop",
"domain": "general",
"avoidance_keyword": "멈추기",
"l0_example": "불안 멈추기",
"l2_suggestion": "불안 순간 box breathing 2분 (§2.4)",
"l3_identity": "자기 신경을 다루는 사람"
},
{
"id": "worry_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "걱정 안 하기",
"l2_suggestion": "걱정 떠오르면 종이에 한 줄 적기",
"l3_identity": "글로 정리하는 사람"
},
{
"id": "negative_thoughts_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "부정적 생각 안 하기",
"l2_suggestion": "감사 한 줄 일기 (§리워드 T0-7)",
"l3_identity": "기록하는 사람"
},
{
"id": "self_blame_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "자책 안 하기",
"l2_suggestion": "실패 후 self-compassion 발화 (Neff)",
"l3_identity": "자기에게 친절한 사람"
},
{
"id": "comparison_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "비교 안 하기",
"l2_suggestion": "아침에 자기 진척 1줄 기록",
"l3_identity": "어제의 나와 겨루는 사람"
},
{
"id": "exercise_procrastination",
"domain": "exercise",
"avoidance_keyword": "미루기",
"l0_example": "운동 미루기",
"l2_suggestion": "화·목 7시 Zone 2 30분 (캘린더 못박기)",
"l3_identity": "매주 움직이는 사람"
},
{
"id": "reading_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "책 안 읽기",
"l2_suggestion": "자기 전 1쪽 (Tiny Habits)",
"l3_identity": "1쪽씩 쌓는 사람"
},
{
"id": "english_study_procrastination",
"domain": "general",
"avoidance_keyword": "미루기",
"l0_example": "영어 공부 미루기",
"l2_suggestion": "출근길 팟캐스트 10분",
"l3_identity": "매일 듣는 사람"
},
{
"id": "tidy_avoid",
"domain": "general",
"avoidance_keyword": "안",
"l0_example": "정리 안 하기",
"l2_suggestion": "자기 전 책상 1분 리셋",
"l3_identity": "다음 날을 준비하는 사람"
},
{
"id": "late_night_sns_avoid",
"domain": "screen",
"avoidance_keyword": "안",
"l0_example": "새벽 SNS 안 보기",
"l2_suggestion": "침대 옆 책 1권 비치, 폰은 거실 충전",
"l3_identity": "침실을 자는 곳으로만 쓰는 사람"
},
{
"id": "phone_bedside_avoid",
"domain": "sleep",
"avoidance_keyword": "X",
"l0_example": "폰 충전 침대 옆 X",
"l2_suggestion": "폰은 거실 충전 + 아날로그 알람",
"l3_identity": "아침을 햇빛으로 시작하는 사람"
},
{
"id": "time_waste_stop",
"domain": "general",
"avoidance_keyword": "그만",
"l0_example": "단순 시간낭비 그만",
"l2_suggestion": "오후 슬럼프 시 NSDR 20분 (§2.2)",
"l3_identity": "회복으로 응답하는 사람"
},
{
"id": "impulse_buy_reduce",
"domain": "general",
"avoidance_keyword": "줄이기",
"l0_example": "충동구매 줄이기",
"l2_suggestion": "장바구니에 24시간 두기 룰",
"l3_identity": "하루 자고 결정하는 사람"
},
{
"id": "early_rise_fail",
"domain": "sleep",
"avoidance_keyword": "실패",
"l0_example": "일찍 일어나기 실패",
"l2_suggestion": "고정 기상 시각 + 즉시 햇빛 (§1.4, 1.1)",
"l3_identity": "빛으로 깨는 사람"
}
]