갓생 오퍼레이터 MVP 기능명세서

HealthKit · 푸시 알림 · 위젯 · DailySnapshot · SLM 연동 명세

문서 상태: MVP 기능명세 초안

작성일: 2026-07-02

대상: iOS MVP / 서브컬쳐 AI 오퍼레이터 기반 갓생 루틴 앱

목차

  1. 문서 개요
  2. 제품 정의
  3. MVP 범위
  4. 루틴 정의
  5. SLM 역할과 한계
  6. HealthKit 기능명세
  7. 푸시 알림 기능명세
  8. 위젯 기능명세
  9. 데이터 모델
  10. 와이어프레임
  11. WBS
  12. 민감정보 및 권한 정책
  13. Codex 구현 프롬프트
  14. 용어집

문서 개요

이 문서는 서브컬쳐 AI 오퍼레이터 기반 갓생 루틴 앱의 MVP 기능명세를 책 형태로 정리한 것이다. 문서의 핵심 목적은 HealthKit, 푸시 알림, 위젯처럼 SLM이 직접 처리할 수 없는 앱/OS 레벨 기능을 명확히 정의하고, SLM은 자연어 액션 변환과 캐릭터 반응 생성에만 사용하도록 역할을 분리하는 데 있다.

문서의 우선순위는 다음과 같다.

  1. 제품의 핵심 루프를 명확히 한다.
  2. SLM이 담당할 수 있는 기능과 담당하면 안 되는 기능을 분리한다.
  3. HealthKit, 푸시 알림, 위젯의 기능명세를 구현 가능한 수준으로 쪼갠다.
  4. Codex 또는 iOS 개발자가 바로 SwiftUI 프로토타입을 만들 수 있게 화면 구조와 데이터 모델을 제공한다.

1. 제품 정의

1.1 제품 한 문장

HealthKit과 생활 루틴 기록을 기반으로 사용자의 하루 상태를 읽고, 서브컬쳐 AI 오퍼레이터가 오늘의 루트와 복구 루트를 제시하는 갓생 루틴 앱.

1.2 핵심 사용자 문제

갓생을 살고 싶지만 루틴이 자주 무너지는 10대 후반~30대 초반 남성이, 자신의 생활 데이터를 기반으로 지금 당장 할 수 있는 행동과 복구 루트를 캐릭터 오퍼레이터에게 안내받고 싶다.

1.3 타겟 사용자

항목 내용
주요 연령 10대 후반부터 30대 초반
주요 성별/성향 남성 중심, 서브컬쳐 감성에 거부감이 적은 사용자
핵심 욕구 갓생, 자기관리, 공부, 운동, 외모관리, 생활패턴 개선
주요 문제 루틴 실패 후 복귀 어려움, 우선순위 판단 어려움, 지속 동기 부족

1.4 핵심 차별점

일반 습관 앱은 사용자가 직접 체크하고 관리해야 한다. 이 앱은 사용자의 생활 데이터를 바탕으로 AI 오퍼레이터가 오늘의 행동 루트를 제안하고, 실패했을 때 정규 루트를 포기시키는 대신 복구 루트로 다시 끌고 간다.

핵심 차별점은 “많은 루틴을 체크하는 것”이 아니라 “지금 상태에서 무엇을 살릴지 판단해주는 것”이다.

2. MVP 범위

2.1 MVP 핵심 루프

앱 실행
→ HealthKit 동기화
→ DailySnapshot 생성
→ 오늘의 루트 또는 복구 루트 표시
→ 사용자가 루틴 수행/기록
→ 앱이 성공/부분/실패/복구 판정
→ 캐릭터 반응 생성
→ 위젯 갱신 및 필요 시 푸시 알림 예약

2.2 MVP 핵심 기능 3개

기능 묶음 설명 MVP 포함 항목
생활 데이터 기록 갓생 루틴과 관련된 행동을 기록한다. 걸음 수, 수면, 물, 공부, 스킨케어, 영양제, 일부 수동 루틴
오늘의 루트 / 복구 루트 현재 상태를 기준으로 지금 할 일을 정리하거나 실패 후 최소 행동 루트를 제안한다. 정규 루트, 가벼운 루트, 복구 루트
캐릭터 오퍼레이터 반응 성공, 실패, 부분 완료, 복구 상황에 맞는 서브컬쳐 캐릭터 반응을 제공한다. 홈 한마디, 루트 설명, 복구 설득, 완료 반응

2.3 MVP 포함 범위

  • HealthKit stepCount 읽기
  • HealthKit sleepAnalysis 읽기
  • 루틴 기록 시스템
  • DailySnapshot 생성
  • 오늘의 작전 위젯
  • 빠른 기록 위젯
  • 로컬 푸시 알림
  • 정규 루트/복구 루트 엔진
  • FunctionGemma 기반 자연어 액션 변환
  • 2B급 챗 모델 또는 템플릿 기반 캐릭터 반응

2.4 MVP 제외 범위

  • 완전 자유 대화형 챗봇
  • 캐릭터 여러 명, Live2D, 코스튬, 호감도, 상점
  • 커뮤니티, 랭킹, 친구 경쟁
  • 사진 인증, 음성 인증
  • 정교한 운동 처방, 영양제 추천, 복용량 조언
  • Apple Watch 전용 앱
  • GPS 산책 경로 수집
  • 위젯 안 SLM 실행
  • 위젯 안 자유 대화
  • 서버 원격 푸시
  • HealthKit 백그라운드 delivery

3. 루틴 정의

3.1 루틴이란?

루틴은 사용자의 갓생 목표를 실제 행동으로 바꾼 반복 가능한 생활 단위이며, 앱이 기록하고 성공 여부를 판정할 수 있어야 한다.

목표와 루틴, 퀘스트는 구분한다.

개념 정의 예시
목표 사용자가 되고 싶은 방향 건강해지고 싶다, 공부 습관을 만들고 싶다
루틴 목표를 위해 반복할 행동 매일 7,000보 걷기, 매일 25분 공부하기
퀘스트 오늘 실제로 해야 하는 행동 지금부터 +1,000보 걷기, 수학 25분 타이머 1회

3.2 MVP 루틴 후보

카테고리 루틴 수집 방식 MVP 처리 방식
신체 활동 걸음 수 HealthKit 자동 동기화, 목표 대비 진행률
회복 수면시간 HealthKit 또는 수동 수면 부족 플래그, 루트 난이도 조정
수분 물 섭취량 수동/위젯 버튼 +250ml, +500ml, 직접 입력
성장 공부 시간 타이머/수동/자연어 15분, 25분, 직접 입력
성장 독서/연습 수동/타이머 MVP에서는 선택 루틴
자기관리 스킨케어 체크리스트 양치, 세수, 면도, 로션
건강 루틴 영양제 체크리스트/알림 먹었는지 여부만 기록
환경 방 청소 체크리스트/타이머 MVP에서는 선택 루틴

4. SLM 역할과 한계

4.1 전체 AI 구조

사용자 입력
→ FunctionGemma 270M: 자연어를 앱 액션으로 변환
→ 앱 로직 / HealthKit / DB / OS 기능 실행
→ Gemma 2B급 챗 모델 또는 템플릿: 캐릭터 말투 생성
→ 홈/대화/위젯/푸시에 결과 반영

4.2 FunctionGemma 270M의 역할

FunctionGemma 270M은 사용자의 자연어 입력을 앱 내부 액션으로 변환하는 툴유즈 모델로 사용한다. 감성 대화나 장기 계획 생성이 아니라 함수 선택과 인자 추출이 목적이다.

추천 툴 목록

sync_health_data
log_habit_event
set_goal
start_timer
adjust_quest_plan
recommend_today_route
generate_recovery_route
ask_clarifying_question
no_action

4.3 2B급 챗 모델의 역할

2B급 챗 모델은 캐릭터 반응, 루트 설명, 복구 설득, 성공/실패 피드백에 사용한다. DB 수정, 권한 요청, 푸시 예약, 위젯 갱신은 담당하지 않는다.

예시 입력:

이벤트: 복구 루트 생성
사용자 상태: 걸음 수 부족, 공부 기록 없음, 현재 시간 22:30
복구 루트: 물 300ml, 양치, 300보 걷기
캐릭터: 차갑지만 포기하지 않는 오퍼레이터
출력 조건: 1~2문장, 과도한 비난 금지, 의료 조언 금지

예시 출력:

정규 루트는 이미 무너졌어. 그래도 완전 패배로 끝낼 필요는 없지. 물 300ml, 양치, 300보만 처리하고 귀환해.

4.4 SLM이 맡지 않을 기능

기능 SLM이 맡지 않는 이유 담당 주체
HealthKit 데이터 조회 OS 권한과 데이터 접근 필요 iOS 앱
루틴 기록 저장 정확한 source of truth 필요 로컬 DB/Firebase
성공/실패 판정 결정적 계산과 상태 머신 필요 앱 로직
푸시 알림 예약 OS 알림 권한과 스케줄러 필요 UserNotifications
위젯 갱신 WidgetKit, App Group, timeline 필요 앱/위젯 extension
XP/연속 기록 계산 게임 규칙의 일관성 필요 앱 로직
권한/개인정보 처리 명시적 사용자 동의와 보안 정책 필요 앱/정책

5. HealthKit 기능명세

5.1 역할

HealthKit은 실제 생활 데이터 소스다. MVP에서는 건강 분석 기능이 아니라 오늘 루트 추천, 걷기 퀘스트 자동 판정, 복구 루트 난이도 조정의 근거로만 사용한다.

5.2 권한 범위

데이터 HealthKit 타입 권한 MVP 여부 사용 목적
걸음 수 stepCount Read 필수 오늘 걸음 수, 걷기 퀘스트 판정
수면 sleepAnalysis Read 권장 컨디션/복구 루트 난이도 조정
물 섭취량 dietaryWater Read/Write 후순위 MVP에서는 앱 내부 기록 우선
운동 기록 HKWorkout Read 후순위 운동 자동 기록은 V1 이후
위치/경로 요청 안 함 없음 제외 GPS 산책 경로 수집하지 않음

5.3 권한 요청 타이밍

  1. 캐릭터 등장 및 앱 컨셉 설명
  2. 생활 데이터를 기반으로 오늘 루트를 짠다는 설명
  3. HealthKit 권한 요청 전 안내
  4. 사용자 동의 시 iOS HealthKit 권한 요청
  5. 동의 성공 시 오늘 걸음 수/수면 데이터 동기화
  6. 동의 실패 시 수동 입력 모드로 진행

권한 요청 전 문구:

오늘 루트와 걷기 퀘스트를 자동으로 맞추기 위해 Apple 건강 앱의 걸음 수와 수면 데이터를 읽을게. 위치나 산책 경로는 가져오지 않아. 동의하지 않아도 수동 입력으로 사용할 수 있어.

5.4 동기화 정책

  • 앱 실행 시 동기화
  • 홈 화면 진입 시 동기화
  • 사용자가 새로고침 버튼을 누르면 동기화
  • 위젯은 앱이 마지막으로 저장한 DailySnapshot만 표시
  • 백그라운드 HealthKit 동기화는 MVP에서 제외

5.5 가져올 값

today_steps
yesterday_steps
last_7_days_avg_steps
last_night_sleep_minutes
sleep_start_time
sleep_end_time
healthkit_last_synced_at
healthkit_permission_status

걷기 퀘스트용 추가 값:

quest_start_steps
target_delta_steps
quest_clear_steps
current_steps
remaining_steps

5.6 예외 처리

상황 처리
권한 거부 수동 입력 모드로 전환
HealthKit 데이터 없음 “아직 가져올 데이터가 없어” 표시
수면 데이터 없음 수면 수동 입력 유도
동기화 실패 마지막 동기화 값과 새로고침 버튼 표시
권한 일부만 허용 허용된 데이터만 사용

5.7 완료 기준

  • HealthKit capability 설정 완료
  • stepCount 읽기 권한 요청 가능
  • sleepAnalysis 읽기 권한 요청 가능
  • 권한 거부 시 앱 사용 가능
  • 오늘 걸음 수 표시
  • 최근 7일 평균 걸음 수 표시
  • 어젯밤 수면시간 표시
  • 앱 실행 시 HealthKit 동기화
  • 새로고침 버튼으로 수동 동기화
  • 걷기 퀘스트 시작 시점 걸음 수 저장
  • 현재 걸음 수 기준 퀘스트 성공/진행률 판정

6. 푸시 알림 기능명세

6.1 역할

푸시 알림은 공지 수단이 아니라 사용자를 다시 행동하게 만드는 개입 장치다. MVP에서는 사용자가 루트에서 이탈하기 전에 복구 루트를 제안하거나, 사용자가 설정한 루틴을 짧게 상기시키는 데 사용한다.

6.2 MVP 알림 방식

방식 MVP 여부 이유
로컬 알림 필수 기기 안에서 시간/조건 기반으로 충분히 구현 가능
APNs 원격 푸시 후순위 서버 인프라, 토큰 관리, 실패 처리 필요
마케팅 푸시 제외 MVP 핵심 가치와 무관
위치 기반 푸시 제외 위치 권한과 민감정보 부담이 큼

6.3 권한 요청 타이밍

앱 첫 실행 직후 요청하지 않는다. 첫 오늘 루트 생성 후 “루트가 무너지기 전에 알려줄까?”라는 맥락에서 요청한다.

네 루트가 무너지기 전에 짧게 알려줄게. 잠금화면에는 수면, 영양제, 감정 같은 민감한 내용은 표시하지 않을게. 알림은 언제든 끌 수 있어.

6.4 알림 종류

알림 타입 기본 시간 조건 예시 문구
아침 체크인 09:00 사용자가 켜둔 경우 오늘 루트가 준비됐어.
저녁 미달성 20:30 완료율 60% 미만 아직 살릴 수 있는 루트가 있어.
복구 루트 21:30 실패 위험 높음 복구 루트로 전환할 시간이야.
취침 루틴 사용자 설정 수면 루틴 사용 시 오늘 마무리 루틴을 시작하자.
개별 루틴 사용자 설정 영양제/스킨케어 등 남은 루틴이 있어.

6.5 알림 정책

  • 하루 최대 3개
  • 같은 카테고리 알림은 최소 90분 쿨다운
  • 22:30 이후 기본 알림 금지
  • 취침 알림은 사용자가 직접 설정한 경우만 허용
  • 3번 연속 무시한 알림은 자동 약화
  • 완료된 루틴에 대한 알림은 취소

6.6 민감정보 노출 금지

잠금화면에 민감정보가 노출되지 않도록 알림 문구는 구체 데이터를 숨긴다.

금지 문구 대체 문구
수면 4시간밖에 못 잤어. 오늘 루트가 업데이트됐어.
우울하다고 기록했잖아. 복구 루트가 준비됐어.
영양제 아직 안 먹었어. 남은 루틴이 있어.
운동 3일째 실패 중. 아직 살릴 수 있는 퀘스트가 있어.

6.7 알림 액션

  • 복구 루트 시작
  • 오늘은 스킵
  • 앱 열기

V1 이후 추가 후보:

  • 물 +250ml
  • 영양제 완료
  • 스킨케어 완료
  • 공부 타이머 시작

6.8 완료 기준

  • 알림 권한 요청 전 설명 화면 구현
  • 권한 허용/거부 상태 확인
  • 로컬 알림 예약 가능
  • 아침 체크인 알림 설정 가능
  • 저녁 미달성 알림 설정 가능
  • 복구 루트 알림 설정 가능
  • 하루 최대 알림 수 제한
  • 야간 알림 제한
  • 민감정보 없는 알림 문구만 사용
  • 알림 탭 시 해당 화면으로 딥링크 이동
  • 설정에서 알림 타입별 on/off 가능

7. 위젯 기능명세

7.1 역할

위젯은 앱을 열지 않아도 오늘 상태를 보고, 짧은 루틴을 바로 기록하는 외부 인터페이스다. MVP에서 위젯은 오늘 상태 표시와 빠른 기록 액션만 담당한다.

7.2 위젯에서 하지 않을 것

  • 자유 대화
  • SLM 실행
  • 2B 챗 모델 실행
  • HealthKit 직접 동기화
  • 복잡한 생활 패턴 분석
  • 긴 텍스트 입력
  • 민감정보 노출
  • 실시간 걸음 수 표시 보장

7.3 위젯 데이터 흐름

HealthKit / DB / SLM 결과
→ 메인 앱이 처리
→ DailySnapshot 생성
→ App Group 저장
→ Widget이 DailySnapshot 읽기
→ Widget timeline에 표시

7.4 MVP 위젯 A: 오늘의 작전 위젯

오늘 상태와 캐릭터 한마디를 보여준다.

표시 데이터

  • 오늘 루틴 완료율
  • 걸음 수
  • 수면시간
  • 물 섭취량
  • 남은 핵심 퀘스트
  • 복구 루트 여부
  • 캐릭터 한마디
  • 마지막 업데이트 시간

7.5 MVP 위젯 B: 빠른 기록 위젯

앱을 열지 않고 자주 하는 루틴을 기록한다.

  • 물 +250ml
  • 영양제 완료
  • 스킨케어 완료
  • 방 정리 완료
  • 복구 루트 시작

7.6 AppIntent 후보

LogWaterIntent(amount: 250)
CompleteRoutineIntent(routine: supplement)
CompleteRoutineIntent(routine: skincare)
StartRecoveryRouteIntent()
OpenTodayRouteIntent()

위젯 버튼은 SLM을 거치지 않는다. 위젯 버튼은 AppIntent를 통해 DB를 수정하고 DailySnapshot을 갱신한다.

7.7 업데이트 정책

  • 앱 실행 후 DailySnapshot 갱신
  • HealthKit 동기화 완료 후 갱신
  • 루틴 기록 추가/수정/삭제 후 갱신
  • 위젯 버튼 액션 실행 후 갱신
  • 오늘 루트/복구 루트 변경 후 갱신
  • 캐릭터 한마디 변경 후 갱신

7.8 완료 기준

  • App Group 설정
  • DailySnapshot 공유 저장소 구현
  • 오늘의 작전 위젯 구현
  • 빠른 기록 위젯 구현
  • 물 +250ml 버튼 동작
  • 영양제 완료 버튼 동작
  • 스킨케어 완료 버튼 동작
  • 복구 루트 시작 버튼 동작
  • 버튼 실행 후 앱 DB 반영
  • 버튼 실행 후 위젯 갱신
  • 마지막 업데이트 시간 표시
  • HealthKit 미권한 상태 표시
  • 민감정보 없는 위젯 문구 적용

8. 데이터 모델

8.1 DailySnapshot

홈, 위젯, 푸시가 공통으로 참조하는 하루 요약 데이터다.

{
  "date": "2026-06-29",
  "steps_today": 3200,
  "steps_goal": 6000,
  "sleep_minutes": 330,
  "water_ml": 500,
  "water_goal_ml": 1500,
  "completed_routines": 4,
  "total_routines": 8,
  "today_completion_rate": 0.5,
  "active_route_type": "recovery",
  "risk_level": "medium",
  "character_line": "전부 하려다 망하지 말고, 세 개만 살리자.",
  "last_updated_at": "2026-06-29T21:10:00+09:00"
}

8.2 HabitLog

루틴 기록의 원본 데이터다.

{
  "id": "log_001",
  "date": "2026-06-29",
  "category": "water",
  "value": 250,
  "unit": "ml",
  "status": "completed",
  "source": "widget",
  "created_at": "2026-06-29T21:10:00+09:00",
  "updated_at": "2026-06-29T21:10:00+09:00"
}

source 값 후보:

healthkit
manual
widget
slm_tool
timer
notification_action

8.3 RouteState

{
  "id": "route_20260629",
  "date": "2026-06-29",
  "type": "recovery",
  "status": "active",
  "items": [
    {
      "id": "route_item_001",
      "category": "water",
      "target_value": 300,
      "unit": "ml",
      "status": "not_started"
    },
    {
      "id": "route_item_002",
      "category": "steps",
      "target_value": 300,
      "unit": "steps",
      "status": "in_progress"
    }
  ],
  "created_reason": "completion_rate_below_threshold"
}

8.4 NotificationSchedule

{
  "id": "notif_001",
  "type": "recovery_route",
  "scheduled_at": "2026-06-29T21:30:00+09:00",
  "status": "scheduled",
  "deep_link": "app://route/recovery",
  "template_id": "recovery_generic_01",
  "sensitive": false,
  "created_reason": "completion_rate_below_threshold"
}

8.5 상태값

not_started
in_progress
completed
partial
failed
skipped
recovered

9. 와이어프레임

9.1 온보딩: 오퍼레이터 등장

┌─────────────────────────────┐
│                             │
│        [캐릭터 일러스트]       │
│                             │
│  "네 생활 루트, 오늘부터 관리한다." │
│                             │
│  걸음, 수면, 공부, 자기관리 기록을 │
│  기반으로 오늘 할 일을 정리해줄게. │
│                             │
│        [시작하기]             │
│                             │
└─────────────────────────────┘

9.2 온보딩: 루틴 선택

┌─────────────────────────────┐
│ 어떤 루틴을 관리할까?           │
│                             │
│ [✓] 걸음 수                  │
│ [✓] 수면                     │
│ [✓] 물 마시기                 │
│ [✓] 공부                     │
│ [ ] 독서                     │
│ [ ] 악기/연습                 │
│ [✓] 스킨케어                  │
│ [ ] 운동                     │
│ [✓] 영양제                   │
│ [ ] 방 청소                   │
│                             │
│        [다음]                │
└─────────────────────────────┘

9.3 온보딩: HealthKit 권한 설명

┌─────────────────────────────┐
│ HealthKit 연동               │
│                             │
│ 걸음 수와 수면 데이터를 읽어서    │
│ 오늘 루트와 복구 루트를 조정할게. │
│                             │
│ 가져오는 데이터                │
│ - 오늘 걸음 수                 │
│ - 최근 7일 평균 걸음 수          │
│ - 수면 시간                   │
│                             │
│ 가져오지 않는 데이터             │
│ - 위치                       │
│ - 산책 경로                   │
│ - 사진                       │
│                             │
│ [HealthKit 연결하기]           │
│ [나중에 할게]                  │
└─────────────────────────────┘

9.4 작전실 홈

┌─────────────────────────────┐
│ 오늘의 작전실        [설정]     │
│                             │
│ ┌─────────────────────────┐ │
│ │ [캐릭터]                 │ │
│ │ "정규 루트는 위험 구간이야. │ │
│ │  오늘은 복구 루트로 가자." │ │
│ └─────────────────────────┘ │
│                             │
│ ┌─────────┬─────────┐       │
│ │ 걸음     │ 수면     │       │
│ │ 3,240   │ 5h 20m  │       │
│ │ /6,000  │ 부족     │       │
│ └─────────┴─────────┘       │
│ ┌─────────┬─────────┐       │
│ │ 물       │ 루틴     │       │
│ │ 500ml   │ 4/8     │       │
│ │ /1500ml │ 완료     │       │
│ └─────────┴─────────┘       │
│                             │
│ ┌─────────────────────────┐ │
│ │ 오늘의 루트               │ │
│ │ 1. 물 300ml              │ │
│ │ 2. +700보 걷기            │ │
│ │ 3. 공부 15분              │ │
│ │ 4. 스킨케어               │ │
│ │              [자세히 보기] │ │
│ └─────────────────────────┘ │
│                             │
│ [물 +250] [영양제] [스킨케어] │
│ [복구 루트] [걸음 동기화]      │
│                             │
│ ┌─────────────────────────┐ │
│ │ 오퍼레이터에게 말하기...    │ │
│ └─────────────────────────┘ │
│                             │
│ [작전실] [기록] [설정]        │
└─────────────────────────────┘

9.5 오늘의 루트 상세

┌─────────────────────────────┐
│ ← 오늘의 루트                 │
│                             │
│ 상태: 복구 루트               │
│ 완료율: 4 / 8                │
│                             │
│ ┌─────────────────────────┐ │
│ │ 1. 물 300ml              │ │
│ │ 현재 500 / 1500ml        │ │
│ │ [완료] [+250ml]           │ │
│ └─────────────────────────┘ │
│                             │
│ ┌─────────────────────────┐ │
│ │ 2. +700보 걷기            │ │
│ │ 현재 3,240 / 목표 3,940   │ │
│ │ 남은 700보                │ │
│ │ [걸음 수 동기화]           │ │
│ └─────────────────────────┘ │
│                             │
│ ┌─────────────────────────┐ │
│ │ 3. 공부 15분              │ │
│ │ [타이머 시작] [완료 처리]   │ │
│ └─────────────────────────┘ │
│                             │
│ ┌─────────────────────────┐ │
│ │ 4. 스킨케어               │ │
│ │ [양치] [세수] [로션]       │ │
│ └─────────────────────────┘ │
│                             │
│ [루트 줄이기] [오늘은 스킵]    │
└─────────────────────────────┘

9.6 오퍼레이터 대화 시트

┌─────────────────────────────┐
│        오퍼레이터             │
│                             │
│ AI │ 오늘은 수면이 낮아.       │
│    │ 정규 루트는 줄이는 게 맞아. │
│                             │
│ 나 │ 오늘 망한 것 같은데        │
│                             │
│ AI │ 복구 루트로 전환한다.      │
│    │ 물 300ml, 양치, 300보.    │
│    │ 이 세 개만 처리해.         │
│                             │
│ ┌─────────────────────────┐ │
│ │ 오늘 뭐 해야 돼?           │ │
│ └─────────────────────────┘ │
│                             │
│ 추천 입력                    │
│ [오늘 망함] [줄여줘] [동기화]   │
│ [공부 기록] [복구 루트]        │
└─────────────────────────────┘

9.7 기록 화면

┌─────────────────────────────┐
│ 기록                         │
│                             │
│ 이번 주                       │
│ 월  화  수  목  금  토  일       │
│ ●   ●   ○   ●   △   -   -      │
│                             │
│ 오늘 기록                     │
│ ┌─────────────────────────┐ │
│ │ 걸음 수 3,240 / 6,000    │ │
│ │ 상태: 진행 중             │ │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ 물 500 / 1500ml          │ │
│ │ 상태: 부족                │ │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ 스킨케어 2 / 4            │ │
│ │ 상태: 부분 완료           │ │
│ └─────────────────────────┘ │
│                             │
│ [작전실] [기록] [설정]        │
└─────────────────────────────┘

9.8 설정 화면

┌─────────────────────────────┐
│ 설정                         │
│                             │
│ 계정                         │
│ Apple 로그인 / Google 로그인   │
│                             │
│ 권한                         │
│ HealthKit                    │
│ 걸음 수: 연결됨               │
│ 수면: 연결 안 됨              │
│ [권한 다시 확인]              │
│                             │
│ 알림                         │
│ [ON] 아침 체크인              │
│ [ON] 저녁 미달성              │
│ [ON] 복구 루트                │
│ [OFF] 개별 루틴 알림           │
│                             │
│ 데이터                        │
│ [내 데이터 내보내기]           │
│ [대화/기록 삭제]              │
│ [전체 초기화]                 │
│                             │
│ 캐릭터                        │
│ 오퍼레이터 톤: 차분한 지시형    │
│ [변경]                       │
└─────────────────────────────┘

9.9 위젯

Small 위젯

┌───────────────┐
│ 오늘의 작전    │
│ 루틴 4 / 8    │
│ 걸음 3.2k     │
│               │
│ "복구 루트 대기"│
└───────────────┘

Medium 위젯

┌─────────────────────────────┐
│ 오늘의 작전                   │
│ 걸음 3,240 / 6,000            │
│ 물 500 / 1,500ml              │
│ 루틴 4 / 8                    │
│                             │
│ "아직 살릴 수 있어."           │
└─────────────────────────────┘

빠른 기록 위젯

┌─────────────────────────────┐
│ 빠른 기록                     │
│                             │
│ [물 +250] [영양제]             │
│ [스킨케어] [복구 루트]          │
└─────────────────────────────┘

10. WBS

10.1 WBS 요약

WBS ID 작업 영역 주요 산출물 우선순위
1.0 공통 기반 설계 DailySnapshot, HabitLog, RouteState 모델 P0
2.0 HealthKit 연동 걸음 수/수면 데이터 읽기, 권한 처리 P0
3.0 Daily State 계산 오늘 상태, 루틴 완료율, 복구 필요 여부 계산 P0
4.0 푸시 알림 로컬 알림, 알림 정책, 딥링크 P1
5.0 위젯 오늘의 작전 위젯, 빠른 기록 위젯 P1
6.0 통합 플로우 HealthKit → Snapshot → Widget/Push 연결 P0
7.0 QA / 예외 처리 권한 거부, 데이터 없음, 알림 거부, 위젯 갱신 실패 대응 P0
8.0 MVP 제외 / 백로그 Live Activity, 서버 푸시, GPS, Apple Watch 등 P2

10.2 권장 구현 순서

  1. 공통 데이터 모델 정의
  2. HabitLog / DailySnapshot 저장 구조 구현
  3. HealthKit stepCount 연동
  4. HealthKit sleepAnalysis 연동
  5. TodayState 계산기 구현
  6. DailySnapshot 생성 및 App Group 저장
  7. 오늘의 작전 위젯 구현
  8. 빠른 기록 위젯 구현
  9. 로컬 푸시 알림 구현
  10. 알림 정책/딥링크/액션 구현
  11. 전체 통합 QA

10.3 Linear 이슈 분리안

Epic 1. HealthKit 연동

  • HealthKit 권한 요청 플로우 구현
  • stepCount 오늘/어제/7일 평균 조회
  • sleepAnalysis 수면시간 조회
  • 권한 거부 시 수동 입력 fallback
  • 걷기 퀘스트 진행률 계산

Epic 2. DailySnapshot / 상태 계산

  • HabitLog 모델 정의
  • DailySnapshot 모델 정의
  • TodayState 계산기 구현
  • 복구 루트 필요 여부 계산
  • App Group 공유 저장소 구현

Epic 3. 위젯

  • 오늘의 작전 위젯 구현
  • 빠른 기록 위젯 구현
  • 물 +250ml AppIntent
  • 영양제/스킨케어 완료 AppIntent
  • 복구 루트 시작 AppIntent
  • 위젯 reload 정책 구현

Epic 4. 푸시 알림

  • 알림 권한 요청 플로우 구현
  • 로컬 알림 스케줄러 구현
  • 아침 체크인 알림
  • 저녁 미달성 알림
  • 복구 루트 알림
  • 알림 딥링크/액션 구현
  • 민감정보 없는 알림 템플릿 적용

11. 민감정보 및 권한 정책

11.1 우리 앱에서 민감하게 볼 정보

구분 예시 처리 원칙
건강/활동 데이터 걸음 수, 운동 시간, 수면시간 필요한 요약값만 사용
수면 데이터 취침/기상 시간, 수면 부족 여부 권한 설명 후 수집, 푸시에 직접 노출 금지
감정/멘탈 입력 우울함, 불안함, 무기력함 의료적 판단 금지, 복구 루트 정도로만 사용
영양제/약 관련 기록 영양제 먹었는지, 약 이름 입력 가능성 복용 여부만 기록, 추천/복용량 조언 금지
AI 대화 로그 사적인 고민, 건강, 인간관계 전체 저장 최소화, 삭제 가능
위젯/푸시 노출 정보 잠금화면 문구 민감한 구체 데이터 노출 금지

11.2 MVP에서 수집하지 않을 정보

  • 정확한 GPS 산책 경로
  • 얼굴/몸 사진 인증
  • 방 사진 강제 인증
  • 약 이름/질환명
  • 진단명
  • 체중/체지방률
  • 성생활 관련 기록
  • 정치/종교 성향
  • 주민등록번호 등 고유식별정보
  • 연락처 목록
  • 친구 목록

11.3 설계 원칙

  1. HealthKit 권한은 기능별로 최소 요청한다.
  2. GPS 위치는 MVP에서 수집하지 않는다.
  3. 대화 로그는 전체 저장보다 요약 저장을 우선한다.
  4. 민감한 메모리는 사용자가 끄거나 삭제할 수 있게 한다.
  5. 푸시/위젯에는 민감한 문구를 노출하지 않는다.
  6. 영양제/운동은 기록만 하고 의료 조언은 하지 않는다.
  7. 분석 결과는 진단이 아니라 루틴 패턴으로 표현한다.
  8. 서버 저장 전 로컬 저장 우선 구조를 검토한다.
  9. 로그/디버깅 데이터에 원문 대화나 HealthKit 원본을 넣지 않는다.
  10. 사용자가 데이터 삭제/초기화할 수 있게 한다.

부록 A. Codex 구현 프롬프트

아래 프롬프트는 SwiftUI MVP 프로토타입을 만들 때 사용할 수 있다.

너는 iOS SwiftUI MVP 프로토타입을 만드는 개발자 역할을 해줘.

목표:
서브컬쳐 AI 오퍼레이터 기반 갓생 루틴 앱의 MVP 와이어프레임을 SwiftUI 화면으로 구현한다.
실제 HealthKit, 푸시, WidgetKit 연동은 아직 하지 말고, 더미 데이터와 인터페이스/stub 중심으로 만든다.

앱 컨셉:
사용자의 걸음 수, 수면, 물, 공부, 스킨케어, 영양제 같은 생활 루틴을 기록하고,
AI 오퍼레이터가 오늘의 루트와 복구 루트를 제시하는 앱이다.

하단 탭:
1. 작전실
2. 기록
3. 설정

구현할 화면:
1. OnboardingView
   - 캐릭터/오퍼레이터 등장
   - 앱 컨셉 설명
   - 루틴 선택 화면
   - HealthKit 권한 설명 화면
   - 푸시 알림 권한 설명 화면

2. HomeView / 작전실
   - 캐릭터 한마디 카드
   - 오늘 상태 카드 4개
     - 걸음 수
     - 수면
     - 물
     - 루틴 완료율
   - 오늘의 루트 카드
   - 빠른 기록 버튼
     - 물 +250
     - 영양제
     - 스킨케어
     - 복구 루트
     - 걸음 동기화
   - 오퍼레이터 대화 입력창

3. TodayRouteView
   - 오늘의 루트 상세
   - 물 퀘스트
   - 걷기 퀘스트
   - 공부 퀘스트
   - 스킨케어 체크리스트
   - 루트 줄이기 버튼
   - 오늘은 스킵 버튼

4. LogView
   - 이번 주 루틴 요약
   - 오늘 기록 리스트
   - 완료 / 부분 완료 / 실패 / 복구 성공 상태 표시

5. SettingsView
   - HealthKit 권한 상태
   - 알림 설정
   - 데이터 삭제
   - 캐릭터 톤 변경

6. OperatorChatSheet
   - 홈에서 열리는 바텀시트
   - 더미 대화 메시지
   - 추천 입력 버튼
     - 오늘 뭐 해야 돼?
     - 오늘 망함
     - 줄여줘
     - 걸음 동기화
     - 공부 기록

데이터 모델:
- DailySnapshot
- HabitLog
- RouteState
- RoutineStatus
- PermissionState

중요 제약:
- 지금은 실제 HealthKit 연동하지 말고 HealthKitService 프로토콜/stub만 만든다.
- 실제 푸시 예약하지 말고 NotificationScheduler 프로토콜/stub만 만든다.
- 실제 WidgetKit 타겟은 만들지 않아도 되지만 WidgetDailySnapshot 모델은 만들어둔다.
- SLM 호출은 구현하지 말고 OperatorAction enum과 OperatorService stub만 만든다.
- 디자인은 low-fi prototype 수준으로 하고, 색상/일러스트는 나중에 붙일 수 있게 구조화한다.
- 민감정보 문구는 잠금화면/위젯에 노출하지 않는 전제로 작성한다.

부록 B. 용어집

갓생 : 자기관리, 공부, 운동, 생활습관 개선 등을 통해 더 나은 생활을 만들려는 사용자 목표.

루틴 : 반복적으로 수행하고 기록하며 성공 여부를 판정할 수 있는 생활 행동 단위.

퀘스트 : 오늘 실제로 수행해야 하는 구체 행동. 루틴의 당일 버전.

오늘의 루트 : 사용자의 현재 상태에 맞춰 앱이 제안하는 오늘의 행동 순서.

복구 루트 : 정규 루틴을 완료하기 어려운 상황에서 최소 행동으로 완전 실패를 막는 루트.

DailySnapshot : 홈, 위젯, 푸시가 공통으로 참조하는 오늘 상태 요약 데이터.

FunctionGemma 270M : 사용자의 자연어를 앱 내부 tool call로 변환하는 작은 툴유즈 모델.

2B급 챗 모델 : 캐릭터 말투, 루트 설명, 성공/실패 반응을 생성하는 대화 모델.

HealthKit : iOS에서 걸음 수, 수면 등 건강/활동 데이터를 읽는 데이터 소스.

위젯 : 앱을 열지 않고 오늘 상태를 보거나 빠른 기록을 수행하는 iOS 외부 인터페이스.

푸시 알림 : 사용자가 루틴에서 이탈하기 전에 복구 루트나 체크인을 유도하는 개입 수단.