status:: active

기능별 명세 구현 매핑

이 문서는 [[00_README|기능별 명세]]의 제품 목표와 PetAI 코드의 현재 구현 상태를 연결한다. 원본 명세를 구현 완료 보고서로 바꾸지 않고, 코드가 어디까지 따라왔는지와 남은 차이를 추적하기 위한 문서다.

감사 기준

구분 기준점
기획 정본 이 폴더의 01~14 기능별 명세
GitHub main origin/main@b560c11
최신 기능 통합본 origin/testflight/pr78-healthkit-20260804@34f6afc
감사일 2026-08-08

현재 기능 통합본은 main보다 24개 커밋 앞서 있다. 따라서 HealthKit, AlarmKit, 캘린더, 로컬 알림, Routed Persona, Embedding Scene Router 등은 통합 브랜치에는 있지만 아직 main의 정식 상태는 아니다.

상태는 다음 의미로 사용한다.

  • 부분 구현: 명세의 핵심 흐름 일부가 실제 코드에 존재하지만 완료 조건 전체를 만족하지 않는다.
  • PoC: 기술 또는 단일 시나리오 검증용 구현이며 제품 기능으로 완성되지 않았다.
  • 미구현: 사용자 기능으로 확인할 수 있는 구현이 없다.
  • 미검증: 정적 코드와 테스트는 확인했지만 현재 TestFlight/iPhone에서 직접 검증하지 않았다.

전체 요약

현재 PetAI는 완성 제품보다는 다음 두 축이 결합된 기능 통합 Vertical Slice에 가깝다.

  1. Unity의 첫 만남, 방, 리듬 미니게임, 관계 수치, 소규모 상점과 로컬 저장
  2. iOS의 온디바이스 Gemma/EmbeddingGemma, EdgeMem, 모델 다운로드와 네이티브 도구

기획 명세 전체를 완료한 기능은 아직 없다. 반면 실제 구현에는 기획 문서보다 앞서 있는 온디바이스 AI 기반 시설이 상당히 많다. 가장 큰 미구현 영역은 계정·클라우드, 친구, 결제, 완전한 방 꾸미기, 통합 설정·개인정보 관리, 프로필·기억 관리 UI다.

기능별 상태

번호 기능 상태 현재 구현 명세와의 주요 차이
01 제품 방향 및 원칙 부분 구현 로컬 우선 AI·기억, Unity 게임과 iOS 런타임의 역할 분리 제품 전체 루프는 Vertical Slice 수준이다. 명세에서 제외한 범용 챗봇과 달리 현재 채팅은 비교적 넓은 자유 대화를 허용하되 페르소나·가드레일로 제한한다.
02 첫 진입 및 튜토리얼 부분 구현 Splash → 인증 선택 → 모델 준비 → 첫 만남·첫인상·리듬 초대 실제 소셜 로그인, 캐릭터 선택·이름 설정, 초기 가구 배치, 완전한 튜토리얼 재개 상태는 없다. 로컬로 계속하기는 동작한다.
03 홈·방·배경·날씨 부분 구현 방 화면, 캐릭터 이동·탭, 4개 배경, 지역·시간 표시, 구매 장식 자동 배치 자유 배치·회전·회수, 계절·날씨 연동, 실제 위치·날씨 조회가 없다. 현재 환경 게이트웨이는 GPS·HTTP를 사용하지 않는다.
04 육성 및 일일 리듬 부분 구현 친밀도·이해도, 행동·기분, 습관 진행, 리듬 결과와 일일 보상 저장 체력·스트레스·경험치·진화, HealthKit 기반 성장 반영, 정식 밸런스 규칙이 없다.
05 미션·미니게임·보상 부분 구현 22비트 리듬 미니게임 1종, 성공/실패 보상, Day 0/1 이벤트 범용 미션 시스템, 복수 미니게임, 업적·시즌 이벤트, 표준화된 보상 경제가 없다. 일부 미션 UI는 데모 상태다.
06 재화·결제·경제 PoC 로컬 linkBalance와 장식 구매·차감·저장 재화 획득 루프, IAP·구독, 영수증 검증, 복원·환불·서버 원장이 없다.
07 상점·아이템·도감 PoC 고정 장식 3종의 가격·보유 여부·자동 배치 데이터 기반 카탈로그, 장착/해제, 자유 배치, 의상, 도감 필터, 한정·시즌 아이템이 없다.
08 알림 부분 구현·미검증 UserNotifications 로컬 알림, AlarmKit 알람·타이머, 생성 전 네이티브 확인창 Unity 알림함은 데모이고 네이티브 알람과 통합되지 않았다. 알림 목록·삭제·반복·조용한 시간·원격 푸시는 없다.
09 위젯 PoC·미검증 AlarmKit 알람/타이머용 Live Activity·Widget Extension 기획한 캐릭터·방·날씨 위젯과 상태 동기화는 구현되지 않았다. 현재 것은 알람 보조 UI다.
10 HealthKit 부분 구현·미검증 지정 기간 걸음 수 조회, 확인 후 권한 요청, 온디바이스 처리 거리·운동·수면·심박수와 육성 연동, 권한 상태 관리 UI가 없다. 권한 거부와 데이터 없음의 UX도 완전히 분리되지 않았다.
11 프로필·기억 부분 구현·미검증 Unity 게임 기억과 iOS EdgeMem SQLite, P/E/B 저장 판정, EmbeddingGemma Dense retrieval 두 기억 체계가 분리돼 있다. 프로필·기억 목록·달력·수정·삭제·대표 추억 UI가 없고 사용자/캐릭터 범위도 고정값이다. 패턴·감정 등 명세 타입도 없다.
12 로그인·백업·계정 이전 부분 구현 로컬 전용 진입, GameState 주/백업 저장, 무결성 검사·복구·내보내기 로그인 화면은 있지만 실제 OAuth/backend는 준비 중이다. 클라우드 백업·계정 이전·동기화 충돌·구매 복원이 없으며 EdgeMem DB는 GameState 내보내기에 포함되지 않는다.
13 친구·교류 미구현 없음 친구 추가, 방 방문, 제한된 교류, 차단·신고가 없다.
14 설정·개인정보 부분 구현 지역·환경 동의, 모델 선택, thinking 설정, 네이티브 권한 확인, 로컬 상태 초기화 기반 코드 통합 설정 화면, 권한 상태 관리, 약관·지원·버전, 계정 삭제와 전체 로컬 데이터 삭제가 없다. GameState·EdgeMem·알람·캘린더·모델 자산을 한 번에 지우는 경로도 없다.

명세보다 먼저 구현된 영역

다음 기반 시설은 기능별 명세의 설명보다 실제 구현이 더 구체적이다.

  • Apple Background Assets 기반 언어 모델·메모리 모델 다운로드, 진행률·취소·재개·재시도 처리
  • Gemma 4 E2B IT 답변 생성과 EmbeddingGemma 기억 검색
  • save(P=0|1,E=0|1) 스트리밍 헤더 게이트와 요청당 최대 1회 SQLite 저장
  • 임베딩 기반 Scene Router와 Routed Persona 프롬프트
  • HealthKit, AlarmKit, EventKit, UserNotifications 도구의 제안 → 검증 → 사용자 확인 → 실행 구조
  • Unity와 Swift가 하나의 iOS 앱 안에서 통신하는 C ABI bridge

이 기능들은 AI 런타임 명세 또는 별도 기술 문서에는 존재하지만, 현재 기능별 기획 문서만 읽으면 실제 구현 범위를 파악하기 어렵다.

반드시 구분해야 하는 구조적 차이

1. main과 TestFlight 통합본이 다르다

origin/main@b560c11에는 최신 네이티브 도구와 Routed Persona/Embedding Router 변경이 모두 들어 있지 않다. 기능 검수와 문서 갱신 시에는 어떤 SHA의 빌드를 확인했는지 반드시 기록해야 한다.

2. 기억 저장소가 두 개다

  • Unity GameState.memories: 미니게임·이벤트가 만드는 게임 기억 카드
  • iOS EdgeMem SQLite: 사용자의 대화 원문과 Preference/Event 라벨, 임베딩

현재 두 저장소를 하나의 프로필·기억 화면에서 조회하거나 함께 삭제하는 기능은 없다.

3. 로컬 저장과 암호화는 같은 말이 아니다

EdgeMem은 앱 샌드박스 내부에 저장되고 백업 제외 정책을 사용하지만, 현재 SQLite DB 자체를 암호화하지 않는 프로토타입 정책이다. 기획의 로컬 우선 원칙은 만족하지만 “기기 내 암호화 완료” 상태로 표현하면 안 된다.

4. 알림과 위젯은 기획 대상과 구현 대상이 다르다

현재 네이티브 구현은 알람·타이머·일정·로컬 알림 실행에 집중한다. 기획서가 말하는 앱 내부 알림함과 캐릭터/방 위젯은 별도 제품 기능으로 남아 있다.

5. Scene Router의 레거시 경로가 남아 있다

최신 통합본은 Embedding Scene Router를 기본값으로 사용하지만, SLMConfiguration.SceneRouterMode와 Legacy Gemma Router의 수동 feature flag 경로가 여전히 존재한다. 자동 폴백은 아니지만, 향후 완전 제거 여부를 별도 결정해야 한다.

검증 범위

이번 감사에서 실행한 검증은 다음과 같다.

swift test --package-path ios/EdgeLLM --skip-build
→ 110/110 PASS

node contracts/validate_contracts.mjs
→ contracts=PASS

bash .github/scripts/validate-unity-ci.sh
→ PASS (Unity 6000.5.4f1, workflow/registry/script contract)

다음 항목은 이번 감사에서 실행하지 않았으므로 UNVERIFIED다.

  • Unity Editor PlayMode/EditMode 실제 실행
  • Unity iOS export와 Xcode Archive
  • TestFlight 업로드·설치
  • iPhone에서 모델 다운로드·로드·채팅·기억·네이티브 도구 실행
  • 지연시간, 메모리, 발열, 배터리, 다운로드 생명주기 QA

다음 문서화 액션

  1. TestFlight 통합본이 main에 반영되면 이 문서의 기준 SHA를 갱신한다.
  2. 기획이 확정된 기능부터 각 명세의 완료 조건과 실제 QA 항목을 연결한다.
  3. 앱 내부 알림함, 캐릭터 위젯, 기억 관리 UI처럼 같은 이름이지만 구현 의미가 다른 기능은 별도 티켓으로 분리한다.
  4. 실기기 QA 결과는 구현 여부와 분리해 Build 번호, 기기, iOS 버전과 함께 기록한다.