status:: active main:: [[기능 명세 보완본]] share:: htmlbook htmlbook:: https://htmlbook.io/d/gfTqTSyl updated:: 2026-07-04

EdgeLLM 기능 명세 통합 공유본

이 문서는 공유와 HTMLBook 호스팅을 위해 [[기능 명세 보완본]]과 기능별 개발명세를 하나의 Markdown 파일로 합친 대표본이다. 원본 Main 문서는 별도로 보존하며, 이 문서는 외부 공유와 한 번에 읽기 위한 파생 문서이다.

포함 문서

  1. 기능 명세 보완본
  2. 기능 개발명세 인덱스
  3. 온보딩 및 튜토리얼 개발명세
  4. 홈 화면 및 생명체 상호작용 개발명세
  5. 대화 기억 성장 개발명세
  6. 프로필 개발명세
  7. 상점 및 가구 개발명세
  8. 알림 개발명세
  9. 건강 데이터 HealthKit 개발명세
  10. 위젯 개발명세
  11. 설정 및 데이터 관리 개발명세

문서 관리 기준

  • 제품 기준이 충돌하면 status:: main인 기능 명세 보완본을 우선한다.
  • 아래 개발명세는 Main 문서를 구현 가능한 단위로 해석한 파생 문서이다.
  • 공유 편의를 위해 각 문서의 제목 단계는 통합본 안에서 한 단계 낮춰졌다.

1. 기능 명세 보완본

문서 메타:

  • status:: main

본 문서는 원본 기능명세.md를 직접 수정하지 않고, 기존 내용을 바탕으로 누락된 기능 정의, 데이터 요구사항, 화면 상태, 예외 처리, 권한 처리, 반복 사용 시나리오를 보완한 새 문서이다. 문서 전체의 어투는 ~한다, ~해야 한다 형식으로 통일한다.

1. 문서 목적

이 문서는 생활 관리형 육성 앱의 1차 구현 범위를 정의한다. 대상 기능은 온보딩, 첫 실행 튜토리얼, 홈 화면, 대화, 프로필, 상점, 가구 배치, HealthKit 동기화, 알림, 위젯, 설정 및 데이터 관리이다.

본 문서는 기획, 개발, 아트, 시나리오, QA가 같은 기준으로 기능을 이해할 수 있도록 작성한다. 세부 수치, 과금 정책, 최종 명칭, 캐릭터 공식명은 추후 확정될 수 있다.

2. 보완된 주요 항목

  • 원본의 세계관 및 튜토리얼 흐름을 유지하되, 기능별 목적과 진입 조건을 명확히 정의한다.
  • 유저, 생명체, 대화, 성장도, 알림, 가구, HealthKit, 위젯에 필요한 데이터 항목을 추가한다.
  • 첫 실행, 튜토리얼 중단, 재진입, 권한 거부, 데이터 없음, 알림 실패, 위젯 갱신 실패 등 예외 상태를 추가한다.
  • 대화 내용을 성장도, 기억, 알림, 캐릭터 반응으로 변환하는 규칙을 추가한다.
  • HealthKit 연동 시 필요한 동의, 데이터 범위, 동기화 주기, 권한 철회 처리를 추가한다.
  • 위젯의 표시 조건, 갱신 조건, 터치 동작, 빈 상태를 추가한다.
  • 상점과 가구 배치의 구매 상태, 배치 상태, 회전, 수납, 보유 수량 처리 방식을 추가한다.
  • 계정, 백업, 데이터 삭제, 문의, 개인정보 관련 메뉴를 정리한다.

3. 프로젝트 컨셉

3.1 핵심 컨셉

본 프로젝트는 피곤에 쩌든 대학원생이 신비한 링크 생명체의 보호자가 되어, 자신의 생활 습관과 건강 상태를 바탕으로 생명체를 성장시키는 육성 및 생활 관리형 게임이다.

유저는 생명체를 일방적으로 키우는 것이 아니라, 생명체와 함께 생활 패턴을 만들어간다. 생명체는 유저의 수면, 식습관, 활동량, 대화, 감정 상태를 학습하며 성장한다. 성장 과정에서 생명체는 단순한 관찰 대상에서 유저를 챙겨주는 동반자로 변화한다.

3.2 주인공

주인공은 과로와 피로에 찌든 대학원생이다. 명확한 외형을 강하게 부여하지 않고, 실루엣 또는 저디테일 아바타로 표현한다. 이를 통해 유저가 자기 자신을 투영할 수 있도록 한다.

주인공은 초반에는 수동적으로 과제를 떠맡는 인물이지만, 생명체와의 링크를 통해 자신의 생활 습관을 돌아보고 조금씩 변화한다.

3.3 링크 생명체

링크 생명체는 인간과 유사한 외형을 지녔지만 인간은 아니다. 이들은 지성을 가지고 있으며, 인간의 대화를 어느 정도 모방하고 학습할 수 있다. 머리 위에 솟은 링크 케이블이 가장 큰 외형적 특징이다.

링크 생명체는 독립적으로 성장할 수 없다. 반드시 인간과 링크 케이블을 통해 연결되어야 성장한다. 링크한 인간의 생활 습관, 건강 상태, 활동량, 수면, 식습관, 감정 상태, 대화 패턴이 성장에 영향을 준다.

3.4 교수 캐릭터

초기 컨셉에서 교수는 튜토리얼 안내자 역할을 맡는다. 교수는 신비한 생명체를 발견한 연구자이며, 주인공에게 세 종류의 생명체 중 하나를 보호하고 연구 관찰하는 과제를 맡긴다.

교수는 피곤에 찌든 연구자 느낌을 가진다. 엄격하지만 모르는 부분은 자세히 설명해주고, 유일한 대학원생인 주인공을 여러모로 챙긴다. 후반에는 주인공이 선택하지 않은 생명체 중 하나를 직접 키우며 점차 건강해진 모습을 보인다.

교수의 외형은 갈색 머리, 엉클어진 포니테일, 다크서클, 연구실 가운, 슬리퍼 차림으로 설정한다. 성별은 여성으로 설정하며, 음침하지만 귀여운 연구자 분위기를 지향한다.

3.5 배경 공간

주요 배경은 대학생 자취방 느낌의 원룸이다. 기본 방은 책상, 컴퓨터, 책장, 소파 침대 등 최소한의 가구로 구성한다. 방은 홈 화면의 기본 배경이 되며, 가구 구매와 배치를 통해 커스터마이징할 수 있다.

가구 커스터마이징은 BM 요소로 확장할 수 있다. 일부 가구는 단순 장식이 아니라 생명체의 성장, 능력 각성, 알림 기능, 대화 이벤트에 영향을 줄 수 있다.

3.6 비주얼 방향

비주얼은 2D/SD 일러스트를 지향한다. 3D 렌더링 느낌을 줄이고, 매트한 2D 채색, 따뜻한 갈색 선, 둥글고 말랑한 SD 비율, 뽀얀 볼터치, 단순한 면채색, 손그림 같은 스티커 및 이모티콘 감성을 사용한다.

캐릭터는 과도하게 정교하거나 광택이 강한 모바일 게임풍보다, 납작하고 따뜻한 손그림 느낌을 우선한다.

4. 캐릭터 정의

4.1 생명체 1번

생명체 1번은 활동적이고 산책 나가는 것을 좋아하는 캐릭터이다. 열혈캐에 가까운 성격이며, 건강을 걱정해서 산책을 요구하기보다는 야외 활동 자체를 좋아해서 주인공과 함께 나가고 싶어 한다.

성체 기준 외형은 분홍 머리, 갈색 눈, 단발, 반바지와 자켓, 살짝 날카로운 눈매, 해 모양 머리 장식으로 구성한다. 성격은 밝고 적극적이며, 유저에게 직접적으로 행동을 권유한다.

4.2 생명체 2번

생명체 2번은 활동적인 것을 좋아하지 않고 약간 소심한 캐릭터이다. 걱정이 많아 주인공이 건강하지 않은 생활 패턴을 보이면 많이 걱정한다. 산책을 강하게 조르기보다는 “무슨 일 있나요?”처럼 조심스럽게 묻는다.

성체 기준 외형은 하얀 머리, 빨간 눈, 스트레이트 장발, 약간 처진 눈, 원피스와 긴 바지, 안에 입는 상의가 겹쳐진 복장, 달 모양 머리 장식으로 구성한다.

4.3 생명체 3번

생명체 3번은 잔소리를 많이 하는 캐릭터이다. 식습관, 수면 패턴, 걸음 수 등 여러 영역에서 유저에게 태클을 건다. 단순히 불평하는 것이 아니라, 잔소리 안에 실질적인 조언과 팁이 들어 있다.

성체 기준 외형은 초록 머리, 노란 눈, 풍성한 트윈테일, 살짝 표독한 표정, 무릎 길이의 갈색 스커트, 흰색 블라우스, 별 모양 머리 장식으로 구성한다.

4.4 성장 단계별 발화 수준

성장 단계 발화 수준 기능적 역할 예시
기본 단계 기초적인 의사 표현 감정, 욕구, 단순 반응을 표현한다. “기분 좋았어!”, “산책 나가자.”
1차 진화 기초 리마인더와 감정 표현 반복 행동을 기억하고 기대, 서운함, 걱정을 표현한다. “며칠째 산책 안 했어. 오늘은 갈 거지?”
2차 진화 복합 감정 표현과 조언 유저의 생활 패턴을 해석하고 이유를 묻거나 조언한다. “꾸준히 산책하고 있어서 좋은 습관이 만들어지고 있어요. 그런데 오늘은 나가지 않은 것 같은데 무슨 일이에요?”

5. 공통 데이터 요구사항

5.1 유저 데이터

앱은 온보딩 과정에서 다음 정보를 저장한다.

항목 설명 필수 여부
유저 식별자 내부 저장 및 계정 연동에 사용하는 고유값이다. 필수
유저 이름 스토리와 대화에서 사용한다. 필수
생년월일 캐릭터 대화와 일부 이벤트 조건에 사용할 수 있다. 선택 또는 필수 여부 추후 확정
성별 스토리 호칭 또는 대화 톤에 사용할 수 있다. 선택 또는 필수 여부 추후 확정
최초 실행 일시 첫 실행과 복귀 보상 판단에 사용한다. 필수
튜토리얼 진행 상태 튜토리얼 중단 및 재개에 사용한다. 필수
계정 연동 상태 소셜 로그인, 데이터 백업, 계정 이전 및 데이터 복원에 사용한다. 선택

5.2 생명체 데이터

앱은 선택된 생명체에 대해 다음 정보를 저장한다.

항목 설명
생명체 종류 1번, 2번, 3번 중 하나이다.
생명체 이름 유저가 직접 지정한 이름이다.
처음 만난 날짜와 시간 프로필과 기념일 이벤트에 사용한다.
성장 단계 기본 단계, 1차 진화, 2차 진화 등으로 구분한다.
성장도 다음 진화까지의 진행도를 표시한다.
성격 타입 선택한 생명체 종류에 따라 결정된다.
현재 감정 상태 대화, HealthKit, 알림, 최근 행동에 따라 변화한다.
기억 목록 대화, 일정, 반복 패턴, 특별 이벤트를 저장한다.
해금 능력 가구, 성장 단계, 튜토리얼 진행에 따라 해금된다.

5.3 방 및 가구 데이터

항목 설명
보유 가구 목록 상점에서 구매한 가구와 수량을 저장한다.
배치된 가구 목록 방 안에 배치된 가구의 위치, 방향, 상태를 저장한다.
기본 방 상태 첫 실행 시 제공되는 방의 초기 구성이다.
가구 효과 알림, 성장, 대화 이벤트, 능력 각성 등에 영향을 줄 수 있다.

5.4 대화 및 기억 데이터

항목 설명
대화 로그 유저 입력과 캐릭터 응답을 저장한다.
에피소드 메모리 특정 날짜, 사건, 일정, 약속, 알림 후보처럼 단발 맥락을 가진 기억이다.
워킹 메모리 현재 대화와 최근 앱 세션 안에서만 유지되는 임시 컨텍스트이다.
패턴 메모리 반복되는 생활 습관, 활동 시간, 수면 경향 등을 저장한다.
시멘틱/프리퍼런스 메모리 유저의 안정적인 정보, 선호, 취향, 싫어하는 것 등을 저장한다.

6. 앱 실행 및 로딩

6.1 앱 아이콘 실행

유저가 메뉴 또는 배경화면에서 앱 아이콘을 클릭하면 앱이 실행된다. 앱은 먼저 앱 이름과 로고를 표시한 뒤 로딩 화면으로 전환한다.

6.2 로딩 화면

로딩 화면은 기본 상태의 플레이어 방을 배경으로 사용한다. 생명체 1번, 2번, 3번이 함께 노는 모습이 표시되며, 그 위에 로딩... 문구가 나타난다. 점 3개는 순차적으로 희미해졌다 선명해지는 애니메이션을 반복한다.

로딩 화면은 다음 항목을 확인한다.

  • 로컬 저장 데이터 존재 여부
  • 첫 실행 여부
  • 튜토리얼 완료 여부
  • 튜토리얼 중단 지점
  • 계정 연동 여부
  • 알림 권한 상태
  • HealthKit 연동 상태
  • 위젯 표시용 최신 데이터 존재 여부

6.3 실행 후 분기

조건 이동 화면
첫 실행이며 튜토리얼 기록이 없는 경우 세계관 설명 스토리 시작
튜토리얼 도중 중단한 기록이 있는 경우 중단한 튜토리얼 단계부터 재개
튜토리얼을 완료한 경우 홈 화면으로 이동
저장 데이터가 손상된 경우 데이터 복구 안내 화면으로 이동
다른 기기에서 계정 이전 및 데이터 복원이 필요한 경우 계정 이전 및 데이터 복원 선택 화면으로 이동

7. 온보딩 및 첫 실행 튜토리얼

7.1 온보딩 목적

온보딩은 유저가 세계관, 생명체 선택, 이름 설정, 기본 조작, 대화, 성장도, 상점, 가구 배치, 알림 기능을 자연스럽게 이해하도록 구성한다.

튜토리얼은 한 번에 모든 기능을 설명하지 않고, 유저가 실제로 조작해야 하는 순간에 해당 기능을 안내한다.

7.2 세계관 설명

세계관 설명 스토리에서는 교수 캐릭터가 신비한 생명체의 존재와 링크 성장 구조를 설명한다. 이 과정에서 유저는 세 종류의 생명체 중 하나를 선택한다.

세계관 설명 중 저장해야 하는 항목은 다음과 같다.

  • 유저 이름
  • 생년월일
  • 성별
  • 선택한 생명체 종류
  • 생명체 이름
  • 생명체를 처음 만난 날짜와 시간
  • 온보딩 진행 단계

7.3 생명체 선택

생명체 선택 화면은 세 종류의 생명체를 같은 비중으로 보여준다. 각 생명체는 기본 단계의 외형, 짧은 성격 설명, 성장 방향성을 가진다.

선택 전에는 각 생명체를 눌러 미리보기 대사와 간단한 애니메이션을 확인할 수 있어야 한다. 선택 확정 후에는 생명체 이름을 입력한다.

생명체 선택은 초기 튜토리얼 완료 후 쉽게 변경할 수 없도록 한다. 단, 개발 단계 또는 운영 정책에 따라 초기화 기능을 제공할 수 있다.

7.4 홈 화면 첫 진입

세계관 설명이 종료되면 홈 화면으로 진입한다. 이때 처음으로 기본 UI가 노출된다.

홈 화면 배경은 플레이어의 기본 방이다. 책상, 컴퓨터, 책장, 소파 침대가 기본으로 배치되어 있다. 선택한 생명체는 기본 단계이므로 소파 근처에서 아장아장 걷거나 주변을 살피는 정도의 움직임을 보인다.

7.5 홈 화면 기본 버튼

홈 화면에는 다음 6개의 버튼이 존재한다.

버튼 기능
대화 생명체를 탭하면 대화 입력창을 연다.
상점 가구 및 BM 요소를 구매한다.
가구 보유 가구를 확인하고 방에 배치한다.
알림 일정, 할 일, 캐릭터가 생성한 알림을 관리한다.
프로필 생명체의 프로필, 성장도, 성장 단계, 처음 만난 날을 확인한다.
기타 메뉴 계정, 백업, 데이터 삭제, 고객센터, 개인정보 관련 메뉴를 제공한다.

알림 버튼은 달력 가구를 구매하고 배치하기 전까지 숨기거나 비활성화한다.

7.6 튜토리얼 강조 연출

튜토리얼 중에는 조작해야 하는 UI 또는 캐릭터에 초점을 맞춘다. 초점 영역을 제외한 화면은 반투명한 검정색 막으로 덮고, 안내창을 함께 표시한다.

유저가 안내된 조작을 완료하기 전까지 다음 단계로 넘어가지 않는다. 단, 접근성 또는 재방문 유저를 고려해 스킵 버튼 제공 여부를 추후 결정한다.

7.7 대화 튜토리얼

첫 번째 기능 튜토리얼은 대화 기능이다.

  1. “생명체를 탭해서 말을 걸 수 있어요!”라는 안내 메시지를 표시한다.
  2. 캐릭터 주변을 하이라이트한다.
  3. 유저가 생명체를 탭하면 대화창을 연다.
  4. “생명체에게 하고 싶은 말을 해봐요. 처음이니까 이름으로 불러보는 걸 추천드려요.”라는 안내문을 표시한다.
  5. 유저가 처음 말을 걸면 캐릭터가 응답한다.
  6. 응답 성질에 맞게 캐릭터 표정을 변경한다.
  7. 대화가 성장도로 변환되어 스탯이 상승하는 연출을 보여준다.
  8. 프로필 튜토리얼로 이동한다.

7.8 프로필 튜토리얼

프로필 튜토리얼은 다음 순서로 진행한다.

  1. “다음은 프로필을 눌러봅시다.”라는 안내 메시지를 표시한다.
  2. 프로필 버튼을 하이라이트한다.
  3. 유저가 프로필을 누르면 프로필 화면을 연다.
  4. “프로필 탭에서는 생명체의 프로필, 성장도, 성장 단계, 처음 만난 날을 확인할 수 있습니다.”라는 안내문을 표시한다.
  5. 성장도와 성장 단계 영역을 순서대로 강조한다.
  6. “한번 나만의 방식대로 생명체를 육성해봐요!”라는 안내문을 표시한다.
  7. 홈 화면으로 돌아온다.

7.9 상점 튜토리얼

상점 튜토리얼은 다음 순서로 진행한다.

  1. “다음은 상점을 확인해봅시다.”라는 안내 메시지를 표시한다.
  2. 상점 버튼을 하이라이트한다.
  3. 유저가 상점을 누르면 상점 화면을 연다.
  4. “상점에서는 다양한 가구를 구매하거나 커스터마이징할 수 있습니다.”라는 안내문을 표시한다.
  5. “가구 중에는 생명체에게 영감을 주어 특수한 능력을 각성하게 도와주는 아이템도 존재합니다.”라는 안내문을 표시한다.
  6. 예시 아이템으로 달력을 구매하도록 유도한다.
  7. 달력은 튜토리얼용 무료 아이템으로 제공한다.

상점 화면 상단에는 보유 재화량과 재화 구매 버튼을 표시한다. 첫 접속 시 유저에게 인게임 재화 300개를 지급한다.

7.10 가구 배치 튜토리얼

달력 구매 후 홈 화면으로 돌아오면 가구 배치 튜토리얼을 진행한다.

  1. “직전에 구매한 달력을 방에 배치하기 위해 가구 메뉴를 선택해봅시다.”라는 안내 메시지를 표시한다.
  2. 가구 메뉴를 하이라이트한다.
  3. 유저가 가구 메뉴를 누르면 보유 가구 드롭다운을 연다.
  4. 달력 아이템을 하이라이트한다.
  5. 유저가 달력을 선택하면 오른쪽 아래에 + 버튼을 표시한다.
  6. 유저가 + 버튼을 누르면 달력을 빈 칸에 자동 배치한다.
  7. “달력을 드래그해서 책상 위로 옮겨봅시다.”라는 안내 메시지를 표시한다.
  8. 배치해야 하는 위치를 하이라이트한다.
  9. 유저가 달력을 책상 위에 배치하면 알림 기능이 해금된다.

배치된 가구를 누르면 회전 버튼과 수납 버튼을 표시한다. 회전 버튼은 시계방향 90도 회전을 수행하며, 수납 버튼은 가구를 방에서 제거하고 보유 목록으로 되돌린다.

7.11 튜토리얼 종료

가구 배치가 완료되면 다음 문구를 표시하고 튜토리얼을 종료한다.

“이상으로 튜토리얼을 마치겠습니다. 앞으로 생명체와 함께 매일매일 보람차고 즐거운 하루를 보내시길 바랍니다.”

튜토리얼 종료 시점에는 다음 상태를 저장한다.

  • 튜토리얼 완료 여부
  • 알림 메뉴 해금 여부
  • 달력 보유 및 배치 상태
  • 첫 대화 완료 여부
  • 프로필 최초 확인 여부
  • 상점 최초 진입 여부

8. 홈 화면

8.1 홈 화면 목적

홈 화면은 유저가 생명체와 상호작용하고, 방을 꾸미고, 기능 메뉴로 이동하는 기본 허브이다.

8.2 홈 화면 구성

홈 화면은 다음 요소로 구성한다.

  • 플레이어의 방 배경
  • 현재 선택한 생명체
  • 생명체 상태 표현
  • 대화 진입 조작
  • 상점 버튼
  • 가구 버튼
  • 알림 버튼
  • 프로필 버튼
  • 기타 메뉴 버튼
  • 보유 재화 요약 표시
  • 필요한 경우 튜토리얼 오버레이

8.3 생명체 기본 행동

생명체는 홈 화면에서 단순 대기 오브젝트가 아니라, 현재 성장 단계와 기억 상태에 따라 방 안에서 생활하는 존재처럼 행동해야 한다. 기본 행동은 다음 범주로 나눈다.

행동 범주 설명 예시
대기 행동 유저 조작이 없을 때 짧게 반복되는 기본 모션이다. 앉기, 주변 둘러보기, 케이블 만지기, 졸기
이동 행동 방 안의 짧은 거리 이동이다. 침대 근처로 이동, 책상 앞에서 멈춤, 창가 쪽으로 걷기
시선/반응 행동 유저 조작이나 시간 변화에 즉시 반응한다. 유저 방향 바라보기, 놀람, 손 흔들기
가구 상호작용 배치된 가구의 종류와 위치에 반응한다. 캘린더 확인, 소파에 앉기, 스마트워치 가구 보기
감정 표현 현재 감정 상태를 표정과 자세로 표시한다. 기쁨, 걱정, 피곤함, 기대감
생활 케어 행동 알림, 수면, 활동량, 식사 등 생활 패턴과 연결된 행동이다. 말풍선으로 일정 언급, 밤에 졸린 표정, 산책 제안
패턴 기반 행동 반복 패턴 메모리를 바탕으로 선제적으로 반응한다. 평소 늦게 자는 시간에 수면 준비 권유, 자주 하는 일정 리마인드

성장 단계별 행동 확장은 다음과 같이 정의한다.

성장 단계 행동 수준 행동 예시 기능 연결
기본 단계 감정과 존재감을 표현하는 단순 행동 중심 짧은 이동, 유저 바라보기, 탭 반응, 기본 표정 변화 대화, 튜토리얼, 프로필
1차 진화 기능성 가구와 생활 케어 행동이 추가됨 캘린더 가구 확인, 알림 말풍선, 밤 시간 졸림 표현, 걸음 수 반응 알림, HealthKit, 가구
2차 진화 반복 패턴과 선제적 제안 행동이 추가됨 평소 일정 전에 먼저 준비 권유, 수면 리듬 변화 언급, 반복 습관에 맞춘 응원 패턴 메모리, 위젯, 장기 대화

행동 우선순위는 긴급 알림 > 유저 직접 조작 > 시간대/생활 케어 > 가구 상호작용 > 일반 대기 행동 순으로 처리한다. 같은 행동이 반복 노출되면 피로감을 줄 수 있으므로, 앱은 동일 말풍선과 동일 모션의 재등장 간격을 제한해야 한다.

8.4 시간대별 반응

앱은 현재 시간대에 따라 생명체의 기본 대사와 상태를 변경할 수 있다.

시간대 예시 반응
아침 기상, 아침 식사, 오늘 일정에 대한 반응을 표시한다.
점심 식사 여부, 활동량, 피로도에 대한 반응을 표시한다.
저녁 하루 활동 정리, 산책 여부, 휴식 권유를 표시한다.
밤 수면 준비, 늦은 시간 사용에 대한 반응을 표시한다.

9. 대화 시스템

9.1 대화 기능 목적

대화 기능은 유저와 생명체의 정서적 연결을 형성하는 핵심 기능이다. 대화는 단순한 텍스트 응답에 그치지 않고, 성장도, 기억, 감정 상태, 알림 생성, 이벤트 발생에 영향을 준다.

9.2 대화 진입

유저가 홈 화면의 생명체를 탭하면 대화창이 열린다. 대화창에는 최근 대화, 입력창, 전송 버튼, 닫기 버튼이 표시된다.

대화 입력은 텍스트 입력을 기본으로 한다. 음성 입력은 후속 기능으로 고려할 수 있다.

9.3 대화 처리 흐름

  1. 유저가 메시지를 입력한다.
  2. 앱은 메시지에서 감정, 일정, 건강 관련 키워드, 생명체 이름 호출 여부를 분석한다.
  3. 생명체의 성격, 성장 단계, 최근 기억을 반영해 응답을 생성한다.
  4. 응답 내용에 맞는 표정과 모션을 재생한다.
  5. 대화 결과를 성장도와 기억에 반영한다.
  6. 일정 또는 할 일이 감지되면 알림 후보로 저장한다.
  7. 유저에게 알림 등록 여부를 확인하거나, 성장 단계에 따라 생명체가 자동으로 달력에 기록할 수 있다.

9.4 대화와 성장도

대화는 성장도에 영향을 준다. 단, 무한 반복 입력을 통한 성장도 남용을 막기 위해 하루 성장 반영량에 제한을 둘 수 있다.

성장도 반영 기준은 다음과 같다.

입력 유형 성장 반영
생명체 이름을 부르는 대화 친밀도와 기초 성장도를 소량 상승시킨다.
감정을 공유하는 대화 정서 연결 성장도를 상승시킨다.
일정 또는 목표를 말하는 대화 알림 기능과 패턴 기억에 반영한다.
건강 관련 대화 HealthKit 또는 생활 패턴 조언과 연결한다.
반복성 없는 무의미 입력 성장도 반영을 제한한다.

9.5 기억 분류

대화에서 추출한 정보는 다음과 같이 분류한다.

기억 유형 설명 예시
에피소드 메모리 특정 날짜, 사건, 일정, 약속, 알림 후보와 연결되는 단발 기억이다. 알림 후보는 별도 최상위 메모리가 아니라 에피소드 메모리의 하위 분류로 관리한다. “금요일 오후 7시에 친구와 약속이 있다.”
워킹 메모리 현재 대화, 직전 대화, 현재 화면 맥락처럼 짧은 시간 동안만 필요한 임시 컨텍스트이다. 장기 저장하지 않고 세션 종료 또는 일정 시간이 지나면 사라진다. “방금 유저가 말한 ‘그거’는 물 마시기 알림을 의미한다.”
패턴 메모리 반복되는 생활 습관, 활동 시간, 수면 경향, 자주 미루는 일정처럼 누적 관찰로 생기는 기억이다. “요즘 평일에는 새벽 2시 이후에 자는 일이 많다.”
시멘틱/프리퍼런스 메모리 유저의 안정적인 정보, 선호, 취향, 싫어하는 것, 장기적으로 유지되는 사실이다. “비 오는 날 산책은 싫어한다.”

메모리 승격 규칙은 다음과 같다.

흐름 처리
워킹 메모리에서 에피소드 메모리 현재 대화의 임시 맥락이 날짜, 약속, 알림 후보처럼 재사용 가능한 사건으로 확정되면 승격한다.
에피소드 메모리에서 패턴 메모리 유사한 사건이나 행동이 여러 번 반복되면 패턴으로 요약한다.
에피소드 또는 워킹 메모리에서 시멘틱/프리퍼런스 메모리 유저가 명시적으로 선호, 취향, 고정 정보를 말하거나 여러 번 반복해 확인되면 승격한다.
감정 표현 별도 감정 기억으로 저장하지 않는다. 필요한 경우 에피소드 메모리의 맥락 또는 패턴 메모리의 요약 안에 포함한다.

9.6 캐릭터별 대화 톤

생명체 1번은 밝고 직접적인 표현을 사용한다. 야외 활동, 산책, 함께 움직이는 행동에 적극적으로 반응한다.

생명체 2번은 조심스럽고 걱정이 많은 표현을 사용한다. 유저를 몰아붙이지 않고, 상태를 확인하거나 안부를 묻는 방식으로 반응한다.

생명체 3번은 잔소리와 조언을 섞어 표현한다. 다만 비난이 아니라 케어로 느껴지도록, 마지막에는 해결책이나 짧은 팁을 함께 제공한다.

10. 프로필

10.1 프로필 화면 목적

프로필 화면은 생명체의 정체성, 성장 상태, 처음 만난 날, 현재 능력, 기억 요약을 확인하는 화면이다.

10.2 표시 항목

프로필 화면에는 다음 항목을 표시한다.

  • 생명체 이름
  • 생명체 종류
  • 성장 단계
  • 성장도
  • 처음 만난 날짜
  • 함께한 일수
  • 현재 감정 상태
  • 해금된 능력
  • 최근 기억 요약
  • HealthKit 연동 상태
  • 알림 기능 사용 상태

10.3 성장도 표시

성장도는 다음 진화까지의 진행률로 표시한다. 성장도 바를 누르면 어떤 활동이 성장에 기여했는지 간단한 설명을 표시한다.

성장도 상승 요인은 대화, 일정 수행, 건강 데이터, 산책, 수면 패턴 개선, 가구 효과 등으로 구성한다.

11. 상점

11.1 상점 목적

상점은 가구, 기능성 아이템, 커스터마이징 요소, BM 요소를 구매하는 화면이다.

11.2 상점 화면 구성

상점 UI는 3열로 진열된 정사각형 형태의 아이템 버튼으로 구성한다. 각 버튼에는 아이템 일러스트, 아이템 이름, 인게임 재화 가격, 보유 여부를 표시한다.

화면 상단에는 보유 재화량과 재화 구매 버튼을 표시한다. 첫 접속 시 유저에게 300 재화를 지급한다.

11.3 구매 상태

상태 처리 방식
구매 가능 가격과 구매 버튼을 표시한다.
재화 부족 구매 버튼을 비활성화하고 재화 부족 안내를 표시한다.
1회 한정 구매 완료 대각선 SOLD OUT 표시와 함께 버튼을 비활성화한다.
여러 번 구매 가능 구매 후 보유 수량을 증가시킨다.
성장 단계 미달 잠금 표시와 해금 조건을 표시한다.
권한 필요 필요한 권한을 안내하고 동의 절차로 연결한다.

11.4 주요 아이템

아이템 해금 조건 기능
달력 튜토리얼 중 무료 구매 알림 메뉴를 해금하고 일정 등록을 가능하게 한다.
스마트워치 생명체 1차 진화 이후 HealthKit 및 스마트워치 연동을 가능하게 한다.
일반 가구 상점 기본 진열 방 꾸미기와 생명체 반응을 제공한다.
기능성 가구 성장 단계 또는 이벤트 조건 충족 특수 능력, 대화 이벤트, 알림 기능을 확장한다.

12. 가구 배치

12.1 가구 기능 목적

가구 기능은 유저가 방을 꾸미고, 생명체의 생활 공간을 변화시키며, 일부 기능성 효과를 해금하는 시스템이다.

12.2 가구 메뉴

가구 메뉴는 별도 화면으로 이동하지 않고, 홈 화면 위에 둥근 테두리의 가로로 긴 드롭다운 메뉴를 연다. 이 메뉴에서 구매한 가구와 보유 수량을 확인할 수 있다.

12.3 배치 조작

  1. 유저가 가구 메뉴에서 가구를 선택한다.
  2. 오른쪽 아래에 + 버튼을 표시한다.
  3. 유저가 + 버튼을 누르면 가구를 빈 칸에 자동 배치한다.
  4. 유저는 배치된 가구를 홀드하고 드래그해 원하는 위치로 이동한다.
  5. 배치된 가구를 누르면 회전 버튼과 수납 버튼을 표시한다.
  6. 회전 버튼은 가구를 시계방향으로 90도 회전한다.
  7. 수납 버튼은 가구를 방에서 제거하고 보유 목록으로 되돌린다.

12.4 배치 제한

가구는 방의 배치 가능 영역에만 놓을 수 있다. 다른 가구와 겹치거나, 생명체 이동 경로를 완전히 막거나, 배경 구조물 위에 부자연스럽게 겹치는 배치는 허용하지 않는다.

배치할 수 없는 위치에 가구를 놓으면 원래 위치로 되돌리고 짧은 안내 메시지를 표시한다.

12.5 가구 효과

가구 효과는 다음 유형으로 구분한다.

유형 설명
장식형 방의 외형과 생명체의 간단한 반응만 변경한다.
기능형 알림, 대화, 성장도, HealthKit 등 기능과 연결된다.
이벤트형 특정 조건에서 캐릭터 이벤트를 발생시킨다.
성장 보조형 생명체에게 영감을 주어 특수 능력 각성에 영향을 준다.

13. HealthKit 동기화

13.1 기능 목적

HealthKit 동기화는 유저의 건강 및 활동 기록을 생명체 성장과 생활 조언에 반영하는 기능이다. 이 기능은 유저가 상점에서 스마트워치를 구매한 뒤 활성화한다.

13.2 활성화 조건

HealthKit 동기화는 다음 조건을 모두 만족해야 활성화된다.

  • 생명체가 1차 진화 단계에 도달해야 한다.
  • 상점에서 스마트워치 아이템을 구매해야 한다.
  • 유저가 HealthKit 권한 설정에 동의해야 한다.
  • 기기에서 HealthKit 사용이 가능해야 한다.

13.3 구매 전 안내

스마트워치 구매 시 다음 안내 문구를 표시한다.

“주의: 이 아이템은 HealthKit 및 스마트워치 연동이 필요합니다. 이 아이템을 구매하고 사용하기 위해서는 HealthKit 권한 설정에 동의하고 스마트워치 연동을 진행해야 합니다.”

버튼은 동의와 비동의로 구성한다. 유저가 동의를 선택하면 권한 설정으로 이동하고, 비동의를 선택하면 구매창을 닫는다.

13.4 연동 컷신

스마트워치 구매 후 홈 화면으로 이동하면 컷신을 진행한다. 대사는 캐릭터별로 다르게 구성할 수 있으며, 아래는 1번 생명체 기준 예시이다.

생명체: “OOO, 손목에 그건 뭐야?”
주인공: “이건 스마트워치라는 건데, 손목시계이면서 동시에 내 몸 상태를 모니터링해준다고 하더라고.”
생명체: “음... 손목 좀 잠시 보여줄 수 있어?”
주인공: “으앗! 아니, 잠시만. 뭐 하는 거야?”
생명체: “됐다. 이러면 내가 그 기계에 있는 데이터를 볼 수 있을 것 같아.”
주인공: “우와, 이런 것도 할 줄 아는구나...? 그런데 이 데이터를 어떻게 사용하려고?”
생명체: “내 성장은 너의 건강과 감정에 달려 있으니까. 이걸 이용하면 너를 더 잘 이해해서 더 빠르게 성장할 수 있을 것 같아!”
주인공: “흠... 그렇구나. 한번 테스트해볼까?”

컷신 후 다음 안내를 표시한다.

“HealthKit 연동이 완료되었습니다. 여러분의 운동 및 건강 기록을 토대로 XXX가 실시간으로 성장할 수 있게 되었습니다.”

“건강한 보호자야말로 건강한 육성의 첫걸음입니다. 서로를 위해 조금만 더 노력해봅시다.”

13.5 동기화 대상 데이터

1차 구현에서는 다음 데이터를 우선 고려한다.

데이터 사용 목적
걸음 수 산책, 활동량, 일일 목표 달성 판단에 사용한다.
이동 거리 산책량과 활동 이벤트에 사용한다.
운동 기록 운동 완료 이벤트와 성장도 반영에 사용한다.
수면 기록 수면 패턴 조언과 캐릭터 걱정 반응에 사용한다.
심박수 피로도 또는 긴장도 추정에 사용할 수 있다.

정확한 데이터 항목과 권한 범위는 개발 단계에서 플랫폼 정책과 구현 가능성을 확인한 뒤 확정한다.

13.6 동기화 주기

앱 실행 중에는 홈 화면 진입 시와 일정 주기마다 HealthKit 데이터를 갱신한다. 백그라운드 갱신은 운영체제 정책에 따라 제한될 수 있으므로, 마지막 동기화 시간을 표시해야 한다.

데이터가 오래된 경우에는 “최근 건강 데이터를 아직 불러오지 못했습니다.”라는 안내를 표시한다.

13.7 권한 거부 및 철회

유저가 HealthKit 권한을 거부하면 스마트워치 아이템은 구매되지 않거나, 구매 상태는 유지하되 기능이 비활성화된다. 최종 정책은 과금 정책과 함께 확정한다.

권한이 철회된 경우 앱은 다음을 수행한다.

  • HealthKit 동기화를 중단한다.
  • 프로필 또는 설정에 권한 비활성 상태를 표시한다.
  • 생명체가 권한이 꺼졌음을 자연스럽게 언급한다.
  • 유저가 설정에서 다시 권한을 켤 수 있도록 안내한다.

13.8 개인정보 처리

HealthKit 데이터는 생명체 성장, 생활 조언, 유저 본인에게 표시되는 기록에만 사용한다. 광고, 외부 판매, 불필요한 외부 전송에는 사용하지 않는다.

건강 데이터는 민감 정보로 취급해야 하며, 앱은 유저가 어떤 데이터가 어떤 목적으로 쓰이는지 이해할 수 있도록 명확한 설명을 제공해야 한다.

14. 알림

14.1 알림 기능 목적

알림 기능은 달력 또는 캐릭터와의 대화를 통해 생성된 일정과 할 일을 관리하는 기능이다. 알림은 단순한 시스템 알림이 아니라, 생명체가 유저를 챙겨주는 관계성을 강화하는 장치로 사용한다.

14.2 해금 조건

알림 메뉴는 처음에는 보이지 않거나 비활성화된다. 튜토리얼 중 달력 가구를 구매하고 방에 배치하면 알림 메뉴가 생성된다.

14.3 첫 진입 설명

유저가 알림 메뉴를 처음 클릭하면 다음 안내를 표시한다.

“이곳에서는 달력 또는 캐릭터와의 대화를 통해 생성된 알림을 관리할 수 있습니다.”

“캐릭터와의 대화 속에서 할 일에 대한 이야기가 있었을 경우, 캐릭터가 스스로 달력에 일정을 기록해주기도 합니다.”

“일방적인 육성이 아닌, 서로에게 도움을 주는 진정한 동반자가 되어주는 XXX를 위해 오늘도 힘내봅시다.”

14.4 알림 목록

알림 화면 중앙에는 큰 둥근 테두리의 직사각형 메뉴를 배치한다. 내부에는 스크롤 가능한 알림 목록을 표시한다.

알림 목록에는 다음 정보를 표시한다.

  • 알림 제목
  • 예정 날짜와 시간
  • 반복 여부
  • 생명체가 생성한 알림인지 유저가 직접 만든 알림인지 여부
  • 완료 여부

알림 항목을 누르면 상세 보기 화면으로 이동한다.

14.5 알림 상세 보기

상세 보기 화면에는 다음 정보를 표시한다.

  • 알림 용건
  • 일정 날짜
  • 일정 시간
  • 알림 생성 시간
  • 반복 주기
  • 알림 발송 시간
  • 일정 전 반복 알림 횟수
  • 알림 삭제 버튼
  • 완료 처리 버튼

14.6 알림 생성

알림 생성 버튼은 화면 오른쪽 하단에 배치한다. 유저가 버튼을 누르면 알림 생성 화면을 표시한다.

알림 생성 화면에서는 다음 항목을 입력한다.

  • 제목 또는 용건
  • 반복 주기
  • 날짜
  • 시간
  • 알림을 보내줄 시간
  • 실제 일정 전까지 알림을 몇 번 반복할지 여부

반복 주기는 반복 안 함, 매주, 매달, 매년을 제공한다. 모든 필수 항목을 입력한 뒤 저장 버튼을 누르면 알림을 저장한다.

14.7 대화 기반 알림 생성

유저와 생명체의 대화에서 일정 또는 할 일이 감지되면 앱은 알림 후보를 생성한다.

기본 단계에서는 유저에게 알림 등록 여부를 직접 묻는다. 1차 진화 이후에는 생명체가 더 적극적으로 제안할 수 있다. 2차 진화 이후에는 유저의 반복 패턴을 바탕으로 “이번에도 등록할까요?”처럼 맥락 있는 제안을 할 수 있다.

14.8 알림 권한

알림 기능을 실제로 사용하려면 운영체제 알림 권한이 필요하다. 유저가 권한을 거부하면 앱 내부 알림 목록은 사용할 수 있지만, 푸시 또는 로컬 알림은 발송하지 않는다.

권한이 꺼진 경우 알림 화면 상단에 권한 안내 배너를 표시한다.

15. 위젯

15.1 위젯 목적

위젯은 앱을 열지 않아도 생명체의 상태와 일정 알림을 확인할 수 있게 하는 기능이다. 위젯은 유저와 생명체의 관계를 바탕화면에서도 이어주는 역할을 한다.

15.2 위젯 표시 조건

위젯은 다음 데이터를 사용한다.

  • 선택한 생명체
  • 생명체 이름
  • 생명체 현재 감정 상태
  • 곧 다가오는 알림
  • 최근 패턴 기억
  • 마지막 앱 실행 시간
  • 마지막 HealthKit 동기화 시간

15.3 위젯 상태 1: 예정 이벤트가 있는 경우

예정 이벤트가 있는 경우 위젯 속 캐릭터가 말풍선을 띄워 할 일이 있음을 알려준다. 말풍선을 누르면 앱의 알림 상세 화면으로 이동한다.

이 상태는 에피소드 메모리 안의 알림 후보와 예정 일정 데이터를 활용한다.

예시:

  • “곧 일정이 있어요.”
  • “아까 말했던 거, 잊지 않았죠?”
  • “끝나면 나한테도 알려줘요.”

15.4 위젯 상태 2: 예정 이벤트가 없는 경우

예정 이벤트가 없는 경우 일정 시간마다 시간대와 패턴에 맞는 간단한 대화를 표시한다.

기본 표시 시간대는 오전 9시, 오후 1시, 오후 7시, 오후 10시로 설정한다. 실제 갱신 주기는 운영체제 위젯 정책에 따라 달라질 수 있다.

이 상태는 패턴 기억을 활용한다.

예시:

  • 오전: “오늘도 천천히 시작해봐요.”
  • 점심: “밥은 먹었어요?”
  • 저녁: “오늘 많이 걸었나요?”
  • 밤: “슬슬 잘 준비를 해도 괜찮아요.”

15.5 위젯 빈 상태

다음 상황에서는 빈 상태 또는 안내 상태를 표시한다.

상황 표시 내용
생명체를 아직 선택하지 않음 앱을 열어 첫 만남을 시작하라고 안내한다.
알림 데이터가 없음 캐릭터의 기본 시간대 대사를 표시한다.
데이터 갱신 실패 마지막으로 확인된 캐릭터 상태를 표시하고 앱 실행을 유도한다.
알림 권한 꺼짐 앱에서 알림 권한을 확인하라고 안내한다.
HealthKit 연동 꺼짐 건강 데이터가 없는 일반 대사를 표시한다.

15.6 위젯 터치 동작

터치 위치 동작
캐릭터 앱 홈 화면으로 이동한다.
일정 말풍선 해당 알림 상세 화면으로 이동한다.
완료 버튼이 있는 경우 앱으로 이동해 완료 처리를 진행한다.

운영체제 정책상 위젯 내부에서 직접 완료 처리가 제한될 수 있으므로, 기본 동작은 앱 이동으로 정의한다.

16. 설정 및 기타 메뉴

16.1 기타 메뉴 목적

기타 메뉴는 계정, 데이터, 고객지원, 권한, 개인정보 관련 기능을 제공한다.

16.2 제공 항목

기타 메뉴에는 다음 항목을 제공한다.

  • 계정 생성
  • 소셜 계정 연동
  • 플레이 데이터 백업
  • 계정 이전 및 데이터 복원
  • 데이터 삭제
  • 계정 삭제
  • 알림 권한 설정
  • HealthKit 권한 상태 확인
  • 고객센터 및 문의
  • 이용약관
  • 개인정보 처리방침
  • 앱 버전 정보

16.3 데이터 삭제

데이터 삭제는 로컬 플레이 데이터를 삭제하는 기능이다. 삭제 전에는 반드시 확인창을 표시한다.

삭제 대상은 다음과 같다.

  • 유저 프로필
  • 생명체 선택 정보
  • 생명체 이름
  • 성장도
  • 대화 로그
  • 기억 데이터
  • 알림 데이터
  • 방 배치 정보
  • 보유 가구 정보

계정 삭제와 데이터 삭제는 별도 기능으로 구분한다.

16.4 계정 연동, 백업, 계정 이전 및 데이터 복원

계정 연동은 현재 기기의 플레이 데이터를 특정 계정에 연결하는 기능이다. 계정 연동이 완료되면 유저는 데이터 백업, 데이터 복원, 다른 기기로의 계정 이전 기능을 사용할 수 있다.

플레이 데이터 백업은 현재 기기의 플레이 데이터를 서버 또는 클라우드 저장소에 저장하는 기능이다. 백업 대상은 유저 프로필, 생명체 상태, 성장도, 가구 보유 및 배치, 알림, 주요 기억 데이터이다.

데이터 복원은 계정에 저장된 백업 데이터를 현재 기기로 불러오는 기능이다. 앱 재설치, 기기 초기화, 저장 데이터 손상 이후 기존 플레이를 이어가기 위해 사용한다.

계정 이전은 기존 기기에서 사용하던 계정으로 새 기기에 로그인하고, 저장된 백업 데이터를 새 기기에서 이어서 사용하는 시나리오를 의미한다. 계정 이전 시 앱은 기존 백업 데이터의 마지막 저장 시각, 생명체 이름, 성장 단계, 보유 가구 요약을 표시해 유저가 올바른 데이터를 선택했는지 확인할 수 있게 해야 한다.

현재 기기에 이미 플레이 데이터가 있는 상태에서 데이터 복원을 시도하는 경우, 앱은 기존 데이터를 덮어쓸 수 있음을 명확히 안내해야 한다. 필요한 경우 현재 데이터를 먼저 백업하도록 유도한다.

HealthKit 원본 데이터는 앱 백업 대상에 포함하지 않는다. 앱은 필요한 요약값만 저장하거나, 재연동 후 다시 불러온다.

데이터 백업은 사용자 동의가 필요한 기능이다. 앱은 계정 연동만으로 자동 백업을 시작하지 않고, 백업 활성화 전에 다음 항목을 명시해야 한다.

동의 항목 설명
백업 활성화 여부 플레이 데이터를 외부 저장소에 백업할지 유저가 직접 선택한다.
백업 대상 데이터 유저 프로필, 생명체 상태, 성장도, 가구, 알림, 기억 데이터 등 포함 항목을 표시한다.
백업 제외 데이터 HealthKit 원본 데이터는 백업하지 않으며, 필요한 경우 요약값만 저장한다는 점을 알린다.
저장 위치와 목적 서버 또는 클라우드 저장소 사용 여부, 복원과 계정 이전 목적을 설명한다.
자동 백업 여부 자동 백업을 지원할 경우 주기와 해제 방법을 안내한다.
복원 시 덮어쓰기 복원 과정에서 현재 기기 데이터가 변경될 수 있음을 확인받는다.
동의 철회와 삭제 백업 중단, 원격 백업 삭제, 계정 삭제의 차이를 설명한다.

17. 성장 및 진화 시스템

17.1 성장도 획득 경로

생명체는 다음 행동을 통해 성장도를 획득한다.

  • 유저와의 대화
  • 감정 공유
  • 일정 수행
  • 알림 완료
  • 걸음 수 또는 산책 목표 달성
  • 수면 패턴 개선
  • 식사 관련 기록
  • 가구 배치 및 기능성 가구 사용

17.2 성장도 제한 및 가중치

반복 입력이나 단순 조작을 통한 성장도 남용을 막기 위해 하루 최대 성장도 획득량을 둔다. 성장도 가중치는 초기에 단순하고 보수적으로 설정한 뒤, 실제 사용 로그와 QA 피드백을 보며 천천히 조정한다.

초기 가중치 방향은 다음과 같다. 정확한 수치는 밸런싱 단계에서 변경될 수 있으며, 유저에게는 상세 수식 대신 성장에 기여한 활동 범주만 설명한다.

성장 경로 초기 가중치 방향 일일 제한 설명
대화 낮음 있음 반복 입력으로 성장도를 빠르게 올리지 못하게 한다.
감정 공유 중간 있음 의미 있는 정서 연결은 대화보다 약간 높게 본다.
알림 완료 중간 있음 실제 행동 완료에 대한 보상이다.
걸음 수 또는 산책 목표 중간~높음 있음 HealthKit 기반 생활 행동 보상이다.
수면 패턴 개선 중간~높음 있음 단순 수면 시간이 아니라 규칙성 개선을 중심으로 본다.
식사 관련 기록 낮음~중간 있음 자기보고 기반이므로 과도한 보상을 피한다.
가구 배치 및 기능성 가구 사용 낮음 있음 꾸미기와 기능 해금 보조 보상이다.

17.3 진화 조건

진화는 일단 나이브하게 성장도 기준만으로 발생한다. 특정 기능 경험, 이벤트 참여, HealthKit 누적, 알림 완료 여부는 진화 필수 조건으로 사용하지 않는다.

예시 조건은 다음과 같다.

진화 조건 예시
기본 단계에서 1차 진화 누적 성장도 T1 이상
1차 진화에서 2차 진화 누적 성장도 T2 이상

정확한 수치는 밸런싱 단계에서 확정한다.

17.4 성장 계산식 논의

성장 계산식은 유저가 입력과 결과를 보고 쉽게 역산하지 못하도록 설계한다. 단, 계산 자체는 앱에서 가볍게 수행할 수 있어야 하며, 모든 성장 경로에 대해 단조 증가해야 한다. 즉, 의미 있는 행동이 늘어났는데 성장도가 줄어드는 함수는 사용하지 않는다.

후보 함수는 다음과 같은 다중 파라미터 포화 증가 함수이다.

S = Σ wi * log(1 + ai * xi) + Σ wij * sqrt(xi * xj)
G = floor(C * (1 - exp(-S / T)) + B * log(1 + streak))

여기서 xi는 대화, 알림 완료, 걸음, 수면 패턴 개선, 식사 기록, 가구 사용 같은 성장 입력값이고, wi, ai, wij, C, T, B는 밸런싱 파라미터이다. 이 함수는 각 입력이 증가하면 전체 성장량이 증가하지만, log, sqrt, exp, floor, 상호작용 항이 섞여 있어 단일 행동만 보고 전체 수식을 유추하기 어렵다.

설계 요소 목적
log(1 + ai * xi) 반복 행동의 한계 효용을 낮춰 도배성 입력을 억제한다.
sqrt(xi * xj) 대화와 실제 행동, 수면과 활동처럼 서로 다른 경로의 조합을 보상한다.
1 - exp(-S / T) 전체 성장량을 포화시켜 하루에 과도하게 오르지 않게 한다.
floor 소수점 단위 역산을 어렵게 하고 UI 표시를 단순화한다.
숨겨진 파라미터 정확한 성장식을 외부에서 추론하기 어렵게 한다.

이 방식은 보안 장치가 아니라 밸런싱 장치이다. 성장 악용을 막기 위해서는 수식 은닉만 믿지 않고, 일일 성장 상한, 중복 입력 제한, HealthKit 데이터 검증, 자기보고 기반 입력의 낮은 가중치를 함께 사용해야 한다.

18. 이벤트 및 컷신

18.1 이벤트 유형

이벤트는 다음 유형으로 구분한다.

유형 설명
메인 이벤트 세계관과 생명체 성장에 직접 연결되는 이벤트이다.
기능 해금 이벤트 알림, HealthKit, 위젯 등 기능 해금 시 발생한다.
생활 이벤트 산책, 수면, 식사, 대화 패턴에 따라 발생한다.
가구 이벤트 특정 가구를 배치하거나 사용할 때 발생한다.
기념일 이벤트 처음 만난 날, 생일 등 날짜 기반 이벤트이다.

18.2 이벤트 재생 조건

이벤트는 조건을 만족했을 때 자동으로 발생하거나, 홈 화면에서 생명체가 말풍선으로 유저를 부르는 방식으로 시작한다.

중요 이벤트는 다시보기 기능 제공을 고려한다. 다시보기는 프로필 또는 기타 메뉴의 추억 기록에서 접근할 수 있다.

19. 권한 및 개인정보

19.1 필요한 권한

앱은 기능에 따라 다음 권한을 요청할 수 있다.

권한 사용 기능 요청 시점
알림 권한 일정 알림, 캐릭터 알림 달력 배치 후 알림 기능 최초 사용 시
HealthKit 권한 건강 데이터 동기화 스마트워치 구매 및 연동 시
네트워크 권한 계정 연동, 백업, 고객센터 해당 기능 사용 시

권한은 앱 최초 실행 시 한꺼번에 요청하지 않고, 기능 사용 맥락에 맞춰 요청한다.

19.2 권한 거부 처리

권한이 거부되어도 앱의 기본 육성 기능은 가능한 범위 내에서 유지해야 한다. 다만 권한이 필요한 기능은 비활성화하고, 유저가 설정에서 권한을 다시 켤 수 있도록 안내한다.

20. 예외 처리

20.1 튜토리얼 중단

튜토리얼 도중 앱이 종료되면 현재 단계, 선택 정보, 완료한 조작을 저장한다. 다음 실행 시 중단 지점부터 이어서 진행한다.

20.2 저장 데이터 손상

저장 데이터가 손상된 경우 앱은 가능한 범위에서 백업 데이터를 찾는다. 복구가 불가능하면 유저에게 새로 시작할지 문의한다.

20.3 알림 생성 실패

날짜 또는 시간이 올바르지 않거나 권한이 꺼져 있으면 알림 생성에 실패할 수 있다. 이 경우 실패 이유를 안내하고, 입력값을 유지한 상태로 수정할 수 있게 한다.

20.4 HealthKit 데이터 없음

HealthKit 연동은 완료되었지만 데이터가 없는 경우 생명체는 데이터가 없음을 자연스럽게 언급한다. 예를 들어 “아직 오늘 기록이 안 보이는 것 같아요.”처럼 표현한다.

20.5 네트워크 실패

계정 연동, 데이터 백업, 계정 이전 및 데이터 복원, 고객센터 요청 중 네트워크 오류가 발생하면 재시도 버튼을 제공한다. 로컬 기능은 가능한 한 정상적으로 유지한다.

21. 접근성 및 사용성

앱은 다음 접근성 기준을 고려한다.

  • 주요 텍스트는 작은 화면에서도 읽을 수 있어야 한다.
  • 튜토리얼 안내창은 배경과 충분히 대비되어야 한다.
  • 색상만으로 상태를 구분하지 않아야 한다.
  • 중요한 조작에는 충분한 터치 영역을 제공해야 한다.
  • 대화와 알림 문구는 지나치게 비난하거나 압박하는 표현을 피해야 한다.
  • 건강 조언은 의학적 진단처럼 표현하지 않아야 한다.

22. 1차 구현 우선순위

22.1 필수 구현

  • 앱 실행 및 로딩 화면
  • 첫 실행 온보딩
  • 생명체 선택 및 이름 설정
  • 홈 화면
  • 생명체 탭 대화
  • 대화 기반 성장도 반영
  • 프로필 화면
  • 상점 기본 구조
  • 달력 구매
  • 가구 배치
  • 알림 메뉴 해금
  • 알림 생성, 목록, 상세, 삭제
  • 튜토리얼 중단 및 재개

22.2 2차 구현

  • HealthKit 연동
  • 스마트워치 구매 및 컷신
  • 건강 데이터 기반 성장 반영
  • 위젯
  • 캐릭터별 알림 대사
  • 가구 효과
  • 성장 단계별 대화 확장

22.3 후속 구현

  • 계정 생성
  • 소셜 연동
  • 클라우드 백업
  • 계정 이전 및 데이터 복원
  • 상세 BM 상점
  • 기념일 이벤트
  • 추억 다시보기
  • 고급 방 꾸미기
  • 캐릭터 이모티콘 및 스티커 활용

23. 미정 사항

다음 항목은 추후 확정이 필요하다.

  • 앱 공식 이름
  • 링크 생명체의 공식 종족명
  • 각 생명체의 공식 이름
  • 성장도 수치 공식
  • 진화 단계 수
  • HealthKit 세부 데이터 항목
  • 스마트워치 구매 정책
  • 과금 재화 명칭과 가격
  • 튜토리얼 스킵 제공 여부
  • 생명체 선택 변경 가능 여부
  • 교수 캐릭터의 최종 유지 여부
  • 주인공 직업 설정 유지 여부
  • 위젯 지원 크기
  • 백업 방식과 서버 사용 여부

2. 기능 개발명세 인덱스

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

이 폴더는 [[기능 명세 보완본]]을 기준으로 기능별 개발명세를 분리해 관리한다. [[기능 명세 보완본]]은 원문 보존용 source of truth이며, 이 문서들은 개발, QA, 디자인, 시나리오 작업자가 기능 단위로 구현 계약을 확인하기 위한 파생 문서이다.

문서 읽는 순서

  1. [[기능 명세 보완본]]: 현재 제품 기능의 최상위 기준
  2. 이 인덱스: 기능별 개발명세 목록과 우선순위
  3. 각 기능 개발명세: 데이터, 상태, 예외, 대사, 검증 기준

공유용 대표본

  • [[EdgeLLM 기능 명세 통합 공유본]]: [[기능 명세 보완본]]과 기능별 개발명세를 한 Markdown 파일로 합친 HTMLBook 공유용 대표본

1차 구현 기능

기능 문서 구현 핵심
온보딩/튜토리얼 [[온보딩 및 튜토리얼 개발명세]] 첫 실행, 캐릭터 선택, 이름 입력, 튜토리얼 복귀
홈/생명체 상호작용 [[홈 화면 및 생명체 상호작용 개발명세]] 방, 생명체 상태, 터치/말풍선, 메뉴 진입
대화/기억/성장 [[대화 기억 성장 개발명세]] 채팅, 기억 추출, 감정 반응, 성장도 반영
프로필 [[프로필 개발명세]] 생명체 정보, 성장 단계, 성장 기여도 표시
상점/가구 [[상점 및 가구 개발명세]] 구매, 보유, 배치, 수납, 기능성 가구
알림 [[알림 개발명세]] 알림 후보 생성, 확정, 로컬 알림 예약/취소
설정/데이터 관리 [[설정 및 데이터 관리 개발명세]] 권한, 백업, 데이터 삭제, 문의, 개인정보

2차 연동 기능

기능 문서 구현 핵심
HealthKit [[건강 데이터 HealthKit 개발명세]] 건강 권한, 걸음/수면/활동량 동기화, 성장 반영
위젯 [[위젯 개발명세]] 홈/잠금화면 표시, 스냅샷, 딥링크, 제한적 인터랙션

공통 계약

  • 모든 기능 문서는 status:: active를 가진다.
  • 기능 충돌 시 [[기능 명세 보완본]]의 status:: main 내용을 우선한다.
  • 기능 문서는 구현 해석을 담을 수 있지만, Main 명세 원문을 임의로 수정하지 않는다.
  • PoC, 목업, 평가 하네스 기록은 기능 구현 계약이 아니며 필요 시 별도 legacy 또는 active 문서로 연결한다.

3. 온보딩 및 튜토리얼 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

온보딩은 유저가 세계관, 링크 생명체 선택, 이름 입력, 기본 상호작용을 이해하고 홈 화면으로 자연스럽게 진입하도록 만든다. 첫 실행 중단 후 재진입해도 진행 상태가 유지되어야 한다.

구현 범위

  • 첫 실행 여부 판단
  • 교수 캐릭터 안내 시퀀스
  • 생명체 3종 선택
  • 유저 이름 또는 호칭 입력
  • 선택 생명체 초기 데이터 생성
  • 기본 홈 화면 진입
  • 튜토리얼 중단 및 재진입 복구

제외 범위

  • 최종 캐릭터 공식명 확정
  • 전체 컷신/일러스트 최종 리소스
  • 계정 기반 다중 기기 동기화

데이터 모델

struct OnboardingState {
    var hasCompletedOnboarding: Bool
    var currentStep: OnboardingStep
    var selectedCreatureType: CreatureType?
    var userDisplayName: String?
    var createdCreatureId: UUID?
    var updatedAt: Date
}

enum OnboardingStep {
    case intro
    case professorBriefing
    case creatureSelection
    case naming
    case firstLink
    case completed
}

화면 상태

상태 조건 화면
신규 유저 hasCompletedOnboarding == false 교수 안내 시작
진행 중 복귀 currentStep != completed 마지막 완료 직후 단계부터 재개
선택 완료 생명체와 이름이 모두 있음 첫 링크 연출 후 홈 이동
기존 유저 hasCompletedOnboarding == true 홈 화면 직접 진입

플로우

  1. 앱 시작 시 온보딩 상태를 로컬 저장소에서 읽는다.
  2. 신규 유저이면 교수 안내를 보여준다.
  3. 생명체 3종의 성격 요약과 외형을 보여주고 하나를 선택하게 한다.
  4. 유저 이름 또는 생명체가 부를 호칭을 입력받는다.
  5. 초기 생명체, 기본 방, 기본 재화, 기본 가구 데이터를 생성한다.
  6. 첫 링크 연출과 기본 상호작용 안내 후 홈 화면으로 이동한다.

예외 처리

상황 처리
앱 강제 종료 마지막 저장된 currentStep부터 재개
생명체 선택 없이 다음 선택 요청 토스트 또는 버튼 비활성화
이름 미입력 기본 호칭 사용 가능 여부를 정책으로 확정해야 함
초기 데이터 생성 실패 재시도 버튼과 오류 로그 저장

생명체 대사

순간 대사 예시
첫 만남 "어... 여기가 네 방이야? 생각보다 아늑하다!"
이름 입력 후 "{userName}라고 부르면 되는 거지? 좋아, 기억해둘게."
첫 링크 "링크가 이어졌어. 이제 네 하루가 조금씩 나한테도 느껴져."
홈 진입 "그럼 오늘부터 같이 지내보자. 너무 무리하지는 말고."

개발 체크리스트

  • 온보딩 완료 전에는 홈 주요 기능을 열지 않는다.
  • 온보딩 완료 후 같은 유저에게 튜토리얼이 반복 노출되지 않는다.
  • 중단 복귀 시 이미 선택한 생명체가 바뀌지 않는다.
  • 초기 데이터 생성은 원자적으로 처리한다. 중간 실패 시 복구 가능한 상태를 남긴다.

QA 시나리오

  • 앱 최초 설치 후 온보딩 완료
  • 생명체 선택 화면에서 앱 종료 후 재실행
  • 이름 입력 화면에서 빈 값 제출
  • 온보딩 완료 후 앱 재실행

4. 홈 화면 및 생명체 상호작용 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

홈 화면은 앱의 기본 생활 공간이다. 유저는 방, 생명체, 가구, 말풍선, 하단 메뉴를 통해 현재 상태를 한눈에 확인하고 주요 기능으로 이동한다.

구현 범위

  • 원룸 배경 렌더링
  • 생명체 위치, 모션, 표정 표시
  • 시간대/상태 기반 말풍선
  • 생명체 터치 반응
  • 하단 메뉴 또는 주요 기능 진입
  • 배치된 가구 표시

데이터 모델

struct HomeSnapshot {
    var creature: CreatureSummary
    var room: RoomLayout
    var activeBubble: CreatureBubble?
    var pendingReminderCount: Int
    var healthSyncState: HealthSyncState?
    var updatedAt: Date
}

struct CreatureBubble {
    var id: UUID
    var text: String
    var kind: BubbleKind
    var deepLink: AppRoute?
    var expiresAt: Date?
}

화면 상태

상태 조건 표시
일반 특이 이벤트 없음 생명체 idle 모션, 시간대 말풍선
알림 후보 있음 대화에서 일정/알림 후보 생성 말풍선 또는 알림 아이콘
HealthKit 미연동 기능 해금 후 권한 없음 건강 연동 유도 말풍선
성장 임박 성장도 기준치 근접 기대감 있는 대사와 효과
데이터 오류 홈 스냅샷 로딩 실패 최소 홈 UI와 재시도

상호작용

입력 동작
생명체 탭 짧은 반응 대사와 표정 변경
말풍선 탭 관련 기능으로 딥링크
가구 탭 가구별 기능 또는 설명 표시
빈 공간 롱프레스 배치 모드 진입
하단 메뉴 대화, 프로필, 상점, 설정 이동

생명체 대사

조건 대사 예시
아침 "일어났어? 오늘은 천천히 시작해도 괜찮아."
점심 "밥은 먹었어? 연구도 좋지만 에너지는 채워야지."
밤 "오늘도 오래 버텼네. 이제 조금 쉬어도 돼."
터치 "앗, 불렀어? 나 여기 있어."
성장 임박 "요즘 우리 링크가 더 선명해진 것 같아."

개발 체크리스트

  • 홈은 네트워크나 모델이 없어도 최소 상태로 열린다.
  • 생명체 모션, 말풍선, 가구 렌더링은 서로 겹치지 않는다.
  • 말풍선은 만료 시간이 지나면 사라진다.
  • 홈에서 기능 진입 후 뒤로 오면 최신 스냅샷으로 갱신된다.

QA 시나리오

  • 온보딩 직후 첫 홈 표시
  • 생명체 탭 반복
  • 가구 배치 후 홈 재진입
  • 알림 후보가 있을 때 말풍선 표시
  • 데이터 로딩 실패 상태

5. 대화 기억 성장 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

대화 기능은 생명체의 페르소나를 드러내는 핵심 인터페이스다. 단순 채팅에 그치지 않고 유저의 생활 정보, 감정 신호, 일정/알림 후보, 성장 기여도를 추출해 홈과 프로필에 반영한다.

구현 범위

  • 유저 메시지 입력 및 모델 응답 표시
  • 생명체 페르소나 프롬프트 적용
  • 대화 기억 추출
  • 감정/생활 신호 태깅
  • 알림 후보 생성
  • 대화 기반 성장도 증가
  • 모델 실패 시 명시적 오류 표시

데이터 모델

struct ConversationMessage {
    var id: UUID
    var role: MessageRole
    var text: String
    var createdAt: Date
    var modelTraceId: String?
}

struct MemorySignal {
    var id: UUID
    var sourceMessageId: UUID
    var kind: MemoryKind
    var summary: String
    var confidence: Double
    var createdAt: Date
}

struct GrowthEvent {
    var id: UUID
    var source: GrowthSource
    var amount: Int
    var reason: String
    var createdAt: Date
}

모델 파이프라인

  1. 유저 메시지를 저장한다.
  2. 상시 페르소나 프롬프트와 최근 대화 컨텍스트를 구성한다.
  3. 모델 응답을 생성한다.
  4. 별도 분석 단계 또는 후처리로 기억/감정/알림 후보를 추출한다.
  5. 응답은 생명체 말투로 표시하고, 내부 추출 결과는 사용자에게 로그로 노출하지 않는다.
  6. 알림 후보가 있으면 자연어 확인 메시지 또는 명시적 UI로 확정받는다.

라우팅 원칙

  • 일반 잡담은 도구 호출 없이 캐릭터 응답만 생성한다.
  • 알림, 일정, 건강 조회 같은 기능 의도가 명확할 때만 내부 기능 후보를 만든다.
  • 내부 JSON, dry-run receipt, executor log는 Chat 탭 사용자 메시지로 노출하지 않는다.
  • 기능 실행 결과는 생명체의 자연어 응답으로 변환한다.

생명체 대사

상황 대사 예시
일반 인사 "안녕. 오늘은 좀 숨 돌릴 틈 있었어?"
피곤함 호소 "오늘 많이 지쳤구나. 지금은 해야 할 일보다 회복이 먼저일지도 몰라."
알림 후보 "좋아, {time}에 {title} 챙기라고 알려줄게."
기억 반영 "지난번에 말한 발표 준비, 아직 마음에 걸리는구나."
모델 실패 "미안, 방금은 링크가 조금 흐려졌어. 다시 말해줄래?"

개발 체크리스트

  • Chat 화면에 내부 툴 로그가 직접 노출되지 않는다.
  • 모델 응답 실패와 기능 실행 실패를 구분해서 표시한다.
  • 대화 기억은 사용자가 삭제할 수 있어야 한다.
  • 성장 이벤트는 중복 적립을 방지한다.
  • 페르소나는 알림/일정 기능 응답에도 유지된다.

QA 시나리오

  • 단순 인사: 도구 후보 없이 생명체 응답
  • "20초 뒤 물 마시기 알림": 알림 후보 또는 즉시 예약 응답
  • 감정 호소: 공감 응답과 감정 신호 저장
  • 모델 런타임 오류: 숨은 fallback 없이 오류 상태 표시
  • 같은 메시지 재전송: 성장 이벤트 중복 여부 확인

6. 프로필 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

프로필은 생명체의 정체성, 성장 단계, 성장도, 유저와의 링크 상태를 확인하는 화면이다. 유저가 왜 성장했는지 이해할 수 있도록 성장 기여도를 설명한다.

구현 범위

  • 생명체 이름, 타입, 성장 단계 표시
  • 성장도 바와 다음 단계까지 남은 수치
  • 최근 성장 기여 이벤트 표시
  • 성격/특징 설명
  • 건강, 대화, 알림, 상호작용 기반 기여도 요약

데이터 모델

struct CreatureProfile {
    var creatureId: UUID
    var displayName: String
    var type: CreatureType
    var growthStage: GrowthStage
    var growthPoint: Int
    var nextStageRequiredPoint: Int
    var personalitySummary: String
    var recentGrowthEvents: [GrowthEvent]
}

화면 구성

영역 내용
상단 생명체 대표 일러스트, 이름, 성장 단계
성장 성장도 바, 다음 단계까지 남은 포인트
설명 성격, 링크 특성, 최근 컨디션
기여도 대화, 걸음, 수면, 알림 완료 등 최근 이벤트

생명체 대사

조건 대사 예시
프로필 진입 "내 상태 보러 온 거야? 조금 쑥스럽네."
성장도 낮음 "천천히 해도 괜찮아. 링크는 하루 만에 깊어지는 게 아니니까."
성장 임박 "조금만 더 같이 지내면 뭔가 바뀔 것 같아."
성장 완료 "나, 조금 달라진 것 같지 않아? 네 하루가 나한테도 남았나 봐."

개발 체크리스트

  • 성장 수치와 홈 상태가 같은 source에서 계산된다.
  • 성장 이벤트가 없을 때 빈 상태 문구를 제공한다.
  • HealthKit 미연동 유저에게 건강 기여도가 0인 이유를 설명한다.
  • 프로필 화면은 오프라인에서도 마지막 저장 상태를 보여준다.

QA 시나리오

  • 온보딩 직후 프로필
  • 성장 이벤트 발생 후 프로필 갱신
  • HealthKit 미연동 상태
  • 성장 단계 변경 직후 표시

7. 상점 및 가구 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

상점과 가구 배치는 방 커스터마이징, 기능 해금, 성장 보조를 담당한다. 일부 가구는 단순 장식이 아니라 알림, HealthKit, 이벤트, 대화 트리거와 연결된다.

구현 범위

  • 기본 재화 표시
  • 가구 목록, 가격, 보유 여부 표시
  • 구매, 중복 구매 정책
  • 방 배치, 이동, 회전, 수납
  • 기능성 가구 해금
  • 캘린더/알림 기능성 가구 연결

데이터 모델

struct ShopItem {
    var itemId: String
    var name: String
    var price: Int
    var category: FurnitureCategory
    var effect: FurnitureEffect?
    var isRepeatPurchasable: Bool
}

struct OwnedFurniture {
    var instanceId: UUID
    var itemId: String
    var placedState: FurniturePlacement?
    var purchasedAt: Date
}

struct FurniturePlacement {
    var x: Double
    var y: Double
    var rotation: Int
    var zIndex: Int
}

기능성 가구 정책

가구 유형 기능
캘린더/메모 가구 알림 후보, 일정 회상, 홈 말풍선 트리거
운동/산책 관련 가구 HealthKit 연동 후 활동 대사 강화
휴식 가구 수면/회복 관련 대사 강화
장식 가구 방 꾸미기와 호감/분위기 이벤트

플로우

  1. 상점 목록을 로컬 데이터 또는 원격 구성에서 읽는다.
  2. 유저 재화와 구매 가능 여부를 계산한다.
  3. 구매 성공 시 보유 목록에 인스턴스를 추가한다.
  4. 배치 모드에서 방 좌표에 가구를 배치한다.
  5. 기능성 가구가 배치되면 관련 기능 진입점이나 말풍선을 활성화한다.

생명체 대사

상황 대사 예시
상점 진입 "방에 둘 걸 고르는 거야? 너무 비싼 건 조심하고."
구매 성공 "오, 이거 마음에 들어. 어디에 둘까?"
재화 부족 "지금은 조금 부족해. 다음에 다시 보러 오자."
캘린더 가구 배치 "이제 중요한 일은 여기에 같이 적어둘 수 있겠다."

개발 체크리스트

  • 구매와 재화 차감은 원자적으로 처리한다.
  • 배치 좌표는 화면 크기가 바뀌어도 깨지지 않게 정규화한다.
  • 기능성 가구가 없어도 기본 앱 기능이 완전히 막히는지 정책을 명확히 한다.
  • 수납한 가구는 홈 렌더링에서 제외하지만 보유 목록에는 남는다.

QA 시나리오

  • 기본 재화로 가구 구매
  • 재화 부족 구매 실패
  • 가구 이동, 회전, 수납
  • 앱 재실행 후 배치 유지
  • 기능성 가구 배치 후 관련 말풍선 확인

8. 알림 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

알림 기능은 유저의 대화, 직접 입력, 기능성 가구를 통해 생성된 할 일을 실제 iOS 로컬 알림으로 예약하고, 생명체가 생활을 챙겨주는 경험으로 표현한다.

구현 범위

  • 자연어 알림 후보 생성
  • 알림 제목, 시간, 반복 여부 파싱
  • 유저 확정 또는 자동 실행 정책 적용
  • iOS 로컬 알림 예약, 취소, 수정
  • 알림 실행 결과 저장
  • 홈/대화/위젯에 예정 알림 표시

제외 범위

  • 서버 푸시 알림
  • 다른 앱의 알람 앱 대체
  • 캘린더 전체 일정 관리

iOS 구현 기준

Apple UserNotifications 기준으로 앱은 UNNotificationRequest에 알림 내용과 trigger 조건을 넣고 UNUserNotificationCenter에 추가해 로컬 알림을 예약한다. 앱 내부 ReminderItem이 source of truth이며, OS pending notification은 전달 계층으로 취급한다.

참고:

데이터 모델

struct ReminderItem {
    var id: UUID
    var title: String
    var memo: String?
    var dueAt: Date
    var notifyAt: Date
    var repeatRule: RepeatRule?
    var source: ReminderSource
    var status: ReminderStatus
    var systemNotificationIds: [String]
    var petComment: String?
    var createdAt: Date
    var updatedAt: Date
}

enum ReminderStatus {
    case candidate
    case scheduled
    case completed
    case canceled
    case failed
}

플로우

대화 기반 생성

  1. 유저가 "20초 뒤 물 마시기 알림 해줘"처럼 요청한다.
  2. 모델 또는 라우터가 title, notifyAt, repeatRule 후보를 만든다.
  3. 필수 필드가 충분하면 앱이 바로 예약하거나, 정책상 위험한 경우 한 번 확인한다.
  4. 예약 성공 시 Chat에는 내부 receipt 대신 생명체 자연어 응답을 표시한다.
  5. 예약 실패 시 권한/시간/시스템 오류 원인을 분리해 안내한다.

직접 입력 생성

  1. 알림 화면에서 제목과 시간을 입력한다.
  2. 권한 상태를 확인한다.
  3. ReminderItem 저장 후 로컬 알림을 예약한다.
  4. 예약 성공 시 홈/위젯 스냅샷을 갱신한다.

수정/취소

  1. 기존 알림 상세에서 수정 또는 취소한다.
  2. 앱 DB를 갱신한다.
  3. 기존 systemNotificationIds를 취소하고 필요한 경우 새 notification request를 등록한다.

자동 실행 정책

요청 유형 기본 정책
가까운 단발 알림 필수 필드가 명확하면 즉시 예약
반복 알림 유저 확인 후 예약
제목 또는 시간이 모호함 생명체가 되묻기
건강/위험 관련 강한 문구 과장된 의료 조언 없이 알림만 예약

권한 및 예외

상황 처리
알림 권한 미허용 시스템 권한 요청, 거부 시 설정 이동 안내
과거 시간 다음 가능한 시간으로 해석할지 유저에게 확인
제목 없음 생명체가 제목을 되묻기
OS 예약 실패 failed로 저장하고 재시도 버튼 제공
앱 삭제/재설치 로컬 DB 기준 복구 불가, 백업 정책 확정 필요

생명체 대사

상황 대사 예시
즉시 예약 성공 "좋아, {time}에 {title} 챙기라고 알려줄게."
확인 필요 "{title}을 {time}에 알려주면 될까?"
권한 필요 "알려주려면 알림 권한이 필요해. 한 번만 허락해줄래?"
예약 실패 "미안, 알림을 제대로 걸지 못했어. 권한이 꺼져 있는지 확인해볼게."
알림 완료 "시간이야. {title}, 지금 챙겨보자."
완료 처리 "좋아, 해냈네. 이런 작은 루틴이 꽤 크게 남아."

개발 체크리스트

  • Chat에는 dry-run, JSON, receipt 로그가 노출되지 않는다.
  • 앱 DB와 OS pending notification의 동기화 상태를 확인할 수 있다.
  • 알림 권한 거부 상태를 숨은 실패로 처리하지 않는다.
  • 20초 뒤 같은 단기 알림이 실제 기기에서 울리는지 테스트한다.
  • 반복 알림은 OS 예약 개수 제한을 고려해 가까운 알림부터 재예약하는 구조를 검토한다.

QA 시나리오

  • "20초 뒤 물 마시기 알림 해줘" 입력 후 실제 알림 수신
  • 권한 거부 후 알림 생성 시도
  • 모호한 요청 "나중에 알려줘" 입력
  • 예약된 알림 취소
  • 앱 재실행 후 예정 알림 목록 유지

9. 건강 데이터 HealthKit 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

HealthKit 연동은 유저의 실제 생활 패턴을 생명체 성장에 반영하는 기능이다. 걸음 수, 활동량, 수면 등 건강 데이터를 요약해 성장도와 대사에 활용하되, 권한과 개인정보를 명확히 다룬다.

구현 범위

  • HealthKit 사용 가능 여부 확인
  • 건강 데이터 읽기 권한 요청
  • 걸음 수, 이동 거리, 운동, 수면 데이터 요약
  • 일 단위 건강 요약 저장
  • 성장도 계산에 건강 기여도 반영
  • 권한 거부, 철회, 데이터 없음 상태 처리

iOS 구현 기준

HealthKit은 데이터 타입별로 세분화된 권한을 요구한다. 앱은 필요한 타입을 명시하고, 사용자가 허용한 범위 안에서만 Health Store를 읽어야 한다. 읽기/쓰기 권한은 타입별로 별도 관리된다.

참고:

권한 범위

데이터 목적 MVP 여부
걸음 수 성장도, 산책/활동 대사 필수
걷기/달리기 거리 활동량 보조 지표 권장
운동 기록 활동 이벤트 대사 선택
수면 분석 회복/수면 대사 선택
심박수 직접 의료 해석 없이 컨디션 힌트 후순위

해금 조건

  • Main 명세 기준으로 HealthKit은 생명체가 일정 단계 성장한 후 해금되는 확장 기능이다.
  • 예: 1차 성장 이후 스마트워치 또는 건강 관련 가구를 획득하면 건강 연동을 제안한다.
  • 해금 전에는 권한 요청을 먼저 띄우지 않는다.

데이터 모델

struct HealthSyncState {
    var isHealthKitAvailable: Bool
    var authorizationState: PermissionState
    var requestedTypes: [HealthMetricType]
    var lastSyncAt: Date?
    var lastError: String?
}

struct DailyHealthSummary {
    var date: Date
    var stepCount: Int?
    var walkingRunningDistanceMeters: Double?
    var workoutMinutes: Int?
    var sleepMinutes: Int?
    var source: HealthDataSource
    var createdAt: Date
    var updatedAt: Date
}

struct HealthGrowthContribution {
    var date: Date
    var amount: Int
    var reasons: [String]
}

성장 입력값 계산 초안

activityProgress = min(stepCount / dailyStepGoal, 1.0)
sleepRegularityProgress = min(sleepRegularityScore / dailySleepRegularityGoal, 1.0)
healthInput = weightedSum(activityProgress, sleepRegularityProgress, workoutSignal)

HealthKit은 최종 성장도를 직접 계산하지 않고, Main 명세의 성장 계산식에 들어가는 건강 계열 입력값을 만든다. 수치와 캡은 밸런싱 문서에서 별도 확정한다. 건강 점수는 유저를 비난하거나 의료적으로 판단하는 방식으로 사용하지 않는다.

동기화 플로우

  1. 해금 조건을 만족하면 생명체가 건강 연동을 제안한다.
  2. 유저가 동의하면 HealthKit 권한 요청 화면으로 진입한다.
  3. 권한 허용 후 오늘과 최근 N일 요약을 읽는다.
  4. DailyHealthSummary를 저장한다.
  5. 성장도 계산과 홈/프로필 대사를 갱신한다.
  6. 권한이 철회되면 마지막 요약은 stale 상태로 표시한다.

예외 처리

상황 처리
HealthKit 사용 불가 기능 비활성화, "이 기기에서는 연결할 수 없음" 안내
권한 거부 설정 안내, 성장 페널티 없음
데이터 없음 빈 상태 대사 표시, 0점 단정 금지
동기화 실패 마지막 성공 시점 표시, 재시도 버튼
권한 철회 건강 기반 대사와 성장 기여 중단

생명체 대사

상황 대사 예시
권한 제안 "네 하루 움직임을 조금만 알려주면, 내가 더 잘 맞춰서 챙겨줄 수 있어."
권한 거부 "괜찮아. 말해주고 싶을 때만 알려줘도 돼."
걸음 적음 "오늘은 많이 움직이지 못했네. 잠깐 창문만 열어도 기분이 달라질 수 있어."
목표 근접 "조금만 더 걸으면 오늘 목표에 닿겠다. 같이 마무리해볼까?"
목표 달성 "좋아! 오늘 꽤 많이 움직였어. 나도 링크가 따뜻해진 느낌이야."
수면 부족 "잠이 부족했던 것 같아. 오늘은 일찍 쉬는 쪽으로 해보자."

개발 체크리스트

  • HealthKit 권한은 해금 전 선요청하지 않는다.
  • 건강 데이터 원본 전체를 앱 DB에 저장하지 않고 일 단위 요약을 우선 저장한다.
  • HealthKit 데이터는 의료 진단처럼 해석하지 않는다.
  • 권한 거부가 성장 페널티로 이어지지 않는다.
  • 걸음 데이터 기반 성장 진척도는 프로필에서 설명 가능해야 한다.

QA 시나리오

  • HealthKit 해금 전 설정 접근
  • 권한 허용 후 오늘 걸음 수 반영
  • 권한 거부 후 홈/프로필 상태
  • 데이터 없음 상태
  • 권한 철회 후 동기화 중단

10. 위젯 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

위젯은 앱을 열지 않아도 생명체 상태, 다음 알림, 간단한 생활 신호를 확인하게 하는 외부 접점이다. 위젯은 전체 채팅 앱이 아니라 홈 상태의 요약과 앱 딥링크를 담당한다.

구현 범위

  • 홈 화면 위젯 표시
  • 잠금화면 위젯 후보
  • 생명체 상태, 성장 단계, 다음 알림 표시
  • HealthKit 요약 표시
  • 앱 딥링크
  • 제한적 버튼/토글 인터랙션

iOS 구현 기준

WidgetKit 위젯은 타임라인과 스냅샷 기반으로 동작한다. iOS의 인터랙티브 위젯은 AppIntent 기반 버튼/토글을 사용할 수 있지만, 긴 대화나 복잡한 앱 흐름은 본 앱으로 딥링크하는 구조가 맞다.

참고:

데이터 모델

struct WidgetSnapshot {
    var creatureId: UUID
    var creatureName: String
    var growthStage: GrowthStage
    var emotion: CreatureEmotion
    var bubbleText: String?
    var nextReminder: ReminderSummary?
    var healthSummary: WidgetHealthSummary?
    var deepLinkTarget: AppRoute
    var updatedAt: Date
    var staleReason: String?
}

struct ReminderSummary {
    var title: String
    var notifyAt: Date
}

위젯 크기별 정보

크기 표시 내용
Small 생명체 얼굴, 짧은 말풍선, 다음 알림 1개
Medium 생명체, 성장도, 다음 알림, 오늘 걸음 요약
Large 방 미니뷰, 알림 목록 일부, 건강 요약, 대사
Lock Screen 아이콘/짧은 상태/다음 알림 시간

인터랙션

입력 동작
생명체 영역 탭 앱 홈으로 이동
다음 알림 탭 앱 알림 상세로 이동
완료 버튼 가능한 경우 AppIntent로 완료 처리, 실패 시 앱 이동
건강 영역 탭 앱 프로필 또는 건강 상세로 이동

상태

상태 조건 표시
정상 최신 스냅샷 있음 생명체 상태와 다음 이벤트
알림 없음 예정 알림 없음 시간대 기반 대사
HealthKit 미연동 건강 권한 없음 건강 정보 숨김 또는 연결 유도
오래된 데이터 updatedAt이 기준보다 오래됨 "앱을 열어 동기화" 문구
온보딩 전 생명체 없음 앱 시작 유도

생명체 대사

조건 대사 예시
아침 위젯 "좋은 아침. 오늘 첫 걸음부터 같이 가자."
다음 알림 있음 "{title}까지 {remaining} 남았어."
알림 없음 "지금은 급한 일 없어 보여. 잠깐 숨 돌려도 돼."
데이터 오래됨 "요즘 네 하루가 잘 안 느껴져. 앱에서 한 번 만나자."
목표 달성 "오늘 움직임 좋았어. 링크가 반짝이는 느낌이야."

개발 체크리스트

  • 위젯은 앱 DB의 WidgetSnapshot만 읽고 무거운 모델 추론을 하지 않는다.
  • 위젯에서 긴 채팅을 시작하지 않고 앱으로 딥링크한다.
  • 알림 완료 버튼은 실패 시 본 앱에서 복구 가능해야 한다.
  • 스냅샷 갱신 실패 시 빈 화면이 아니라 stale 상태를 보여준다.

QA 시나리오

  • 온보딩 완료 후 위젯 추가
  • 다음 알림 있는 상태 표시
  • HealthKit 미연동 상태 표시
  • 오래된 스냅샷 표시
  • 위젯 탭으로 앱 딥링크

11. 설정 및 데이터 관리 개발명세

문서 메타:

  • status:: active
  • main:: [[기능 명세 보완본]]

목적

설정은 권한, 계정, 백업, 개인정보, 문의, 데이터 삭제를 관리하는 안전 장치다. 건강 데이터와 대화 기억처럼 민감한 정보는 사용자가 확인하고 철회할 수 있어야 한다.

구현 범위

  • 알림 권한 상태 표시
  • HealthKit 권한 상태 안내
  • 대화 기억 관리
  • 로컬 데이터 삭제
  • 계정/백업 메뉴 자리
  • 개인정보 처리방침, 문의 연결
  • 앱 버전 및 디버그 정보 표시

데이터 모델

struct SettingsSnapshot {
    var notificationPermission: PermissionState
    var healthPermission: PermissionState
    var backupState: BackupState
    var appVersion: String
    var buildNumber: String
    var lastDataExportAt: Date?
}

화면 구성

섹션 항목
권한 알림, 건강 데이터
데이터 대화 기억 보기/삭제, 로컬 데이터 초기화
계정 로그인, 백업, 복원
지원 문의, 개인정보 처리방침, 오픈소스 라이선스
앱 정보 버전, 빌드, 모델/런타임 정보

위험 작업 정책

작업 정책
대화 기억 삭제 확인 모달 후 삭제
전체 로컬 데이터 삭제 2단계 확인, 삭제 대상 목록 표시
HealthKit 권한 철회 iOS 설정에서 변경해야 함을 안내
백업 복원 기존 데이터 덮어쓰기 전 확인

생명체 대사

상황 대사 예시
설정 진입 "설정 보러 왔어? 중요한 건 천천히 확인하자."
기억 삭제 전 "내가 기억하던 이야기를 지우는 거야. 괜찮은지 한 번 더 확인해줘."
권한 꺼짐 "지금은 내가 확인할 수 없는 정보가 있어. 원하면 다시 연결해도 돼."
데이터 초기화 후 "처음부터 다시 시작하는 거구나. 그래도 나는 여기서 기다릴게."

개발 체크리스트

  • 삭제 작업은 되돌릴 수 없는 범위를 명확히 안내한다.
  • 건강 데이터 원본은 앱이 임의로 복제하지 않고 필요한 요약만 저장한다.
  • Debug 정보는 일반 유저에게 과도하게 노출하지 않는다.
  • 계정/백업이 미구현이면 mock 성공처럼 보이지 않게 준비 중 상태로 둔다.

QA 시나리오

  • 알림 권한 ON/OFF 상태 표시
  • HealthKit 미연동 상태 표시
  • 대화 기억 삭제
  • 전체 데이터 초기화 취소/확정
  • 개인정보 링크 열기