24 KiB
D3RO Voice 모바일 제품화 핸드오프
작성 시각: 2026-08-21 KST 마지막 사실 동기화: 2026-08-29 KST 제품 런타임:
apps/mobile-rn구현·검증 정본:MOBILE_APP_COMPLETION_SSOT.md2026-08-21 Git 기준선:main@a9c9a1ca6efdfc83ae7a12a0c1f2a05f15ef9138(역사 증거, 현재 release SHA 아님) release identity: version1.1.0, Android versionCode / iOS build1010001판정: 내부 기능·local upload/evidence key·AdMob identity는 준비됐지만 production AAB·Firebase·CI secret 주입·closed test가 없어 Play 출시는 RED
0. 2026-08-29 release readiness 스냅샷
| 영역 | 현재 사실 | 다음 게이트 |
|---|---|---|
| Play 앱 | D3RO Voice, com.d3ro.voice, app ID 4976102237698469110; Console 상태 임시 |
첫 AAB 업로드 후 설정 0/11 채우기 |
| 버전 | product 1.1.0, Android versionCode / iOS build 1010001 |
AAB·desktop artifact·release record가 같은 identity를 가리키는지 CI에서 증명 |
| Play App Signing | SHA-256 01:00:19:21:DB:4F:33:40:85:CE:21:E4:B8:DE:CC:BD:71:DA:87:67:C5:6E:3B:59:83:2A:A1:C8:29:EA:0D:AB 실확인 |
local upload key는 있다. 첫 AAB 후 Console 표시가 local cert와 일치하는지 증명 |
| App Links | source assetlinks.json 3개는 Play SHA-256으로 갱신 |
live는 아직 구 certificate라 배포·public 재검증 필요 |
| Play 트랙 | 첫 AAB 0건, closed tester 0명 | 12명을 연속 14일 유지하고 production access 신청·승인 |
| production access | disabled | 승인 전에 production/open testing 가능으로 간주 금지 |
| local release keys | upload PKCS12 private-key readback GREEN; Ed25519 evidence keypair roundtrip GREEN | CI secret 업로드·오프라인 복구 백업·실제 AAB 서명 대기 |
| production 입력 | AAB·Firebase config·AdMob/upload/evidence CI secret 주입 증거 없음 | protected secret store와 승인 경계에 주입한 후 fail-closed build |
일반적인 “배포해” 지시는 Data safety, App content, production access 답변과 같은 외부 법적·정책 선언의 대리 승인이 아니다. 실제 Console 문구를 사용자가 읽고 action-time 승인하기 전에는 저장·제출하지 않는다.
0.1 2026-08-24 AdMob 재개 결과
- 정본 계정
yunchan8804@gmail.com에서 AdMob 계정과 D3RO Voice Android 앱이 생성된 상태를 재확인했다. - App ID:
ca-app-pub-1039714767792854~6427959892 - banner:
ca-app-pub-1039714767792854/9840591290 - rewarded:
ca-app-pub-1039714767792854/2255790918 - rewarded contract:
50 cloud_ai_tokens - SSV URL:
https://llnocwyqvhgwpdjcqqyw.supabase.co/functions/v1/admob-ssv; AdMob의 URL 확인 성공 후 저장하고 새로고침 뒤 영속 상태를 재확인했다. - Supabase production migration
20260821000028과admob-ssvEdge v13을 배포했다. unknown key는 HTTP 503, 영구 거부는 HTTP 200으로 응답한다. - 보상 transaction은
ad_reward_receipts.transaction_id UNIQUE에서 먼저 소비한다. cooldown/cap/ineligible/unknown-user도 영구 terminal 처리하며 계정 삭제 시 사용자 UUID는 NULL로 분리한다. - live 상태는
검토 필요,광고 게재 제한, Play store 미연결, 결제 프로필 미완료다. production signed AAB와 test-device/Play 설치본의 실제 Google-signed SSV 지급 E2E도 남았다.
1. 가장 먼저 읽을 것
- Google/Firebase/Play/AdMob의 정본 계정은 **
yunchan8804@gmail.com**이다. - Play 개발자 계정은
YUN CHAN, 개발자 ID는 **7374613349497835192**다. - TWENTYOZ 계정으로 프로젝트·앱·광고 계정을 만들거나 제출하면 안 된다. 잘못된 계정에서는 실제 제출한 항목이 0건이다.
- 과거 Git 커밋의 author email
yunchan@twentyoz.kr은 저장소 메타데이터일 뿐이며 Google Console 계정 선택 근거가 아니다. - 현재 worktree에는 여러 작업자의 대규모 수정·신규 파일이 함께 있다.
git reset --hard,git checkout --,git clean, 광범위한 포맷·삭제를 하면 안 된다. - 보존된 APK 증거는 Google TEST AdMob + debug signer의 TEST-DEMO다. Play production 또는 공식 signed APK로 게시하면 안 된다.
- 이 문서와 모바일 SSOT는 현재 untracked다. 정식 릴리스 전 관련 소스·migration·Edge Function·문서를 검토 가능한 커밋으로 보존해야 한다.
2. 현재 한눈에 보기
| 영역 | 현재 상태 | 출시까지 남은 것 |
|---|---|---|
| 모바일 기능 | 인증, 온보딩, 테마, 녹음/전사, Talk, History, 회의, 팀, Push 계약, portability, template/memo, billing, ads, admin 구현 | 외부 provider의 production journey |
| 모바일 정적 검증 | typecheck·ESLint GREEN | 없음 |
| 모바일 Jest | 57 suites / 353 tests GREEN | 없음 |
| Android E2E | API 34 exact .11 TEST-DEMO auth/signup/invite 및 cold launch GREEN |
production-signed artifact로 재실행 |
| Supabase DB/Edge | production migration 00001~00028, AdMob SSV v13 ACTIVE·rewarded secret 설정 |
FCM drain cron, 실제 provider-signed E2E |
| 법적 페이지 | production HTTPS 200 | Play Console 등록정보에 URL 입력 |
| Firebase | Console u/0, u/1 모두 D3RO project 없음; production Android config·CI secret 없음 |
사용자 승인 후 정본 프로젝트/Android 앱·Play fingerprint·FCM 연결 |
| Play Console | 앱 4976102237698469110 생성, App Signing SHA-256 확인; 상태 임시, 설정 0/11, AAB 0건 |
AAB·스토어 설정·상품·internal/closed track·12명 14일·production access |
| AdMob | App/Banner/Rewarded ID·SSV URL 설정 완료 | 검토 필요·광고 게재 제한·지급 프로필·store 미연결·UMP/test-device E2E |
| production APK/AAB | 없음 | secret 주입 후 signed APK+AAB build/verifier/CI |
| Fold6 | .11 TEST-DEMO Taildrop 전송 완료 |
설치·실행·공유·OAuth·구매 실증 |
3. 계정과 브라우저 상태
Firebase
- Firebase Console
u/0과u/1을 2026-08-29에 모두 재확인했고 D3RO 프로젝트는 0개였다. - production
google-services.json, Android 앱 등록, Play app-signing fingerprint, FCM/CI secret은 없다. - 새 Cloud/Firebase 프로젝트와 Android 앱 등록은 영구 외부 상태를 만든다. 사용자에게 계정·프로젝트 ID·Analytics 선택·생성 범위를 보여준 뒤 action-time 승인을 받는다.
Google Play Console
- 계정:
yunchan8804@gmail.com - 개발자 계정:
YUN CHAN - 개발자 ID:
7374613349497835192 - 앱:
D3RO Voice, packagecom.d3ro.voice, app ID4976102237698469110 - 상태:
임시; 설정 0/11, 첫 AAB 0건 - Play app-signing SHA-256:
01:00:19:21:DB:4F:33:40:85:CE:21:E4:B8:DE:CC:BD:71:DA:87:67:C5:6E:3B:59:83:2A:A1:C8:29:EA:0D:AB - Console upload certificate 표시: 첫 AAB 업로드 후. local upload key 존재 여부와는 다른 상태다.
- closed test: 0명 / 요건 12명, 연속 14일
- production access: disabled
앱 생성 당시 정책·수출법 선언은 사용자 승인 후 완료됐다. 이후 Data safety, App content, production access 답변도 동일하게 사용자의 법적·정책 진술이므로 action-time 승인 전에 제출하지 않는다.
AdMob
- 계정 표시:
yunchan8804@gmail.com(authuser=1) - D3RO Voice Android 앱과 production App/Banner/Rewarded ID: 생성 완료
- rewarded
50 cloud_ai_tokens: 저장 완료 - production SSV URL: Google 확인 및 저장 완료
- 지급 프로필: 미완료. 이 상태에서는 앱 검토가 보류된다.
- live 상태:
검토 필요,광고 게재 제한 - store 등록정보: 미연결. 앱 검토와 Privacy & messaging/UMP production 검증: 대기
authuser=0은 정본 계정 경로가 아니다. 이후에도 authuser=1과 화면의 yunchan8804@gmail.com 표시를 같이 확인한다.
사용자에게 필요한 다음 확인
Firebase 프로젝트/Android 앱 생성, 지급·세금 프로필, Data safety/App content 답변, production access 신청은 각각 외부 상태를 영구적으로 바꾼다. 실제 Console 문구와 입력할 사실을 보여준 뒤 해당 액션별로 명시 승인을 받는다.
4. 완료된 핵심 구현과 증거
상세 요구사항별 상태는 모바일 SSOT 4절과 7절이 정본이다. 핵심 실행 증거만 요약한다.
- 모바일 lint: warning/error 0
- 모바일 typecheck: GREEN
- 모바일 Jest: 57 suites / 353 tests GREEN
- API 34 TEST-DEMO exact APK:
- package
com.d3ro.voice - version
0.0.0-e2e.20260821.11 - versionCode
202608221 - non-debuggable
- arm64-v8a + x86_64
- embedded Hermes bundle + Whisper model verified
- cold launch 0.872초, top-resumed
- fresh auth 30초, signup 40초, invite warm+cold 14초 PASS
- fatal/ANR/React fatal 0
- package
- Android instrumentation: CSPRNG 1 + incoming-share 3, 총 4/4 GREEN
- 모바일 Admin 역할 E2E: ordinary/manager/admin/super_admin/stale-manager 55 assertions PASS, fixture 0
- Free tier Google TEST banner/rewarded 실제 렌더 및 SSV 미구성 시 credit 0 fail-closed 확인
- 녹음 FGS, HOME, 통화 audio focus, process kill 복구, 알림 discard, 실제 WAV 복구 확인
- Talk: WAV→STT→Claude SSE→Android TTS/stop 확인
- 외부 ContentProvider
ACTION_SEND→Record→durable queue→cancel cleanup 확인 - production Supabase:
- linked ref
llnocwyqvhgwpdjcqqyw - migration
00001~00028local/remote 일치 - Edge Functions 25개 ACTIVE
admob-ssvv13, rewarded unit secret 존재, AdMob URL verification GREEN- 익명 user/admin 함수 fail-closed 401 및 admin
no-store - 배포 전후 production aggregate 불변
- linked ref
5. 현재 산출물
TEST-DEMO APK
- 빌드 경로:
apps/mobile-rn/android/app/build/outputs/apk/e2e/app-e2e.apk - 전달 복사본:
scratch/D3RO-Voice-0.0.0-e2e.20260821.11-TEST-DEMO-74035b69db0a.apk - 크기:
146,739,935bytes - SHA-256:
74035B69DB0A564846DF5ED4B85CA5D0E2289D5BB7D73DEE02C35DFD57380C2B - Fold6 Taildrop 파일명:
D3RO-Voice-0.0.0-e2e.20260821.11-TEST-DEMO-74035b69db0a.apk
이 APK는 debug certificate와 Google TEST AdMob ID를 사용한다. 공식 배포, Play internal testing, production 광고 검증에 사용하지 않는다.
준비된 Android upload key
- PKCS12:
C:\Users\encep\.d3ro\release\d3ro-upload-key-20260821.p12 - alias:
d3ro-upload-20260821 - password vault target:
D3ROVoice-Android-Upload-20260821 - certificate SHA-256:
4F:AC:69:24:82:1C:50:DA:AB:ED:76:49:32:A5:3C:48:6F:8C:6C:5F:34:B9:F1:8D:B9:20:AA:40:99:15:2B:54 - file/parent directory user-only ACL과 private-key readback: GREEN
- 별도 오프라인 복구 백업: 아직 필요
- protected CI secret 등록: 아직 필요
- Play Console upload certificate 표시·local cert 대조: 첫 AAB 업로드 후 가능. Console에 아직 표시되지 않는다고 key가 없는 것은 아니다.
암호·PKCS12를 출력, 채팅, Git, 일반 로그, browser upload 임시 경로에 남기지 않는다.
release-evidence Ed25519 keypair
- private:
C:\Users\encep\.d3ro\release\d3ro-mobile-evidence-ed25519-private.pem, 저장소 밖 user-only ACL - public:
release/mobile-release-evidence-public.pem - keyId:
2797d3e63affd2348941bc2871b57e520c958f7f5da1a4bbe8aa46904a890b7f - private/public 일치·sign/verify roundtrip: GREEN
- protected CI private-key secret 등록·오프라인 복구 백업: 아직 필요
폐기된 key
apps/mobile-rn/android/app/d3ro-release-key.COMPROMISED-20260821.keystore- 재사용 금지
- 현재 live
https://d3ro.chanpaca.net/.well-known/assetlinks.json에는 이 과거 계열 certificate fingerprint06:EE:C7:57:...:E4:81가 남아 있다. - source 3개는 Play app-signing SHA-256
01:00:19:21:...:EA:0D:AB로 교체했다. 배포 후 public HTTPS 응답이 정확히 이 한 개 fingerprint만 반환하는지 검증한다. upload certificate와 혼동하지 않는다.
production schema 백업
scratch/prod-public-schema-before-mobile-20260821.sql- SHA-256:
35CDD059669D097C58B98D0ADF157B49A1AAA2FF03D9AC6497E84F550511A5AC supabase db dump --dry-run은 임시 DB credential을 stdout에 출력하므로 재사용하지 않는다.
6. 공개 법적 리소스
- 개인정보처리방침:
https://d3ro.chanpaca.net/privacy/ - 이용약관:
https://d3ro.chanpaca.net/terms/ - 앱 외부 계정 삭제:
https://d3ro.chanpaca.net/delete-account/
세 URL 모두 production HTTPS 200이며 운영자는 YUN CHAN, Cloudflare email-protection 복호화 연락처는 yunchan8804@gmail.com, TWENTYOZ 문자열은 0건이다.
주의: 법적 파일은 NAS host와 현재 컨테이너 양쪽에 좁게 배포했으나, 현재 compose의 /app/wwwroot 영속 mount가 확실하지 않다. 컨테이너 재생성 전에 mount 계약을 고치거나 재검증한다. dirty한 site/dist 전체를 NAS에 덮어쓰지 않는다.
7. 재개 순서
7.1 Firebase 생성과 Android 등록
u/0,u/1모두 D3RO 프로젝트가 없다는 2026-08-29 기준선에서 시작한다.- 사용자에게 Google 계정·프로젝트 ID·Analytics 선택을 보여주고 명시 승인을 받은 후에만 새 프로젝트를 생성한다.
- Android 앱
com.d3ro.voice를 등록한다. google-services.json을 내려받아 로컬에서는apps/mobile-rn/android/app/google-services.json에 둔다.- 파일을 Git에 커밋하지 않는다. CI에는 base64로
ANDROID_GOOGLE_SERVICES_JSON_B64secret을 주입한다. - FCM service account를 최소 권한으로 준비하고 Supabase secret에
FCM_SERVICE_ACCOUNT_JSON,FCM_PROJECT_ID를 설정한다. - Play Console의 app-signing SHA-1/SHA-256을 Firebase Android 앱에 추가한다. upload key fingerprint만으로 production OAuth/App Links를 완료 처리하지 않는다.
7.2 AdMob
완료:
authuser=1/yunchan8804@gmail.com의 Android appca-app-pub-1039714767792854~6427959892, bannerca-app-pub-1039714767792854/9840591290, rewardedca-app-pub-1039714767792854/2255790918을 만들었고release/android-release-identity.json과 대조했다.- rewarded 값을
50 cloud_ai_tokens로 저장했다. - Supabase secret
ADMOB_REWARDED_AD_UNIT_ANDROID를 production rewarded unit과 맞췄다. - production
admob-ssvEdge v13과 durable receipt migration을 배포했다. - AdMob에서 SSV URL을 확인·저장하고 새로고침 뒤 영속 상태를 확인했다.
남음:
- 사용자가 결제·세금 프로필을 직접 작성한다.
- Play store 등록정보와 AdMob 앱을 연결하고
검토 필요·광고 게재 제한상태를 해소한다. - Privacy & messaging의 production UMP 메시지를 게시하고 EEA/regulated-US/non-EEA를 검증한다.
- build/CI secret:
ADMOB_APP_IDADMOB_BANNER_UNIT_IDADMOB_REWARDED_UNIT_ID
- Play internal 설치본과 등록된 test device로 실제 reward 완료→Google-signed SSV→receipt/claim exactly-once→credit +50을 확인한다.
- 본인·팀의 production 광고 클릭으로 테스트하지 않는다. Google test ads 또는 공식 test device만 사용한다.
7.3 Play 앱, App Signing, 상품
YUN CHAN/ developer ID7374613349497835192/ app ID4976102237698469110를 확인한다.- version
1.1.0, versionCode1010001의 production AAB를 보호된 CI에서 생성·검증한다. - 첫 AAB를 internal track에 제한 업로드한 뒤 upload certificate를 확인하고 Play app-signing certificate와 다름을 증명한다.
- 확인된 app-signing SHA-256으로 갱신한 다음 source 3개를 배포한다.
site/public/.well-known/assetlinks.json- Firebase Android certificate fingerprints
- Google OAuth Android client가 필요하면 package/certificate 조합
- subscription product를 정확한 ID로 만든다.
d3ro_voice_pro_monthlyd3ro_voice_pro_plus_monthly
- 두 상품 모두 활성 월간 base plan과 구매 가능한 offer를 가져야 한다. offer tag
default를 권장하며, 없으면 앱은 첫 offer를 사용한다. - license tester, internal testing tester, 실제 SKU/offer를 설정한다.
- Google Play Developer API service account를 앱에 연결하고 Supabase secret을 설정한다.
GOOGLE_PLAY_SERVICE_ACCOUNT_JSONGOOGLE_PLAY_PACKAGE_NAME=com.d3ro.voice- RTDN 사용 시
GOOGLE_PLAY_PUBSUB_AUDIENCE - RTDN 사용 시
GOOGLE_PLAY_PUBSUB_SERVICE_ACCOUNT
- RTDN Pub/Sub topic/subscription과
google-play-rtdn인증 경계를 실제 메시지로 검증한다.
7.4 Push drain과 초대 이메일
- production invite canonical origin은
https://d3ro.chanpaca.net이다. - 필요한 Supabase secrets:
SITE_URLRESEND_FROMRESEND_API_KEYFCM_SERVICE_ACCOUNT_JSONFCM_PROJECT_ID
- durable push outbox drain:
POST /functions/v1/send-push?mode=drain&limit=100- header
apikey: <service secret> - body
{}
- pg_cron + pg_net + Vault를 사용하고 service secret을 SQL, migration, 로그에 평문으로 넣지 않는다.
- 실제 2-device 부분 실패, retry, stale token, logout token 제거, notification open allowlist를 production FCM으로 재검증한다.
7.5 production provider secrets
현재 production DB/Edge 코드는 배포됐지만 다음 provider 경로는 실제 자격 증명과 콘솔 설정이 필요하다.
- Google Play/RTDN
- AdMob 실제 Google-signed reward 지급 E2E(콘솔/secret/SSV URL은 완료)
- Firebase Cloud Messaging
- Resend
- STT:
GROQ_API_KEY,OPENAI_API_KEY,DEEPGRAM_API_KEY또는 내부D3RO_API_URL+D3RO_API_TOKEN - LLM:
ANTHROPIC_API_KEY - Stripe: secret, Pro/Pro+ price, webhook secret
- Payple: production merchant/return/webhook configuration
secret 누락 상태는 의도적으로 fail-closed다. 가짜 값이나 성공 mock으로 통과시키지 않는다.
8. production build와 CI
필수 protected CI secrets
ANDROID_RELEASE_KEYSTORE_B64ANDROID_GOOGLE_SERVICES_JSON_B64ANDROID_UPLOAD_CERT_SHA256ANDROID_PLAY_APP_SIGNING_CERT_SHA256ANDROID_RELEASE_STORE_PASSWORDANDROID_RELEASE_KEY_ALIASANDROID_RELEASE_KEY_PASSWORDADMOB_APP_IDADMOB_BANNER_UNIT_IDADMOB_REWARDED_UNIT_IDANDROID_RELEASE_EVIDENCE_PRIVATE_KEY_B64ANDROID_RELEASE_EVIDENCE_PUBLIC_KEY_B64
2026-08-29 기준 upload/evidence private key는 local external path에, AdMob ID는 release identity에 준비됐지만 production Firebase/AdMob/signing/evidence secret을 실행 가능한 CI에 주입하지 않았다. 복구 백업도 대기다. mobile-production-release protected environment 승인과 trusted main/tag 경계를 유지한다.
릴리스 빌드 계약
- JDK 17
- package
com.d3ro.voice - release version:
1.1.0; Android versionCode / iOS build:1010001. CI run number로 다시 계산하지 않고 release SSOT의 고정된 단조 증가 값을 사용 - arm64-v8a production APK/AAB
google-services.json필수- production AdMob App/Banner/Rewarded ID 필수
- 준비한
d3ro-upload-20260821key를 CI에 보호 주입하고 실제 AAB signer를 검증한다. upload 인증서와 Play app-signing 인증서는 서로 달라야 하며, App Links/Firebase 공급자 등록에는 Play app-signing fingerprint를 사용한다. - TEST AdMob ID, debug signer, x86-only, missing Firebase config면 gate가 실패해야 정상
정본 게이트는 실제 remote에 연결된 .gitlab-ci.yml과 동등 계약의 .github/workflows/release.yml이다. 현재 remote/runner/secrets가 실제로 연결된 파이프라인을 사용하고, 로컬 ad-hoc publish로 대체하지 않는다.
주요 검증:
npm --prefix apps/mobile-rn run lint
npm --prefix apps/mobile-rn run typecheck
npm --prefix apps/mobile-rn run test:ci
npm run security:secrets:test
npm run security:secrets
npm run release:mobile:boundary:test
node scripts/ci/verify-mobile-build-config.mjs
CI는 signed APK+AAB를 만든 뒤 다음을 검증한다.
- BuildConfig version/build type/Firebase/production ad IDs
- package/version/versionCode
- upload signer certificate
- arm64 native library 완전성
- embedded Hermes/Whisper model hash
- APK/AAB metadata·signer·AdMob 동등성
- Ed25519 signed release evidence
- App Links certificate
- publication artifact hash/create-only 경계
9. Play internal testing 완료 조건
아래가 모두 실제 Play 설치본에서 GREEN이어야 production 완료로 볼 수 있다.
- Internal track AAB upload 성공
- Play 설치본의
installedFromPlayStore=true - 신규 설치/기존 로그인/온보딩/theme/permission
- Google OAuth consent→Supabase callback→앱 session
- Google Play Pro 구매
- Pro→Pro+ upgrade 및 replacement mode
- restore, pending, cancel, billing issue, subscription management deep link
- server purchase verification, acknowledge, entitlement snapshot 일치
- Free production banner 및 rewarded 표시
- SSV 완료 전 credit 0, SSV 이후 exactly-once credit
- Pro/Pro+에서 광고 요청·표시 0
- FCM 실제 수신, open allowlist, logout 후 token/device cleanup
ACTION_SENDaudio/video, 파일 import, 전사, History, 공유- 계정 로그아웃·삭제·session loss 후 모든 로컬 민감 데이터 purge
- Fold6 cold launch, background recorder, share, OAuth, purchase
- fatal/ANR/React fatal/민감 로그 0
10. 절대 하지 말 것
- TWENTYOZ Google/AdMob/Firebase/Play 계정 사용
- 사용자 확인 없이 Play 수출법/정책 또는 AdSense 약관 제출
- TEST-DEMO APK를 official/release/signed 이름으로 공개
- 폐기된
d3ro-release-key.COMPROMISED-20260821.keystore재사용 - upload certificate를 Play app-signing certificate처럼 사용
google-services.json, service-account JSON, keystore password, OAuth secret을 Git/로그/채팅에 노출supabase db dump --dry-run출력 공유- dirty worktree를 reset/clean/checkout하거나 광범위하게 덮어쓰기
- NAS 전체
wwwroot또는 dirtysite/dist를 통째로 배포 - provider 장애·secret 누락·store sideload를 성공으로 간주
- production 광고를 직접 클릭해 테스트
11. 재개자가 먼저 실행할 15분 체크
git status --short --branch
Get-FileHash apps/mobile-rn/android/app/build/outputs/apk/e2e/app-e2e.apk -Algorithm SHA256
Test-Path apps/mobile-rn/android/app/google-services.json
npm --prefix apps/mobile-rn run typecheck
npm --prefix apps/mobile-rn run lint
npm --prefix apps/mobile-rn run test:ci
npm run security:secrets
기대값:
- branch, HEAD, remote tracking 상태를 현재 출력대로 새 release record에 기록. 2026-08-21의
2 commit ahead는 역사 기준선일 뿐 현재 기대값이 아님 - E2E APK SHA-256
74035B69...380C2B google-services.json은 Firebase 등록 전까지 없음- typecheck/lint/Jest/security scan GREEN
그 다음 브라우저에서 계정을 다시 확인하고, 사용자 확인을 받은 뒤 7절 순서대로 진행한다.
12. 아직 완료라고 말하면 안 되는 이유
- Firebase
u/0,u/1모두 D3RO 프로젝트가 없고 production Android config도 없음 - production AdMob ID/SSV는 확정했지만
검토 필요·광고 게재 제한·결제 프로필·store 연결·실제 지급 E2E가 아직 없음 - Play 앱은 생성됐고 App Signing SHA-256도 확인했지만 첫 AAB·Console upload-certificate 대조·상품·internal track·설정 11개가 아직 없음
- upload/evidence keypair는 local에 준비됐지만 CI secret 등록·복구 백업·실제 AAB signature/evidence가 없음
- production signed APK/AAB와 CI 실행 증거가 아직 없음
- live App Links가 폐기된 과거 certificate를 가리킴
- closed tester가 0/12명이고 14일 기간을 시작하지 않았으며 production access가 disabled임
- 실제 Google OAuth callback, Play purchase/restore/cancel, production ads/SSV, FCM이 아직 외부 E2E되지 않음
- Fold6는 APK 전달만 됐고 설치·실행 확인이 없음
- 대규모 dirty/untracked 변경이 아직 릴리스 가능한 버전관리 상태로 정리되지 않음
이 항목들이 모두 증거로 닫히기 전에는 “모바일 제품화 완료” 또는 “공식 출시 완료”라고 판정하지 않는다.