- Do not merge GitHub pull requests unless the user's latest message explicitly asks to merge that exact PR.
- PR creation, CI verification, reviewer assignment, issue closing, or "finish the task" does not imply merge approval.
- If a merge request is ambiguous, ask for confirmation before using any merge UI, GitHub API, or commands such as
gh pr merge.
- Soundlog is a mobile app product. We do not intend to ship or maintain a public web deployment as a product surface.
- Treat Expo web as a development or CI/export compatibility target only. Do not design product behavior around web deployment unless the user explicitly asks for web support.
- When a feature depends on native capabilities such as camera, location, media library, sharing, secure storage, or app permissions, prioritize iOS/Android behavior and native Expo APIs.
- Do not block mobile feature work just because the same flow cannot fully work on web. Provide a minimal web fallback only when it is needed for local development, type checking, preview safety, or export stability.
- Never use Expo web, a deployed web app, or a browser to test or validate Soundlog product behavior, UI, server integration, permissions, or regressions.
- Run every product test and visual verification in the iOS Simulator. A browser result must never be treated as evidence that the app works correctly.
- After a Soundlog app change, launch the app in the iOS Simulator and verify the affected flow there before reporting completion.
- API health checks and command-line diagnostics may support investigation, but they do not replace simulator verification and must not be reported as completed app testing.
- Use a web target only for explicit web build or export compatibility work. Even then, do not use it for product acceptance testing unless the user's latest message explicitly overrides this rule.
- Soundlog 앱 에이전트는 모바일 앱 저장소만 담당한다.
SoundLogServer,soundlog-ml과 운영 인프라는 서버 팀원이 담당한다. - 앱 빌드나 배포 요청을 서버 배포 권한으로 해석하지 않는다. 앱을 EAS 또는 TestFlight로 배포하더라도 서버는 변경하지 않는다.
- 서버 저장소의 파일을 수정하거나 커밋하거나 브랜치를 푸시하거나 Pull Request를 만들지 않는다.
- 운영 서버에 SSH로 접속하지 않는다. Docker 이미지를 배포하거나 컨테이너를 재시작하거나 배포 워크플로를 실행하지 않는다.
- 서버의 환경변수와 GitHub Actions 시크릿과 SSH 키와 도메인과 DNS와 인증서와 방화벽 설정을 생성하거나 변경하지 않는다.
- 운영 데이터베이스의 migration과 seed와 관리자 API와 사용자 또는 신고 데이터를 변경하지 않는다.
- 앱 연동 검수에 필요한 공개 HTTPS
GET요청은 허용한다. 예를 들어 health와 OpenAPI와 법적 문서의 응답 상태를 읽을 수 있다. 이 검사는 서버 배포나 서버 기능 완료의 증거로 사용하지 않는다. - 앱 변경에 서버 작업이 필요하면 필요한 API 계약과 현재 실패 증거만 정리해 서버 팀원에게 전달한다. 앱 작업 중 임의로 서버 수정이나 우회 배포를 하지 않는다.
- 작업을 시작하기 전에
pwd,git rev-parse --show-toplevel,git remote get-url origin으로 앱 저장소인지 확인한다. 서버 저장소가 나오면 즉시 중단하고 앱 저장소로 이동한다. - 서버 작업을 함께 해달라는 후속 요청이 오더라도 대상 저장소와 작업 범위를 사용자가 최신 메시지에서 명시하지 않으면 수행하지 않는다.
- 기본 사용자 노출 텍스트와 버튼, 탭, 칩의 인터랙션 라벨은 흰색 또는 흰색 투명도 계열을 사용한다. 상태를 구분하는 의미 색상과 브랜드 강조 색상은 예외로 둔다.
text-black, 검정색, 진한 보라색 텍스트 값을 새로 추가하지 않는다.- 기본, 보조, 비활성 텍스트의 명도 차이는 검정색이나 회색 고정값이 아니라
#FFFFFF또는rgba(255,255,255,alpha)로 표현한다. - 밝은 강조 배경에서 검정색 텍스트로 대비를 해결하지 않는다. 흰색 텍스트가 읽히도록 배경과 테두리 대비를 조정한다.
colors.text.inverse와text-soundlog-inverse는 흰색 의미를 유지한다.- 사용자에게 보이는 문자열은 React Native의
Text를 직접 사용하지 않고 기본 글자색이 흰색인AppText를 사용한다. text-white/52처럼 기본 Tailwind에 없는 투명도를 사용하면tailwind.config.js의 opacity에도 같은 값을 선언해 검정색 기본값으로 떨어지지 않게 한다.- UI 변경 후
text-black,color: 'black',#000000,#4A1D96가 텍스트 색상으로 추가되지 않았는지 검색한다. 그림자, 배경, 아이콘, 지도 스타일은 이 검사 대상이 아니다.
- Before changing Recap, Log, camera capture, travel mode, route tracking, map pins, visibility, or related API behavior, read
docs/product/RECAP_LOG_DOMAIN_MODEL.md. - Treat that document as the canonical product contract when older planning docs or legacy code names conflict with it.
- Product
Recapmeans one capture saved from the camera flow. - Product
Logmeans one or more Recaps created in the same travel-mode session. A standalone Recap created outside travel mode is not a one-item Log. - A travel Log is identified by
sessionId, even when it contains only one Recap. Never merge Logs by date, place, distance, or track. - A Log detail map may show only its member Recap pins and its own session route. Do not mix nearby/public pins or other Logs into that map.
MomentLogand the serverRecapmodel are legacy technical names. Follow the product-to-code mapping in the canonical domain document instead of exposing those terms to users.